summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Aaron Giles <aaron@aarongiles.com>2021-09-10 09:39:10 -0700
committer Aaron Giles <aaron@aarongiles.com>2021-09-10 09:39:10 -0700
commitfedb40f712d34bb2b6904487ce88dd124e26c7f5 (patch)
tree3a539aa7f386b3c11ec76bdb266ca03a08039cfe
parente505ac97bd2de9100d02d37fc0270504bf60b531 (diff)
parenta99d2f3295c21e6ae97cbffce8cf025860bfa4d6 (diff)
Merge branch 'master' into time-experiments2
-rw-r--r--android-project/app/src/main/AndroidManifest.xml4
-rw-r--r--android-project/app/src/main/libs/mips/.gitignore1
-rw-r--r--android-project/app/src/main/libs/mips64/.gitignore1
-rw-r--r--bgfx/chains/Fighters.json354
-rw-r--r--bgfx/chains/crt-geom-deluxe.json724
-rw-r--r--bgfx/chains/crt-geom.json362
-rw-r--r--bgfx/chains/default.json10
-rw-r--r--bgfx/chains/eagle/super-eagle.json6
-rw-r--r--bgfx/chains/hlsl.json58
-rw-r--r--bgfx/chains/hqx/hq2x.json2
-rw-r--r--bgfx/chains/hqx/hq3x.json2
-rw-r--r--bgfx/chains/hqx/hq4x.json2
-rw-r--r--bgfx/chains/lcd-grid.json242
-rw-r--r--bgfx/chains/pillarbox_left_horizontal.json20
-rw-r--r--bgfx/chains/pillarbox_left_vertical.json20
-rw-r--r--bgfx/chains/pillarbox_right_horizontal.json20
-rw-r--r--bgfx/chains/pillarbox_right_vertical.json20
-rw-r--r--bgfx/chains/unfiltered.json6
-rw-r--r--bgfx/chains/xbr/super-2xbr-3d-2p.json6
-rw-r--r--bgfx/chains/xbr/super-2xbr-3d-3p-smoother.json6
-rw-r--r--bgfx/chains/xbr/super-4xbr-3d-4p.json6
-rw-r--r--bgfx/chains/xbr/super-4xbr-3d-6p-smoother.json6
-rw-r--r--bgfx/chains/xbr/super-xbr-2p.json6
-rw-r--r--bgfx/chains/xbr/super-xbr-3p-smoother.json6
-rw-r--r--bgfx/chains/xbr/super-xbr-6p.json6
-rw-r--r--bgfx/chains/xbr/super-xbr-deposterize.json6
-rw-r--r--bgfx/chains/xbr/super-xbr-fast-3p.json6
-rw-r--r--bgfx/chains/xbr/super-xbr-fast-6p.json6
-rw-r--r--bgfx/chains/xbr/xbr-hybrid.json2
-rw-r--r--bgfx/chains/xbr/xbr-lv1-noblend.json4
-rw-r--r--bgfx/chains/xbr/xbr-lv2-3d.json4
-rw-r--r--bgfx/chains/xbr/xbr-lv2-accuracy-multipass.json4
-rw-r--r--bgfx/chains/xbr/xbr-lv2-accuracy-smart-blur.json2
-rw-r--r--bgfx/chains/xbr/xbr-lv2-deposterize.json2
-rw-r--r--bgfx/chains/xbr/xbr-lv2-fast.json4
-rw-r--r--bgfx/chains/xbr/xbr-lv2-multipass.json4
-rw-r--r--bgfx/chains/xbr/xbr-lv2-noblend.json4
-rw-r--r--bgfx/chains/xbr/xbr-lv2.json4
-rw-r--r--bgfx/chains/xbr/xbr-lv3-multipass.json4
-rw-r--r--bgfx/chains/xbr/xbr-lv3-noblend.json6
-rw-r--r--bgfx/chains/xbr/xbr-lv3.json6
-rw-r--r--bgfx/chains/xbr/xbr-mlv4-dilation.json4
-rw-r--r--bgfx/chains/xbr/xbr-mlv4-multipass.json4
-rw-r--r--bgfx/effects/blurs/smart-blur.json54
-rw-r--r--bgfx/effects/crt-geom/crt-geom-deluxe.json98
-rw-r--r--bgfx/effects/crt-geom/crt-geom.json88
-rw-r--r--bgfx/effects/crt-geom/gaussx.json54
-rw-r--r--bgfx/effects/crt-geom/gaussy.json54
-rw-r--r--bgfx/effects/crt-geom/lowpass.json52
-rw-r--r--bgfx/effects/crt-geom/mipmap8.json54
-rw-r--r--bgfx/effects/crt-geom/phosphor_apply.json56
-rw-r--r--bgfx/effects/crt-geom/phosphor_update.json56
-rw-r--r--bgfx/effects/default/blit.json168
-rw-r--r--bgfx/effects/eagle/supereagle.json54
-rw-r--r--bgfx/effects/gui_add.json42
-rw-r--r--bgfx/effects/gui_blend.json42
-rw-r--r--bgfx/effects/gui_multiply.json42
-rw-r--r--bgfx/effects/gui_opaque.json42
-rw-r--r--bgfx/effects/hlsl/blit.json208
-rw-r--r--bgfx/effects/hlsl/chroma.json48
-rw-r--r--bgfx/effects/hlsl/color.json54
-rw-r--r--bgfx/effects/hlsl/deconverge.json56
-rw-r--r--bgfx/effects/hlsl/defocus.json46
-rw-r--r--bgfx/effects/hlsl/distortion.json68
-rw-r--r--bgfx/effects/hlsl/ntsc_decode.json68
-rw-r--r--bgfx/effects/hlsl/ntsc_encode.json58
-rw-r--r--bgfx/effects/hlsl/phosphor.json48
-rw-r--r--bgfx/effects/hlsl/prescale.json46
-rw-r--r--bgfx/effects/hlsl/scanline.json72
-rw-r--r--bgfx/effects/hqx/hq2x.json52
-rw-r--r--bgfx/effects/hqx/hq3x.json52
-rw-r--r--bgfx/effects/hqx/hq4x.json52
-rw-r--r--bgfx/effects/lcd-grid/lcd-grid.json70
-rw-r--r--bgfx/effects/lcd-grid/persistence.json50
-rw-r--r--bgfx/effects/misc/bcg_adjust.json36
-rw-r--r--bgfx/effects/misc/blit.json208
-rw-r--r--bgfx/effects/misc/blit_palette16.json214
-rw-r--r--bgfx/effects/misc/deposterize-pass0.json56
-rw-r--r--bgfx/effects/misc/deposterize-pass1.json56
-rw-r--r--bgfx/effects/misc/lut.json8
-rw-r--r--bgfx/effects/misc/saturation.json44
-rw-r--r--bgfx/effects/misc/texconv_palette16.json38
-rw-r--r--bgfx/effects/misc/texconv_rgb32.json34
-rw-r--r--bgfx/effects/misc/texconv_yuy16.json36
-rw-r--r--bgfx/effects/pillarbox_left_horizontal/gaussian.json48
-rw-r--r--bgfx/effects/pillarbox_left_horizontal/offset_sat.json46
-rw-r--r--bgfx/effects/pillarbox_left_vertical/gaussian.json48
-rw-r--r--bgfx/effects/pillarbox_left_vertical/offset_sat.json46
-rw-r--r--bgfx/effects/pillarbox_right_horizontal/gaussian.json48
-rw-r--r--bgfx/effects/pillarbox_right_horizontal/offset_sat.json46
-rw-r--r--bgfx/effects/pillarbox_right_vertical/gaussian.json48
-rw-r--r--bgfx/effects/pillarbox_right_vertical/offset_sat.json46
-rw-r--r--bgfx/effects/screen_add.json44
-rw-r--r--bgfx/effects/screen_blend.json42
-rw-r--r--bgfx/effects/screen_multiply.json44
-rw-r--r--bgfx/effects/screen_opaque.json42
-rw-r--r--bgfx/effects/unfiltered/blit.json208
-rw-r--r--bgfx/effects/warp/dilation-horizontal-fast.json52
-rw-r--r--bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json58
-rw-r--r--bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass0.json60
-rw-r--r--bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass1.json62
-rw-r--r--bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass2.json62
-rw-r--r--bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass0.json60
-rw-r--r--bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass1.json62
-rw-r--r--bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass2.json60
-rw-r--r--bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass3.json62
-rw-r--r--bgfx/effects/xbr/super-xbr/super-xbr-fast-pass0.json60
-rw-r--r--bgfx/effects/xbr/super-xbr/super-xbr-fast-pass1.json60
-rw-r--r--bgfx/effects/xbr/super-xbr/super-xbr-fast-pass2.json60
-rw-r--r--bgfx/effects/xbr/super-xbr/super-xbr-pass0.json60
-rw-r--r--bgfx/effects/xbr/super-xbr/super-xbr-pass1.json62
-rw-r--r--bgfx/effects/xbr/super-xbr/super-xbr-pass2.json60
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-sharp.json52
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v2-gamma.json52
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v2.json52
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4-gamma.json52
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4.json52
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4b.json52
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v5-gamma.json52
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid.json52
-rw-r--r--bgfx/effects/xbr/xbr-lv1-noblend.json56
-rw-r--r--bgfx/effects/xbr/xbr-lv2-3d.json64
-rw-r--r--bgfx/effects/xbr/xbr-lv2-fast.json60
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-a-pass0.json52
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-accuracy-pass0.json56
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-accuracy-pass1.json58
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-b-pass0.json52
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-c-pass0.json52
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-d-pass0.json52
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-noblend-pass1.json56
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-pass1.json58
-rw-r--r--bgfx/effects/xbr/xbr-lv2-noblend.json56
-rw-r--r--bgfx/effects/xbr/xbr-lv2.json60
-rw-r--r--bgfx/effects/xbr/xbr-lv3-multipass/xbr-lv3-pass0.json52
-rw-r--r--bgfx/effects/xbr/xbr-lv3-multipass/xbr-lv3-pass1.json58
-rw-r--r--bgfx/effects/xbr/xbr-lv3-noblend.json58
-rw-r--r--bgfx/effects/xbr/xbr-lv3.json60
-rw-r--r--bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass1.json52
-rw-r--r--bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass2.json52
-rw-r--r--bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass3.json54
-rw-r--r--bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass4.json56
-rw-r--r--bgfx/shaders/dx11/chains/misc/fs_blit_palette16.binbin672 -> 1360 bytes
-rw-r--r--bgfx/shaders/dx11/chains/misc/fs_blit_yuy16.binbin1396 -> 1118 bytes
-rw-r--r--bgfx/shaders/dx9/chains/misc/fs_blit_palette16.binbin481 -> 1045 bytes
-rw-r--r--bgfx/shaders/dx9/chains/misc/fs_blit_yuy16.binbin869 -> 771 bytes
-rw-r--r--bgfx/shaders/essl/chains/misc/fs_blit_palette16.binbin445 -> 1704 bytes
-rw-r--r--bgfx/shaders/essl/chains/misc/fs_blit_yuy16.binbin1723 -> 1587 bytes
-rw-r--r--bgfx/shaders/glsl/chains/misc/fs_blit_palette16.binbin422 -> 1610 bytes
-rw-r--r--bgfx/shaders/glsl/chains/misc/fs_blit_yuy16.binbin1645 -> 1520 bytes
-rw-r--r--bgfx/shaders/metal/chains/misc/fs_blit_palette16.binbin958 -> 2007 bytes
-rw-r--r--bgfx/shaders/metal/chains/misc/fs_blit_yuy16.binbin1872 -> 1815 bytes
-rw-r--r--bgfx/shaders/spirv/chains/misc/fs_blit_palette16.binbin1660 -> 3392 bytes
-rw-r--r--bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.binbin2764 -> 2838 bytes
-rw-r--r--docs/source/techspecs/index.rst1
-rw-r--r--docs/source/techspecs/poly_manager.rst1084
-rw-r--r--docs/source/usingmame/defaultkeys.rst7
-rw-r--r--docs/themes/sphinx_rtd_theme/__init__.py43
-rw-r--r--docs/themes/sphinx_rtd_theme/breadcrumbs.html113
-rw-r--r--docs/themes/sphinx_rtd_theme/footer.html62
-rw-r--r--docs/themes/sphinx_rtd_theme/layout.html204
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.po51
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.po99
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.po73
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.po77
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/fa_IR/LC_MESSAGES/sphinx.po160
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.po68
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/it/LC_MESSAGES/sphinx.po171
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/lt/LC_MESSAGES/sphinx.po169
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.po55
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/pl/LC_MESSAGES/sphinx.po143
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.po71
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.po55
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/sphinx.pot93
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.po64
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.po59
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.po65
-rw-r--r--docs/themes/sphinx_rtd_theme/search.html10
-rw-r--r--docs/themes/sphinx_rtd_theme/searchbox.html2
-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/theme.css4
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/FontAwesome.otfbin134808 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.eotbin256056 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.ttfbin600856 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.woffbin309728 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.woff2bin184912 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.eotbin266158 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.ttfbin622572 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.woffbin323344 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.woff2bin193308 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.eotbin268604 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.ttfbin639388 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.woffbin328412 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.woff2bin195704 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.eotbin253461 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.ttfbin607720 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.woffbin309192 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.woff2bin182708 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Bold.woffbin87624 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Bold.woff2bin67312 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Light.woffbin88600 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Light.woff2bin67884 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Regular.woffbin86288 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Regular.woff2bin66444 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Thin.woffbin87452 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Thin.woff2bin66328 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.eotbin79520 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.ttfbin170616 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.woffbin87624 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2bin67312 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.eotbin78331 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.ttfbin169064 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.woffbin86288 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2bin66444 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.eotbin165742 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.svg2671
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.ttfbin165548 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woffbin98024 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff2bin77160 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/lato-bold-italic.woffbin323344 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/lato-bold-italic.woff2bin193308 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/lato-bold.woffbin309728 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/lato-bold.woff2bin184912 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/lato-normal-italic.woffbin328412 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/lato-normal-italic.woff2bin195704 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/lato-normal.woffbin309192 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/fonts/lato-normal.woff2bin182708 -> 0 bytes
-rw-r--r--docs/themes/sphinx_rtd_theme/static/js/html5shiv-printshiv.min.js4
-rw-r--r--docs/themes/sphinx_rtd_theme/static/js/html5shiv.min.js4
-rw-r--r--docs/themes/sphinx_rtd_theme/static/js/modernizr.min.js4
-rw-r--r--docs/themes/sphinx_rtd_theme/static/js/theme.js2
-rw-r--r--docs/themes/sphinx_rtd_theme/theme.conf4
-rw-r--r--docs/themes/sphinx_rtd_theme/versions.html2
-rw-r--r--doxygen/doxy-boot.js239
-rw-r--r--doxygen/doxygen.config794
-rw-r--r--doxygen/footer.html5
-rw-r--r--doxygen/header.html24
-rw-r--r--doxygen/style.css163
-rw-r--r--hash/adam_cart.xml6
-rw-r--r--hash/apple2_flop_clcracked.xml305
-rw-r--r--hash/apple2_flop_orig.xml297
-rw-r--r--hash/apple2gs_flop_orig.xml107
-rw-r--r--hash/apxen_flop.xml46
-rw-r--r--hash/arb.xml15
-rw-r--r--hash/cd32.xml25
-rw-r--r--hash/coco_flop.xml15
-rw-r--r--hash/easy_karaoke_cart.xml14
-rw-r--r--hash/fm7_cass.xml10
-rw-r--r--hash/ibm5170.xml92
-rw-r--r--hash/ibm5170_cdrom.xml81
-rw-r--r--hash/jazz.xml2
-rw-r--r--hash/k28m2.xml2
-rw-r--r--hash/megadriv.xml14
-rw-r--r--hash/msx1_cart.xml8
-rw-r--r--hash/msx2_cart.xml8
-rw-r--r--hash/n64.xml14
-rw-r--r--hash/neogeo.xml4
-rw-r--r--hash/nes.xml924
-rw-r--r--hash/pc8801_flop.xml34
-rw-r--r--hash/pc98.xml549
-rw-r--r--hash/pc98_cd.xml1067
-rw-r--r--hash/pico.xml18
-rw-r--r--hash/saturn.xml2
-rw-r--r--hash/snes.xml110
-rw-r--r--hash/specpls3_flop.xml1
-rw-r--r--hash/spectrum_cass.xml2553
-rw-r--r--hash/squale_cart.xml15
-rw-r--r--hash/timex_cass.xml16
-rw-r--r--hash/tx0_ptp.xml43
-rw-r--r--hash/vgmplay.xml3611
-rw-r--r--hash/vsmile_cart.xml63
-rw-r--r--hash/vsmileb_cart.xml172
-rw-r--r--hash/wicat.xml175
-rw-r--r--makefile8
-rw-r--r--scripts/genie.lua2
-rw-r--r--scripts/minimaws/lib/dbaccess.py12
-rw-r--r--scripts/minimaws/lib/wsgiserve.py2
-rw-r--r--scripts/src/3rdparty.lua1
-rw-r--r--scripts/src/bus.lua8
-rw-r--r--scripts/src/cpu.lua10
-rw-r--r--scripts/src/formats.lua4
-rw-r--r--scripts/src/lib.lua10
-rw-r--r--scripts/src/machine.lua23
-rw-r--r--scripts/src/osd/mac.lua1
-rw-r--r--scripts/src/osd/sdl.lua1
-rw-r--r--scripts/src/osd/windows.lua6
-rw-r--r--scripts/target/mame/arcade.lua16
-rw-r--r--scripts/target/mame/mess.lua11
-rw-r--r--src/devices/bus/a2bus/a2diskiing.h8
-rw-r--r--src/devices/bus/a2bus/a2sd.cpp280
-rw-r--r--src/devices/bus/a2bus/a2sd.h67
-rw-r--r--src/devices/bus/a2bus/grappler.h14
-rw-r--r--src/devices/bus/a2bus/q68.h16
-rw-r--r--src/devices/bus/a7800/a78_slot.cpp2
-rw-r--r--src/devices/bus/acorn/system/8k.cpp2
-rw-r--r--src/devices/bus/amiga/keyboard/a1200.cpp2
-rw-r--r--src/devices/bus/amiga/keyboard/a2000.cpp371
-rw-r--r--src/devices/bus/amiga/keyboard/a2000.h110
-rw-r--r--src/devices/bus/amiga/keyboard/mitsumi.cpp70
-rw-r--r--src/devices/bus/amiga/zorro/a2052.cpp2
-rw-r--r--src/devices/bus/amiga/zorro/a2058.cpp2
-rw-r--r--src/devices/bus/amiga/zorro/a2065.cpp2
-rw-r--r--src/devices/bus/amiga/zorro/a2232.cpp2
-rw-r--r--src/devices/bus/amiga/zorro/a590.cpp4
-rw-r--r--src/devices/bus/amiga/zorro/action_replay.cpp6
-rw-r--r--src/devices/bus/amiga/zorro/buddha.cpp2
-rw-r--r--src/devices/bus/apf/slot.cpp2
-rw-r--r--src/devices/bus/apricot/video/mono.cpp8
-rw-r--r--src/devices/bus/apricot/video/video.cpp2
-rw-r--r--src/devices/bus/aquarius/slot.cpp2
-rw-r--r--src/devices/bus/ata/idehd.cpp2
-rw-r--r--src/devices/bus/bbc/1mhzbus/datacentre.cpp2
-rw-r--r--src/devices/bus/bbc/rom/slot.cpp2
-rw-r--r--src/devices/bus/c64/exp.cpp2
-rw-r--r--src/devices/bus/cbus/mpu_pc98.cpp2
-rw-r--r--src/devices/bus/cbus/pc9801_118.cpp120
-rw-r--r--src/devices/bus/cbus/pc9801_118.h3
-rw-r--r--src/devices/bus/cbus/pc9801_26.cpp90
-rw-r--r--src/devices/bus/cbus/pc9801_26.h4
-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.cpp259
-rw-r--r--src/devices/bus/cbus/pc9801_86.h59
-rw-r--r--src/devices/bus/cbus/pc9801_amd98.cpp18
-rw-r--r--src/devices/bus/cbus/pc9801_amd98.h12
-rw-r--r--src/devices/bus/cbus/pc9801_cbus.cpp44
-rw-r--r--src/devices/bus/cbus/pc9801_cbus.h2
-rw-r--r--src/devices/bus/cbus/pc9801_snd.cpp8
-rw-r--r--src/devices/bus/cbus/pc9801_snd.h8
-rw-r--r--src/devices/bus/cgenie/expansion/floppy.cpp2
-rw-r--r--src/devices/bus/coco/coco_dwsock.cpp43
-rw-r--r--src/devices/bus/coco/cococart.cpp4
-rw-r--r--src/devices/bus/coco/dragon_msx2.cpp4
-rw-r--r--src/devices/bus/crvision/slot.cpp2
-rw-r--r--src/devices/bus/electron/cart/ap5.cpp2
-rw-r--r--src/devices/bus/electron/cart/romp144.cpp2
-rw-r--r--src/devices/bus/electron/cart/slot.cpp4
-rw-r--r--src/devices/bus/electron/exp.cpp2
-rw-r--r--src/devices/bus/electron/mc68k.cpp243
-rw-r--r--src/devices/bus/electron/mc68k.h63
-rw-r--r--src/devices/bus/electron/plus1.cpp2
-rw-r--r--src/devices/bus/electron/plus2.cpp2
-rw-r--r--src/devices/bus/electron/rombox.cpp2
-rw-r--r--src/devices/bus/electron/romboxp.cpp2
-rw-r--r--src/devices/bus/electron/sidewndr.cpp2
-rw-r--r--src/devices/bus/gamate/slot.cpp2
-rw-r--r--src/devices/bus/gameboy/gb_slot.cpp2
-rw-r--r--src/devices/bus/gba/gba_slot.cpp2
-rw-r--r--src/devices/bus/hexbus/hexbus.cpp2
-rw-r--r--src/devices/bus/hexbus/hx5102.cpp2
-rw-r--r--src/devices/bus/hexbus/tp0370.cpp2
-rw-r--r--src/devices/bus/hp_dio/hp98265a.cpp2
-rw-r--r--src/devices/bus/hp_dio/hp98543.cpp2
-rw-r--r--src/devices/bus/hp_dio/hp98544.cpp2
-rw-r--r--src/devices/bus/hp_dio/hp98550.cpp2
-rw-r--r--src/devices/bus/hp_dio/hp98603a.cpp2
-rw-r--r--src/devices/bus/hp_dio/hp98603b.cpp2
-rw-r--r--src/devices/bus/hp_dio/hp98620.cpp2
-rw-r--r--src/devices/bus/hp_dio/hp98643.cpp2
-rw-r--r--src/devices/bus/hp_dio/hp98644.cpp2
-rw-r--r--src/devices/bus/hp_dio/hp_dio.cpp8
-rw-r--r--src/devices/bus/hp_dio/human_interface.cpp2
-rw-r--r--src/devices/bus/hp_hil/hlekbd.cpp4
-rw-r--r--src/devices/bus/hp_hil/hlemouse.cpp2
-rw-r--r--src/devices/bus/intellec4/insdatastor.cpp2
-rw-r--r--src/devices/bus/intellec4/intellec4.cpp4
-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.cpp2
-rw-r--r--src/devices/bus/interpro/keyboard/lle.cpp2
-rw-r--r--src/devices/bus/isa/sc499.cpp25
-rw-r--r--src/devices/bus/m5/slot.cpp2
-rw-r--r--src/devices/bus/mackbd/keyboard.cpp10
-rw-r--r--src/devices/bus/mackbd/pluskbd.cpp4
-rw-r--r--src/devices/bus/mc10/mc10_cart.cpp6
-rw-r--r--src/devices/bus/msx_slot/cartridge.cpp2
-rw-r--r--src/devices/bus/nes/ave.cpp62
-rw-r--r--src/devices/bus/nes/ave.h8
-rw-r--r--src/devices/bus/nes/bootleg.cpp314
-rw-r--r--src/devices/bus/nes/bootleg.h85
-rw-r--r--src/devices/bus/nes/hosenkan.cpp159
-rw-r--r--src/devices/bus/nes/hosenkan.h39
-rw-r--r--src/devices/bus/nes/kaiser.cpp119
-rw-r--r--src/devices/bus/nes/kaiser.h27
-rw-r--r--src/devices/bus/nes/mmc3_clones.cpp966
-rw-r--r--src/devices/bus/nes/mmc3_clones.h234
-rw-r--r--src/devices/bus/nes/multigame.cpp398
-rw-r--r--src/devices/bus/nes/multigame.h115
-rw-r--r--src/devices/bus/nes/nes_carts.cpp20
-rw-r--r--src/devices/bus/nes/nes_ines.hxx68
-rw-r--r--src/devices/bus/nes/nes_pcb.hxx19
-rw-r--r--src/devices/bus/nes/nes_slot.cpp2
-rw-r--r--src/devices/bus/nes/nes_slot.h32
-rw-r--r--src/devices/bus/nes/rcm.cpp136
-rw-r--r--src/devices/bus/nes/rcm.h38
-rw-r--r--src/devices/bus/nes/sachen.cpp2
-rw-r--r--src/devices/bus/nes/sunsoft.cpp32
-rw-r--r--src/devices/bus/nes/sunsoft.h2
-rw-r--r--src/devices/bus/nes/waixing.cpp9
-rw-r--r--src/devices/bus/nubus/nubus_image.cpp12
-rw-r--r--src/devices/bus/plus4/exp.cpp2
-rw-r--r--src/devices/bus/rs232/hlemouse.cpp12
-rw-r--r--src/devices/bus/saitek_osa/expansion.h5
-rw-r--r--src/devices/bus/saitek_osa/maestro.cpp3
-rw-r--r--src/devices/bus/saitek_osa/maestro.h10
-rw-r--r--src/devices/bus/saitek_osa/maestroa.h4
-rw-r--r--src/devices/bus/saitek_osa/sparc.h5
-rw-r--r--src/devices/bus/scv/slot.cpp2
-rw-r--r--src/devices/bus/sega8/sega8_slot.cpp2
-rw-r--r--src/devices/bus/sgikbd/hlekbd.cpp2
-rw-r--r--src/devices/bus/snes/rom21.cpp4
-rw-r--r--src/devices/bus/spectrum/intf2.cpp2
-rw-r--r--src/devices/bus/sunkbd/hlekbd.cpp467
-rw-r--r--src/devices/bus/sunkbd/hlekbd.h110
-rw-r--r--src/devices/bus/sunmouse/hlemouse.cpp6
-rw-r--r--src/devices/bus/ti8x/bitsocket.cpp2
-rw-r--r--src/devices/bus/ti8x/graphlinkhle.cpp2
-rw-r--r--src/devices/bus/ti8x/teeconn.cpp2
-rw-r--r--src/devices/bus/ti8x/tispeaker.cpp4
-rw-r--r--src/devices/bus/ti99/colorbus/busmouse.cpp2
-rw-r--r--src/devices/bus/ti99/colorbus/colorbus.cpp2
-rw-r--r--src/devices/bus/ti99/gromport/cartridges.cpp410
-rw-r--r--src/devices/bus/ti99/gromport/cartridges.h116
-rw-r--r--src/devices/bus/ti99/gromport/gkracker.cpp2
-rw-r--r--src/devices/bus/ti99/gromport/gromport.cpp2
-rw-r--r--src/devices/bus/ti99/gromport/multiconn.cpp2
-rw-r--r--src/devices/bus/ti99/gromport/singleconn.cpp2
-rw-r--r--src/devices/bus/ti99/internal/992board.cpp12
-rw-r--r--src/devices/bus/ti99/internal/998board.cpp10
-rw-r--r--src/devices/bus/ti99/internal/buffram.cpp2
-rw-r--r--src/devices/bus/ti99/internal/datamux.cpp2
-rw-r--r--src/devices/bus/ti99/internal/evpcconn.cpp2
-rw-r--r--src/devices/bus/ti99/internal/genboard.cpp6
-rw-r--r--src/devices/bus/ti99/internal/ioport.cpp2
-rw-r--r--src/devices/bus/ti99/joyport/handset.cpp4
-rw-r--r--src/devices/bus/ti99/joyport/joyport.cpp2
-rw-r--r--src/devices/bus/ti99/joyport/mecmouse.cpp2
-rw-r--r--src/devices/bus/ti99/peb/bwg.cpp2
-rw-r--r--src/devices/bus/ti99/peb/cc_fdc.cpp12
-rw-r--r--src/devices/bus/ti99/peb/evpc.cpp2
-rw-r--r--src/devices/bus/ti99/peb/forti.cpp2
-rw-r--r--src/devices/bus/ti99/peb/hfdc.cpp2
-rw-r--r--src/devices/bus/ti99/peb/horizon.cpp2
-rw-r--r--src/devices/bus/ti99/peb/hsgpl.cpp2
-rw-r--r--src/devices/bus/ti99/peb/memex.cpp2
-rw-r--r--src/devices/bus/ti99/peb/myarcfdc.cpp4
-rw-r--r--src/devices/bus/ti99/peb/myarcmem.cpp2
-rw-r--r--src/devices/bus/ti99/peb/pcode.cpp2
-rw-r--r--src/devices/bus/ti99/peb/peribox.cpp12
-rw-r--r--src/devices/bus/ti99/peb/pgram.cpp2
-rw-r--r--src/devices/bus/ti99/peb/samsmem.cpp2
-rw-r--r--src/devices/bus/ti99/peb/sidmaster.cpp2
-rw-r--r--src/devices/bus/ti99/peb/spchsyn.cpp2
-rw-r--r--src/devices/bus/ti99/peb/ti_32kmem.cpp2
-rw-r--r--src/devices/bus/ti99/peb/ti_fdc.cpp2
-rw-r--r--src/devices/bus/ti99/peb/ti_rs232.cpp6
-rw-r--r--src/devices/bus/ti99/peb/tn_ide.cpp2
-rw-r--r--src/devices/bus/ti99/peb/tn_usbsm.cpp2
-rw-r--r--src/devices/bus/vboy/slot.cpp6
-rw-r--r--src/devices/bus/vc4000/slot.cpp2
-rw-r--r--src/devices/bus/vcs/vcs_slot.cpp2
-rw-r--r--src/devices/bus/vectrex/slot.cpp4
-rw-r--r--src/devices/bus/vsmile/vsmile_slot.cpp2
-rw-r--r--src/devices/cpu/adsp2100/adsp2100.cpp1
-rw-r--r--src/devices/cpu/alto2/a2mouse.cpp4
-rw-r--r--src/devices/cpu/arc/arc.cpp7
-rw-r--r--src/devices/cpu/asap/asap.cpp1
-rw-r--r--src/devices/cpu/dsp16/dsp16.cpp2
-rw-r--r--src/devices/cpu/dsp32/dsp32.cpp1
-rw-r--r--src/devices/cpu/dsp56156/dsp56156.cpp3
-rw-r--r--src/devices/cpu/dspp/dspp.cpp1
-rw-r--r--src/devices/cpu/e132xs/e132xsdrc_ops.hxx52
-rw-r--r--src/devices/cpu/e132xs/e132xsop.hxx41
-rw-r--r--src/devices/cpu/es5510/es5510.cpp4
-rw-r--r--src/devices/cpu/f2mc16/f2mc16.cpp2
-rw-r--r--src/devices/cpu/g65816/g65816.cpp9
-rw-r--r--src/devices/cpu/g65816/g65816.h2
-rw-r--r--src/devices/cpu/g65816/g65816op.h5
-rw-r--r--src/devices/cpu/hphybrid/hphybrid.cpp1
-rw-r--r--src/devices/cpu/i386/i386.cpp19
-rw-r--r--src/devices/cpu/i386/i386.h2
-rw-r--r--src/devices/cpu/i8085/i8085.cpp1
-rw-r--r--src/devices/cpu/ks0164/ks0164.cpp1
-rw-r--r--src/devices/cpu/m6502/m6502.cpp1
-rw-r--r--src/devices/cpu/m68000/m68kcpu.cpp1
-rw-r--r--src/devices/cpu/m6805/m68705.h2
-rw-r--r--src/devices/cpu/mb86233/mb86233.cpp2
-rw-r--r--src/devices/cpu/mb86233/mb86233.h3
-rw-r--r--src/devices/cpu/mc68hc11/mc68hc11.cpp43
-rw-r--r--src/devices/cpu/mc68hc11/mc68hc11.h9
-rw-r--r--src/devices/cpu/mcs48/mcs48.cpp2
-rw-r--r--src/devices/cpu/mcs48/mcs48.h1
-rw-r--r--src/devices/cpu/mcs96/mcs96.cpp1
-rw-r--r--src/devices/cpu/mips/mips1.cpp8
-rw-r--r--src/devices/cpu/mips/mips3.cpp1
-rw-r--r--src/devices/cpu/nec/nec.cpp5
-rw-r--r--src/devices/cpu/nec/v25.cpp5
-rw-r--r--src/devices/cpu/pdp8/hd6120.cpp4
-rw-r--r--src/devices/cpu/pdp8/pdp8dasm.cpp6
-rw-r--r--src/devices/cpu/powerpc/ppccom.cpp1
-rw-r--r--src/devices/cpu/pps4/pps4.cpp95
-rw-r--r--src/devices/cpu/pps41/mm78.cpp2
-rw-r--r--src/devices/cpu/rsp/rsp.cpp49
-rw-r--r--src/devices/cpu/sc61860/sc61860.cpp1
-rw-r--r--src/devices/cpu/se3208/se3208.cpp1
-rw-r--r--src/devices/cpu/sh/sh.cpp2
-rw-r--r--src/devices/cpu/sh/sh.h2
-rw-r--r--src/devices/cpu/spc700/spc700.cpp5
-rw-r--r--src/devices/cpu/tlcs870/tlcs870.cpp2
-rw-r--r--src/devices/cpu/tlcs870/tlcs870.h3
-rw-r--r--src/devices/cpu/tlcs90/tlcs90.cpp1
-rw-r--r--src/devices/cpu/tms32010/tms32010.cpp2
-rw-r--r--src/devices/cpu/tms32025/tms32025.cpp2
-rw-r--r--src/devices/cpu/tms34010/tms34010.cpp1
-rw-r--r--src/devices/cpu/tms7000/tms7000.cpp1
-rw-r--r--src/devices/cpu/tx0/tx0.cpp4
-rw-r--r--src/devices/cpu/tx0/tx0dasm.cpp74
-rw-r--r--src/devices/cpu/upd7810/upd7810.cpp3
-rw-r--r--src/devices/cpu/v60/v60.cpp1
-rw-r--r--src/devices/cpu/v810/v810.cpp1
-rw-r--r--src/devices/cpu/vax/vaxdasm.cpp1120
-rw-r--r--src/devices/cpu/vax/vaxdasm.h38
-rw-r--r--src/devices/cpu/xavix2/xavix2.cpp1
-rw-r--r--src/devices/cpu/z180/z180.cpp1
-rw-r--r--src/devices/cpu/z8/z8.cpp1
-rw-r--r--src/devices/cpu/z80/z80.cpp1
-rw-r--r--src/devices/cpu/z8000/z8000.cpp1
-rw-r--r--src/devices/imagedev/cassette.cpp118
-rw-r--r--src/devices/imagedev/chd_cd.cpp23
-rw-r--r--src/devices/imagedev/diablo.cpp42
-rw-r--r--src/devices/imagedev/flopdrv.cpp80
-rw-r--r--src/devices/imagedev/floppy.cpp144
-rw-r--r--src/devices/imagedev/harddriv.cpp52
-rw-r--r--src/devices/imagedev/mfmhd.cpp30
-rw-r--r--src/devices/imagedev/mfmhd.h6
-rw-r--r--src/devices/imagedev/midiin.cpp2
-rw-r--r--src/devices/machine/8042kbdc.cpp117
-rw-r--r--src/devices/machine/8042kbdc.h22
-rw-r--r--src/devices/machine/ataflash.cpp6
-rw-r--r--src/devices/machine/ch376.cpp2
-rw-r--r--src/devices/machine/clock.cpp140
-rw-r--r--src/devices/machine/clock.h36
-rw-r--r--src/devices/machine/fdc37c665gt.cpp12
-rw-r--r--src/devices/machine/fdc37c93x.cpp2
-rw-r--r--src/devices/machine/hp_dc100_tape.cpp47
-rw-r--r--src/devices/machine/i8255.cpp1
-rw-r--r--src/devices/machine/i8255.h2
-rw-r--r--src/devices/machine/i8257.cpp6
-rw-r--r--src/devices/machine/laserdsc.cpp27
-rw-r--r--src/devices/machine/laserdsc.h28
-rw-r--r--src/devices/machine/nscsi_bus.cpp1
-rw-r--r--src/devices/machine/r10788.cpp19
-rw-r--r--src/devices/machine/spi_sdcard.cpp273
-rw-r--r--src/devices/machine/spi_sdcard.h55
-rw-r--r--src/devices/machine/upd4991a.cpp140
-rw-r--r--src/devices/machine/upd4991a.h59
-rw-r--r--src/devices/sound/aica.cpp4
-rw-r--r--src/devices/sound/aicadsp.cpp4
-rw-r--r--src/devices/sound/cem3394.cpp4
-rw-r--r--src/devices/sound/dmadac.cpp77
-rw-r--r--src/devices/sound/dmadac.h33
-rw-r--r--src/devices/sound/es5503.cpp17
-rw-r--r--src/devices/sound/gaelco.h3
-rw-r--r--src/devices/sound/huc6230.cpp6
-rw-r--r--src/devices/sound/ics2115.cpp80
-rw-r--r--src/devices/sound/ics2115.h1
-rw-r--r--src/devices/sound/ks0164.cpp2
-rw-r--r--src/devices/sound/okim6295.cpp3
-rw-r--r--src/devices/sound/okim6376.cpp3
-rw-r--r--src/devices/sound/okim9810.cpp6
-rw-r--r--src/devices/sound/qsoundhle.cpp14
-rw-r--r--src/devices/sound/rolandpcm.cpp5
-rw-r--r--src/devices/sound/samples.cpp18
-rw-r--r--src/devices/sound/scsp.cpp4
-rw-r--r--src/devices/sound/scsp.h4
-rw-r--r--src/devices/sound/scspdsp.cpp4
-rw-r--r--src/devices/sound/spu.cpp2
-rw-r--r--src/devices/sound/zsg2.cpp2
-rw-r--r--src/devices/video/hd44780.cpp3
-rw-r--r--src/devices/video/hd44780.h2
-rw-r--r--src/devices/video/hd61830.cpp1
-rw-r--r--src/devices/video/hd61830.h2
-rw-r--r--src/devices/video/i8244.h11
-rw-r--r--src/devices/video/poly.h246
-rw-r--r--src/devices/video/upd7220.cpp31
-rw-r--r--src/devices/video/vector.cpp4
-rw-r--r--src/devices/video/voodoo_render.cpp19
-rw-r--r--src/devices/video/voodoo_render.h4
-rw-r--r--src/devices/video/zeus2.cpp2
-rw-r--r--src/emu/addrmap.h2
-rw-r--r--src/emu/attotime.h5
-rw-r--r--src/emu/config.cpp20
-rw-r--r--src/emu/crsshair.cpp6
-rw-r--r--src/emu/debug/debugcmd.cpp111
-rw-r--r--src/emu/debug/debugcmd.h1
-rw-r--r--src/emu/debug/debugcpu.cpp99
-rw-r--r--src/emu/debug/debugcpu.h17
-rw-r--r--src/emu/debug/debughlp.cpp31
-rw-r--r--src/emu/debug/dvdisasm.cpp10
-rw-r--r--src/emu/debug/dvdisasm.h2
-rw-r--r--src/emu/debug/dvmemory.cpp110
-rw-r--r--src/emu/debug/dvmemory.h29
-rw-r--r--src/emu/debug/points.cpp33
-rw-r--r--src/emu/devcb.h104
-rw-r--r--src/emu/devdelegate.h16
-rw-r--r--src/emu/devfind.h6
-rw-r--r--src/emu/device.cpp2
-rw-r--r--src/emu/device.h149
-rw-r--r--src/emu/diimage.cpp207
-rw-r--r--src/emu/diimage.h33
-rw-r--r--src/emu/dimemory.h10
-rw-r--r--src/emu/dipty.cpp9
-rw-r--r--src/emu/dipty.h8
-rw-r--r--src/emu/distate.cpp5
-rw-r--r--src/emu/distate.h16
-rw-r--r--src/emu/divtlb.cpp8
-rw-r--r--src/emu/driver.h16
-rw-r--r--src/emu/emucore.cpp2
-rw-r--r--src/emu/emucore.h62
-rw-r--r--src/emu/emumem.h31
-rw-r--r--src/emu/emumem_mud.cpp2
-rw-r--r--src/emu/emumem_mud.h6
-rw-r--r--src/emu/fileio.cpp69
-rw-r--r--src/emu/fileio.h26
-rw-r--r--src/emu/gamedrv.h354
-rw-r--r--src/emu/hashfile.cpp4
-rw-r--r--src/emu/http.cpp6
-rw-r--r--src/emu/image.cpp4
-rw-r--r--src/emu/inpttype.ipp1
-rw-r--r--src/emu/ioport.cpp85
-rw-r--r--src/emu/ioport.h12
-rw-r--r--src/emu/machine.cpp14
-rw-r--r--src/emu/machine.h6
-rw-r--r--src/emu/memarray.cpp54
-rw-r--r--src/emu/render.cpp80
-rw-r--r--src/emu/rendfont.cpp16
-rw-r--r--src/emu/rendlay.cpp41
-rw-r--r--src/emu/rendlay.h30
-rw-r--r--src/emu/romload.cpp70
-rw-r--r--src/emu/romload.h13
-rw-r--r--src/emu/save.cpp55
-rw-r--r--src/emu/save.h8
-rw-r--r--src/emu/screen.cpp6
-rw-r--r--src/emu/screen.h9
-rw-r--r--src/emu/softlist_dev.cpp6
-rw-r--r--src/emu/sound.h1
-rw-r--r--src/emu/uiinput.h2
-rw-r--r--src/emu/validity.cpp27
-rw-r--r--src/emu/video.cpp26
-rw-r--r--src/emu/video.h4
-rw-r--r--src/emu/xtal.cpp2
-rw-r--r--src/frontend/mame/audit.cpp16
-rw-r--r--src/frontend/mame/cheat.cpp9
-rw-r--r--src/frontend/mame/clifront.cpp6
-rw-r--r--src/frontend/mame/infoxml.cpp76
-rw-r--r--src/frontend/mame/language.cpp2
-rw-r--r--src/frontend/mame/luaengine.cpp57
-rw-r--r--src/frontend/mame/luaengine.ipp8
-rw-r--r--src/frontend/mame/luaengine_mem.cpp12
-rw-r--r--src/frontend/mame/mame.cpp6
-rw-r--r--src/frontend/mame/mameopts.cpp4
-rw-r--r--src/frontend/mame/media_ident.cpp16
-rw-r--r--src/frontend/mame/ui/auditmenu.cpp2
-rw-r--r--src/frontend/mame/ui/filesel.cpp40
-rw-r--r--src/frontend/mame/ui/floppycntrl.cpp5
-rw-r--r--src/frontend/mame/ui/imgcntrl.cpp2
-rw-r--r--src/frontend/mame/ui/inifile.cpp8
-rw-r--r--src/frontend/mame/ui/menu.cpp4
-rw-r--r--src/frontend/mame/ui/miscmenu.cpp18
-rw-r--r--src/frontend/mame/ui/optsmenu.cpp2
-rw-r--r--src/frontend/mame/ui/selgame.cpp12
-rw-r--r--src/frontend/mame/ui/selmenu.cpp30
-rw-r--r--src/frontend/mame/ui/selsoft.cpp8
-rw-r--r--src/frontend/mame/ui/state.cpp10
-rw-r--r--src/frontend/mame/ui/ui.cpp29
-rw-r--r--src/frontend/mame/ui/utils.cpp2
-rw-r--r--src/frontend/mame/ui/viewgfx.cpp280
-rw-r--r--src/frontend/mame/ui/viewgfx.h1
-rw-r--r--src/lib/formats/acorn_dsk.cpp216
-rw-r--r--src/lib/formats/acorn_dsk.h30
-rw-r--r--src/lib/formats/afs_dsk.cpp3
-rw-r--r--src/lib/formats/afs_dsk.h2
-rw-r--r--src/lib/formats/aim_dsk.cpp19
-rw-r--r--src/lib/formats/aim_dsk.h11
-rw-r--r--src/lib/formats/ami_dsk.cpp80
-rw-r--r--src/lib/formats/ami_dsk.h6
-rw-r--r--src/lib/formats/ap2_dsk.cpp141
-rw-r--r--src/lib/formats/ap2_dsk.h26
-rw-r--r--src/lib/formats/ap_dsk35.cpp83
-rw-r--r--src/lib/formats/ap_dsk35.h18
-rw-r--r--src/lib/formats/apd_dsk.cpp26
-rw-r--r--src/lib/formats/apd_dsk.h4
-rw-r--r--src/lib/formats/apollo_dsk.cpp14
-rw-r--r--src/lib/formats/apollo_dsk.h2
-rw-r--r--src/lib/formats/apridisk.cpp24
-rw-r--r--src/lib/formats/apridisk.h6
-rw-r--r--src/lib/formats/cassimg.cpp79
-rw-r--r--src/lib/formats/cassimg.h22
-rw-r--r--src/lib/formats/ccvf_dsk.cpp19
-rw-r--r--src/lib/formats/ccvf_dsk.h4
-rw-r--r--src/lib/formats/concept_dsk.cpp49
-rw-r--r--src/lib/formats/concept_dsk.h8
-rw-r--r--src/lib/formats/coupedsk.cpp28
-rw-r--r--src/lib/formats/coupedsk.h6
-rw-r--r--src/lib/formats/cqm_dsk.cpp36
-rw-r--r--src/lib/formats/cqm_dsk.h6
-rw-r--r--src/lib/formats/d64_dsk.cpp33
-rw-r--r--src/lib/formats/d64_dsk.h10
-rw-r--r--src/lib/formats/d80_dsk.cpp5
-rw-r--r--src/lib/formats/d88_dsk.cpp35
-rw-r--r--src/lib/formats/d88_dsk.h6
-rw-r--r--src/lib/formats/dcp_dsk.cpp28
-rw-r--r--src/lib/formats/dcp_dsk.h4
-rw-r--r--src/lib/formats/dfi_dsk.cpp25
-rw-r--r--src/lib/formats/dfi_dsk.h6
-rw-r--r--src/lib/formats/dim_dsk.cpp22
-rw-r--r--src/lib/formats/dim_dsk.h6
-rw-r--r--src/lib/formats/dip_dsk.cpp16
-rw-r--r--src/lib/formats/dip_dsk.h4
-rw-r--r--src/lib/formats/dmk_dsk.cpp27
-rw-r--r--src/lib/formats/dmk_dsk.h6
-rw-r--r--src/lib/formats/ds9_dsk.cpp24
-rw-r--r--src/lib/formats/ds9_dsk.h13
-rw-r--r--src/lib/formats/dsk_dsk.cpp35
-rw-r--r--src/lib/formats/dsk_dsk.h4
-rw-r--r--src/lib/formats/dvk_mx_dsk.cpp25
-rw-r--r--src/lib/formats/dvk_mx_dsk.h13
-rw-r--r--src/lib/formats/esq16_dsk.cpp40
-rw-r--r--src/lib/formats/esq16_dsk.h8
-rw-r--r--src/lib/formats/esq8_dsk.cpp38
-rw-r--r--src/lib/formats/esq8_dsk.h8
-rw-r--r--src/lib/formats/fdd_dsk.cpp18
-rw-r--r--src/lib/formats/fdd_dsk.h4
-rw-r--r--src/lib/formats/flex_dsk.cpp22
-rw-r--r--src/lib/formats/flex_dsk.h4
-rw-r--r--src/lib/formats/flopimg.cpp77
-rw-r--r--src/lib/formats/flopimg.h32
-rw-r--r--src/lib/formats/fsd_dsk.cpp16
-rw-r--r--src/lib/formats/fsd_dsk.h4
-rw-r--r--src/lib/formats/g64_dsk.cpp45
-rw-r--r--src/lib/formats/g64_dsk.h6
-rw-r--r--src/lib/formats/hpi_dsk.cpp23
-rw-r--r--src/lib/formats/hpi_dsk.h6
-rw-r--r--src/lib/formats/hti_tape.cpp52
-rw-r--r--src/lib/formats/hti_tape.h12
-rw-r--r--src/lib/formats/hxchfe_dsk.cpp26
-rw-r--r--src/lib/formats/hxchfe_dsk.h6
-rw-r--r--src/lib/formats/hxcmfm_dsk.cpp28
-rw-r--r--src/lib/formats/hxcmfm_dsk.h6
-rw-r--r--src/lib/formats/ibmxdf_dsk.cpp17
-rw-r--r--src/lib/formats/ibmxdf_dsk.h6
-rw-r--r--src/lib/formats/imd_dsk.cpp76
-rw-r--r--src/lib/formats/imd_dsk.h6
-rw-r--r--src/lib/formats/img_dsk.cpp22
-rw-r--r--src/lib/formats/img_dsk.h6
-rw-r--r--src/lib/formats/ioprocs.cpp214
-rw-r--r--src/lib/formats/ioprocs.h70
-rw-r--r--src/lib/formats/ipf_dsk.cpp21
-rw-r--r--src/lib/formats/ipf_dsk.h4
-rw-r--r--src/lib/formats/jfd_dsk.cpp25
-rw-r--r--src/lib/formats/jfd_dsk.h4
-rw-r--r--src/lib/formats/jvc_dsk.cpp26
-rw-r--r--src/lib/formats/jvc_dsk.h8
-rw-r--r--src/lib/formats/m20_dsk.cpp42
-rw-r--r--src/lib/formats/m20_dsk.h6
-rw-r--r--src/lib/formats/mdos_dsk.cpp22
-rw-r--r--src/lib/formats/mdos_dsk.h4
-rw-r--r--src/lib/formats/mfi_dsk.cpp29
-rw-r--r--src/lib/formats/mfi_dsk.h6
-rw-r--r--src/lib/formats/mfm_hd.cpp17
-rw-r--r--src/lib/formats/mfm_hd.h8
-rw-r--r--src/lib/formats/nfd_dsk.cpp31
-rw-r--r--src/lib/formats/nfd_dsk.h4
-rw-r--r--src/lib/formats/opd_dsk.cpp5
-rw-r--r--src/lib/formats/opd_dsk.h2
-rw-r--r--src/lib/formats/oric_dsk.cpp53
-rw-r--r--src/lib/formats/oric_dsk.h12
-rw-r--r--src/lib/formats/os9_dsk.cpp15
-rw-r--r--src/lib/formats/os9_dsk.h4
-rw-r--r--src/lib/formats/pasti_dsk.cpp16
-rw-r--r--src/lib/formats/pasti_dsk.h4
-rw-r--r--src/lib/formats/pc98fdi_dsk.cpp54
-rw-r--r--src/lib/formats/pc98fdi_dsk.h4
-rw-r--r--src/lib/formats/pc_dsk.cpp13
-rw-r--r--src/lib/formats/pc_dsk.h2
-rw-r--r--src/lib/formats/poly_dsk.cpp31
-rw-r--r--src/lib/formats/poly_dsk.h4
-rw-r--r--src/lib/formats/rpk.cpp474
-rw-r--r--src/lib/formats/rpk.h143
-rw-r--r--src/lib/formats/rx50_dsk.cpp27
-rw-r--r--src/lib/formats/rx50_dsk.h8
-rw-r--r--src/lib/formats/sdd_dsk.cpp5
-rw-r--r--src/lib/formats/sdf_dsk.cpp23
-rw-r--r--src/lib/formats/sdf_dsk.h6
-rw-r--r--src/lib/formats/st_dsk.cpp66
-rw-r--r--src/lib/formats/st_dsk.h16
-rw-r--r--src/lib/formats/svi_dsk.cpp37
-rw-r--r--src/lib/formats/svi_dsk.h6
-rw-r--r--src/lib/formats/td0_dsk.cpp73
-rw-r--r--src/lib/formats/td0_dsk.h6
-rw-r--r--src/lib/formats/ti99_dsk.cpp75
-rw-r--r--src/lib/formats/ti99_dsk.h26
-rw-r--r--src/lib/formats/trd_dsk.cpp17
-rw-r--r--src/lib/formats/trd_dsk.h2
-rw-r--r--src/lib/formats/trs80_dsk.cpp58
-rw-r--r--src/lib/formats/trs80_dsk.h6
-rw-r--r--src/lib/formats/uniflex_dsk.cpp21
-rw-r--r--src/lib/formats/uniflex_dsk.h4
-rw-r--r--src/lib/formats/upd765_dsk.cpp21
-rw-r--r--src/lib/formats/upd765_dsk.h8
-rw-r--r--src/lib/formats/vdk_dsk.cpp42
-rw-r--r--src/lib/formats/vdk_dsk.h6
-rw-r--r--src/lib/formats/victor9k_dsk.cpp32
-rw-r--r--src/lib/formats/victor9k_dsk.h8
-rw-r--r--src/lib/formats/vt_dsk.cpp47
-rw-r--r--src/lib/formats/vt_dsk.h12
-rw-r--r--src/lib/formats/wd177x_dsk.cpp31
-rw-r--r--src/lib/formats/wd177x_dsk.h8
-rw-r--r--src/lib/netlist/nl_config.h4
-rw-r--r--src/lib/netlist/plib/pfunction.cpp1
-rw-r--r--src/lib/netlist/tests/test_pfunction.cpp2
-rw-r--r--src/lib/util/avhuff.cpp4
-rw-r--r--src/lib/util/aviio.cpp84
-rw-r--r--src/lib/util/bitmap.cpp2
-rw-r--r--src/lib/util/cdrom.cpp91
-rw-r--r--src/lib/util/cdrom.h14
-rw-r--r--src/lib/util/chd.cpp711
-rw-r--r--src/lib/util/chd.h274
-rw-r--r--src/lib/util/chdcd.cpp186
-rw-r--r--src/lib/util/chdcd.h12
-rw-r--r--src/lib/util/chdcodec.cpp262
-rw-r--r--src/lib/util/chdcodec.h95
-rw-r--r--src/lib/util/corefile.cpp441
-rw-r--r--src/lib/util/corefile.h49
-rw-r--r--src/lib/util/coretmpl.h19
-rw-r--r--src/lib/util/endianness.h76
-rw-r--r--src/lib/util/harddisk.cpp18
-rw-r--r--src/lib/util/harddisk.h10
-rw-r--r--src/lib/util/ioprocs.cpp1248
-rw-r--r--src/lib/util/ioprocs.h268
-rw-r--r--src/lib/util/ioprocsfill.h163
-rw-r--r--src/lib/util/ioprocsfilter.cpp600
-rw-r--r--src/lib/util/ioprocsfilter.h31
-rw-r--r--src/lib/util/ioprocsvec.h211
-rw-r--r--src/lib/util/path.cpp0
-rw-r--r--src/lib/util/path.h83
-rw-r--r--src/lib/util/strformat.h54
-rw-r--r--src/lib/util/timeconv.cpp69
-rw-r--r--src/lib/util/timeconv.h50
-rw-r--r--src/lib/util/un7z.cpp467
-rw-r--r--src/lib/util/unicode.cpp4
-rw-r--r--src/lib/util/unzip.cpp1088
-rw-r--r--src/lib/util/unzip.h58
-rw-r--r--src/lib/util/utilfwd.h45
-rw-r--r--src/lib/util/zippath.cpp160
-rw-r--r--src/lib/util/zippath.h5
-rw-r--r--src/mame/arcade.flt1
-rw-r--r--src/mame/audio/ad_sound.cpp16
-rw-r--r--src/mame/audio/atarijsa.cpp4
-rw-r--r--src/mame/audio/bally.cpp82
-rw-r--r--src/mame/audio/bally.h41
-rw-r--r--src/mame/audio/cchasm.cpp128
-rw-r--r--src/mame/audio/cps3.cpp7
-rw-r--r--src/mame/audio/dcs.cpp55
-rw-r--r--src/mame/audio/dcs.h12
-rw-r--r--src/mame/audio/decobsmt.cpp4
-rw-r--r--src/mame/audio/dkong.cpp4
-rw-r--r--src/mame/audio/hng64.cpp4
-rw-r--r--src/mame/audio/m72.h4
-rw-r--r--src/mame/audio/mario.cpp2
-rw-r--r--src/mame/audio/n8080.cpp6
-rw-r--r--src/mame/audio/qix.cpp6
-rw-r--r--src/mame/audio/redalert.cpp206
-rw-r--r--src/mame/audio/redalert.h127
-rw-r--r--src/mame/audio/wiping.cpp10
-rw-r--r--src/mame/drivers/20pacgal.cpp4
-rw-r--r--src/mame/drivers/4enraya.cpp61
-rw-r--r--src/mame/drivers/agat.cpp22
-rw-r--r--src/mame/drivers/aim65.cpp4
-rw-r--r--src/mame/drivers/airraid.cpp160
-rw-r--r--src/mame/drivers/alpha68k_n.cpp16
-rw-r--r--src/mame/drivers/alphasma.cpp38
-rw-r--r--src/mame/drivers/alphatro.cpp2
-rw-r--r--src/mame/drivers/amiga.cpp102
-rw-r--r--src/mame/drivers/apple2.cpp22
-rw-r--r--src/mame/drivers/apple2e.cpp48
-rw-r--r--src/mame/drivers/apple2gs.cpp51
-rw-r--r--src/mame/drivers/applix.cpp2
-rw-r--r--src/mame/drivers/apxen.cpp41
-rw-r--r--src/mame/drivers/aristmk6.cpp2587
-rw-r--r--src/mame/drivers/astrcorp.cpp40
-rw-r--r--src/mame/drivers/asuka.cpp78
-rw-r--r--src/mame/drivers/atari_s1.cpp25
-rw-r--r--src/mame/drivers/atarig1.cpp2
-rw-r--r--src/mame/drivers/atarig42.cpp125
-rw-r--r--src/mame/drivers/atarigx2.cpp4
-rw-r--r--src/mame/drivers/atarisy1.cpp12
-rw-r--r--src/mame/drivers/atarisy4.cpp2
-rw-r--r--src/mame/drivers/atom.cpp2
-rw-r--r--src/mame/drivers/ave_arb.cpp29
-rw-r--r--src/mame/drivers/banprestoms.cpp69
-rw-r--r--src/mame/drivers/barni.cpp273
-rw-r--r--src/mame/drivers/beathead.cpp2
-rw-r--r--src/mame/drivers/beta.cpp2
-rw-r--r--src/mame/drivers/bigbord2.cpp20
-rw-r--r--src/mame/drivers/binbug.cpp10
-rw-r--r--src/mame/drivers/by17.cpp23
-rw-r--r--src/mame/drivers/by35.cpp21
-rw-r--r--src/mame/drivers/by6803.cpp53
-rw-r--r--src/mame/drivers/calchase.cpp49
-rw-r--r--src/mame/drivers/cc40.cpp2
-rw-r--r--src/mame/drivers/cchasm.cpp350
-rw-r--r--src/mame/drivers/ccs2810.cpp20
-rw-r--r--src/mame/drivers/cd2650.cpp10
-rw-r--r--src/mame/drivers/ceres.cpp4
-rw-r--r--src/mame/drivers/champbas.cpp13
-rw-r--r--src/mame/drivers/changela.cpp6
-rw-r--r--src/mame/drivers/cking_master.cpp15
-rw-r--r--src/mame/drivers/clshroad.cpp2
-rw-r--r--src/mame/drivers/cobra.cpp2
-rw-r--r--src/mame/drivers/cops.cpp57
-rw-r--r--src/mame/drivers/cortex.cpp23
-rw-r--r--src/mame/drivers/cromptons.cpp12
-rw-r--r--src/mame/drivers/cv1k.cpp237
-rw-r--r--src/mame/drivers/cvicny.cpp13
-rw-r--r--src/mame/drivers/cvs.cpp8
-rw-r--r--src/mame/drivers/cybstorm.cpp64
-rw-r--r--src/mame/drivers/cz101.cpp68
-rw-r--r--src/mame/drivers/d6800.cpp2
-rw-r--r--src/mame/drivers/d9final.cpp65
-rw-r--r--src/mame/drivers/darius.cpp28
-rw-r--r--src/mame/drivers/dccons.cpp8
-rw-r--r--src/mame/drivers/dec0.cpp12
-rw-r--r--src/mame/drivers/decmate2.cpp2
-rw-r--r--src/mame/drivers/dmv.cpp3
-rw-r--r--src/mame/drivers/dooyong.cpp67
-rw-r--r--src/mame/drivers/dps1.cpp18
-rw-r--r--src/mame/drivers/dsb46.cpp21
-rw-r--r--src/mame/drivers/elan_eu3a05.cpp2
-rw-r--r--src/mame/drivers/electron.cpp64
-rw-r--r--src/mame/drivers/enigma2.cpp17
-rw-r--r--src/mame/drivers/epos.cpp8
-rw-r--r--src/mame/drivers/eprom.cpp2
-rw-r--r--src/mame/drivers/eti660.cpp2
-rw-r--r--src/mame/drivers/excali64.cpp115
-rw-r--r--src/mame/drivers/exidy.cpp1063
-rw-r--r--src/mame/drivers/f-32.cpp332
-rw-r--r--src/mame/drivers/fidel_card.cpp2
-rw-r--r--src/mame/drivers/flstory.cpp1
-rw-r--r--src/mame/drivers/force68k.cpp4
-rw-r--r--src/mame/drivers/funkyjet.cpp230
-rw-r--r--src/mame/drivers/gaelco3d.cpp8
-rw-r--r--src/mame/drivers/galaxian.cpp11
-rw-r--r--src/mame/drivers/galgames.cpp5
-rw-r--r--src/mame/drivers/gameking.cpp2
-rw-r--r--src/mame/drivers/gfamily.cpp40
-rw-r--r--src/mame/drivers/gm1000.cpp123
-rw-r--r--src/mame/drivers/gng.cpp6
-rw-r--r--src/mame/drivers/goldstar.cpp145
-rw-r--r--src/mame/drivers/groundfx.cpp2
-rw-r--r--src/mame/drivers/gts1.cpp919
-rw-r--r--src/mame/drivers/hanaawas.cpp235
-rw-r--r--src/mame/drivers/harddriv.cpp4
-rw-r--r--src/mame/drivers/hh_cop400.cpp19
-rw-r--r--src/mame/drivers/hh_hmcs40.cpp6
-rw-r--r--src/mame/drivers/hh_tms1k.cpp163
-rw-r--r--src/mame/drivers/hng64.cpp59
-rw-r--r--src/mame/drivers/homelab.cpp10
-rw-r--r--src/mame/drivers/hx20.cpp2
-rw-r--r--src/mame/drivers/ibmpcjr.cpp2
-rw-r--r--src/mame/drivers/igs_m027.cpp73
-rw-r--r--src/mame/drivers/instruct.cpp10
-rw-r--r--src/mame/drivers/jaguar.cpp2
-rw-r--r--src/mame/drivers/jtc.cpp14
-rw-r--r--src/mame/drivers/jupace.cpp6
-rw-r--r--src/mame/drivers/kaneko16.cpp26
-rw-r--r--src/mame/drivers/kangaroo.cpp34
-rw-r--r--src/mame/drivers/kaypro.cpp4
-rw-r--r--src/mame/drivers/kenseim.cpp31
-rw-r--r--src/mame/drivers/kikikai.cpp182
-rw-r--r--src/mame/drivers/kinst.cpp514
-rw-r--r--src/mame/drivers/kncljoe.cpp40
-rw-r--r--src/mame/drivers/konamigx.cpp70
-rw-r--r--src/mame/drivers/konendev.cpp46
-rw-r--r--src/mame/drivers/konmedal68k.cpp9
-rw-r--r--src/mame/drivers/ksys573.cpp172
-rw-r--r--src/mame/drivers/ldplayer.cpp9
-rw-r--r--src/mame/drivers/lethalj.cpp6
-rw-r--r--src/mame/drivers/lynx.cpp4
-rw-r--r--src/mame/drivers/m68705prg.cpp4
-rw-r--r--src/mame/drivers/m72.cpp4
-rw-r--r--src/mame/drivers/mac128.cpp1
-rw-r--r--src/mame/drivers/mbc200.cpp19
-rw-r--r--src/mame/drivers/mcr68.cpp4
-rw-r--r--src/mame/drivers/megadriv.cpp13
-rw-r--r--src/mame/drivers/mephisto_modular.cpp2
-rw-r--r--src/mame/drivers/merit.cpp16
-rw-r--r--src/mame/drivers/meritm.cpp2
-rw-r--r--src/mame/drivers/mes.cpp19
-rw-r--r--src/mame/drivers/microvsn.cpp2
-rw-r--r--src/mame/drivers/miniguay.cpp2
-rw-r--r--src/mame/drivers/missbamby.cpp219
-rw-r--r--src/mame/drivers/missile.cpp36
-rw-r--r--src/mame/drivers/mmd1.cpp27
-rw-r--r--src/mame/drivers/myvision.cpp2
-rw-r--r--src/mame/drivers/n8080.cpp390
-rw-r--r--src/mame/drivers/nakajies.cpp67
-rw-r--r--src/mame/drivers/namcona1.cpp99
-rw-r--r--src/mame/drivers/namcos2.cpp51
-rw-r--r--src/mame/drivers/namcos22.cpp28
-rw-r--r--src/mame/drivers/namcos23.cpp2
-rw-r--r--src/mame/drivers/naomi.cpp2
-rw-r--r--src/mame/drivers/nascom1.cpp4
-rw-r--r--src/mame/drivers/neogeo.cpp2
-rw-r--r--src/mame/drivers/ngp.cpp2
-rw-r--r--src/mame/drivers/ns32kdb.cpp26
-rw-r--r--src/mame/drivers/opercoin.cpp97
-rw-r--r--src/mame/drivers/opwolf.cpp66
-rw-r--r--src/mame/drivers/pc8801.cpp102
-rw-r--r--src/mame/drivers/pc9801.cpp2302
-rw-r--r--src/mame/drivers/pc9801_epson.cpp490
-rw-r--r--src/mame/drivers/pc9821.cpp1418
-rw-r--r--src/mame/drivers/pc98ha.cpp526
-rw-r--r--src/mame/drivers/pcipc.cpp6
-rw-r--r--src/mame/drivers/pegasus.cpp58
-rw-r--r--src/mame/drivers/pgm.cpp37
-rw-r--r--src/mame/drivers/phunsy.cpp2
-rw-r--r--src/mame/drivers/pipbug.cpp10
-rw-r--r--src/mame/drivers/pipeline.cpp215
-rw-r--r--src/mame/drivers/play_1.cpp37
-rw-r--r--src/mame/drivers/pokemini.cpp4
-rw-r--r--src/mame/drivers/ppmast93.cpp86
-rw-r--r--src/mame/drivers/pv1000.cpp2
-rw-r--r--src/mame/drivers/pv2000.cpp2
-rw-r--r--src/mame/drivers/pwp14.cpp24
-rw-r--r--src/mame/drivers/r2dx_v33.cpp1
-rw-r--r--src/mame/drivers/ravens.cpp10
-rw-r--r--src/mame/drivers/redalert.cpp52
-rw-r--r--src/mame/drivers/rfslotsmcs48.cpp99
-rw-r--r--src/mame/drivers/roland_cm32p.cpp2
-rw-r--r--src/mame/drivers/rollext.cpp2
-rw-r--r--src/mame/drivers/rx78.cpp2
-rw-r--r--src/mame/drivers/s3.cpp280
-rw-r--r--src/mame/drivers/s4.cpp304
-rw-r--r--src/mame/drivers/s6.cpp108
-rw-r--r--src/mame/drivers/s6a.cpp78
-rw-r--r--src/mame/drivers/sag.cpp8
-rw-r--r--src/mame/drivers/sbmjb.cpp18
-rw-r--r--src/mame/drivers/schexx4gen.cpp8
-rw-r--r--src/mame/drivers/segaatom.cpp2
-rw-r--r--src/mame/drivers/segac2.cpp641
-rw-r--r--src/mame/drivers/segas16a.cpp14
-rw-r--r--src/mame/drivers/segas16b.cpp84
-rw-r--r--src/mame/drivers/seibuspi.cpp26
-rw-r--r--src/mame/drivers/seta.cpp56
-rw-r--r--src/mame/drivers/skullxbo.cpp2
-rw-r--r--src/mame/drivers/skylncr.cpp97
-rw-r--r--src/mame/drivers/spg2xx.cpp8
-rw-r--r--src/mame/drivers/spg2xx_ican.cpp2
-rw-r--r--src/mame/drivers/spg2xx_jakks.cpp49
-rw-r--r--src/mame/drivers/spg2xx_smarttv.cpp2
-rw-r--r--src/mame/drivers/spg2xx_telestory.cpp2
-rw-r--r--src/mame/drivers/spg2xx_tvgogo.cpp2
-rw-r--r--src/mame/drivers/spg2xx_vii.cpp2
-rw-r--r--src/mame/drivers/spirit76.cpp304
-rw-r--r--src/mame/drivers/squale.cpp2
-rw-r--r--src/mame/drivers/srmp6.cpp2
-rw-r--r--src/mame/drivers/stellafr.cpp2
-rw-r--r--src/mame/drivers/studio2.cpp8
-rw-r--r--src/mame/drivers/supracan.cpp2
-rw-r--r--src/mame/drivers/supstarf.cpp18
-rw-r--r--src/mame/drivers/sv8000.cpp2
-rw-r--r--src/mame/drivers/svision.cpp2
-rw-r--r--src/mame/drivers/taito_b.cpp40
-rw-r--r--src/mame/drivers/taito_f2.cpp20
-rw-r--r--src/mame/drivers/taito_f3.cpp37
-rw-r--r--src/mame/drivers/taito_z.cpp484
-rw-r--r--src/mame/drivers/taitopjc.cpp4
-rw-r--r--src/mame/drivers/taitotz.cpp4
-rw-r--r--src/mame/drivers/tamag1.cpp51
-rw-r--r--src/mame/drivers/tank8.cpp2
-rw-r--r--src/mame/drivers/taxidriv.cpp265
-rw-r--r--src/mame/drivers/thunderj.cpp2
-rw-r--r--src/mame/drivers/ti74.cpp2
-rw-r--r--src/mame/drivers/timex.cpp8
-rw-r--r--src/mame/drivers/tispeak.cpp2
-rw-r--r--src/mame/drivers/tmspoker.cpp85
-rw-r--r--src/mame/drivers/toaplan1.cpp2
-rw-r--r--src/mame/drivers/toaplan2.cpp22
-rw-r--r--src/mame/drivers/tubep.cpp103
-rw-r--r--src/mame/drivers/twincobr.cpp2
-rw-r--r--src/mame/drivers/tx0.cpp121
-rw-r--r--src/mame/drivers/ultim809.cpp18
-rw-r--r--src/mame/drivers/ultrsprt.cpp53
-rw-r--r--src/mame/drivers/unkhorse.cpp60
-rw-r--r--src/mame/drivers/v6809.cpp12
-rw-r--r--src/mame/drivers/vc4000.cpp16
-rw-r--r--src/mame/drivers/vicdual.cpp70
-rw-r--r--src/mame/drivers/videopkr.cpp143
-rw-r--r--src/mame/drivers/vigilant.cpp24
-rw-r--r--src/mame/drivers/viper.cpp431
-rw-r--r--src/mame/drivers/vsmileb.cpp36
-rw-r--r--src/mame/drivers/vtech1.cpp4
-rw-r--r--src/mame/drivers/wardner.cpp2
-rw-r--r--src/mame/drivers/wpc_95.cpp18
-rw-r--r--src/mame/drivers/x07.cpp2
-rw-r--r--src/mame/drivers/xexex.cpp16
-rw-r--r--src/mame/drivers/ympsr16.cpp143
-rw-r--r--src/mame/drivers/ympsr40.cpp64
-rw-r--r--src/mame/drivers/z1013.cpp4
-rw-r--r--src/mame/includes/20pacgal.h5
-rw-r--r--src/mame/includes/4enraya.h2
-rw-r--r--src/mame/includes/atarig42.h1
-rw-r--r--src/mame/includes/cchasm.h85
-rw-r--r--src/mame/includes/exidy.h156
-rw-r--r--src/mame/includes/funkyjet.h65
-rw-r--r--src/mame/includes/goldstar.h4
-rw-r--r--src/mame/includes/gp32.h2
-rw-r--r--src/mame/includes/hanaawas.h60
-rw-r--r--src/mame/includes/harddriv.h2
-rw-r--r--src/mame/includes/hng64.h94
-rw-r--r--src/mame/includes/kncljoe.h13
-rw-r--r--src/mame/includes/megadriv.h1
-rw-r--r--src/mame/includes/n8080.h14
-rw-r--r--src/mame/includes/namcona1.h8
-rw-r--r--src/mame/includes/namcos2.h1
-rw-r--r--src/mame/includes/pc8801.h1
-rw-r--r--src/mame/includes/pc9801.h640
-rw-r--r--src/mame/includes/pc9801_epson.h58
-rw-r--r--src/mame/includes/pc9821.h193
-rw-r--r--src/mame/includes/pc98ha.h104
-rw-r--r--src/mame/includes/redalert.h61
-rw-r--r--src/mame/includes/taito_z.h332
-rw-r--r--src/mame/includes/taxidriv.h89
-rw-r--r--src/mame/includes/toaplan1.h1
-rw-r--r--src/mame/includes/tubep.h16
-rw-r--r--src/mame/includes/twincobr.h1
-rw-r--r--src/mame/includes/xbox_nv2a.h2
-rw-r--r--src/mame/layout/ave_arb.lay203
-rw-r--r--src/mame/layout/barni.lay94
-rw-r--r--src/mame/layout/fidel_dsc.lay94
-rw-r--r--src/mame/layout/gts1.lay56
-rw-r--r--src/mame/layout/mephisto_alm32.lay18
-rw-r--r--src/mame/layout/spirit76.lay97
-rw-r--r--src/mame/layout/ti5100.lay57
-rw-r--r--src/mame/machine/6883sam.cpp6
-rw-r--r--src/mame/machine/amstrad.cpp7
-rw-r--r--src/mame/machine/apple2common.cpp2
-rw-r--r--src/mame/machine/cchasm.cpp15
-rw-r--r--src/mame/machine/electron.cpp2
-rw-r--r--src/mame/machine/gamecom.cpp2
-rw-r--r--src/mame/machine/harddriv.cpp28
-rw-r--r--src/mame/machine/jvs13551.cpp18
-rw-r--r--src/mame/machine/m1comm.cpp10
-rw-r--r--src/mame/machine/m2comm.cpp10
-rw-r--r--src/mame/machine/mbee.cpp8
-rw-r--r--src/mame/machine/megadriv.cpp14
-rw-r--r--src/mame/machine/midyunit.cpp28
-rw-r--r--src/mame/machine/mtx.cpp12
-rw-r--r--src/mame/machine/nb1413m3.cpp4
-rw-r--r--src/mame/machine/nes.cpp1
-rw-r--r--src/mame/machine/s32comm.cpp10
-rw-r--r--src/mame/machine/sorcerer.cpp4
-rw-r--r--src/mame/machine/thomson.cpp8
-rw-r--r--src/mame/machine/vtech2.cpp2
-rw-r--r--src/mame/machine/z80bin.cpp8
-rw-r--r--src/mame/mame.lst123
-rw-r--r--src/mame/mess.flt6
-rw-r--r--src/mame/video/3dom2_te.cpp47
-rw-r--r--src/mame/video/astrocde.cpp6
-rw-r--r--src/mame/video/atarig42.cpp2
-rw-r--r--src/mame/video/avgdvg.cpp18
-rw-r--r--src/mame/video/cchasm.cpp136
-rw-r--r--src/mame/video/exidy.cpp374
-rw-r--r--src/mame/video/funkyjet.cpp43
-rw-r--r--src/mame/video/gaelco3d.cpp2
-rw-r--r--src/mame/video/galastrm.cpp2
-rw-r--r--src/mame/video/gime.cpp69
-rw-r--r--src/mame/video/hanaawas.cpp108
-rw-r--r--src/mame/video/hng64.cpp2
-rw-r--r--src/mame/video/hng64_3d.hxx2
-rw-r--r--src/mame/video/k001005.cpp2
-rw-r--r--src/mame/video/k053244_k053245.cpp1
-rw-r--r--src/mame/video/k053244_k053245.h2
-rw-r--r--src/mame/video/k053246_k053247_k055673.cpp1
-rw-r--r--src/mame/video/k053246_k053247_k055673.h2
-rw-r--r--src/mame/video/kncljoe.cpp59
-rw-r--r--src/mame/video/midtunit.cpp4
-rw-r--r--src/mame/video/midvunit.cpp2
-rw-r--r--src/mame/video/midzeus.cpp4
-rw-r--r--src/mame/video/model2.cpp2
-rw-r--r--src/mame/video/model3.cpp8
-rw-r--r--src/mame/video/n64.cpp36
-rw-r--r--src/mame/video/n64types.h2
-rw-r--r--src/mame/video/n8080.cpp51
-rw-r--r--src/mame/video/namcos22.cpp4
-rw-r--r--src/mame/video/pc9801.cpp116
-rw-r--r--src/mame/video/taito_z.cpp50
-rw-r--r--src/mame/video/taxidriv.cpp136
-rw-r--r--src/mame/video/tc0780fpa.cpp33
-rw-r--r--src/mame/video/toaplan1.cpp35
-rw-r--r--src/mame/video/toaplan_scu.cpp62
-rw-r--r--src/mame/video/toaplan_scu.h15
-rw-r--r--src/mame/video/twincobr.cpp54
-rw-r--r--src/mame/video/tx0.cpp4
-rw-r--r--src/mame/video/xbox_nv2a.cpp32
-rw-r--r--src/osd/asio.h2
-rw-r--r--src/osd/modules/debugger/debuggdbstub.cpp8
-rw-r--r--src/osd/modules/debugger/debugimgui.cpp42
-rw-r--r--src/osd/modules/debugger/debugqt.cpp12
-rw-r--r--src/osd/modules/debugger/osx/memoryview.mm63
-rw-r--r--src/osd/modules/debugger/qt/memorywindow.cpp28
-rw-r--r--src/osd/modules/debugger/win/memoryviewinfo.cpp6
-rw-r--r--src/osd/modules/debugger/win/memoryviewinfo.h7
-rw-r--r--src/osd/modules/debugger/win/memorywininfo.cpp28
-rw-r--r--src/osd/modules/file/posixdir.cpp6
-rw-r--r--src/osd/modules/file/posixdomain.cpp208
-rw-r--r--src/osd/modules/file/posixfile.cpp200
-rw-r--r--src/osd/modules/file/posixfile.h18
-rw-r--r--src/osd/modules/file/posixptty.cpp57
-rw-r--r--src/osd/modules/file/posixsocket.cpp187
-rw-r--r--src/osd/modules/file/stdfile.cpp104
-rw-r--r--src/osd/modules/file/winfile.cpp176
-rw-r--r--src/osd/modules/file/winfile.h23
-rw-r--r--src/osd/modules/file/winptty.cpp44
-rw-r--r--src/osd/modules/file/winsocket.cpp130
-rw-r--r--src/osd/modules/font/font_sdl.cpp6
-rw-r--r--src/osd/modules/input/input_dinput.cpp3
-rw-r--r--src/osd/modules/input/input_dinput.h1
-rw-r--r--src/osd/modules/netdev/taptun.cpp14
-rw-r--r--src/osd/modules/render/aviwrite.cpp4
-rw-r--r--src/osd/modules/render/bgfx/chain.cpp2
-rw-r--r--src/osd/modules/render/bgfx/chainmanager.cpp9
-rw-r--r--src/osd/modules/render/bgfx/inputpair.cpp5
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc24
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc22
-rw-r--r--src/osd/modules/render/bgfx/target.cpp15
-rw-r--r--src/osd/modules/render/bgfx/target.h6
-rw-r--r--src/osd/modules/render/bgfx/targetmanager.cpp22
-rw-r--r--src/osd/modules/render/bgfx/targetreader.cpp2
-rw-r--r--src/osd/modules/render/bgfx/texture.cpp16
-rw-r--r--src/osd/modules/render/bgfx/texture.h10
-rw-r--r--src/osd/modules/render/bgfx/texturehandleprovider.h2
-rw-r--r--src/osd/modules/render/bgfx/texturemanager.cpp27
-rw-r--r--src/osd/modules/render/bgfxutil.cpp46
-rw-r--r--src/osd/modules/render/bgfxutil.h4
-rw-r--r--src/osd/modules/render/copyutil.h115
-rw-r--r--src/osd/modules/render/d3d/d3dhlsl.cpp16
-rw-r--r--src/osd/modules/render/drawbgfx.cpp29
-rw-r--r--src/osd/modules/sound/coreaudio_sound.cpp4
-rw-r--r--src/osd/modules/sound/direct_sound.cpp2
-rw-r--r--src/osd/modules/sound/pa_sound.cpp6
-rw-r--r--src/osd/modules/sound/sdl_sound.cpp4
-rw-r--r--src/osd/modules/sound/xaudio2_sound.cpp2
-rw-r--r--src/osd/osdcore.cpp24
-rw-r--r--src/osd/osdfile.h66
-rw-r--r--src/osd/strconv.h4
-rw-r--r--src/tools/castool.cpp15
-rw-r--r--src/tools/chdman.cpp267
-rw-r--r--src/tools/floptool.cpp16
-rw-r--r--src/tools/image_handler.cpp116
-rw-r--r--src/tools/image_handler.h22
-rw-r--r--src/tools/imgtool/iflopimg.cpp83
-rw-r--r--src/tools/imgtool/iflopimg.h11
-rw-r--r--src/tools/imgtool/imghd.cpp57
-rw-r--r--src/tools/imgtool/imghd.h3
-rw-r--r--src/tools/imgtool/imgtool.cpp12
-rw-r--r--src/tools/imgtool/library.h28
-rw-r--r--src/tools/imgtool/main.cpp2
-rw-r--r--src/tools/imgtool/modules/hp85_tape.cpp56
-rw-r--r--src/tools/imgtool/modules/hp9845_tape.cpp57
-rw-r--r--src/tools/imgtool/stream.cpp255
-rw-r--r--src/tools/imgtool/stream.h141
-rw-r--r--src/tools/ldresample.cpp55
-rw-r--r--src/tools/ldverify.cpp29
-rw-r--r--src/tools/pngcmp.cpp14
-rw-r--r--src/tools/regrep.cpp16
-rw-r--r--src/tools/romcmp.cpp743
-rw-r--r--src/tools/split.cpp18
-rw-r--r--src/tools/srcclean.cpp312
-rw-r--r--src/tools/unidasm.cpp14
1279 files changed, 51075 insertions, 29183 deletions
diff --git a/android-project/app/src/main/AndroidManifest.xml b/android-project/app/src/main/AndroidManifest.xml
index 1c86e915138..9c3fb9d5c21 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="234"
- android:versionName="0.234"
+ android:versionCode="235"
+ android:versionName="0.235"
android:installLocation="auto">
<!-- OpenGL ES 2.0 -->
diff --git a/android-project/app/src/main/libs/mips/.gitignore b/android-project/app/src/main/libs/mips/.gitignore
deleted file mode 100644
index 140f8cf80f2..00000000000
--- a/android-project/app/src/main/libs/mips/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.so
diff --git a/android-project/app/src/main/libs/mips64/.gitignore b/android-project/app/src/main/libs/mips64/.gitignore
deleted file mode 100644
index 140f8cf80f2..00000000000
--- a/android-project/app/src/main/libs/mips64/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.so
diff --git a/bgfx/chains/Fighters.json b/bgfx/chains/Fighters.json
index ec5aa3b83d0..e7a8f8340ff 100644
--- a/bgfx/chains/Fighters.json
+++ b/bgfx/chains/Fighters.json
@@ -1,154 +1,154 @@
{
- "name": "CRT-geom",
- "author": "cgwg",
- "sliders": [
- { "type": "float",
- "name": "aperture_strength",
- "text": "Shadow mask strength",
- "default": 0.13,
- "max" : 1.0,
- "min" : 0.0,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "phosphor_power",
- "text": "Phosphor decay power",
- "default": 1.9,
- "max" : 3.0,
- "min" : 0.5,
- "step" : 0.05,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "phosphor_amplitude",
- "text": "Phosphor persistence amplitude",
- "default": 0.04,
- "max" : 0.2,
- "min" : 0.0,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "halation",
- "text": "Halation amplitude",
- "default": 0.0,
- "max" : 0.3,
- "min" : 0.0,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "blurwidth",
- "text": "Halation blur width",
- "default": 0.0,
- "max" : 4.0,
- "min" : 0.1,
- "step" : 0.1,
- "format": "%1.1f",
- "screen": "raster" },
- { "type": "float",
- "name": "curvature",
- "text": "Enable curvature",
- "default": 0.0,
- "max" : 1.0,
- "min" : 0.0,
- "step" : 1.0,
- "format": "%1.0f",
- "screen": "raster" },
- { "type": "float",
- "name": "R",
- "text": "Radius of curvature",
- "default": 3.5,
- "max" : 10.0,
- "min" : 0.5,
- "step" : 0.1,
- "format": "%1.1f",
- "screen": "raster" },
- { "type": "float",
- "name": "d",
- "text": "Distance to screen",
- "default": 2.0,
- "max" : 10.0,
- "min" : 0.1,
- "step" : 0.1,
- "format": "%1.1f",
- "screen": "raster" },
- { "type": "vec2",
- "name": "angle",
- "text": "Tilt ",
- "default": [ 0.0,-0.05 ],
- "max" : [ 1.0, 1.0 ],
- "min" : [-1.0,-1.0 ],
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "cornersize",
- "text": "Rounded corner size",
- "default": 0.00,
- "max" : 0.10,
- "min" : 0.00,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "cornersmooth",
- "text": "Border smoothness",
- "default": 1000,
- "max" : 2000,
- "min" : 100,
- "step" : 100,
- "format": "%1.0f",
- "screen": "raster" },
- { "type": "vec2",
- "name": "overscan",
- "text": "Overscan ",
- "default": [ 1.0, 1.0 ],
- "max" : [ 1.2, 1.2 ],
- "min" : [ 0.8, 0.8 ],
- "step" : 0.02,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "CRTgamma",
- "text": "Gamma of simulated CRT",
- "default": 2.4,
- "max" : 4.0,
- "min" : 0.7,
- "step" : 0.05,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "monitorgamma",
- "text": "Gamma of output display",
- "default": 2.2,
- "max" : 4.0,
- "min" : 0.7,
- "step" : 0.05,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "vec2",
- "name": "aspect",
- "text": "Aspect ratio ",
- "default": [ 1.0, 0.75 ],
- "max" : [ 1.0, 1.0 ],
- "min" : [ 0.3, 0.3 ],
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" }
- ],
+ "name": "CRT-geom",
+ "author": "cgwg",
+ "sliders": [
+ { "type": "float",
+ "name": "aperture_strength",
+ "text": "Shadow mask strength",
+ "default": 0.13,
+ "max" : 1.0,
+ "min" : 0.0,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "phosphor_power",
+ "text": "Phosphor decay power",
+ "default": 1.9,
+ "max" : 3.0,
+ "min" : 0.5,
+ "step" : 0.05,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "phosphor_amplitude",
+ "text": "Phosphor persistence amplitude",
+ "default": 0.04,
+ "max" : 0.2,
+ "min" : 0.0,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "halation",
+ "text": "Halation amplitude",
+ "default": 0.0,
+ "max" : 0.3,
+ "min" : 0.0,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "blurwidth",
+ "text": "Halation blur width",
+ "default": 0.0,
+ "max" : 4.0,
+ "min" : 0.1,
+ "step" : 0.1,
+ "format": "%1.1f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "curvature",
+ "text": "Enable curvature",
+ "default": 0.0,
+ "max" : 1.0,
+ "min" : 0.0,
+ "step" : 1.0,
+ "format": "%1.0f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "R",
+ "text": "Radius of curvature",
+ "default": 3.5,
+ "max" : 10.0,
+ "min" : 0.5,
+ "step" : 0.1,
+ "format": "%1.1f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "d",
+ "text": "Distance to screen",
+ "default": 2.0,
+ "max" : 10.0,
+ "min" : 0.1,
+ "step" : 0.1,
+ "format": "%1.1f",
+ "screen": "raster" },
+ { "type": "vec2",
+ "name": "angle",
+ "text": "Tilt ",
+ "default": [ 0.0,-0.05 ],
+ "max" : [ 1.0, 1.0 ],
+ "min" : [-1.0,-1.0 ],
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "cornersize",
+ "text": "Rounded corner size",
+ "default": 0.00,
+ "max" : 0.10,
+ "min" : 0.00,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "cornersmooth",
+ "text": "Border smoothness",
+ "default": 1000,
+ "max" : 2000,
+ "min" : 100,
+ "step" : 100,
+ "format": "%1.0f",
+ "screen": "raster" },
+ { "type": "vec2",
+ "name": "overscan",
+ "text": "Overscan ",
+ "default": [ 1.0, 1.0 ],
+ "max" : [ 1.2, 1.2 ],
+ "min" : [ 0.8, 0.8 ],
+ "step" : 0.02,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "CRTgamma",
+ "text": "Gamma of simulated CRT",
+ "default": 2.4,
+ "max" : 4.0,
+ "min" : 0.7,
+ "step" : 0.05,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "monitorgamma",
+ "text": "Gamma of output display",
+ "default": 2.2,
+ "max" : 4.0,
+ "min" : 0.7,
+ "step" : 0.05,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "vec2",
+ "name": "aspect",
+ "text": "Aspect ratio ",
+ "default": [ 1.0, 0.75 ],
+ "max" : [ 1.0, 1.0 ],
+ "min" : [ 0.3, 0.3 ],
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" }
+ ],
"targets": [
- { "name": "internal1",
+ { "name": "internal1",
"mode": "guest"
},
- { "name": "internal2",
+ { "name": "internal2",
"mode": "guest"
},
- { "name": "blur",
+ { "name": "blur",
"mode": "guest"
},
- { "name": "phosphor",
+ { "name": "phosphor",
"mode": "guest"
}
@@ -158,13 +158,13 @@
"effect": "crt-geom/phosphor_apply",
"name": "phosphor apply",
"uniforms": [
- { "uniform": "u_phosphor_power", "slider": "phosphor_power" },
- { "uniform": "u_phosphor_amplitude","slider": "phosphor_amplitude" },
- { "uniform": "u_gamma", "slider": "CRTgamma" }
+ { "uniform": "u_phosphor_power", "slider": "phosphor_power" },
+ { "uniform": "u_phosphor_amplitude","slider": "phosphor_amplitude" },
+ { "uniform": "u_gamma", "slider": "CRTgamma" }
],
"input": [
- { "sampler": "s_screen", "target": "screen" },
- { "sampler": "s_phosphor", "target": "phosphor" }
+ { "sampler": "s_screen", "target": "screen" },
+ { "sampler": "s_phosphor", "target": "phosphor" }
],
"output": "internal1"
},
@@ -172,13 +172,13 @@
"effect": "crt-geom/phosphor_update",
"name": "phosphor update",
"uniforms": [
- { "uniform": "u_phosphor_power", "slider": "phosphor_power" },
- { "uniform": "u_phosphor_amplitude","slider": "phosphor_amplitude" },
- { "uniform": "u_gamma", "slider": "CRTgamma" }
+ { "uniform": "u_phosphor_power", "slider": "phosphor_power" },
+ { "uniform": "u_phosphor_amplitude","slider": "phosphor_amplitude" },
+ { "uniform": "u_gamma", "slider": "CRTgamma" }
],
"input": [
- { "sampler": "s_screen", "target": "screen" },
- { "sampler": "s_phosphor", "target": "phosphor" }
+ { "sampler": "s_screen", "target": "screen" },
+ { "sampler": "s_phosphor", "target": "phosphor" }
],
"output": "phosphor"
},
@@ -186,12 +186,12 @@
"effect": "crt-geom/gaussx",
"name": "Gaussian blur x",
"uniforms": [
- { "uniform": "u_width", "slider": "blurwidth" },
- { "uniform": "u_aspect","slider": "aspect" },
- { "uniform": "u_gamma", "slider": "CRTgamma" }
+ { "uniform": "u_width", "slider": "blurwidth" },
+ { "uniform": "u_aspect","slider": "aspect" },
+ { "uniform": "u_gamma", "slider": "CRTgamma" }
],
"input": [
- { "sampler": "s_tex", "target": "internal1" }
+ { "sampler": "s_tex", "target": "internal1" }
],
"output": "internal2"
},
@@ -199,12 +199,12 @@
"effect": "crt-geom/gaussy",
"name": "Gaussian blur y",
"uniforms": [
- { "uniform": "u_width", "slider": "blurwidth" },
- { "uniform": "u_aspect","slider": "aspect" },
- { "uniform": "u_gamma", "slider": "CRTgamma" }
+ { "uniform": "u_width", "slider": "blurwidth" },
+ { "uniform": "u_aspect","slider": "aspect" },
+ { "uniform": "u_gamma", "slider": "CRTgamma" }
],
"input": [
- { "sampler": "s_tex", "target": "internal2" }
+ { "sampler": "s_tex", "target": "internal2" }
],
"output": "blur"
},
@@ -212,24 +212,24 @@
"effect": "crt-geom/crt-geom-deluxe",
"name": "CRT",
"uniforms": [
- { "uniform": "curvature", "slider": "curvature" },
- { "uniform": "R", "slider": "R" },
- { "uniform": "d", "slider": "d" },
- { "uniform": "angle", "slider": "angle" },
- { "uniform": "cornersize", "slider": "cornersize" },
- { "uniform": "cornersmooth","slider": "cornersmooth" },
- { "uniform": "overscan", "slider": "overscan" },
- { "uniform": "aspect", "slider": "aspect" },
- { "uniform": "CRTgamma", "slider": "CRTgamma" },
- { "uniform": "monitorgamma","slider": "monitorgamma" },
- { "uniform": "aperture_strength","slider": "aperture_strength" },
- { "uniform": "halation", "slider": "halation" }
+ { "uniform": "curvature", "slider": "curvature" },
+ { "uniform": "R", "slider": "R" },
+ { "uniform": "d", "slider": "d" },
+ { "uniform": "angle", "slider": "angle" },
+ { "uniform": "cornersize", "slider": "cornersize" },
+ { "uniform": "cornersmooth","slider": "cornersmooth" },
+ { "uniform": "overscan", "slider": "overscan" },
+ { "uniform": "aspect", "slider": "aspect" },
+ { "uniform": "CRTgamma", "slider": "CRTgamma" },
+ { "uniform": "monitorgamma","slider": "monitorgamma" },
+ { "uniform": "aperture_strength","slider": "aperture_strength" },
+ { "uniform": "halation", "slider": "halation" }
],
-
+
"input": [
- { "sampler": "mpass_texture", "target": "internal1" },
- { "sampler": "mask_texture", "texture": "bgfx/chains/crt-geom/aperture_2_4_rgb.png", "selection": "Shadow mask" },
- { "sampler": "blur_texture", "target": "blur" }
+ { "sampler": "mpass_texture", "target": "internal1" },
+ { "sampler": "mask_texture", "texture": "bgfx/chains/crt-geom/aperture_2_4_rgb.png", "selection": "Shadow mask" },
+ { "sampler": "blur_texture", "target": "blur" }
],
"output": "output"
diff --git a/bgfx/chains/crt-geom-deluxe.json b/bgfx/chains/crt-geom-deluxe.json
index eb29ba0b538..5e20b5f8aa4 100644
--- a/bgfx/chains/crt-geom-deluxe.json
+++ b/bgfx/chains/crt-geom-deluxe.json
@@ -1,364 +1,364 @@
{
- "name": "CRT-geom",
- "author": "cgwg",
- "sliders": [
- { "type": "float",
- "name": "aperture_strength",
- "text": "Shadow mask strength",
- "default": 0.4,
- "max" : 1.0,
- "min" : 0.0,
- "step" : 0.05,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "aperture_brightboost",
- "text": "Shadow mask brightness boost",
- "default": 0.4,
- "max" : 1.0,
- "min" : 0.0,
- "step" : 0.05,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "spot_size",
- "text": "Spot size minimum",
- "default": 0.3,
- "max" : 0.5,
- "min" : 0.1,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "spot_growth",
- "text": "Spot size dilation",
- "default": 0.1,
- "max" : 0.4,
- "min" : 0.0,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "spot_growth_power",
- "text": "Spot dilation onset power",
- "default": 3.0,
- "max" : 4.0,
- "min" : 0.2,
- "step" : 0.1,
- "format": "%1.1f",
- "screen": "raster" },
- { "type": "float",
- "name": "lowpass_cutoff",
- "text": "Lowpass cutoff pixels/scanline",
- "default":1000.0,
- "max" :1000.0,
- "min" : 100.0,
- "step" : 10.0,
- "format": "%1.0f",
- "screen": "raster" },
- { "type": "float",
- "name": "lowpass_width",
- "text": "Lowpass width",
- "default": 80.0,
- "max" : 300.0,
- "min" : 0.0,
- "step" : 10.0,
- "format": "%1.0f",
- "screen": "raster" },
- { "type": "intenum",
- "name": "x_interpolation",
- "text": "Horizontal interpolation",
- "default": 2,
- "max" : 5,
- "min" : 0,
- "step" : 1,
- "format": "%s",
- "strings": [ "box", "linear", "Lanczos", "Catmull-Rom", "Mitchell-Netravali", "B-spline" ],
- "screen": "raster" },
- { "type": "float",
- "name": "phosphor_power",
- "text": "Phosphor decay power",
- "default": 1.2,
- "max" : 3.0,
- "min" : 0.5,
- "step" : 0.05,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "phosphor_cutoff",
- "text": "Phosphor decay cutoff frames",
- "default": 300.0,
- "max" : 1000.0,
- "min" : 10.0,
- "step" : 10.0,
- "format": "%1.0f",
- "screen": "raster" },
- { "type": "float",
- "name": "phosphor_amplitude",
- "text": "Phosphor persistence amplitude",
- "default": 0.04,
- "max" : 0.2,
- "min" : 0.0,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "rasterbloom_smooth",
- "text": "Raster bloom temporal smoothing",
- "default": 0.5,
- "max" : 0.99,
- "min" : 0.0,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "rasterbloom",
- "text": "Raster bloom amplitude",
- "default": 0.01,
- "max" : 0.1,
- "min" : 0.0,
- "step" : 0.001,
- "format": "%1.3f",
- "screen": "raster" },
- { "type": "float",
- "name": "halation",
- "text": "Halation amplitude",
- "default": 0.1,
- "max" : 0.3,
- "min" : 0.0,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "blurwidth",
- "text": "Halation blur width",
- "default": 2.0,
- "max" : 4.0,
- "min" : 0.1,
- "step" : 0.1,
- "format": "%1.1f",
- "screen": "raster" },
- { "type": "float",
- "name": "curvature",
- "text": "Enable curvature",
- "default": 1.0,
- "max" : 1.0,
- "min" : 0.0,
- "step" : 1.0,
- "format": "%1.0f",
- "screen": "raster" },
- { "type": "float",
- "name": "R",
- "text": "Radius of curvature",
- "default": 3.5,
- "max" : 10.0,
- "min" : 0.5,
- "step" : 0.1,
- "format": "%1.1f",
- "screen": "raster" },
- { "type": "float",
- "name": "d",
- "text": "Distance to screen",
- "default": 2.0,
- "max" : 10.0,
- "min" : 0.1,
- "step" : 0.1,
- "format": "%1.1f",
- "screen": "raster" },
- { "type": "vec2",
- "name": "angle",
- "text": "Tilt ",
- "default": [ 0.0, 0.0 ],
- "max" : [ 1.0, 1.0 ],
- "min" : [-1.0,-1.0 ],
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "cornersize",
- "text": "Rounded corner size",
- "default": 0.01,
- "max" : 0.10,
- "min" : 0.00,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "cornersmooth",
- "text": "Border smoothness",
- "default": 1000,
- "max" : 2000,
- "min" : 100,
- "step" : 100,
- "format": "%1.0f",
- "screen": "raster" },
- { "type": "vec2",
- "name": "overscan",
- "text": "Overscan ",
- "default": [ 1.0, 1.0 ],
- "max" : [ 1.2, 1.2 ],
- "min" : [ 0.8, 0.8 ],
- "step" : 0.02,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "CRTgamma",
- "text": "Gamma of simulated CRT",
- "default": 2.4,
- "max" : 4.0,
- "min" : 0.7,
- "step" : 0.05,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "monitorgamma",
- "text": "Gamma of output display",
- "default": 2.2,
- "max" : 4.0,
- "min" : 0.7,
- "step" : 0.05,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "vec2",
- "name": "aspect",
- "text": "Aspect ratio ",
- "default": [ 1.0, 0.75 ],
- "max" : [ 1.0, 1.0 ],
- "min" : [ 0.3, 0.3 ],
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" }
- ],
- "targets": [
- { "name": "internal1",
- "mode": "guest"
- },
- { "name": "internal2",
- "mode": "guest"
- },
- { "name": "mipmap",
- "mode": "guest"
- },
- { "name": "blur",
- "mode": "guest"
- },
- { "name": "phosphor",
- "mode": "guest"
- }
- ],
- "passes": [
- {
- "effect": "crt-geom/lowpass",
- "name": "lowpass",
- "uniforms": [
- { "uniform": "u_lowpass_cutoff", "slider": "lowpass_cutoff" },
- { "uniform": "u_lowpass_width", "slider": "lowpass_width" }
- ],
- "input": [
- { "sampler": "s_screen", "target": "screen" }
- ],
- "output": "internal2"
- },
- {
- "effect": "crt-geom/mipmap8",
- "name": "mipmap",
- "uniforms": [
- { "uniform": "u_smooth", "slider": "rasterbloom_smooth" }
- ],
- "input": [
- { "sampler": "s_screen", "target": "internal2" },
- { "sampler": "s_mipmap", "target": "mipmap" }
- ],
- "output": "mipmap"
- },
- {
- "effect": "crt-geom/phosphor_apply",
- "applytint": true,
- "name": "phosphor apply",
- "uniforms": [
- { "uniform": "u_phosphor_power", "slider": "phosphor_power" },
- { "uniform": "u_phosphor_amplitude","slider": "phosphor_amplitude" },
- { "uniform": "u_phosphor_cutoff", "slider": "phosphor_cutoff" },
- { "uniform": "u_gamma", "slider": "CRTgamma" }
- ],
- "input": [
- { "sampler": "s_screen", "target": "internal2" },
- { "sampler": "s_phosphor", "target": "phosphor" }
- ],
- "output": "internal1"
- },
- {
- "effect": "crt-geom/phosphor_update",
- "name": "phosphor update",
- "uniforms": [
- { "uniform": "u_phosphor_power", "slider": "phosphor_power" },
- { "uniform": "u_phosphor_amplitude","slider": "phosphor_amplitude" },
- { "uniform": "u_phosphor_cutoff", "slider": "phosphor_cutoff" },
- { "uniform": "u_gamma", "slider": "CRTgamma" }
- ],
- "input": [
- { "sampler": "s_screen", "target": "internal2" },
- { "sampler": "s_phosphor", "target": "phosphor" }
- ],
- "output": "phosphor"
- },
- {
- "effect": "crt-geom/gaussx",
- "name": "Gaussian blur x",
- "uniforms": [
- { "uniform": "u_width", "slider": "blurwidth" },
- { "uniform": "u_aspect","slider": "aspect" },
- { "uniform": "u_gamma", "slider": "CRTgamma" }
- ],
- "input": [
- { "sampler": "s_tex", "target": "internal1" }
- ],
- "output": "internal2"
- },
- {
- "effect": "crt-geom/gaussy",
- "name": "Gaussian blur y",
- "uniforms": [
- { "uniform": "u_width", "slider": "blurwidth" },
- { "uniform": "u_aspect","slider": "aspect" },
- { "uniform": "u_gamma", "slider": "CRTgamma" }
- ],
- "input": [
- { "sampler": "s_tex", "target": "internal2" }
- ],
- "output": "blur"
- },
- {
- "effect": "crt-geom/crt-geom-deluxe",
- "name": "CRT",
- "uniforms": [
- { "uniform": "curvature", "slider": "curvature" },
- { "uniform": "R", "slider": "R" },
- { "uniform": "d", "slider": "d" },
- { "uniform": "angle", "slider": "angle" },
- { "uniform": "cornersize", "slider": "cornersize" },
- { "uniform": "cornersmooth","slider": "cornersmooth" },
- { "uniform": "overscan", "slider": "overscan" },
- { "uniform": "aspect", "slider": "aspect" },
- { "uniform": "CRTgamma", "slider": "CRTgamma" },
- { "uniform": "monitorgamma","slider": "monitorgamma" },
- { "uniform": "aperture_strength","slider": "aperture_strength" },
- { "uniform": "aperture_brightboost","slider": "aperture_brightboost" },
- { "uniform": "spot_size", "slider": "spot_size" },
- { "uniform": "spot_growth", "slider": "spot_growth" },
- { "uniform": "spot_growth_power", "slider": "spot_growth_power" },
- { "uniform": "u_interp", "slider": "x_interpolation" },
- { "uniform": "halation", "slider": "halation" },
- { "uniform": "blurwidth", "slider": "blurwidth" },
- { "uniform": "rasterbloom", "slider": "rasterbloom" }
- ],
- "input": [
- { "sampler": "mpass_texture", "target": "internal1" },
- { "sampler": "mask_texture", "texture": "bgfx/chains/crt-geom/aperture_1_2_bgr.png", "selection": "Shadow mask" },
- { "sampler": "blur_texture", "target": "blur" },
- { "sampler": "mipmap_texture", "target": "mipmap" }
- ],
- "output": "output"
- }
- ]
+ "name": "CRT-geom",
+ "author": "cgwg",
+ "sliders": [
+ { "type": "float",
+ "name": "aperture_strength",
+ "text": "Shadow mask strength",
+ "default": 0.4,
+ "max" : 1.0,
+ "min" : 0.0,
+ "step" : 0.05,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "aperture_brightboost",
+ "text": "Shadow mask brightness boost",
+ "default": 0.4,
+ "max" : 1.0,
+ "min" : 0.0,
+ "step" : 0.05,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "spot_size",
+ "text": "Spot size minimum",
+ "default": 0.3,
+ "max" : 0.5,
+ "min" : 0.1,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "spot_growth",
+ "text": "Spot size dilation",
+ "default": 0.1,
+ "max" : 0.4,
+ "min" : 0.0,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "spot_growth_power",
+ "text": "Spot dilation onset power",
+ "default": 3.0,
+ "max" : 4.0,
+ "min" : 0.2,
+ "step" : 0.1,
+ "format": "%1.1f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "lowpass_cutoff",
+ "text": "Lowpass cutoff pixels/scanline",
+ "default":1000.0,
+ "max" :1000.0,
+ "min" : 100.0,
+ "step" : 10.0,
+ "format": "%1.0f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "lowpass_width",
+ "text": "Lowpass width",
+ "default": 80.0,
+ "max" : 300.0,
+ "min" : 0.0,
+ "step" : 10.0,
+ "format": "%1.0f",
+ "screen": "raster" },
+ { "type": "intenum",
+ "name": "x_interpolation",
+ "text": "Horizontal interpolation",
+ "default": 2,
+ "max" : 5,
+ "min" : 0,
+ "step" : 1,
+ "format": "%s",
+ "strings": [ "box", "linear", "Lanczos", "Catmull-Rom", "Mitchell-Netravali", "B-spline" ],
+ "screen": "raster" },
+ { "type": "float",
+ "name": "phosphor_power",
+ "text": "Phosphor decay power",
+ "default": 1.2,
+ "max" : 3.0,
+ "min" : 0.5,
+ "step" : 0.05,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "phosphor_cutoff",
+ "text": "Phosphor decay cutoff frames",
+ "default": 300.0,
+ "max" : 1000.0,
+ "min" : 10.0,
+ "step" : 10.0,
+ "format": "%1.0f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "phosphor_amplitude",
+ "text": "Phosphor persistence amplitude",
+ "default": 0.04,
+ "max" : 0.2,
+ "min" : 0.0,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "rasterbloom_smooth",
+ "text": "Raster bloom temporal smoothing",
+ "default": 0.5,
+ "max" : 0.99,
+ "min" : 0.0,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "rasterbloom",
+ "text": "Raster bloom amplitude",
+ "default": 0.01,
+ "max" : 0.1,
+ "min" : 0.0,
+ "step" : 0.001,
+ "format": "%1.3f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "halation",
+ "text": "Halation amplitude",
+ "default": 0.1,
+ "max" : 0.3,
+ "min" : 0.0,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "blurwidth",
+ "text": "Halation blur width",
+ "default": 2.0,
+ "max" : 4.0,
+ "min" : 0.1,
+ "step" : 0.1,
+ "format": "%1.1f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "curvature",
+ "text": "Enable curvature",
+ "default": 1.0,
+ "max" : 1.0,
+ "min" : 0.0,
+ "step" : 1.0,
+ "format": "%1.0f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "R",
+ "text": "Radius of curvature",
+ "default": 3.5,
+ "max" : 10.0,
+ "min" : 0.5,
+ "step" : 0.1,
+ "format": "%1.1f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "d",
+ "text": "Distance to screen",
+ "default": 2.0,
+ "max" : 10.0,
+ "min" : 0.1,
+ "step" : 0.1,
+ "format": "%1.1f",
+ "screen": "raster" },
+ { "type": "vec2",
+ "name": "angle",
+ "text": "Tilt ",
+ "default": [ 0.0, 0.0 ],
+ "max" : [ 1.0, 1.0 ],
+ "min" : [-1.0,-1.0 ],
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "cornersize",
+ "text": "Rounded corner size",
+ "default": 0.01,
+ "max" : 0.10,
+ "min" : 0.00,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "cornersmooth",
+ "text": "Border smoothness",
+ "default": 1000,
+ "max" : 2000,
+ "min" : 100,
+ "step" : 100,
+ "format": "%1.0f",
+ "screen": "raster" },
+ { "type": "vec2",
+ "name": "overscan",
+ "text": "Overscan ",
+ "default": [ 1.0, 1.0 ],
+ "max" : [ 1.2, 1.2 ],
+ "min" : [ 0.8, 0.8 ],
+ "step" : 0.02,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "CRTgamma",
+ "text": "Gamma of simulated CRT",
+ "default": 2.4,
+ "max" : 4.0,
+ "min" : 0.7,
+ "step" : 0.05,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "monitorgamma",
+ "text": "Gamma of output display",
+ "default": 2.2,
+ "max" : 4.0,
+ "min" : 0.7,
+ "step" : 0.05,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "vec2",
+ "name": "aspect",
+ "text": "Aspect ratio ",
+ "default": [ 1.0, 0.75 ],
+ "max" : [ 1.0, 1.0 ],
+ "min" : [ 0.3, 0.3 ],
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" }
+ ],
+ "targets": [
+ { "name": "internal1",
+ "mode": "guest"
+ },
+ { "name": "internal2",
+ "mode": "guest"
+ },
+ { "name": "mipmap",
+ "mode": "guest"
+ },
+ { "name": "blur",
+ "mode": "guest"
+ },
+ { "name": "phosphor",
+ "mode": "guest"
+ }
+ ],
+ "passes": [
+ {
+ "effect": "crt-geom/lowpass",
+ "name": "lowpass",
+ "uniforms": [
+ { "uniform": "u_lowpass_cutoff", "slider": "lowpass_cutoff" },
+ { "uniform": "u_lowpass_width", "slider": "lowpass_width" }
+ ],
+ "input": [
+ { "sampler": "s_screen", "target": "screen" }
+ ],
+ "output": "internal2"
+ },
+ {
+ "effect": "crt-geom/mipmap8",
+ "name": "mipmap",
+ "uniforms": [
+ { "uniform": "u_smooth", "slider": "rasterbloom_smooth" }
+ ],
+ "input": [
+ { "sampler": "s_screen", "target": "internal2" },
+ { "sampler": "s_mipmap", "target": "mipmap" }
+ ],
+ "output": "mipmap"
+ },
+ {
+ "effect": "crt-geom/phosphor_apply",
+ "applytint": true,
+ "name": "phosphor apply",
+ "uniforms": [
+ { "uniform": "u_phosphor_power", "slider": "phosphor_power" },
+ { "uniform": "u_phosphor_amplitude","slider": "phosphor_amplitude" },
+ { "uniform": "u_phosphor_cutoff", "slider": "phosphor_cutoff" },
+ { "uniform": "u_gamma", "slider": "CRTgamma" }
+ ],
+ "input": [
+ { "sampler": "s_screen", "target": "internal2" },
+ { "sampler": "s_phosphor", "target": "phosphor" }
+ ],
+ "output": "internal1"
+ },
+ {
+ "effect": "crt-geom/phosphor_update",
+ "name": "phosphor update",
+ "uniforms": [
+ { "uniform": "u_phosphor_power", "slider": "phosphor_power" },
+ { "uniform": "u_phosphor_amplitude","slider": "phosphor_amplitude" },
+ { "uniform": "u_phosphor_cutoff", "slider": "phosphor_cutoff" },
+ { "uniform": "u_gamma", "slider": "CRTgamma" }
+ ],
+ "input": [
+ { "sampler": "s_screen", "target": "internal2" },
+ { "sampler": "s_phosphor", "target": "phosphor" }
+ ],
+ "output": "phosphor"
+ },
+ {
+ "effect": "crt-geom/gaussx",
+ "name": "Gaussian blur x",
+ "uniforms": [
+ { "uniform": "u_width", "slider": "blurwidth" },
+ { "uniform": "u_aspect","slider": "aspect" },
+ { "uniform": "u_gamma", "slider": "CRTgamma" }
+ ],
+ "input": [
+ { "sampler": "s_tex", "target": "internal1" }
+ ],
+ "output": "internal2"
+ },
+ {
+ "effect": "crt-geom/gaussy",
+ "name": "Gaussian blur y",
+ "uniforms": [
+ { "uniform": "u_width", "slider": "blurwidth" },
+ { "uniform": "u_aspect","slider": "aspect" },
+ { "uniform": "u_gamma", "slider": "CRTgamma" }
+ ],
+ "input": [
+ { "sampler": "s_tex", "target": "internal2" }
+ ],
+ "output": "blur"
+ },
+ {
+ "effect": "crt-geom/crt-geom-deluxe",
+ "name": "CRT",
+ "uniforms": [
+ { "uniform": "curvature", "slider": "curvature" },
+ { "uniform": "R", "slider": "R" },
+ { "uniform": "d", "slider": "d" },
+ { "uniform": "angle", "slider": "angle" },
+ { "uniform": "cornersize", "slider": "cornersize" },
+ { "uniform": "cornersmooth","slider": "cornersmooth" },
+ { "uniform": "overscan", "slider": "overscan" },
+ { "uniform": "aspect", "slider": "aspect" },
+ { "uniform": "CRTgamma", "slider": "CRTgamma" },
+ { "uniform": "monitorgamma","slider": "monitorgamma" },
+ { "uniform": "aperture_strength","slider": "aperture_strength" },
+ { "uniform": "aperture_brightboost","slider": "aperture_brightboost" },
+ { "uniform": "spot_size", "slider": "spot_size" },
+ { "uniform": "spot_growth", "slider": "spot_growth" },
+ { "uniform": "spot_growth_power", "slider": "spot_growth_power" },
+ { "uniform": "u_interp", "slider": "x_interpolation" },
+ { "uniform": "halation", "slider": "halation" },
+ { "uniform": "blurwidth", "slider": "blurwidth" },
+ { "uniform": "rasterbloom", "slider": "rasterbloom" }
+ ],
+ "input": [
+ { "sampler": "mpass_texture", "target": "internal1" },
+ { "sampler": "mask_texture", "texture": "bgfx/chains/crt-geom/aperture_1_2_bgr.png", "selection": "Shadow mask" },
+ { "sampler": "blur_texture", "target": "blur" },
+ { "sampler": "mipmap_texture", "target": "mipmap" }
+ ],
+ "output": "output"
+ }
+ ]
}
diff --git a/bgfx/chains/crt-geom.json b/bgfx/chains/crt-geom.json
index fae003f5c9c..f34d059800d 100644
--- a/bgfx/chains/crt-geom.json
+++ b/bgfx/chains/crt-geom.json
@@ -1,183 +1,183 @@
{
- "name": "CRT-geom",
- "author": "cgwg",
- "sliders": [
- { "type": "float",
- "name": "aperture_strength",
- "text": "Shadow mask strength",
- "default": 0.4,
- "max" : 1.0,
- "min" : 0.0,
- "step" : 0.05,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "aperture_brightboost",
- "text": "Shadow mask brightness boost",
- "default": 0.4,
- "max" : 1.0,
- "min" : 0.0,
- "step" : 0.05,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "spot_size",
- "text": "Spot size minimum",
- "default": 0.3,
- "max" : 0.5,
- "min" : 0.1,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "spot_growth",
- "text": "Spot size dilation",
- "default": 0.1,
- "max" : 0.4,
- "min" : 0.0,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "spot_growth_power",
- "text": "Spot dilation onset power",
- "default": 3.0,
- "max" : 4.0,
- "min" : 0.2,
- "step" : 0.1,
- "format": "%1.1f",
- "screen": "raster" },
- { "type": "intenum",
- "name": "x_interpolation",
- "text": "Horizontal interpolation",
- "default": 2,
- "max" : 5,
- "min" : 0,
- "step" : 1,
- "format": "%s",
- "strings": [ "box", "linear", "Lanczos", "Catmull-Rom", "Mitchell-Netravali", "B-spline" ],
- "screen": "raster" },
- { "type": "float",
- "name": "curvature",
- "text": "Enable curvature",
- "default": 1.0,
- "max" : 1.0,
- "min" : 0.0,
- "step" : 1.0,
- "format": "%1.0f",
- "screen": "raster" },
- { "type": "float",
- "name": "R",
- "text": "Radius of curvature",
- "default": 3.5,
- "max" : 10.0,
- "min" : 0.5,
- "step" : 0.1,
- "format": "%1.1f",
- "screen": "raster" },
- { "type": "float",
- "name": "d",
- "text": "Distance to screen",
- "default": 2.0,
- "max" : 10.0,
- "min" : 0.1,
- "step" : 0.1,
- "format": "%1.1f",
- "screen": "raster" },
- { "type": "vec2",
- "name": "angle",
- "text": "Tilt ",
- "default": [ 0.0, 0.0 ],
- "max" : [ 1.0, 1.0 ],
- "min" : [-1.0,-1.0 ],
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "cornersize",
- "text": "Rounded corner size",
- "default": 0.01,
- "max" : 0.10,
- "min" : 0.00,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "cornersmooth",
- "text": "Border smoothness",
- "default": 1000,
- "max" : 2000,
- "min" : 100,
- "step" : 100,
- "format": "%1.0f",
- "screen": "raster" },
- { "type": "vec2",
- "name": "overscan",
- "text": "Overscan ",
- "default": [ 1.0, 1.0 ],
- "max" : [ 1.2, 1.2 ],
- "min" : [ 0.8, 0.8 ],
- "step" : 0.02,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "CRTgamma",
- "text": "Gamma of simulated CRT",
- "default": 2.4,
- "max" : 4.0,
- "min" : 0.7,
- "step" : 0.05,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "monitorgamma",
- "text": "Gamma of output display",
- "default": 2.2,
- "max" : 4.0,
- "min" : 0.7,
- "step" : 0.05,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "vec2",
- "name": "aspect",
- "text": "Aspect ratio ",
- "default": [ 1.0, 0.75 ],
- "max" : [ 1.0, 1.0 ],
- "min" : [ 0.3, 0.3 ],
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "raster" }
- ],
- "targets": [
- ],
- "passes": [
- {
- "effect": "crt-geom/crt-geom",
- "applytint": true,
- "name": "CRT",
- "uniforms": [
- { "uniform": "curvature", "slider": "curvature" },
- { "uniform": "R", "slider": "R" },
- { "uniform": "d", "slider": "d" },
- { "uniform": "angle", "slider": "angle" },
- { "uniform": "cornersize", "slider": "cornersize" },
- { "uniform": "cornersmooth","slider": "cornersmooth" },
- { "uniform": "overscan", "slider": "overscan" },
- { "uniform": "aspect", "slider": "aspect" },
- { "uniform": "CRTgamma", "slider": "CRTgamma" },
- { "uniform": "monitorgamma","slider": "monitorgamma" },
- { "uniform": "aperture_strength", "slider": "aperture_strength" },
- { "uniform": "aperture_brightboost","slider": "aperture_brightboost" },
- { "uniform": "spot_size", "slider": "spot_size" },
- { "uniform": "spot_growth", "slider": "spot_growth" },
- { "uniform": "spot_growth_power", "slider": "spot_growth_power" },
- { "uniform": "u_interp", "slider": "x_interpolation" }
- ],
- "input": [
- { "sampler": "mpass_texture", "target": "screen" },
- { "sampler": "mask_texture", "texture": "bgfx/chains/crt-geom/aperture_1_2_bgr.png", "selection": "Shadow mask" }
- ],
- "output": "output"
- }
- ]
+ "name": "CRT-geom",
+ "author": "cgwg",
+ "sliders": [
+ { "type": "float",
+ "name": "aperture_strength",
+ "text": "Shadow mask strength",
+ "default": 0.4,
+ "max" : 1.0,
+ "min" : 0.0,
+ "step" : 0.05,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "aperture_brightboost",
+ "text": "Shadow mask brightness boost",
+ "default": 0.4,
+ "max" : 1.0,
+ "min" : 0.0,
+ "step" : 0.05,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "spot_size",
+ "text": "Spot size minimum",
+ "default": 0.3,
+ "max" : 0.5,
+ "min" : 0.1,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "spot_growth",
+ "text": "Spot size dilation",
+ "default": 0.1,
+ "max" : 0.4,
+ "min" : 0.0,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "spot_growth_power",
+ "text": "Spot dilation onset power",
+ "default": 3.0,
+ "max" : 4.0,
+ "min" : 0.2,
+ "step" : 0.1,
+ "format": "%1.1f",
+ "screen": "raster" },
+ { "type": "intenum",
+ "name": "x_interpolation",
+ "text": "Horizontal interpolation",
+ "default": 2,
+ "max" : 5,
+ "min" : 0,
+ "step" : 1,
+ "format": "%s",
+ "strings": [ "box", "linear", "Lanczos", "Catmull-Rom", "Mitchell-Netravali", "B-spline" ],
+ "screen": "raster" },
+ { "type": "float",
+ "name": "curvature",
+ "text": "Enable curvature",
+ "default": 1.0,
+ "max" : 1.0,
+ "min" : 0.0,
+ "step" : 1.0,
+ "format": "%1.0f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "R",
+ "text": "Radius of curvature",
+ "default": 3.5,
+ "max" : 10.0,
+ "min" : 0.5,
+ "step" : 0.1,
+ "format": "%1.1f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "d",
+ "text": "Distance to screen",
+ "default": 2.0,
+ "max" : 10.0,
+ "min" : 0.1,
+ "step" : 0.1,
+ "format": "%1.1f",
+ "screen": "raster" },
+ { "type": "vec2",
+ "name": "angle",
+ "text": "Tilt ",
+ "default": [ 0.0, 0.0 ],
+ "max" : [ 1.0, 1.0 ],
+ "min" : [-1.0,-1.0 ],
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "cornersize",
+ "text": "Rounded corner size",
+ "default": 0.01,
+ "max" : 0.10,
+ "min" : 0.00,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "cornersmooth",
+ "text": "Border smoothness",
+ "default": 1000,
+ "max" : 2000,
+ "min" : 100,
+ "step" : 100,
+ "format": "%1.0f",
+ "screen": "raster" },
+ { "type": "vec2",
+ "name": "overscan",
+ "text": "Overscan ",
+ "default": [ 1.0, 1.0 ],
+ "max" : [ 1.2, 1.2 ],
+ "min" : [ 0.8, 0.8 ],
+ "step" : 0.02,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "CRTgamma",
+ "text": "Gamma of simulated CRT",
+ "default": 2.4,
+ "max" : 4.0,
+ "min" : 0.7,
+ "step" : 0.05,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "monitorgamma",
+ "text": "Gamma of output display",
+ "default": 2.2,
+ "max" : 4.0,
+ "min" : 0.7,
+ "step" : 0.05,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "vec2",
+ "name": "aspect",
+ "text": "Aspect ratio ",
+ "default": [ 1.0, 0.75 ],
+ "max" : [ 1.0, 1.0 ],
+ "min" : [ 0.3, 0.3 ],
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "raster" }
+ ],
+ "targets": [
+ ],
+ "passes": [
+ {
+ "effect": "crt-geom/crt-geom",
+ "applytint": true,
+ "name": "CRT",
+ "uniforms": [
+ { "uniform": "curvature", "slider": "curvature" },
+ { "uniform": "R", "slider": "R" },
+ { "uniform": "d", "slider": "d" },
+ { "uniform": "angle", "slider": "angle" },
+ { "uniform": "cornersize", "slider": "cornersize" },
+ { "uniform": "cornersmooth","slider": "cornersmooth" },
+ { "uniform": "overscan", "slider": "overscan" },
+ { "uniform": "aspect", "slider": "aspect" },
+ { "uniform": "CRTgamma", "slider": "CRTgamma" },
+ { "uniform": "monitorgamma","slider": "monitorgamma" },
+ { "uniform": "aperture_strength", "slider": "aperture_strength" },
+ { "uniform": "aperture_brightboost","slider": "aperture_brightboost" },
+ { "uniform": "spot_size", "slider": "spot_size" },
+ { "uniform": "spot_growth", "slider": "spot_growth" },
+ { "uniform": "spot_growth_power", "slider": "spot_growth_power" },
+ { "uniform": "u_interp", "slider": "x_interpolation" }
+ ],
+ "input": [
+ { "sampler": "mpass_texture", "target": "screen" },
+ { "sampler": "mask_texture", "texture": "bgfx/chains/crt-geom/aperture_1_2_bgr.png", "selection": "Shadow mask" }
+ ],
+ "output": "output"
+ }
+ ]
}
diff --git a/bgfx/chains/default.json b/bgfx/chains/default.json
index b2c6aed2378..5df37df64c7 100644
--- a/bgfx/chains/default.json
+++ b/bgfx/chains/default.json
@@ -1,13 +1,13 @@
-{ "name": "Default Nearest-Neighbor Filter",
+{ "name": "Default Nearest-Neighbor Filter",
"author": "Ryan Holtz",
"targets": [
- { "name": "temp",
+ { "name": "temp",
"mode": "guest",
"bilinear": true
}
],
"passes": [
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"applytint": true,
"name": "Copy To Filtered Texture",
"input": [
@@ -15,7 +15,7 @@
],
"output": "temp"
},
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Final Upscale",
"input": [
{ "sampler": "s_tex", "target": "temp" }
@@ -23,4 +23,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/eagle/super-eagle.json b/bgfx/chains/eagle/super-eagle.json
index fc88e38c40a..64cf0a38244 100644
--- a/bgfx/chains/eagle/super-eagle.json
+++ b/bgfx/chains/eagle/super-eagle.json
@@ -5,7 +5,7 @@
/* Copied from the Dosbox source code */
/* Copyright (C) 2002-2007 The DOSBox Team */
/* License: GNU-GPL */
-/* Adapted by guest(r) on 16.4.2007 */
+/* Adapted by guest(r) on 16.4.2007 */
{
"name": "Super Eagle",
@@ -34,7 +34,7 @@
],
"output": "scaled_out"
},
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Final Blit",
"input": [
{ "sampler": "s_tex", "target": "scaled_out" }
@@ -42,4 +42,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/hlsl.json b/bgfx/chains/hlsl.json
index 5af4ca79f95..abac32e6432 100644
--- a/bgfx/chains/hlsl.json
+++ b/bgfx/chains/hlsl.json
@@ -90,7 +90,7 @@
{ "type": "float", "name": "scanline_scale", "text": "Overall Scanline Scale", "default": 1.00, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },
{ "type": "float", "name": "scanline_height", "text": "Individual Scanline Scale", "default": 1.00, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },
{ "type": "float", "name": "scanline_variation", "text": "Scanline Variation", "default": 1.00, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },
- { "type": "float", "name": "scanline_bright_scale", "text": "Scanline Brightness Scale", "default": 2.00, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },
+ { "type": "float", "name": "scanline_bright_scale", "text": "Scanline Brightness Scale", "default": 2.00, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },
{ "type": "float", "name": "scanline_bright_offset", "text": "Scanline Brightness Offset", "default": 1.50, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },
{ "type": "float", "name": "scanline_jitter_amount", "text": "Scanline Jitter Amount", "default": 0.00, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },
{ "type": "float", "name": "scanline_variation", "text": "Scanline Variation", "default": 1.00, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },
@@ -181,12 +181,12 @@
"bilinear": false,
"doublebuffer": true
},
- { "name": "internal",
+ { "name": "internal",
"mode": "native",
"scale": 2,
"doublebuffer": true
},
- { "name": "previous",
+ { "name": "previous",
"mode": "native",
"scale": 2,
"doublebuffer": true
@@ -195,7 +195,7 @@
// passes (required): The list of individual shaders to invoke, and any dynamic input parameters they need.
"passes": [
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Blit to filterable surface for NTSC",
"disablewhen": [
{ "type": "slider", "condition": "equal", "combine": "and", "name": "adjustments", "value": 0 },
@@ -314,7 +314,7 @@
// value: Any valid ASCII string that names a target.
"output": "ntsc"
},
- { "effect": "hlsl/ntsc_decode",
+ { "effect": "hlsl/ntsc_decode",
"name": "NTSC Decode",
"disablewhen": [
{ "type": "slider", "condition": "equal", "combine": "or", "name": "adjustments", "value": 0 },
@@ -340,7 +340,7 @@
],
"output": "guest"
},
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "NTSC Skip",
"disablewhen": [
{ "type": "slider", "condition": "notequal", "combine": "and", "name": "adjustments", "value": 0 },
@@ -352,7 +352,7 @@
"applytint": true,
"output": "guest"
},
- { "effect": "hlsl/color",
+ { "effect": "hlsl/color",
"name": "Color Convolution",
"disablewhen": [
{ "type": "slider", "condition": "equal", "name": "adjustments", "value": 0 }
@@ -370,14 +370,14 @@
],
"output": "guest"
},
- { "effect": "hlsl/prescale",
+ { "effect": "hlsl/prescale",
"name": "Prescale",
"input": [
{ "sampler": "s_tex", "target": "guest" }
],
"output": "internal"
},
- { "effect": "hlsl/deconverge",
+ { "effect": "hlsl/deconverge",
"name": "Deconvergence",
"disablewhen": [
{ "type": "slider", "condition": "equal", "combine": "or", "name": "adjustments", "value": 0 },
@@ -424,7 +424,7 @@
],
"output": "internal"
},
- { "effect": "hlsl/defocus",
+ { "effect": "hlsl/defocus",
"name": "Defocus Pass",
"disablewhen": [
{ "type": "slider", "condition": "equal", "combine": "or", "name": "adjustments", "value": 0 },
@@ -438,7 +438,7 @@
],
"output": "internal"
},
- { "effect": "hlsl/post",
+ { "effect": "hlsl/post",
"name": "Non-Bloom Post Pass",
"disablewhen": [
{ "type": "slider", "condition": "equal", "combine": "or", "name": "adjustments", "value": 0 },
@@ -468,7 +468,7 @@
],
"output": "internal"
},
- { "effect": "hlsl/phosphor",
+ { "effect": "hlsl/phosphor",
"name": "Phosphor Decay",
"disablewhen": [
{ "type": "slider", "condition": "equal", "combine": "or", "name": "adjustments", "value": 0 },
@@ -484,7 +484,7 @@
],
"output": "internal"
},
- { "effect": "hlsl/phosphor",
+ { "effect": "hlsl/phosphor",
"name": "Phosphor Store",
"disablewhen": [
{ "type": "slider", "condition": "equal", "combine": "or", "name": "adjustments", "value": 0 },
@@ -501,23 +501,23 @@
"output": "previous"
},
{
- "effect": "hlsl/chroma",
- "name": "Phosphor Chromaticity Conversion",
- "disablewhen": [
- { "type": "slider", "condition": "equal", "name": "adjustments", "value": 0 }
- ],
- "uniforms": [
- { "uniform": "u_y_gain", "slider": "chroma_y_gain" },
- { "uniform": "u_chroma_a", "slider": "chroma_a" },
- { "uniform": "u_chroma_b", "slider": "chroma_b" },
+ "effect": "hlsl/chroma",
+ "name": "Phosphor Chromaticity Conversion",
+ "disablewhen": [
+ { "type": "slider", "condition": "equal", "name": "adjustments", "value": 0 }
+ ],
+ "uniforms": [
+ { "uniform": "u_y_gain", "slider": "chroma_y_gain" },
+ { "uniform": "u_chroma_a", "slider": "chroma_a" },
+ { "uniform": "u_chroma_b", "slider": "chroma_b" },
{ "uniform": "u_chroma_c", "slider": "chroma_c" }
- ],
- "input": [
- { "sampler": "s_tex", "target": "internal" }
- ],
- "output": "internal"
+ ],
+ "input": [
+ { "sampler": "s_tex", "target": "internal" }
+ ],
+ "output": "internal"
},
- { "effect": "hlsl/distortion",
+ { "effect": "hlsl/distortion",
"name": "Distortion Pass",
"disablewhen": [
{ "type": "slider", "condition": "equal", "combine": "or", "name": "adjustments", "value": 0 },
@@ -577,7 +577,7 @@
],
"output": "internal"
},
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Final Blit",
"input": [
{ "sampler": "s_tex", "target": "internal" }
diff --git a/bgfx/chains/hqx/hq2x.json b/bgfx/chains/hqx/hq2x.json
index c60f46c1be8..8f500549181 100644
--- a/bgfx/chains/hqx/hq2x.json
+++ b/bgfx/chains/hqx/hq2x.json
@@ -51,7 +51,7 @@
],
"output": "scaled_out"
},
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Final Blit",
"input": [
{ "sampler": "s_tex", "target": "scaled_out" }
diff --git a/bgfx/chains/hqx/hq3x.json b/bgfx/chains/hqx/hq3x.json
index 3f5815cf7a4..119946414f5 100644
--- a/bgfx/chains/hqx/hq3x.json
+++ b/bgfx/chains/hqx/hq3x.json
@@ -51,7 +51,7 @@
],
"output": "scaled_out"
},
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Final Blit",
"input": [
{ "sampler": "s_tex", "target": "scaled_out" }
diff --git a/bgfx/chains/hqx/hq4x.json b/bgfx/chains/hqx/hq4x.json
index 17abf352797..9ba3f2edcdd 100644
--- a/bgfx/chains/hqx/hq4x.json
+++ b/bgfx/chains/hqx/hq4x.json
@@ -51,7 +51,7 @@
],
"output": "scaled_out"
},
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Final Blit",
"input": [
{ "sampler": "s_tex", "target": "scaled_out" }
diff --git a/bgfx/chains/lcd-grid.json b/bgfx/chains/lcd-grid.json
index d2a94049e7b..d12e7a26b4d 100644
--- a/bgfx/chains/lcd-grid.json
+++ b/bgfx/chains/lcd-grid.json
@@ -1,123 +1,123 @@
{
- "name": "lcd-grid",
- "author": "cgwg",
- "sliders": [
- { "type": "float",
- "name": "persistence",
- "text": "Persistence",
- "default": 0.1,
- "max" : 0.99,
- "min" : 0.0,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "lcd" },
- { "type": "float",
- "name": "gain",
- "text": "Gain",
- "default": 1.0,
- "max" : 2.0,
- "min" : -1.0,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "lcd" },
- { "type": "float",
- "name": "blacklevel",
- "text": "Black level",
- "default": 0.0,
- "max" : 2.0,
- "min" : -1.0,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "lcd" },
- { "type": "float",
- "name": "ambient",
- "text": "Ambient",
- "default": 0.0,
- "max" : 2.0,
- "min" : -1.0,
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "lcd" },
- { "type": "float",
- "name": "LCDgamma",
- "text": "Gamma of simulated LCD",
- "default": 2.2,
- "max" : 4.0,
- "min" : 0.7,
- "step" : 0.05,
- "format": "%1.2f",
- "screen": "raster" },
- { "type": "float",
- "name": "monitorgamma",
- "text": "Gamma of output display",
- "default": 2.2,
- "max" : 4.0,
- "min" : 0.7,
- "step" : 0.05,
- "format": "%1.2f",
- "screen": "lcd" },
- { "type": "intenum",
- "name": "BGR",
- "text": "Subpixel layout",
- "default": 0,
- "max" : 1,
- "min" : 0,
- "step" : 1,
- "format": "%s",
- "screen": "lcd",
- "strings": [ "RGB", "BGR" ] },
- { "type": "vec2",
- "name": "subpixsize",
- "text": "Subpixel size ",
- "default": [0.5,0.63],
- "max" : [1.0,1.0],
- "min" : [0.1,0.1],
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "lcd" },
- { "type": "color",
- "name": "rsubpix",
- "text": "R subpixel ",
- "default": [1.0,0.0,0.0],
- "max" : [1.0,1.0,1.0],
- "min" : [0.0,0.0,0.0],
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "lcd" },
- { "type": "color",
- "name": "gsubpix",
- "text": "G subpixel ",
- "default": [0.0,1.0,0.0],
- "max" : [1.0,1.0,1.0],
- "min" : [0.0,0.0,0.0],
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "lcd" },
- { "type": "color",
- "name": "bsubpix",
- "text": "B subpixel ",
- "default": [0.0,0.0,1.0],
- "max" : [1.0,1.0,1.0],
- "min" : [0.0,0.0,0.0],
- "step" : 0.01,
- "format": "%1.2f",
- "screen": "lcd" }
- ],
+ "name": "lcd-grid",
+ "author": "cgwg",
+ "sliders": [
+ { "type": "float",
+ "name": "persistence",
+ "text": "Persistence",
+ "default": 0.1,
+ "max" : 0.99,
+ "min" : 0.0,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "lcd" },
+ { "type": "float",
+ "name": "gain",
+ "text": "Gain",
+ "default": 1.0,
+ "max" : 2.0,
+ "min" : -1.0,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "lcd" },
+ { "type": "float",
+ "name": "blacklevel",
+ "text": "Black level",
+ "default": 0.0,
+ "max" : 2.0,
+ "min" : -1.0,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "lcd" },
+ { "type": "float",
+ "name": "ambient",
+ "text": "Ambient",
+ "default": 0.0,
+ "max" : 2.0,
+ "min" : -1.0,
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "lcd" },
+ { "type": "float",
+ "name": "LCDgamma",
+ "text": "Gamma of simulated LCD",
+ "default": 2.2,
+ "max" : 4.0,
+ "min" : 0.7,
+ "step" : 0.05,
+ "format": "%1.2f",
+ "screen": "raster" },
+ { "type": "float",
+ "name": "monitorgamma",
+ "text": "Gamma of output display",
+ "default": 2.2,
+ "max" : 4.0,
+ "min" : 0.7,
+ "step" : 0.05,
+ "format": "%1.2f",
+ "screen": "lcd" },
+ { "type": "intenum",
+ "name": "BGR",
+ "text": "Subpixel layout",
+ "default": 0,
+ "max" : 1,
+ "min" : 0,
+ "step" : 1,
+ "format": "%s",
+ "screen": "lcd",
+ "strings": [ "RGB", "BGR" ] },
+ { "type": "vec2",
+ "name": "subpixsize",
+ "text": "Subpixel size ",
+ "default": [0.5,0.63],
+ "max" : [1.0,1.0],
+ "min" : [0.1,0.1],
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "lcd" },
+ { "type": "color",
+ "name": "rsubpix",
+ "text": "R subpixel ",
+ "default": [1.0,0.0,0.0],
+ "max" : [1.0,1.0,1.0],
+ "min" : [0.0,0.0,0.0],
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "lcd" },
+ { "type": "color",
+ "name": "gsubpix",
+ "text": "G subpixel ",
+ "default": [0.0,1.0,0.0],
+ "max" : [1.0,1.0,1.0],
+ "min" : [0.0,0.0,0.0],
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "lcd" },
+ { "type": "color",
+ "name": "bsubpix",
+ "text": "B subpixel ",
+ "default": [0.0,0.0,1.0],
+ "max" : [1.0,1.0,1.0],
+ "min" : [0.0,0.0,0.0],
+ "step" : 0.01,
+ "format": "%1.2f",
+ "screen": "lcd" }
+ ],
"targets": [
- { "name": "motionblur",
+ { "name": "motionblur",
"mode": "guest"
- }
+ }
],
"passes": [
{
"effect": "lcd-grid/persistence",
"name": "LCD persistence",
"uniforms": [
- { "uniform": "u_persistence", "slider": "persistence" }
+ { "uniform": "u_persistence", "slider": "persistence" }
],
"input": [
- { "sampler": "s_screen", "target": "screen" },
- { "sampler": "s_motionblur","target": "motionblur" }
+ { "sampler": "s_screen", "target": "screen" },
+ { "sampler": "s_motionblur","target": "motionblur" }
],
"output": "motionblur"
},
@@ -126,20 +126,20 @@
"applytint": true,
"name": "LCD",
"uniforms": [
- { "uniform": "u_rsubpix", "slider": "rsubpix" },
- { "uniform": "u_gsubpix", "slider": "gsubpix" },
- { "uniform": "u_bsubpix", "slider": "bsubpix" },
- { "uniform": "u_gain", "slider": "gain" },
- { "uniform": "u_blacklevel","slider": "blacklevel" },
- { "uniform": "u_ambient", "slider": "ambient" },
- { "uniform": "u_LCDgamma", "slider": "LCDgamma" },
- { "uniform": "u_monitorgamma","slider": "monitorgamma" },
- { "uniform": "u_subpixsize","slider": "subpixsize" },
- { "uniform": "u_BGR", "slider": "BGR" }
+ { "uniform": "u_rsubpix", "slider": "rsubpix" },
+ { "uniform": "u_gsubpix", "slider": "gsubpix" },
+ { "uniform": "u_bsubpix", "slider": "bsubpix" },
+ { "uniform": "u_gain", "slider": "gain" },
+ { "uniform": "u_blacklevel","slider": "blacklevel" },
+ { "uniform": "u_ambient", "slider": "ambient" },
+ { "uniform": "u_LCDgamma", "slider": "LCDgamma" },
+ { "uniform": "u_monitorgamma","slider": "monitorgamma" },
+ { "uniform": "u_subpixsize","slider": "subpixsize" },
+ { "uniform": "u_BGR", "slider": "BGR" }
],
-
+
"input": [
- { "sampler": "s_tex", "target": "motionblur" }
+ { "sampler": "s_tex", "target": "motionblur" }
],
"output": "output"
diff --git a/bgfx/chains/pillarbox_left_horizontal.json b/bgfx/chains/pillarbox_left_horizontal.json
index bb0664330f0..336be374548 100644
--- a/bgfx/chains/pillarbox_left_horizontal.json
+++ b/bgfx/chains/pillarbox_left_horizontal.json
@@ -10,11 +10,11 @@
{
"name": "Horizontal Pillarbox, Left",
"author": "Ryan Holtz",
-
+
"sliders": [
{ "type": "float", "name": "saturation", "text": "Saturation", "default": 0.25, "max": 1.00, "min": 0.00, "step": 0.01, "format": "%1.2f", "screen": "raster" }
],
-
+
"targets": [
{
"name": "guest",
@@ -29,16 +29,16 @@
"doublebuffer": true
}
],
-
+
"passes": [
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Blit to scalable target",
"input": [
{ "sampler": "s_tex", "target": "screen" }
],
"output": "guest"
},
- { "effect": "pillarbox_left_horizontal/gaussian",
+ { "effect": "pillarbox_left_horizontal/gaussian",
"name": "Gaussian Blur 1, Horizontal",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 1.0, 0.0 ] }
@@ -48,7 +48,7 @@
],
"output": "internal"
},
- { "effect": "pillarbox_left_horizontal/gaussian",
+ { "effect": "pillarbox_left_horizontal/gaussian",
"name": "Gaussian Blur 1, Vertical",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 0.0, 1.0 ] }
@@ -58,7 +58,7 @@
],
"output": "internal"
},
- { "effect": "pillarbox_left_horizontal/gaussian",
+ { "effect": "pillarbox_left_horizontal/gaussian",
"name": "Gaussian Blur 2, Horizontal",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 1.0, 0.0 ] }
@@ -68,7 +68,7 @@
],
"output": "internal"
},
- { "effect": "pillarbox_left_horizontal/gaussian",
+ { "effect": "pillarbox_left_horizontal/gaussian",
"name": "Gaussian Blur 2, Vertical",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 0.0, 1.0 ] }
@@ -92,7 +92,7 @@
],
"output": "internal"
},
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Final Blit",
"input": [
{ "sampler": "s_tex", "target": "internal" }
@@ -100,4 +100,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/pillarbox_left_vertical.json b/bgfx/chains/pillarbox_left_vertical.json
index 9132b77eefa..7d114b3544a 100644
--- a/bgfx/chains/pillarbox_left_vertical.json
+++ b/bgfx/chains/pillarbox_left_vertical.json
@@ -10,11 +10,11 @@
{
"name": "Vertical Pillarbox, Left",
"author": "Ryan Holtz",
-
+
"sliders": [
{ "type": "float", "name": "saturation", "text": "Saturation", "default": 0.25, "max": 1.00, "min": 0.00, "step": 0.01, "format": "%1.2f", "screen": "raster" }
],
-
+
"targets": [
{
"name": "guest",
@@ -29,16 +29,16 @@
"doublebuffer": true
}
],
-
+
"passes": [
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Blit to scalable target",
"input": [
{ "sampler": "s_tex", "target": "screen" }
],
"output": "guest"
},
- { "effect": "pillarbox_left_vertical/gaussian",
+ { "effect": "pillarbox_left_vertical/gaussian",
"name": "Gaussian Blur 1, Horizontal",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 1.0, 0.0 ] }
@@ -48,7 +48,7 @@
],
"output": "internal"
},
- { "effect": "pillarbox_left_vertical/gaussian",
+ { "effect": "pillarbox_left_vertical/gaussian",
"name": "Gaussian Blur 1, Vertical",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 0.0, 1.0 ] }
@@ -58,7 +58,7 @@
],
"output": "internal"
},
- { "effect": "pillarbox_left_vertical/gaussian",
+ { "effect": "pillarbox_left_vertical/gaussian",
"name": "Gaussian Blur 2, Horizontal",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 1.0, 0.0 ] }
@@ -68,7 +68,7 @@
],
"output": "internal"
},
- { "effect": "pillarbox_left_vertical/gaussian",
+ { "effect": "pillarbox_left_vertical/gaussian",
"name": "Gaussian Blur 2, Vertical",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 0.0, 1.0 ] }
@@ -92,7 +92,7 @@
],
"output": "internal"
},
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Final Blit",
"input": [
{ "sampler": "s_tex", "target": "internal" }
@@ -100,4 +100,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/pillarbox_right_horizontal.json b/bgfx/chains/pillarbox_right_horizontal.json
index 1b4798e6b18..b4592a7161b 100644
--- a/bgfx/chains/pillarbox_right_horizontal.json
+++ b/bgfx/chains/pillarbox_right_horizontal.json
@@ -10,11 +10,11 @@
{
"name": "Horizontal Pillarbox, Right",
"author": "Ryan Holtz",
-
+
"sliders": [
{ "type": "float", "name": "saturation", "text": "Saturation", "default": 0.25, "max": 1.00, "min": 0.00, "step": 0.01, "format": "%1.2f", "screen": "raster" }
],
-
+
"targets": [
{
"name": "guest",
@@ -29,16 +29,16 @@
"doublebuffer": true
}
],
-
+
"passes": [
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Blit to scalable target",
"input": [
{ "sampler": "s_tex", "target": "screen" }
],
"output": "guest"
},
- { "effect": "pillarbox_right_horizontal/gaussian",
+ { "effect": "pillarbox_right_horizontal/gaussian",
"name": "Gaussian Blur 1, Horizontal",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 1.0, 0.0 ] }
@@ -48,7 +48,7 @@
],
"output": "internal"
},
- { "effect": "pillarbox_right_horizontal/gaussian",
+ { "effect": "pillarbox_right_horizontal/gaussian",
"name": "Gaussian Blur 1, Vertical",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 0.0, 1.0 ] }
@@ -58,7 +58,7 @@
],
"output": "internal"
},
- { "effect": "pillarbox_right_horizontal/gaussian",
+ { "effect": "pillarbox_right_horizontal/gaussian",
"name": "Gaussian Blur 2, Horizontal",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 1.0, 0.0 ] }
@@ -68,7 +68,7 @@
],
"output": "internal"
},
- { "effect": "pillarbox_right_horizontal/gaussian",
+ { "effect": "pillarbox_right_horizontal/gaussian",
"name": "Gaussian Blur 2, Vertical",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 0.0, 1.0 ] }
@@ -92,7 +92,7 @@
],
"output": "internal"
},
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Final Blit",
"input": [
{ "sampler": "s_tex", "target": "internal" }
@@ -100,4 +100,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/pillarbox_right_vertical.json b/bgfx/chains/pillarbox_right_vertical.json
index 1dcc15c5d29..ec7ab44fa4a 100644
--- a/bgfx/chains/pillarbox_right_vertical.json
+++ b/bgfx/chains/pillarbox_right_vertical.json
@@ -10,11 +10,11 @@
{
"name": "Vertical Pillarbox, Right",
"author": "Ryan Holtz",
-
+
"sliders": [
{ "type": "float", "name": "saturation", "text": "Saturation", "default": 0.25, "max": 1.00, "min": 0.00, "step": 0.01, "format": "%1.2f", "screen": "raster" }
],
-
+
"targets": [
{
"name": "guest",
@@ -29,16 +29,16 @@
"doublebuffer": true
}
],
-
+
"passes": [
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Blit to scalable target",
"input": [
{ "sampler": "s_tex", "target": "screen" }
],
"output": "guest"
},
- { "effect": "pillarbox_right_vertical/gaussian",
+ { "effect": "pillarbox_right_vertical/gaussian",
"name": "Gaussian Blur 1, Horizontal",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 1.0, 0.0 ] }
@@ -48,7 +48,7 @@
],
"output": "internal"
},
- { "effect": "pillarbox_right_vertical/gaussian",
+ { "effect": "pillarbox_right_vertical/gaussian",
"name": "Gaussian Blur 1, Vertical",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 0.0, 1.0 ] }
@@ -58,7 +58,7 @@
],
"output": "internal"
},
- { "effect": "pillarbox_right_vertical/gaussian",
+ { "effect": "pillarbox_right_vertical/gaussian",
"name": "Gaussian Blur 2, Horizontal",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 1.0, 0.0 ] }
@@ -68,7 +68,7 @@
],
"output": "internal"
},
- { "effect": "pillarbox_right_vertical/gaussian",
+ { "effect": "pillarbox_right_vertical/gaussian",
"name": "Gaussian Blur 2, Vertical",
"uniforms": [
{ "uniform": "u_dimension", "value": [ 0.0, 1.0 ] }
@@ -92,7 +92,7 @@
],
"output": "internal"
},
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"name": "Final Blit",
"input": [
{ "sampler": "s_tex", "target": "internal" }
@@ -100,4 +100,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/unfiltered.json b/bgfx/chains/unfiltered.json
index c69bcd319b5..d17a01f412b 100644
--- a/bgfx/chains/unfiltered.json
+++ b/bgfx/chains/unfiltered.json
@@ -1,7 +1,7 @@
-{ "name": "Default Nearest-Neighbor Filter",
+{ "name": "Default Nearest-Neighbor Filter",
"author": "Ryan Holtz",
"passes": [
- { "effect": "misc/blit",
+ { "effect": "misc/blit",
"applytint": true,
"name": "Unfiltered Upscale",
"input": [
@@ -10,4 +10,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/super-2xbr-3d-2p.json b/bgfx/chains/xbr/super-2xbr-3d-2p.json
index 1fafe6497f1..3f998786625 100644
--- a/bgfx/chains/xbr/super-2xbr-3d-2p.json
+++ b/bgfx/chains/xbr/super-2xbr-3d-2p.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR 3D Shader *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -67,4 +67,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/super-2xbr-3d-3p-smoother.json b/bgfx/chains/xbr/super-2xbr-3d-3p-smoother.json
index 307e0b6a149..37144fb1acc 100644
--- a/bgfx/chains/xbr/super-2xbr-3d-3p-smoother.json
+++ b/bgfx/chains/xbr/super-2xbr-3d-3p-smoother.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR 3D Shader *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -76,4 +76,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/super-4xbr-3d-4p.json b/bgfx/chains/xbr/super-4xbr-3d-4p.json
index cd1fa47ff73..d88fcfff279 100644
--- a/bgfx/chains/xbr/super-4xbr-3d-4p.json
+++ b/bgfx/chains/xbr/super-4xbr-3d-4p.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super 4XBR 3D Shader *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -84,4 +84,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/super-4xbr-3d-6p-smoother.json b/bgfx/chains/xbr/super-4xbr-3d-6p-smoother.json
index b3ef9004d82..53cd24c0210 100644
--- a/bgfx/chains/xbr/super-4xbr-3d-6p-smoother.json
+++ b/bgfx/chains/xbr/super-4xbr-3d-6p-smoother.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super 4XBR 3D Shader *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -84,4 +84,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/super-xbr-2p.json b/bgfx/chains/xbr/super-xbr-2p.json
index d4fabc092ad..f733ab21610 100644
--- a/bgfx/chains/xbr/super-xbr-2p.json
+++ b/bgfx/chains/xbr/super-xbr-2p.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR 3D Shader *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -74,4 +74,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/super-xbr-3p-smoother.json b/bgfx/chains/xbr/super-xbr-3p-smoother.json
index 487b62059e0..f7d2bf5165e 100644
--- a/bgfx/chains/xbr/super-xbr-3p-smoother.json
+++ b/bgfx/chains/xbr/super-xbr-3p-smoother.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR Shader *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -82,4 +82,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/super-xbr-6p.json b/bgfx/chains/xbr/super-xbr-6p.json
index 3c3a867df88..cffd4d24a26 100644
--- a/bgfx/chains/xbr/super-xbr-6p.json
+++ b/bgfx/chains/xbr/super-xbr-6p.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR Shader *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -121,4 +121,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/super-xbr-deposterize.json b/bgfx/chains/xbr/super-xbr-deposterize.json
index 4a1ec028bbf..4010e7f1215 100644
--- a/bgfx/chains/xbr/super-xbr-deposterize.json
+++ b/bgfx/chains/xbr/super-xbr-deposterize.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR Shader *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -96,4 +96,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/super-xbr-fast-3p.json b/bgfx/chains/xbr/super-xbr-fast-3p.json
index 92d067c67b8..7ccf13b1669 100644
--- a/bgfx/chains/xbr/super-xbr-fast-3p.json
+++ b/bgfx/chains/xbr/super-xbr-fast-3p.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR Shader *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -74,4 +74,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/super-xbr-fast-6p.json b/bgfx/chains/xbr/super-xbr-fast-6p.json
index bd97d17a496..a7d32c22907 100644
--- a/bgfx/chains/xbr/super-xbr-fast-6p.json
+++ b/bgfx/chains/xbr/super-xbr-fast-6p.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR Shader *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -111,4 +111,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-hybrid.json b/bgfx/chains/xbr/xbr-hybrid.json
index 9c187c7cd7c..963283618cc 100644
--- a/bgfx/chains/xbr/xbr-hybrid.json
+++ b/bgfx/chains/xbr/xbr-hybrid.json
@@ -46,4 +46,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-lv1-noblend.json b/bgfx/chains/xbr/xbr-lv1-noblend.json
index b350a3bf279..123dc565582 100644
--- a/bgfx/chains/xbr/xbr-lv1-noblend.json
+++ b/bgfx/chains/xbr/xbr-lv1-noblend.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR-lv1-noblend Shader
-
+
Copyright (C) 2011-2014 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -40,4 +40,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-lv2-3d.json b/bgfx/chains/xbr/xbr-lv2-3d.json
index 74bc2d4c5b4..048f72e8e04 100644
--- a/bgfx/chains/xbr/xbr-lv2-3d.json
+++ b/bgfx/chains/xbr/xbr-lv2-3d.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR-lv2-3d Shader
-
+
Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -40,4 +40,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-lv2-accuracy-multipass.json b/bgfx/chains/xbr/xbr-lv2-accuracy-multipass.json
index a4fcbdcb951..5258f7c9840 100644
--- a/bgfx/chains/xbr/xbr-lv2-accuracy-multipass.json
+++ b/bgfx/chains/xbr/xbr-lv2-accuracy-multipass.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR LV2 Accuracy
-
+
Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -57,4 +57,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-lv2-accuracy-smart-blur.json b/bgfx/chains/xbr/xbr-lv2-accuracy-smart-blur.json
index 03d9acd7f0d..b6e8ea3c8e4 100644
--- a/bgfx/chains/xbr/xbr-lv2-accuracy-smart-blur.json
+++ b/bgfx/chains/xbr/xbr-lv2-accuracy-smart-blur.json
@@ -45,4 +45,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-lv2-deposterize.json b/bgfx/chains/xbr/xbr-lv2-deposterize.json
index 7c5099960fb..7451cd54ab4 100644
--- a/bgfx/chains/xbr/xbr-lv2-deposterize.json
+++ b/bgfx/chains/xbr/xbr-lv2-deposterize.json
@@ -39,4 +39,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-lv2-fast.json b/bgfx/chains/xbr/xbr-lv2-fast.json
index ad39d50c046..26bcce5ef0b 100644
--- a/bgfx/chains/xbr/xbr-lv2-fast.json
+++ b/bgfx/chains/xbr/xbr-lv2-fast.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR-lv2-fast Shader
-
+
Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -40,4 +40,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-lv2-multipass.json b/bgfx/chains/xbr/xbr-lv2-multipass.json
index 64e500112b3..2dd34a9b9d3 100644
--- a/bgfx/chains/xbr/xbr-lv2-multipass.json
+++ b/bgfx/chains/xbr/xbr-lv2-multipass.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR LV2 C (squared) - pass0 Shader
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -59,4 +59,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-lv2-noblend.json b/bgfx/chains/xbr/xbr-lv2-noblend.json
index d83225eea28..db08feb2647 100644
--- a/bgfx/chains/xbr/xbr-lv2-noblend.json
+++ b/bgfx/chains/xbr/xbr-lv2-noblend.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR-lv2-noblend Shader
-
+
Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -40,4 +40,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-lv2.json b/bgfx/chains/xbr/xbr-lv2.json
index 6b098b5cec9..3f589d734fe 100644
--- a/bgfx/chains/xbr/xbr-lv2.json
+++ b/bgfx/chains/xbr/xbr-lv2.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR-lv2 Shader
-
+
Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -40,4 +40,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-lv3-multipass.json b/bgfx/chains/xbr/xbr-lv3-multipass.json
index 18aed86e084..ac63612b704 100644
--- a/bgfx/chains/xbr/xbr-lv3-multipass.json
+++ b/bgfx/chains/xbr/xbr-lv3-multipass.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR level 3 Shader
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -58,4 +58,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-lv3-noblend.json b/bgfx/chains/xbr/xbr-lv3-noblend.json
index 37e006885d5..8f5b3ac2e2e 100644
--- a/bgfx/chains/xbr/xbr-lv3-noblend.json
+++ b/bgfx/chains/xbr/xbr-lv3-noblend.json
@@ -3,14 +3,14 @@
/*
Hyllian's xBR-lv3-noblend - Shader
-
+
Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
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
+ 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
@@ -40,4 +40,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-lv3.json b/bgfx/chains/xbr/xbr-lv3.json
index ca4866bee37..ddeb80874c9 100644
--- a/bgfx/chains/xbr/xbr-lv3.json
+++ b/bgfx/chains/xbr/xbr-lv3.json
@@ -3,14 +3,14 @@
/*
Hyllian's xBR-lv3 Shader
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
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
+ 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
@@ -40,4 +40,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-mlv4-dilation.json b/bgfx/chains/xbr/xbr-mlv4-dilation.json
index e0a55017754..3ce4926ca8b 100644
--- a/bgfx/chains/xbr/xbr-mlv4-dilation.json
+++ b/bgfx/chains/xbr/xbr-mlv4-dilation.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR MultiLevel4 Shader + Dilation
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -96,4 +96,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/chains/xbr/xbr-mlv4-multipass.json b/bgfx/chains/xbr/xbr-mlv4-multipass.json
index 010a5f99250..2eb09a7f87d 100644
--- a/bgfx/chains/xbr/xbr-mlv4-multipass.json
+++ b/bgfx/chains/xbr/xbr-mlv4-multipass.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR MultiLevel4 Shader
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -81,4 +81,4 @@
"output": "output"
}
]
-} \ No newline at end of file
+}
diff --git a/bgfx/effects/blurs/smart-blur.json b/bgfx/effects/blurs/smart-blur.json
index 01632204b73..abc52469dbd 100644
--- a/bgfx/effects/blurs/smart-blur.json
+++ b/bgfx/effects/blurs/smart-blur.json
@@ -3,7 +3,7 @@
/*
Hyllian Smart-Blur Shader
-
+
Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,29 +27,29 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/blurs/vs_smart-blur",
- "fragment": "chains/blurs/fs_smart-blur",
- "uniforms": [
- { "name": "s_p", "type": "int", "values": [ 1.0 ] },
- { "name": "SB_THRESHOLD", "type": "vec4", "values": [ 0.2, 0.2, 0.2, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/blurs/vs_smart-blur",
+ "fragment": "chains/blurs/fs_smart-blur",
+ "uniforms": [
+ { "name": "s_p", "type": "int", "values": [ 1.0 ] },
+ { "name": "SB_THRESHOLD", "type": "vec4", "values": [ 0.2, 0.2, 0.2, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/crt-geom/crt-geom-deluxe.json b/bgfx/effects/crt-geom/crt-geom-deluxe.json
index 10f87874a4d..500eab09542 100644
--- a/bgfx/effects/crt-geom/crt-geom-deluxe.json
+++ b/bgfx/effects/crt-geom/crt-geom-deluxe.json
@@ -1,51 +1,51 @@
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/crt-geom/vs_crt-geom",
- "fragment": "chains/crt-geom/fs_crt-geom-deluxe",
- "uniforms": [
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_quad_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_rotation_type", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "mpass_texture", "type": "int", "values": [ 0 ] },
- { "name": "mask_texture", "type": "int", "values": [ 1 ] },
- { "name": "blur_texture", "type": "int", "values": [ 2 ] },
- { "name": "mipmap_texture", "type": "int", "values": [ 3 ] },
- { "name": "curvature", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "CRTgamma", "type": "vec4", "values": [ 2.4, 0.0, 0.0, 0.0 ] },
- { "name": "monitorgamma", "type": "vec4", "values": [ 2.2, 0.0, 0.0, 0.0 ] },
- { "name": "overscan", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "aspect", "type": "vec4", "values": [ 1.0, 0.75,0.0, 0.0 ] },
- { "name": "d", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "R", "type": "vec4", "values": [ 3.5, 0.0, 0.0, 0.0 ] },
- { "name": "angle", "type": "vec4", "values": [ 0.0,-0.05,0.0, 0.0 ] },
- { "name": "cornersize", "type": "vec4", "values": [ 0.01,0.0, 0.0, 0.0 ] },
- { "name": "cornersmooth", "type": "vec4", "values": [ 1000.0,0.0,0.0,0.0 ] },
- { "name": "aperture_strength", "type": "vec4", "values": [ 0.25,0.0,0.0,0.0 ] },
- { "name": "aperture_brightboost","type": "vec4", "values": [ 0.25,0.0,0.0,0.0 ] },
- { "name": "spot_size", "type": "vec4", "values": [ 0.3,0.0,0.0,0.0 ] },
- { "name": "spot_growth","type": "vec4", "values": [ 0.1,0.0,0.0,0.0 ] },
- { "name": "spot_growth_power", "type": "vec4", "values": [ 3.0,0.0,0.0,0.0 ] },
- { "name": "u_interp", "type": "vec4", "values": [ 2.0,0.0,0.0,0.0 ] },
- { "name": "halation", "type": "vec4", "values": [ 0.1,0.0,0.0,0.0 ] },
- { "name": "blurwidth", "type": "vec4", "values": [ 2.0,0.0,0.0,0.0 ] },
- { "name": "rasterbloom","type": "vec4", "values": [ 0.01,0.0,0.0,0.0 ] }
- ]
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/crt-geom/vs_crt-geom",
+ "fragment": "chains/crt-geom/fs_crt-geom-deluxe",
+ "uniforms": [
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_quad_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_rotation_type", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "mpass_texture", "type": "int", "values": [ 0 ] },
+ { "name": "mask_texture", "type": "int", "values": [ 1 ] },
+ { "name": "blur_texture", "type": "int", "values": [ 2 ] },
+ { "name": "mipmap_texture", "type": "int", "values": [ 3 ] },
+ { "name": "curvature", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "CRTgamma", "type": "vec4", "values": [ 2.4, 0.0, 0.0, 0.0 ] },
+ { "name": "monitorgamma", "type": "vec4", "values": [ 2.2, 0.0, 0.0, 0.0 ] },
+ { "name": "overscan", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "aspect", "type": "vec4", "values": [ 1.0, 0.75,0.0, 0.0 ] },
+ { "name": "d", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "R", "type": "vec4", "values": [ 3.5, 0.0, 0.0, 0.0 ] },
+ { "name": "angle", "type": "vec4", "values": [ 0.0,-0.05,0.0, 0.0 ] },
+ { "name": "cornersize", "type": "vec4", "values": [ 0.01,0.0, 0.0, 0.0 ] },
+ { "name": "cornersmooth", "type": "vec4", "values": [ 1000.0,0.0,0.0,0.0 ] },
+ { "name": "aperture_strength", "type": "vec4", "values": [ 0.25,0.0,0.0,0.0 ] },
+ { "name": "aperture_brightboost","type": "vec4", "values": [ 0.25,0.0,0.0,0.0 ] },
+ { "name": "spot_size", "type": "vec4", "values": [ 0.3,0.0,0.0,0.0 ] },
+ { "name": "spot_growth", "type": "vec4", "values": [ 0.1,0.0,0.0,0.0 ] },
+ { "name": "spot_growth_power", "type": "vec4", "values": [ 3.0,0.0,0.0,0.0 ] },
+ { "name": "u_interp", "type": "vec4", "values": [ 2.0,0.0,0.0,0.0 ] },
+ { "name": "halation", "type": "vec4", "values": [ 0.1,0.0,0.0,0.0 ] },
+ { "name": "blurwidth", "type": "vec4", "values": [ 2.0,0.0,0.0,0.0 ] },
+ { "name": "rasterbloom", "type": "vec4", "values": [ 0.01,0.0,0.0,0.0 ] }
+ ]
}
diff --git a/bgfx/effects/crt-geom/crt-geom.json b/bgfx/effects/crt-geom/crt-geom.json
index 5b2e1b6730e..b742896485e 100644
--- a/bgfx/effects/crt-geom/crt-geom.json
+++ b/bgfx/effects/crt-geom/crt-geom.json
@@ -1,46 +1,46 @@
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/crt-geom/vs_crt-geom",
- "fragment": "chains/crt-geom/fs_crt-geom",
- "uniforms": [
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_quad_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_rotation_type", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "mpass_texture", "type": "int", "values": [ 0 ] },
- { "name": "mask_texture", "type": "int", "values": [ 1 ] },
- { "name": "curvature", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "CRTgamma", "type": "vec4", "values": [ 2.4, 0.0, 0.0, 0.0 ] },
- { "name": "monitorgamma", "type": "vec4", "values": [ 2.2, 0.0, 0.0, 0.0 ] },
- { "name": "overscan", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "aspect", "type": "vec4", "values": [ 1.0, 0.75,0.0, 0.0 ] },
- { "name": "d", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "R", "type": "vec4", "values": [ 3.5, 0.0, 0.0, 0.0 ] },
- { "name": "angle", "type": "vec4", "values": [ 0.0,-0.05,0.0, 0.0 ] },
- { "name": "cornersize", "type": "vec4", "values": [ 0.01,0.0, 0.0, 0.0 ] },
- { "name": "cornersmooth", "type": "vec4", "values": [ 1000.0,0.0,0.0,0.0 ] },
- { "name": "aperture_strength", "type": "vec4", "values": [ 0.25,0.0,0.0,0.0 ] },
- { "name": "aperture_brightboost","type": "vec4", "values": [ 0.25,0.0,0.0,0.0 ] },
- { "name": "spot_size", "type": "vec4", "values": [ 0.3,0.0,0.0,0.0 ] },
- { "name": "spot_growth","type": "vec4", "values": [ 0.1,0.0,0.0,0.0 ] },
- { "name": "spot_growth_power", "type": "vec4", "values": [ 3.0,0.0,0.0,0.0 ] },
- { "name": "u_interp", "type": "vec4", "values": [ 2.0,0.0,0.0,0.0 ] }
- ]
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/crt-geom/vs_crt-geom",
+ "fragment": "chains/crt-geom/fs_crt-geom",
+ "uniforms": [
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_quad_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_rotation_type", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "mpass_texture", "type": "int", "values": [ 0 ] },
+ { "name": "mask_texture", "type": "int", "values": [ 1 ] },
+ { "name": "curvature", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "CRTgamma", "type": "vec4", "values": [ 2.4, 0.0, 0.0, 0.0 ] },
+ { "name": "monitorgamma", "type": "vec4", "values": [ 2.2, 0.0, 0.0, 0.0 ] },
+ { "name": "overscan", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "aspect", "type": "vec4", "values": [ 1.0, 0.75,0.0, 0.0 ] },
+ { "name": "d", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "R", "type": "vec4", "values": [ 3.5, 0.0, 0.0, 0.0 ] },
+ { "name": "angle", "type": "vec4", "values": [ 0.0,-0.05,0.0, 0.0 ] },
+ { "name": "cornersize", "type": "vec4", "values": [ 0.01,0.0, 0.0, 0.0 ] },
+ { "name": "cornersmooth", "type": "vec4", "values": [ 1000.0,0.0,0.0,0.0 ] },
+ { "name": "aperture_strength", "type": "vec4", "values": [ 0.25,0.0,0.0,0.0 ] },
+ { "name": "aperture_brightboost","type": "vec4", "values": [ 0.25,0.0,0.0,0.0 ] },
+ { "name": "spot_size", "type": "vec4", "values": [ 0.3,0.0,0.0,0.0 ] },
+ { "name": "spot_growth", "type": "vec4", "values": [ 0.1,0.0,0.0,0.0 ] },
+ { "name": "spot_growth_power", "type": "vec4", "values": [ 3.0,0.0,0.0,0.0 ] },
+ { "name": "u_interp", "type": "vec4", "values": [ 2.0,0.0,0.0,0.0 ] }
+ ]
}
diff --git a/bgfx/effects/crt-geom/gaussx.json b/bgfx/effects/crt-geom/gaussx.json
index 4fc008f7954..896e514f0e5 100644
--- a/bgfx/effects/crt-geom/gaussx.json
+++ b/bgfx/effects/crt-geom/gaussx.json
@@ -1,29 +1,29 @@
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/crt-geom/vs_gaussx",
- "fragment": "chains/crt-geom/fs_gaussx",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_width", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_aspect", "type": "vec4", "values": [ 1.0,0.75, 0.0, 0.0 ] },
- { "name": "u_gamma", "type": "vec4", "values": [ 2.2, 0.0, 0.0, 0.0 ] }
- ]
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/crt-geom/vs_gaussx",
+ "fragment": "chains/crt-geom/fs_gaussx",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_width", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_aspect", "type": "vec4", "values": [ 1.0,0.75, 0.0, 0.0 ] },
+ { "name": "u_gamma", "type": "vec4", "values": [ 2.2, 0.0, 0.0, 0.0 ] }
+ ]
}
diff --git a/bgfx/effects/crt-geom/gaussy.json b/bgfx/effects/crt-geom/gaussy.json
index 5f585c85688..e3e539a4ce2 100644
--- a/bgfx/effects/crt-geom/gaussy.json
+++ b/bgfx/effects/crt-geom/gaussy.json
@@ -1,29 +1,29 @@
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/crt-geom/vs_gaussy",
- "fragment": "chains/crt-geom/fs_gaussy",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_width", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_aspect", "type": "vec4", "values": [ 1.0,0.75, 0.0, 0.0 ] },
- { "name": "u_gamma", "type": "vec4", "values": [ 2.2, 0.0, 0.0, 0.0 ] }
- ]
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/crt-geom/vs_gaussy",
+ "fragment": "chains/crt-geom/fs_gaussy",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_width", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_aspect", "type": "vec4", "values": [ 1.0,0.75, 0.0, 0.0 ] },
+ { "name": "u_gamma", "type": "vec4", "values": [ 2.2, 0.0, 0.0, 0.0 ] }
+ ]
}
diff --git a/bgfx/effects/crt-geom/lowpass.json b/bgfx/effects/crt-geom/lowpass.json
index 7115e2112be..d5467d0a9a7 100644
--- a/bgfx/effects/crt-geom/lowpass.json
+++ b/bgfx/effects/crt-geom/lowpass.json
@@ -1,28 +1,28 @@
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/crt-geom/vs_lowpass",
- "fragment": "chains/crt-geom/fs_lowpass",
- "uniforms": [
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_lowpass_cutoff","type": "vec4", "values": [ 200.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_lowpass_width", "type": "vec4", "values": [ 80.0, 0.0, 0.0, 0.0 ] },
- { "name": "s_screen", "type": "int", "values": [ 0 ] }
- ]
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/crt-geom/vs_lowpass",
+ "fragment": "chains/crt-geom/fs_lowpass",
+ "uniforms": [
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_lowpass_cutoff","type": "vec4", "values": [ 200.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_lowpass_width", "type": "vec4", "values": [ 80.0, 0.0, 0.0, 0.0 ] },
+ { "name": "s_screen", "type": "int", "values": [ 0 ] }
+ ]
}
diff --git a/bgfx/effects/crt-geom/mipmap8.json b/bgfx/effects/crt-geom/mipmap8.json
index 8ae25aa7c1e..78605feb939 100644
--- a/bgfx/effects/crt-geom/mipmap8.json
+++ b/bgfx/effects/crt-geom/mipmap8.json
@@ -1,29 +1,29 @@
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/crt-geom/vs_mipmap8",
- "fragment": "chains/crt-geom/fs_mipmap8",
- "uniforms": [
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_smooth", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
- { "name": "s_screen", "type": "int", "values": [ 0 ] },
- { "name": "s_mipmap", "type": "int", "values": [ 1 ] }
- ]
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/crt-geom/vs_mipmap8",
+ "fragment": "chains/crt-geom/fs_mipmap8",
+ "uniforms": [
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_smooth", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
+ { "name": "s_screen", "type": "int", "values": [ 0 ] },
+ { "name": "s_mipmap", "type": "int", "values": [ 1 ] }
+ ]
}
diff --git a/bgfx/effects/crt-geom/phosphor_apply.json b/bgfx/effects/crt-geom/phosphor_apply.json
index dc6dfcb34b5..f1c322c5b6e 100644
--- a/bgfx/effects/crt-geom/phosphor_apply.json
+++ b/bgfx/effects/crt-geom/phosphor_apply.json
@@ -1,30 +1,30 @@
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/crt-geom/vs_phosphor_apply",
- "fragment": "chains/crt-geom/fs_phosphor_apply",
- "uniforms": [
- { "name": "s_screen", "type": "int", "values": [ 0 ] },
- { "name": "s_phosphor", "type": "int", "values": [ 1 ] },
- { "name": "u_phosphor_power", "type": "vec4", "values": [ 1.3, 0.0, 0.0, 0.0 ] },
- { "name": "u_phosphor_amplitude","type": "vec4", "values": [ 0.2, 0.0, 0.0, 0.0 ] },
- { "name": "u_phosphor_cutoff", "type": "vec4", "values": [300.0,0.0, 0.0, 0.0 ] },
- { "name": "u_gamma", "type": "vec4", "values": [ 2.2, 0.0, 0.0, 0.0 ] }
- ]
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/crt-geom/vs_phosphor_apply",
+ "fragment": "chains/crt-geom/fs_phosphor_apply",
+ "uniforms": [
+ { "name": "s_screen", "type": "int", "values": [ 0 ] },
+ { "name": "s_phosphor", "type": "int", "values": [ 1 ] },
+ { "name": "u_phosphor_power", "type": "vec4", "values": [ 1.3, 0.0, 0.0, 0.0 ] },
+ { "name": "u_phosphor_amplitude","type": "vec4", "values": [ 0.2, 0.0, 0.0, 0.0 ] },
+ { "name": "u_phosphor_cutoff", "type": "vec4", "values": [300.0,0.0, 0.0, 0.0 ] },
+ { "name": "u_gamma", "type": "vec4", "values": [ 2.2, 0.0, 0.0, 0.0 ] }
+ ]
}
diff --git a/bgfx/effects/crt-geom/phosphor_update.json b/bgfx/effects/crt-geom/phosphor_update.json
index 50cde93b69a..77740af02ba 100644
--- a/bgfx/effects/crt-geom/phosphor_update.json
+++ b/bgfx/effects/crt-geom/phosphor_update.json
@@ -1,30 +1,30 @@
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/crt-geom/vs_phosphor_update",
- "fragment": "chains/crt-geom/fs_phosphor_update",
- "uniforms": [
- { "name": "s_screen", "type": "int", "values": [ 0 ] },
- { "name": "s_phosphor", "type": "int", "values": [ 1 ] },
- { "name": "u_phosphor_power", "type": "vec4", "values": [ 1.3, 0.0, 0.0, 0.0 ] },
- { "name": "u_phosphor_amplitude","type": "vec4", "values": [ 0.2, 0.0, 0.0, 0.0 ] },
- { "name": "u_phosphor_cutoff", "type": "vec4", "values": [300.0,0.0, 0.0, 0.0 ] },
- { "name": "u_gamma", "type": "vec4", "values": [ 2.2, 0.0, 0.0, 0.0 ] }
- ]
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/crt-geom/vs_phosphor_update",
+ "fragment": "chains/crt-geom/fs_phosphor_update",
+ "uniforms": [
+ { "name": "s_screen", "type": "int", "values": [ 0 ] },
+ { "name": "s_phosphor", "type": "int", "values": [ 1 ] },
+ { "name": "u_phosphor_power", "type": "vec4", "values": [ 1.3, 0.0, 0.0, 0.0 ] },
+ { "name": "u_phosphor_amplitude","type": "vec4", "values": [ 0.2, 0.0, 0.0, 0.0 ] },
+ { "name": "u_phosphor_cutoff", "type": "vec4", "values": [300.0,0.0, 0.0, 0.0 ] },
+ { "name": "u_gamma", "type": "vec4", "values": [ 2.2, 0.0, 0.0, 0.0 ] }
+ ]
}
diff --git a/bgfx/effects/default/blit.json b/bgfx/effects/default/blit.json
index a3c21f4c964..82b4594dd7a 100644
--- a/bgfx/effects/default/blit.json
+++ b/bgfx/effects/default/blit.json
@@ -6,95 +6,95 @@
//
//============================================================
{
- // depth (required): The depth state for this effect.
- "depth": {
- // function (optional): The depth function to use when drawing.
- // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always"
- // default: "always"
- "function": "always",
-
- // writeenable (optional): Whether to store Z-buffer data.
- // values: true, false
- // default: false
- "writeenable": false
- },
-
- // cull (required): The cull mode for this effect.
- "cull": {
- // mode (optional): What winding, if any, to cull.
- // values: "none", "cw", "ccw"
- // default: "ccw"
- //
- // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw"
- "mode": "none"
- },
-
- // write (required): Write enable for color and alpha channels.
- "write": {
- // rgb (optional): Whether to store color data when drawing.
- // values: true, false
- // default: false
- "rgb": true,
+ // depth (required): The depth state for this effect.
+ "depth": {
+ // function (optional): The depth function to use when drawing.
+ // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always"
+ // default: "always"
+ "function": "always",
- // alpha (optional): Whether to store alpha data when drawing.
- // values: true, false
- // default: false
- "alpha": true
- },
+ // writeenable (optional): Whether to store Z-buffer data.
+ // values: true, false
+ // default: false
+ "writeenable": false
+ },
+
+ // cull (required): The cull mode for this effect.
+ "cull": {
+ // mode (optional): What winding, if any, to cull.
+ // values: "none", "cw", "ccw"
+ // default: "ccw"
+ //
+ // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw"
+ "mode": "none"
+ },
+
+ // write (required): Write enable for color and alpha channels.
+ "write": {
+ // rgb (optional): Whether to store color data when drawing.
+ // values: true, false
+ // default: false
+ "rgb": true,
+
+ // alpha (optional): Whether to store alpha data when drawing.
+ // values: true, false
+ // default: false
+ "alpha": true
+ },
// vertex (required): The vertex shader to use when drawing.
// value: A string containing the path and name of a shader file to use, minus the extension.
- "vertex": "chains/default/vs_blit",
+ "vertex": "chains/default/vs_blit",
// pixel/fragment (required): The pixel or fragment shader to use when drawing.
// value: A string containing the path and name of a shader file to use, minus the extension.
- "fragment": "chains/default/fs_blit",
-
- // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist.
- "uniforms": [
- {
- // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader.
- // value: A string containing the name of the uniform as described above.
- //
- // NOTE: Some names correspond to special values that will be automatically filled by the BGFX
- // code if they are used by the shader. These names are:
- // "u_screen_dims"
- // The dimensions of the first texture input if present, otherwise the dimensions of the output window.
- // Valid values: xy
- // "u_inv_screen_dims"
- // The reciprocal of u_screen_dims.
- // Valid values: xy
- // "u_source_dims"
- // The size, in pixels, of the screen texture incoming to the chain.
- // Valid values: xy
- // "u_rotation_type"
- // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270.
- // Valid values: x
- // "u_swap_xy"
- // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false.
- // Valid values: x
- // "u_quad_dims"
- // The dimensions, in pixels, occupied by this one screen primitive itself in the output window.
- // Valid values: xy
- // "u_tex_sizeN"
- // The dimensions, in pixels, of the texture in input pair N. Starts at 0.
- // valid values: xy
- "name": "s_tex",
+ "fragment": "chains/default/fs_blit",
+
+ // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist.
+ "uniforms": [
+ {
+ // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader.
+ // value: A string containing the name of the uniform as described above.
+ //
+ // NOTE: Some names correspond to special values that will be automatically filled by the BGFX
+ // code if they are used by the shader. These names are:
+ // "u_screen_dims"
+ // The dimensions of the first texture input if present, otherwise the dimensions of the output window.
+ // Valid values: xy
+ // "u_inv_screen_dims"
+ // The reciprocal of u_screen_dims.
+ // Valid values: xy
+ // "u_source_dims"
+ // The size, in pixels, of the screen texture incoming to the chain.
+ // Valid values: xy
+ // "u_rotation_type"
+ // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270.
+ // Valid values: x
+ // "u_swap_xy"
+ // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false.
+ // Valid values: x
+ // "u_quad_dims"
+ // The dimensions, in pixels, occupied by this one screen primitive itself in the output window.
+ // Valid values: xy
+ // "u_tex_sizeN"
+ // The dimensions, in pixels, of the texture in input pair N. Starts at 0.
+ // valid values: xy
+ "name": "s_tex",
+
+ // type (required): The type of the uniform.
+ // values: "int", "vec4", "mat3", "mat4"
+ //
+ // Note: "int" should only be used for samplers.
+ "type": "int",
- // type (required): The type of the uniform.
- // values: "int", "vec4", "mat3", "mat4"
- //
- // Note: "int" should only be used for samplers.
- "type": "int",
-
- // values (required): The array of numbers with which to initialize the uniform.
- // value: A JSON array containin the correct amount of numbers to initialize a uniform of the
- // above-specified type. The following size rules should be followed:
- // "int": 1 float
- // "vec4": 4 floats
- // "mat3": 9 floats
- // "mat4": 16 floats
- "values": [ 1.0 ]
- }
- ]
-} \ No newline at end of file
+ // values (required): The array of numbers with which to initialize the uniform.
+ // value: A JSON array containin the correct amount of numbers to initialize a uniform of the
+ // above-specified type. The following size rules should be followed:
+ // "int": 1 float
+ // "vec4": 4 floats
+ // "mat3": 9 floats
+ // "mat4": 16 floats
+ "values": [ 1.0 ]
+ }
+ ]
+}
diff --git a/bgfx/effects/eagle/supereagle.json b/bgfx/effects/eagle/supereagle.json
index cd209b7cd80..ec919828d5c 100644
--- a/bgfx/effects/eagle/supereagle.json
+++ b/bgfx/effects/eagle/supereagle.json
@@ -5,31 +5,31 @@
/* Copied from the Dosbox source code */
/* Copyright (C) 2002-2007 The DOSBox Team */
/* License: GNU-GPL */
-/* Adapted by guest(r) on 16.4.2007 */
+/* Adapted by guest(r) on 16.4.2007 */
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/eagle/vs_eagle",
- "fragment": "chains/eagle/fs_eagle",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "LUT", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/eagle/vs_eagle",
+ "fragment": "chains/eagle/fs_eagle",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "LUT", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/gui_add.json b/bgfx/effects/gui_add.json
index bff6517b739..8b5da4998a1 100644
--- a/bgfx/effects/gui_add.json
+++ b/bgfx/effects/gui_add.json
@@ -7,24 +7,24 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "vs_gui",
- "fragment": "fs_gui",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "vs_gui",
+ "fragment": "fs_gui",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] }
+ ]
+}
diff --git a/bgfx/effects/gui_blend.json b/bgfx/effects/gui_blend.json
index 2ef99b816e7..9cf160ac6ba 100644
--- a/bgfx/effects/gui_blend.json
+++ b/bgfx/effects/gui_blend.json
@@ -7,24 +7,24 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "vs_gui",
- "fragment": "fs_gui",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "vs_gui",
+ "fragment": "fs_gui",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] }
+ ]
+}
diff --git a/bgfx/effects/gui_multiply.json b/bgfx/effects/gui_multiply.json
index 14551be8190..15ac24c91a9 100644
--- a/bgfx/effects/gui_multiply.json
+++ b/bgfx/effects/gui_multiply.json
@@ -7,24 +7,24 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "dstcolor",
- "dstColor": "0",
- "srcAlpha": "dstalpha",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "vs_gui",
- "fragment": "fs_gui",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "dstcolor",
+ "dstColor": "0",
+ "srcAlpha": "dstalpha",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "vs_gui",
+ "fragment": "fs_gui",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] }
+ ]
+}
diff --git a/bgfx/effects/gui_opaque.json b/bgfx/effects/gui_opaque.json
index 53e6f732828..51f0941c89f 100644
--- a/bgfx/effects/gui_opaque.json
+++ b/bgfx/effects/gui_opaque.json
@@ -6,24 +6,24 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "vs_gui",
- "fragment": "fs_gui",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "vs_gui",
+ "fragment": "fs_gui",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] }
+ ]
+}
diff --git a/bgfx/effects/hlsl/blit.json b/bgfx/effects/hlsl/blit.json
index 1ee3243050f..1fdfd623638 100644
--- a/bgfx/effects/hlsl/blit.json
+++ b/bgfx/effects/hlsl/blit.json
@@ -7,115 +7,115 @@
//============================================================
{
// blend (required): The blend state for this effect.
- "blend": {
- // equation (optional): What equation to perform on the source and destination blend values.
- // values: "add", "sub", "revSub", "min", "max"
- // default: "add"
- //
- // "subtract" and "revSubtract" are provided as aliases for "sub" and "revSub"
- "equation": "add",
-
- // blend function parameters (optional): What factors to use in the blend function when calculating the final pixel.
- // values: "0", "1", "srccolor", "1-srccolor", "dstcolor", "1-dstcolor", "srcalpha", "1-srcalpha", "dstalpha", "1-dstalpha"
- // defaults (srcColor, srcAlpha): "1"
- // defaults (dstColor, dstAlpha): "0"
- //
- // "zero", "one", "invsrccolor", "invdstcolor", "invsrcalpha", and "invdstalpha" are provided as aliases for "0", "1", "1-srccolor", "1-dstcolor", "1-srcalpha", and "1-dstalpha"
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
-
- // depth (required): The depth state for this effect.
- "depth": {
- // function (optional): The depth function to use when drawing.
- // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always"
- // default: "always"
- "function": "always",
-
- // writeenable (optional): Whether to store Z-buffer data.
- // values: true, false
- // default: false
- "writeenable": false
- },
-
- // cull (required): The cull mode for this effect.
- "cull": {
- // mode (optional): What winding, if any, to cull.
- // values: "none", "cw", "ccw"
- // default: "ccw"
- //
- // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw"
- "mode": "none"
- },
-
- // write (required): Write enable for color and alpha channels.
- "write": {
- // rgb (optional): Whether to store color data when drawing.
- // values: true, false
- // default: false
- "rgb": true,
+ "blend": {
+ // equation (optional): What equation to perform on the source and destination blend values.
+ // values: "add", "sub", "revSub", "min", "max"
+ // default: "add"
+ //
+ // "subtract" and "revSubtract" are provided as aliases for "sub" and "revSub"
+ "equation": "add",
- // alpha (optional): Whether to store alpha data when drawing.
- // values: true, false
- // default: false
- "alpha": true
- },
+ // blend function parameters (optional): What factors to use in the blend function when calculating the final pixel.
+ // values: "0", "1", "srccolor", "1-srccolor", "dstcolor", "1-dstcolor", "srcalpha", "1-srcalpha", "dstalpha", "1-dstalpha"
+ // defaults (srcColor, srcAlpha): "1"
+ // defaults (dstColor, dstAlpha): "0"
+ //
+ // "zero", "one", "invsrccolor", "invdstcolor", "invsrcalpha", and "invdstalpha" are provided as aliases for "0", "1", "1-srccolor", "1-dstcolor", "1-srcalpha", and "1-dstalpha"
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+
+ // depth (required): The depth state for this effect.
+ "depth": {
+ // function (optional): The depth function to use when drawing.
+ // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always"
+ // default: "always"
+ "function": "always",
+
+ // writeenable (optional): Whether to store Z-buffer data.
+ // values: true, false
+ // default: false
+ "writeenable": false
+ },
+
+ // cull (required): The cull mode for this effect.
+ "cull": {
+ // mode (optional): What winding, if any, to cull.
+ // values: "none", "cw", "ccw"
+ // default: "ccw"
+ //
+ // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw"
+ "mode": "none"
+ },
+
+ // write (required): Write enable for color and alpha channels.
+ "write": {
+ // rgb (optional): Whether to store color data when drawing.
+ // values: true, false
+ // default: false
+ "rgb": true,
+
+ // alpha (optional): Whether to store alpha data when drawing.
+ // values: true, false
+ // default: false
+ "alpha": true
+ },
// vertex (required): The vertex shader to use when drawing.
// value: A string containing the path and name of a shader file to use, minus the extension.
- "vertex": "chains/hlsl/vs_blit",
+ "vertex": "chains/hlsl/vs_blit",
// pixel/fragment (required): The pixel or fragment shader to use when drawing.
// value: A string containing the path and name of a shader file to use, minus the extension.
- "fragment": "chains/hlsl/fs_blit",
-
- // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist.
- "uniforms": [
- {
- // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader.
- // value: A string containing the name of the uniform as described above.
- //
- // NOTE: Some names correspond to special values that will be automatically filled by the BGFX
- // code if they are used by the shader. These names are:
- // "u_screen_dims"
- // The dimensions of the first texture input if present, otherwise the dimensions of the output window.
- // Valid values: xy
- // "u_inv_screen_dims"
- // The reciprocal of u_screen_dims.
- // Valid values: xy
- // "u_source_dims"
- // The size, in pixels, of the screen texture incoming to the chain.
- // Valid values: xy
- // "u_rotation_type"
- // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270.
- // Valid values: x
- // "u_swap_xy"
- // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false.
- // Valid values: x
- // "u_quad_dims"
- // The dimensions, in pixels, occupied by this one screen primitive itself in the output window.
- // Valid values: xy
- // "u_tex_sizeN"
- // The dimensions, in pixels, of the texture in input pair N. Starts at 0.
- // valid values: xy
- "name": "s_tex",
+ "fragment": "chains/hlsl/fs_blit",
+
+ // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist.
+ "uniforms": [
+ {
+ // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader.
+ // value: A string containing the name of the uniform as described above.
+ //
+ // NOTE: Some names correspond to special values that will be automatically filled by the BGFX
+ // code if they are used by the shader. These names are:
+ // "u_screen_dims"
+ // The dimensions of the first texture input if present, otherwise the dimensions of the output window.
+ // Valid values: xy
+ // "u_inv_screen_dims"
+ // The reciprocal of u_screen_dims.
+ // Valid values: xy
+ // "u_source_dims"
+ // The size, in pixels, of the screen texture incoming to the chain.
+ // Valid values: xy
+ // "u_rotation_type"
+ // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270.
+ // Valid values: x
+ // "u_swap_xy"
+ // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false.
+ // Valid values: x
+ // "u_quad_dims"
+ // The dimensions, in pixels, occupied by this one screen primitive itself in the output window.
+ // Valid values: xy
+ // "u_tex_sizeN"
+ // The dimensions, in pixels, of the texture in input pair N. Starts at 0.
+ // valid values: xy
+ "name": "s_tex",
+
+ // type (required): The type of the uniform.
+ // values: "int", "vec4", "mat3", "mat4"
+ //
+ // Note: "int" should only be used for samplers.
+ "type": "int",
- // type (required): The type of the uniform.
- // values: "int", "vec4", "mat3", "mat4"
- //
- // Note: "int" should only be used for samplers.
- "type": "int",
-
- // values (required): The array of numbers with which to initialize the uniform.
- // value: A JSON array containin the correct amount of numbers to initialize a uniform of the
- // above-specified type. The following size rules should be followed:
- // "int": 1 float
- // "vec4": 4 floats
- // "mat3": 9 floats
- // "mat4": 16 floats
- "values": [ 1.0 ]
- }
- ]
-} \ No newline at end of file
+ // values (required): The array of numbers with which to initialize the uniform.
+ // value: A JSON array containin the correct amount of numbers to initialize a uniform of the
+ // above-specified type. The following size rules should be followed:
+ // "int": 1 float
+ // "vec4": 4 floats
+ // "mat3": 9 floats
+ // "mat4": 16 floats
+ "values": [ 1.0 ]
+ }
+ ]
+}
diff --git a/bgfx/effects/hlsl/chroma.json b/bgfx/effects/hlsl/chroma.json
index 6f7879cdc48..96bae4475f8 100644
--- a/bgfx/effects/hlsl/chroma.json
+++ b/bgfx/effects/hlsl/chroma.json
@@ -6,28 +6,28 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/hlsl/vs_chroma",
- "fragment": "chains/hlsl/fs_chroma",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 0.0 ] },
- { "name": "u_y_gain", "type": "vec4", "values": [ 0.2124, 0.7011, 0.0866, 0.0 ] },
- { "name": "u_chroma_a", "type": "vec4", "values": [ 0.630, 0.340, 0.0, 0.0 ] },
- { "name": "u_chroma_b", "type": "vec4", "values": [ 0.310, 0.595, 0.0, 0.0 ] },
- { "name": "u_chroma_c", "type": "vec4", "values": [ 0.155, 0.070, 0.0, 0.0 ] }
- ]
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/hlsl/vs_chroma",
+ "fragment": "chains/hlsl/fs_chroma",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 0.0 ] },
+ { "name": "u_y_gain", "type": "vec4", "values": [ 0.2124, 0.7011, 0.0866, 0.0 ] },
+ { "name": "u_chroma_a", "type": "vec4", "values": [ 0.630, 0.340, 0.0, 0.0 ] },
+ { "name": "u_chroma_b", "type": "vec4", "values": [ 0.310, 0.595, 0.0, 0.0 ] },
+ { "name": "u_chroma_c", "type": "vec4", "values": [ 0.155, 0.070, 0.0, 0.0 ] }
+ ]
}
diff --git a/bgfx/effects/hlsl/color.json b/bgfx/effects/hlsl/color.json
index 52ada823a6b..69743d6cab5 100644
--- a/bgfx/effects/hlsl/color.json
+++ b/bgfx/effects/hlsl/color.json
@@ -6,30 +6,30 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/hlsl/vs_color",
- "fragment": "chains/hlsl/fs_color",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_red_ratios", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_grn_ratios", "type": "vec4", "values": [ 0.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_blu_ratios", "type": "vec4", "values": [ 0.0, 0.0, 1.0, 0.0 ] },
- { "name": "u_offset", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scale", "type": "vec4", "values": [ 0.95, 0.95, 0.95, 0.0 ] },
- { "name": "u_saturation", "type": "vec4", "values": [ 1.5, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/hlsl/vs_color",
+ "fragment": "chains/hlsl/fs_color",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_red_ratios", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_grn_ratios", "type": "vec4", "values": [ 0.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_blu_ratios", "type": "vec4", "values": [ 0.0, 0.0, 1.0, 0.0 ] },
+ { "name": "u_offset", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scale", "type": "vec4", "values": [ 0.95, 0.95, 0.95, 0.0 ] },
+ { "name": "u_saturation", "type": "vec4", "values": [ 1.5, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/hlsl/deconverge.json b/bgfx/effects/hlsl/deconverge.json
index df20d8c5069..053bc078c64 100644
--- a/bgfx/effects/hlsl/deconverge.json
+++ b/bgfx/effects/hlsl/deconverge.json
@@ -7,31 +7,31 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/hlsl/vs_deconverge",
- "fragment": "chains/hlsl/fs_deconverge",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_source_size", "type": "vec4", "values": [ 256.0, 256.0, 0.0, 0.0 ] },
- { "name": "u_converge_red", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
- { "name": "u_converge_green", "type": "vec4", "values": [ 0.0, 0.5, 0.0, 0.0 ] },
- { "name": "u_converge_blue", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_radial_converge_red", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_radial_converge_green", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_radial_converge_blue", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/hlsl/vs_deconverge",
+ "fragment": "chains/hlsl/fs_deconverge",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_source_size", "type": "vec4", "values": [ 256.0, 256.0, 0.0, 0.0 ] },
+ { "name": "u_converge_red", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
+ { "name": "u_converge_green", "type": "vec4", "values": [ 0.0, 0.5, 0.0, 0.0 ] },
+ { "name": "u_converge_blue", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_radial_converge_red", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_radial_converge_green", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_radial_converge_blue", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/hlsl/defocus.json b/bgfx/effects/hlsl/defocus.json
index c66408a0ca1..aa46ca0822b 100644
--- a/bgfx/effects/hlsl/defocus.json
+++ b/bgfx/effects/hlsl/defocus.json
@@ -6,26 +6,26 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/hlsl/vs_defocus",
- "fragment": "chains/hlsl/fs_defocus",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_defocus", "type": "vec4", "values": [ 0.5, 0.5, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/hlsl/vs_defocus",
+ "fragment": "chains/hlsl/fs_defocus",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_defocus", "type": "vec4", "values": [ 0.5, 0.5, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/hlsl/distortion.json b/bgfx/effects/hlsl/distortion.json
index b3b9b5a581a..4fc6fbc3dd5 100644
--- a/bgfx/effects/hlsl/distortion.json
+++ b/bgfx/effects/hlsl/distortion.json
@@ -7,37 +7,37 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/hlsl/vs_distortion",
- "fragment": "chains/hlsl/fs_distortion",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 0.0 ] },
- { "name": "u_swap_xy", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_screen_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_screen_count", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_target_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_target_scale", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_quad_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_distortion", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] },
- { "name": "u_cubic_distortion", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] },
- { "name": "u_distort_corner", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] },
- { "name": "u_round_corner", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] },
- { "name": "u_smooth_border", "type": "vec4", "values": [ 0.05, 0.0, 0.0, 0.0 ] },
- { "name": "u_vignetting", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] },
- { "name": "u_reflection", "type": "vec4", "values": [ 0.30, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/hlsl/vs_distortion",
+ "fragment": "chains/hlsl/fs_distortion",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 0.0 ] },
+ { "name": "u_swap_xy", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_screen_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_screen_count", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_target_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_target_scale", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_quad_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_distortion", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] },
+ { "name": "u_cubic_distortion", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] },
+ { "name": "u_distort_corner", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] },
+ { "name": "u_round_corner", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] },
+ { "name": "u_smooth_border", "type": "vec4", "values": [ 0.05, 0.0, 0.0, 0.0 ] },
+ { "name": "u_vignetting", "type": "vec4", "values": [ 0.20, 0.0, 0.0, 0.0 ] },
+ { "name": "u_reflection", "type": "vec4", "values": [ 0.30, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/hlsl/ntsc_decode.json b/bgfx/effects/hlsl/ntsc_decode.json
index bb18c3a2e56..039a94de4b5 100644
--- a/bgfx/effects/hlsl/ntsc_decode.json
+++ b/bgfx/effects/hlsl/ntsc_decode.json
@@ -7,37 +7,37 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/hlsl/vs_ntsc_decode",
- "fragment": "chains/hlsl/fs_ntsc_decode",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "s_screen", "type": "int", "values": [ 1.0 ] },
- { "name": "u_source_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_a_value", "type": "vec4", "values": [ 0.5, 0.5, 0.5, 0.5 ] },
- { "name": "u_b_value", "type": "vec4", "values": [ 0.5, 0.5, 0.5, 0.5 ] },
- { "name": "u_cc_value", "type": "vec4", "values": [ 3.5795454, 3.5795454, 3.5795454, 3.5795454 ] },
- { "name": "u_o_value", "type": "vec4", "values": [ 1.570796325, 1.570796325, 1.570796325, 1.570796325 ] },
- { "name": "u_scan_time", "type": "vec4", "values": [ 52.6, 0.0, 0.0, 0.0 ] },
- { "name": "u_notch_width", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_y_freq_response", "type": "vec4", "values": [ 6.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_i_freq_response", "type": "vec4", "values": [ 1.2, 0.0, 0.0, 0.0 ] },
- { "name": "u_q_freq_response", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
- { "name": "u_jitter_amount", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_jitter_offset", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/hlsl/vs_ntsc_decode",
+ "fragment": "chains/hlsl/fs_ntsc_decode",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "s_screen", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_source_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_a_value", "type": "vec4", "values": [ 0.5, 0.5, 0.5, 0.5 ] },
+ { "name": "u_b_value", "type": "vec4", "values": [ 0.5, 0.5, 0.5, 0.5 ] },
+ { "name": "u_cc_value", "type": "vec4", "values": [ 3.5795454, 3.5795454, 3.5795454, 3.5795454 ] },
+ { "name": "u_o_value", "type": "vec4", "values": [ 1.570796325, 1.570796325, 1.570796325, 1.570796325 ] },
+ { "name": "u_scan_time", "type": "vec4", "values": [ 52.6, 0.0, 0.0, 0.0 ] },
+ { "name": "u_notch_width", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_y_freq_response", "type": "vec4", "values": [ 6.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_i_freq_response", "type": "vec4", "values": [ 1.2, 0.0, 0.0, 0.0 ] },
+ { "name": "u_q_freq_response", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
+ { "name": "u_jitter_amount", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_jitter_offset", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/hlsl/ntsc_encode.json b/bgfx/effects/hlsl/ntsc_encode.json
index 694dce91fd9..71ef588ceaa 100644
--- a/bgfx/effects/hlsl/ntsc_encode.json
+++ b/bgfx/effects/hlsl/ntsc_encode.json
@@ -7,32 +7,32 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/hlsl/vs_ntsc_encode",
- "fragment": "chains/hlsl/fs_ntsc_encode",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_source_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_a_value", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
- { "name": "u_b_value", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
- { "name": "u_cc_value", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
- { "name": "u_p_value", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scan_time", "type": "vec4", "values": [ 52.6, 0.0, 0.0, 0.0 ] },
- { "name": "u_jitter_amount", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_jitter_offset", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/hlsl/vs_ntsc_encode",
+ "fragment": "chains/hlsl/fs_ntsc_encode",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_source_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_a_value", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
+ { "name": "u_b_value", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
+ { "name": "u_cc_value", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
+ { "name": "u_p_value", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scan_time", "type": "vec4", "values": [ 52.6, 0.0, 0.0, 0.0 ] },
+ { "name": "u_jitter_amount", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_jitter_offset", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/hlsl/phosphor.json b/bgfx/effects/hlsl/phosphor.json
index f5d9d8572e3..7209c98891d 100644
--- a/bgfx/effects/hlsl/phosphor.json
+++ b/bgfx/effects/hlsl/phosphor.json
@@ -7,27 +7,27 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/hlsl/vs_phosphor",
- "fragment": "chains/hlsl/fs_phosphor",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "s_prev", "type": "int", "values": [ 1.0 ] },
- { "name": "u_passthrough", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_phosphor", "type": "vec4", "values": [ 0.7, 0.7, 0.7, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/hlsl/vs_phosphor",
+ "fragment": "chains/hlsl/fs_phosphor",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "s_prev", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_passthrough", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_phosphor", "type": "vec4", "values": [ 0.7, 0.7, 0.7, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/hlsl/prescale.json b/bgfx/effects/hlsl/prescale.json
index e58d5ad92dc..cbe684321cf 100644
--- a/bgfx/effects/hlsl/prescale.json
+++ b/bgfx/effects/hlsl/prescale.json
@@ -7,26 +7,26 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/hlsl/vs_prescale",
- "fragment": "chains/hlsl/fs_prescale",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_source_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/hlsl/vs_prescale",
+ "fragment": "chains/hlsl/fs_prescale",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_source_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/hlsl/scanline.json b/bgfx/effects/hlsl/scanline.json
index 7f4f188c202..07ff15546f3 100644
--- a/bgfx/effects/hlsl/scanline.json
+++ b/bgfx/effects/hlsl/scanline.json
@@ -6,39 +6,39 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/hlsl/vs_scanline",
- "fragment": "chains/hlsl/fs_scanline",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 0.0 ] },
- { "name": "u_swap_xy", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_source_dims", "type": "vec4", "values": [ 256.0, 256.0, 0.0, 0.0 ] },
- { "name": "u_target_dims", "type": "vec4", "values": [ 256.0, 256.0, 0.0, 0.0 ] },
- { "name": "u_quad_dims", "type": "vec4", "values": [ 256.0, 256.0, 0.0, 0.0 ] },
- { "name": "u_time", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_screen_scale", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_screen_offset", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scanline_alpha", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scanline_scale", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scanline_bright_scale", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scanline_bright_offset", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scanline_jitter", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scanline_height", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_scanline_variation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_jitter_amount", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/hlsl/vs_scanline",
+ "fragment": "chains/hlsl/fs_scanline",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 0.0 ] },
+ { "name": "u_swap_xy", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_source_dims", "type": "vec4", "values": [ 256.0, 256.0, 0.0, 0.0 ] },
+ { "name": "u_target_dims", "type": "vec4", "values": [ 256.0, 256.0, 0.0, 0.0 ] },
+ { "name": "u_quad_dims", "type": "vec4", "values": [ 256.0, 256.0, 0.0, 0.0 ] },
+ { "name": "u_time", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_screen_scale", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_screen_offset", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scanline_alpha", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scanline_scale", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scanline_bright_scale", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scanline_bright_offset", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scanline_jitter", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scanline_height", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_scanline_variation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_jitter_amount", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/hqx/hq2x.json b/bgfx/effects/hqx/hq2x.json
index 267339da988..315603820ff 100644
--- a/bgfx/effects/hqx/hq2x.json
+++ b/bgfx/effects/hqx/hq2x.json
@@ -1,29 +1,29 @@
// license:LGPL-2.1+
// copyright-holders:Jules Blok,Cameron Zemek,Maxim Stepin
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/hqx/vs_hq2x",
- "fragment": "chains/hqx/fs_hq2x",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "LUT", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/hqx/vs_hq2x",
+ "fragment": "chains/hqx/fs_hq2x",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "LUT", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/hqx/hq3x.json b/bgfx/effects/hqx/hq3x.json
index 15fa50517a3..5a578eb931f 100644
--- a/bgfx/effects/hqx/hq3x.json
+++ b/bgfx/effects/hqx/hq3x.json
@@ -1,29 +1,29 @@
// license:LGPL-2.1+
// copyright-holders:Jules Blok,Cameron Zemek,Maxim Stepin
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/hqx/vs_hq3x",
- "fragment": "chains/hqx/fs_hq3x",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "LUT", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/hqx/vs_hq3x",
+ "fragment": "chains/hqx/fs_hq3x",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "LUT", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/hqx/hq4x.json b/bgfx/effects/hqx/hq4x.json
index a2e61b3ae09..6fe7803dc3f 100644
--- a/bgfx/effects/hqx/hq4x.json
+++ b/bgfx/effects/hqx/hq4x.json
@@ -1,29 +1,29 @@
// license:LGPL-2.1+
// copyright-holders:Jules Blok,Cameron Zemek,Maxim Stepin
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/hqx/vs_hq4x",
- "fragment": "chains/hqx/fs_hq4x",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "LUT", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/hqx/vs_hq4x",
+ "fragment": "chains/hqx/fs_hq4x",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "LUT", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/lcd-grid/lcd-grid.json b/bgfx/effects/lcd-grid/lcd-grid.json
index 4526a101aaf..5b465d5cf7b 100644
--- a/bgfx/effects/lcd-grid/lcd-grid.json
+++ b/bgfx/effects/lcd-grid/lcd-grid.json
@@ -1,37 +1,37 @@
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/lcd-grid/vs_lcd-grid",
- "fragment": "chains/lcd-grid/fs_lcd-grid",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_quad_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_rsubpix", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_gsubpix", "type": "vec4", "values": [ 0.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_bsubpix", "type": "vec4", "values": [ 0.0, 0.0, 1.0, 0.0 ] },
- { "name": "u_gain", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_blacklevel","type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_ambient", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_BGR", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_subpixsize","type": "vec4", "values": [ 0.5, 0.63, 0.0, 0.0 ] },
- { "name": "u_LCDgamma", "type": "vec4", "values": [ 2.2, 0.0, 0.0, 0.0 ] },
- { "name": "u_monitorgamma","type":"vec4","values": [ 2.2, 0.0, 0.0, 0.0 ] }
- ]
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/lcd-grid/vs_lcd-grid",
+ "fragment": "chains/lcd-grid/fs_lcd-grid",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_quad_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_rsubpix", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_gsubpix", "type": "vec4", "values": [ 0.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_bsubpix", "type": "vec4", "values": [ 0.0, 0.0, 1.0, 0.0 ] },
+ { "name": "u_gain", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_blacklevel","type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_ambient", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_BGR", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_subpixsize","type": "vec4", "values": [ 0.5, 0.63, 0.0, 0.0 ] },
+ { "name": "u_LCDgamma", "type": "vec4", "values": [ 2.2, 0.0, 0.0, 0.0 ] },
+ { "name": "u_monitorgamma","type":"vec4","values": [ 2.2, 0.0, 0.0, 0.0 ] }
+ ]
}
diff --git a/bgfx/effects/lcd-grid/persistence.json b/bgfx/effects/lcd-grid/persistence.json
index 27c8109c8c1..1f4e57c7587 100644
--- a/bgfx/effects/lcd-grid/persistence.json
+++ b/bgfx/effects/lcd-grid/persistence.json
@@ -1,27 +1,27 @@
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/lcd-grid/vs_persistence",
- "fragment": "chains/lcd-grid/fs_persistence",
- "uniforms": [
- { "name": "s_screen", "type": "int", "values": [ 0 ] },
- { "name": "s_motionblur","type": "int", "values": [ 1 ] },
- { "name": "u_persistence","type":"vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] }
- ]
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/lcd-grid/vs_persistence",
+ "fragment": "chains/lcd-grid/fs_persistence",
+ "uniforms": [
+ { "name": "s_screen", "type": "int", "values": [ 0 ] },
+ { "name": "s_motionblur", "type": "int", "values": [ 1 ] },
+ { "name": "u_persistence","type":"vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] }
+ ]
}
diff --git a/bgfx/effects/misc/bcg_adjust.json b/bgfx/effects/misc/bcg_adjust.json
index 545910e5224..35c9595e309 100644
--- a/bgfx/effects/misc/bcg_adjust.json
+++ b/bgfx/effects/misc/bcg_adjust.json
@@ -6,21 +6,21 @@
//
//===============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": { "function": "always", "writeenable": false },
- "cull": { "mode": "none" },
- "write": { "rgb": true, "alpha": true },
- "vertex": "chains/misc/vs_blit",
- "fragment": "chains/misc/fs_blit_bcg",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "s_pal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_inv_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": { "function": "always", "writeenable": false },
+ "cull": { "mode": "none" },
+ "write": { "rgb": true, "alpha": true },
+ "vertex": "chains/misc/vs_blit",
+ "fragment": "chains/misc/fs_blit_bcg",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "s_pal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_inv_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/misc/blit.json b/bgfx/effects/misc/blit.json
index 3fb849a1eed..a5e5c544336 100644
--- a/bgfx/effects/misc/blit.json
+++ b/bgfx/effects/misc/blit.json
@@ -7,115 +7,115 @@
//============================================================
{
// blend (required): The blend state for this effect.
- "blend": {
- // equation (optional): What equation to perform on the source and destination blend values.
- // values: "add", "sub", "revSub", "min", "max"
- // default: "add"
- //
- // "subtract" and "revSubtract" are provided as aliases for "sub" and "revSub"
- "equation": "add",
-
- // blend function parameters (optional): What factors to use in the blend function when calculating the final pixel.
- // values: "0", "1", "srccolor", "1-srccolor", "dstcolor", "1-dstcolor", "srcalpha", "1-srcalpha", "dstalpha", "1-dstalpha"
- // defaults (srcColor, srcAlpha): "1"
- // defaults (dstColor, dstAlpha): "0"
- //
- // "zero", "one", "invsrccolor", "invdstcolor", "invsrcalpha", and "invdstalpha" are provided as aliases for "0", "1", "1-srccolor", "1-dstcolor", "1-srcalpha", and "1-dstalpha"
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
-
- // depth (required): The depth state for this effect.
- "depth": {
- // function (optional): The depth function to use when drawing.
- // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always"
- // default: "always"
- "function": "always",
-
- // writeenable (optional): Whether to store Z-buffer data.
- // values: true, false
- // default: false
- "writeenable": false
- },
-
- // cull (required): The cull mode for this effect.
- "cull": {
- // mode (optional): What winding, if any, to cull.
- // values: "none", "cw", "ccw"
- // default: "ccw"
- //
- // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw"
- "mode": "none"
- },
-
- // write (required): Write enable for color and alpha channels.
- "write": {
- // rgb (optional): Whether to store color data when drawing.
- // values: true, false
- // default: false
- "rgb": true,
+ "blend": {
+ // equation (optional): What equation to perform on the source and destination blend values.
+ // values: "add", "sub", "revSub", "min", "max"
+ // default: "add"
+ //
+ // "subtract" and "revSubtract" are provided as aliases for "sub" and "revSub"
+ "equation": "add",
- // alpha (optional): Whether to store alpha data when drawing.
- // values: true, false
- // default: false
- "alpha": true
- },
+ // blend function parameters (optional): What factors to use in the blend function when calculating the final pixel.
+ // values: "0", "1", "srccolor", "1-srccolor", "dstcolor", "1-dstcolor", "srcalpha", "1-srcalpha", "dstalpha", "1-dstalpha"
+ // defaults (srcColor, srcAlpha): "1"
+ // defaults (dstColor, dstAlpha): "0"
+ //
+ // "zero", "one", "invsrccolor", "invdstcolor", "invsrcalpha", and "invdstalpha" are provided as aliases for "0", "1", "1-srccolor", "1-dstcolor", "1-srcalpha", and "1-dstalpha"
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+
+ // depth (required): The depth state for this effect.
+ "depth": {
+ // function (optional): The depth function to use when drawing.
+ // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always"
+ // default: "always"
+ "function": "always",
+
+ // writeenable (optional): Whether to store Z-buffer data.
+ // values: true, false
+ // default: false
+ "writeenable": false
+ },
+
+ // cull (required): The cull mode for this effect.
+ "cull": {
+ // mode (optional): What winding, if any, to cull.
+ // values: "none", "cw", "ccw"
+ // default: "ccw"
+ //
+ // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw"
+ "mode": "none"
+ },
+
+ // write (required): Write enable for color and alpha channels.
+ "write": {
+ // rgb (optional): Whether to store color data when drawing.
+ // values: true, false
+ // default: false
+ "rgb": true,
+
+ // alpha (optional): Whether to store alpha data when drawing.
+ // values: true, false
+ // default: false
+ "alpha": true
+ },
// vertex (required): The vertex shader to use when drawing.
// value: A string containing the path and name of a shader file to use, minus the extension.
- "vertex": "chains/misc/vs_blit",
+ "vertex": "chains/misc/vs_blit",
// pixel/fragment (required): The pixel or fragment shader to use when drawing.
// value: A string containing the path and name of a shader file to use, minus the extension.
- "fragment": "chains/misc/fs_blit",
-
- // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist.
- "uniforms": [
- {
- // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader.
- // value: A string containing the name of the uniform as described above.
- //
- // NOTE: Some names correspond to special values that will be automatically filled by the BGFX
- // code if they are used by the shader. These names are:
- // "u_screen_dims"
- // The dimensions of the first texture input if present, otherwise the dimensions of the output window.
- // Valid values: xy
- // "u_inv_screen_dims"
- // The reciprocal of u_screen_dims.
- // Valid values: xy
- // "u_source_dims"
- // The size, in pixels, of the screen texture incoming to the chain.
- // Valid values: xy
- // "u_rotation_type"
- // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270.
- // Valid values: x
- // "u_swap_xy"
- // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false.
- // Valid values: x
- // "u_quad_dims"
- // The dimensions, in pixels, occupied by this one screen primitive itself in the output window.
- // Valid values: xy
- // "u_tex_sizeN"
- // The dimensions, in pixels, of the texture in input pair N. Starts at 0.
- // valid values: xy
- "name": "s_tex",
+ "fragment": "chains/misc/fs_blit",
+
+ // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist.
+ "uniforms": [
+ {
+ // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader.
+ // value: A string containing the name of the uniform as described above.
+ //
+ // NOTE: Some names correspond to special values that will be automatically filled by the BGFX
+ // code if they are used by the shader. These names are:
+ // "u_screen_dims"
+ // The dimensions of the first texture input if present, otherwise the dimensions of the output window.
+ // Valid values: xy
+ // "u_inv_screen_dims"
+ // The reciprocal of u_screen_dims.
+ // Valid values: xy
+ // "u_source_dims"
+ // The size, in pixels, of the screen texture incoming to the chain.
+ // Valid values: xy
+ // "u_rotation_type"
+ // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270.
+ // Valid values: x
+ // "u_swap_xy"
+ // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false.
+ // Valid values: x
+ // "u_quad_dims"
+ // The dimensions, in pixels, occupied by this one screen primitive itself in the output window.
+ // Valid values: xy
+ // "u_tex_sizeN"
+ // The dimensions, in pixels, of the texture in input pair N. Starts at 0.
+ // valid values: xy
+ "name": "s_tex",
+
+ // type (required): The type of the uniform.
+ // values: "int", "vec4", "mat3", "mat4"
+ //
+ // Note: "int" should only be used for samplers.
+ "type": "int",
- // type (required): The type of the uniform.
- // values: "int", "vec4", "mat3", "mat4"
- //
- // Note: "int" should only be used for samplers.
- "type": "int",
-
- // values (required): The array of numbers with which to initialize the uniform.
- // value: A JSON array containin the correct amount of numbers to initialize a uniform of the
- // above-specified type. The following size rules should be followed:
- // "int": 1 float
- // "vec4": 4 floats
- // "mat3": 9 floats
- // "mat4": 16 floats
- "values": [ 1.0 ]
- }
- ]
-} \ No newline at end of file
+ // values (required): The array of numbers with which to initialize the uniform.
+ // value: A JSON array containin the correct amount of numbers to initialize a uniform of the
+ // above-specified type. The following size rules should be followed:
+ // "int": 1 float
+ // "vec4": 4 floats
+ // "mat3": 9 floats
+ // "mat4": 16 floats
+ "values": [ 1.0 ]
+ }
+ ]
+}
diff --git a/bgfx/effects/misc/blit_palette16.json b/bgfx/effects/misc/blit_palette16.json
index 99d849ddd23..e0eb7f09140 100644
--- a/bgfx/effects/misc/blit_palette16.json
+++ b/bgfx/effects/misc/blit_palette16.json
@@ -7,117 +7,119 @@
//============================================================
{
// blend (required): The blend state for this effect.
- "blend": {
- // equation (optional): What equation to perform on the source and destination blend values.
- // values: "add", "sub", "revSub", "min", "max"
- // default: "add"
- //
- // "subtract" and "revSubtract" are provided as aliases for "sub" and "revSub"
- "equation": "add",
-
- // blend function parameters (optional): What factors to use in the blend function when calculating the final pixel.
- // values: "0", "1", "srccolor", "1-srccolor", "dstcolor", "1-dstcolor", "srcalpha", "1-srcalpha", "dstalpha", "1-dstalpha"
- // defaults (srcColor, srcAlpha): "1"
- // defaults (dstColor, dstAlpha): "0"
- //
- // "zero", "one", "invsrccolor", "invdstcolor", "invsrcalpha", and "invdstalpha" are provided as aliases for "0", "1", "1-srccolor", "1-dstcolor", "1-srcalpha", and "1-dstalpha"
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
-
- // depth (required): The depth state for this effect.
- "depth": {
- // function (optional): The depth function to use when drawing.
- // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always"
- // default: "always"
- "function": "always",
-
- // writeenable (optional): Whether to store Z-buffer data.
- // values: true, false
- // default: false
- "writeenable": false
- },
-
- // cull (required): The cull mode for this effect.
- "cull": {
- // mode (optional): What winding, if any, to cull.
- // values: "none", "cw", "ccw"
- // default: "ccw"
- //
- // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw"
- "mode": "none"
- },
-
- // write (required): Write enable for color and alpha channels.
- "write": {
- // rgb (optional): Whether to store color data when drawing.
- // values: true, false
- // default: false
- "rgb": true,
+ "blend": {
+ // equation (optional): What equation to perform on the source and destination blend values.
+ // values: "add", "sub", "revSub", "min", "max"
+ // default: "add"
+ //
+ // "subtract" and "revSubtract" are provided as aliases for "sub" and "revSub"
+ "equation": "add",
- // alpha (optional): Whether to store alpha data when drawing.
- // values: true, false
- // default: false
- "alpha": true
- },
+ // blend function parameters (optional): What factors to use in the blend function when calculating the final pixel.
+ // values: "0", "1", "srccolor", "1-srccolor", "dstcolor", "1-dstcolor", "srcalpha", "1-srcalpha", "dstalpha", "1-dstalpha"
+ // defaults (srcColor, srcAlpha): "1"
+ // defaults (dstColor, dstAlpha): "0"
+ //
+ // "zero", "one", "invsrccolor", "invdstcolor", "invsrcalpha", and "invdstalpha" are provided as aliases for "0", "1", "1-srccolor", "1-dstcolor", "1-srcalpha", and "1-dstalpha"
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+
+ // depth (required): The depth state for this effect.
+ "depth": {
+ // function (optional): The depth function to use when drawing.
+ // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always"
+ // default: "always"
+ "function": "always",
+
+ // writeenable (optional): Whether to store Z-buffer data.
+ // values: true, false
+ // default: false
+ "writeenable": false
+ },
+
+ // cull (required): The cull mode for this effect.
+ "cull": {
+ // mode (optional): What winding, if any, to cull.
+ // values: "none", "cw", "ccw"
+ // default: "ccw"
+ //
+ // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw"
+ "mode": "none"
+ },
+
+ // write (required): Write enable for color and alpha channels.
+ "write": {
+ // rgb (optional): Whether to store color data when drawing.
+ // values: true, false
+ // default: false
+ "rgb": true,
+
+ // alpha (optional): Whether to store alpha data when drawing.
+ // values: true, false
+ // default: false
+ "alpha": true
+ },
// vertex (required): The vertex shader to use when drawing.
// value: A string containing the path and name of a shader file to use, minus the extension.
- "vertex": "chains/misc/vs_blit",
+ "vertex": "chains/misc/vs_blit",
// pixel/fragment (required): The pixel or fragment shader to use when drawing.
// value: A string containing the path and name of a shader file to use, minus the extension.
- "fragment": "chains/misc/fs_blit_palette16",
-
- // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist.
- "uniforms": [
- {
- // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader.
- // value: A string containing the name of the uniform as described above.
- //
- // NOTE: Some names correspond to special values that will be automatically filled by the BGFX
- // code if they are used by the shader. These names are:
- // "u_screen_dims"
- // The dimensions of the first texture input if present, otherwise the dimensions of the output window.
- // Valid values: xy
- // "u_inv_screen_dims"
- // The reciprocal of u_screen_dims.
- // Valid values: xy
- // "u_source_dims"
- // The size, in pixels, of the screen texture incoming to the chain.
- // Valid values: xy
- // "u_rotation_type"
- // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270.
- // Valid values: x
- // "u_swap_xy"
- // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false.
- // Valid values: x
- // "u_quad_dims"
- // The dimensions, in pixels, occupied by this one screen primitive itself in the output window.
- // Valid values: xy
- // "u_tex_sizeN"
- // The dimensions, in pixels, of the texture in input pair N. Starts at 0.
- // valid values: xy
- "name": "s_tex",
+ "fragment": "chains/misc/fs_blit_palette16",
+
+ // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist.
+ "uniforms": [
+ {
+ // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader.
+ // value: A string containing the name of the uniform as described above.
+ //
+ // NOTE: Some names correspond to special values that will be automatically filled by the BGFX
+ // code if they are used by the shader. These names are:
+ // "u_screen_dims"
+ // The dimensions of the first texture input if present, otherwise the dimensions of the output window.
+ // Valid values: xy
+ // "u_inv_screen_dims"
+ // The reciprocal of u_screen_dims.
+ // Valid values: xy
+ // "u_source_dims"
+ // The size, in pixels, of the screen texture incoming to the chain.
+ // Valid values: xy
+ // "u_rotation_type"
+ // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270.
+ // Valid values: x
+ // "u_swap_xy"
+ // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false.
+ // Valid values: x
+ // "u_quad_dims"
+ // The dimensions, in pixels, occupied by this one screen primitive itself in the output window.
+ // Valid values: xy
+ // "u_tex_sizeN"
+ // The dimensions, in pixels, of the texture in input pair N. Starts at 0.
+ // valid values: xy
+ "name": "s_tex",
+
+ // type (required): The type of the uniform.
+ // values: "int", "vec4", "mat3", "mat4"
+ //
+ // Note: "int" should only be used for samplers.
+ "type": "int",
- // type (required): The type of the uniform.
- // values: "int", "vec4", "mat3", "mat4"
- //
- // Note: "int" should only be used for samplers.
- "type": "int",
-
- // values (required): The array of numbers with which to initialize the uniform.
- // value: A JSON array containin the correct amount of numbers to initialize a uniform of the
- // above-specified type. The following size rules should be followed:
- // "int": 1 float
- // "vec4": 4 floats
- // "mat3": 9 floats
- // "mat4": 16 floats
- "values": [ 1.0 ]
- },
- { "name": "s_pal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_inv_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ // values (required): The array of numbers with which to initialize the uniform.
+ // value: A JSON array containin the correct amount of numbers to initialize a uniform of the
+ // above-specified type. The following size rules should be followed:
+ // "int": 1 float
+ // "vec4": 4 floats
+ // "mat3": 9 floats
+ // "mat4": 16 floats
+ "values": [ 1.0 ]
+ },
+ { "name": "s_pal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_inv_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_inv_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/misc/deposterize-pass0.json b/bgfx/effects/misc/deposterize-pass0.json
index 73fac99de3c..c5e8efe9fc2 100644
--- a/bgfx/effects/misc/deposterize-pass0.json
+++ b/bgfx/effects/misc/deposterize-pass0.json
@@ -3,35 +3,35 @@
/*
Hyllian's Deposterize Shader - Pass0
-
+
Copyright (C) 2011/2016 Hyllian/Jararaca - sergiogdb@gmail.com
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/misc/vs_deposterize-pass0",
- "fragment": "chains/misc/fs_deposterize-pass0",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "EQ_THRESH1", "type": "vec4", "values": [ 0.01, 0.0, 0.0, 0.0 ] },
- { "name": "DIFF_THRESH1", "type": "vec4", "values": [ 0.06, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/misc/vs_deposterize-pass0",
+ "fragment": "chains/misc/fs_deposterize-pass0",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "EQ_THRESH1", "type": "vec4", "values": [ 0.01, 0.0, 0.0, 0.0 ] },
+ { "name": "DIFF_THRESH1", "type": "vec4", "values": [ 0.06, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/misc/deposterize-pass1.json b/bgfx/effects/misc/deposterize-pass1.json
index 6a62aa36753..3b7be7e9e12 100644
--- a/bgfx/effects/misc/deposterize-pass1.json
+++ b/bgfx/effects/misc/deposterize-pass1.json
@@ -3,35 +3,35 @@
/*
Hyllian's Deposterize Shader - Pass1
-
+
Copyright (C) 2011/2016 Hyllian/Jararaca - sergiogdb@gmail.com
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/misc/vs_deposterize-pass1",
- "fragment": "chains/misc/fs_deposterize-pass1",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "EQ_THRESH2", "type": "vec4", "values": [ 0.01, 0.0, 0.0, 0.0 ] },
- { "name": "DIFF_THRESH2", "type": "vec4", "values": [ 0.06, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/misc/vs_deposterize-pass1",
+ "fragment": "chains/misc/fs_deposterize-pass1",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "EQ_THRESH2", "type": "vec4", "values": [ 0.01, 0.0, 0.0, 0.0 ] },
+ { "name": "DIFF_THRESH2", "type": "vec4", "values": [ 0.06, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/misc/lut.json b/bgfx/effects/misc/lut.json
index fede670f016..eda8224ec2a 100644
--- a/bgfx/effects/misc/lut.json
+++ b/bgfx/effects/misc/lut.json
@@ -1,10 +1,10 @@
{
"blend": {
"equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
},
"depth": {
"function": "always"
diff --git a/bgfx/effects/misc/saturation.json b/bgfx/effects/misc/saturation.json
index 1708dcee6d4..bdd8fe1e6e2 100644
--- a/bgfx/effects/misc/saturation.json
+++ b/bgfx/effects/misc/saturation.json
@@ -6,25 +6,25 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/misc/vs_saturation",
- "fragment": "chains/misc/fs_saturation",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_saturation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/misc/vs_saturation",
+ "fragment": "chains/misc/fs_saturation",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_saturation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/misc/texconv_palette16.json b/bgfx/effects/misc/texconv_palette16.json
index 4fc8e169d0e..a9cee2d3f16 100644
--- a/bgfx/effects/misc/texconv_palette16.json
+++ b/bgfx/effects/misc/texconv_palette16.json
@@ -6,21 +6,23 @@
//
//===============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": { "function": "always", "writeenable": false },
- "cull": { "mode": "none" },
- "write": { "rgb": true, "alpha": true },
- "vertex": "chains/misc/vs_blit",
- "fragment": "chains/misc/fs_blit_palette16",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "s_pal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_inv_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": { "function": "always", "writeenable": false },
+ "cull": { "mode": "none" },
+ "write": { "rgb": true, "alpha": true },
+ "vertex": "chains/misc/vs_blit",
+ "fragment": "chains/misc/fs_blit_palette16",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "s_pal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_inv_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_inv_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/misc/texconv_rgb32.json b/bgfx/effects/misc/texconv_rgb32.json
index 9522eabf720..076175d7782 100644
--- a/bgfx/effects/misc/texconv_rgb32.json
+++ b/bgfx/effects/misc/texconv_rgb32.json
@@ -6,20 +6,20 @@
//
//===============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": { "function": "always", "writeenable": false },
- "cull": { "mode": "none" },
- "write": { "rgb": true, "alpha": true },
- "vertex": "chains/misc/vs_blit",
- "fragment": "chains/misc/fs_blit_rgb32",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "s_pal", "type": "int", "values": [ 1.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": { "function": "always", "writeenable": false },
+ "cull": { "mode": "none" },
+ "write": { "rgb": true, "alpha": true },
+ "vertex": "chains/misc/vs_blit",
+ "fragment": "chains/misc/fs_blit_rgb32",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "s_pal", "type": "int", "values": [ 1.0 ] }
+ ]
+}
diff --git a/bgfx/effects/misc/texconv_yuy16.json b/bgfx/effects/misc/texconv_yuy16.json
index 76ae99bfe7e..b46f996c9c2 100644
--- a/bgfx/effects/misc/texconv_yuy16.json
+++ b/bgfx/effects/misc/texconv_yuy16.json
@@ -7,21 +7,21 @@
//
//===============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": { "function": "always", "writeenable": false },
- "cull": { "mode": "none" },
- "write": { "rgb": true, "alpha": true },
- "vertex": "chains/misc/vs_blit",
- "fragment": "chains/misc/fs_blit_yuy16",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_inv_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": { "function": "always", "writeenable": false },
+ "cull": { "mode": "none" },
+ "write": { "rgb": true, "alpha": true },
+ "vertex": "chains/misc/vs_blit",
+ "fragment": "chains/misc/fs_blit_yuy16",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_inv_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/pillarbox_left_horizontal/gaussian.json b/bgfx/effects/pillarbox_left_horizontal/gaussian.json
index 4eda0b9b368..b7c2a228c53 100644
--- a/bgfx/effects/pillarbox_left_horizontal/gaussian.json
+++ b/bgfx/effects/pillarbox_left_horizontal/gaussian.json
@@ -6,27 +6,27 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/pillarbox_left_horizontal/vs_gaussian",
- "fragment": "chains/pillarbox_left_horizontal/fs_gaussian",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_dimension", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_radius", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/pillarbox_left_horizontal/vs_gaussian",
+ "fragment": "chains/pillarbox_left_horizontal/fs_gaussian",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_dimension", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_radius", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/pillarbox_left_horizontal/offset_sat.json b/bgfx/effects/pillarbox_left_horizontal/offset_sat.json
index b68e91cb8bc..2244741f8cc 100644
--- a/bgfx/effects/pillarbox_left_horizontal/offset_sat.json
+++ b/bgfx/effects/pillarbox_left_horizontal/offset_sat.json
@@ -3,32 +3,32 @@
//============================================================
//
// offset_sat.json: Applies saturation to an image.
-//
+//
// Additionally, takes only a portion of the image, as
// this instance is intended for the left-hand pillarbox
// when displaying 4:3 content on a 16:9 screen.
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/pillarbox_left_horizontal/vs_offset_sat",
- "fragment": "chains/pillarbox_left_horizontal/fs_offset_sat",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_saturation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/pillarbox_left_horizontal/vs_offset_sat",
+ "fragment": "chains/pillarbox_left_horizontal/fs_offset_sat",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_saturation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/pillarbox_left_vertical/gaussian.json b/bgfx/effects/pillarbox_left_vertical/gaussian.json
index 1db78806595..497a8421e29 100644
--- a/bgfx/effects/pillarbox_left_vertical/gaussian.json
+++ b/bgfx/effects/pillarbox_left_vertical/gaussian.json
@@ -6,27 +6,27 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/pillarbox_left_vertical/vs_gaussian",
- "fragment": "chains/pillarbox_left_vertical/fs_gaussian",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_dimension", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_radius", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/pillarbox_left_vertical/vs_gaussian",
+ "fragment": "chains/pillarbox_left_vertical/fs_gaussian",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_dimension", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_radius", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/pillarbox_left_vertical/offset_sat.json b/bgfx/effects/pillarbox_left_vertical/offset_sat.json
index 521bcc88064..19c6a141db7 100644
--- a/bgfx/effects/pillarbox_left_vertical/offset_sat.json
+++ b/bgfx/effects/pillarbox_left_vertical/offset_sat.json
@@ -3,32 +3,32 @@
//============================================================
//
// offset_sat.json: Applies saturation to an image.
-//
+//
// Additionally, takes only a portion of the image, as
// this instance is intended for the left-hand pillarbox
// when displaying 3:4 content on a 16:9 screen.
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/pillarbox_left_vertical/vs_offset_sat",
- "fragment": "chains/pillarbox_left_vertical/fs_offset_sat",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_saturation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/pillarbox_left_vertical/vs_offset_sat",
+ "fragment": "chains/pillarbox_left_vertical/fs_offset_sat",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_saturation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/pillarbox_right_horizontal/gaussian.json b/bgfx/effects/pillarbox_right_horizontal/gaussian.json
index f19af39dd71..855d79cbdb5 100644
--- a/bgfx/effects/pillarbox_right_horizontal/gaussian.json
+++ b/bgfx/effects/pillarbox_right_horizontal/gaussian.json
@@ -6,27 +6,27 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/pillarbox_right_horizontal/vs_gaussian",
- "fragment": "chains/pillarbox_right_horizontal/fs_gaussian",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_dimension", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_radius", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/pillarbox_right_horizontal/vs_gaussian",
+ "fragment": "chains/pillarbox_right_horizontal/fs_gaussian",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_dimension", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_radius", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/pillarbox_right_horizontal/offset_sat.json b/bgfx/effects/pillarbox_right_horizontal/offset_sat.json
index 019161b2cd8..75165c63625 100644
--- a/bgfx/effects/pillarbox_right_horizontal/offset_sat.json
+++ b/bgfx/effects/pillarbox_right_horizontal/offset_sat.json
@@ -3,32 +3,32 @@
//============================================================
//
// offset_sat.json: Applies saturation to an image.
-//
+//
// Additionally, takes only a portion of the image, as
// this instance is intended for the right-hand pillarbox
// when displaying 4:3 content on a 16:9 screen.
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/pillarbox_right_horizontal/vs_offset_sat",
- "fragment": "chains/pillarbox_right_horizontal/fs_offset_sat",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_saturation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/pillarbox_right_horizontal/vs_offset_sat",
+ "fragment": "chains/pillarbox_right_horizontal/fs_offset_sat",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_saturation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/pillarbox_right_vertical/gaussian.json b/bgfx/effects/pillarbox_right_vertical/gaussian.json
index b96c5b521e9..a07622b34eb 100644
--- a/bgfx/effects/pillarbox_right_vertical/gaussian.json
+++ b/bgfx/effects/pillarbox_right_vertical/gaussian.json
@@ -6,27 +6,27 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/pillarbox_right_vertical/vs_gaussian",
- "fragment": "chains/pillarbox_right_vertical/fs_gaussian",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_dimension", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_radius", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/pillarbox_right_vertical/vs_gaussian",
+ "fragment": "chains/pillarbox_right_vertical/fs_gaussian",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_dimension", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_radius", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/pillarbox_right_vertical/offset_sat.json b/bgfx/effects/pillarbox_right_vertical/offset_sat.json
index 66fab42c3e9..516c1b6be98 100644
--- a/bgfx/effects/pillarbox_right_vertical/offset_sat.json
+++ b/bgfx/effects/pillarbox_right_vertical/offset_sat.json
@@ -3,32 +3,32 @@
//============================================================
//
// offset_sat.json: Applies saturation to an image.
-//
+//
// Additionally, takes only a portion of the image, as
// this instance is intended for the right-hand pillarbox
// when displaying 3:4 content on a 16:9 screen.
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/pillarbox_right_vertical/vs_offset_sat",
- "fragment": "chains/pillarbox_right_vertical/fs_offset_sat",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_saturation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/pillarbox_right_vertical/vs_offset_sat",
+ "fragment": "chains/pillarbox_right_vertical/fs_offset_sat",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_saturation", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/screen_add.json b/bgfx/effects/screen_add.json
index ed1d6aae00c..e1603f53507 100644
--- a/bgfx/effects/screen_add.json
+++ b/bgfx/effects/screen_add.json
@@ -8,25 +8,25 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "vs_screen",
- "fragment": "fs_screen",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tint", "type": "vec4", "values": [ 1.0, 1.0, 1.0, 1.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "vs_screen",
+ "fragment": "fs_screen",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tint", "type": "vec4", "values": [ 1.0, 1.0, 1.0, 1.0 ] }
+ ]
+}
diff --git a/bgfx/effects/screen_blend.json b/bgfx/effects/screen_blend.json
index d10e119d23d..0b2226d3396 100644
--- a/bgfx/effects/screen_blend.json
+++ b/bgfx/effects/screen_blend.json
@@ -8,25 +8,25 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "vs_screen",
- "fragment": "fs_screen",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tint", "type": "vec4", "values": [ 1.0, 1.0, 1.0, 1.0 ] }
+ "blend": {
+ "equation": "add",
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "vs_screen",
+ "fragment": "fs_screen",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tint", "type": "vec4", "values": [ 1.0, 1.0, 1.0, 1.0 ] }
]
-} \ No newline at end of file
+}
diff --git a/bgfx/effects/screen_multiply.json b/bgfx/effects/screen_multiply.json
index feca7eb7ef0..93bfb90c358 100644
--- a/bgfx/effects/screen_multiply.json
+++ b/bgfx/effects/screen_multiply.json
@@ -8,25 +8,25 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "dstcolor",
- "dstColor": "0",
- "srcAlpha": "dstalpha",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "vs_screen",
- "fragment": "fs_screen",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tint", "type": "vec4", "values": [ 1.0, 1.0, 1.0, 1.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "dstcolor",
+ "dstColor": "0",
+ "srcAlpha": "dstalpha",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "vs_screen",
+ "fragment": "fs_screen",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tint", "type": "vec4", "values": [ 1.0, 1.0, 1.0, 1.0 ] }
+ ]
+}
diff --git a/bgfx/effects/screen_opaque.json b/bgfx/effects/screen_opaque.json
index 6e9dc300cde..928ffdc5462 100644
--- a/bgfx/effects/screen_opaque.json
+++ b/bgfx/effects/screen_opaque.json
@@ -8,24 +8,24 @@
//
//============================================================
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always"
- },
- "cull": { "mode": "none" },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "vs_screen",
- "fragment": "fs_screen",
- "uniforms": [
- { "name": "s_tex", "type": "int", "values": [ 1.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always"
+ },
+ "cull": { "mode": "none" },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "vs_screen",
+ "fragment": "fs_screen",
+ "uniforms": [
+ { "name": "s_tex", "type": "int", "values": [ 1.0 ] }
+ ]
+}
diff --git a/bgfx/effects/unfiltered/blit.json b/bgfx/effects/unfiltered/blit.json
index fe8d78126d2..96760fff22c 100644
--- a/bgfx/effects/unfiltered/blit.json
+++ b/bgfx/effects/unfiltered/blit.json
@@ -7,115 +7,115 @@
//============================================================
{
// blend (required): The blend state for this effect.
- "blend": {
- // equation (optional): What equation to perform on the source and destination blend values.
- // values: "add", "sub", "revSub", "min", "max"
- // default: "add"
- //
- // "subtract" and "revSubtract" are provided as aliases for "sub" and "revSub"
- "equation": "add",
-
- // blend function parameters (optional): What factors to use in the blend function when calculating the final pixel.
- // values: "0", "1", "srccolor", "1-srccolor", "dstcolor", "1-dstcolor", "srcalpha", "1-srcalpha", "dstalpha", "1-dstalpha"
- // defaults (srcColor, srcAlpha): "1"
- // defaults (dstColor, dstAlpha): "0"
- //
- // "zero", "one", "invsrccolor", "invdstcolor", "invsrcalpha", and "invdstalpha" are provided as aliases for "0", "1", "1-srccolor", "1-dstcolor", "1-srcalpha", and "1-dstalpha"
- "srcColor": "srcalpha",
- "dstColor": "1-srcalpha",
- "srcAlpha": "srcalpha",
- "dstAlpha": "1-srcalpha"
- },
-
- // depth (required): The depth state for this effect.
- "depth": {
- // function (optional): The depth function to use when drawing.
- // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always"
- // default: "always"
- "function": "always",
-
- // writeenable (optional): Whether to store Z-buffer data.
- // values: true, false
- // default: false
- "writeenable": false
- },
-
- // cull (required): The cull mode for this effect.
- "cull": {
- // mode (optional): What winding, if any, to cull.
- // values: "none", "cw", "ccw"
- // default: "ccw"
- //
- // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw"
- "mode": "none"
- },
-
- // write (required): Write enable for color and alpha channels.
- "write": {
- // rgb (optional): Whether to store color data when drawing.
- // values: true, false
- // default: false
- "rgb": true,
+ "blend": {
+ // equation (optional): What equation to perform on the source and destination blend values.
+ // values: "add", "sub", "revSub", "min", "max"
+ // default: "add"
+ //
+ // "subtract" and "revSubtract" are provided as aliases for "sub" and "revSub"
+ "equation": "add",
- // alpha (optional): Whether to store alpha data when drawing.
- // values: true, false
- // default: false
- "alpha": true
- },
+ // blend function parameters (optional): What factors to use in the blend function when calculating the final pixel.
+ // values: "0", "1", "srccolor", "1-srccolor", "dstcolor", "1-dstcolor", "srcalpha", "1-srcalpha", "dstalpha", "1-dstalpha"
+ // defaults (srcColor, srcAlpha): "1"
+ // defaults (dstColor, dstAlpha): "0"
+ //
+ // "zero", "one", "invsrccolor", "invdstcolor", "invsrcalpha", and "invdstalpha" are provided as aliases for "0", "1", "1-srccolor", "1-dstcolor", "1-srcalpha", and "1-dstalpha"
+ "srcColor": "srcalpha",
+ "dstColor": "1-srcalpha",
+ "srcAlpha": "srcalpha",
+ "dstAlpha": "1-srcalpha"
+ },
+
+ // depth (required): The depth state for this effect.
+ "depth": {
+ // function (optional): The depth function to use when drawing.
+ // values: "never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always"
+ // default: "always"
+ "function": "always",
+
+ // writeenable (optional): Whether to store Z-buffer data.
+ // values: true, false
+ // default: false
+ "writeenable": false
+ },
+
+ // cull (required): The cull mode for this effect.
+ "cull": {
+ // mode (optional): What winding, if any, to cull.
+ // values: "none", "cw", "ccw"
+ // default: "ccw"
+ //
+ // "clockwise" and "counterclockwise" are provided as aliases for "cw" and "ccw"
+ "mode": "none"
+ },
+
+ // write (required): Write enable for color and alpha channels.
+ "write": {
+ // rgb (optional): Whether to store color data when drawing.
+ // values: true, false
+ // default: false
+ "rgb": true,
+
+ // alpha (optional): Whether to store alpha data when drawing.
+ // values: true, false
+ // default: false
+ "alpha": true
+ },
// vertex (required): The vertex shader to use when drawing.
// value: A string containing the path and name of a shader file to use, minus the extension.
- "vertex": "chains/unfiltered/vs_blit",
+ "vertex": "chains/unfiltered/vs_blit",
// pixel/fragment (required): The pixel or fragment shader to use when drawing.
// value: A string containing the path and name of a shader file to use, minus the extension.
- "fragment": "chains/unfiltered/fs_blit",
-
- // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist.
- "uniforms": [
- {
- // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader.
- // value: A string containing the name of the uniform as described above.
- //
- // NOTE: Some names correspond to special values that will be automatically filled by the BGFX
- // code if they are used by the shader. These names are:
- // "u_screen_dims"
- // The dimensions of the first texture input if present, otherwise the dimensions of the output window.
- // Valid values: xy
- // "u_inv_screen_dims"
- // The reciprocal of u_screen_dims.
- // Valid values: xy
- // "u_source_dims"
- // The size, in pixels, of the screen texture incoming to the chain.
- // Valid values: xy
- // "u_rotation_type"
- // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270.
- // Valid values: x
- // "u_swap_xy"
- // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false.
- // Valid values: x
- // "u_quad_dims"
- // The dimensions, in pixels, occupied by this one screen primitive itself in the output window.
- // Valid values: xy
- // "u_tex_sizeN"
- // The dimensions, in pixels, of the texture in input pair N. Starts at 0.
- // valid values: xy
- "name": "s_tex",
+ "fragment": "chains/unfiltered/fs_blit",
+
+ // uniforms (required): The list of uniforms for this effect. Can be empty, but must exist.
+ "uniforms": [
+ {
+ // name (required): The name of the uniform, as used in either the vertex or pixel/fragment shader.
+ // value: A string containing the name of the uniform as described above.
+ //
+ // NOTE: Some names correspond to special values that will be automatically filled by the BGFX
+ // code if they are used by the shader. These names are:
+ // "u_screen_dims"
+ // The dimensions of the first texture input if present, otherwise the dimensions of the output window.
+ // Valid values: xy
+ // "u_inv_screen_dims"
+ // The reciprocal of u_screen_dims.
+ // Valid values: xy
+ // "u_source_dims"
+ // The size, in pixels, of the screen texture incoming to the chain.
+ // Valid values: xy
+ // "u_rotation_type"
+ // This screen's rotation type. 0 if ROT0, 1 if ROT90, 2 if ROT180, 3 of ROT270.
+ // Valid values: x
+ // "u_swap_xy"
+ // Whether this screen is swapped on the X and Y axes. 1 if true, 0 if false.
+ // Valid values: x
+ // "u_quad_dims"
+ // The dimensions, in pixels, occupied by this one screen primitive itself in the output window.
+ // Valid values: xy
+ // "u_tex_sizeN"
+ // The dimensions, in pixels, of the texture in input pair N. Starts at 0.
+ // valid values: xy
+ "name": "s_tex",
+
+ // type (required): The type of the uniform.
+ // values: "int", "vec4", "mat3", "mat4"
+ //
+ // Note: "int" should only be used for samplers.
+ "type": "int",
- // type (required): The type of the uniform.
- // values: "int", "vec4", "mat3", "mat4"
- //
- // Note: "int" should only be used for samplers.
- "type": "int",
-
- // values (required): The array of numbers with which to initialize the uniform.
- // value: A JSON array containin the correct amount of numbers to initialize a uniform of the
- // above-specified type. The following size rules should be followed:
- // "int": 1 float
- // "vec4": 4 floats
- // "mat3": 9 floats
- // "mat4": 16 floats
- "values": [ 1.0 ]
- }
- ]
-} \ No newline at end of file
+ // values (required): The array of numbers with which to initialize the uniform.
+ // value: A JSON array containin the correct amount of numbers to initialize a uniform of the
+ // above-specified type. The following size rules should be followed:
+ // "int": 1 float
+ // "vec4": 4 floats
+ // "mat3": 9 floats
+ // "mat4": 16 floats
+ "values": [ 1.0 ]
+ }
+ ]
+}
diff --git a/bgfx/effects/warp/dilation-horizontal-fast.json b/bgfx/effects/warp/dilation-horizontal-fast.json
index 083b07edecd..6db07750ea5 100644
--- a/bgfx/effects/warp/dilation-horizontal-fast.json
+++ b/bgfx/effects/warp/dilation-horizontal-fast.json
@@ -3,7 +3,7 @@
/*
Hyllian's dilation-horizontal-fast Shader
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,28 +27,28 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/warp/vs_dilation-horizontal-fast",
- "fragment": "chains/warp/fs_dilation-horizontal-fast",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/warp/vs_dilation-horizontal-fast",
+ "fragment": "chains/warp/fs_dilation-horizontal-fast",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json b/bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json
index cb65457ea68..124f750f5b8 100644
--- a/bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json
+++ b/bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json
@@ -3,36 +3,36 @@
/*
Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader
-
+
Copyright (C) 2011-2014 Hyllian/Jararaca - sergiogdb@gmail.com
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/super-xbr/vs_custom-jinc2-sharper",
- "fragment": "chains/xbr/super-xbr/fs_custom-jinc2-sharper",
- "uniforms": [
- { "name": "s_p", "type": "int", "values": [ 1.0 ] },
- { "name": "JINC2_WINDOW_SINC", "type": "vec4", "values": [ 0.42, 0.0, 0.0, 0.0 ] },
- { "name": "JINC2_SINC", "type": "vec4", "values": [ 0.92, 0.0, 0.0, 0.0 ] },
- { "name": "JINC2_AR_STRENGTH", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/super-xbr/vs_custom-jinc2-sharper",
+ "fragment": "chains/xbr/super-xbr/fs_custom-jinc2-sharper",
+ "uniforms": [
+ { "name": "s_p", "type": "int", "values": [ 1.0 ] },
+ { "name": "JINC2_WINDOW_SINC", "type": "vec4", "values": [ 0.42, 0.0, 0.0, 0.0 ] },
+ { "name": "JINC2_SINC", "type": "vec4", "values": [ 0.92, 0.0, 0.0, 0.0 ] },
+ { "name": "JINC2_AR_STRENGTH", "type": "vec4", "values": [ 0.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass0.json b/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass0.json
index a0e77327bb0..5985117f040 100644
--- a/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass0.json
+++ b/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass0.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR 3D Shader, pass0 *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,31 +28,31 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/super-xbr/vs_super-2xbr-3d-pass0",
- "fragment": "chains/xbr/super-xbr/fs_super-2xbr-3d-pass0",
- "uniforms": [
- { "name": "s0", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/super-xbr/vs_super-2xbr-3d-pass0",
+ "fragment": "chains/xbr/super-xbr/fs_super-2xbr-3d-pass0",
+ "uniforms": [
+ { "name": "s0", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass1.json b/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass1.json
index 1e9669c91f9..aa79d7c4bff 100644
--- a/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass1.json
+++ b/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass1.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR 3D Shader, pass1 *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,32 +28,32 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/super-xbr/vs_super-2xbr-3d-pass1",
- "fragment": "chains/xbr/super-xbr/fs_super-2xbr-3d-pass1",
- "uniforms": [
- { "name": "s0", "type": "int", "values": [ 1.0 ] },
- { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/super-xbr/vs_super-2xbr-3d-pass1",
+ "fragment": "chains/xbr/super-xbr/fs_super-2xbr-3d-pass1",
+ "uniforms": [
+ { "name": "s0", "type": "int", "values": [ 1.0 ] },
+ { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass2.json b/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass2.json
index 86dad8cd5bd..971c566700a 100644
--- a/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass2.json
+++ b/bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass2.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR 3D Shader, pass2 *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,32 +28,32 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/super-xbr/vs_super-2xbr-3d-pass2",
- "fragment": "chains/xbr/super-xbr/fs_super-2xbr-3d-pass2",
- "uniforms": [
- { "name": "s0", "type": "int", "values": [ 1.0 ] },
- { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/super-xbr/vs_super-2xbr-3d-pass2",
+ "fragment": "chains/xbr/super-xbr/fs_super-2xbr-3d-pass2",
+ "uniforms": [
+ { "name": "s0", "type": "int", "values": [ 1.0 ] },
+ { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass0.json b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass0.json
index fccbdaf32db..7dc86e9bc72 100644
--- a/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass0.json
+++ b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass0.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super 4XBR 3D Shader - pass0 *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,31 +28,31 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/super-xbr/vs_super-4xbr-3d-pass0",
- "fragment": "chains/xbr/super-xbr/fs_super-4xbr-3d-pass0",
- "uniforms": [
- { "name": "s0", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/super-xbr/vs_super-4xbr-3d-pass0",
+ "fragment": "chains/xbr/super-xbr/fs_super-4xbr-3d-pass0",
+ "uniforms": [
+ { "name": "s0", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass1.json b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass1.json
index 1f0492ee3c3..5ddeecd317c 100644
--- a/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass1.json
+++ b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass1.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super 4XBR 3D Shader - pass0 *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,32 +28,32 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/super-xbr/vs_super-4xbr-3d-pass1",
- "fragment": "chains/xbr/super-xbr/fs_super-4xbr-3d-pass1",
- "uniforms": [
- { "name": "s0", "type": "int", "values": [ 1.0 ] },
- { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/super-xbr/vs_super-4xbr-3d-pass1",
+ "fragment": "chains/xbr/super-xbr/fs_super-4xbr-3d-pass1",
+ "uniforms": [
+ { "name": "s0", "type": "int", "values": [ 1.0 ] },
+ { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass2.json b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass2.json
index 665f455e662..366d1439deb 100644
--- a/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass2.json
+++ b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass2.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super 4XBR 3D Shader - pass0 *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,31 +28,31 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/super-xbr/vs_super-4xbr-3d-pass2",
- "fragment": "chains/xbr/super-xbr/fs_super-4xbr-3d-pass2",
- "uniforms": [
- { "name": "s0", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/super-xbr/vs_super-4xbr-3d-pass2",
+ "fragment": "chains/xbr/super-xbr/fs_super-4xbr-3d-pass2",
+ "uniforms": [
+ { "name": "s0", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass3.json b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass3.json
index e33bc2ebb61..34b228a09b5 100644
--- a/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass3.json
+++ b/bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass3.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super 4XBR 3D Shader - pass0 *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,32 +28,32 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/super-xbr/vs_super-4xbr-3d-pass3",
- "fragment": "chains/xbr/super-xbr/fs_super-4xbr-3d-pass3",
- "uniforms": [
- { "name": "s0", "type": "int", "values": [ 1.0 ] },
- { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/super-xbr/vs_super-4xbr-3d-pass3",
+ "fragment": "chains/xbr/super-xbr/fs_super-4xbr-3d-pass3",
+ "uniforms": [
+ { "name": "s0", "type": "int", "values": [ 1.0 ] },
+ { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass0.json b/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass0.json
index bd3d511cc98..a19662e5d88 100644
--- a/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass0.json
+++ b/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass0.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR Shader, Fast (pass0) *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,31 +28,31 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/super-xbr/vs_super-xbr-fast-pass0",
- "fragment": "chains/xbr/super-xbr/fs_super-xbr-fast-pass0",
- "uniforms": [
- { "name": "s0", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/super-xbr/vs_super-xbr-fast-pass0",
+ "fragment": "chains/xbr/super-xbr/fs_super-xbr-fast-pass0",
+ "uniforms": [
+ { "name": "s0", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass1.json b/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass1.json
index 4b65ac60ba4..4ee5ee1883e 100644
--- a/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass1.json
+++ b/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass1.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR Shader, Fast (pass1) *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,31 +28,31 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/super-xbr/vs_super-xbr-fast-pass1",
- "fragment": "chains/xbr/super-xbr/fs_super-xbr-fast-pass1",
- "uniforms": [
- { "name": "s0", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/super-xbr/vs_super-xbr-fast-pass1",
+ "fragment": "chains/xbr/super-xbr/fs_super-xbr-fast-pass1",
+ "uniforms": [
+ { "name": "s0", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass2.json b/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass2.json
index f3ce83b4272..66a6bfd119c 100644
--- a/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass2.json
+++ b/bgfx/effects/xbr/super-xbr/super-xbr-fast-pass2.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR Shader, Fast (pass2) *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,31 +28,31 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/super-xbr/vs_super-xbr-fast-pass2",
- "fragment": "chains/xbr/super-xbr/fs_super-xbr-fast-pass2",
- "uniforms": [
- { "name": "s0", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/super-xbr/vs_super-xbr-fast-pass2",
+ "fragment": "chains/xbr/super-xbr/fs_super-xbr-fast-pass2",
+ "uniforms": [
+ { "name": "s0", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/super-xbr/super-xbr-pass0.json b/bgfx/effects/xbr/super-xbr/super-xbr-pass0.json
index c7d1db28110..4ac9b63240f 100644
--- a/bgfx/effects/xbr/super-xbr/super-xbr-pass0.json
+++ b/bgfx/effects/xbr/super-xbr/super-xbr-pass0.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR Shader *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,31 +28,31 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/super-xbr/vs_super-xbr-pass0",
- "fragment": "chains/xbr/super-xbr/fs_super-xbr-pass0",
- "uniforms": [
- { "name": "s0", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/super-xbr/vs_super-xbr-pass0",
+ "fragment": "chains/xbr/super-xbr/fs_super-xbr-pass0",
+ "uniforms": [
+ { "name": "s0", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/super-xbr/super-xbr-pass1.json b/bgfx/effects/xbr/super-xbr/super-xbr-pass1.json
index 13e8f8dbd9a..8fca027bee5 100644
--- a/bgfx/effects/xbr/super-xbr/super-xbr-pass1.json
+++ b/bgfx/effects/xbr/super-xbr/super-xbr-pass1.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR Shader *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,32 +28,32 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/super-xbr/vs_super-xbr-pass1",
- "fragment": "chains/xbr/super-xbr/fs_super-xbr-pass1",
- "uniforms": [
- { "name": "s0", "type": "int", "values": [ 1.0 ] },
- { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/super-xbr/vs_super-xbr-pass1",
+ "fragment": "chains/xbr/super-xbr/fs_super-xbr-pass1",
+ "uniforms": [
+ { "name": "s0", "type": "int", "values": [ 1.0 ] },
+ { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/super-xbr/super-xbr-pass2.json b/bgfx/effects/xbr/super-xbr/super-xbr-pass2.json
index bea988632cf..6b4be14029d 100644
--- a/bgfx/effects/xbr/super-xbr/super-xbr-pass2.json
+++ b/bgfx/effects/xbr/super-xbr/super-xbr-pass2.json
@@ -2,9 +2,9 @@
// copyright-holders:Hyllian
/*
-
+
******* Super XBR Shader *******
-
+
Copyright (c) 2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,31 +28,31 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/super-xbr/vs_super-xbr-pass2",
- "fragment": "chains/xbr/super-xbr/fs_super-xbr-pass2",
- "uniforms": [
- { "name": "s0", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/super-xbr/vs_super-xbr-pass2",
+ "fragment": "chains/xbr/super-xbr/fs_super-xbr-pass2",
+ "uniforms": [
+ { "name": "s0", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EDGE_STR", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_WEIGHT", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_ANTI_RINGING", "type": "vec4", "values": [ 1.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-sharp.json b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-sharp.json
index 8015f3a3ca2..946fcc690b8 100644
--- a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-sharp.json
+++ b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-sharp.json
@@ -3,33 +3,33 @@
/*
Hyllian's 2xBR v3.7c+ReverseAA (squared) Shader
-
+
Copyright (C) 2011/2012 Hyllian/Jararaca - sergiogdb@gmail.com
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid-sharp",
- "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid-sharp",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid-sharp",
+ "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid-sharp",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v2-gamma.json b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v2-gamma.json
index 3a30413f703..2983832c94e 100644
--- a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v2-gamma.json
+++ b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v2-gamma.json
@@ -3,33 +3,33 @@
/*
Hyllian's 2xBR v3.8c+ReverseAA (squared) Shader - beta1
-
+
Copyright (C) 2011/2012 Hyllian/Jararaca - sergiogdb@gmail.com
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2-gamma",
- "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2-gamma",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2-gamma",
+ "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2-gamma",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v2.json b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v2.json
index 3045dbd65b2..8de360f9eb8 100644
--- a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v2.json
+++ b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v2.json
@@ -3,33 +3,33 @@
/*
Hyllian's 2xBR v3.8c+ReverseAA (squared) Shader - Dithering preserved
-
+
Copyright (C) 2011/2012 Hyllian/Jararaca - sergiogdb@gmail.com
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2",
- "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2",
+ "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4-gamma.json b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4-gamma.json
index 2a285ea176c..2baacce4369 100644
--- a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4-gamma.json
+++ b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4-gamma.json
@@ -3,33 +3,33 @@
/*
Hyllian's 2xBR v3.8c+ReverseAA (squared) Shader - beta3
-
+
Copyright (C) 2011/2012 Hyllian/Jararaca - sergiogdb@gmail.com
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4-gamma",
- "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4-gamma",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4-gamma",
+ "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4-gamma",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4.json b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4.json
index 961fee7922a..a04487306f0 100644
--- a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4.json
+++ b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4.json
@@ -3,33 +3,33 @@
/*
Hyllian's 2xBR v3.8c+ReverseAA (squared) Shader - v4
-
+
Copyright (C) 2011/2012 Hyllian/Jararaca - sergiogdb@gmail.com
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4",
- "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4",
+ "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4b.json b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4b.json
index e5c5e18c18f..31d86e690b8 100644
--- a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4b.json
+++ b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4b.json
@@ -3,33 +3,33 @@
/*
Hyllian's 2xBR v3.8b+ReverseAA (semi-rounded) Shader - v4
-
+
Copyright (C) 2011/2012 Hyllian/Jararaca - sergiogdb@gmail.com
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4b",
- "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4b",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4b",
+ "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4b",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v5-gamma.json b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v5-gamma.json
index 38abe1e0d0b..e4dac4b9782 100644
--- a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v5-gamma.json
+++ b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v5-gamma.json
@@ -3,33 +3,33 @@
/*
Hyllian's 2xBR v3.8c+ReverseAA (squared) Shader - beta3
-
+
Copyright (C) 2011/2012 Hyllian/Jararaca - sergiogdb@gmail.com
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v5-gamma",
- "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v5-gamma",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v5-gamma",
+ "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v5-gamma",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid.json b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid.json
index b23528caafd..1f810bf23cb 100644
--- a/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid.json
+++ b/bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid.json
@@ -3,33 +3,33 @@
/*
Hyllian's 2xBR v3.7c+ReverseAA (squared) Shader
-
+
Copyright (C) 2011/2012 Hyllian/Jararaca - sergiogdb@gmail.com
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid",
- "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-hybrid/vs_2xbr-hybrid",
+ "fragment": "chains/xbr/xbr-hybrid/fs_2xbr-hybrid",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv1-noblend.json b/bgfx/effects/xbr/xbr-lv1-noblend.json
index 8bca60452e6..890e934e3b2 100644
--- a/bgfx/effects/xbr/xbr-lv1-noblend.json
+++ b/bgfx/effects/xbr/xbr-lv1-noblend.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR-lv1-noblend Shader
-
+
Copyright (C) 2011-2014 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,30 +27,30 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/vs_xbr-lv1-noblend",
- "fragment": "chains/xbr/fs_xbr-lv1-noblend",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_Y_WEIGHT", "type": "vec4", "values": [ 48.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 15.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/vs_xbr-lv1-noblend",
+ "fragment": "chains/xbr/fs_xbr-lv1-noblend",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_Y_WEIGHT", "type": "vec4", "values": [ 48.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 15.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv2-3d.json b/bgfx/effects/xbr/xbr-lv2-3d.json
index e4b6146ed2a..2d3e28d0d5b 100644
--- a/bgfx/effects/xbr/xbr-lv2-3d.json
+++ b/bgfx/effects/xbr/xbr-lv2-3d.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR-lv2-3d Shader
-
+
Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,34 +27,34 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/vs_xbr-lv2-3d",
- "fragment": "chains/xbr/fs_xbr-lv2-3d",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_SCALE", "type": "vec4", "values": [ 3.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_Y_WEIGHT", "type": "vec4", "values": [ 48.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 15.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_LV1_COEFFICIENT", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_LV2_COEFFICIENT", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_RES", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/vs_xbr-lv2-3d",
+ "fragment": "chains/xbr/fs_xbr-lv2-3d",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_SCALE", "type": "vec4", "values": [ 3.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_Y_WEIGHT", "type": "vec4", "values": [ 48.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 15.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_LV1_COEFFICIENT", "type": "vec4", "values": [ 0.5, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_LV2_COEFFICIENT", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_RES", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv2-fast.json b/bgfx/effects/xbr/xbr-lv2-fast.json
index e3ce6fb1f4c..1b1b4b593ad 100644
--- a/bgfx/effects/xbr/xbr-lv2-fast.json
+++ b/bgfx/effects/xbr/xbr-lv2-fast.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR-lv2-lq Shader
-
+
Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,32 +27,32 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/vs_xbr-lv2-fast",
- "fragment": "chains/xbr/fs_xbr-lv2-fast",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_SCALE", "type": "vec4", "values": [ 4.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_Y_WEIGHT", "type": "vec4", "values": [ 48.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 25.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_LV2_COEFFICIENT", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/vs_xbr-lv2-fast",
+ "fragment": "chains/xbr/fs_xbr-lv2-fast",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_SCALE", "type": "vec4", "values": [ 4.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_Y_WEIGHT", "type": "vec4", "values": [ 48.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 25.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_LV2_COEFFICIENT", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-a-pass0.json b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-a-pass0.json
index f77141d0128..b2f4668b45f 100644
--- a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-a-pass0.json
+++ b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-a-pass0.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR LV2 A (squared) - pass0 Shader
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,28 +27,28 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-a-pass0",
- "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-a-pass0",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-a-pass0",
+ "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-a-pass0",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-accuracy-pass0.json b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-accuracy-pass0.json
index 809ec9cc5d6..f900518f72d 100644
--- a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-accuracy-pass0.json
+++ b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-accuracy-pass0.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR LV2 Accuracy - pass0 Shader
-
+
Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,30 +27,30 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass0",
- "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass0",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 4.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_LV2_COEFFICIENT", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass0",
+ "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass0",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 4.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_LV2_COEFFICIENT", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-accuracy-pass1.json b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-accuracy-pass1.json
index 06dc01021a5..32fc96476d9 100644
--- a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-accuracy-pass1.json
+++ b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-accuracy-pass1.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR LV2 Accuracy - pass0 Shader
-
+
Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,31 +27,31 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass0",
- "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass0",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_SCALE", "type": "vec4", "values": [ 4.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass0",
+ "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass0",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_SCALE", "type": "vec4", "values": [ 4.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-b-pass0.json b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-b-pass0.json
index 8ba8832f545..7a6a60045e2 100644
--- a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-b-pass0.json
+++ b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-b-pass0.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR LV2 A (squared) - pass0 Shader
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,28 +27,28 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-b-pass0",
- "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-b-pass0",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-b-pass0",
+ "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-b-pass0",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-c-pass0.json b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-c-pass0.json
index 16872129ef3..c9e93b92e07 100644
--- a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-c-pass0.json
+++ b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-c-pass0.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR LV2 A (squared) - pass0 Shader
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,28 +27,28 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-c-pass0",
- "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-c-pass0",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-c-pass0",
+ "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-c-pass0",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-d-pass0.json b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-d-pass0.json
index 758a21b2619..9979b3d11b6 100644
--- a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-d-pass0.json
+++ b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-d-pass0.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR LV2 A (squared) - pass0 Shader
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,28 +27,28 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-d-pass0",
- "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-d-pass0",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-d-pass0",
+ "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-d-pass0",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-noblend-pass1.json b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-noblend-pass1.json
index f57bd18eda5..edf4ead94ed 100644
--- a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-noblend-pass1.json
+++ b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-noblend-pass1.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR LV2 - noblend - pass1 Shader
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,30 +27,30 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-noblend-pass1",
- "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-noblend-pass1",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-noblend-pass1",
+ "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-noblend-pass1",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-pass1.json b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-pass1.json
index d5613e293cd..0b6938a4e77 100644
--- a/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-pass1.json
+++ b/bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-pass1.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR LV2 - pass1 Shader
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,31 +27,31 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-pass1",
- "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-pass1",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_target_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-pass1",
+ "fragment": "chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-pass1",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_target_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv2-noblend.json b/bgfx/effects/xbr/xbr-lv2-noblend.json
index 41695ff888f..8ea58baffe2 100644
--- a/bgfx/effects/xbr/xbr-lv2-noblend.json
+++ b/bgfx/effects/xbr/xbr-lv2-noblend.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR-lv2-noblend Shader
-
+
Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,30 +27,30 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/vs_xbr-lv2-noblend",
- "fragment": "chains/xbr/fs_xbr-lv2-noblend",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_LV2_COEFFICIENT", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/vs_xbr-lv2-noblend",
+ "fragment": "chains/xbr/fs_xbr-lv2-noblend",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 0.6, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_LV2_COEFFICIENT", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv2.json b/bgfx/effects/xbr/xbr-lv2.json
index 58e451ddeca..c974920b334 100644
--- a/bgfx/effects/xbr/xbr-lv2.json
+++ b/bgfx/effects/xbr/xbr-lv2.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR-lv2 Shader
-
+
Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,32 +27,32 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/vs_xbr-lv2",
- "fragment": "chains/xbr/fs_xbr-lv2",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_SCALE", "type": "vec4", "values": [ 4.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_Y_WEIGHT", "type": "vec4", "values": [ 48.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 25.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_LV2_COEFFICIENT", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/vs_xbr-lv2",
+ "fragment": "chains/xbr/fs_xbr-lv2",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_SCALE", "type": "vec4", "values": [ 4.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_Y_WEIGHT", "type": "vec4", "values": [ 48.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 25.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_LV2_COEFFICIENT", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv3-multipass/xbr-lv3-pass0.json b/bgfx/effects/xbr/xbr-lv3-multipass/xbr-lv3-pass0.json
index 39daf68c665..ad9d884cc16 100644
--- a/bgfx/effects/xbr/xbr-lv3-multipass/xbr-lv3-pass0.json
+++ b/bgfx/effects/xbr/xbr-lv3-multipass/xbr-lv3-pass0.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR level 3 pass0 Shader
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,28 +27,28 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass0",
- "fragment": "chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass0",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass0",
+ "fragment": "chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass0",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv3-multipass/xbr-lv3-pass1.json b/bgfx/effects/xbr/xbr-lv3-multipass/xbr-lv3-pass1.json
index 04afb26b417..a7bafa1205f 100644
--- a/bgfx/effects/xbr/xbr-lv3-multipass/xbr-lv3-pass1.json
+++ b/bgfx/effects/xbr/xbr-lv3-multipass/xbr-lv3-pass1.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR level 3 pass1 Shader
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,31 +27,31 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass1",
- "fragment": "chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass1",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_target_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass1",
+ "fragment": "chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass1",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_target_dims", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv3-noblend.json b/bgfx/effects/xbr/xbr-lv3-noblend.json
index 8a2965646c9..319a8db5a90 100644
--- a/bgfx/effects/xbr/xbr-lv3-noblend.json
+++ b/bgfx/effects/xbr/xbr-lv3-noblend.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR-lv3-noblend - Shader
-
+
Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,31 +28,31 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/vs_xbr-lv3-noblend",
- "fragment": "chains/xbr/fs_xbr-lv3-noblend",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 10.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_EQ_THRESHOLD2", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_LV2_COEFFICIENT", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/vs_xbr-lv3-noblend",
+ "fragment": "chains/xbr/fs_xbr-lv3-noblend",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 10.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_EQ_THRESHOLD2", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_LV2_COEFFICIENT", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-lv3.json b/bgfx/effects/xbr/xbr-lv3.json
index bcbf6e1f48b..60498cba169 100644
--- a/bgfx/effects/xbr/xbr-lv3.json
+++ b/bgfx/effects/xbr/xbr-lv3.json
@@ -6,7 +6,7 @@
/*
Hyllian's xBR-lv3 Shader
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -31,32 +31,32 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/vs_xbr-lv3",
- "fragment": "chains/xbr/fs_xbr-lv3",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "XBR_Y_WEIGHT", "type": "vec4", "values": [ 48.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 10.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_EQ_THRESHOLD2", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "XBR_LV2_COEFFICIENT", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/vs_xbr-lv3",
+ "fragment": "chains/xbr/fs_xbr-lv3",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "XBR_Y_WEIGHT", "type": "vec4", "values": [ 48.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_EQ_THRESHOLD", "type": "vec4", "values": [ 10.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_EQ_THRESHOLD2", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "XBR_LV2_COEFFICIENT", "type": "vec4", "values": [ 2.0, 0.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass1.json b/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass1.json
index fd313a73eca..20d2d41840d 100644
--- a/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass1.json
+++ b/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass1.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR MultiLevel4 Shader - Pass1
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,28 +27,28 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass1",
- "fragment": "chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass1",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass1",
+ "fragment": "chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass1",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass2.json b/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass2.json
index 8d25c90ed0f..c57fb7ba331 100644
--- a/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass2.json
+++ b/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass2.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR MultiLevel4 Shader - Pass2
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,28 +27,28 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass2",
- "fragment": "chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass2",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass2",
+ "fragment": "chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass2",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass3.json b/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass3.json
index 7e862e66664..ba9b179d39a 100644
--- a/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass3.json
+++ b/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass3.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR MultiLevel4 Shader - Pass3
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,29 +27,29 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass3",
- "fragment": "chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass3",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
- { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass3",
+ "fragment": "chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass3",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass4.json b/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass4.json
index 7323c3b8960..0547b5eef8b 100644
--- a/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass4.json
+++ b/bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass4.json
@@ -3,7 +3,7 @@
/*
Hyllian's xBR MultiLevel4 Shader - Pass4
-
+
Copyright (C) 2011-2015 Hyllian - sergiogdb@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,30 +27,30 @@
*/
{
- "blend": {
- "equation": "add",
- "srcColor": "1",
- "dstColor": "0",
- "srcAlpha": "1",
- "dstAlpha": "0"
- },
- "depth": {
- "function": "always",
- "writeenable": false
- },
- "cull": {
- "mode": "none"
- },
- "write": {
- "rgb": true,
- "alpha": true
- },
- "vertex": "chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass4",
- "fragment": "chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass4",
- "uniforms": [
- { "name": "decal", "type": "int", "values": [ 1.0 ] },
- { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
- { "name": "u_target_size", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
- { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
- ]
-} \ No newline at end of file
+ "blend": {
+ "equation": "add",
+ "srcColor": "1",
+ "dstColor": "0",
+ "srcAlpha": "1",
+ "dstAlpha": "0"
+ },
+ "depth": {
+ "function": "always",
+ "writeenable": false
+ },
+ "cull": {
+ "mode": "none"
+ },
+ "write": {
+ "rgb": true,
+ "alpha": true
+ },
+ "vertex": "chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass4",
+ "fragment": "chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass4",
+ "uniforms": [
+ { "name": "decal", "type": "int", "values": [ 1.0 ] },
+ { "name": "ORIG_texture", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_target_size", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
+ ]
+}
diff --git a/bgfx/shaders/dx11/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/dx11/chains/misc/fs_blit_palette16.bin
index 3f7949c9e32..b657355a35d 100644
--- a/bgfx/shaders/dx11/chains/misc/fs_blit_palette16.bin
+++ b/bgfx/shaders/dx11/chains/misc/fs_blit_palette16.bin
Binary files differ
diff --git a/bgfx/shaders/dx11/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/dx11/chains/misc/fs_blit_yuy16.bin
index f3e17c242ff..c5c1a04503b 100644
--- a/bgfx/shaders/dx11/chains/misc/fs_blit_yuy16.bin
+++ b/bgfx/shaders/dx11/chains/misc/fs_blit_yuy16.bin
Binary files differ
diff --git a/bgfx/shaders/dx9/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/dx9/chains/misc/fs_blit_palette16.bin
index ea5991e396f..aeacf8597cb 100644
--- a/bgfx/shaders/dx9/chains/misc/fs_blit_palette16.bin
+++ b/bgfx/shaders/dx9/chains/misc/fs_blit_palette16.bin
Binary files differ
diff --git a/bgfx/shaders/dx9/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/dx9/chains/misc/fs_blit_yuy16.bin
index 5f6e1dd1c30..ff4eb14787c 100644
--- a/bgfx/shaders/dx9/chains/misc/fs_blit_yuy16.bin
+++ b/bgfx/shaders/dx9/chains/misc/fs_blit_yuy16.bin
Binary files differ
diff --git a/bgfx/shaders/essl/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/essl/chains/misc/fs_blit_palette16.bin
index e0af67bf014..f2465371ee1 100644
--- a/bgfx/shaders/essl/chains/misc/fs_blit_palette16.bin
+++ b/bgfx/shaders/essl/chains/misc/fs_blit_palette16.bin
Binary files differ
diff --git a/bgfx/shaders/essl/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/essl/chains/misc/fs_blit_yuy16.bin
index 6b413551651..9eb3444235e 100644
--- a/bgfx/shaders/essl/chains/misc/fs_blit_yuy16.bin
+++ b/bgfx/shaders/essl/chains/misc/fs_blit_yuy16.bin
Binary files differ
diff --git a/bgfx/shaders/glsl/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/glsl/chains/misc/fs_blit_palette16.bin
index 952107ab982..5ba91eeec94 100644
--- a/bgfx/shaders/glsl/chains/misc/fs_blit_palette16.bin
+++ b/bgfx/shaders/glsl/chains/misc/fs_blit_palette16.bin
Binary files differ
diff --git a/bgfx/shaders/glsl/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/glsl/chains/misc/fs_blit_yuy16.bin
index 27e3b6b515b..f3624bdabb0 100644
--- a/bgfx/shaders/glsl/chains/misc/fs_blit_yuy16.bin
+++ b/bgfx/shaders/glsl/chains/misc/fs_blit_yuy16.bin
Binary files differ
diff --git a/bgfx/shaders/metal/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/metal/chains/misc/fs_blit_palette16.bin
index b08396630f2..a4c3d3f0d09 100644
--- a/bgfx/shaders/metal/chains/misc/fs_blit_palette16.bin
+++ b/bgfx/shaders/metal/chains/misc/fs_blit_palette16.bin
Binary files differ
diff --git a/bgfx/shaders/metal/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/metal/chains/misc/fs_blit_yuy16.bin
index d1a60d6f578..8ba7e23dfe1 100644
--- a/bgfx/shaders/metal/chains/misc/fs_blit_yuy16.bin
+++ b/bgfx/shaders/metal/chains/misc/fs_blit_yuy16.bin
Binary files differ
diff --git a/bgfx/shaders/spirv/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/spirv/chains/misc/fs_blit_palette16.bin
index ec938478045..cd464ab3b48 100644
--- a/bgfx/shaders/spirv/chains/misc/fs_blit_palette16.bin
+++ b/bgfx/shaders/spirv/chains/misc/fs_blit_palette16.bin
Binary files differ
diff --git a/bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.bin
index 38de3733131..c4e6b56eb8c 100644
--- a/bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.bin
+++ b/bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.bin
Binary files differ
diff --git a/docs/source/techspecs/index.rst b/docs/source/techspecs/index.rst
index 37d37c73479..40d4048e522 100644
--- a/docs/source/techspecs/index.rst
+++ b/docs/source/techspecs/index.rst
@@ -20,3 +20,4 @@ MAME’s source or working on scripts that run within the MAME framework.
luaengine
luareference
m6502
+ poly_manager
diff --git a/docs/source/techspecs/poly_manager.rst b/docs/source/techspecs/poly_manager.rst
new file mode 100644
index 00000000000..e86cf481428
--- /dev/null
+++ b/docs/source/techspecs/poly_manager.rst
@@ -0,0 +1,1084 @@
+Software 3D Rendering in MAME
+=============================
+
+.. contents:: :local:
+
+
+Background
+----------
+
+Beginning in the late 1980s, many arcade games began incorporating hardware-rendered
+3D graphics into their video. These 3D graphics are typically rendered from low-level
+primitives into a frame buffer (usually double- or triple-buffered), then perhaps
+combined with traditional tilemaps or sprites, before being presented to the player.
+
+When it comes to emulating 3D games, there are two general approaches. The first
+approach is to leverage modern 3D hardware by mapping the low-level primitives onto
+modern equivalents. For a cross-platform emulator like MAME, this requires having an
+API that is flexible enough to describe the primitives and all their associated
+behaviors with high accuracy. It also requires the emulator to be able to read back
+from the rendered frame buffer (since many games do this) and combine it with other
+elements, in a way that is properly synchronized with background rendering.
+
+The alternative approach is to render the low-level primitives directly in software.
+This has the advantage of being able to achieve pretty much any behavior exhibited by
+the original hardware, but at the cost of speed. In MAME, since all emulation happens
+on one thread, this is particularly painful. However, just as with the 3D hardware
+approach, in theory a software-based approach could be spun off to other threads to
+handle the work, as long as mechanisms were present to synchronize when necessary,
+for example, when reading/writing directly to/from the frame buffer.
+
+For the time being, MAME has opted for the second approach, leveraging a templated
+helper class called **poly_manager** to handle common situations.
+
+
+Concepts
+--------
+
+At its core, **poly_manager** is a mechanism to support multi-threaded rendering of
+low-level 3D primitives. Callers provide **poly_manager** with a set of *vertices* for a
+primitive plus a *render callback*. **poly_manager** breaks the primitive into
+clipped scanline *extents* and distributes the work among a pool of *worker
+threads*. The render callback is then called on the worker thread for each extent,
+where game-specific logic can do whatever needs to happen to render the data.
+
+One key responsibility that **poly_manager** takes care of is ensuring order. Given a
+pool of threads and a number of work items to complete, it is important that—at least
+within a given scanline—all work is performed serially in order. The basic approach is
+to assign each extent to a *bucket* based on the Y coordinate. **poly_manager** then ensures
+that only one worker thread at a time is responsible for processing work in a given bucket.
+
+Vertices in **poly_manager** consist of simple 2D X and Y *coordinates*, plus zero or
+more additional *iterated parameters*. These iterated parameters can be anything: intensity
+values for lighting; RGB(A) colors for Gouraud shading; normalized U, V coordinates for
+texture mapping; 1/Z values for Z buffering; etc. Iterated parameters, regardless of what
+they represent, are interpolated linearly across the primitive in screen space and provided
+as part of the extent to the render callback.
+
+
+ObjectType
+~~~~~~~~~~
+
+When creating a **poly_manager** class, you must provide it a special type that you define,
+known as **ObjectType**.
+
+Because rendering happens asynchronously on worker threads, the idea is that the
+**ObjectType** class will hold a snapshot of all the relevant data needed for rendering.
+This allows the main thread to proceed—potentially modifying some of the relevant state—while
+rendering happens elsewhere.
+
+In theory, we could allocate a new **ObjectType** class for each primitive rendered;
+however, that would be rather inefficient. It is quite common to set up the rendering
+state and then render several primitives using the same state.
+
+For this reason, **poly_manager** maintains an internal array of **ObjectType** objects and
+keeps a copy of the last **ObjectType** used. Before submitting a new primitive, callers
+can see if the rendering state has changed. If it has, it can ask **poly_manager** to allocate
+a new **ObjectType** class and fill it in. When the primitive is submitted for rendering, the
+most recently allocated **ObjectType** instance is implicitly captured and provided to the
+render callbacks.
+
+For more complex scenarios, where data might change even more infrequently, there is a
+**poly_array** template, which can be used to manage data in a similar way. In fact,
+internally **poly_manager** uses the **poly_array** class to manage its **ObjectType**
+allocations. More information on the **poly_array** class is provided later.
+
+
+
+Primitives
+~~~~~~~~~~
+
+**poly_manager** supports several different types of primitives:
+
+* The most commonly-used primitive in **poly_manager** is the *triangle*, which has the
+ nice property that iterated parameters have constant deltas across the full surface.
+ Arbitrary-length *triangle fans* and *triangle strips* are also supported.
+
+* In addition to triangles, **poly_manager** also supports *polygons* with an arbitrary
+ number of vertices. The list of vertices is expected to be in either clockwise or
+ anticlockwise order. **poly_manager** will walk the edges to compute deltas across
+ each extent.
+
+* As a special case, **poly_manager** supports a *tile* primitive, which is a simple quad
+ defined by two vertices, a top-left vertex and a bottom-right vertex. Like triangles,
+ tiles have constant iterated parameter deltas across their surface.
+
+* Finally, **poly_manager** supports a fully custom mechanism where the caller provides
+ a list of extents that are more or less fed directly to the worker threads.
+ This is useful if emulating a system that has unusual primitives or requires highly
+ specific behaviors for its edges.
+
+
+Synchronization
+~~~~~~~~~~~~~~~
+
+One of the key requirements of providing an asynchronous rendering mechanism is
+synchronization. Synchronization in **poly_manager** is super simple: just
+call the ``wait()`` function.
+
+There are several common reasons for issuing a wait:
+
+* At display time, the pixel data must be copied to the screen. If any primitives were
+ queued which touch the portion of the display that is going to be shown, you need to
+ wait for rendering to be complete before copying. Note that this wait may not be
+ strictly necessary in some situations (for example, a triple-buffered system).
+
+* If the emulated system has a mechanism to read back from the framebuffer after
+ rendering, then a wait must be issued prior to the read in order to ensure that
+ asynchronous rendering is complete.
+
+* If the emulated system modifies any state that is not cached in the **ObjectType**
+ or elsewhere (for example, texture memory), then a wait must be issued to ensure
+ that pending primitives which might consume that state have finished their work.
+
+* If the emulated system can use a previous render target as, say, the texture source
+ for a new primitive, then submitting the second primitive must wait until the first
+ completes. **poly_manager** provides no internal mechanism to help detect this, so it
+ is on the caller to determine when or if this is necessary.
+
+Because the wait operation knows after it is done that all rendering is complete,
+**poly_manager** also takes this opportunity to reclaim all memory allocated for its
+internal structures, as well as memory allocated for **ObjectType** structures. Thus it is
+important that you don’t hang onto any **ObjectType** pointers after a wait is called.
+
+
+The poly_manager class
+----------------------
+
+In most applications, **poly_manager** is not used directly, but rather serves as
+the base class for a more complete rendering class. The **poly_manager** class
+itself is a template::
+
+ template<typename BaseType, class ObjectType, int MaxParams, u8 Flags = 0>
+ class poly_manager;
+
+and the template parameters are:
+
+* **BaseType** is the type used internally for coordinates and iterated parameters, and
+ should generally be either ``float`` or ``double``. In theory, a fixed-point integral
+ type could also be used, though the math logic has not been designed for that, so you
+ may encounter problems.
+
+* **ObjectType** is the user-defined per-object data structure described above.
+ Internally, **poly_manager** will manage a **poly_array** of these, and a pointer to
+ the most-recently allocated one at the time a primitive is submitted will be implicitly
+ passed to the render callback for each corresponding extent.
+
+* **MaxParams** is the maximum number of iterated parameters that may be specified in a
+ vertex. Iterated parameters are generic and treated identically, so the mapping of
+ parameter indices is completely up to the contract between the caller and the render
+ callback. It is permitted for **MaxParams** to be 0.
+
+* **Flags** is zero or more of the following flags:
+
+ - POLY_FLAG_NO_WORK_QUEUE — specify this flag to disable asynchronous rendering; this
+ can be useful for debugging. When this option is enabled, all primitives are queued
+ and then processed in order on the calling thread when ``wait()`` is called on the
+ **poly_manager** class.
+
+ - POLY_FLAG_NO_CLIPPING — specify this if you want **poly_manager** to skip its
+ internal clipping. Use this if your render callbacks do their own clipping, or if
+ the caller always handles clipping prior to submitting primitives.
+
+
+Types & Constants
+~~~~~~~~~~~~~~~~~
+
+vertex_t
+++++++++
+
+Within the **poly_manager** class, you’ll find a **vertex_t** type that describes a
+single vertex. All primitive drawing methods accept 2 or more of these **vertex_t**
+objects. The **vertex_t** includes the X and Y coordinates along with an array of
+iterated parameter values at that vertex::
+
+ struct vertex_t
+ {
+ vertex_t() { }
+ vertex_t(BaseType _x, BaseType _y) { x = _x; y = _y; }
+
+ BaseType x, y; // X, Y coordinates
+ std::array<BaseType, MaxParams> p; // iterated parameters
+ };
+
+Note that **vertex_t** itself is defined in terms of the **BaseType** and **MaxParams**
+template values of the owning **poly_manager** class.
+
+All of **poly_manager**’s primitives operate in screen space, where (0,0) represents the
+top-left corner of the top-left pixel, and (0.5,0.5) represents the center of that pixel.
+Left and top pixel values are inclusive, while right and bottom pixel values are exclusive.
+
+Thus, a *tile* rendered from (2,2)-(4,3) will completely cover 2 pixels: (2,2) and (3,2).
+
+When calling a primitive drawing method, the iterated parameter array **p** need not be
+completely filled out. The number of valid iterated parameter values is specified as a
+template parameter to the primitive drawing methods, so only that many parameters need to
+actually be populated in the **vertex_t** structures that are passed in.
+
+
+extent_t
+++++++++
+
+**poly_manager** breaks primitives into extents, which are contiguous horizontal spans
+contained within a single scanline. These extents are then distributed to worker threads,
+who will call the render callback with information on how to render each extent. The
+**extent_t** type describes one such extent, providing the bounding X coordinates along with
+an array of iterated parameter start values and deltas across the span::
+
+ struct extent_t
+ {
+ struct param_t
+ {
+ BaseType start; // parameter value at start
+ BaseType dpdx; // dp/dx relative to start
+ };
+ int16_t startx, stopx; // starting (inclusive)/ending (exclusive) endpoints
+ std::array<param_t, MaxParams> param; // array of parameter start/deltas
+ void *userdata; // custom per-span data
+ };
+
+For each iterated parameter, the **start** value contains the value at the left side of
+the span. The **dpdx** value contains the change of the parameter’s value per X coordinate.
+
+There is also a **userdata** field in the **extent_t** structure, which is not normally used,
+except when performing custom rendering.
+
+
+render_delegate
++++++++++++++++
+
+When rendering a primitive, in addition to the vertices, you must also provide a
+**render_delegate** callback of the form::
+
+ void render(int32_t y, extent_t const &extent, ObjectType const &object, int threadid)
+
+This callback is responsible for the actual rendering. It will be called at a later time,
+likely on a different thread, for each extent. The parameters passed are:
+
+* **y** is the Y coordinate (scanline) of the current extent.
+
+* **extent** is a reference to a **extent_t** structure, described above, which specifies for
+ this extent the start/stop X values along with the start/delta values for each iterated
+ parameter.
+
+* **object** is a reference to the most recently allocated **ObjectType** at the time the
+ primitive was submitted for rendering; in theory it should contain most of not all of the
+ necessary data to perform rendering.
+
+* **threadid** is a unique ID indicating the index of the thread you’re running on; this value
+ is useful if you are keeping any kind of statistics and don’t want to add contention over
+ shared values. In this situation, you can allocate **WORK_MAX_THREADS** instances of your
+ data and update the instance for the **threadid** you are passed. When you want to display
+ the statistics, the main thread can accumulate and reset the data from all threads when it’s
+ safe to do so (e.g., after a wait).
+
+
+Methods
+~~~~~~~
+
+poly_manager
+++++++++++++
+::
+
+ poly_manager(running_machine &machine);
+
+The **poly_manager** constructor takes just one parameter, a reference to the
+**running_machine**. This grants **poly_manager** access to the work queues needed for
+multithreaded running.
+
+wait
+++++
+::
+
+ void wait(char const *debug_reason = "general");
+
+Calling ``wait()`` stalls the calling thread until all outstanding rendering is complete:
+
+* **debug_reason** is an optional parameter specifying the reason for the wait. It is
+ useful if the compile-time constant **TRACK_POLY_WAITS** is enabled, as it will print a
+ summary of wait times and reasons at the end of execution.
+
+**Return value:** none.
+
+object_data
++++++++++++
+::
+
+ objectdata_array &object_data();
+
+This method just returns a reference to the internally-maintained **poly_array** of the
+**ObjectType** you specified when creating **poly_manager**. For most applications, the
+only interesting thing to do with this object is call the ``next()`` method to allocate
+a new object to fill out.
+
+**Return value:** reference to a **poly_array** of **ObjectType**.
+
+register_poly_array
++++++++++++++++++++
+::
+
+ void register_poly_array(poly_array_base &array);
+
+For advanced applications, you may choose to create your own **poly_array** objects to
+manage large chunks of infrequently-changed data, such a palettes. After each ``wait()``,
+**poly_manager** resets all the **poly_array** objects it knows about in order to reclaim all
+outstanding allocated memory. By registering your **poly_array** objects here, you can ensure
+that your arrays will also be reset after an ``wait()`` call.
+
+**Return value:** none.
+
+render_tile
++++++++++++
+::
+
+ template<int ParamCount>
+ uint32_t render_tile(rectangle const &cliprect, render_delegate callback,
+ vertex_t const &v1, vertex_t const &v2);
+
+This method enqueues a single *tile* primitive for rendering:
+
+* **ParamCount** is the number of live values in the iterated parameter array within each
+ **vertex_t** provided; it must be no greater than the **MaxParams** value specified in the
+ **poly_manager** template instantiation.
+
+* **cliprect** is a reference to a clipping rectangle. All pixels and parameter values are
+ clipped to stay within these bounds before being added to the work queues for rendering,
+ unless **POLY_FLAG_NO_CLIPPING** was specified as a flag parameter to **poly_manager**.
+
+* **callback** is the render callback delegate that will be called to render each extent.
+
+* **v1** contains the coordinates and iterated parameters for the top-left corner of the tile.
+
+* **v2** contains the coordinates and iterated parameters for the bottom-right corner of the tile.
+
+**Return value:** the total number of clipped pixels represented by the enqueued extents.
+
+render_triangle
++++++++++++++++
+::
+
+ template<int ParamCount>
+ uint32_t render_triangle(rectangle const &cliprect, render_delegate callback,
+ vertex_t const &v1, vertex_t const &v2, vertex_t const &v3);
+
+This method enqueues a single *triangle* primitive for rendering:
+
+* **ParamCount** is the number of live values in the iterated parameter array within each
+ **vertex_t** provided; it must be no greater than the **MaxParams** value specified in the
+ **poly_manager** template instantiation.
+
+* **cliprect** is a reference to a clipping rectangle. All pixels and parameter values are
+ clipped to stay within these bounds before being added to the work queues for rendering,
+ unless **POLY_FLAG_NO_CLIPPING** was specified as a flag parameter to **poly_manager**.
+
+* **callback** is the render callback delegate that will be called to render each extent.
+
+* **v1**, **v2**, **v3** contain the coordinates and iterated parameters for each vertex
+ of the triangle.
+
+**Return value:** the total number of clipped pixels represented by the enqueued extents.
+
+render_triangle_fan
++++++++++++++++++++
+::
+
+ template<int ParamCount>
+ uint32_t render_triangle_fan(rectangle const &cliprect, render_delegate callback,
+ int numverts, vertex_t const *v);
+
+This method enqueues one or more *triangle* primitives for rendering, specified in fan order:
+
+* **ParamCount** is the number of live values in the iterated parameter array within each
+ **vertex_t** provided; it must be no greater than the **MaxParams** value specified in the
+ **poly_manager** template instantiation.
+
+* **cliprect** is a reference to a clipping rectangle. All pixels and parameter values are
+ clipped to stay within these bounds before being added to the work queues for rendering,
+ unless **POLY_FLAG_NO_CLIPPING** was specified as a flag parameter to **poly_manager**.
+
+* **callback** is the render callback delegate that will be called to render each extent.
+
+* **numverts** is the total number of vertices provided; it must be at least 3.
+
+* **v** is a pointer to an array of **vertex_t** objects containing the coordinates and iterated
+ parameters for all the triangles, in fan order. This means that the first vertex is fixed.
+ So if 5 vertices are provided, indicating 3 triangles, the vertices used will be:
+ (0,1,2) (0,2,3) (0,3,4)
+
+**Return value:** the total number of clipped pixels represented by the enqueued extents.
+
+render_triangle_strip
++++++++++++++++++++++
+::
+
+ template<int ParamCount>
+ uint32_t render_triangle_strip(rectangle const &cliprect, render_delegate callback,
+ int numverts, vertex_t const *v);
+
+This method enqueues one or more *triangle* primitives for rendering, specified in strip order:
+
+* **ParamCount** is the number of live values in the iterated parameter array within each
+ **vertex_t** provided; it must be no greater than the **MaxParams** value specified in the
+ **poly_manager** template instantiation.
+
+* **cliprect** is a reference to a clipping rectangle. All pixels and parameter values are
+ clipped to stay within these bounds before being added to the work queues for rendering,
+ unless **POLY_FLAG_NO_CLIPPING** was specified as a flag parameter to **poly_manager**.
+
+* **callback** is the render callback delegate that will be called to render each extent.
+
+* **numverts** is the total number of vertices provided; it must be at least 3.
+
+* **v** is a pointer to an array of **vertex_t** objects containing the coordinates and iterated
+ parameters for all the triangles, in strip order.
+ So if 5 vertices are provided, indicating 3 triangles, the vertices used will be:
+ (0,1,2) (1,2,3) (2,3,4)
+
+**Return value:** the total number of clipped pixels represented by the enqueued extents.
+
+render_polygon
+++++++++++++++
+::
+
+ template<int NumVerts, int ParamCount>
+ uint32_t render_polygon(rectangle const &cliprect, render_delegate callback, vertex_t const *v);
+
+This method enqueues a single *polygon* primitive for rendering:
+
+* **NumVerts** is the number of vertices in the polygon.
+
+* **ParamCount** is the number of live values in the iterated parameter array within each
+ **vertex_t** provided; it must be no greater than the **MaxParams** value specified in the
+ **poly_manager** template instantiation.
+
+* **cliprect** is a reference to a clipping rectangle. All pixels and parameter values are
+ clipped to stay within these bounds before being added to the work queues for rendering,
+ unless **POLY_FLAG_NO_CLIPPING** was specified as a flag parameter to **poly_manager**.
+
+* **callback** is the render callback delegate that will be called to render each extent.
+
+* **v** is a pointer to an array of **vertex_t** objects containing the coordinates and iterated
+ parameters for the polygon. Vertices are assumed to be in either clockwise or anticlockwise
+ order.
+
+**Return value:** the total number of clipped pixels represented by the enqueued extents.
+
+render_extents
+++++++++++++++
+::
+
+ template<int ParamCount>
+ uint32_t render_extents(rectangle const &cliprect, render_delegate callback,
+ int startscanline, int numscanlines, extent_t const *extents);
+
+This method enqueues custom extents directly:
+
+* **ParamCount** is the number of live values in the iterated parameter array within each
+ **vertex_t** provided; it must be no greater than the **MaxParams** value specified in the
+ **poly_manager** template instantiation.
+
+* **cliprect** is a reference to a clipping rectangle. All pixels and parameter values are
+ clipped to stay within these bounds before being added to the work queues for rendering,
+ unless **POLY_FLAG_NO_CLIPPING** was specified as a flag parameter to **poly_manager**.
+
+* **callback** is the render callback delegate that will be called to render each extent.
+
+* **startscanline** is the Y coordinate of the first extent provided.
+
+* **numscanlines** is the number of extents provided.
+
+* **extents** is a pointer to an array of **extent_t** objects containing the start/stop
+ X coordinates and iterated parameters. The **userdata** field of the source extents is
+ copied to the target as well (this field is otherwise unused for all other types of
+ rendering).
+
+**Return value:** the total number of clipped pixels represented by the enqueued extents.
+
+zclip_if_less
++++++++++++++
+::
+
+ template<int ParamCount>
+ int zclip_if_less(int numverts, vertex_t const *v, vertex_t *outv, BaseType clipval);
+
+This method is a helper method to clip a polygon against a provided Z value. It assumes
+that the first iterated parameter in **vertex_t** represents the Z coordinate. If any edge
+crosses the Z plane represented by **clipval** that edge is clipped.
+
+* **ParamCount** is the number of live values in the iterated parameter array within each
+ **vertex_t** provided; it must be no greater than the **MaxParams** value specified in the
+ **poly_manager** template instantiation.
+
+* **numverts** is the number of vertices in the input array.
+
+* **v** is a pointer to the input array of **vertex_t** objects.
+
+* **outv** is a pointer to the output array of **vertex_t** objects. **v** and **outv**
+ cannot overlap or point to the same memory.
+
+* **clipval** is the value to compare parameter 0 against for clipping.
+
+**Return value:** the number of output vertices written to **outv**.
+Note that by design it is possible for this method to produce more vertices than the
+input array, so callers should ensure there is enough room in the output buffer to
+accommodate this.
+
+
+Example Renderer
+----------------
+
+Here is a complete example of how to create a software 3D renderer using **poly_manager**.
+Our example renderer will only handle flat and Gouraud-shaded triangles with depth (Z)
+buffering.
+
+
+Types
+~~~~~
+
+The first thing we need to define is our *externally-visible* vertex format, which is distinct
+from the internal **vertex_t** that **poly_manager** will define. In theory you could
+use **vertex_t** directly, but the generic nature of **poly_manager**’s iterated parameters
+make it awkward::
+
+ struct example_vertex
+ {
+ float x, y, z; // X,Y,Z coordinates
+ rgb_t color; // color at this vertex
+ };
+
+Next we define the **ObjectType** needed by **poly_manager**. For our simple case, we
+define an **example_object_data** struct that consists of pointers to our rendering buffers,
+plus a couple of fixed values that are consumed in some cases. More complex renderers would
+typically have many more object-wide parameters defined here::
+
+ struct example_object_data
+ {
+ 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)
+ };
+
+Now it’s time to define our renderer class, which we derive from **poly_manager**. As
+template parameters we specify ``float`` as the base type for our data, since that will
+be enough accuracy for this example, and we also provide our **example_object_data** as
+the **ObjectType** class, plus the maximum number of iterated parameters our renderer
+will ever need (4 in this case)::
+
+ class example_renderer : public poly_manager<float, example_object_data, 4>
+ {
+ public:
+ example_renderer(running_machine &machine, uint32_t width, uint32_t height);
+
+ bitmap_rgb32 *swap_buffers();
+
+ void clear_buffers(rgb_t color, uint16_t depthval);
+ void draw_triangle(example_vertex const *verts);
+
+ private:
+ static uint16_t ooz_to_depthval(float ooz);
+
+ void draw_triangle_flat(example_vertex const *verts);
+ void draw_triangle_gouraud(example_vertex const *verts);
+
+ void render_clear(int32_t y, extent_t const &extent, example_object_data const &object, int threadid);
+ void render_flat(int32_t y, extent_t const &extent, example_object_data const &object, int threadid);
+ void render_gouraud(int32_t y, extent_t const &extent, example_object_data const &object, int threadid);
+
+ int m_draw_buffer;
+ bitmap_rgb32 m_display[2];
+ bitmap_ind16 m_depth;
+ };
+
+
+Constructor
+~~~~~~~~~~~
+
+The constructor for our example renderer just initializes **poly_manager** and allocates
+the rendering and depth buffers::
+
+ example_renderer::example_renderer(running_machine &machine, uint32_t width, uint32_t height) :
+ poly_manager(machine),
+ m_draw_buffer(0)
+ {
+ // allocate two display buffers and a depth buffer
+ m_display[0].allocate(width, height);
+ m_display[1].allocate(width, height);
+ m_depth.allocate(width, height);
+ }
+
+
+swap_buffers
+~~~~~~~~~~~~
+
+The first interesting method in our renderer is ``swap_buffers()``, which returns a pointer to
+the buffer we’ve been drawing to, and sets up the other buffer as the new drawing target. The
+idea is that the display update handler will call this method to get ahold of the bitmap to
+display to the user::
+
+ bitmap_rgb32 *example_renderer::swap_buffers()
+ {
+ // wait for any rendering to complete before returning the buffer
+ wait("swap_buffers");
+
+ // return the current draw buffer and then switch to the other
+ // for future drawing
+ bitmap_rgb32 *result = &m_display[m_draw_buffer];
+ m_draw_buffer ^= 1;
+ return result;
+ }
+
+The most important thing here to note here is the call to **poly_manager**’s ``wait()``, which
+will block the current thread until all rendering is complete. This is important because
+otherwise the caller may receive a bitmap that is still being drawn to, leading to torn
+or corrupt visuals.
+
+
+clear_buffers
+~~~~~~~~~~~~~
+
+One of the most common operations to perform when doing 3D rendering is to initialize or
+clear the display and depth buffers to a known value. This method below leverages
+the *tile* primitive to render a rectangle over the screen by passing in (0,0) and (width,height)
+for the two vertices.
+
+Because the color and depth values to clear the buffer to are constant, they are stored in
+a freshly-allocated **example_object_data** object, along with a pointer to the buffers in
+question. The ``render_tile()`` call is made with a ``<0>`` suffix indicating that there are
+no iterated parameters to worry about::
+
+ void example_renderer::clear_buffers(rgb_t color, uint16_t depthval)
+ {
+ // allocate object data and populate it with information needed
+ example_object_data &object = object_data().next();
+ object.dest = &m_display[m_draw_buffer];
+ object.depth = &m_depth;
+ object.color = color;
+ object.depthval = depthval;
+
+ // top,left coordinate is always (0,0)
+ vertex_t topleft;
+ topleft.x = 0;
+ topleft.y = 0;
+
+ // bottom,right coordinate is (width,height)
+ vertex_t botright;
+ botright.x = m_display[0].width();
+ botright.y = m_display[0].height();
+
+ // render as a tile with 0 iterated parameters
+ render_tile<0>(m_display[0].cliprect(),
+ render_delegate(&example_renderer::render_clear, this),
+ topleft, botright);
+ }
+
+The render callback provided to ``render_tile()`` is also defined (privately) in our class,
+and handles a single span. Note how the rendering parameters are extracted from the
+**example_object_data** struct provided::
+
+ void example_renderer::render_clear(int32_t y, extent_t const &extent, example_object_data const &object, int threadid)
+ {
+ // get pointers to the start of the depth buffer and destination scanlines
+ uint16_t *depth = &object.depth->pix(y);
+ uint32_t *dest = &object.dest->pix(y);
+
+ // loop over the full extent and just store the constant values from the object
+ for (int x = extent.startx; x < extent.stopx; x++)
+ {
+ dest[x] = object.color;
+ depth[x] = object.depthval;
+ }
+ }
+
+Another important point to make is that the X coordinates provided by extent struct are
+inclusive of startx but exclusive of stopx. Clipping is performed ahead of time so that
+the render callback can focus on laying down pixels as quickly as possible with minimal
+overhead.
+
+
+draw_triangle
+~~~~~~~~~~~~~
+
+Next up, we have our actual triangle rendering function, which will draw a single triangle
+given an array of three vertices provided in the external **example_vertex** format::
+
+ void example_renderer::draw_triangle(example_vertex const *verts)
+ {
+ // flat shaded case
+ if (verts[0].color == verts[1].color && verts[0].color == verts[2].color)
+ draw_triangle_flat(verts);
+ else
+ draw_triangle_gouraud(verts);
+ }
+
+Because it is simpler and faster to render a flat shaded triangle, the code checks to see
+if the colors are the same on all three vertices. If they are, we call through to a special
+flat-shaded case, otherwise we process it as a full Gouraud-shaded triangle.
+
+This is a common technique to optimize rendering performance: identify special cases that
+reduce the per-pixel work, and route them to separate render callbacks that are optimized
+for that special case.
+
+
+draw_triangle_flat
+~~~~~~~~~~~~~~~~~~
+
+Here’s the setup code for rendering a flat-shaded triangle::
+
+ void example_renderer::draw_triangle_flat(example_vertex const *verts)
+ {
+ // allocate object data and populate it with information needed
+ example_object_data &object = object_data().next();
+ object.dest = &m_display[m_draw_buffer];
+ object.depth = &m_depth;
+
+ // in this case the color is constant and specified in the object data
+ object.color = verts[0].color;
+
+ // copy X, Y, and 1/Z into poly_manager vertices
+ vertex_t v[3];
+ for (int vertnum = 0; vertnum < 3; vertnum++)
+ {
+ v[vertnum].x = verts[vertnum].x;
+ v[vertnum].y = verts[vertnum].y;
+ v[vertnum].p[0] = 1.0f / verts[vertnum].z;
+ }
+
+ // render the triangle with 1 iterated parameter (1/Z)
+ render_triangle<1>(m_display[0].cliprect(),
+ render_delegate(&example_renderer::render_flat, this),
+ v[0], v[1], v[2]);
+ }
+
+First, we put the fixed color into the **example_object_data** directly, and then fill
+out three **vertex_t** objects with the X and Y coordinates in the usual spot, and 1/Z
+as our one and only iterated parameter. (We use 1/Z here because iterated parameters are
+interpolated linearly in screen space. Z is not linear in screen space, but 1/Z is due to
+perspective correction.)
+
+Our flat-shaded case then calls ``render_trangle`` specifying ``<1>`` iterated parameter to
+interpolate, and pointing to a special-case flat render callback::
+
+ void example_renderer::render_flat(int32_t y, extent_t const &extent, example_object_data const &object, int threadid)
+ {
+ // get pointers to the start of the depth buffer and destination scanlines
+ uint16_t *depth = &object.depth->pix(y);
+ uint32_t *dest = &object.dest->pix(y);
+
+ // get the starting 1/Z value and the delta per X
+ float ooz = extent.param[0].start;
+ float doozdx = extent.param[0].dpdx;
+
+ // iterate over the extent
+ for (int x = extent.startx; x < extent.stopx; x++)
+ {
+ // convert the 1/Z value into an integral depth value
+ uint16_t depthval = ooz_to_depthval(ooz);
+
+ // if closer than the current pixel, copy the color and depth value
+ if (depthval < depth[x])
+ {
+ dest[x] = object.color;
+ depth[x] = depthval;
+ }
+
+ // regardless, update the 1/Z value for the next pixel
+ ooz += doozdx;
+ }
+ }
+
+This render callback is a bit more involved than the clearing case.
+
+First, we have an iterated parameter (1/Z) to deal with, whose starting and X-delta
+values we extract from the extent before the start of the inner loop.
+
+Second, we perform depth buffer testing, using ``ooz_to_depthval()`` as a helper
+to transform the floating-point 1/Z value into a 16-bit integer. We compare this value against
+the current depth buffer value, and only store the pixel/depth value if it’s less.
+
+At the end of each iteration, we advance the 1/Z value by the X-delta in preparation for the
+next pixel.
+
+
+draw_triangle_gouraud
+~~~~~~~~~~~~~~~~~~~~~
+
+Finally we get to the code for the full-on Gouraud-shaded case::
+
+ void example_renderer::draw_triangle_gouraud(example_vertex const *verts)
+ {
+ // allocate object data and populate it with information needed
+ example_object_data &object = object_data().next();
+ object.dest = &m_display[m_draw_buffer];
+ object.depth = &m_depth;
+
+ // copy X, Y, 1/Z, and R,G,B into poly_manager vertices
+ vertex_t v[3];
+ for (int vertnum = 0; vertnum < 3; vertnum++)
+ {
+ v[vertnum].x = verts[vertnum].x;
+ v[vertnum].y = verts[vertnum].y;
+ v[vertnum].p[0] = 1.0f / verts[vertnum].z;
+ v[vertnum].p[1] = verts[vertnum].color.r();
+ v[vertnum].p[2] = verts[vertnum].color.g();
+ v[vertnum].p[3] = verts[vertnum].color.b();
+ }
+
+ // render the triangle with 4 iterated parameters (1/Z, R, G, B)
+ render_triangle<4>(m_display[0].cliprect(),
+ render_delegate(&example_renderer::render_gouraud, this),
+ v[0], v[1], v[2]);
+ }
+
+Here we have 4 iterated parameters: the 1/Z depth value, plus red, green, and blue,
+stored as floating point values. We call ``render_triangle()`` with ``<4>`` as the
+number of iterated parameters to process, and point to the full Gouraud render callback::
+
+ void example_renderer::render_gouraud(int32_t y, extent_t const &extent, example_object_data const &object, int threadid)
+ {
+ // get pointers to the start of the depth buffer and destination scanlines
+ uint16_t *depth = &object.depth->pix(y);
+ uint32_t *dest = &object.dest->pix(y);
+
+ // get the starting 1/Z value and the delta per X
+ float ooz = extent.param[0].start;
+ float doozdx = extent.param[0].dpdx;
+
+ // get the starting R,G,B values and the delta per X as 8.24 fixed-point values
+ uint32_t r = uint32_t(extent.param[1].start * float(1 << 24));
+ uint32_t drdx = uint32_t(extent.param[1].dpdx * float(1 << 24));
+ uint32_t g = uint32_t(extent.param[2].start * float(1 << 24));
+ uint32_t dgdx = uint32_t(extent.param[2].dpdx * float(1 << 24));
+ uint32_t b = uint32_t(extent.param[3].start * float(1 << 24));
+ uint32_t dbdx = uint32_t(extent.param[3].dpdx * float(1 << 24));
+
+ // iterate over the extent
+ for (int x = extent.startx; x < extent.stopx; x++)
+ {
+ // convert the 1/Z value into an integral depth value
+ uint16_t depthval = ooz_to_depthval(ooz);
+
+ // if closer than the current pixel, assemble the color
+ if (depthval < depth[x])
+ {
+ dest[x] = rgb_t(r >> 24, g >> 24, b >> 24);
+ depth[x] = depthval;
+ }
+
+ // regardless, update the 1/Z and R,G,B values for the next pixel
+ ooz += doozdx;
+ r += drdx;
+ g += dgdx;
+ b += dbdx;
+ }
+ }
+
+This follows the same pattern as the flat-shaded callback, except we have 4 iterated parameters
+to step through.
+
+Note that even though the iterated parameters are of ``float`` type, we convert the
+color values to fixed-point integers when iterating over them. This saves us doing 3
+float-to-int conversions each pixel. The original RGB values were 0-255, so interpolation
+can only produce values in the 0-255 range. Thus we can use 24 bits of a 32-bit integer as
+the fraction, which is plenty accurate for this case.
+
+
+Advanced Topic: the poly_array class
+------------------------------------
+
+**poly_array** is a template class that is used to manage a dynamically-sized vector of
+objects whose lifetime starts at allocation and ends when ``reset()`` is called. The
+**poly_manager** class uses several **poly_array** objects internally, including one for
+allocated **ObjectType** data, one for each primitive rendered, and one for holding all
+allocated extents.
+
+**poly_array** has an additional property where after a reset it retains a copy of the most
+recently allocated object. This ensures that callers can always call ``last()`` and get
+a valid object, even immediately after a reset.
+
+The **poly_array** class requires two template parameters::
+
+ template<class ArrayType, int TrackingCount>
+ class poly_array;
+
+These parameters are:
+
+* **ArrayType** is the type of object you wish to allocate and manage.
+
+* **TrackingCount** is the number of objects you wish to preserve after a reset. Typically
+ this value is either 0 (you don’t care to track any objects) or 1 (you only need one
+ object); however, if you are using **poly_array** to manage a shared collection of
+ objects across several independent consumers, it can be higher. See below for an example
+ where this might be handy.
+
+Note that objects allocated by **poly_array** are owned by **poly_array** and will be
+automatically freed upon exit.
+
+**poly_array** is optimized for use in high frequency multi-threaded systems. Therefore,
+one added feature of the class is that it rounds the allocation size of **ArrayType** to
+the nearest cache line boundary, on the assumption that neighboring entries could be
+accessed by different cores simultaneously. Keeping each **ArrayType** object in its
+own cache line ensures no false sharing performance impacts.
+
+Currently, **poly_array** has no mechanism to determine cache line size at runtime, so
+it presumes that 64 bytes is a typical cache line size, which is true for most x64 and ARM
+chips as of 2021. This value can be altered by changing the **CACHE_LINE_SHIFT** constant
+defined at the top of the class.
+
+Objects allocated by **poly_array** are created in 64k chunks. At construction time, one
+chunk’s worth of objects is allocated up front. The chunk size is controlled by the
+**CHUNK_GRANULARITY** constant defined at the top of the class.
+
+As more objects are allocated, if **poly_array** runs out of space, it will dynamically
+allocate more. This will produce discontiguous chunks of objects until the next ``reset()``
+call, at which point **poly_array** will reallocate all the objects into a contiguous
+vector once again.
+
+For the case where **poly_array** is used to manage a shared pool of objects, it can be
+configured to retain multiple most recently allocated items by using a **TrackingCount**
+greater than 1. For example, if **poly_array** is managing objects for two texture units,
+then it can set **TrackingCount** equal to 2, and pass the index of the texture unit in
+calls to ``next()`` and ``last()``. After a reset, **poly_array** will remember the most
+recently allocated object for each of the units independently.
+
+
+Methods
+~~~~~~~
+
+poly_array
+++++++++++
+::
+
+ poly_array();
+
+The **poly_array** contructor requires no parameters and simply pre-allocates one
+chunk of objects in preparation for future allocations.
+
+count
++++++
+::
+
+ u32 count() const;
+
+**Return value:** the number of objects currently allocated.
+
+max
++++
+::
+
+ u32 max() const;
+
+**Return value:** the maximum number of objects ever allocated at one time.
+
+itemsize
+++++++++
+::
+
+ size_t itemsize() const;
+
+**Return value:** the size of an object, rounded up to the nearest cache line boundary.
+
+allocated
++++++++++
+::
+
+ u32 allocated() const;
+
+**Return value:** the number of objects that fit within what’s currently been allocated.
+
+byindex
++++++++
+::
+
+ ArrayType &byindex(u32 index);
+
+Returns a reference to an object in the array by index. Equivalent to [**index**] on a
+normal array:
+
+* **index** is the index of the item you wish to reference.
+
+**Return value:** a reference to the object in question. Since a reference is returned,
+it is your responsibility to ensure that **index** is less than ``count()`` as there
+is no mechanism to return an invalid result.
+
+contiguous
+++++++++++
+::
+
+ ArrayType *contiguous(u32 index, u32 count, u32 &chunk);
+
+Returns a pointer to the base of a contiguous section of **count** items starting at
+**index**. Because **poly_array** dynamically resizes, it may not be possible to access
+all **count** objects contiguously, so the number of actually contiguous items is
+returned in **chunk**:
+
+* **index** is the index of the first item you wish to access contiguously.
+
+* **count** is the number of items you wish to access contiguously.
+
+* **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()``
+ again at (**index** + **chunk**) to access the rest.
+
+**Return value:** a pointer to the first item in the contiguous chunk. No range checking
+is performed, so it is your responsibility to ensure that **index** + **count** is less
+than or equal to ``count()``.
+
+indexof
++++++++
+::
+
+ int indexof(ArrayType &item) const;
+
+Returns the index within the array of the given item:
+
+* **item** is a reference to an item in the array.
+
+**Return value:** the index of the item. It should always be the case that::
+
+ array.indexof(array.byindex(index)) == index
+
+reset
++++++
+::
+
+ void reset();
+
+Resets the **poly_array** by semantically deallocating all objects. If previous allocations
+created a discontiguous array, a fresh vector is allocated at this time so that future
+allocations up to the same level will remain contiguous.
+
+Note that the **ArrayType** destructor is *not* called on objects as they are deallocated.
+
+**Return value:** none.
+
+next
+++++
+::
+
+ ArrayType &next(int tracking_index = 0);
+
+Allocates a new object and returns a reference to it. If there is not enough space for
+a new object in the current array, a new discontiguous array is created to hold it:
+
+* **tracking_index** is the tracking index you wish to assign the new item to. In the
+ common case this is 0, but could be non-zero if using a **TrackingCount** greater than 1.
+
+**Return value:** a reference to the object. Note that the placement new operator is
+called on this object, so the default **ArrayType** constructor will be invoked here.
+
+last
+++++
+::
+
+ ArrayType &last(int tracking_index = 0) const;
+
+Returns a reference to the last object allocated:
+
+* **tracking_index** is the tracking index whose object you want. In the
+ common case this is 0, but could be non-zero if using a **TrackingCount** greater than 1.
+ **poly_array** remembers the most recently allocated object independently for each
+ **tracking_index**.
+
+**Return value:** a reference to the last allocated object.
diff --git a/docs/source/usingmame/defaultkeys.rst b/docs/source/usingmame/defaultkeys.rst
index 31fb6ad7d1a..2f20996be06 100644
--- a/docs/source/usingmame/defaultkeys.rst
+++ b/docs/source/usingmame/defaultkeys.rst
@@ -110,6 +110,7 @@ and saving/loading save states.
* **Page Up**/**Page Down** - scroll up/down one page at a time.
* **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.
* **Enter** - switch to graphics viewer.
Graphics mode:
@@ -121,6 +122,7 @@ and saving/loading save states.
* **Left**/**Right** - change color displayed.
* **R** - rotate tiles 90 degrees clockwise.
* **-**/**+** - increase/decrease the number of tiles per row.
+ * **0** - restore the default number of tiles per row.
* **Enter** - switch to tilemap viewer.
Tilemap mode:
@@ -130,10 +132,11 @@ and saving/loading save states.
* **Shift+Up**/**Down**/**Left**/**Right** - scroll 1 pixel at a time.
* **Control+Up**/**Down**/**Left**/**Right** - scroll 64 pixels at a time.
* **R** - rotate tilemap view 90 degrees clockwise.
- * **-**/**+** - increase/decrease the zoom factor.
+ * **-**/**+** - decrease/increase the zoom factor.
+ * **0** - expand small tilemaps to fill the display.
* **Enter** - switch to palette/colortable mode.
- Note: Not all games have decoded graphics and/or tilemaps.
+ Note: Not all systems have decoded graphics and/or tilemaps.
**Left Ctrl+F5**
Toggle Filter.
(*SDL MAME only*)
diff --git a/docs/themes/sphinx_rtd_theme/__init__.py b/docs/themes/sphinx_rtd_theme/__init__.py
index e48d9696d93..37c3b10d0fc 100644
--- a/docs/themes/sphinx_rtd_theme/__init__.py
+++ b/docs/themes/sphinx_rtd_theme/__init__.py
@@ -5,13 +5,18 @@ From https://github.com/ryan-roemer/sphinx-bootstrap-theme.
"""
from os import path
+from sys import version_info as python_version
-import sphinx
+from sphinx import version_info as sphinx_version
+from sphinx.locale import _
+from sphinx.util.logging import getLogger
-__version__ = '0.5.0'
+__version__ = '1.0.0rc1'
__version_full__ = __version__
+logger = getLogger(__name__)
+
def get_html_theme_path():
"""Return list of HTML theme paths."""
@@ -19,16 +24,40 @@ def get_html_theme_path():
return cur_dir
+def config_initiated(app, config):
+ theme_options = config.html_theme_options or {}
+ if theme_options.get('canonical_url'):
+ logger.warning(
+ _('The canonical_url option is deprecated, use the html_baseurl option from Sphinx instead.')
+ )
+
# See http://www.sphinx-doc.org/en/stable/theming.html#distribute-your-theme-as-a-python-package
def setup(app):
- if sphinx.version_info >= (1, 6, 0):
- # Register the theme that can be referenced without adding a theme path
- app.add_html_theme('sphinx_rtd_theme', path.abspath(path.dirname(__file__)))
-
- if sphinx.version_info >= (1, 8, 0):
+ if python_version[0] < 3:
+ logger.warning("Python 2 is deprecated with sphinx_rtd_theme, update to Python 3")
+ app.require_sphinx('1.6')
+ if sphinx_version <= (2, 0, 0):
+ logger.warning("Sphinx 1.x is deprecated with sphinx_rtd_theme, update to Sphinx 2.x or greater")
+ if not app.config.html_experimental_html5_writer:
+ logger.warning("'html4_writer' is deprecated with sphinx_rtd_theme")
+ else:
+ if app.config.html4_writer:
+ logger.warning("'html4_writer' is deprecated with sphinx_rtd_theme")
+
+ # Register the theme that can be referenced without adding a theme path
+ app.add_html_theme('sphinx_rtd_theme', path.abspath(path.dirname(__file__)))
+
+ if sphinx_version >= (1, 8, 0):
# Add Sphinx message catalog for newer versions of Sphinx
# See http://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx.application.Sphinx.add_message_catalog
rtd_locale_path = path.join(path.abspath(path.dirname(__file__)), 'locale')
app.add_message_catalog('sphinx', rtd_locale_path)
+ app.connect('config-inited', config_initiated)
+
+ # sphinx emits the permalink icon for headers, so choose one more in keeping with our theme
+ if sphinx_version >= (3, 5, 0):
+ app.config.html_permalinks_icon = "\uf0c1"
+ else:
+ app.config.html_add_permalinks = "\uf0c1"
return {'parallel_read_safe': True, 'parallel_write_safe': True}
diff --git a/docs/themes/sphinx_rtd_theme/breadcrumbs.html b/docs/themes/sphinx_rtd_theme/breadcrumbs.html
index 90cb0ff863e..005b2ecd6ee 100644
--- a/docs/themes/sphinx_rtd_theme/breadcrumbs.html
+++ b/docs/themes/sphinx_rtd_theme/breadcrumbs.html
@@ -1,82 +1,77 @@
-{# Support for Sphinx 1.3+ page_source_suffix, but don't break old builds. #}
+{%- if meta is defined and meta is not none %}
+ {%- set check_meta = True %}
+{%- else %}
+ {%- set check_meta = False %}
+{%- endif %}
-{% if page_source_suffix %}
-{% set suffix = page_source_suffix %}
-{% else %}
-{% set suffix = source_suffix %}
-{% endif %}
+{%- if check_meta and 'github_url' in meta %}
+ {%- set display_github = True %}
+{%- endif %}
-{% if meta is defined and meta is not none %}
-{% set check_meta = True %}
-{% else %}
-{% set check_meta = False %}
-{% endif %}
+{%- if check_meta and 'bitbucket_url' in meta %}
+ {%- set display_bitbucket = True %}
+{%- endif %}
-{% if check_meta and 'github_url' in meta %}
-{% set display_github = True %}
-{% endif %}
+{%- if check_meta and 'gitlab_url' in meta %}
+ {%- set display_gitlab = True %}
+{%- endif %}
-{% if check_meta and 'bitbucket_url' in meta %}
-{% set display_bitbucket = True %}
-{% endif %}
-
-{% if check_meta and 'gitlab_url' in meta %}
-{% set display_gitlab = True %}
-{% endif %}
-
-<div role="navigation" aria-label="breadcrumbs navigation">
+{%- set display_vcs_links = display_vcs_links if display_vcs_links is defined else True %}
+{#- Translators: This is an ARIA section label for page links, including previous/next page link and links to GitHub/GitLab/etc. -#}
+<div role="navigation" aria-label="{{ _('Page navigation') }}">
<ul class="wy-breadcrumbs">
- {% block breadcrumbs %}
+ {%- block breadcrumbs %}
<li><a href="{{ pathto(master_doc) }}" class="icon icon-home"></a> &raquo;</li>
- {% for doc in parents %}
+ {%- for doc in parents %}
<li><a href="{{ doc.link|e }}">{{ doc.title }}</a> &raquo;</li>
- {% endfor %}
+ {%- endfor %}
<li>{{ title }}</li>
- {% endblock %}
- {% block breadcrumbs_aside %}
+ {%- endblock %}
+ {%- block breadcrumbs_aside %}
<li class="wy-breadcrumbs-aside">
- {% if hasdoc(pagename) %}
- {% if display_github %}
- {% if check_meta and 'github_url' in meta %}
+ {%- if hasdoc(pagename) and display_vcs_links %}
+ {%- if display_github %}
+ {%- if check_meta and 'github_url' in meta %}
<!-- User defined GitHub URL -->
<a href="{{ meta['github_url'] }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a>
- {% else %}
- <a href="https://{{ github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/{{ theme_vcs_pageview_mode|default("blob") }}/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ suffix }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a>
- {% endif %}
- {% elif display_bitbucket %}
- {% if check_meta and 'bitbucket_url' in meta %}
+ {%- else %}
+ <a href="https://{{ github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/{{ theme_vcs_pageview_mode or "blob" }}/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ page_source_suffix }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a>
+ {%- endif %}
+ {%- elif display_bitbucket %}
+ {%- if check_meta and 'bitbucket_url' in meta %}
<!-- User defined Bitbucket URL -->
<a href="{{ meta['bitbucket_url'] }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a>
- {% else %}
- <a href="https://bitbucket.org/{{ bitbucket_user }}/{{ bitbucket_repo }}/src/{{ bitbucket_version}}{{ conf_py_path }}{{ pagename }}{{ suffix }}?mode={{ theme_vcs_pageview_mode|default("view") }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a>
- {% endif %}
- {% elif display_gitlab %}
- {% if check_meta and 'gitlab_url' in meta %}
+ {%- else %}
+ <a href="https://bitbucket.org/{{ bitbucket_user }}/{{ bitbucket_repo }}/src/{{ bitbucket_version}}{{ conf_py_path }}{{ pagename }}{{ page_source_suffix }}?mode={{ theme_vcs_pageview_mode or "view" }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a>
+ {%- endif %}
+ {%- elif display_gitlab %}
+ {%- if check_meta and 'gitlab_url' in meta %}
<!-- User defined GitLab URL -->
<a href="{{ meta['gitlab_url'] }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a>
- {% else %}
- <a href="https://{{ gitlab_host|default("gitlab.com") }}/{{ gitlab_user }}/{{ gitlab_repo }}/{{ theme_vcs_pageview_mode|default("blob") }}/{{ gitlab_version }}{{ conf_py_path }}{{ pagename }}{{ suffix }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a>
- {% endif %}
- {% elif show_source and source_url_prefix %}
- <a href="{{ source_url_prefix }}{{ pagename }}{{ suffix }}">{{ _('View page source') }}</a>
- {% elif show_source and has_source and sourcename %}
+ {%- else %}
+ <a href="https://{{ gitlab_host|default("gitlab.com") }}/{{ gitlab_user }}/{{ gitlab_repo }}/{{ theme_vcs_pageview_mode or "blob" }}/{{ gitlab_version }}{{ conf_py_path }}{{ pagename }}{{ page_source_suffix }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a>
+ {%- endif %}
+ {%- elif show_source and source_url_prefix %}
+ <a href="{{ source_url_prefix }}{{ pagename }}{{ page_source_suffix }}">{{ _('View page source') }}</a>
+ {%- elif show_source and has_source and sourcename %}
<a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> {{ _('View page source') }}</a>
- {% endif %}
- {% endif %}
+ {%- endif %}
+ {%- endif %}
</li>
- {% endblock %}
+ {%- endblock %}
</ul>
- {% if (theme_prev_next_buttons_location == 'top' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
- <div class="rst-breadcrumbs-buttons" role="navigation" aria-label="breadcrumb navigation">
- {% if next %}
- <a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n">{{ _('Next') }} <span class="fa fa-arrow-circle-right"></span></a>
- {% endif %}
- {% if prev %}
- <a href="{{ prev.link|e }}" class="btn btn-neutral float-left" title="{{ prev.title|striptags|e }}" accesskey="p"><span class="fa fa-arrow-circle-left"></span> {{ _('Previous') }}</a>
- {% endif %}
+ {%- if (theme_prev_next_buttons_location == 'top' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
+ {#- Translators: This is an ARIA section label for sequential page links, such as previous and next page links. -#}
+ <div class="rst-breadcrumbs-buttons" role="navigation" aria-label="{{ _('Sequential page navigation') }}">
+ {%- if prev %}
+ <a href="{{ prev.link|e }}" class="btn btn-neutral float-left" title="{{ prev.title|striptags|e }}" accesskey="p"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> {{ _('Previous') }}</a>
+ {%- endif %}
+ {%- if next %}
+ <a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n">{{ _('Next') }} <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+ {%- endif %}
</div>
- {% endif %}
+ {%- endif %}
<hr/>
</div>
diff --git a/docs/themes/sphinx_rtd_theme/footer.html b/docs/themes/sphinx_rtd_theme/footer.html
index 55d8d0e5583..1a395c9c8e0 100644
--- a/docs/themes/sphinx_rtd_theme/footer.html
+++ b/docs/themes/sphinx_rtd_theme/footer.html
@@ -1,62 +1,62 @@
<footer>
- {% if (theme_prev_next_buttons_location == 'bottom' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
- <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
- {% if next %}
- <a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n" rel="next">{{ _('Next') }} <span class="fa fa-arrow-circle-right"></span></a>
- {% endif %}
- {% if prev %}
- <a href="{{ prev.link|e }}" class="btn btn-neutral float-left" title="{{ prev.title|striptags|e }}" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> {{ _('Previous') }}</a>
- {% endif %}
+ {%- if (theme_prev_next_buttons_location == 'bottom' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
+ {#- Translators: This is an ARIA section label for the footer section of the page. -#}
+ <div class="rst-footer-buttons" role="navigation" aria-label="{{ _('Footer') }}">
+ {%- if prev %}
+ <a href="{{ prev.link|e }}" class="btn btn-neutral float-left" title="{{ prev.title|striptags|e }}" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> {{ _('Previous') }}</a>
+ {%- endif %}
+ {%- if next %}
+ <a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n" rel="next">{{ _('Next') }} <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+ {%- endif %}
</div>
- {% endif %}
+ {%- endif %}
<hr/>
<div role="contentinfo">
+ {%- block contentinfo %}
<p>
{%- if show_copyright %}
{%- if hasdoc('copyright') %}
- {% set path = pathto('copyright') %}
- {% set copyright = copyright|e %}
- &copy; <a href="{{ path }}">{% trans %}Copyright{% endtrans %}</a> {{ copyright }}
+ {%- trans path=pathto('copyright'), copyright=copyright|e %}&#169; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
{%- else %}
- {% set copyright = copyright|e %}
- &copy; {% trans %}Copyright{% endtrans %} {{ copyright }}
+ {%- trans copyright=copyright|e %}&#169; Copyright {{ copyright }}.{% endtrans %}
{%- endif %}
{%- endif %}
{%- if build_id and build_url %}
<span class="build">
- {# Translators: Build is a noun, not a verb #}
- {% trans %}Build{% endtrans %}
+ {#- Translators: Build is a noun, not a verb -#}
+ {%- trans %}Build{% endtrans -%}
<a href="{{ build_url }}">{{ build_id }}</a>.
</span>
{%- elif commit %}
<span class="commit">
- {# Translators: the phrase "revision" comes from Git, referring to a commit #}
- {% trans %}Revision{% endtrans %} <code>{{ commit }}</code>.
+ {#- Translators: the phrase "revision" comes from Git, referring to a commit #}
+ {%- trans %}Revision{% endtrans %} <code>{{ commit }}</code>.
</span>
- {%- elif last_updated %}
+ {%- endif %}
+ {%- if last_updated %}
<span class="lastupdated">
- {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
+ {%- trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
</span>
- {%- endif %}
+ {%- endif -%}
</p>
+ {%- endblock %}
</div>
- {%- if show_sphinx %}
- {% set sphinx_web = '<a href="http://sphinx-doc.org/">Sphinx</a>' %}
- {% set readthedocs_web = '<a href="https://readthedocs.org">Read the Docs</a>' %}
- {# Translators: the variable "sphinx_web" is a link to the Sphinx project documentation with the text "Sphinx" #}
- {% trans sphinx_web=sphinx_web, readthedocs_web=readthedocs_web %}Built with {{ sphinx_web }} using a{% endtrans %}
- {# Translators: "theme" refers to a theme for Sphinx, which alters the appearance of the generated documenation #}
- <a href="https://github.com/rtfd/sphinx_rtd_theme">{% trans %}theme{% endtrans %}</a>
- {# Translators: this is always used as "provided by Read the Docs", and should not imply Read the Docs is an author of the generated documentation. #}
+ {% if show_sphinx %}
+ {%- set sphinx_web = '<a href="https://www.sphinx-doc.org/">Sphinx</a>' %}
+ {%- set readthedocs_web = '<a href="https://readthedocs.org">Read the Docs</a>' %}
+ {#- Translators: the variable "sphinx_web" is a link to the Sphinx project documentation with the text "Sphinx" #}
+ {%- trans sphinx_web=sphinx_web, readthedocs_web=readthedocs_web %}Built with {{ sphinx_web }} using a{% endtrans %}
+ {#- Translators: "theme" refers to a theme for Sphinx, which alters the appearance of the generated documenation #}
+ <a href="https://github.com/readthedocs/sphinx_rtd_theme">{% trans %}theme{% endtrans %}</a>
+ {#- Translators: this is always used as "provided by Read the Docs", and should not imply Read the Docs is an author of the generated documentation. #}
{% trans %}provided by {{ readthedocs_web }}{% endtrans %}.
- {%- endif %}
+ {% endif %}
{%- block extrafooter %} {% endblock %}
</footer>
-
diff --git a/docs/themes/sphinx_rtd_theme/layout.html b/docs/themes/sphinx_rtd_theme/layout.html
index 246d2112a33..1d701197602 100644
--- a/docs/themes/sphinx_rtd_theme/layout.html
+++ b/docs/themes/sphinx_rtd_theme/layout.html
@@ -7,56 +7,74 @@
{%- set titlesuffix = "" %}
{%- endif %}
{%- set lang_attr = 'en' if language == None else (language | replace('_', '-')) %}
-{%- set sphinx_writer = 'writer-html5' if html5_doctype else 'writer-html4' %}
+{%- set sphinx_writer = 'writer-html5' if html5_doctype else 'writer-html4' -%}
+
+{# Build sphinx_version_info tuple from sphinx_version string in pure Jinja #}
+{%- set (_ver_major, _ver_minor, _ver_bugfix) = sphinx_version.split('.') | map('int') -%}
+{%- set sphinx_version_info = (_ver_major, _ver_minor, _ver_bugfix) -%}
<!DOCTYPE html>
<html class="{{ sphinx_writer }}" lang="{{ lang_attr }}" >
<head>
- <meta charset="utf-8">
- {{ metatags }}
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- {% block htmltitle %}
+ <meta charset="utf-8" />
+ {{- metatags }}
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ {%- block htmltitle %}
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
- {% endblock %}
+ {%- endblock -%}
- {# CSS #}
- <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
- <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
+ {#- CSS #}
+ {%- if sphinx_version_info < (4, 0) -%}
+ <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
+ <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
+ {%- endif %}
{%- for css in css_files %}
{%- if css|attr("rel") %}
- <link rel="{{ css.rel }}" href="{{ pathto(css.filename, 1) }}" type="text/css"{% if css.title is not none %} title="{{ css.title }}"{% endif %} />
+ <link rel="{{ css.rel }}" href="{{ pathto(css.filename, 1) }}" type="text/css"{% if css.title is not none %} title="{{ css.title }}"{% endif %} />
{%- else %}
- <link rel="stylesheet" href="{{ pathto(css, 1) }}" type="text/css" />
+ <link rel="stylesheet" href="{{ pathto(css, 1) }}" type="text/css" />
{%- endif %}
{%- endfor %}
{%- for cssfile in extra_css_files %}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
- {%- endfor %}
+ {%- endfor -%}
- {# FAVICON #}
- {% if favicon %}
+ {#- FAVICON #}
+ {%- if favicon %}
+ {%- if sphinx_version_info < (4, 0) -%}
<link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
- {% endif %}
- {# CANONICAL URL #}
- {% if theme_canonical_url %}
+ {%- else %}
+ <link rel="shortcut icon" href="{{ favicon_url }}"/>
+ {%- endif %}
+ {%- endif -%}
+
+ {#- CANONICAL URL (deprecated) #}
+ {%- if theme_canonical_url and not pageurl %}
<link rel="canonical" href="{{ theme_canonical_url }}{{ pagename }}.html"/>
- {% endif %}
+ {%- endif -%}
+
+ {#- CANONICAL URL #}
+ {%- if pageurl %}
+ <link rel="canonical" href="{{ pageurl|e }}" />
+ {%- endif -%}
- {# JAVASCRIPTS #}
+ {#- JAVASCRIPTS #}
{%- block scripts %}
<!--[if lt IE 9]>
<script src="{{ pathto('_static/js/html5shiv.min.js', 1) }}"></script>
<![endif]-->
{%- if not embedded %}
{# XXX Sphinx 1.8.0 made this an external js-file, quick fix until we refactor the template to inherert more blocks directly from sphinx #}
- {% if sphinx_version >= "1.8.0" %}
- <script type="text/javascript" id="documentation_options" data-url_root="{{ pathto('', 1) }}" src="{{ pathto('_static/documentation_options.js', 1) }}"></script>
+ {%- if sphinx_version_info >= (1, 8) -%}
+ {%- if sphinx_version_info < (4, 0) -%}
+ <script id="documentation_options" data-url_root="{{ url_root }}" src="{{ pathto('_static/documentation_options.js', 1) }}"></script>
+ {%- endif -%}
{%- for scriptfile in script_files %}
{{ js_tag(scriptfile) }}
{%- endfor %}
- {% else %}
- <script type="text/javascript">
+ {%- else %}
+ <script>
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'{{ url_root }}',
VERSION:'{{ release|e }}',
@@ -68,12 +86,12 @@
};
</script>
{%- for scriptfile in script_files %}
- <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
+ <script src="{{ pathto(scriptfile, 1) }}"></script>
{%- endfor %}
- {% endif %}
- <script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>
+ {%- endif %}
+ <script src="{{ pathto('_static/js/theme.js', 1) }}"></script>
- {# OPENSEARCH #}
+ {#- OPENSEARCH #}
{%- if use_opensearch %}
<link rel="search" type="application/opensearchdescription+xml"
title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
@@ -107,133 +125,131 @@
<body class="wy-body-for-nav">
- {% block extrabody %} {% endblock %}
+ {%- block extrabody %} {% endblock %}
<div class="wy-grid-for-nav">
- {# SIDE NAV, TOGGLES ON MOBILE #}
+ {#- SIDE NAV, TOGGLES ON MOBILE #}
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}>
- {% block sidebartitle %}
+ {%- block sidebartitle %}
- {% if logo and theme_logo_only %}
+ {%- if logo and theme_logo_only %}
<a href="{{ pathto(master_doc) }}">
- {% else %}
- <a href="{{ pathto(master_doc) }}" class="icon icon-home" alt="{{ _("Documentation Home") }}"> {{ project }}
- {% endif %}
+ {%- else %}
+ <a href="{{ pathto(master_doc) }}" class="icon icon-home"> {{ project }}
+ {%- endif %}
- {% if logo %}
- {# Not strictly valid HTML, but it's the only way to display/scale
- it properly, without weird scripting or heaps of work
+ {%- if logo %}
+ {#- Not strictly valid HTML, but it's the only way to display/scale
+ it properly, without weird scripting or heaps of work
#}
+ {%- if sphinx_version_info < (4, 0) -%}
<img src="{{ pathto('_static/' + logo, 1) }}" class="logo" alt="{{ _('Logo') }}"/>
- {% endif %}
+ {%- else %}
+ <img src="{{ logo_url }}" class="logo" alt="{{ _('Logo') }}"/>
+ {%- endif %}
+ {%- endif %}
</a>
- {% if theme_display_version %}
+ {%- if theme_display_version %}
{%- set nav_version = version %}
- {% if READTHEDOCS and current_version %}
+ {%- if READTHEDOCS and current_version %}
{%- set nav_version = current_version %}
- {% endif %}
- {% if nav_version %}
+ {%- endif %}
+ {%- if nav_version %}
<div class="version">
{{ nav_version }}
</div>
- {% endif %}
- {% endif %}
+ {%- endif %}
+ {%- endif %}
- {% include "searchbox.html" %}
+ {%- include "searchbox.html" %}
- {% endblock %}
+ {%- endblock %}
</div>
- {% block navigation %}
- <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
- {% block menu %}
- {#
- The singlehtml builder doesn't handle this toctree call when the
- toctree is empty. Skip building this for now.
- #}
- {% if 'singlehtml' not in builder %}
- {% set global_toc = toctree(maxdepth=theme_navigation_depth|int,
- collapse=theme_collapse_navigation|tobool,
- includehidden=theme_includehidden|tobool,
- titles_only=theme_titles_only|tobool) %}
- {% endif %}
- {% if global_toc %}
- {{ global_toc }}
- {% else %}
+ {%- block navigation %}
+ {#- Translators: This is an ARIA section label for the main navigation menu -#}
+ <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="{{ _('Navigation menu') }}">
+ {%- block menu %}
+ {%- set toctree = toctree(maxdepth=theme_navigation_depth|int,
+ collapse=theme_collapse_navigation|tobool,
+ includehidden=theme_includehidden|tobool,
+ titles_only=theme_titles_only|tobool) %}
+ {%- if toctree %}
+ {{ toctree }}
+ {%- else %}
<!-- Local TOC -->
<div class="local-toc">{{ toc }}</div>
- {% endif %}
- {% endblock %}
+ {%- endif %}
+ {%- endblock %}
</div>
- {% endblock %}
+ {%- endblock %}
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
- {# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
- <nav class="wy-nav-top" aria-label="top navigation">
- {% block mobile_nav %}
+ {#- MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
+ {#- Translators: This is an ARIA section label for the navigation menu that is visible when viewing the page on mobile devices -#}
+ <nav class="wy-nav-top" aria-label="{{ _('Mobile navigation menu') }}" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}>
+ {%- block mobile_nav %}
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="{{ pathto(master_doc) }}">{{ project }}</a>
- {% endblock %}
+ {%- endblock %}
</nav>
-
<div class="wy-nav-content">
{%- block content %}
- {% if theme_style_external_links|tobool %}
+ {%- if theme_style_external_links|tobool %}
<div class="rst-content style-external-links">
- {% else %}
+ {%- else %}
<div class="rst-content">
- {% endif %}
+ {%- endif %}
{% include "breadcrumbs.html" %}
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
{%- block document %}
<div itemprop="articleBody">
- {% block body %}{% endblock %}
+ {% block body %}{% endblock %}
</div>
- {% if self.comments()|trim %}
- <div class="articleComments">
- {% block comments %}{% endblock %}
- </div>
- {% endif%}
+ {%- if self.comments()|trim %}
+ <div class="articleComments">
+ {%- block comments %}{% endblock %}
+ </div>
+ {%- endif%}
</div>
{%- endblock %}
{% include "footer.html" %}
</div>
{%- endblock %}
</div>
-
</section>
-
</div>
- {% include "versions.html" %}
+ {% include "versions.html" -%}
- <script type="text/javascript">
+ <script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable({{ 'true' if theme_sticky_navigation|tobool else 'false' }});
});
</script>
- {# Do not conflict with RTD insertion of analytics script #}
- {% if not READTHEDOCS %}
- {% if theme_analytics_id %}
+ {#- Do not conflict with RTD insertion of analytics script #}
+ {%- if not READTHEDOCS %}
+ {%- if theme_analytics_id %}
<!-- Theme Analytics -->
+ <script async src="https://www.googletagmanager.com/gtag/js?id={{ theme_analytics_id }}"></script>
<script>
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
- })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+ window.dataLayer = window.dataLayer || [];
+ function gtag(){dataLayer.push(arguments);}
+ gtag('js', new Date());
- ga('create', '{{ theme_analytics_id }}', 'auto');
- ga('send', 'pageview');
+ gtag('config', '{{ theme_analytics_id }}', {
+ 'anonymize_ip': {{ 'true' if theme_analytics_anonymize_ip|tobool else 'false' }},
+ });
</script>
- {% endif %}
- {% endif %}
+ {%- endif %}
+ {%- endif %}
{%- block footer %} {% endblock %}
diff --git a/docs/themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.po
index ae45f65ba19..b5e7b3fa9a4 100644
--- a/docs/themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.po
+++ b/docs/themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-05-06 13:38-0600\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Tom Kunze <transifex.com@tomabrafix.de>, 2019\n"
"Language-Team: German (https://www.transifex.com/readthedocs/teams/101354/de/)\n"
@@ -22,37 +22,32 @@ msgstr ""
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Auf GitHub bearbeiten"
-#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Auf Bitbucket bearbeiten"
-#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Auf GitLab bearbeiten"
-#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "Quelltext anzeigen"
-#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Weiter"
-
-#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "Zurück"
-#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
-#: sphinx_rtd_theme/layout.html:96
-msgid "Copyright"
-msgstr "Copyright"
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
+msgid "Next"
+msgstr "Weiter"
#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:31
+#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Build"
@@ -64,49 +59,53 @@ msgstr "Zuletzt aktualisiert am %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with
#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
+#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr "Erstellt mit %(sphinx_web)s mit einem"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
+#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "bereitgestellt von %(readthedocs_web)s"
-#: sphinx_rtd_theme/layout.html:79
+#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "%(docstitle)s durchsuchen"
-#: sphinx_rtd_theme/layout.html:87
+#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Über diese Dokumentation"
-#: sphinx_rtd_theme/layout.html:90
+#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Index"
-#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Suche"
-#: sphinx_rtd_theme/layout.html:128
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
-#: sphinx_rtd_theme/search.html:29
+#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr "Bitte aktiviere JavaScript, um die Suchfunktion zu nutzen."
#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:37
+#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Suchergebnisse"
-#: sphinx_rtd_theme/search.html:39
+#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@@ -119,7 +118,7 @@ msgstr ""
msgid "Search docs"
msgstr "Dokumentation durchsuchen"
-#: sphinx_rtd_theme/versions.html:11
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versionen"
diff --git a/docs/themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.po
index cbf7e9a7d7a..911cc117177 100644
--- a/docs/themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.po
+++ b/docs/themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-05-06 13:38-0600\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
"PO-Revision-Date: 2019-07-16 15:43-0600\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n"
@@ -19,42 +19,64 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.8.0\n"
-#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
+#. This is an ARIA section label for page links, including previous/next page
+#. link and links to GitHub/GitLab/etc.
+#: sphinx_rtd_theme/breadcrumbs.html:22
+msgid "Page navigation"
+msgstr ""
+
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr ""
-#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr ""
-#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr ""
-#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr ""
-#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
-msgid "Next"
+#. This is an ARIA section label for sequential page links, such as previous
+#. and next page links.
+#: sphinx_rtd_theme/breadcrumbs.html:67
+msgid "Sequential page navigation"
msgstr ""
-#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr ""
-#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
-#: sphinx_rtd_theme/layout.html:96
-msgid "Copyright"
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
+msgid "Next"
+msgstr ""
+
+#. This is an ARIA section label for the footer section of the page.
+#: sphinx_rtd_theme/footer.html:4
+msgid "Footer"
+msgstr ""
+
+#: sphinx_rtd_theme/footer.html:21
+#, python-format
+msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr ""
+
+#: sphinx_rtd_theme/footer.html:23
+#, python-format
+msgid "&#169; Copyright %(copyright)s."
msgstr ""
#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:31
+#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr ""
#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:37
+#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr ""
@@ -65,59 +87,70 @@ msgstr ""
#. the variable "sphinx_web" is a link to the Sphinx project documentation with
#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
+#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr ""
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
+#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr ""
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
+#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr ""
-#: sphinx_rtd_theme/layout.html:79
+#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr ""
-#: sphinx_rtd_theme/layout.html:87
+#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr ""
-#: sphinx_rtd_theme/layout.html:90
+#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr ""
-#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr ""
-#: sphinx_rtd_theme/layout.html:121
-msgid "Documentation Home"
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
msgstr ""
-#: sphinx_rtd_theme/layout.html:128
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr ""
-#: sphinx_rtd_theme/search.html:29
+#. This is an ARIA section label for the main navigation menu
+#: sphinx_rtd_theme/layout.html:173
+msgid "Navigation menu"
+msgstr ""
+
+#. This is an ARIA section label for the navigation menu that is visible when
+#. viewing the page on mobile devices
+#: sphinx_rtd_theme/layout.html:195
+msgid "Mobile navigation menu"
+msgstr ""
+
+#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr ""
#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:37
+#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr ""
-#: sphinx_rtd_theme/search.html:39
+#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words "
"are spelled correctly and that you've selected enough categories."
@@ -127,7 +160,7 @@ msgstr ""
msgid "Search docs"
msgstr ""
-#: sphinx_rtd_theme/versions.html:11
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr ""
@@ -154,3 +187,15 @@ msgstr ""
#~ msgid "Free document hosting provided by"
#~ msgstr ""
+#~ msgid "Documentation Home"
+#~ msgstr ""
+
+#~ msgid "Breadcrumbs"
+#~ msgstr ""
+
+#~ msgid "Main"
+#~ msgstr ""
+
+#~ msgid "Top"
+#~ msgstr ""
+
diff --git a/docs/themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.po
index 0b69d14192e..4fc5e70ccfb 100644
--- a/docs/themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.po
+++ b/docs/themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.po
@@ -7,14 +7,15 @@
# Translators:
# Anthony <aj@ohess.org>, 2019
# Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2020
+# Radina Matic <radina.matic@gmail.com>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-05-06 13:38-0600\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2020\n"
+"Last-Translator: Radina Matic <radina.matic@gmail.com>, 2021\n"
"Language-Team: Spanish (https://www.transifex.com/readthedocs/teams/101354/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,107 +24,102 @@ msgstr ""
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Editar en GitHub"
-#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Editar en Bitbucket"
-#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Editar en GitLab"
-#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "Ver código fuente de la página"
-#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Siguiente"
-
-#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "Anterior"
-#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
-#: sphinx_rtd_theme/layout.html:96
-msgid "Copyright"
-msgstr "Derechos de autor"
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
+msgid "Next"
+msgstr "Siguiente"
#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:31
+#: sphinx_rtd_theme/footer.html:30
msgid "Build"
-msgstr "Construido"
+msgstr "Compilación"
#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:37
+#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Revisión"
#: sphinx_rtd_theme/footer.html:41
#, python-format
msgid "Last updated on %(last_updated)s."
-msgstr "Actualizado por última vez en %(last_updated)s."
+msgstr "Actualizado por última vez el %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with
#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
+#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
-msgstr "Construido con %(sphinx_web)s usando un"
+msgstr "Compilado con %(sphinx_web)s usando un"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
+#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "tema"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
+#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "proporcionado por %(readthedocs_web)s"
-#: sphinx_rtd_theme/layout.html:79
+#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Buscar en %(docstitle)s"
-#: sphinx_rtd_theme/layout.html:87
+#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Sobre esta documentación"
-#: sphinx_rtd_theme/layout.html:90
+#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Índice"
-#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Búsqueda"
-#: sphinx_rtd_theme/layout.html:121
-msgid "Documentation Home"
-msgstr "Inicio de Documentación"
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
+msgstr "Derechos de autor"
-#: sphinx_rtd_theme/layout.html:128
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logotipo"
-#: sphinx_rtd_theme/search.html:29
+#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr ""
"Por favor, active JavaScript para habilitar la funcionalidad de búsqueda."
#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:37
+#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Resultados de la búsqueda"
-#: sphinx_rtd_theme/search.html:39
+#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@@ -136,7 +132,7 @@ msgstr ""
msgid "Search docs"
msgstr "Buscar documentos"
-#: sphinx_rtd_theme/versions.html:11
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versiones"
@@ -155,10 +151,13 @@ msgstr "Página de Proyecto"
#: sphinx_rtd_theme/versions.html:29
msgid "Builds"
-msgstr "Construcciones"
+msgstr "Compilaciones"
#~ msgid "Docs"
#~ msgstr "Documentos"
#~ msgid "Free document hosting provided by"
-#~ msgstr "Alojamiento gratuito de documentos proporcionado por"
+#~ msgstr "Alojamiento gratuito de documentación proporcionado por"
+
+#~ msgid "Documentation Home"
+#~ msgstr "Inicio de Documentación"
diff --git a/docs/themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.po
index e2217542ae1..1e8839a040a 100644
--- a/docs/themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.po
+++ b/docs/themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.po
@@ -6,15 +6,15 @@
#
# Translators:
# Anthony <aj@ohess.org>, 2020
-# Ivar Smolin <okul@linux.ee>, 2020
+# Ivar Smolin <okul@linux.ee>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-05-06 13:38-0600\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: Ivar Smolin <okul@linux.ee>, 2020\n"
+"Last-Translator: Ivar Smolin <okul@linux.ee>, 2021\n"
"Language-Team: Estonian (https://www.transifex.com/readthedocs/teams/101354/et/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,42 +23,47 @@ msgstr ""
"Language: et\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Muuda GitHubis"
-#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Muuda Bitbucketis"
-#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Muuda GitLabis"
-#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "Vaata lehe lähtekoodi"
-#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
+msgid "Previous"
+msgstr "Eelmine"
+
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next"
msgstr "Järgmine"
-#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
-msgid "Previous"
-msgstr "Eelmine"
+#: sphinx_rtd_theme/footer.html:21
+#, python-format
+msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&#169; <a href=\"%(path)s\">Autoriõigus</a> %(copyright)s."
-#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
-#: sphinx_rtd_theme/layout.html:96
-msgid "Copyright"
-msgstr "Autoriõigus"
+#: sphinx_rtd_theme/footer.html:23
+#, python-format
+msgid "&#169; Copyright %(copyright)s."
+msgstr "&#169; Autoriõigus %(copyright)s."
#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:31
+#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Ehitus"
#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:37
+#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Redaktsioon"
@@ -70,52 +75,59 @@ msgstr "Viimati uuendatud %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with
#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
+#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr "Ehitatud %(sphinx_web)s'iga,"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
+#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "kujundusteema"
-#: sphinx_rtd_theme/layout.html:79
+#. this is always used as "provided by Read the Docs", and should not imply
+#. Read the Docs is an author of the generated documentation.
+#: sphinx_rtd_theme/footer.html:57
+#, python-format
+msgid "provided by %(readthedocs_web)s"
+msgstr "on loonud %(readthedocs_web)s"
+
+#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Otsi dokumendist %(docstitle)s"
-#: sphinx_rtd_theme/layout.html:87
+#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Nende dokumentide kirjeldused"
-#: sphinx_rtd_theme/layout.html:90
+#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Indeks"
-#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Otsing"
-#: sphinx_rtd_theme/layout.html:121
-msgid "Documentation Home"
-msgstr "Dokumentatsiooni kodu"
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
+msgstr "Autoriõigus"
-#: sphinx_rtd_theme/layout.html:128
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
-#: sphinx_rtd_theme/search.html:29
+#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr "Otsimisfunktsiooni lubamiseks aktiveeri palun JavaScript"
#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:37
+#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Otsingu tulemused"
-#: sphinx_rtd_theme/search.html:39
+#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@@ -127,7 +139,7 @@ msgstr ""
msgid "Search docs"
msgstr "Otsi dokumente"
-#: sphinx_rtd_theme/versions.html:11
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versioonid"
@@ -153,3 +165,6 @@ msgstr "Ehitused"
#~ msgid "Free document hosting provided by"
#~ msgstr "Dokumentatsiooni majutab tasuta"
+
+#~ msgid "Documentation Home"
+#~ msgstr "Dokumentatsiooni kodu"
diff --git a/docs/themes/sphinx_rtd_theme/locale/fa_IR/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/fa_IR/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000000..dfb0571be12
--- /dev/null
+++ b/docs/themes/sphinx_rtd_theme/locale/fa_IR/LC_MESSAGES/sphinx.po
@@ -0,0 +1,160 @@
+# English translations for sphinx_rtd_theme.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the sphinx_rtd_theme
+# project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
+#
+# Translators:
+# Anthony <aj@ohess.org>, 2021
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
+"PO-Revision-Date: 2019-07-16 21:44+0000\n"
+"Last-Translator: Anthony <aj@ohess.org>, 2021\n"
+"Language-Team: Persian (Iran) (https://www.transifex.com/readthedocs/teams/101354/fa_IR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+"Language: fa_IR\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
+msgid "Edit on GitHub"
+msgstr "ویرایش در GitHub"
+
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
+msgid "Edit on Bitbucket"
+msgstr "ویرایش در Bitbucket"
+
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
+msgid "Edit on GitLab"
+msgstr "ویرایش در GitLab"
+
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
+msgid "View page source"
+msgstr "نمایش متن منبع صفحه"
+
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
+msgid "Previous"
+msgstr "پیشین"
+
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
+msgid "Next"
+msgstr "بعدی"
+
+#: sphinx_rtd_theme/footer.html:21
+#, python-format
+msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&#169; <a href=\"%(path)s\">حق انتشار</a> %(copyright)s."
+
+#: sphinx_rtd_theme/footer.html:23
+#, python-format
+msgid "&#169; Copyright %(copyright)s."
+msgstr "&#169; حق انتشار%(copyright)s."
+
+#. Build is a noun, not a verb
+#: sphinx_rtd_theme/footer.html:30
+msgid "Build"
+msgstr "ساخت"
+
+#. the phrase "revision" comes from Git, referring to a commit
+#: sphinx_rtd_theme/footer.html:36
+msgid "Revision"
+msgstr "بازبینی"
+
+#: sphinx_rtd_theme/footer.html:41
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "آخرین بروز رسانی در %(last_updated)s ."
+
+#. the variable "sphinx_web" is a link to the Sphinx project documentation
+#. with
+#. the text "Sphinx"
+#: sphinx_rtd_theme/footer.html:53
+#, python-format
+msgid "Built with %(sphinx_web)s using a"
+msgstr "ساخته شده با %(sphinx_web)s"
+
+#. "theme" refers to a theme for Sphinx, which alters the appearance of the
+#. generated documenation
+#: sphinx_rtd_theme/footer.html:55
+msgid "theme"
+msgstr "پوسته"
+
+#. this is always used as "provided by Read the Docs", and should not imply
+#. Read the Docs is an author of the generated documentation.
+#: sphinx_rtd_theme/footer.html:57
+#, python-format
+msgid "provided by %(readthedocs_web)s"
+msgstr "تهیّه شده با %(readthedocs_web)s"
+
+#: sphinx_rtd_theme/layout.html:97
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "جستجو در %(docstitle)s"
+
+#: sphinx_rtd_theme/layout.html:105
+msgid "About these documents"
+msgstr "درباره این مستندات"
+
+#: sphinx_rtd_theme/layout.html:108
+msgid "Index"
+msgstr "فهرست"
+
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
+msgid "Search"
+msgstr "جستجوی"
+
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
+msgstr "کپی رایت"
+
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
+msgid "Logo"
+msgstr "آرم"
+
+#: sphinx_rtd_theme/search.html:31
+msgid "Please activate JavaScript to enable the search functionality."
+msgstr "لطفاً جاوا اسکریپت را فعّال کنید تا قابلیّت جستجو فعّال شود."
+
+#. Search is a noun, not a verb
+#: sphinx_rtd_theme/search.html:39
+msgid "Search Results"
+msgstr "نتایج جستجو"
+
+#: sphinx_rtd_theme/search.html:41
+msgid ""
+"Your search did not match any documents. Please make sure that all words are"
+" spelled correctly and that you've selected enough categories."
+msgstr ""
+"جستجوی شما با هیچ سندی مطابقت نداشت. لطفاً از درستی املای واژگان مطمئن شوید."
+" هم‌چنین بررسی کنید آیا به اندازه کافی دسته بندی انتخاب کرده‌اید."
+
+#: sphinx_rtd_theme/searchbox.html:4
+msgid "Search docs"
+msgstr "جستجوی مستندات"
+
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
+msgid "Versions"
+msgstr "نگارش‌ها"
+
+#: sphinx_rtd_theme/versions.html:17
+msgid "Downloads"
+msgstr "بارگیری‌ها"
+
+#. The phrase "Read the Docs" is not translated
+#: sphinx_rtd_theme/versions.html:24
+msgid "On Read the Docs"
+msgstr "درباره‌ی خواندن مستندات"
+
+#: sphinx_rtd_theme/versions.html:26
+msgid "Project Home"
+msgstr "صفحه خانگی پروژه"
+
+#: sphinx_rtd_theme/versions.html:29
+msgid "Builds"
+msgstr "ساخت‌ها"
diff --git a/docs/themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.po
index b8c69d92aa9..1092287d9ea 100644
--- a/docs/themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.po
+++ b/docs/themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.po
@@ -5,16 +5,17 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
#
# Translators:
-# Radina Matic <radina.matic@gmail.com>, 2020
# Anthony <aj@ohess.org>, 2020
+# Nicolas Friedli <nicolas.friedli@gmail.com>, 2021
+# Radina Matic <radina.matic@gmail.com>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-05-06 13:38-0600\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: Anthony <aj@ohess.org>, 2020\n"
+"Last-Translator: Radina Matic <radina.matic@gmail.com>, 2021\n"
"Language-Team: French (https://www.transifex.com/readthedocs/teams/101354/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,42 +24,37 @@ msgstr ""
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Éditer sur GitHub"
-#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Éditer sur Bitbucket"
-#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Éditer sur GitLab"
-#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "Afficher la source de la page"
-#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Suivant"
-
-#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "Précédent"
-#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
-#: sphinx_rtd_theme/layout.html:96
-msgid "Copyright"
-msgstr "Droits d'auteur"
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
+msgid "Next"
+msgstr "Suivant"
#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:31
+#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Compilation"
#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:37
+#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Révision"
@@ -70,55 +66,59 @@ msgstr "Dernière mise à jour le %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with
#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
+#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr "Compilé avec %(sphinx_web)s en utilisant un"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
+#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "thème"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
+#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "fourni par %(readthedocs_web)s"
-#: sphinx_rtd_theme/layout.html:79
+#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Rechercher dans %(docstitle)s"
-#: sphinx_rtd_theme/layout.html:87
+#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "À propos de cette documentation"
-#: sphinx_rtd_theme/layout.html:90
+#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Index"
-#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Rechercher"
-#: sphinx_rtd_theme/layout.html:128
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
+msgstr "Droits d'auteur"
+
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
-#: sphinx_rtd_theme/search.html:29
+#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr "Activez JavaScript pour accéder à la fonction de recherche."
#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:37
+#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Résultats de la recherche"
-#: sphinx_rtd_theme/search.html:39
+#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@@ -131,7 +131,7 @@ msgstr ""
msgid "Search docs"
msgstr "Rechercher docs"
-#: sphinx_rtd_theme/versions.html:11
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versions"
@@ -139,6 +139,11 @@ msgstr "Versions"
msgid "Downloads"
msgstr "Téléchargements"
+#. The phrase "Read the Docs" is not translated
+#: sphinx_rtd_theme/versions.html:24
+msgid "On Read the Docs"
+msgstr "À propos de Read the Docs"
+
#: sphinx_rtd_theme/versions.html:26
msgid "Project Home"
msgstr "Accueil du projet"
@@ -152,3 +157,6 @@ msgstr "Compilations"
#~ msgid "Free document hosting provided by"
#~ msgstr "Hébergement gratuit de documents fourni par"
+
+#~ msgid "Documentation Home"
+#~ msgstr "Accueil de la documentation"
diff --git a/docs/themes/sphinx_rtd_theme/locale/it/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/it/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000000..10cf73d16c3
--- /dev/null
+++ b/docs/themes/sphinx_rtd_theme/locale/it/LC_MESSAGES/sphinx.po
@@ -0,0 +1,171 @@
+# English translations for sphinx_rtd_theme.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the sphinx_rtd_theme
+# project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
+#
+# Translators:
+# Anthony <aj@ohess.org>, 2021
+# Maurizio Paglia <mpaglia0@gmail.com>, 2021
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
+"PO-Revision-Date: 2019-07-16 21:44+0000\n"
+"Last-Translator: Maurizio Paglia <mpaglia0@gmail.com>, 2021\n"
+"Language-Team: Italian (https://www.transifex.com/readthedocs/teams/101354/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
+msgid "Edit on GitHub"
+msgstr "Modifica su GitHub"
+
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
+msgid "Edit on Bitbucket"
+msgstr "Modifica su Bitbucket"
+
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
+msgid "Edit on GitLab"
+msgstr "Modifica su GitLab"
+
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
+msgid "View page source"
+msgstr "Visualizza sorgente pagina"
+
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
+msgid "Previous"
+msgstr "Precedente"
+
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
+msgid "Next"
+msgstr "Prossimo"
+
+#: sphinx_rtd_theme/footer.html:21
+#, python-format
+msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx_rtd_theme/footer.html:23
+#, python-format
+msgid "&#169; Copyright %(copyright)s."
+msgstr "&#169; Copyright %(copyright)s."
+
+#. Build is a noun, not a verb
+#: sphinx_rtd_theme/footer.html:30
+msgid "Build"
+msgstr "Rev."
+
+#. the phrase "revision" comes from Git, referring to a commit
+#: sphinx_rtd_theme/footer.html:36
+msgid "Revision"
+msgstr "Revisione"
+
+#: sphinx_rtd_theme/footer.html:41
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Ultimo aggiornamento il %(last_updated)s."
+
+#. the variable "sphinx_web" is a link to the Sphinx project documentation
+#. with
+#. the text "Sphinx"
+#: sphinx_rtd_theme/footer.html:53
+#, python-format
+msgid "Built with %(sphinx_web)s using a"
+msgstr "Realizzato con %(sphinx_web)s e il tema"
+
+#. "theme" refers to a theme for Sphinx, which alters the appearance of the
+#. generated documenation
+#: sphinx_rtd_theme/footer.html:55
+msgid "theme"
+msgstr "tema"
+
+#. this is always used as "provided by Read the Docs", and should not imply
+#. Read the Docs is an author of the generated documentation.
+#: sphinx_rtd_theme/footer.html:57
+#, python-format
+msgid "provided by %(readthedocs_web)s"
+msgstr "fornito da %(readthedocs_web)s"
+
+#: sphinx_rtd_theme/layout.html:97
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Cerca in %(docstitle)s"
+
+#: sphinx_rtd_theme/layout.html:105
+msgid "About these documents"
+msgstr "Nota sulla documentazione"
+
+#: sphinx_rtd_theme/layout.html:108
+msgid "Index"
+msgstr "Indice"
+
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
+msgid "Search"
+msgstr "Ricerca"
+
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
+msgid "Logo"
+msgstr "Logo"
+
+#: sphinx_rtd_theme/search.html:31
+msgid "Please activate JavaScript to enable the search functionality."
+msgstr "Devi attivare JavaScript per attivare la funzione di ricerca."
+
+#. Search is a noun, not a verb
+#: sphinx_rtd_theme/search.html:39
+msgid "Search Results"
+msgstr "Risultati della ricerca"
+
+#: sphinx_rtd_theme/search.html:41
+msgid ""
+"Your search did not match any documents. Please make sure that all words are"
+" spelled correctly and that you've selected enough categories."
+msgstr ""
+"La tua ricerca non ha prodotto nessun risultato. Assicurati di aver scritto "
+"correttamente tutti i termini cercati e di aver selezionato sufficienti "
+"categorie."
+
+#: sphinx_rtd_theme/searchbox.html:4
+msgid "Search docs"
+msgstr "Cerca documenti"
+
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
+msgid "Versions"
+msgstr "Versioni"
+
+#: sphinx_rtd_theme/versions.html:17
+msgid "Downloads"
+msgstr "Downloads"
+
+#. The phrase "Read the Docs" is not translated
+#: sphinx_rtd_theme/versions.html:24
+msgid "On Read the Docs"
+msgstr "Riguardo Read the Docs"
+
+#: sphinx_rtd_theme/versions.html:26
+msgid "Project Home"
+msgstr "Home progetto"
+
+#: sphinx_rtd_theme/versions.html:29
+msgid "Builds"
+msgstr "Rev."
+
+#~ msgid "Docs"
+#~ msgstr "Documenti"
+
+#~ msgid "Free document hosting provided by"
+#~ msgstr "L'archivio gratuito della documentazione è offerto da"
+
+#~ msgid "Documentation Home"
+#~ msgstr "Indice documenti"
diff --git a/docs/themes/sphinx_rtd_theme/locale/lt/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/lt/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000000..eb45b2b091e
--- /dev/null
+++ b/docs/themes/sphinx_rtd_theme/locale/lt/LC_MESSAGES/sphinx.po
@@ -0,0 +1,169 @@
+# English translations for sphinx_rtd_theme.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the sphinx_rtd_theme
+# project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
+#
+# Translators:
+# Tomas Straupis, 2021
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
+"PO-Revision-Date: 2019-07-16 21:44+0000\n"
+"Last-Translator: Tomas Straupis, 2021\n"
+"Language-Team: Lithuanian (https://www.transifex.com/readthedocs/teams/101354/lt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+"Language: lt\n"
+"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n"
+
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
+msgid "Edit on GitHub"
+msgstr "Keisti GitHub'e"
+
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
+msgid "Edit on Bitbucket"
+msgstr "Keisti Bitbucket'e"
+
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
+msgid "Edit on GitLab"
+msgstr "Keisti GitLab'e"
+
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
+msgid "View page source"
+msgstr "Žiūrėti puslapio šaltinį"
+
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
+msgid "Previous"
+msgstr "Ankstesnis"
+
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
+msgid "Next"
+msgstr "Kitas"
+
+#: sphinx_rtd_theme/footer.html:21
+#, python-format
+msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx_rtd_theme/footer.html:23
+#, python-format
+msgid "&#169; Copyright %(copyright)s."
+msgstr "&#169; Copyright %(copyright)s."
+
+#. Build is a noun, not a verb
+#: sphinx_rtd_theme/footer.html:30
+msgid "Build"
+msgstr "Surinkimas"
+
+#. the phrase "revision" comes from Git, referring to a commit
+#: sphinx_rtd_theme/footer.html:36
+msgid "Revision"
+msgstr "Versija"
+
+#: sphinx_rtd_theme/footer.html:41
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Atnaujinta %(last_updated)s."
+
+#. the variable "sphinx_web" is a link to the Sphinx project documentation
+#. with
+#. the text "Sphinx"
+#: sphinx_rtd_theme/footer.html:53
+#, python-format
+msgid "Built with %(sphinx_web)s using a"
+msgstr "Surinkta su %(sphinx_web)s naudojant"
+
+#. "theme" refers to a theme for Sphinx, which alters the appearance of the
+#. generated documenation
+#: sphinx_rtd_theme/footer.html:55
+msgid "theme"
+msgstr "temą"
+
+#. this is always used as "provided by Read the Docs", and should not imply
+#. Read the Docs is an author of the generated documentation.
+#: sphinx_rtd_theme/footer.html:57
+#, python-format
+msgid "provided by %(readthedocs_web)s"
+msgstr "pateiktą %(readthedocs_web)s"
+
+#: sphinx_rtd_theme/layout.html:97
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Ieškoti %(docstitle)s"
+
+#: sphinx_rtd_theme/layout.html:105
+msgid "About these documents"
+msgstr "Apie šiuos dokumentus"
+
+#: sphinx_rtd_theme/layout.html:108
+msgid "Index"
+msgstr "Indeksas"
+
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
+msgid "Search"
+msgstr "Paieška"
+
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
+msgstr "Autorių teisės"
+
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
+msgid "Logo"
+msgstr "Logo"
+
+#: sphinx_rtd_theme/search.html:31
+msgid "Please activate JavaScript to enable the search functionality."
+msgstr "Prašome įjungti JavaScript, kad veiktų paieškos funkcionalumas."
+
+#. Search is a noun, not a verb
+#: sphinx_rtd_theme/search.html:39
+msgid "Search Results"
+msgstr "Paieškos rezultatai"
+
+#: sphinx_rtd_theme/search.html:41
+msgid ""
+"Your search did not match any documents. Please make sure that all words are"
+" spelled correctly and that you've selected enough categories."
+msgstr ""
+"Jūsų paieškai neatitiko nei vienas dokumentas. Prašome įsitikinti, kad visi "
+"žodžiai parašyti teisingai ir kad parinkote pakankamai kategorijų."
+
+#: sphinx_rtd_theme/searchbox.html:4
+msgid "Search docs"
+msgstr "Ieškoti dokumentuose"
+
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
+msgid "Versions"
+msgstr "Versijos"
+
+#: sphinx_rtd_theme/versions.html:17
+msgid "Downloads"
+msgstr "Atsisiuntimai"
+
+#. The phrase "Read the Docs" is not translated
+#: sphinx_rtd_theme/versions.html:24
+msgid "On Read the Docs"
+msgstr "Apie Read the Docs"
+
+#: sphinx_rtd_theme/versions.html:26
+msgid "Project Home"
+msgstr "Projekto namai"
+
+#: sphinx_rtd_theme/versions.html:29
+msgid "Builds"
+msgstr "Surinkimai"
+
+#~ msgid "Docs"
+#~ msgstr "Dokumentai"
+
+#~ msgid "Free document hosting provided by"
+#~ msgstr "Nemokamą dokumentacijos talpinimą teikia"
+
+#~ msgid "Documentation Home"
+#~ msgstr "Dokumentacijos namai"
diff --git a/docs/themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.po
index 7963c0278a1..17e7436f74e 100644
--- a/docs/themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.po
+++ b/docs/themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-05-06 13:38-0600\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Jesse Tan, 2019\n"
"Language-Team: Dutch (https://www.transifex.com/readthedocs/teams/101354/nl/)\n"
@@ -22,42 +22,37 @@ msgstr ""
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Bewerk op GitHub"
-#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Bewerk op BitBucket"
-#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Bewerk op GitLab"
-#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "Bekijk paginabron"
-#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Volgende"
-
-#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "Vorige"
-#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
-#: sphinx_rtd_theme/layout.html:96
-msgid "Copyright"
-msgstr "Copyright"
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
+msgid "Next"
+msgstr "Volgende"
#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:31
+#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Bouwresultaat"
#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:37
+#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Revisie"
@@ -69,55 +64,59 @@ msgstr "Laatste update op %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with
#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
+#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr "Gebouwd met %(sphinx_web)s met een"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
+#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "thema"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
+#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "geleverd door %(readthedocs_web)s"
-#: sphinx_rtd_theme/layout.html:79
+#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Zoek binnen %(docstitle)s"
-#: sphinx_rtd_theme/layout.html:87
+#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Over deze documenten"
-#: sphinx_rtd_theme/layout.html:90
+#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Index"
-#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Zoek"
-#: sphinx_rtd_theme/layout.html:128
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
-#: sphinx_rtd_theme/search.html:29
+#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr "Zet JavaScript aan om de zoekfunctie mogelijk te maken."
#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:37
+#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Zoekresultaten"
-#: sphinx_rtd_theme/search.html:39
+#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@@ -129,7 +128,7 @@ msgstr ""
msgid "Search docs"
msgstr "Zoek in documentatie"
-#: sphinx_rtd_theme/versions.html:11
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versies"
diff --git a/docs/themes/sphinx_rtd_theme/locale/pl/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/pl/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000000..a7f262b1b20
--- /dev/null
+++ b/docs/themes/sphinx_rtd_theme/locale/pl/LC_MESSAGES/sphinx.po
@@ -0,0 +1,143 @@
+# English translations for sphinx_rtd_theme.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the sphinx_rtd_theme
+# project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
+#
+# Translators:
+# Michal Sniatala, 2021
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
+"PO-Revision-Date: 2019-07-16 21:44+0000\n"
+"Last-Translator: Michal Sniatala, 2021\n"
+"Language-Team: Polish (https://www.transifex.com/readthedocs/teams/101354/pl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+"Language: pl\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
+
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
+msgid "Edit on GitHub"
+msgstr "Edytuj na GitHub"
+
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
+msgid "Edit on Bitbucket"
+msgstr "Edytuj na Bitbucket"
+
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
+msgid "Edit on GitLab"
+msgstr "Edytuj na GitLab"
+
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
+msgid "View page source"
+msgstr "Zobacz źródło strony"
+
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
+msgid "Previous"
+msgstr "Poprzedni"
+
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
+msgid "Next"
+msgstr "Następny"
+
+#: sphinx_rtd_theme/footer.html:21
+#, python-format
+msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&#169; <a href=\"%(path)s\">Prawa zastrzeżone</a> %(copyright)s."
+
+#: sphinx_rtd_theme/footer.html:23
+#, python-format
+msgid "&#169; Copyright %(copyright)s."
+msgstr "&#169; Prawa zastrzeżone %(copyright)s."
+
+#: sphinx_rtd_theme/footer.html:41
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Ostatnia aktualizacja %(last_updated)s."
+
+#. the variable "sphinx_web" is a link to the Sphinx project documentation
+#. with
+#. the text "Sphinx"
+#: sphinx_rtd_theme/footer.html:53
+#, python-format
+msgid "Built with %(sphinx_web)s using a"
+msgstr "Zbudowano w %(sphinx_web)s używając"
+
+#. this is always used as "provided by Read the Docs", and should not imply
+#. Read the Docs is an author of the generated documentation.
+#: sphinx_rtd_theme/footer.html:57
+#, python-format
+msgid "provided by %(readthedocs_web)s"
+msgstr "dostarczone przez %(readthedocs_web)s"
+
+#: sphinx_rtd_theme/layout.html:97
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Szukaj w %(docstitle)s"
+
+#: sphinx_rtd_theme/layout.html:105
+msgid "About these documents"
+msgstr "O tych dokumentach"
+
+#: sphinx_rtd_theme/layout.html:108
+msgid "Index"
+msgstr "Indeks"
+
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
+msgid "Search"
+msgstr "Szukaj"
+
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
+msgstr "Prawa zastrzeżone"
+
+#: sphinx_rtd_theme/search.html:31
+msgid "Please activate JavaScript to enable the search functionality."
+msgstr ""
+"Proszę aktywować obsługę JavaScript, aby włączyć funkcję wyszukiwania."
+
+#. Search is a noun, not a verb
+#: sphinx_rtd_theme/search.html:39
+msgid "Search Results"
+msgstr "Wyniki wyszukiwania"
+
+#: sphinx_rtd_theme/search.html:41
+msgid ""
+"Your search did not match any documents. Please make sure that all words are"
+" spelled correctly and that you've selected enough categories."
+msgstr ""
+"Nie znaleziono szukanej frazy. Upewnij się, że wszystkie słowa są napisane "
+"poprawnie i że wybrałeś wystarczającą liczbę kategorii."
+
+#: sphinx_rtd_theme/searchbox.html:4
+msgid "Search docs"
+msgstr "Szukaj"
+
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
+msgid "Versions"
+msgstr "Wersje"
+
+#: sphinx_rtd_theme/versions.html:17
+msgid "Downloads"
+msgstr "Pobrania"
+
+#. The phrase "Read the Docs" is not translated
+#: sphinx_rtd_theme/versions.html:24
+msgid "On Read the Docs"
+msgstr "Na Read the Docs"
+
+#: sphinx_rtd_theme/versions.html:26
+msgid "Project Home"
+msgstr "Strona projektu"
+
+#~ msgid "Free document hosting provided by"
+#~ msgstr "Bezpłatny hosting dokumentacji zapewniony przez"
+
+#~ msgid "Documentation Home"
+#~ msgstr "Strona dokumentacji"
diff --git a/docs/themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.po
index 8b5e7607fee..cdb57100f1e 100644
--- a/docs/themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.po
+++ b/docs/themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.po
@@ -5,15 +5,16 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
#
# Translators:
-# Rafael Fontenelle <rffontenelle@gmail.com>, 2020
+# Wellington Uemura <wellingtonuemura@gmail.com>, 2021
+# Rafael Fontenelle <rffontenelle@gmail.com>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-05-06 13:38-0600\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: Rafael Fontenelle <rffontenelle@gmail.com>, 2020\n"
+"Last-Translator: Rafael Fontenelle <rffontenelle@gmail.com>, 2021\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/readthedocs/teams/101354/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -22,42 +23,47 @@ msgstr ""
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Editar no GitHub"
-#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Editar no Bitbucket"
-#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Editar no GitLab"
-#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "Ver código-fonte da página"
-#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
+msgid "Previous"
+msgstr "Anterior"
+
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next"
msgstr "Próximo"
-#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
-msgid "Previous"
-msgstr "Anterior"
+#: sphinx_rtd_theme/footer.html:21
+#, python-format
+msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&#169; <a href=\"%(path)s\">Direitos autorais</a> %(copyright)s."
-#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
-#: sphinx_rtd_theme/layout.html:96
-msgid "Copyright"
-msgstr "Copyright"
+#: sphinx_rtd_theme/footer.html:23
+#, python-format
+msgid "&#169; Copyright %(copyright)s."
+msgstr "&#169; Direitos autorais %(copyright)s."
#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:31
+#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Compilação"
#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:37
+#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Revisão"
@@ -69,56 +75,60 @@ msgstr "Última atualização em %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with
#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
+#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr "Compilado com %(sphinx_web)s usando um"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
+#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "tema"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
+#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "fornecido por %(readthedocs_web)s"
-#: sphinx_rtd_theme/layout.html:79
+#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Pesquisar em %(docstitle)s"
-#: sphinx_rtd_theme/layout.html:87
+#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Sobre esses documentos"
-#: sphinx_rtd_theme/layout.html:90
+#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Índice"
-#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Pesquisar"
-#: sphinx_rtd_theme/layout.html:128
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
-#: sphinx_rtd_theme/search.html:29
+#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr ""
"Por favor, ative JavaScript para habilitar a funcionalidade de pesquisa."
#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:37
+#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Resultados da pesquisa"
-#: sphinx_rtd_theme/search.html:39
+#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@@ -131,7 +141,7 @@ msgstr ""
msgid "Search docs"
msgstr "Pesquisar documentos"
-#: sphinx_rtd_theme/versions.html:11
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versões"
@@ -157,3 +167,6 @@ msgstr "Compilações"
#~ msgid "Free document hosting provided by"
#~ msgstr "Hospedagem de documentos livres fornecida por"
+
+#~ msgid "Documentation Home"
+#~ msgstr "Página inicial da documentação"
diff --git a/docs/themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.po
index 1648d8d1ae8..3247c8ba652 100644
--- a/docs/themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.po
+++ b/docs/themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.po
@@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-05-06 13:38-0600\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: lvv83 <vlozhkin83@gmail.com>, 2019\n"
"Language-Team: Russian (https://www.transifex.com/readthedocs/teams/101354/ru/)\n"
@@ -23,42 +23,37 @@ msgstr ""
"Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
-#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Редактировать на GitHub"
-#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Редактировать на BitBucket"
-#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Редактировать на GitLab"
-#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "Просмотреть исходный код страницы"
-#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Следующая"
-
-#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "Предыдущая"
-#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
-#: sphinx_rtd_theme/layout.html:96
-msgid "Copyright"
-msgstr "Авторские права"
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
+msgid "Next"
+msgstr "Следующая"
#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:31
+#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Сборка"
#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:37
+#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Ревизия"
@@ -70,55 +65,59 @@ msgstr "Последний раз обновлено %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with
#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
+#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr "Собрано при помощи %(sphinx_web)s с использованием"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
+#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "темы,"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
+#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "предоставленной %(readthedocs_web)s"
-#: sphinx_rtd_theme/layout.html:79
+#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Поиск в %(docstitle)s"
-#: sphinx_rtd_theme/layout.html:87
+#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Об этих документах"
-#: sphinx_rtd_theme/layout.html:90
+#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Алфавитный указатель"
-#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Поиск"
-#: sphinx_rtd_theme/layout.html:128
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
+msgstr "Авторские права"
+
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Логотип"
-#: sphinx_rtd_theme/search.html:29
+#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr "Активируйте JavaScript, чтобы использовать функционал поиска."
#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:37
+#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Результаты поиска"
-#: sphinx_rtd_theme/search.html:39
+#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@@ -130,7 +129,7 @@ msgstr ""
msgid "Search docs"
msgstr "Поиск в документации"
-#: sphinx_rtd_theme/versions.html:11
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Версии"
diff --git a/docs/themes/sphinx_rtd_theme/locale/sphinx.pot b/docs/themes/sphinx_rtd_theme/locale/sphinx.pot
index ab183f810de..1f2f7950ba2 100644
--- a/docs/themes/sphinx_rtd_theme/locale/sphinx.pot
+++ b/docs/themes/sphinx_rtd_theme/locale/sphinx.pot
@@ -1,15 +1,15 @@
# Translations template for sphinx_rtd_theme.
-# Copyright (C) 2020 ORGANIZATION
+# Copyright (C) 2021 ORGANIZATION
# This file is distributed under the same license as the sphinx_rtd_theme
# project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2021.
#
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
+"Project-Id-Version: sphinx_rtd_theme 1.0.0rc1\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-05-06 13:38-0600\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,42 +18,64 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.8.0\n"
-#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
+#. This is an ARIA section label for page links, including previous/next page
+#. link and links to GitHub/GitLab/etc.
+#: sphinx_rtd_theme/breadcrumbs.html:22
+msgid "Page navigation"
+msgstr ""
+
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr ""
-#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr ""
-#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr ""
-#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr ""
-#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
-msgid "Next"
+#. This is an ARIA section label for sequential page links, such as previous
+#. and next page links.
+#: sphinx_rtd_theme/breadcrumbs.html:67
+msgid "Sequential page navigation"
msgstr ""
-#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr ""
-#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
-#: sphinx_rtd_theme/layout.html:96
-msgid "Copyright"
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
+msgid "Next"
+msgstr ""
+
+#. This is an ARIA section label for the footer section of the page.
+#: sphinx_rtd_theme/footer.html:4
+msgid "Footer"
+msgstr ""
+
+#: sphinx_rtd_theme/footer.html:21
+#, python-format
+msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr ""
+
+#: sphinx_rtd_theme/footer.html:23
+#, python-format
+msgid "&#169; Copyright %(copyright)s."
msgstr ""
#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:31
+#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr ""
#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:37
+#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr ""
@@ -64,59 +86,70 @@ msgstr ""
#. the variable "sphinx_web" is a link to the Sphinx project documentation with
#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
+#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr ""
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
+#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr ""
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
+#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr ""
-#: sphinx_rtd_theme/layout.html:79
+#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr ""
-#: sphinx_rtd_theme/layout.html:87
+#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr ""
-#: sphinx_rtd_theme/layout.html:90
+#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr ""
-#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr ""
-#: sphinx_rtd_theme/layout.html:121
-msgid "Documentation Home"
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
msgstr ""
-#: sphinx_rtd_theme/layout.html:128
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr ""
-#: sphinx_rtd_theme/search.html:29
+#. This is an ARIA section label for the main navigation menu
+#: sphinx_rtd_theme/layout.html:173
+msgid "Navigation menu"
+msgstr ""
+
+#. This is an ARIA section label for the navigation menu that is visible when
+#. viewing the page on mobile devices
+#: sphinx_rtd_theme/layout.html:195
+msgid "Mobile navigation menu"
+msgstr ""
+
+#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr ""
#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:37
+#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr ""
-#: sphinx_rtd_theme/search.html:39
+#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words "
"are spelled correctly and that you've selected enough categories."
@@ -126,7 +159,7 @@ msgstr ""
msgid "Search docs"
msgstr ""
-#: sphinx_rtd_theme/versions.html:11
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr ""
diff --git a/docs/themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.po
index e9d80b05465..111972519ff 100644
--- a/docs/themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.po
+++ b/docs/themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-05-06 13:38-0600\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Daniel Holmberg <daniel.holmberg97@gmail.com>, 2020\n"
"Language-Team: Swedish (https://www.transifex.com/readthedocs/teams/101354/sv/)\n"
@@ -22,42 +22,37 @@ msgstr ""
"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Editera på GitHub"
-#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Editera på Bitbucket"
-#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Editera på GitLab"
-#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "Visa sidkälla"
-#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Nästa"
-
-#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "Tillbaka"
-#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
-#: sphinx_rtd_theme/layout.html:96
-msgid "Copyright"
-msgstr "Upphovsrätt"
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
+msgid "Next"
+msgstr "Nästa"
#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:31
+#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Bygg"
#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:37
+#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Ändra"
@@ -69,60 +64,60 @@ msgstr "Senast uppdaterad %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with
#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
+#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr "Gjord med %(sphinx_web)s med hjälp av"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
+#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "tema"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
+#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "erhållet av %(readthedocs_web)s"
-#: sphinx_rtd_theme/layout.html:79
+#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Sök i %(docstitle)s"
-#: sphinx_rtd_theme/layout.html:87
+#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Om dessa dokument"
-#: sphinx_rtd_theme/layout.html:90
+#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Index"
-#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Sök"
-#: sphinx_rtd_theme/layout.html:121
-msgid "Documentation Home"
-msgstr "Dokumentation Hem"
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
+msgstr "Upphovsrätt"
-#: sphinx_rtd_theme/layout.html:128
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
-#: sphinx_rtd_theme/search.html:29
+#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr ""
"Var vänlig och aktivera JavaScript för att möjliggöra sökfunktionaliteten."
#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:37
+#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Sökresultat"
-#: sphinx_rtd_theme/search.html:39
+#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@@ -134,7 +129,7 @@ msgstr ""
msgid "Search docs"
msgstr "Sök i dokumentationen"
-#: sphinx_rtd_theme/versions.html:11
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versioner"
@@ -151,8 +146,15 @@ msgstr "På Read the Docs"
msgid "Project Home"
msgstr "Projekt Hem"
+#: sphinx_rtd_theme/versions.html:29
+msgid "Builds"
+msgstr "Versioner"
+
#~ msgid "Docs"
#~ msgstr "Dokumentation"
#~ msgid "Free document hosting provided by"
#~ msgstr "Gratis dokumentations hysning erhållen av"
+
+#~ msgid "Documentation Home"
+#~ msgstr "Dokumentation Hem"
diff --git a/docs/themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.po
index 4f75e068fe9..475493efca2 100644
--- a/docs/themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.po
+++ b/docs/themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-05-06 13:38-0600\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: BouRock, 2020\n"
"Language-Team: Turkish (https://www.transifex.com/readthedocs/teams/101354/tr/)\n"
@@ -22,42 +22,37 @@ msgstr ""
"Language: tr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "GitHub'da Düzenle"
-#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Bitbucket'ta Düzenle"
-#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "GitLab'ta Düzenle"
-#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "Sayfa kaynağını görüntüle"
-#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Sonraki"
-
-#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "Önceki"
-#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
-#: sphinx_rtd_theme/layout.html:96
-msgid "Copyright"
-msgstr "Telif hakkı"
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
+msgid "Next"
+msgstr "Sonraki"
#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:31
+#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Oluşturma"
#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:37
+#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Gözden geçirme"
@@ -68,49 +63,53 @@ msgstr "Son olarak %(last_updated)s tarihinde güncellendi."
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
+#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "tema"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
+#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "kullanılarak %(readthedocs_web)s tarafından sağlanmasıyla oluşturuldu"
-#: sphinx_rtd_theme/layout.html:79
+#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "%(docstitle)s içinde ara"
-#: sphinx_rtd_theme/layout.html:87
+#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Bu belgeler hakkında"
-#: sphinx_rtd_theme/layout.html:90
+#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Dizin"
-#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Arama"
-#: sphinx_rtd_theme/layout.html:128
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
+msgstr "Telif hakkı"
+
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
-#: sphinx_rtd_theme/search.html:29
+#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr ""
"Arama işlevselliğini etkinleştirmek için lütfen JavaScript'i etkinleştirin."
#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:37
+#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Arama Sonuçları"
-#: sphinx_rtd_theme/search.html:39
+#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@@ -122,7 +121,7 @@ msgstr ""
msgid "Search docs"
msgstr "Belgeleri arayın"
-#: sphinx_rtd_theme/versions.html:11
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Sürümler"
@@ -143,5 +142,11 @@ msgstr "Proje Ana Sayfa"
msgid "Builds"
msgstr "Oluşturmalar"
+#~ msgid "Docs"
+#~ msgstr "Belgeler"
+
#~ msgid "Free document hosting provided by"
#~ msgstr "Ücretsiz belge barındırmayı sağlayan"
+
+#~ msgid "Documentation Home"
+#~ msgstr "Belgelendirme Giriş"
diff --git a/docs/themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.po b/docs/themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.po
index f30abb64ac3..85ff0fd537a 100644
--- a/docs/themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.po
+++ b/docs/themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.po
@@ -5,16 +5,16 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
#
# Translators:
-# 王赛 <wangsai@bootcss.com>, 2019
# Anthony <aj@ohess.org>, 2020
+# 王赛 <wangsai@bootcss.com>, 2020
#
msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-05-06 13:38-0600\n"
+"POT-Creation-Date: 2021-08-17 10:02-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: Anthony <aj@ohess.org>, 2020\n"
+"Last-Translator: 王赛 <wangsai@bootcss.com>, 2020\n"
"Language-Team: Chinese (China) (https://www.transifex.com/readthedocs/teams/101354/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,40 +23,40 @@ msgstr ""
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
+#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "在 GitHub 上修改"
-#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
+#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "在 Bitbucket 上修改"
-#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
+#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "在 GitLab 上修改"
-#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
+#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "查看页面源码"
-#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "下一页"
-
-#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
+#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "上一页"
-#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
-#: sphinx_rtd_theme/layout.html:96
-msgid "Copyright"
-msgstr "版权所有"
+#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
+msgid "Next"
+msgstr "下一页"
#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:31
+#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "构建"
+#. the phrase "revision" comes from Git, referring to a commit
+#: sphinx_rtd_theme/footer.html:36
+msgid "Revision"
+msgstr "修订"
+
#: sphinx_rtd_theme/footer.html:41
#, python-format
msgid "Last updated on %(last_updated)s."
@@ -65,55 +65,59 @@ msgstr "最后更新时间 %(last_updated)s。"
#. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with
#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
+#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr "利用 %(sphinx_web)s 构建,使用了 "
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
+#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "主题"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
+#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "由 %(readthedocs_web)s开发"
-#: sphinx_rtd_theme/layout.html:79
+#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "在 %(docstitle)s中搜索"
-#: sphinx_rtd_theme/layout.html:87
+#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "关于此文档"
-#: sphinx_rtd_theme/layout.html:90
+#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "索引"
-#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
+#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "搜索"
-#: sphinx_rtd_theme/layout.html:128
+#: sphinx_rtd_theme/layout.html:114
+msgid "Copyright"
+msgstr "版权所有"
+
+#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
-#: sphinx_rtd_theme/search.html:29
+#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr "请启用 JavaScript 以便使用搜索功能"
#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:37
+#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "搜索结果"
-#: sphinx_rtd_theme/search.html:39
+#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@@ -123,7 +127,7 @@ msgstr "您的搜索没有匹配到任何文档。请确保所有单词拼写正
msgid "Search docs"
msgstr "在文档中搜索"
-#: sphinx_rtd_theme/versions.html:11
+#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "版本列表"
@@ -149,3 +153,6 @@ msgstr "构建"
#~ msgid "Free document hosting provided by"
#~ msgstr "此文档免费托管于"
+
+#~ msgid "Documentation Home"
+#~ msgstr "文档首页"
diff --git a/docs/themes/sphinx_rtd_theme/search.html b/docs/themes/sphinx_rtd_theme/search.html
index 10ac568c41d..4c282db1f89 100644
--- a/docs/themes/sphinx_rtd_theme/search.html
+++ b/docs/themes/sphinx_rtd_theme/search.html
@@ -5,21 +5,23 @@
Template for the search page.
:copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
- :license: BSD, see LICENSE for details.
+ :license: BSD, see https://github.com/sphinx-doc/sphinx/blob/master/LICENSE for details.
#}
{%- extends "layout.html" %}
{% set title = _('Search') %}
+{% set display_vcs_links = False %}
{%- block scripts %}
{{ super() }}
- <script type="text/javascript" src="{{ pathto('_static/searchtools.js', 1) }}"></script>
+ <script src="{{ pathto('_static/searchtools.js', 1) }}"></script>
+ <script src="{{ pathto('_static/language_data.js', 1) }}"></script>
{%- endblock %}
{% block footer %}
- <script type="text/javascript">
+ <script>
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
</script>
{# this is used when loading the search index using $.ajax fails,
such as on Chrome for documents on localhost #}
- <script type="text/javascript" id="searchindexloader"></script>
+ <script id="searchindexloader"></script>
{{ super() }}
{% endblock %}
{% block body %}
diff --git a/docs/themes/sphinx_rtd_theme/searchbox.html b/docs/themes/sphinx_rtd_theme/searchbox.html
index 606f5c8c9d7..bc3ee5f0d8f 100644
--- a/docs/themes/sphinx_rtd_theme/searchbox.html
+++ b/docs/themes/sphinx_rtd_theme/searchbox.html
@@ -1,4 +1,4 @@
-{%- if builder != 'singlehtml' %}
+{%- if 'singlehtml' not in builder %}
<div role="search">
<form id="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get">
<input type="text" name="q" placeholder="{{ _('Search docs') }}" />
diff --git a/docs/themes/sphinx_rtd_theme/static/css/theme.css b/docs/themes/sphinx_rtd_theme/static/css/theme.css
index 8cd4f101a91..23a849a1376 100644
--- a/docs/themes/sphinx_rtd_theme/static/css/theme.css
+++ b/docs/themes/sphinx_rtd_theme/static/css/theme.css
@@ -1,4 +1,4 @@
-html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*!
+html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*!
* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li span.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p.caption .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a span.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-left.toctree-expand,.wy-menu-vertical li span.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p.caption .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a span.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-right.toctree-expand,.wy-menu-vertical li span.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li span.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li span.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li span.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li span.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p.caption .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.btn .wy-menu-vertical li span.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p.caption .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.nav .wy-menu-vertical li span.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p.caption .btn .headerlink,.rst-content p.caption .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li span.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol li,.rst-content ol.arabic li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content ol.arabic li p:last-child,.rst-content ol.arabic li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover span.toctree-expand,.wy-menu-vertical li.on a:hover span.toctree-expand{color:grey}.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand{display:block;font-size:.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover span.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content img{max-width:100%;height:auto}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure p.caption{font-style:italic}.rst-content div.figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp{user-select:none;pointer-events:none}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink{visibility:hidden;font-size:14px}.rst-content .code-block-caption .headerlink:after,.rst-content .toctree-wrapper>p.caption .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content p.caption .headerlink:after,.rst-content table>caption .headerlink:after{content:"\f0c1";font-family:FontAwesome}.rst-content .code-block-caption:hover .headerlink:after,.rst-content .toctree-wrapper>p.caption:hover .headerlink:after,.rst-content dl dt:hover .headerlink:after,.rst-content h1:hover .headerlink:after,.rst-content h2:hover .headerlink:after,.rst-content h3:hover .headerlink:after,.rst-content h4:hover .headerlink:after,.rst-content h5:hover .headerlink:after,.rst-content h6:hover .headerlink:after,.rst-content p.caption:hover .headerlink:after,.rst-content table>caption:hover .headerlink:after{visibility:visible}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl dt span.classifier:before{content:" : "}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code,html.writer-html4 .rst-content dl:not(.docutils) tt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file
+ */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code,html.writer-html4 .rst-content dl:not(.docutils) tt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/FontAwesome.otf b/docs/themes/sphinx_rtd_theme/static/fonts/FontAwesome.otf
deleted file mode 100644
index 401ec0f36e4..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/FontAwesome.otf
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.eot b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.eot
deleted file mode 100644
index 3361183a419..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.eot
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.ttf b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.ttf
deleted file mode 100644
index 29f691d5ed0..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.ttf
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.woff b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.woff
deleted file mode 100644
index c6dff51f063..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.woff2
deleted file mode 100644
index bb195043cfc..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.eot b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.eot
deleted file mode 100644
index 3d4154936b4..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.eot
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.ttf b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.ttf
deleted file mode 100644
index f402040b3e5..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.ttf
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.woff b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.woff
deleted file mode 100644
index 88ad05b9ff4..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.woff2
deleted file mode 100644
index c4e3d804b57..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.eot b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.eot
deleted file mode 100644
index 3f826421a1d..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.eot
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.ttf b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.ttf
deleted file mode 100644
index b4bfc9b24aa..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.ttf
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.woff b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.woff
deleted file mode 100644
index 76114bc0336..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.woff2
deleted file mode 100644
index 3404f37e2e3..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.eot b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.eot
deleted file mode 100644
index 11e3f2a5f0f..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.eot
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.ttf b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.ttf
deleted file mode 100644
index 74decd9ebb8..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.ttf
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.woff b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.woff
deleted file mode 100644
index ae1307ff5f4..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.woff2
deleted file mode 100644
index 3bf9843328a..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Bold.woff b/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Bold.woff
deleted file mode 100644
index 6cb60000181..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Bold.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Bold.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Bold.woff2
deleted file mode 100644
index 7059e23142a..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Bold.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Light.woff b/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Light.woff
deleted file mode 100644
index 337d287116c..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Light.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Light.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Light.woff2
deleted file mode 100644
index 20398aff31a..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Light.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Regular.woff b/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Regular.woff
deleted file mode 100644
index f815f63f99d..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Regular.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Regular.woff2
deleted file mode 100644
index f2c76e5bda1..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Regular.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Thin.woff b/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Thin.woff
deleted file mode 100644
index 6b30ea630d5..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Thin.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Thin.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Thin.woff2
deleted file mode 100644
index 328f5bb0428..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/Roboto-Slab-Thin.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.eot
deleted file mode 100644
index 79dc8efed34..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.eot
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf
deleted file mode 100644
index df5d1df2730..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff
deleted file mode 100644
index 6cb60000181..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2
deleted file mode 100644
index 7059e23142a..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.eot
deleted file mode 100644
index 2f7ca78a1eb..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.eot
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf
deleted file mode 100644
index eb52a790736..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff
deleted file mode 100644
index f815f63f99d..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2
deleted file mode 100644
index f2c76e5bda1..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.eot b/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.eot
deleted file mode 100644
index e9f60ca953f..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.eot
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.svg b/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.svg
deleted file mode 100644
index 855c845e538..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.svg
+++ /dev/null
@@ -1,2671 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg>
-<metadata>
-Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016
- By ,,,
-Copyright Dave Gandy 2016. All rights reserved.
-</metadata>
-<defs>
-<font id="FontAwesome" horiz-adv-x="1536" >
- <font-face
- font-family="FontAwesome"
- font-weight="400"
- font-stretch="normal"
- units-per-em="1792"
- panose-1="0 0 0 0 0 0 0 0 0 0"
- ascent="1536"
- descent="-256"
- bbox="-1.02083 -256.962 2304.6 1537.02"
- underline-thickness="0"
- underline-position="0"
- unicode-range="U+0020-F500"
- />
-<missing-glyph horiz-adv-x="896"
-d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" />
- <glyph glyph-name=".notdef" horiz-adv-x="896"
-d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" />
- <glyph glyph-name=".null" horiz-adv-x="0"
- />
- <glyph glyph-name="nonmarkingreturn" horiz-adv-x="597"
- />
- <glyph glyph-name="space" unicode=" " horiz-adv-x="448"
- />
- <glyph glyph-name="dieresis" unicode="&#xa8;" horiz-adv-x="1792"
- />
- <glyph glyph-name="copyright" unicode="&#xa9;" horiz-adv-x="1792"
- />
- <glyph glyph-name="registered" unicode="&#xae;" horiz-adv-x="1792"
- />
- <glyph glyph-name="acute" unicode="&#xb4;" horiz-adv-x="1792"
- />
- <glyph glyph-name="AE" unicode="&#xc6;" horiz-adv-x="1792"
- />
- <glyph glyph-name="Oslash" unicode="&#xd8;" horiz-adv-x="1792"
- />
- <glyph glyph-name="trademark" unicode="&#x2122;" horiz-adv-x="1792"
- />
- <glyph glyph-name="infinity" unicode="&#x221e;" horiz-adv-x="1792"
- />
- <glyph glyph-name="notequal" unicode="&#x2260;" horiz-adv-x="1792"
- />
- <glyph glyph-name="glass" unicode="&#xf000;" horiz-adv-x="1792"
-d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
- <glyph glyph-name="music" unicode="&#xf001;"
-d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89
-t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
- <glyph glyph-name="search" unicode="&#xf002;" horiz-adv-x="1664"
-d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5
-t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
- <glyph glyph-name="envelope" unicode="&#xf003;" horiz-adv-x="1792"
-d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13
-t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z
-M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
- <glyph glyph-name="heart" unicode="&#xf004;" horiz-adv-x="1792"
-d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600
-q-18 -18 -44 -18z" />
- <glyph glyph-name="star" unicode="&#xf005;" horiz-adv-x="1664"
-d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455
-l502 -73q56 -9 56 -46z" />
- <glyph glyph-name="star_empty" unicode="&#xf006;" horiz-adv-x="1664"
-d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500
-l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
- <glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="1280"
-d="M1280 137q0 -109 -62.5 -187t-150.5 -78h-854q-88 0 -150.5 78t-62.5 187q0 85 8.5 160.5t31.5 152t58.5 131t94 89t134.5 34.5q131 -128 313 -128t313 128q76 0 134.5 -34.5t94 -89t58.5 -131t31.5 -152t8.5 -160.5zM1024 1024q0 -159 -112.5 -271.5t-271.5 -112.5
-t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
- <glyph glyph-name="film" unicode="&#xf008;" horiz-adv-x="1920"
-d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128
-q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45
-t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128
-q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19
-t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
- <glyph glyph-name="th_large" unicode="&#xf009;" horiz-adv-x="1664"
-d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38
-h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
- <glyph glyph-name="th" unicode="&#xf00a;" horiz-adv-x="1792"
-d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320
-q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28
-h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192
-q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
- <glyph glyph-name="th_list" unicode="&#xf00b;" horiz-adv-x="1792"
-d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960
-q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28
-h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
- <glyph glyph-name="ok" unicode="&#xf00c;" horiz-adv-x="1792"
-d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
- <glyph glyph-name="remove" unicode="&#xf00d;" horiz-adv-x="1408"
-d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68
-t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
- <glyph glyph-name="zoom_in" unicode="&#xf00e;" horiz-adv-x="1664"
-d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224
-q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5
-t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
- <glyph glyph-name="zoom_out" unicode="&#xf010;" horiz-adv-x="1664"
-d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z
-M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z
-" />
- <glyph glyph-name="off" unicode="&#xf011;"
-d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5
-t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
- <glyph glyph-name="signal" unicode="&#xf012;" horiz-adv-x="1792"
-d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23
-v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
- <glyph glyph-name="cog" unicode="&#xf013;"
-d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38
-q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13
-l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22
-q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
- <glyph glyph-name="trash" unicode="&#xf014;" horiz-adv-x="1408"
-d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576
-q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832
-q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
- <glyph glyph-name="home" unicode="&#xf015;" horiz-adv-x="1664"
-d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5
-l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
- <glyph glyph-name="file_alt" unicode="&#xf016;"
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-" />
- <glyph glyph-name="time" unicode="&#xf017;"
-d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="road" unicode="&#xf018;" horiz-adv-x="1920"
-d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256
-q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
- <glyph glyph-name="download_alt" unicode="&#xf019;" horiz-adv-x="1664"
-d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136
-q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
- <glyph glyph-name="download" unicode="&#xf01a;"
-d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273
-t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="upload" unicode="&#xf01b;"
-d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198
-t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="inbox" unicode="&#xf01c;"
-d="M1023 576h316q-1 3 -2.5 8.5t-2.5 7.5l-212 496h-708l-212 -496q-1 -3 -2.5 -8.5t-2.5 -7.5h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552
-q25 -61 25 -123z" />
- <glyph glyph-name="play_circle" unicode="&#xf01d;"
-d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="repeat" unicode="&#xf01e;"
-d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q15 0 25 -9
-l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
- <glyph glyph-name="refresh" unicode="&#xf021;"
-d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117
-q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5
-q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
- <glyph glyph-name="list_alt" unicode="&#xf022;" horiz-adv-x="1792"
-d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z
-M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5
-t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47
-t47 -113z" />
- <glyph glyph-name="lock" unicode="&#xf023;" horiz-adv-x="1152"
-d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
- <glyph glyph-name="flag" unicode="&#xf024;" horiz-adv-x="1792"
-d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48
-t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
- <glyph glyph-name="headphones" unicode="&#xf025;" horiz-adv-x="1664"
-d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78
-t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5
-t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
- <glyph glyph-name="volume_off" unicode="&#xf026;" horiz-adv-x="768"
-d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
- <glyph glyph-name="volume_down" unicode="&#xf027;" horiz-adv-x="1152"
-d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36
-t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
- <glyph glyph-name="volume_up" unicode="&#xf028;" horiz-adv-x="1664"
-d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36
-t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5
-t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289
-t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
- <glyph glyph-name="qrcode" unicode="&#xf029;" horiz-adv-x="1408"
-d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z
-M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
- <glyph glyph-name="barcode" unicode="&#xf02a;" horiz-adv-x="1792"
-d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z
-M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
- <glyph glyph-name="tag" unicode="&#xf02b;"
-d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5
-l715 -714q37 -39 37 -91z" />
- <glyph glyph-name="tags" unicode="&#xf02c;" horiz-adv-x="1920"
-d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5
-l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
- <glyph glyph-name="book" unicode="&#xf02d;" horiz-adv-x="1664"
-d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23
-q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906
-q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5
-t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
- <glyph glyph-name="bookmark" unicode="&#xf02e;" horiz-adv-x="1280"
-d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
- <glyph glyph-name="print" unicode="&#xf02f;" horiz-adv-x="1664"
-d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68
-v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
- <glyph glyph-name="camera" unicode="&#xf030;" horiz-adv-x="1920"
-d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136
-q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
- <glyph glyph-name="font" unicode="&#xf031;" horiz-adv-x="1664"
-d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57
-q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -5 -0.5 -13.5t-0.5 -12.5q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5
-q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
- <glyph glyph-name="bold" unicode="&#xf032;" horiz-adv-x="1408"
-d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142
-q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5
-t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68 -0.5t68 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5
-t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
- <glyph glyph-name="italic" unicode="&#xf033;" horiz-adv-x="1024"
-d="M0 -126l17 85q22 7 61.5 16.5t72 19t59.5 23.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5
-q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
- <glyph glyph-name="text_height" unicode="&#xf034;" horiz-adv-x="1792"
-d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2
-t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5
-q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27
-q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
- <glyph glyph-name="text_width" unicode="&#xf035;"
-d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1
-t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27
-q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5
-t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49
-t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
- <glyph glyph-name="align_left" unicode="&#xf036;" horiz-adv-x="1792"
-d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45
-t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
- <glyph glyph-name="align_center" unicode="&#xf037;" horiz-adv-x="1792"
-d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19
-h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
- <glyph glyph-name="align_right" unicode="&#xf038;" horiz-adv-x="1792"
-d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45
-t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
- <glyph glyph-name="align_justify" unicode="&#xf039;" horiz-adv-x="1792"
-d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45
-t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
- <glyph glyph-name="list" unicode="&#xf03a;" horiz-adv-x="1792"
-d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5
-t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344
-q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5
-t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192
-q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
- <glyph glyph-name="indent_left" unicode="&#xf03b;" horiz-adv-x="1792"
-d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5
-t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088
-q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
- <glyph glyph-name="indent_right" unicode="&#xf03c;" horiz-adv-x="1792"
-d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5
-t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088
-q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
- <glyph glyph-name="facetime_video" unicode="&#xf03d;" horiz-adv-x="1792"
-d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5
-q39 -17 39 -59z" />
- <glyph glyph-name="picture" unicode="&#xf03e;" horiz-adv-x="1920"
-d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216
-q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
- <glyph glyph-name="pencil" unicode="&#xf040;"
-d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38
-q53 0 91 -38l235 -234q37 -39 37 -91z" />
- <glyph glyph-name="map_marker" unicode="&#xf041;" horiz-adv-x="1024"
-d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
- <glyph glyph-name="adjust" unicode="&#xf042;"
-d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="tint" unicode="&#xf043;" horiz-adv-x="1024"
-d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362
-q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
- <glyph glyph-name="edit" unicode="&#xf044;" horiz-adv-x="1792"
-d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832
-q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92
-l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
- <glyph glyph-name="share" unicode="&#xf045;" horiz-adv-x="1664"
-d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832
-q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5
-t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
- <glyph glyph-name="check" unicode="&#xf046;" horiz-adv-x="1664"
-d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832
-q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110
-q24 -24 24 -57t-24 -57z" />
- <glyph glyph-name="move" unicode="&#xf047;" horiz-adv-x="1792"
-d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45
-t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
- <glyph glyph-name="step_backward" unicode="&#xf048;" horiz-adv-x="1024"
-d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19z" />
- <glyph glyph-name="fast_backward" unicode="&#xf049;" horiz-adv-x="1792"
-d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19l710 710
-q19 19 32 13t13 -32v-710q4 10 13 19z" />
- <glyph glyph-name="backward" unicode="&#xf04a;" horiz-adv-x="1664"
-d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q4 10 13 19z" />
- <glyph glyph-name="play" unicode="&#xf04b;" horiz-adv-x="1408"
-d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
- <glyph glyph-name="pause" unicode="&#xf04c;"
-d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
- <glyph glyph-name="stop" unicode="&#xf04d;"
-d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
- <glyph glyph-name="forward" unicode="&#xf04e;" horiz-adv-x="1664"
-d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" />
- <glyph glyph-name="fast_forward" unicode="&#xf050;" horiz-adv-x="1792"
-d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19l-710 -710
-q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" />
- <glyph glyph-name="step_forward" unicode="&#xf051;" horiz-adv-x="1024"
-d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19z" />
- <glyph glyph-name="eject" unicode="&#xf052;" horiz-adv-x="1538"
-d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
- <glyph glyph-name="chevron_left" unicode="&#xf053;" horiz-adv-x="1280"
-d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
- <glyph glyph-name="chevron_right" unicode="&#xf054;" horiz-adv-x="1280"
-d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
- <glyph glyph-name="plus_sign" unicode="&#xf055;"
-d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5
-t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="minus_sign" unicode="&#xf056;"
-d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
-t103 -385.5z" />
- <glyph glyph-name="remove_sign" unicode="&#xf057;"
-d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19
-q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="ok_sign" unicode="&#xf058;"
-d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
-t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="question_sign" unicode="&#xf059;"
-d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59
-q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
-t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="info_sign" unicode="&#xf05a;"
-d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23
-t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="screenshot" unicode="&#xf05b;"
-d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109
-q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143
-q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
- <glyph glyph-name="remove_circle" unicode="&#xf05c;"
-d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23
-l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5
-t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="ok_circle" unicode="&#xf05d;"
-d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198
-t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="ban_circle" unicode="&#xf05e;"
-d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61
-t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
- <glyph glyph-name="arrow_left" unicode="&#xf060;"
-d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5
-t32.5 -90.5z" />
- <glyph glyph-name="arrow_right" unicode="&#xf061;"
-d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
- <glyph glyph-name="arrow_up" unicode="&#xf062;" horiz-adv-x="1664"
-d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651
-q37 -39 37 -91z" />
- <glyph glyph-name="arrow_down" unicode="&#xf063;" horiz-adv-x="1664"
-d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
- <glyph glyph-name="share_alt" unicode="&#xf064;" horiz-adv-x="1792"
-d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22
-t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
- <glyph glyph-name="resize_full" unicode="&#xf065;"
-d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332
-q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
- <glyph glyph-name="resize_small" unicode="&#xf066;"
-d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45
-t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
- <glyph glyph-name="plus" unicode="&#xf067;" horiz-adv-x="1408"
-d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
- <glyph glyph-name="minus" unicode="&#xf068;" horiz-adv-x="1408"
-d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
- <glyph glyph-name="asterisk" unicode="&#xf069;" horiz-adv-x="1664"
-d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154
-q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
- <glyph glyph-name="exclamation_sign" unicode="&#xf06a;"
-d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192
-q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
- <glyph glyph-name="gift" unicode="&#xf06b;"
-d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320
-q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5
-t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
- <glyph glyph-name="leaf" unicode="&#xf06c;" horiz-adv-x="1792"
-d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268
-q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-43 0 -63.5 17.5t-45.5 59.5q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5
-t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
- <glyph glyph-name="fire" unicode="&#xf06d;" horiz-adv-x="1408"
-d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1
-q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
- <glyph glyph-name="eye_open" unicode="&#xf06e;" horiz-adv-x="1792"
-d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5
-t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
- <glyph glyph-name="eye_close" unicode="&#xf070;" horiz-adv-x="1792"
-d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9
-q-106 -189 -316 -567t-315 -566l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5
-q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z
-" />
- <glyph glyph-name="warning_sign" unicode="&#xf071;" horiz-adv-x="1792"
-d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185
-q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
- <glyph glyph-name="plane" unicode="&#xf072;" horiz-adv-x="1408"
-d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9
-q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
- <glyph glyph-name="calendar" unicode="&#xf073;" horiz-adv-x="1664"
-d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z
-M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64
-q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47
-h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
- <glyph glyph-name="random" unicode="&#xf074;" horiz-adv-x="1792"
-d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1
-t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5
-v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111
-t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
- <glyph glyph-name="comment" unicode="&#xf075;" horiz-adv-x="1792"
-d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281
-q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
- <glyph glyph-name="magnet" unicode="&#xf076;"
-d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384
-q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
- <glyph glyph-name="chevron_up" unicode="&#xf077;" horiz-adv-x="1792"
-d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
- <glyph glyph-name="chevron_down" unicode="&#xf078;" horiz-adv-x="1792"
-d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
- <glyph glyph-name="retweet" unicode="&#xf079;" horiz-adv-x="1920"
-d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -10 7 -21
-zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z
-" />
- <glyph glyph-name="shopping_cart" unicode="&#xf07a;" horiz-adv-x="1664"
-d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45
-t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" />
- <glyph glyph-name="folder_close" unicode="&#xf07b;" horiz-adv-x="1664"
-d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
- <glyph glyph-name="folder_open" unicode="&#xf07c;" horiz-adv-x="1920"
-d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5
-t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
- <glyph glyph-name="resize_vertical" unicode="&#xf07d;" horiz-adv-x="768"
-d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
- <glyph glyph-name="resize_horizontal" unicode="&#xf07e;" horiz-adv-x="1792"
-d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
- <glyph glyph-name="bar_chart" unicode="&#xf080;" horiz-adv-x="2048"
-d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
- <glyph glyph-name="twitter_sign" unicode="&#xf081;"
-d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4
-q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5
-t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="facebook_sign" unicode="&#xf082;"
-d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960
-q0 119 84.5 203.5t203.5 84.5h960z" />
- <glyph glyph-name="camera_retro" unicode="&#xf083;" horiz-adv-x="1792"
-d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5
-t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280
-q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
- <glyph glyph-name="key" unicode="&#xf084;" horiz-adv-x="1792"
-d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26
-l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5
-t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
- <glyph glyph-name="cogs" unicode="&#xf085;" horiz-adv-x="1920"
-d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5
-t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -11 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5
-l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7
-l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -8 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31
-q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20
-t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68
-q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70
-q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
- <glyph glyph-name="comments" unicode="&#xf086;" horiz-adv-x="1792"
-d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224
-q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7
-q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
- <glyph glyph-name="thumbs_up_alt" unicode="&#xf087;"
-d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5
-t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769
-q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128
-q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
- <glyph glyph-name="thumbs_down_alt" unicode="&#xf088;"
-d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 31 18 69q0 37 -17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5
-t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z
-M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5
-h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -73 49 -163z" />
- <glyph glyph-name="star_half" unicode="&#xf089;" horiz-adv-x="896"
-d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
- <glyph glyph-name="heart_empty" unicode="&#xf08a;" horiz-adv-x="1792"
-d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559
-q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5
-q224 0 351 -124t127 -344z" />
- <glyph glyph-name="signout" unicode="&#xf08b;" horiz-adv-x="1664"
-d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704
-q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
- <glyph glyph-name="linkedin_sign" unicode="&#xf08c;"
-d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5
-q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="pushpin" unicode="&#xf08d;" horiz-adv-x="1152"
-d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38
-t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
- <glyph glyph-name="external_link" unicode="&#xf08e;" horiz-adv-x="1792"
-d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320
-q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
- <glyph glyph-name="signin" unicode="&#xf090;"
-d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5
-q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="trophy" unicode="&#xf091;" horiz-adv-x="1664"
-d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91
-t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96
-q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
- <glyph glyph-name="github_sign" unicode="&#xf092;"
-d="M519 336q4 6 -3 13q-9 7 -14 2q-4 -6 3 -13q9 -7 14 -2zM491 377q-5 7 -12 4q-6 -4 0 -12q7 -8 12 -5q6 4 0 13zM450 417q2 4 -5 8q-7 2 -8 -2q-3 -5 4 -8q8 -2 9 2zM471 394q2 1 1.5 4.5t-3.5 5.5q-6 7 -10 3t1 -11q6 -6 11 -2zM557 319q2 7 -9 11q-9 3 -13 -4
-q-2 -7 9 -11q9 -3 13 4zM599 316q0 8 -12 8q-10 0 -10 -8t11 -8t11 8zM638 323q-2 7 -13 5t-9 -9q2 -8 12 -6t10 10zM1280 640q0 212 -150 362t-362 150t-362 -150t-150 -362q0 -167 98 -300.5t252 -185.5q18 -3 26.5 5t8.5 20q0 52 -1 95q-6 -1 -15.5 -2.5t-35.5 -2t-48 4
-t-43.5 20t-29.5 41.5q-23 59 -57 74q-2 1 -4.5 3.5l-8 8t-7 9.5t4 7.5t19.5 3.5q6 0 15 -2t30 -15.5t33 -35.5q16 -28 37.5 -42t43.5 -14t38 3.5t30 9.5q7 47 33 69q-49 6 -86 18.5t-73 39t-55.5 76t-19.5 119.5q0 79 53 137q-24 62 5 136q19 6 54.5 -7.5t60.5 -29.5l26 -16
-q58 17 128 17t128 -17q11 7 28.5 18t55.5 26t57 9q29 -74 5 -136q53 -58 53 -137q0 -57 -14 -100.5t-35.5 -70t-53.5 -44.5t-62.5 -26t-68.5 -12q35 -31 35 -95q0 -40 -0.5 -89t-0.5 -51q0 -12 8.5 -20t26.5 -5q154 52 252 185.5t98 300.5zM1536 1120v-960
-q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="upload_alt" unicode="&#xf093;" horiz-adv-x="1664"
-d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92
-t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
- <glyph glyph-name="lemon" unicode="&#xf094;"
-d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5
-q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44
-q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5
-q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -13 2 -25t3.5 -16.5t7.5 -20.5t8 -20q16 -40 25 -118.5t9 -136.5z" />
- <glyph glyph-name="phone" unicode="&#xf095;" horiz-adv-x="1408"
-d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -53 3.5t-57.5 12.5t-47 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-127 79 -264 216t-216 264q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47t-12.5 57.5t-3.5 53q0 92 51 186
-q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174q2 -1 19 -11.5t24 -14
-t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
- <glyph glyph-name="check_empty" unicode="&#xf096;" horiz-adv-x="1408"
-d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832
-q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="bookmark_empty" unicode="&#xf097;" horiz-adv-x="1280"
-d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289
-q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
- <glyph glyph-name="phone_sign" unicode="&#xf098;"
-d="M1280 343q0 11 -2 16t-18 16.5t-40.5 25t-47.5 26.5t-45.5 25t-28.5 15q-5 3 -19 13t-25 15t-21 5q-15 0 -36.5 -20.5t-39.5 -45t-38.5 -45t-33.5 -20.5q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170 126.5t-127 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5
-t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5
-t320.5 -216.5q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z
-" />
- <glyph glyph-name="twitter" unicode="&#xf099;" horiz-adv-x="1664"
-d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41
-q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
- <glyph glyph-name="facebook" unicode="&#xf09a;" horiz-adv-x="1024"
-d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
- <glyph glyph-name="github" unicode="&#xf09b;"
-d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -40 7t-13 30q0 3 0.5 76.5t0.5 134.5q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 119 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24
-q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-85 13.5q-45 -113 -8 -204q-79 -87 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-39 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5
-t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -88.5t0.5 -54.5q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103zM291 305q3 7 -7 12
-q-10 3 -13 -2q-3 -7 7 -12q9 -6 13 2zM322 271q7 5 -2 16q-10 9 -16 3q-7 -5 2 -16q10 -10 16 -3zM352 226q9 7 0 19q-8 13 -17 6q-9 -5 0 -18t17 -7zM394 184q8 8 -4 19q-12 12 -20 3q-9 -8 4 -19q12 -12 20 -3zM451 159q3 11 -13 16q-15 4 -19 -7t13 -15q15 -6 19 6z
-M514 154q0 13 -17 11q-16 0 -16 -11q0 -13 17 -11q16 0 16 11zM572 164q-2 11 -18 9q-16 -3 -14 -15t18 -8t14 14z" />
- <glyph glyph-name="unlock" unicode="&#xf09c;" horiz-adv-x="1664"
-d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5
-t316.5 -131.5t131.5 -316.5z" />
- <glyph glyph-name="credit_card" unicode="&#xf09d;" horiz-adv-x="1920"
-d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608
-q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
- <glyph glyph-name="rss" unicode="&#xf09e;" horiz-adv-x="1408"
-d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5
-t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294
-q187 -186 294 -425.5t120 -501.5z" />
- <glyph glyph-name="hdd" unicode="&#xf0a0;"
-d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5
-h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75
-l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
- <glyph glyph-name="bullhorn" unicode="&#xf0a1;" horiz-adv-x="1792"
-d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5
-t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
- <glyph glyph-name="bell" unicode="&#xf0a2;" horiz-adv-x="1792"
-d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z
-M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5
-t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
- <glyph glyph-name="certificate" unicode="&#xf0a3;"
-d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70
-l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70
-l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
- <glyph glyph-name="hand_right" unicode="&#xf0a4;" horiz-adv-x="1792"
-d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106
-q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43
-q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5
-t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
- <glyph glyph-name="hand_left" unicode="&#xf0a5;" horiz-adv-x="1792"
-d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-8 9 -12 14q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5
-t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45z
-M1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67
-q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
- <glyph glyph-name="hand_up" unicode="&#xf0a6;"
-d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576
-q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5
-t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76
-q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
- <glyph glyph-name="hand_down" unicode="&#xf0a7;"
-d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33
-t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580
-q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100
-q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
- <glyph glyph-name="circle_arrow_left" unicode="&#xf0a8;"
-d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="circle_arrow_right" unicode="&#xf0a9;"
-d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="circle_arrow_up" unicode="&#xf0aa;"
-d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="circle_arrow_down" unicode="&#xf0ab;"
-d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="globe" unicode="&#xf0ac;"
-d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11
-q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 11t-9.5 10q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5
-q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5
-q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5
-t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-4 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3
-q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25
-q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5
-t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5
-t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10.5t17 -19.5q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21
-q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5
-q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3
-q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5
-t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q8 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5
-q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7
-q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
- <glyph glyph-name="wrench" unicode="&#xf0ad;" horiz-adv-x="1664"
-d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5
-t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
- <glyph glyph-name="tasks" unicode="&#xf0ae;" horiz-adv-x="1792"
-d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19
-t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
- <glyph glyph-name="filter" unicode="&#xf0b0;" horiz-adv-x="1408"
-d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
- <glyph glyph-name="briefcase" unicode="&#xf0b1;" horiz-adv-x="1792"
-d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68
-t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
- <glyph glyph-name="fullscreen" unicode="&#xf0b2;"
-d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144
-l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z
-" />
- <glyph glyph-name="group" unicode="&#xf0c0;" horiz-adv-x="1920"
-d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5
-t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75
-t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5
-t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
- <glyph glyph-name="link" unicode="&#xf0c1;" horiz-adv-x="1664"
-d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26
-l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15
-t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207
-q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
- <glyph glyph-name="cloud" unicode="&#xf0c2;" horiz-adv-x="1920"
-d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z
-" />
- <glyph glyph-name="beaker" unicode="&#xf0c3;" horiz-adv-x="1664"
-d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
- <glyph glyph-name="cut" unicode="&#xf0c4;" horiz-adv-x="1792"
-d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84
-q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148
-q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108
-q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6
-q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
- <glyph glyph-name="copy" unicode="&#xf0c5;" horiz-adv-x="1792"
-d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299
-h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
- <glyph glyph-name="paper_clip" unicode="&#xf0c6;" horiz-adv-x="1408"
-d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181
-l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235
-z" />
- <glyph glyph-name="save" unicode="&#xf0c7;"
-d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5
-h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
- <glyph glyph-name="sign_blank" unicode="&#xf0c8;"
-d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="reorder" unicode="&#xf0c9;"
-d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45
-t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
- <glyph glyph-name="ul" unicode="&#xf0ca;" horiz-adv-x="1792"
-d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5
-t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z
-M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
- <glyph glyph-name="ol" unicode="&#xf0cb;" horiz-adv-x="1792"
-d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362
-q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5
-t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 121.5t0.5 121.5v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216
-q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
- <glyph glyph-name="strikethrough" unicode="&#xf0cc;" horiz-adv-x="1792"
-d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 98 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6
-l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -56 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23
-l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
- <glyph glyph-name="underline" unicode="&#xf0cd;"
-d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47
-q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41
-q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472
-q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
- <glyph glyph-name="table" unicode="&#xf0ce;" horiz-adv-x="1664"
-d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23
-v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192
-q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192
-q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113
-z" />
- <glyph glyph-name="magic" unicode="&#xf0d0;" horiz-adv-x="1664"
-d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276
-l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
- <glyph glyph-name="truck" unicode="&#xf0d1;" horiz-adv-x="1792"
-d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5
-t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38
-t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
- <glyph glyph-name="pinterest" unicode="&#xf0d2;"
-d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134
-q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33
-q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="pinterest_sign" unicode="&#xf0d3;"
-d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5
-t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5
-t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
- <glyph glyph-name="google_plus_sign" unicode="&#xf0d4;"
-d="M917 631q0 26 -6 64h-362v-132h217q-3 -24 -16.5 -50t-37.5 -53t-66.5 -44.5t-96.5 -17.5q-99 0 -169 71t-70 171t70 171t169 71q92 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585
-h109v110h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="google_plus" unicode="&#xf0d5;" horiz-adv-x="2304"
-d="M1437 623q0 -208 -87 -370.5t-248 -254t-369 -91.5q-149 0 -285 58t-234 156t-156 234t-58 285t58 285t156 234t234 156t285 58q286 0 491 -192l-199 -191q-117 113 -292 113q-123 0 -227.5 -62t-165.5 -168.5t-61 -232.5t61 -232.5t165.5 -168.5t227.5 -62
-q83 0 152.5 23t114.5 57.5t78.5 78.5t49 83t21.5 74h-416v252h692q12 -63 12 -122zM2304 745v-210h-209v-209h-210v209h-209v210h209v209h210v-209h209z" />
- <glyph glyph-name="money" unicode="&#xf0d6;" horiz-adv-x="1920"
-d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384
-v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
- <glyph glyph-name="caret_down" unicode="&#xf0d7;" horiz-adv-x="1024"
-d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
- <glyph glyph-name="caret_up" unicode="&#xf0d8;" horiz-adv-x="1024"
-d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
- <glyph glyph-name="caret_left" unicode="&#xf0d9;" horiz-adv-x="640"
-d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
- <glyph glyph-name="caret_right" unicode="&#xf0da;" horiz-adv-x="640"
-d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
- <glyph glyph-name="columns" unicode="&#xf0db;" horiz-adv-x="1664"
-d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
- <glyph glyph-name="sort" unicode="&#xf0dc;" horiz-adv-x="1024"
-d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
- <glyph glyph-name="sort_down" unicode="&#xf0dd;" horiz-adv-x="1024"
-d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
- <glyph glyph-name="sort_up" unicode="&#xf0de;" horiz-adv-x="1024"
-d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
- <glyph glyph-name="envelope_alt" unicode="&#xf0e0;" horiz-adv-x="1792"
-d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123
-q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
- <glyph glyph-name="linkedin" unicode="&#xf0e1;"
-d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329
-q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
- <glyph glyph-name="undo" unicode="&#xf0e2;"
-d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5
-t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
- <glyph glyph-name="legal" unicode="&#xf0e3;" horiz-adv-x="1792"
-d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5
-t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14
-q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28
-q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
- <glyph glyph-name="dashboard" unicode="&#xf0e4;" horiz-adv-x="1792"
-d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5
-t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5
-t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29
-q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
- <glyph glyph-name="comment_alt" unicode="&#xf0e5;" horiz-adv-x="1792"
-d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640
-q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5
-t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
- <glyph glyph-name="comments_alt" unicode="&#xf0e6;" horiz-adv-x="1792"
-d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257
-t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5
-t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129
-q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
- <glyph glyph-name="bolt" unicode="&#xf0e7;" horiz-adv-x="896"
-d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
- <glyph glyph-name="sitemap" unicode="&#xf0e8;" horiz-adv-x="1792"
-d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320
-q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68
-z" />
- <glyph glyph-name="umbrella" unicode="&#xf0e9;" horiz-adv-x="1664"
-d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97
-q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69
-q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
- <glyph glyph-name="paste" unicode="&#xf0ea;" horiz-adv-x="1792"
-d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28
-h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
- <glyph glyph-name="light_bulb" unicode="&#xf0eb;" horiz-adv-x="1024"
-d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134
-q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47
-q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5
-t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
- <glyph glyph-name="exchange" unicode="&#xf0ec;" horiz-adv-x="1792"
-d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9
-q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
- <glyph glyph-name="cloud_download" unicode="&#xf0ed;" horiz-adv-x="1920"
-d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088
-q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
- <glyph glyph-name="cloud_upload" unicode="&#xf0ee;" horiz-adv-x="1920"
-d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088
-q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
- <glyph glyph-name="user_md" unicode="&#xf0f0;" horiz-adv-x="1408"
-d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56
-t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68
-t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5
-t271.5 -112.5t112.5 -271.5z" />
- <glyph glyph-name="stethoscope" unicode="&#xf0f1;" horiz-adv-x="1408"
-d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48
-t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252
-t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
- <glyph glyph-name="suitcase" unicode="&#xf0f2;" horiz-adv-x="1792"
-d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66
-t66 -158z" />
- <glyph glyph-name="bell_alt" unicode="&#xf0f3;" horiz-adv-x="1792"
-d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5
-t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
- <glyph glyph-name="coffee" unicode="&#xf0f4;" horiz-adv-x="1920"
-d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45
-t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
- <glyph glyph-name="food" unicode="&#xf0f5;" horiz-adv-x="1408"
-d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45
-t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
- <glyph glyph-name="file_text_alt" unicode="&#xf0f6;"
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704
-q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
- <glyph glyph-name="building" unicode="&#xf0f7;" horiz-adv-x="1408"
-d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
- <glyph glyph-name="hospital" unicode="&#xf0f8;" horiz-adv-x="1408"
-d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5
-t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320
-v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
- <glyph glyph-name="ambulance" unicode="&#xf0f9;" horiz-adv-x="1920"
-d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5
-t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152
-q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
- <glyph glyph-name="medkit" unicode="&#xf0fa;" horiz-adv-x="1792"
-d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32
-q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
- <glyph glyph-name="fighter_jet" unicode="&#xf0fb;" horiz-adv-x="1920"
-d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96
-q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q128 -28 200 -52t80 -34z" />
- <glyph glyph-name="beer" unicode="&#xf0fc;" horiz-adv-x="1664"
-d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
- <glyph glyph-name="h_sign" unicode="&#xf0fd;"
-d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960
-q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="f0fe" unicode="&#xf0fe;"
-d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960
-q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="double_angle_left" unicode="&#xf100;" horiz-adv-x="1024"
-d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23
-t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
- <glyph glyph-name="double_angle_right" unicode="&#xf101;" horiz-adv-x="1024"
-d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23
-l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
- <glyph glyph-name="double_angle_up" unicode="&#xf102;" horiz-adv-x="1152"
-d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393
-q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
- <glyph glyph-name="double_angle_down" unicode="&#xf103;" horiz-adv-x="1152"
-d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23
-t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
- <glyph glyph-name="angle_left" unicode="&#xf104;" horiz-adv-x="640"
-d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
- <glyph glyph-name="angle_right" unicode="&#xf105;" horiz-adv-x="640"
-d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
- <glyph glyph-name="angle_up" unicode="&#xf106;" horiz-adv-x="1152"
-d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
- <glyph glyph-name="angle_down" unicode="&#xf107;" horiz-adv-x="1152"
-d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
- <glyph glyph-name="desktop" unicode="&#xf108;" horiz-adv-x="1920"
-d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19
-t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
- <glyph glyph-name="laptop" unicode="&#xf109;" horiz-adv-x="1920"
-d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z
-M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
- <glyph glyph-name="tablet" unicode="&#xf10a;" horiz-adv-x="1152"
-d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832
-q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
- <glyph glyph-name="mobile_phone" unicode="&#xf10b;" horiz-adv-x="768"
-d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136
-q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
- <glyph glyph-name="circle_blank" unicode="&#xf10c;"
-d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103
-t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="quote_left" unicode="&#xf10d;" horiz-adv-x="1664"
-d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z
-M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
- <glyph glyph-name="quote_right" unicode="&#xf10e;" horiz-adv-x="1664"
-d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216
-v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
- <glyph glyph-name="spinner" unicode="&#xf110;" horiz-adv-x="1792"
-d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5
-t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z
-M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5
-q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" />
- <glyph glyph-name="circle" unicode="&#xf111;"
-d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="reply" unicode="&#xf112;" horiz-adv-x="1792"
-d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19
-l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
- <glyph glyph-name="github_alt" unicode="&#xf113;" horiz-adv-x="1664"
-d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320
-q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86
-t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218
-q0 -87 -27 -168q136 -160 136 -398z" />
- <glyph glyph-name="folder_close_alt" unicode="&#xf114;" horiz-adv-x="1664"
-d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320
-q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
- <glyph glyph-name="folder_open_alt" unicode="&#xf115;" horiz-adv-x="1920"
-d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68
-v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z
-" />
- <glyph glyph-name="expand_alt" unicode="&#xf116;" horiz-adv-x="1792"
- />
- <glyph glyph-name="collapse_alt" unicode="&#xf117;" horiz-adv-x="1792"
- />
- <glyph glyph-name="smile" unicode="&#xf118;"
-d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
-t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5
-t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="frown" unicode="&#xf119;"
-d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
-t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204
-t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="meh" unicode="&#xf11a;"
-d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
-t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="gamepad" unicode="&#xf11b;" horiz-adv-x="1920"
-d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5
-t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150
-t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
- <glyph glyph-name="keyboard" unicode="&#xf11c;" horiz-adv-x="1920"
-d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16
-h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16
-h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96
-q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896
-h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
- <glyph glyph-name="flag_alt" unicode="&#xf11d;" horiz-adv-x="1792"
-d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9
-h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102
-q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
- <glyph glyph-name="flag_checkered" unicode="&#xf11e;" horiz-adv-x="1792"
-d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2
-q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266
-q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8
-q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
- <glyph glyph-name="terminal" unicode="&#xf120;" horiz-adv-x="1664"
-d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9
-t9 -23z" />
- <glyph glyph-name="code" unicode="&#xf121;" horiz-adv-x="1920"
-d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5
-l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
- <glyph glyph-name="reply_all" unicode="&#xf122;" horiz-adv-x="1792"
-d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1
-q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
- <glyph glyph-name="star_half_empty" unicode="&#xf123;" horiz-adv-x="1664"
-d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5
-l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
- <glyph glyph-name="location_arrow" unicode="&#xf124;" horiz-adv-x="1408"
-d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
- <glyph glyph-name="crop" unicode="&#xf125;" horiz-adv-x="1664"
-d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23
-v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
- <glyph glyph-name="code_fork" unicode="&#xf126;" horiz-adv-x="1024"
-d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5
-q-2 -287 -226 -414q-67 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497
-q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
- <glyph glyph-name="unlink" unicode="&#xf127;" horiz-adv-x="1664"
-d="M439 265l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320
-q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18
-l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9
-t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
- <glyph glyph-name="question" unicode="&#xf128;" horiz-adv-x="1024"
-d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5
-t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
- <glyph glyph-name="_279" unicode="&#xf129;" horiz-adv-x="640"
-d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192
-q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
- <glyph glyph-name="exclamation" unicode="&#xf12a;" horiz-adv-x="640"
-d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
- <glyph glyph-name="superscript" unicode="&#xf12b;"
-d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z
-M1534 846v-206h-514l-3 27q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5
-t-65.5 -51.5t-30.5 -63h232v80h126z" />
- <glyph glyph-name="subscript" unicode="&#xf12c;"
-d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z
-M1536 -50v-206h-514l-4 27q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73
-h232v80h126z" />
- <glyph glyph-name="_283" unicode="&#xf12d;" horiz-adv-x="1920"
-d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
- <glyph glyph-name="puzzle_piece" unicode="&#xf12e;" horiz-adv-x="1664"
-d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5
-t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89
-q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117
-q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
- <glyph glyph-name="microphone" unicode="&#xf130;" horiz-adv-x="1152"
-d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5
-t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
- <glyph glyph-name="microphone_off" unicode="&#xf131;" horiz-adv-x="1408"
-d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128
-q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23
-t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
- <glyph glyph-name="shield" unicode="&#xf132;" horiz-adv-x="1280"
-d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150
-t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
- <glyph glyph-name="calendar_empty" unicode="&#xf133;" horiz-adv-x="1664"
-d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280
-q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
- <glyph glyph-name="fire_extinguisher" unicode="&#xf134;" horiz-adv-x="1408"
-d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800
-q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113
-q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
- <glyph glyph-name="rocket" unicode="&#xf135;" horiz-adv-x="1664"
-d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1
-q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
- <glyph glyph-name="maxcdn" unicode="&#xf136;" horiz-adv-x="1792"
-d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
- <glyph glyph-name="chevron_sign_left" unicode="&#xf137;"
-d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
-t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="chevron_sign_right" unicode="&#xf138;"
-d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
-t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="chevron_sign_up" unicode="&#xf139;"
-d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
-t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="chevron_sign_down" unicode="&#xf13a;"
-d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
-t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="html5" unicode="&#xf13b;" horiz-adv-x="1408"
-d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
- <glyph glyph-name="css3" unicode="&#xf13c;" horiz-adv-x="1792"
-d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
- <glyph glyph-name="anchor" unicode="&#xf13d;" horiz-adv-x="1792"
-d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352
-q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19
-t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
- <glyph glyph-name="unlock_alt" unicode="&#xf13e;" horiz-adv-x="1152"
-d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181
-v-320h736z" />
- <glyph glyph-name="bullseye" unicode="&#xf140;"
-d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150
-t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="ellipsis_horizontal" unicode="&#xf141;" horiz-adv-x="1408"
-d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192
-q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
- <glyph glyph-name="ellipsis_vertical" unicode="&#xf142;" horiz-adv-x="384"
-d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192
-q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
- <glyph glyph-name="_303" unicode="&#xf143;"
-d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 233 -176.5 396.5t-396.5 176.5q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128
-q13 0 23 10t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960
-q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="play_sign" unicode="&#xf144;"
-d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56
-q16 -8 32 -8q17 0 32 9z" />
- <glyph glyph-name="ticket" unicode="&#xf145;" horiz-adv-x="1792"
-d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136
-t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
- <glyph glyph-name="minus_sign_alt" unicode="&#xf146;"
-d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
-t84.5 -203.5z" />
- <glyph glyph-name="check_minus" unicode="&#xf147;" horiz-adv-x="1408"
-d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5
-t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="level_up" unicode="&#xf148;" horiz-adv-x="1024"
-d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
- <glyph glyph-name="level_down" unicode="&#xf149;" horiz-adv-x="1024"
-d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
- <glyph glyph-name="check_sign" unicode="&#xf14a;"
-d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5
-t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="edit_sign" unicode="&#xf14b;"
-d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120
-v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="_312" unicode="&#xf14c;"
-d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960
-q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="share_sign" unicode="&#xf14d;"
-d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q11 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5
-t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="compass" unicode="&#xf14e;"
-d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
-t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="collapse" unicode="&#xf150;"
-d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120
-v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="collapse_top" unicode="&#xf151;"
-d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960
-q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="_317" unicode="&#xf152;"
-d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5
-t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="eur" unicode="&#xf153;" horiz-adv-x="1024"
-d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9
-t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26
-l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
- <glyph glyph-name="gbp" unicode="&#xf154;" horiz-adv-x="1024"
-d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7
-q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
- <glyph glyph-name="usd" unicode="&#xf155;" horiz-adv-x="1024"
-d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43
-t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5
-t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50
-t53 -63.5t31.5 -76.5t13 -94z" />
- <glyph glyph-name="inr" unicode="&#xf156;" horiz-adv-x="898"
-d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102
-q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
- <glyph glyph-name="jpy" unicode="&#xf157;" horiz-adv-x="1027"
-d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61
-l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
- <glyph glyph-name="rub" unicode="&#xf158;" horiz-adv-x="1280"
-d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128
-q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
- <glyph glyph-name="krw" unicode="&#xf159;" horiz-adv-x="1792"
-d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23
-t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28
-q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
- <glyph glyph-name="btc" unicode="&#xf15a;" horiz-adv-x="1280"
-d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164
-l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30
-t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
- <glyph glyph-name="file" unicode="&#xf15b;"
-d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
- <glyph glyph-name="file_text" unicode="&#xf15c;"
-d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704
-q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
- <glyph glyph-name="sort_by_alphabet" unicode="&#xf15d;" horiz-adv-x="1664"
-d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23
-v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162
-l230 -662h70z" />
- <glyph glyph-name="_329" unicode="&#xf15e;" horiz-adv-x="1664"
-d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150
-v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248
-v119h121z" />
- <glyph glyph-name="sort_by_attributes" unicode="&#xf160;" horiz-adv-x="1792"
-d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832
-q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256
-q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
- <glyph glyph-name="sort_by_attributes_alt" unicode="&#xf161;" horiz-adv-x="1792"
-d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192
-q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832
-q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
- <glyph glyph-name="sort_by_order" unicode="&#xf162;"
-d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23
-zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5
-t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
- <glyph glyph-name="sort_by_order_alt" unicode="&#xf163;"
-d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9
-t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13
-q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
- <glyph glyph-name="_334" unicode="&#xf164;" horiz-adv-x="1664"
-d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76
-q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5
-t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
- <glyph glyph-name="_335" unicode="&#xf165;" horiz-adv-x="1664"
-d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135
-t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121
-t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
- <glyph glyph-name="youtube_sign" unicode="&#xf166;"
-d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 17 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15
-q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38
-q21 -29 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5
-q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78q7 -23 23 -69l24 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38
-q-51 0 -78 -38q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5
-h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="youtube" unicode="&#xf167;"
-d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73
-q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51
-q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99
-q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-38 -51 -106 -51q-67 0 -105 51
-q-28 38 -28 118v175q0 80 28 117q38 51 105 51q68 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
- <glyph glyph-name="xing" unicode="&#xf168;" horiz-adv-x="1408"
-d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942
-q25 45 64 45h241q22 0 31 -15z" />
- <glyph glyph-name="xing_sign" unicode="&#xf169;"
-d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1
-l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="youtube_play" unicode="&#xf16a;" horiz-adv-x="1792"
-d="M711 408l484 250l-484 253v-503zM896 1270q168 0 324.5 -4.5t229.5 -9.5l73 -4q1 0 17 -1.5t23 -3t23.5 -4.5t28.5 -8t28 -13t31 -19.5t29 -26.5q6 -6 15.5 -18.5t29 -58.5t26.5 -101q8 -64 12.5 -136.5t5.5 -113.5v-40v-136q1 -145 -18 -290q-7 -55 -25 -99.5t-32 -61.5
-l-14 -17q-14 -15 -29 -26.5t-31 -19t-28 -12.5t-28.5 -8t-24 -4.5t-23 -3t-16.5 -1.5q-251 -19 -627 -19q-207 2 -359.5 6.5t-200.5 7.5l-49 4l-36 4q-36 5 -54.5 10t-51 21t-56.5 41q-6 6 -15.5 18.5t-29 58.5t-26.5 101q-8 64 -12.5 136.5t-5.5 113.5v40v136
-q-1 145 18 290q7 55 25 99.5t32 61.5l14 17q14 15 29 26.5t31 19.5t28 13t28.5 8t23.5 4.5t23 3t17 1.5q251 18 627 18z" />
- <glyph glyph-name="dropbox" unicode="&#xf16b;" horiz-adv-x="1792"
-d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
- <glyph glyph-name="stackexchange" unicode="&#xf16c;"
-d="M1289 -96h-1118v480h-160v-640h1438v640h-160v-480zM347 428l33 157l783 -165l-33 -156zM450 802l67 146l725 -339l-67 -145zM651 1158l102 123l614 -513l-102 -123zM1048 1536l477 -641l-128 -96l-477 641zM330 65v159h800v-159h-800z" />
- <glyph glyph-name="instagram" unicode="&#xf16d;"
-d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1162 640q0 -164 -115 -279t-279 -115t-279 115t-115 279t115 279t279 115t279 -115t115 -279zM1270 1050q0 -38 -27 -65t-65 -27t-65 27t-27 65t27 65t65 27t65 -27t27 -65zM768 1270
-q-7 0 -76.5 0.5t-105.5 0t-96.5 -3t-103 -10t-71.5 -18.5q-50 -20 -88 -58t-58 -88q-11 -29 -18.5 -71.5t-10 -103t-3 -96.5t0 -105.5t0.5 -76.5t-0.5 -76.5t0 -105.5t3 -96.5t10 -103t18.5 -71.5q20 -50 58 -88t88 -58q29 -11 71.5 -18.5t103 -10t96.5 -3t105.5 0t76.5 0.5
-t76.5 -0.5t105.5 0t96.5 3t103 10t71.5 18.5q50 20 88 58t58 88q11 29 18.5 71.5t10 103t3 96.5t0 105.5t-0.5 76.5t0.5 76.5t0 105.5t-3 96.5t-10 103t-18.5 71.5q-20 50 -58 88t-88 58q-29 11 -71.5 18.5t-103 10t-96.5 3t-105.5 0t-76.5 -0.5zM1536 640q0 -229 -5 -317
-q-10 -208 -124 -322t-322 -124q-88 -5 -317 -5t-317 5q-208 10 -322 124t-124 322q-5 88 -5 317t5 317q10 208 124 322t322 124q88 5 317 5t317 -5q208 -10 322 -124t124 -322q5 -88 5 -317z" />
- <glyph glyph-name="flickr" unicode="&#xf16e;"
-d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150
-t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
- <glyph glyph-name="adn" unicode="&#xf170;"
-d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="f171" unicode="&#xf171;" horiz-adv-x="1408"
-d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22
-t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18
-t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5
-t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
- <glyph glyph-name="bitbucket_sign" unicode="&#xf172;"
-d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5
-t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z
-M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120
-v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="tumblr" unicode="&#xf173;" horiz-adv-x="1024"
-d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14
-q78 2 134 29z" />
- <glyph glyph-name="tumblr_sign" unicode="&#xf174;"
-d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z
-M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="long_arrow_down" unicode="&#xf175;" horiz-adv-x="768"
-d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
- <glyph glyph-name="long_arrow_up" unicode="&#xf176;" horiz-adv-x="768"
-d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
- <glyph glyph-name="long_arrow_left" unicode="&#xf177;" horiz-adv-x="1792"
-d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
- <glyph glyph-name="long_arrow_right" unicode="&#xf178;" horiz-adv-x="1792"
-d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
- <glyph glyph-name="apple" unicode="&#xf179;" horiz-adv-x="1408"
-d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q113 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65
-q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
- <glyph glyph-name="windows" unicode="&#xf17a;" horiz-adv-x="1664"
-d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
- <glyph glyph-name="android" unicode="&#xf17b;" horiz-adv-x="1408"
-d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30
-t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5
-h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
- <glyph glyph-name="linux" unicode="&#xf17c;"
-d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-10 -11 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z
-M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7
-q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15
-q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5
-t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19
-q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63
-q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18q-2 -1 -4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92
-q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152
-q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-6 0 -8 -2t0 -4
-t5 -3q14 -4 18 -31q0 -3 8 2q2 2 2 3zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5
-t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43
-q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49
-t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54
-q110 143 124 195q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5
-t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5
-t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
- <glyph glyph-name="dribble" unicode="&#xf17d;"
-d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81
-t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19
-q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -5 6.5 -17t7.5 -17q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6
-t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="skype" unicode="&#xf17e;"
-d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5
-t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5
-q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80
-q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
- <glyph glyph-name="foursquare" unicode="&#xf180;" horiz-adv-x="1280"
-d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z
-M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324
-l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
- <glyph glyph-name="trello" unicode="&#xf181;"
-d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408
-q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
- <glyph glyph-name="female" unicode="&#xf182;" horiz-adv-x="1280"
-d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43
-q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
- <glyph glyph-name="male" unicode="&#xf183;" horiz-adv-x="1024"
-d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z
-M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
- <glyph glyph-name="gittip" unicode="&#xf184;"
-d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
-t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="sun" unicode="&#xf185;" horiz-adv-x="1792"
-d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4
-l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94
-q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
- <glyph glyph-name="_366" unicode="&#xf186;"
-d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61
-t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
- <glyph glyph-name="archive" unicode="&#xf187;" horiz-adv-x="1792"
-d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536
-q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
- <glyph glyph-name="bug" unicode="&#xf188;" horiz-adv-x="1664"
-d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207
-q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19
-t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
- <glyph glyph-name="vk" unicode="&#xf189;" horiz-adv-x="1920"
-d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-40 -51 -55 -72t-30.5 -49.5t-12 -42t13 -34.5t32.5 -43t57 -53q4 -2 5 -4q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58
-t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6
-q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q16 19 38 30q53 26 239 24
-q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2
-q39 5 64 -2.5t31 -16.5z" />
- <glyph glyph-name="weibo" unicode="&#xf18a;" horiz-adv-x="1792"
-d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12
-q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422
-q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178
-q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z
-M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
- <glyph glyph-name="renren" unicode="&#xf18b;"
-d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495
-q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
- <glyph glyph-name="_372" unicode="&#xf18c;" horiz-adv-x="1408"
-d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5
-t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56
-t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -4 1 -50t-1 -72q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5
-t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
- <glyph glyph-name="stack_exchange" unicode="&#xf18d;" horiz-adv-x="1280"
-d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z
-" />
- <glyph glyph-name="_374" unicode="&#xf18e;"
-d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198
-t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="arrow_circle_alt_left" unicode="&#xf190;"
-d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198
-t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="_376" unicode="&#xf191;"
-d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z
-M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="dot_circle_alt" unicode="&#xf192;"
-d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5
-t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="_378" unicode="&#xf193;" horiz-adv-x="1664"
-d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128
-q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 17 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
- <glyph glyph-name="vimeo_square" unicode="&#xf194;"
-d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179
-q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="_380" unicode="&#xf195;" horiz-adv-x="1152"
-d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160
-q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
- <glyph glyph-name="plus_square_o" unicode="&#xf196;" horiz-adv-x="1408"
-d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832
-q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="_382" unicode="&#xf197;" horiz-adv-x="2176"
-d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40
-t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29
-q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
- <glyph glyph-name="_383" unicode="&#xf198;" horiz-adv-x="1664"
-d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9
-q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102
-t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
- <glyph glyph-name="_384" unicode="&#xf199;"
-d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69
-q-47 32 -142 92.5t-142 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13
-t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
- <glyph glyph-name="_385" unicode="&#xf19a;" horiz-adv-x="1792"
-d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5
-t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21
-t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286
-t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273
-t273 -182.5t331.5 -68z" />
- <glyph glyph-name="_386" unicode="&#xf19b;" horiz-adv-x="1792"
-d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
- <glyph glyph-name="_387" unicode="&#xf19c;" horiz-adv-x="2048"
-d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64
-q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
- <glyph glyph-name="_388" unicode="&#xf19d;" horiz-adv-x="2304"
-d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433
-q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
- <glyph glyph-name="_389" unicode="&#xf19e;"
-d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q44 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0
-q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
- <glyph glyph-name="uniF1A0" unicode="&#xf1a0;"
-d="M768 750h725q12 -67 12 -128q0 -217 -91 -387.5t-259.5 -266.5t-386.5 -96q-157 0 -299 60.5t-245 163.5t-163.5 245t-60.5 299t60.5 299t163.5 245t245 163.5t299 60.5q300 0 515 -201l-209 -201q-123 119 -306 119q-129 0 -238.5 -65t-173.5 -176.5t-64 -243.5
-t64 -243.5t173.5 -176.5t238.5 -65q87 0 160 24t120 60t82 82t51.5 87t22.5 78h-436v264z" />
- <glyph glyph-name="f1a1" unicode="&#xf1a1;" horiz-adv-x="1792"
-d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26
-t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37
-q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191
-t348 71t348 -71t286 -191t191 -286t71 -348z" />
- <glyph glyph-name="_392" unicode="&#xf1a2;"
-d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54
-q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83
-q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960
-q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="_393" unicode="&#xf1a3;"
-d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150
-v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103
-t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="f1a4" unicode="&#xf1a4;" horiz-adv-x="1920"
-d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328
-v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
- <glyph glyph-name="_395" unicode="&#xf1a5;"
-d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
-t84.5 -203.5z" />
- <glyph glyph-name="_396" unicode="&#xf1a6;" horiz-adv-x="2048"
-d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123
-v-369h123z" />
- <glyph glyph-name="_397" unicode="&#xf1a7;"
-d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101
-v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960
-q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="_398" unicode="&#xf1a8;" horiz-adv-x="2038"
-d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14
-q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24
-q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33
-q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5
-t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43
-q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5
-t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13
-t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
- <glyph glyph-name="_399" unicode="&#xf1a9;"
-d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10
-q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14
-q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14
-t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44
-q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
- <glyph glyph-name="_400" unicode="&#xf1aa;"
-d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z
-M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5
-t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5
-q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126
-t135.5 51q85 0 145 -60.5t60 -145.5z" />
- <glyph glyph-name="f1ab" unicode="&#xf1ab;"
-d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5
-q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28
-q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z
-M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11
-q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q107 36 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5
-q20 0 20 -21v-418z" />
- <glyph glyph-name="_402" unicode="&#xf1ac;" horiz-adv-x="1792"
-d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48
-l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23
-t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128
-q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128
-q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
- <glyph glyph-name="_403" unicode="&#xf1ad;"
-d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9
-t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64
-q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64
-q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9
-t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64
-q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64
-q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9
-t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
- <glyph glyph-name="_404" unicode="&#xf1ae;" horiz-adv-x="1280"
-d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68q29 28 68.5 28t67.5 -28l228 -228h368l228 228q28 28 68 28t68 -28q28 -29 28 -68.5t-28 -67.5zM864 1152
-q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
- <glyph glyph-name="uniF1B1" unicode="&#xf1b0;" horiz-adv-x="1664"
-d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5
-q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819
-q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5
-t100.5 134t141.5 55.5z" />
- <glyph glyph-name="_406" unicode="&#xf1b1;" horiz-adv-x="768"
-d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
- <glyph glyph-name="_407" unicode="&#xf1b2;" horiz-adv-x="1792"
-d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z
-" />
- <glyph glyph-name="_408" unicode="&#xf1b3;" horiz-adv-x="2304"
-d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67
-t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-4 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70
-v-400l434 -186q36 -16 57 -48t21 -70z" />
- <glyph glyph-name="_409" unicode="&#xf1b4;" horiz-adv-x="2048"
-d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658
-q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204
-q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
- <glyph glyph-name="_410" unicode="&#xf1b5;"
-d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5
-t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217
-t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
- <glyph glyph-name="_411" unicode="&#xf1b6;" horiz-adv-x="1792"
-d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5
-q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89
-q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
- <glyph glyph-name="_412" unicode="&#xf1b7;"
-d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5
-q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5
-q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z
-" />
- <glyph glyph-name="_413" unicode="&#xf1b8;" horiz-adv-x="1792"
-d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188
-l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5
-t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1
-q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
- <glyph glyph-name="_414" unicode="&#xf1b9;" horiz-adv-x="2048"
-d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384
-q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5
-l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
- <glyph glyph-name="_415" unicode="&#xf1ba;" horiz-adv-x="2048"
-d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5
-t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z
-M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
- <glyph glyph-name="_416" unicode="&#xf1bb;"
-d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384
-q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
- <glyph glyph-name="_417" unicode="&#xf1bc;"
-d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64
-q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37
-q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="_418" unicode="&#xf1bd;" horiz-adv-x="1024"
-d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" />
- <glyph glyph-name="_419" unicode="&#xf1be;" horiz-adv-x="2304"
-d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11
-q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245
-q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785
-l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242
-q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236
-q0 -11 -8 -19t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786
-q-13 2 -22 11t-9 22v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
- <glyph glyph-name="uniF1C0" unicode="&#xf1c0;"
-d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127
-t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5
-t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
- <glyph glyph-name="uniF1C1" unicode="&#xf1c1;"
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197
-q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8
-q-1 1 -1 2q-1 2 -1 3q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
- <glyph glyph-name="_422" unicode="&#xf1c2;"
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4q0 3 -0.5 6.5t-1.5 8t-1 6.5q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5
-t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300z" />
- <glyph glyph-name="_423" unicode="&#xf1c3;"
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107
-h-290v-107h68l189 -272l-194 -283h-68z" />
- <glyph glyph-name="_424" unicode="&#xf1c4;"
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
- <glyph glyph-name="_425" unicode="&#xf1c5;"
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
- <glyph glyph-name="_426" unicode="&#xf1c6;"
-d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400
-v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79
-q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
- <glyph glyph-name="_427" unicode="&#xf1c7;"
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5
-q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
- <glyph glyph-name="_428" unicode="&#xf1c8;"
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
- <glyph glyph-name="_429" unicode="&#xf1c9;"
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243
-l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
- <glyph glyph-name="_430" unicode="&#xf1ca;"
-d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406
-q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
- <glyph glyph-name="_431" unicode="&#xf1cb;" horiz-adv-x="1792"
-d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546
-q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
- <glyph glyph-name="_432" unicode="&#xf1cc;" horiz-adv-x="2048"
-d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94
-q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55
-t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97l93 -108q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z" />
- <glyph glyph-name="_433" unicode="&#xf1cd;" horiz-adv-x="1792"
-d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194
-q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5
-t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
- <glyph glyph-name="_434" unicode="&#xf1ce;" horiz-adv-x="1792"
-d="M1760 640q0 -176 -68.5 -336t-184 -275.5t-275.5 -184t-336 -68.5t-336 68.5t-275.5 184t-184 275.5t-68.5 336q0 213 97 398.5t265 305.5t374 151v-228q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5
-t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v228q206 -31 374 -151t265 -305.5t97 -398.5z" />
- <glyph glyph-name="uniF1D0" unicode="&#xf1d0;" horiz-adv-x="1792"
-d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41
-t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170
-t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136
-q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
- <glyph glyph-name="uniF1D1" unicode="&#xf1d1;" horiz-adv-x="1792"
-d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251
-l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162
-q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33
-q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5
-t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71
-t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
- <glyph glyph-name="uniF1D2" unicode="&#xf1d2;"
-d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85
-q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392
-q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072
-q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="_438" unicode="&#xf1d3;" horiz-adv-x="1792"
-d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58
-q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47
-q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171
-v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
- <glyph glyph-name="_439" unicode="&#xf1d4;"
-d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="uniF1D5" unicode="&#xf1d5;" horiz-adv-x="1280"
-d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5
-t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153
-t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
- <glyph glyph-name="uniF1D6" unicode="&#xf1d6;" horiz-adv-x="1792"
-d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5
-q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20
-t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5
-t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
- <glyph glyph-name="uniF1D7" unicode="&#xf1d7;" horiz-adv-x="2048"
-d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25
-q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5
-q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109
-q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
- <glyph glyph-name="_443" unicode="&#xf1d8;" horiz-adv-x="1792"
-d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
- <glyph glyph-name="_444" unicode="&#xf1d9;" horiz-adv-x="1792"
-d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137
-l863 639l-478 -797z" />
- <glyph glyph-name="_445" unicode="&#xf1da;"
-d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5
-t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23
-t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
- <glyph glyph-name="_446" unicode="&#xf1db;"
-d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
-t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="_447" unicode="&#xf1dc;" horiz-adv-x="1792"
-d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15
-t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2
-t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160
-q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5
-q0 -26 -12 -48t-36 -22z" />
- <glyph glyph-name="_448" unicode="&#xf1dd;" horiz-adv-x="1280"
-d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179
-q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
- <glyph glyph-name="_449" unicode="&#xf1de;"
-d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256
-q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
- <glyph glyph-name="uniF1E0" unicode="&#xf1e0;"
-d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5
-t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
- <glyph glyph-name="_451" unicode="&#xf1e1;"
-d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5
-t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="_452" unicode="&#xf1e2;" horiz-adv-x="1792"
-d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5
-t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91
-q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9
-t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
- <glyph glyph-name="_453" unicode="&#xf1e3;" horiz-adv-x="1792"
-d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323
-l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
- <glyph glyph-name="_454" unicode="&#xf1e4;" horiz-adv-x="1792"
-d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23
-v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192
-q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23
-zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5
-t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
- <glyph glyph-name="_455" unicode="&#xf1e5;" horiz-adv-x="1792"
-d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z
-M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
- <glyph glyph-name="_456" unicode="&#xf1e6;" horiz-adv-x="1792"
-d="M1755 1083q37 -38 37 -90.5t-37 -90.5l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234
-l401 400q38 37 91 37t90 -37z" />
- <glyph glyph-name="_457" unicode="&#xf1e7;" horiz-adv-x="1792"
-d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5
-t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z
-M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q4 -2 11.5 -7
-t10.5 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
- <glyph glyph-name="_458" unicode="&#xf1e8;" horiz-adv-x="1792"
-d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
- <glyph glyph-name="_459" unicode="&#xf1e9;"
-d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36
-q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q71 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5
-t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87
-q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
- <glyph glyph-name="_460" unicode="&#xf1ea;" horiz-adv-x="2048"
-d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19
-t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
- <glyph glyph-name="_461" unicode="&#xf1eb;" horiz-adv-x="2048"
-d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121
-q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z
-M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
- <glyph glyph-name="_462" unicode="&#xf1ec;" horiz-adv-x="1792"
-d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5
-t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5
-t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5
-t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z
-M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38
-h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
- <glyph glyph-name="_463" unicode="&#xf1ed;"
-d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246
-q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598
-q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" />
- <glyph glyph-name="_464" unicode="&#xf1ee;" horiz-adv-x="1792"
-d="M441 864q33 0 52 -26q266 -364 362 -774h-446q-127 441 -367 749q-12 16 -3 33.5t29 17.5h373zM1000 507q-49 -199 -125 -393q-79 310 -256 594q40 221 44 449q211 -340 337 -650zM1099 1216q235 -324 384.5 -698.5t184.5 -773.5h-451q-41 665 -553 1472h435zM1792 640
-q0 -424 -101 -812q-67 560 -359 1083q-25 301 -106 584q-4 16 5.5 28.5t25.5 12.5h359q21 0 38.5 -13t22.5 -33q115 -409 115 -850z" />
- <glyph glyph-name="uniF1F0" unicode="&#xf1f0;" horiz-adv-x="2304"
-d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27
-q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128
-q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
- <glyph glyph-name="_466" unicode="&#xf1f1;" horiz-adv-x="2304"
-d="M1119 1195q-128 85 -281 85q-103 0 -197.5 -40.5t-162.5 -108.5t-108.5 -162t-40.5 -197q0 -104 40.5 -198t108.5 -162t162 -108.5t198 -40.5q153 0 281 85q-131 107 -178 265.5t0.5 316.5t177.5 265zM1152 1171q-126 -99 -172 -249.5t-0.5 -300.5t172.5 -249
-q127 99 172.5 249t-0.5 300.5t-172 249.5zM1185 1195q130 -107 177.5 -265.5t0.5 -317t-178 -264.5q128 -85 281 -85q104 0 198 40.5t162 108.5t108.5 162t40.5 198q0 103 -40.5 197t-108.5 162t-162.5 108.5t-197.5 40.5q-153 0 -281 -85zM1926 473h7v3h-17v-3h7v-17h3v17z
-M1955 456h4v20h-5l-6 -13l-6 13h-5v-20h3v15l6 -13h4l5 13v-15zM1947 16v-2h-2h-3v3h3h2v-1zM1947 7h3l-4 5h2l1 1q1 1 1 3t-1 3l-1 1h-3h-6v-13h3v5h1zM685 75q0 19 11 31t30 12q18 0 29 -12.5t11 -30.5q0 -19 -11 -31t-29 -12q-19 0 -30 12t-11 31zM1158 119q30 0 35 -32
-h-70q5 32 35 32zM1514 75q0 19 11 31t29 12t29.5 -12.5t11.5 -30.5q0 -19 -11 -31t-30 -12q-18 0 -29 12t-11 31zM1786 75q0 18 11.5 30.5t29.5 12.5t29.5 -12.5t11.5 -30.5q0 -19 -11.5 -31t-29.5 -12t-29.5 12.5t-11.5 30.5zM1944 3q-2 0 -4 1q-1 0 -3 2t-2 3q-1 2 -1 4
-q0 3 1 4q0 2 2 4l1 1q2 0 2 1q2 1 4 1q3 0 4 -1l4 -2l2 -4v-1q1 -2 1 -3l-1 -1v-3t-1 -1l-1 -2q-2 -2 -4 -2q-1 -1 -4 -1zM599 7h30v85q0 24 -14.5 38.5t-39.5 15.5q-32 0 -47 -24q-14 24 -45 24q-24 0 -39 -20v16h-30v-135h30v75q0 36 33 36q30 0 30 -36v-75h29v75
-q0 36 33 36q30 0 30 -36v-75zM765 7h29v68v67h-29v-16q-17 20 -43 20q-29 0 -48 -20t-19 -51t19 -51t48 -20q28 0 43 20v-17zM943 48q0 34 -47 40l-14 2q-23 4 -23 14q0 15 25 15q23 0 43 -11l12 24q-22 14 -55 14q-26 0 -41 -12t-15 -32q0 -33 47 -39l13 -2q24 -4 24 -14
-q0 -17 -31 -17q-25 0 -45 14l-13 -23q25 -17 58 -17q29 0 45.5 12t16.5 32zM1073 14l-8 25q-13 -7 -26 -7q-19 0 -19 22v61h48v27h-48v41h-30v-41h-28v-27h28v-61q0 -50 47 -50q21 0 36 10zM1159 146q-29 0 -48 -20t-19 -51q0 -32 19.5 -51.5t49.5 -19.5q33 0 55 19l-14 22
-q-18 -15 -39 -15q-34 0 -41 33h101v12q0 32 -18 51.5t-46 19.5zM1318 146q-23 0 -35 -20v16h-30v-135h30v76q0 35 29 35q10 0 18 -4l9 28q-9 4 -21 4zM1348 75q0 -31 19.5 -51t52.5 -20q29 0 48 16l-14 24q-18 -13 -35 -12q-18 0 -29.5 12t-11.5 31t11.5 31t29.5 12
-q19 0 35 -12l14 24q-20 16 -48 16q-33 0 -52.5 -20t-19.5 -51zM1593 7h30v68v67h-30v-16q-15 20 -42 20q-29 0 -48.5 -20t-19.5 -51t19.5 -51t48.5 -20q28 0 42 20v-17zM1726 146q-23 0 -35 -20v16h-29v-135h29v76q0 35 29 35q10 0 18 -4l9 28q-8 4 -21 4zM1866 7h29v68v122
-h-29v-71q-15 20 -43 20t-47.5 -20.5t-19.5 -50.5t19.5 -50.5t47.5 -20.5q29 0 43 20v-17zM1944 27l-2 -1h-3q-2 -1 -4 -3q-3 -1 -3 -4q-1 -2 -1 -6q0 -3 1 -5q0 -2 3 -4q2 -2 4 -3t5 -1q4 0 6 1q0 1 2 2l2 1q1 1 3 4q1 2 1 5q0 4 -1 6q-1 1 -3 4q0 1 -2 2l-2 1q-1 0 -3 0.5
-t-3 0.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
- <glyph glyph-name="_467" unicode="&#xf1f2;" horiz-adv-x="2304"
-d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42
-q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604
-v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569
-q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73
-t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
- <glyph glyph-name="f1f3" unicode="&#xf1f3;" horiz-adv-x="2304"
-d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z
-M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260
-l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279
-v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040
-q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168
-q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5
-t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21
-h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5
-t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
- <glyph glyph-name="_469" unicode="&#xf1f4;" horiz-adv-x="2304"
-d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16
-t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76
-q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59
-t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489
-l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66
-q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
- <glyph glyph-name="_470" unicode="&#xf1f5;" horiz-adv-x="2304"
-d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109
-q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118
-q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151
-q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31
-q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
- <glyph glyph-name="_471" unicode="&#xf1f6;" horiz-adv-x="2048"
-d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5
-l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5
-l418 363q10 8 23.5 7t21.5 -11z" />
- <glyph glyph-name="_472" unicode="&#xf1f7;" horiz-adv-x="2048"
-d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128
-q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161
-q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
- <glyph glyph-name="_473" unicode="&#xf1f8;" horiz-adv-x="1408"
-d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704
-q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167
-q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
- <glyph glyph-name="_474" unicode="&#xf1f9;"
-d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5
-t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5
-t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="_475" unicode="&#xf1fa;"
-d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53
-q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24
-t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61
-t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
- <glyph glyph-name="_476" unicode="&#xf1fb;" horiz-adv-x="1792"
-d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10
-t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
- <glyph glyph-name="f1fc" unicode="&#xf1fc;" horiz-adv-x="1792"
-d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5
-t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
- <glyph glyph-name="_478" unicode="&#xf1fd;" horiz-adv-x="1792"
-d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11q24 0 44 -7t31 -15t33 -27q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5
-t47 37.5q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-24 0 -44 7t-31 15t-33 27q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38
-t-58 27t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448
-h256v448h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5
-q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
- <glyph glyph-name="_479" unicode="&#xf1fe;" horiz-adv-x="2048"
-d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
- <glyph glyph-name="_480" unicode="&#xf200;" horiz-adv-x="1792"
-d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="_481" unicode="&#xf201;" horiz-adv-x="2048"
-d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9
-t9 -23z" />
- <glyph glyph-name="_482" unicode="&#xf202;" horiz-adv-x="1792"
-d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20
-q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50
-t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1
-q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
- <glyph glyph-name="_483" unicode="&#xf203;"
-d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73
-q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110
-q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960
-q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="_484" unicode="&#xf204;" horiz-adv-x="2048"
-d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5
-t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5
-t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
- <glyph glyph-name="_485" unicode="&#xf205;" horiz-adv-x="2048"
-d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5
-t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
- <glyph glyph-name="_486" unicode="&#xf206;" horiz-adv-x="2304"
-d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94
-q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469
-q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400
-q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
- <glyph glyph-name="_487" unicode="&#xf207;"
-d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5
-h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
-t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
- <glyph glyph-name="_488" unicode="&#xf208;" horiz-adv-x="2048"
-d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327
-q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5
-q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
- <glyph glyph-name="_489" unicode="&#xf209;" horiz-adv-x="1280"
-d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q17 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119
-t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5
-t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14
-q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88
-q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5
-t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
- <glyph glyph-name="_490" unicode="&#xf20a;" horiz-adv-x="2048"
-d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206
-q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307
-t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14
-t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
- <glyph glyph-name="_491" unicode="&#xf20b;"
-d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5
-t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
- <glyph glyph-name="_492" unicode="&#xf20c;"
-d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55
-q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410
-q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
- <glyph glyph-name="_493" unicode="&#xf20d;"
-d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" />
- <glyph glyph-name="_494" unicode="&#xf20e;" horiz-adv-x="2048"
-d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335
-q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5
-q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360l15 -6l188 199v347l-187 194q-13 -8 -29 -10zM986 1438
-h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13zM552 226h402l64 66
-l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224l213 -225zM1023 946
-l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196l-48 -227l130 227h-82
-zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" />
- <glyph glyph-name="f210" unicode="&#xf210;"
-d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" />
- <glyph glyph-name="_496" unicode="&#xf211;"
-d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384
-q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" />
- <glyph glyph-name="f212" unicode="&#xf212;" horiz-adv-x="2048"
-d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021
-q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25
-q209 0 374 -102q172 107 374 102z" />
- <glyph glyph-name="_498" unicode="&#xf213;" horiz-adv-x="2048"
-d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101
-q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284
-q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" />
- <glyph glyph-name="_499" unicode="&#xf214;"
-d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34
-l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114
-v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z
-M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378
-v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51
-h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5
-t-43 -34t-16.5 -53.5z" />
- <glyph glyph-name="_500" unicode="&#xf215;" horiz-adv-x="2048"
-d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832
-q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" />
- <glyph glyph-name="_501" unicode="&#xf216;" horiz-adv-x="2048"
-d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126t-103.5 132.5t-108.5 126.5t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5
-t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113
-t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5
-q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" />
- <glyph glyph-name="_502" unicode="&#xf217;" horiz-adv-x="1664"
-d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
-t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920
-q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
- <glyph glyph-name="_503" unicode="&#xf218;" horiz-adv-x="1664"
-d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
-t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920
-q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
- <glyph glyph-name="_504" unicode="&#xf219;" horiz-adv-x="2048"
-d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20
-l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" />
- <glyph glyph-name="_505" unicode="&#xf21a;" horiz-adv-x="2048"
-d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83
-q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83
-q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314
-v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83
-q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
- <glyph glyph-name="_506" unicode="&#xf21b;"
-d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14
-t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5
-q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31
-t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" />
- <glyph glyph-name="_507" unicode="&#xf21c;" horiz-adv-x="2304"
-d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5
-t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105
-l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226
-t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" />
- <glyph glyph-name="_508" unicode="&#xf21d;"
-d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12
-q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384
-q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5
-t158.5 -65.5t65.5 -158.5z" />
- <glyph glyph-name="_509" unicode="&#xf21e;" horiz-adv-x="1792"
-d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221
-q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124
-t127 -344z" />
- <glyph glyph-name="venus" unicode="&#xf221;" horiz-adv-x="1280"
-d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292
-q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
- <glyph glyph-name="_511" unicode="&#xf222;"
-d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5
-q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
- <glyph glyph-name="_512" unicode="&#xf223;" horiz-adv-x="1280"
-d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5
-t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
-t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
- <glyph glyph-name="_513" unicode="&#xf224;"
-d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64
-q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
-t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
- <glyph glyph-name="_514" unicode="&#xf225;" horiz-adv-x="1792"
-d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64
-q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9
-t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5
-t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
- <glyph glyph-name="_515" unicode="&#xf226;" horiz-adv-x="1792"
-d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23
-t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391
-q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391
-q0 -226 -154 -391q103 -57 218 -57z" />
- <glyph glyph-name="_516" unicode="&#xf227;" horiz-adv-x="1920"
-d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230
-q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9
-t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128
-q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -28 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" />
- <glyph glyph-name="_517" unicode="&#xf228;" horiz-adv-x="2048"
-d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23
-t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9
-t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5
-t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" />
- <glyph glyph-name="_518" unicode="&#xf229;"
-d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5
-t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
-t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
- <glyph glyph-name="_519" unicode="&#xf22a;" horiz-adv-x="1280"
-d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22
-t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5
-t131.5 -316.5t316.5 -131.5z" />
- <glyph glyph-name="_520" unicode="&#xf22b;" horiz-adv-x="2048"
-d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5
-t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5
-t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
- <glyph glyph-name="_521" unicode="&#xf22c;" horiz-adv-x="1280"
-d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5
-t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
- <glyph glyph-name="_522" unicode="&#xf22d;" horiz-adv-x="1280"
-d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123
-t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" />
- <glyph glyph-name="_523" unicode="&#xf22e;" horiz-adv-x="1792"
- />
- <glyph glyph-name="_524" unicode="&#xf22f;" horiz-adv-x="1792"
- />
- <glyph glyph-name="_525" unicode="&#xf230;"
-d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" />
- <glyph glyph-name="_526" unicode="&#xf231;" horiz-adv-x="1280"
-d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5
-l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5
-q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" />
- <glyph glyph-name="_527" unicode="&#xf232;"
-d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5
-t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233
-l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" />
- <glyph glyph-name="_528" unicode="&#xf233;" horiz-adv-x="1792"
-d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216
-q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
- <glyph glyph-name="_529" unicode="&#xf234;" horiz-adv-x="2048"
-d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5
-t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5
-t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" />
- <glyph glyph-name="_530" unicode="&#xf235;" horiz-adv-x="2048"
-d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136
-q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69
-t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" />
- <glyph glyph-name="_531" unicode="&#xf236;" horiz-adv-x="2048"
-d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704
-q-26 0 -45 -19t-19 -45v-384h1152z" />
- <glyph glyph-name="_532" unicode="&#xf237;"
-d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" />
- <glyph glyph-name="_533" unicode="&#xf238;"
-d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56
-t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" />
- <glyph glyph-name="_534" unicode="&#xf239;"
-d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47
-t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" />
- <glyph glyph-name="_535" unicode="&#xf23a;" horiz-adv-x="1792"
-d="M597 1115v-1173q0 -25 -12.5 -42.5t-36.5 -17.5q-17 0 -33 8l-465 233q-21 10 -35.5 33.5t-14.5 46.5v1140q0 20 10 34t29 14q14 0 44 -15l511 -256q3 -3 3 -5zM661 1014l534 -866l-534 266v600zM1792 996v-1054q0 -25 -14 -40.5t-38 -15.5t-47 13l-441 220zM1789 1116
-q0 -3 -256.5 -419.5t-300.5 -487.5l-390 634l324 527q17 28 52 28q14 0 26 -6l541 -270q4 -2 4 -6z" />
- <glyph glyph-name="_536" unicode="&#xf23b;"
-d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" />
- <glyph glyph-name="_537" unicode="&#xf23c;" horiz-adv-x="2296"
-d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5
-q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5
-q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42
-q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37
-q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5
-q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139
-q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 5 5 8q16 18 60 23h13q5 18 19 30t33 8
-t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132
-q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132
-q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z
-M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-105 2 -211 0v1q-1 -27 2.5 -86
-t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103
-q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34q0 2 0.5 3.5t1.5 3t1 2.5v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4
-l-10 -2.5t-12 -2l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-6 -1 -9 -1q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130
-t-73 70q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -1 -1 -4t-1 -5q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150
-q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12
-q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" />
- <glyph glyph-name="_538" unicode="&#xf23d;" horiz-adv-x="2304"
-d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5
-t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5
-t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" />
- <glyph glyph-name="_539" unicode="&#xf23e;" horiz-adv-x="1792"
-d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348
-t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23
-t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96
-q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512
-q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" />
- <glyph glyph-name="_540" unicode="&#xf240;" horiz-adv-x="2304"
-d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113
-v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" />
- <glyph glyph-name="_541" unicode="&#xf241;" horiz-adv-x="2304"
-d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
-h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
- <glyph glyph-name="_542" unicode="&#xf242;" horiz-adv-x="2304"
-d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
-h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
- <glyph glyph-name="_543" unicode="&#xf243;" horiz-adv-x="2304"
-d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
-h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
- <glyph glyph-name="_544" unicode="&#xf244;" horiz-adv-x="2304"
-d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23
-v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
- <glyph glyph-name="_545" unicode="&#xf245;" horiz-adv-x="1280"
-d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" />
- <glyph glyph-name="_546" unicode="&#xf246;" horiz-adv-x="1024"
-d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" />
- <glyph glyph-name="_547" unicode="&#xf247;" horiz-adv-x="2048"
-d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128
-h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" />
- <glyph glyph-name="_548" unicode="&#xf248;" horiz-adv-x="2304"
-d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256
-v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" />
- <glyph glyph-name="_549" unicode="&#xf249;"
-d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" />
- <glyph glyph-name="_550" unicode="&#xf24a;"
-d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68
-z" />
- <glyph glyph-name="_551" unicode="&#xf24b;" horiz-adv-x="2304"
-d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5
-t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88
-t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90
-t90 38h2048q52 0 90 -38t38 -90z" />
- <glyph glyph-name="_552" unicode="&#xf24c;" horiz-adv-x="2304"
-d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294
-t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z
-M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
- <glyph glyph-name="_553" unicode="&#xf24d;" horiz-adv-x="1792"
-d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113
-zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" />
- <glyph glyph-name="_554" unicode="&#xf24e;" horiz-adv-x="2304"
-d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64
-q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91
-t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5
-t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" />
- <glyph glyph-name="_555" unicode="&#xf250;"
-d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
-t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5
-t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
- <glyph glyph-name="_556" unicode="&#xf251;"
-d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
-t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" />
- <glyph glyph-name="_557" unicode="&#xf252;"
-d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
-t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" />
- <glyph glyph-name="_558" unicode="&#xf253;"
-d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
-t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196
-h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
- <glyph glyph-name="_559" unicode="&#xf254;"
-d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87
-t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9
-h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" />
- <glyph glyph-name="_560" unicode="&#xf255;"
-d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25
-q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27
-t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21
-q72 69 174 69z" />
- <glyph glyph-name="_561" unicode="&#xf256;" horiz-adv-x="1792"
-d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33
-t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52
-h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" />
- <glyph glyph-name="_562" unicode="&#xf257;" horiz-adv-x="1792"
-d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668
-q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17
-t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5
-t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5
-q0 -42 -23 -78t-61 -53l-310 -141h91z" />
- <glyph glyph-name="_563" unicode="&#xf258;" horiz-adv-x="2048"
-d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32
-q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68
-q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" />
- <glyph glyph-name="_564" unicode="&#xf259;" horiz-adv-x="2048"
-d="M459 -256q-77 0 -137.5 47.5t-79.5 122.5l-101 401q-13 57 -13 108q0 45 -5 67l-116 477q-7 27 -7 57q0 93 62 161t155 78q17 85 82.5 139t152.5 54q83 0 148 -51.5t85 -132.5l83 -348l103 428q20 81 85 132.5t148 51.5q89 0 155.5 -57.5t80.5 -144.5q92 -10 152 -79
-t60 -162q0 -24 -7 -59l-123 -512q10 7 37.5 28.5t38.5 29.5t35 23t41 20.5t41.5 11t49.5 5.5q105 0 180 -74t75 -179q0 -62 -28.5 -118t-78.5 -94l-507 -380q-68 -51 -153 -51h-694zM1104 1408q-38 0 -68.5 -24t-39.5 -62l-164 -682h-127l-145 602q-9 38 -39.5 62t-68.5 24
-q-48 0 -80 -33t-32 -80q0 -15 3 -28l132 -547h-26l-99 408q-9 37 -40 62.5t-69 25.5q-47 0 -80 -33t-33 -79q0 -14 3 -26l116 -478q7 -28 9 -86t10 -88l100 -401q8 -32 34 -52.5t59 -20.5h694q42 0 76 26l507 379q56 43 56 110q0 52 -37.5 88.5t-89.5 36.5q-43 0 -77 -26
-l-307 -230v227q0 4 32 138t68 282t39 161q4 18 4 29q0 47 -32 81t-79 34q-39 0 -69.5 -24t-39.5 -62l-116 -482h-26l150 624q3 14 3 28q0 48 -31.5 82t-79.5 34z" />
- <glyph glyph-name="_565" unicode="&#xf25a;" horiz-adv-x="1792"
-d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5
-q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5
-v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32
-v-384h32z" />
- <glyph glyph-name="_566" unicode="&#xf25b;"
-d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181
-v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46
-q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5
-q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308
-q0 -53 37.5 -90.5t90.5 -37.5h668z" />
- <glyph glyph-name="_567" unicode="&#xf25c;" horiz-adv-x="1973"
-d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5
-t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141
-q13 0 22 -8.5t10 -20.5z" />
- <glyph glyph-name="_568" unicode="&#xf25d;" horiz-adv-x="1792"
-d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109
-t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640
-q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
- <glyph glyph-name="_569" unicode="&#xf25e;" horiz-adv-x="1792"
-d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78
-q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5
-t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376
-q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191
-t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" />
- <glyph glyph-name="f260" unicode="&#xf260;" horiz-adv-x="2048"
-d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" />
- <glyph glyph-name="f261" unicode="&#xf261;" horiz-adv-x="1792"
-d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191
-t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
- <glyph glyph-name="_572" unicode="&#xf262;" horiz-adv-x="2304"
-d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57
-t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197
-t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5
-t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5
-t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5
-q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" />
- <glyph glyph-name="f263" unicode="&#xf263;" horiz-adv-x="1280"
-d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5
-t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94
-q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" />
- <glyph glyph-name="_574" unicode="&#xf264;"
-d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32
-q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5
-zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="_575" unicode="&#xf265;" horiz-adv-x="1720"
-d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33
-l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" />
- <glyph glyph-name="_576" unicode="&#xf266;" horiz-adv-x="2304"
-d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540
-q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81
-l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" />
- <glyph glyph-name="_577" unicode="&#xf267;" horiz-adv-x="1792"
-d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640
-q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5
-t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5
-t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5
-t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191
-t191 -286t71 -348z" />
- <glyph glyph-name="_578" unicode="&#xf268;" horiz-adv-x="1792"
-d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962
-q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" />
- <glyph glyph-name="_579" unicode="&#xf269;" horiz-adv-x="1792"
-d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5
-q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5
-q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" />
- <glyph glyph-name="_580" unicode="&#xf26a;" horiz-adv-x="1792"
-d="M1493 1308q-165 110 -359 110q-155 0 -293 -73t-240 -200q-75 -93 -119.5 -218t-48.5 -266v-42q4 -141 48.5 -266t119.5 -218q102 -127 240 -200t293 -73q194 0 359 110q-121 -108 -274.5 -168t-322.5 -60q-29 0 -43 1q-175 8 -333 82t-272 193t-181 281t-67 339
-q0 182 71 348t191 286t286 191t348 71h3q168 -1 320.5 -60.5t273.5 -167.5zM1792 640q0 -192 -77 -362.5t-213 -296.5q-104 -63 -222 -63q-137 0 -255 84q154 56 253.5 233t99.5 405q0 227 -99 404t-253 234q119 83 254 83q119 0 226 -65q135 -125 210.5 -295t75.5 -361z
-" />
- <glyph glyph-name="_581" unicode="&#xf26b;" horiz-adv-x="1792"
-d="M1792 599q0 -56 -7 -104h-1151q0 -146 109.5 -244.5t257.5 -98.5q99 0 185.5 46.5t136.5 130.5h423q-56 -159 -170.5 -281t-267.5 -188.5t-321 -66.5q-187 0 -356 83q-228 -116 -394 -116q-237 0 -237 263q0 115 45 275q17 60 109 229q199 360 475 606
-q-184 -79 -427 -354q63 274 283.5 449.5t501.5 175.5q30 0 45 -1q255 117 433 117q64 0 116 -13t94.5 -40.5t66.5 -76.5t24 -115q0 -116 -75 -286q101 -182 101 -390zM1722 1239q0 83 -53 132t-137 49q-108 0 -254 -70q121 -47 222.5 -131.5t170.5 -195.5q51 135 51 216z
-M128 2q0 -86 48.5 -132.5t134.5 -46.5q115 0 266 83q-122 72 -213.5 183t-137.5 245q-98 -205 -98 -332zM632 715h728q-5 142 -113 237t-251 95q-144 0 -251.5 -95t-112.5 -237z" />
- <glyph glyph-name="_582" unicode="&#xf26c;" horiz-adv-x="2048"
-d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23
-v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
- <glyph glyph-name="_583" unicode="&#xf26d;" horiz-adv-x="1792"
-d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34
-h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100
-q-68 175 -180 287z" />
- <glyph glyph-name="_584" unicode="&#xf26e;"
-d="M1401 -11l-6 -6q-113 -113 -259 -175q-154 -64 -317 -64q-165 0 -317 64q-148 63 -259 175q-113 112 -175 258q-42 103 -54 189q-4 28 48 36q51 8 56 -20q1 -1 1 -4q18 -90 46 -159q50 -124 152 -226q98 -98 226 -152q132 -56 276 -56q143 0 276 56q128 55 225 152l6 6
-q10 10 25 6q12 -3 33 -22q36 -37 17 -58zM929 604l-66 -66l63 -63q21 -21 -7 -49q-17 -17 -32 -17q-10 0 -19 10l-62 61l-66 -66q-5 -5 -15 -5q-15 0 -31 16l-2 2q-18 15 -18 29q0 7 8 17l66 65l-66 66q-16 16 14 45q18 18 31 18q6 0 13 -5l65 -66l65 65q18 17 48 -13
-q27 -27 11 -44zM1400 547q0 -118 -46 -228q-45 -105 -126 -186q-80 -80 -187 -126t-228 -46t-228 46t-187 126q-82 82 -125 186q-15 33 -15 40h-1q-9 27 43 44q50 16 60 -12q37 -99 97 -167h1v339v2q3 136 102 232q105 103 253 103q147 0 251 -103t104 -249
-q0 -147 -104.5 -251t-250.5 -104q-58 0 -112 16q-28 11 -13 61q16 51 44 43l14 -3q14 -3 33 -6t30 -3q104 0 176 71.5t72 174.5q0 101 -72 171q-71 71 -175 71q-107 0 -178 -80q-64 -72 -64 -160v-413q110 -67 242 -67q96 0 185 36.5t156 103.5t103.5 155t36.5 183
-q0 198 -141 339q-140 140 -339 140q-200 0 -340 -140q-53 -53 -77 -87l-2 -2q-8 -11 -13 -15.5t-21.5 -9.5t-38.5 3q-21 5 -36.5 16.5t-15.5 26.5v680q0 15 10.5 26.5t27.5 11.5h877q30 0 30 -55t-30 -55h-811v-483h1q40 42 102 84t108 61q109 46 231 46q121 0 228 -46
-t187 -126q81 -81 126 -186q46 -112 46 -229zM1369 1128q9 -8 9 -18t-5.5 -18t-16.5 -21q-26 -26 -39 -26q-9 0 -16 7q-106 91 -207 133q-128 56 -276 56q-133 0 -262 -49q-27 -10 -45 37q-9 25 -8 38q3 16 16 20q130 57 299 57q164 0 316 -64q137 -58 235 -152z" />
- <glyph glyph-name="_585" unicode="&#xf270;" horiz-adv-x="1792"
-d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z
-M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30
-q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57
-t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133
-q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" />
- <glyph glyph-name="_586" unicode="&#xf271;" horiz-adv-x="1792"
-d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9
-h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224
-v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" />
- <glyph glyph-name="_587" unicode="&#xf272;" horiz-adv-x="1792"
-d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23
-t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47
-t47 -113v-96h128q52 0 90 -38t38 -90z" />
- <glyph glyph-name="_588" unicode="&#xf273;" horiz-adv-x="1792"
-d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z
-M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280
-q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
- <glyph glyph-name="_589" unicode="&#xf274;" horiz-adv-x="1792"
-d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23
-t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47
-t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
- <glyph glyph-name="_590" unicode="&#xf275;" horiz-adv-x="1792"
-d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" />
- <glyph glyph-name="_591" unicode="&#xf276;" horiz-adv-x="1024"
-d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q62 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249
-q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" />
- <glyph glyph-name="_592" unicode="&#xf277;" horiz-adv-x="1792"
-d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768
-q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" />
- <glyph glyph-name="_593" unicode="&#xf278;" horiz-adv-x="2048"
-d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173
-v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" />
- <glyph glyph-name="_594" unicode="&#xf279;" horiz-adv-x="1792"
-d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472
-q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" />
- <glyph glyph-name="_595" unicode="&#xf27a;" horiz-adv-x="1792"
-d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5
-t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37
-t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
- <glyph glyph-name="_596" unicode="&#xf27b;" horiz-adv-x="1792"
-d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5
-t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5
-t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51
-t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" />
- <glyph glyph-name="_597" unicode="&#xf27c;" horiz-adv-x="1024"
-d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" />
- <glyph glyph-name="_598" unicode="&#xf27d;" horiz-adv-x="1792"
-d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246
-q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" />
- <glyph glyph-name="f27e" unicode="&#xf27e;"
-d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" />
- <glyph glyph-name="uniF280" unicode="&#xf280;"
-d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72
-h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275
-l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" />
- <glyph glyph-name="uniF281" unicode="&#xf281;" horiz-adv-x="1792"
-d="M1792 690q0 -58 -29.5 -105.5t-79.5 -72.5q12 -46 12 -96q0 -155 -106.5 -287t-290.5 -208.5t-400 -76.5t-399.5 76.5t-290 208.5t-106.5 287q0 47 11 94q-51 25 -82 73.5t-31 106.5q0 82 58 140.5t141 58.5q85 0 145 -63q218 152 515 162l116 521q3 13 15 21t26 5
-l369 -81q18 37 54 59.5t79 22.5q62 0 106 -43.5t44 -105.5t-44 -106t-106 -44t-105.5 43.5t-43.5 105.5l-334 74l-104 -472q300 -9 519 -160q58 61 143 61q83 0 141 -58.5t58 -140.5zM418 491q0 -62 43.5 -106t105.5 -44t106 44t44 106t-44 105.5t-106 43.5q-61 0 -105 -44
-t-44 -105zM1228 136q11 11 11 26t-11 26q-10 10 -25 10t-26 -10q-41 -42 -121 -62t-160 -20t-160 20t-121 62q-11 10 -26 10t-25 -10q-11 -10 -11 -25.5t11 -26.5q43 -43 118.5 -68t122.5 -29.5t91 -4.5t91 4.5t122.5 29.5t118.5 68zM1225 341q62 0 105.5 44t43.5 106
-q0 61 -44 105t-105 44q-62 0 -106 -43.5t-44 -105.5t44 -106t106 -44z" />
- <glyph glyph-name="_602" unicode="&#xf282;" horiz-adv-x="1792"
-d="M69 741h1q16 126 58.5 241.5t115 217t167.5 176t223.5 117.5t276.5 43q231 0 414 -105.5t294 -303.5q104 -187 104 -442v-188h-1125q1 -111 53.5 -192.5t136.5 -122.5t189.5 -57t213 -3t208 46.5t173.5 84.5v-377q-92 -55 -229.5 -92t-312.5 -38t-316 53
-q-189 73 -311.5 249t-124.5 372q-3 242 111 412t325 268q-48 -60 -78 -125.5t-46 -159.5h635q8 77 -8 140t-47 101.5t-70.5 66.5t-80.5 41t-75 20.5t-56 8.5l-22 1q-135 -5 -259.5 -44.5t-223.5 -104.5t-176 -140.5t-138 -163.5z" />
- <glyph glyph-name="_603" unicode="&#xf283;" horiz-adv-x="2304"
-d="M0 32v608h2304v-608q0 -66 -47 -113t-113 -47h-1984q-66 0 -113 47t-47 113zM640 256v-128h384v128h-384zM256 256v-128h256v128h-256zM2144 1408q66 0 113 -47t47 -113v-224h-2304v224q0 66 47 113t113 47h1984z" />
- <glyph glyph-name="_604" unicode="&#xf284;" horiz-adv-x="1792"
-d="M1584 246l-218 111q-74 -120 -196.5 -189t-263.5 -69q-147 0 -271 72t-196 196t-72 270q0 110 42.5 209.5t115 172t172 115t209.5 42.5q131 0 247.5 -60.5t192.5 -168.5l215 125q-110 169 -286.5 265t-378.5 96q-161 0 -308 -63t-253 -169t-169 -253t-63 -308t63 -308
-t169 -253t253 -169t308 -63q213 0 397.5 107t290.5 292zM1030 643l693 -352q-116 -253 -334.5 -400t-492.5 -147q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71q260 0 470.5 -133.5t335.5 -366.5zM1543 640h-39v-160h-96v352h136q32 0 54.5 -20
-t28.5 -48t1 -56t-27.5 -48t-57.5 -20z" />
- <glyph glyph-name="uniF285" unicode="&#xf285;" horiz-adv-x="1792"
-d="M1427 827l-614 386l92 151h855zM405 562l-184 116v858l1183 -743zM1424 697l147 -95v-858l-532 335zM1387 718l-500 -802h-855l356 571z" />
- <glyph glyph-name="uniF286" unicode="&#xf286;" horiz-adv-x="1792"
-d="M640 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1152 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1664 496v-752h-640v320q0 80 -56 136t-136 56t-136 -56t-56 -136v-320h-640v752q0 16 16 16h96
-q16 0 16 -16v-112h128v624q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 6 2.5 9.5t8.5 5t9.5 2t11.5 0t9 -0.5v391q-32 15 -32 50q0 23 16.5 39t38.5 16t38.5 -16t16.5 -39q0 -35 -32 -50v-17q45 10 83 10q21 0 59.5 -7.5t54.5 -7.5
-q17 0 47 7.5t37 7.5q16 0 16 -16v-210q0 -15 -35 -21.5t-62 -6.5q-18 0 -54.5 7.5t-55.5 7.5q-40 0 -90 -12v-133q1 0 9 0.5t11.5 0t9.5 -2t8.5 -5t2.5 -9.5v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-624h128v112q0 16 16 16h96
-q16 0 16 -16z" />
- <glyph glyph-name="_607" unicode="&#xf287;" horiz-adv-x="2304"
-d="M2288 731q16 -8 16 -27t-16 -27l-320 -192q-8 -5 -16 -5q-9 0 -16 4q-16 10 -16 28v128h-858q37 -58 83 -165q16 -37 24.5 -55t24 -49t27 -47t27 -34t31.5 -26t33 -8h96v96q0 14 9 23t23 9h320q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v96h-96
-q-32 0 -61 10t-51 23.5t-45 40.5t-37 46t-33.5 57t-28.5 57.5t-28 60.5q-23 53 -37 81.5t-36 65t-44.5 53.5t-46.5 17h-360q-22 -84 -91 -138t-157 -54q-106 0 -181 75t-75 181t75 181t181 75q88 0 157 -54t91 -138h104q24 0 46.5 17t44.5 53.5t36 65t37 81.5q19 41 28 60.5
-t28.5 57.5t33.5 57t37 46t45 40.5t51 23.5t61 10h107q21 57 70 92.5t111 35.5q80 0 136 -56t56 -136t-56 -136t-136 -56q-62 0 -111 35.5t-70 92.5h-107q-17 0 -33 -8t-31.5 -26t-27 -34t-27 -47t-24 -49t-24.5 -55q-46 -107 -83 -165h1114v128q0 18 16 28t32 -1z" />
- <glyph glyph-name="_608" unicode="&#xf288;" horiz-adv-x="1792"
-d="M1150 774q0 -56 -39.5 -95t-95.5 -39h-253v269h253q56 0 95.5 -39.5t39.5 -95.5zM1329 774q0 130 -91.5 222t-222.5 92h-433v-896h180v269h253q130 0 222 91.5t92 221.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348
-t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
- <glyph glyph-name="_609" unicode="&#xf289;" horiz-adv-x="2304"
-d="M1645 438q0 59 -34 106.5t-87 68.5q-7 -45 -23 -92q-7 -24 -27.5 -38t-44.5 -14q-12 0 -24 3q-31 10 -45 38.5t-4 58.5q23 71 23 143q0 123 -61 227.5t-166 165.5t-228 61q-134 0 -247 -73t-167 -194q108 -28 188 -106q22 -23 22 -55t-22 -54t-54 -22t-55 22
-q-75 75 -180 75q-106 0 -181 -74.5t-75 -180.5t75 -180.5t181 -74.5h1046q79 0 134.5 55.5t55.5 133.5zM1798 438q0 -142 -100.5 -242t-242.5 -100h-1046q-169 0 -289 119.5t-120 288.5q0 153 100 267t249 136q62 184 221 298t354 114q235 0 408.5 -158.5t196.5 -389.5
-q116 -25 192.5 -118.5t76.5 -214.5zM2048 438q0 -175 -97 -319q-23 -33 -64 -33q-24 0 -43 13q-26 17 -32 48.5t12 57.5q71 104 71 233t-71 233q-18 26 -12 57t32 49t57.5 11.5t49.5 -32.5q97 -142 97 -318zM2304 438q0 -244 -134 -443q-23 -34 -64 -34q-23 0 -42 13
-q-26 18 -32.5 49t11.5 57q108 164 108 358q0 195 -108 357q-18 26 -11.5 57.5t32.5 48.5q26 18 57 12t49 -33q134 -198 134 -442z" />
- <glyph glyph-name="_610" unicode="&#xf28a;"
-d="M1500 -13q0 -89 -63 -152.5t-153 -63.5t-153.5 63.5t-63.5 152.5q0 90 63.5 153.5t153.5 63.5t153 -63.5t63 -153.5zM1267 268q-115 -15 -192.5 -102.5t-77.5 -205.5q0 -74 33 -138q-146 -78 -379 -78q-109 0 -201 21t-153.5 54.5t-110.5 76.5t-76 85t-44.5 83
-t-23.5 66.5t-6 39.5q0 19 4.5 42.5t18.5 56t36.5 58t64 43.5t94.5 18t94 -17.5t63 -41t35.5 -53t17.5 -49t4 -33.5q0 -34 -23 -81q28 -27 82 -42t93 -17l40 -1q115 0 190 51t75 133q0 26 -9 48.5t-31.5 44.5t-49.5 41t-74 44t-93.5 47.5t-119.5 56.5q-28 13 -43 20
-q-116 55 -187 100t-122.5 102t-72 125.5t-20.5 162.5q0 78 20.5 150t66 137.5t112.5 114t166.5 77t221.5 28.5q120 0 220 -26t164.5 -67t109.5 -94t64 -105.5t19 -103.5q0 -46 -15 -82.5t-36.5 -58t-48.5 -36t-49 -19.5t-39 -5h-8h-32t-39 5t-44 14t-41 28t-37 46t-24 70.5
-t-10 97.5q-15 16 -59 25.5t-81 10.5l-37 1q-68 0 -117.5 -31t-70.5 -70t-21 -76q0 -24 5 -43t24 -46t53 -51t97 -53.5t150 -58.5q76 -25 138.5 -53.5t109 -55.5t83 -59t60.5 -59.5t41 -62.5t26.5 -62t14.5 -63.5t6 -62t1 -62.5z" />
- <glyph glyph-name="_611" unicode="&#xf28b;"
-d="M704 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1152 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103
-t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="_612" unicode="&#xf28c;"
-d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273
-t73 -273t198 -198t273 -73zM864 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192z" />
- <glyph glyph-name="_613" unicode="&#xf28d;"
-d="M1088 352v576q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
-t103 -385.5z" />
- <glyph glyph-name="_614" unicode="&#xf28e;"
-d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273
-t73 -273t198 -198t273 -73zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h576q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-576z" />
- <glyph glyph-name="_615" unicode="&#xf290;" horiz-adv-x="1792"
-d="M1757 128l35 -313q3 -28 -16 -50q-19 -21 -48 -21h-1664q-29 0 -48 21q-19 22 -16 50l35 313h1722zM1664 967l86 -775h-1708l86 775q3 24 21 40.5t43 16.5h256v-128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128h384v-128q0 -53 37.5 -90.5t90.5 -37.5
-t90.5 37.5t37.5 90.5v128h256q25 0 43 -16.5t21 -40.5zM1280 1152v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
- <glyph glyph-name="_616" unicode="&#xf291;" horiz-adv-x="2048"
-d="M1920 768q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-15l-115 -662q-8 -46 -44 -76t-82 -30h-1280q-46 0 -82 30t-44 76l-115 662h-15q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5h1792zM485 -32q26 2 43.5 22.5t15.5 46.5l-32 416q-2 26 -22.5 43.5
-t-46.5 15.5t-43.5 -22.5t-15.5 -46.5l32 -416q2 -25 20.5 -42t43.5 -17h5zM896 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1280 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1632 27l32 416
-q2 26 -15.5 46.5t-43.5 22.5t-46.5 -15.5t-22.5 -43.5l-32 -416q-2 -26 15.5 -46.5t43.5 -22.5h5q25 0 43.5 17t20.5 42zM476 1244l-93 -412h-132l101 441q19 88 89 143.5t160 55.5h167q0 26 19 45t45 19h384q26 0 45 -19t19 -45h167q90 0 160 -55.5t89 -143.5l101 -441
-h-132l-93 412q-11 44 -45.5 72t-79.5 28h-167q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45h-167q-45 0 -79.5 -28t-45.5 -72z" />
- <glyph glyph-name="_617" unicode="&#xf292;" horiz-adv-x="1792"
-d="M991 512l64 256h-254l-64 -256h254zM1759 1016l-56 -224q-7 -24 -31 -24h-327l-64 -256h311q15 0 25 -12q10 -14 6 -28l-56 -224q-5 -24 -31 -24h-327l-81 -328q-7 -24 -31 -24h-224q-16 0 -26 12q-9 12 -6 28l78 312h-254l-81 -328q-7 -24 -31 -24h-225q-15 0 -25 12
-q-9 12 -6 28l78 312h-311q-15 0 -25 12q-9 12 -6 28l56 224q7 24 31 24h327l64 256h-311q-15 0 -25 12q-10 14 -6 28l56 224q5 24 31 24h327l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h254l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h311
-q15 0 25 -12q9 -12 6 -28z" />
- <glyph glyph-name="_618" unicode="&#xf293;"
-d="M841 483l148 -148l-149 -149zM840 1094l149 -149l-148 -148zM710 -130l464 464l-306 306l306 306l-464 464v-611l-255 255l-93 -93l320 -321l-320 -321l93 -93l255 255v-611zM1429 640q0 -209 -32 -365.5t-87.5 -257t-140.5 -162.5t-181.5 -86.5t-219.5 -24.5
-t-219.5 24.5t-181.5 86.5t-140.5 162.5t-87.5 257t-32 365.5t32 365.5t87.5 257t140.5 162.5t181.5 86.5t219.5 24.5t219.5 -24.5t181.5 -86.5t140.5 -162.5t87.5 -257t32 -365.5z" />
- <glyph glyph-name="_619" unicode="&#xf294;" horiz-adv-x="1024"
-d="M596 113l173 172l-173 172v-344zM596 823l173 172l-173 172v-344zM628 640l356 -356l-539 -540v711l-297 -296l-108 108l372 373l-372 373l108 108l297 -296v711l539 -540z" />
- <glyph glyph-name="_620" unicode="&#xf295;"
-d="M1280 256q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM512 1024q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5
-t112.5 -271.5zM1440 1344q0 -20 -13 -38l-1056 -1408q-19 -26 -51 -26h-160q-26 0 -45 19t-19 45q0 20 13 38l1056 1408q19 26 51 26h160q26 0 45 -19t19 -45zM768 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5
-t271.5 -112.5t112.5 -271.5z" />
- <glyph glyph-name="_621" unicode="&#xf296;" horiz-adv-x="1792"
-d="M104 830l792 -1015l-868 630q-18 13 -25 34.5t0 42.5l101 308v0zM566 830h660l-330 -1015v0zM368 1442l198 -612h-462l198 612q8 23 33 23t33 -23zM1688 830l101 -308q7 -21 0 -42.5t-25 -34.5l-868 -630l792 1015v0zM1688 830h-462l198 612q8 23 33 23t33 -23z" />
- <glyph glyph-name="_622" unicode="&#xf297;" horiz-adv-x="1792"
-d="M384 704h160v224h-160v-224zM1221 372v92q-104 -36 -243 -38q-135 -1 -259.5 46.5t-220.5 122.5l1 -96q88 -80 212 -128.5t272 -47.5q129 0 238 49zM640 704h640v224h-640v-224zM1792 736q0 -187 -99 -352q89 -102 89 -229q0 -157 -129.5 -268t-313.5 -111
-q-122 0 -225 52.5t-161 140.5q-19 -1 -57 -1t-57 1q-58 -88 -161 -140.5t-225 -52.5q-184 0 -313.5 111t-129.5 268q0 127 89 229q-99 165 -99 352q0 209 120 385.5t326.5 279.5t449.5 103t449.5 -103t326.5 -279.5t120 -385.5z" />
- <glyph glyph-name="_623" unicode="&#xf298;"
-d="M515 625v-128h-252v128h252zM515 880v-127h-252v127h252zM1273 369v-128h-341v128h341zM1273 625v-128h-672v128h672zM1273 880v-127h-672v127h672zM1408 20v1240q0 8 -6 14t-14 6h-32l-378 -256l-210 171l-210 -171l-378 256h-32q-8 0 -14 -6t-6 -14v-1240q0 -8 6 -14
-t14 -6h1240q8 0 14 6t6 14zM553 1130l185 150h-406zM983 1130l221 150h-406zM1536 1260v-1240q0 -62 -43 -105t-105 -43h-1240q-62 0 -105 43t-43 105v1240q0 62 43 105t105 43h1240q62 0 105 -43t43 -105z" />
- <glyph glyph-name="_624" unicode="&#xf299;" horiz-adv-x="1792"
-d="M896 720q-104 196 -160 278q-139 202 -347 318q-34 19 -70 36q-89 40 -94 32t34 -38l39 -31q62 -43 112.5 -93.5t94.5 -116.5t70.5 -113t70.5 -131q9 -17 13 -25q44 -84 84 -153t98 -154t115.5 -150t131 -123.5t148.5 -90.5q153 -66 154 -60q1 3 -49 37q-53 36 -81 57
-q-77 58 -179 211t-185 310zM549 177q-76 60 -132.5 125t-98 143.5t-71 154.5t-58.5 186t-52 209t-60.5 252t-76.5 289q273 0 497.5 -36t379 -92t271 -144.5t185.5 -172.5t110 -198.5t56 -199.5t12.5 -198.5t-9.5 -173t-20 -143.5t-13 -107l323 -327h-104l-281 285
-q-22 -2 -91.5 -14t-121.5 -19t-138 -6t-160.5 17t-167.5 59t-179 111z" />
- <glyph glyph-name="_625" unicode="&#xf29a;" horiz-adv-x="1792"
-d="M1374 879q-6 26 -28.5 39.5t-48.5 7.5q-261 -62 -401 -62t-401 62q-26 6 -48.5 -7.5t-28.5 -39.5t7.5 -48.5t39.5 -28.5q194 -46 303 -58q-2 -158 -15.5 -269t-26.5 -155.5t-41 -115.5l-9 -21q-10 -25 1 -49t36 -34q9 -4 23 -4q44 0 60 41l8 20q54 139 71 259h42
-q17 -120 71 -259l8 -20q16 -41 60 -41q14 0 23 4q25 10 36 34t1 49l-9 21q-28 71 -41 115.5t-26.5 155.5t-15.5 269q109 12 303 58q26 6 39.5 28.5t7.5 48.5zM1024 1024q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z
-M1600 640q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5zM896 1408q-156 0 -298 -61t-245 -164t-164 -245t-61 -298t61 -298
-t164 -245t245 -164t298 -61t298 61t245 164t164 245t61 298t-61 298t-164 245t-245 164t-298 61zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
- <glyph glyph-name="_626" unicode="&#xf29b;"
-d="M1438 723q34 -35 29 -82l-44 -551q-4 -42 -34.5 -70t-71.5 -28q-6 0 -9 1q-44 3 -72.5 36.5t-25.5 77.5l35 429l-143 -8q55 -113 55 -240q0 -216 -148 -372l-137 137q91 101 91 235q0 145 -102.5 248t-247.5 103q-134 0 -236 -92l-137 138q120 114 284 141l264 300
-l-149 87l-181 -161q-33 -30 -77 -27.5t-73 35.5t-26.5 77t34.5 73l239 213q26 23 60 26.5t64 -14.5l488 -283q36 -21 48 -68q17 -67 -26 -117l-205 -232l371 20q49 3 83 -32zM1240 1180q-74 0 -126 52t-52 126t52 126t126 52t126.5 -52t52.5 -126t-52.5 -126t-126.5 -52z
-M613 -62q106 0 196 61l139 -139q-146 -116 -335 -116q-148 0 -273.5 73t-198.5 198t-73 273q0 188 116 336l139 -139q-60 -88 -60 -197q0 -145 102.5 -247.5t247.5 -102.5z" />
- <glyph glyph-name="_627" unicode="&#xf29c;"
-d="M880 336v-160q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h160q14 0 23 -9t9 -23zM1136 832q0 -50 -15 -90t-45.5 -69t-52 -44t-59.5 -36q-32 -18 -46.5 -28t-26 -24t-11.5 -29v-32q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v68q0 35 10.5 64.5
-t24 47.5t39 35.5t41 25.5t44.5 21q53 25 75 43t22 49q0 42 -43.5 71.5t-95.5 29.5q-56 0 -95 -27q-29 -20 -80 -83q-9 -12 -25 -12q-11 0 -19 6l-108 82q-10 7 -12 20t5 23q122 192 349 192q129 0 238.5 -89.5t109.5 -214.5zM768 1280q-130 0 -248.5 -51t-204 -136.5
-t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5
-t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="_628" unicode="&#xf29d;" horiz-adv-x="1408"
-d="M366 1225q-64 0 -110 45.5t-46 110.5q0 64 46 109.5t110 45.5t109.5 -45.5t45.5 -109.5q0 -65 -45.5 -110.5t-109.5 -45.5zM917 583q0 -50 -30 -67.5t-63.5 -6.5t-47.5 34l-367 438q-7 12 -14 15.5t-11 1.5l-3 -3q-7 -8 4 -21l122 -139l1 -354l-161 -457
-q-67 -192 -92 -234q-15 -26 -28 -32q-50 -26 -103 -1q-29 13 -41.5 43t-9.5 57q2 17 197 618l5 416l-85 -164l35 -222q4 -24 -1 -42t-14 -27.5t-19 -16t-17 -7.5l-7 -2q-19 -3 -34.5 3t-24 16t-14 22t-7.5 19.5t-2 9.5l-46 299l211 381q23 34 113 34q75 0 107 -40l424 -521
-q7 -5 14 -17l3 -3l-1 -1q7 -13 7 -29zM514 433q43 -113 88.5 -225t69.5 -168l24 -55q36 -93 42 -125q11 -70 -36 -97q-35 -22 -66 -16t-51 22t-29 35h-1q-6 16 -8 25l-124 351zM1338 -159q31 -49 31 -57q0 -5 -3 -7q-9 -5 -14.5 0.5t-15.5 26t-16 30.5q-114 172 -423 661
-q3 -1 7 1t7 4l3 2q11 9 11 17z" />
- <glyph glyph-name="_629" unicode="&#xf29e;" horiz-adv-x="2304"
-d="M504 542h171l-1 265zM1530 641q0 87 -50.5 140t-146.5 53h-54v-388h52q91 0 145 57t54 138zM956 1018l1 -756q0 -14 -9.5 -24t-23.5 -10h-216q-14 0 -23.5 10t-9.5 24v62h-291l-55 -81q-10 -15 -28 -15h-267q-21 0 -30.5 18t3.5 35l556 757q9 14 27 14h332q14 0 24 -10
-t10 -24zM1783 641q0 -193 -125.5 -303t-324.5 -110h-270q-14 0 -24 10t-10 24v756q0 14 10 24t24 10h268q200 0 326 -109t126 -302zM1939 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5
-t-7.5 60t-20 91.5t-41 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2123 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-45 -108t-74 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5
-h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2304 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66 104.5t41 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96
-t9.5 -70.5z" />
- <glyph glyph-name="uniF2A0" unicode="&#xf2a0;" horiz-adv-x="1408"
-d="M617 -153q0 11 -13 58t-31 107t-20 69q-1 4 -5 26.5t-8.5 36t-13.5 21.5q-15 14 -51 14q-23 0 -70 -5.5t-71 -5.5q-34 0 -47 11q-6 5 -11 15.5t-7.5 20t-6.5 24t-5 18.5q-37 128 -37 255t37 255q1 4 5 18.5t6.5 24t7.5 20t11 15.5q13 11 47 11q24 0 71 -5.5t70 -5.5
-q36 0 51 14q9 8 13.5 21.5t8.5 36t5 26.5q2 9 20 69t31 107t13 58q0 22 -43.5 52.5t-75.5 42.5q-20 8 -45 8q-34 0 -98 -18q-57 -17 -96.5 -40.5t-71 -66t-46 -70t-45.5 -94.5q-6 -12 -9 -19q-49 -107 -68 -216t-19 -244t19 -244t68 -216q56 -122 83 -161q63 -91 179 -127
-l6 -2q64 -18 98 -18q25 0 45 8q32 12 75.5 42.5t43.5 52.5zM776 760q-26 0 -45 19t-19 45.5t19 45.5q37 37 37 90q0 52 -37 91q-19 19 -19 45t19 45t45 19t45 -19q75 -75 75 -181t-75 -181q-21 -19 -45 -19zM957 579q-27 0 -45 19q-19 19 -19 45t19 45q112 114 112 272
-t-112 272q-19 19 -19 45t19 45t45 19t45 -19q150 -150 150 -362t-150 -362q-18 -19 -45 -19zM1138 398q-27 0 -45 19q-19 19 -19 45t19 45q90 91 138.5 208t48.5 245t-48.5 245t-138.5 208q-19 19 -19 45t19 45t45 19t45 -19q109 -109 167 -249t58 -294t-58 -294t-167 -249
-q-18 -19 -45 -19z" />
- <glyph glyph-name="uniF2A1" unicode="&#xf2a1;" horiz-adv-x="2176"
-d="M192 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 352
-q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 864
-q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 1376q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 192q0 -80 -56 -136
-t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 1216q0 -80 -56 -136t-136 -56
-t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 192q0 -80 -56 -136t-136 -56t-136 56
-t-56 136t56 136t136 56t136 -56t56 -136zM1664 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136
-t56 136t136 56t136 -56t56 -136zM2176 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z" />
- <glyph glyph-name="uniF2A2" unicode="&#xf2a2;" horiz-adv-x="1792"
-d="M128 -192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM320 0q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM365 365l256 -256l-90 -90l-256 256zM704 384q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45z
-M1411 704q0 -59 -11.5 -108.5t-37.5 -93.5t-44 -67.5t-53 -64.5q-31 -35 -45.5 -54t-33.5 -50t-26.5 -64t-7.5 -74q0 -159 -112.5 -271.5t-271.5 -112.5q-26 0 -45 19t-19 45t19 45t45 19q106 0 181 75t75 181q0 57 11.5 105.5t37 91t43.5 66.5t52 63q40 46 59.5 72
-t37.5 74.5t18 103.5q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM896 576q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45
-t45 19t45 -19t19 -45zM1184 704q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 93 -65.5 158.5t-158.5 65.5q-92 0 -158 -65.5t-66 -158.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 146 103 249t249 103t249 -103t103 -249zM1578 993q10 -25 -1 -49t-36 -34q-9 -4 -23 -4
-q-19 0 -35.5 11t-23.5 30q-68 178 -224 295q-21 16 -25 42t12 47q17 21 43 25t47 -12q183 -137 266 -351zM1788 1074q9 -25 -1.5 -49t-35.5 -34q-11 -4 -23 -4q-44 0 -60 41q-92 238 -297 393q-22 16 -25.5 42t12.5 47q16 22 42 25.5t47 -12.5q235 -175 341 -449z" />
- <glyph glyph-name="uniF2A3" unicode="&#xf2a3;" horiz-adv-x="2304"
-d="M1032 576q-59 2 -84 55q-17 34 -48 53.5t-68 19.5q-53 0 -90.5 -37.5t-37.5 -90.5q0 -56 36 -89l10 -8q34 -31 82 -31q37 0 68 19.5t48 53.5q25 53 84 55zM1600 704q0 56 -36 89l-10 8q-34 31 -82 31q-37 0 -68 -19.5t-48 -53.5q-25 -53 -84 -55q59 -2 84 -55
-q17 -34 48 -53.5t68 -19.5q53 0 90.5 37.5t37.5 90.5zM1174 925q-17 -35 -55 -48t-73 4q-62 31 -134 31q-51 0 -99 -17q3 0 9.5 0.5t9.5 0.5q92 0 170.5 -50t118.5 -133q17 -36 3.5 -73.5t-49.5 -54.5q-18 -9 -39 -9q21 0 39 -9q36 -17 49.5 -54.5t-3.5 -73.5
-q-40 -83 -118.5 -133t-170.5 -50h-6q-16 2 -44 4l-290 27l-239 -120q-14 -7 -29 -7q-40 0 -57 35l-160 320q-11 23 -4 47.5t29 37.5l209 119l148 267q17 155 91.5 291.5t195.5 236.5q31 25 70.5 21.5t64.5 -34.5t21.5 -70t-34.5 -65q-70 -59 -117 -128q123 84 267 101
-q40 5 71.5 -19t35.5 -64q5 -40 -19 -71.5t-64 -35.5q-84 -10 -159 -55q46 10 99 10q115 0 218 -50q36 -18 49 -55.5t-5 -73.5zM2137 1085l160 -320q11 -23 4 -47.5t-29 -37.5l-209 -119l-148 -267q-17 -155 -91.5 -291.5t-195.5 -236.5q-26 -22 -61 -22q-45 0 -74 35
-q-25 31 -21.5 70t34.5 65q70 59 117 128q-123 -84 -267 -101q-4 -1 -12 -1q-36 0 -63.5 24t-31.5 60q-5 40 19 71.5t64 35.5q84 10 159 55q-46 -10 -99 -10q-115 0 -218 50q-36 18 -49 55.5t5 73.5q17 35 55 48t73 -4q62 -31 134 -31q51 0 99 17q-3 0 -9.5 -0.5t-9.5 -0.5
-q-92 0 -170.5 50t-118.5 133q-17 36 -3.5 73.5t49.5 54.5q18 9 39 9q-21 0 -39 9q-36 17 -49.5 54.5t3.5 73.5q40 83 118.5 133t170.5 50h6h1q14 -2 42 -4l291 -27l239 120q14 7 29 7q40 0 57 -35z" />
- <glyph glyph-name="uniF2A4" unicode="&#xf2a4;" horiz-adv-x="1792"
-d="M1056 704q0 -26 19 -45t45 -19t45 19t19 45q0 146 -103 249t-249 103t-249 -103t-103 -249q0 -26 19 -45t45 -19t45 19t19 45q0 93 66 158.5t158 65.5t158 -65.5t66 -158.5zM835 1280q-117 0 -223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5q0 -26 19 -45t45 -19t45 19
-t19 45q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -55 -18 -103.5t-37.5 -74.5t-59.5 -72q-34 -39 -52 -63t-43.5 -66.5t-37 -91t-11.5 -105.5q0 -106 -75 -181t-181 -75q-26 0 -45 -19t-19 -45t19 -45t45 -19q159 0 271.5 112.5t112.5 271.5q0 41 7.5 74
-t26.5 64t33.5 50t45.5 54q35 41 53 64.5t44 67.5t37.5 93.5t11.5 108.5q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5zM591 561l226 -226l-579 -579q-12 -12 -29 -12t-29 12l-168 168q-12 12 -12 29t12 29zM1612 1524l168 -168q12 -12 12 -29t-12 -30l-233 -233
-l-26 -25l-71 -71q-66 153 -195 258l91 91l207 207q13 12 30 12t29 -12z" />
- <glyph glyph-name="uniF2A5" unicode="&#xf2a5;"
-d="M866 1021q0 -27 -13 -94q-11 -50 -31.5 -150t-30.5 -150q-2 -11 -4.5 -12.5t-13.5 -2.5q-20 -2 -31 -2q-58 0 -84 49.5t-26 113.5q0 88 35 174t103 124q28 14 51 14q28 0 36.5 -16.5t8.5 -47.5zM1352 597q0 14 -39 75.5t-52 66.5q-21 8 -34 8q-91 0 -226 -77l-2 2
-q3 22 27.5 135t24.5 178q0 233 -242 233q-24 0 -68 -6q-94 -17 -168.5 -89.5t-111.5 -166.5t-37 -189q0 -146 80.5 -225t227.5 -79q25 0 25 -3t-1 -5q-4 -34 -26 -117q-14 -52 -51.5 -101t-82.5 -49q-42 0 -42 47q0 24 10.5 47.5t25 39.5t29.5 28.5t26 20t11 8.5q0 3 -7 10
-q-24 22 -58.5 36.5t-65.5 14.5q-35 0 -63.5 -34t-41 -75t-12.5 -75q0 -88 51.5 -142t138.5 -54q82 0 155 53t117.5 126t65.5 153q6 22 15.5 66.5t14.5 66.5q3 12 14 18q118 60 227 60q48 0 127 -18q1 -1 4 -1q5 0 9.5 4.5t4.5 8.5zM1536 1120v-960q0 -119 -84.5 -203.5
-t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="uniF2A6" unicode="&#xf2a6;" horiz-adv-x="1535"
-d="M744 1231q0 24 -2 38.5t-8.5 30t-21 23t-37.5 7.5q-39 0 -78 -23q-105 -58 -159 -190.5t-54 -269.5q0 -44 8.5 -85.5t26.5 -80.5t52.5 -62.5t81.5 -23.5q4 0 18 -0.5t20 0t16 3t15 8.5t7 16q16 77 48 231.5t48 231.5q19 91 19 146zM1498 575q0 -7 -7.5 -13.5t-15.5 -6.5
-l-6 1q-22 3 -62 11t-72 12.5t-63 4.5q-167 0 -351 -93q-15 -8 -21 -27q-10 -36 -24.5 -105.5t-22.5 -100.5q-23 -91 -70 -179.5t-112.5 -164.5t-154.5 -123t-185 -47q-135 0 -214.5 83.5t-79.5 219.5q0 53 19.5 117t63 116.5t97.5 52.5q38 0 120 -33.5t83 -61.5
-q0 -1 -16.5 -12.5t-39.5 -31t-46 -44.5t-39 -61t-16 -74q0 -33 16.5 -53t48.5 -20q45 0 85 31.5t66.5 78t48 105.5t32.5 107t16 90v9q0 2 -3.5 3.5t-8.5 1.5h-10t-10 -0.5t-6 -0.5q-227 0 -352 122.5t-125 348.5q0 108 34.5 221t96 210t156 167.5t204.5 89.5q52 9 106 9
-q374 0 374 -360q0 -98 -38 -273t-43 -211l3 -3q101 57 182.5 88t167.5 31q22 0 53 -13q19 -7 80 -102.5t61 -116.5z" />
- <glyph glyph-name="uniF2A7" unicode="&#xf2a7;" horiz-adv-x="1664"
-d="M831 863q32 0 59 -18l222 -148q61 -40 110 -97l146 -170q40 -46 29 -106l-72 -413q-6 -32 -29.5 -53.5t-55.5 -25.5l-527 -56l-352 -32h-9q-39 0 -67.5 28t-28.5 68q0 37 27 64t65 32l260 32h-448q-41 0 -69.5 30t-26.5 71q2 39 32 65t69 26l442 1l-521 64q-41 5 -66 37
-t-19 73q6 35 34.5 57.5t65.5 22.5h10l481 -60l-351 94q-38 10 -62 41.5t-18 68.5q6 36 33 58.5t62 22.5q6 0 20 -2l448 -96l217 -37q1 0 3 -0.5t3 -0.5q23 0 30.5 23t-12.5 36l-186 125q-35 23 -42 63.5t18 73.5q27 38 76 38zM761 661l186 -125l-218 37l-5 2l-36 38
-l-238 262q-1 1 -2.5 3.5t-2.5 3.5q-24 31 -18.5 70t37.5 64q31 23 68 17.5t64 -33.5l142 -147q-2 -1 -5 -3.5t-4 -4.5q-32 -45 -23 -99t55 -85zM1648 1115l15 -266q4 -73 -11 -147l-48 -219q-12 -59 -67 -87l-106 -54q2 62 -39 109l-146 170q-53 61 -117 103l-222 148
-q-34 23 -76 23q-51 0 -88 -37l-235 312q-25 33 -18 73.5t41 63.5q33 22 71.5 14t62.5 -40l266 -352l-262 455q-21 35 -10.5 75t47.5 59q35 18 72.5 6t57.5 -46l241 -420l-136 337q-15 35 -4.5 74t44.5 56q37 19 76 6t56 -51l193 -415l101 -196q8 -15 23 -17.5t27 7.5t11 26
-l-12 224q-2 41 26 71t69 31q39 0 67 -28.5t30 -67.5z" />
- <glyph glyph-name="uniF2A8" unicode="&#xf2a8;" horiz-adv-x="1792"
-d="M335 180q-2 0 -6 2q-86 57 -168.5 145t-139.5 180q-21 30 -21 69q0 9 2 19t4 18t7 18t8.5 16t10.5 17t10 15t12 15.5t11 14.5q184 251 452 365q-110 198 -110 211q0 19 17 29q116 64 128 64q18 0 28 -16l124 -229q92 19 192 19q266 0 497.5 -137.5t378.5 -369.5
-q20 -31 20 -69t-20 -69q-91 -142 -218.5 -253.5t-278.5 -175.5q110 -198 110 -211q0 -20 -17 -29q-116 -64 -127 -64q-19 0 -29 16l-124 229l-64 119l-444 820l7 7q-58 -24 -99 -47q3 -5 127 -234t243 -449t119 -223q0 -7 -9 -9q-13 -3 -72 -3q-57 0 -60 7l-456 841
-q-39 -28 -82 -68q24 -43 214 -393.5t190 -354.5q0 -10 -11 -10q-14 0 -82.5 22t-72.5 28l-106 197l-224 413q-44 -53 -78 -106q2 -3 18 -25t23 -34l176 -327q0 -10 -10 -10zM1165 282l49 -91q273 111 450 385q-180 277 -459 389q67 -64 103 -148.5t36 -176.5
-q0 -106 -47 -200.5t-132 -157.5zM848 896q0 -20 14 -34t34 -14q86 0 147 -61t61 -147q0 -20 14 -34t34 -14t34 14t14 34q0 126 -89 215t-215 89q-20 0 -34 -14t-14 -34zM1214 961l-9 4l7 -7z" />
- <glyph glyph-name="uniF2A9" unicode="&#xf2a9;" horiz-adv-x="1280"
-d="M1050 430q0 -215 -147 -374q-148 -161 -378 -161q-232 0 -378 161q-147 159 -147 374q0 147 68 270.5t189 196.5t268 73q96 0 182 -31q-32 -62 -39 -126q-66 28 -143 28q-167 0 -280.5 -123t-113.5 -291q0 -170 112.5 -288.5t281.5 -118.5t281 118.5t112 288.5
-q0 89 -32 166q66 13 123 49q41 -98 41 -212zM846 619q0 -192 -79.5 -345t-238.5 -253l-14 -1q-29 0 -62 5q83 32 146.5 102.5t99.5 154.5t58.5 189t30 192.5t7.5 178.5q0 69 -3 103q55 -160 55 -326zM791 947v-2q-73 214 -206 440q88 -59 142.5 -186.5t63.5 -251.5z
-M1035 744q-83 0 -160 75q218 120 290 247q19 37 21 56q-42 -94 -139.5 -166.5t-204.5 -97.5q-35 54 -35 113q0 37 17 79t43 68q46 44 157 74q59 16 106 58.5t74 100.5q74 -105 74 -253q0 -109 -24 -170q-32 -77 -88.5 -130.5t-130.5 -53.5z" />
- <glyph glyph-name="uniF2AA" unicode="&#xf2aa;"
-d="M1050 495q0 78 -28 147q-41 -25 -85 -34q22 -50 22 -114q0 -117 -77 -198.5t-193 -81.5t-193.5 81.5t-77.5 198.5q0 115 78 199.5t193 84.5q53 0 98 -19q4 43 27 87q-60 21 -125 21q-154 0 -257.5 -108.5t-103.5 -263.5t103.5 -261t257.5 -106t257.5 106.5t103.5 260.5z
-M872 850q2 -24 2 -71q0 -63 -5 -123t-20.5 -132.5t-40.5 -130t-68.5 -106t-100.5 -70.5q21 -3 42 -3h10q219 139 219 411q0 116 -38 225zM872 850q-4 80 -44 171.5t-98 130.5q92 -156 142 -302zM1207 955q0 102 -51 174q-41 -86 -124 -109q-69 -19 -109 -53.5t-40 -99.5
-q0 -40 24 -77q74 17 140.5 67t95.5 115q-4 -52 -74.5 -111.5t-138.5 -97.5q52 -52 110 -52q51 0 90 37t60 90q17 42 17 117zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
-t84.5 -203.5z" />
- <glyph glyph-name="uniF2AB" unicode="&#xf2ab;"
-d="M1279 388q0 22 -22 27q-67 15 -118 59t-80 108q-7 19 -7 25q0 15 19.5 26t43 17t43 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-12 0 -32 -8t-31 -8q-4 0 -12 2q5 95 5 114q0 79 -17 114q-36 78 -103 121.5t-152 43.5q-199 0 -275 -165q-17 -35 -17 -114q0 -19 5 -114
-q-4 -2 -14 -2q-12 0 -32 7.5t-30 7.5q-21 0 -38.5 -12t-17.5 -32q0 -21 19.5 -35.5t43 -20.5t43 -17t19.5 -26q0 -6 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -46 137 -68q2 -5 6 -26t11.5 -30.5t23.5 -9.5q12 0 37.5 4.5t39.5 4.5q35 0 67 -15t54 -32.5t57.5 -32.5
-t76.5 -15q43 0 79 15t57.5 32.5t53.5 32.5t67 15q14 0 39.5 -4t38.5 -4q16 0 23 10t11 30t6 25q137 22 137 68zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
-t103 -385.5z" />
- <glyph glyph-name="uniF2AC" unicode="&#xf2ac;" horiz-adv-x="1664"
-d="M848 1408q134 1 240.5 -68.5t163.5 -192.5q27 -58 27 -179q0 -47 -9 -191q14 -7 28 -7q18 0 51 13.5t51 13.5q29 0 56 -18t27 -46q0 -32 -31.5 -54t-69 -31.5t-69 -29t-31.5 -47.5q0 -15 12 -43q37 -82 102.5 -150t144.5 -101q28 -12 80 -23q28 -6 28 -35
-q0 -70 -219 -103q-7 -11 -11 -39t-14 -46.5t-33 -18.5q-20 0 -62 6.5t-64 6.5q-37 0 -62 -5q-32 -5 -63 -22.5t-58 -38t-58 -40.5t-76 -33.5t-99 -13.5q-52 0 -96.5 13.5t-75 33.5t-57.5 40.5t-58 38t-62 22.5q-26 5 -63 5q-24 0 -65.5 -7.5t-58.5 -7.5q-25 0 -35 18.5
-t-14 47.5t-11 40q-219 33 -219 103q0 29 28 35q52 11 80 23q78 32 144.5 101t102.5 150q12 28 12 43q0 28 -31.5 47.5t-69.5 29.5t-69.5 31.5t-31.5 52.5q0 27 26 45.5t55 18.5q15 0 48 -13t53 -13q18 0 32 7q-9 142 -9 190q0 122 27 180q64 137 172 198t264 63z" />
- <glyph glyph-name="uniF2AD" unicode="&#xf2ad;"
-d="M1280 388q0 22 -22 27q-67 14 -118 58t-80 109q-7 14 -7 25q0 15 19.5 26t42.5 17t42.5 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-11 0 -31 -8t-32 -8q-4 0 -12 2q5 63 5 115q0 78 -17 114q-36 78 -102.5 121.5t-152.5 43.5q-198 0 -275 -165q-18 -38 -18 -115
-q0 -38 6 -114q-10 -2 -15 -2q-11 0 -31.5 8t-30.5 8q-20 0 -37.5 -12.5t-17.5 -32.5q0 -21 19.5 -35.5t42.5 -20.5t42.5 -17t19.5 -26q0 -11 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -47 138 -69q2 -5 6 -26t11 -30.5t23 -9.5q13 0 38.5 5t38.5 5q35 0 67.5 -15
-t54.5 -32.5t57.5 -32.5t76.5 -15q43 0 79 15t57.5 32.5t54 32.5t67.5 15q13 0 39 -4.5t39 -4.5q15 0 22.5 9.5t11.5 31t5 24.5q138 22 138 69zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960
-q119 0 203.5 -84.5t84.5 -203.5z" />
- <glyph glyph-name="uniF2AE" unicode="&#xf2ae;" horiz-adv-x="2304"
-d="M2304 1536q-69 -46 -125 -92t-89 -81t-59.5 -71.5t-37.5 -57.5t-22 -44.5t-14 -29.5q-10 -18 -35.5 -136.5t-48.5 -164.5q-15 -29 -50 -60.5t-67.5 -50.5t-72.5 -41t-48 -28q-47 -31 -151 -231q-341 14 -630 -158q-92 -53 -303 -179q47 16 86 31t55 22l15 7
-q71 27 163 64.5t133.5 53.5t108 34.5t142.5 31.5q186 31 465 -7q1 0 10 -3q11 -6 14 -17t-3 -22l-194 -345q-15 -29 -47 -22q-128 24 -354 24q-146 0 -402 -44.5t-392 -46.5q-82 -1 -149 13t-107 37t-61 40t-33 34l-1 1v2q0 6 6 6q138 0 371 55q192 366 374.5 524t383.5 158
-q5 0 14.5 -0.5t38 -5t55 -12t61.5 -24.5t63 -39.5t54 -59t40 -82.5l102 177q2 4 21 42.5t44.5 86.5t61 109.5t84 133.5t100.5 137q66 82 128 141.5t121.5 96.5t92.5 53.5t88 39.5z" />
- <glyph glyph-name="uniF2B0" unicode="&#xf2b0;"
-d="M1322 640q0 -45 -5 -76l-236 14l224 -78q-19 -73 -58 -141l-214 103l177 -158q-44 -61 -107 -108l-157 178l103 -215q-61 -37 -140 -59l-79 228l14 -240q-38 -6 -76 -6t-76 6l14 238l-78 -226q-74 19 -140 59l103 215l-157 -178q-59 43 -108 108l178 158l-214 -104
-q-39 69 -58 141l224 79l-237 -14q-5 42 -5 76q0 35 5 77l238 -14l-225 79q19 73 58 140l214 -104l-177 159q46 61 107 108l158 -178l-103 215q67 39 140 58l77 -224l-13 236q36 6 75 6q38 0 76 -6l-14 -237l78 225q74 -19 140 -59l-103 -214l158 178q61 -47 107 -108
-l-177 -159l213 104q37 -62 58 -141l-224 -78l237 14q5 -31 5 -77zM1352 640q0 160 -78.5 295.5t-213 214t-292.5 78.5q-119 0 -227 -46.5t-186.5 -125t-124.5 -187.5t-46 -229q0 -119 46 -228t124.5 -187.5t186.5 -125t227 -46.5q158 0 292.5 78.5t213 214t78.5 294.5z
-M1425 1023v-766l-657 -383l-657 383v766l657 383zM768 -183l708 412v823l-708 411l-708 -411v-823zM1536 1088v-896l-768 -448l-768 448v896l768 448z" />
- <glyph glyph-name="uniF2B1" unicode="&#xf2b1;" horiz-adv-x="1664"
-d="M339 1318h691l-26 -72h-665q-110 0 -188.5 -79t-78.5 -189v-771q0 -95 60.5 -169.5t153.5 -93.5q23 -5 98 -5v-72h-45q-140 0 -239.5 100t-99.5 240v771q0 140 99.5 240t239.5 100zM1190 1536h247l-482 -1294q-23 -61 -40.5 -103.5t-45 -98t-54 -93.5t-64.5 -78.5
-t-79.5 -65t-95.5 -41t-116 -18.5v195q163 26 220 182q20 52 20 105q0 54 -20 106l-285 733h228l187 -585zM1664 978v-1111h-795q37 55 45 73h678v1038q0 85 -49.5 155t-129.5 99l25 67q101 -34 163.5 -123.5t62.5 -197.5z" />
- <glyph glyph-name="uniF2B2" unicode="&#xf2b2;" horiz-adv-x="1792"
-d="M852 1227q0 -29 -17 -52.5t-45 -23.5t-45 23.5t-17 52.5t17 52.5t45 23.5t45 -23.5t17 -52.5zM688 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50 -21.5t-20 -51.5v-114q0 -30 20.5 -52t49.5 -22q30 0 50.5 22t20.5 52zM860 -149v114q0 30 -20 51.5t-50 21.5t-50.5 -21.5
-t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22q29 0 49.5 22t20.5 52zM1034 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1208 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114
-q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1476 535q-84 -160 -232 -259.5t-323 -99.5q-123 0 -229.5 51.5t-178.5 137t-113 197.5t-41 232q0 88 21 174q-104 -175 -104 -390q0 -162 65 -312t185 -251q30 57 91 57q56 0 86 -50q32 50 87 50q56 0 86 -50q32 50 87 50t87 -50
-q30 50 86 50q28 0 52.5 -15.5t37.5 -40.5q112 94 177 231.5t73 287.5zM1326 564q0 75 -72 75q-17 0 -47 -6q-95 -19 -149 -19q-226 0 -226 243q0 86 30 204q-83 -127 -83 -275q0 -150 89 -260.5t235 -110.5q111 0 210 70q13 48 13 79zM884 1223q0 50 -32 89.5t-81 39.5
-t-81 -39.5t-32 -89.5q0 -51 31.5 -90.5t81.5 -39.5t81.5 39.5t31.5 90.5zM1513 884q0 96 -37.5 179t-113 137t-173.5 54q-77 0 -149 -35t-127 -94q-48 -159 -48 -268q0 -104 45.5 -157t147.5 -53q53 0 142 19q36 6 53 6q51 0 77.5 -28t26.5 -80q0 -26 -4 -46
-q75 68 117.5 165.5t42.5 200.5zM1792 667q0 -111 -33.5 -249.5t-93.5 -204.5q-58 -64 -195 -142.5t-228 -104.5l-4 -1v-114q0 -43 -29.5 -75t-72.5 -32q-56 0 -86 50q-32 -50 -87 -50t-87 50q-30 -50 -86 -50q-55 0 -87 50q-30 -50 -86 -50q-47 0 -75 33.5t-28 81.5
-q-90 -68 -198 -68q-118 0 -211 80q54 1 106 20q-113 31 -182 127q32 -7 71 -7q89 0 164 46q-192 192 -240 306q-24 56 -24 160q0 57 9 125.5t31.5 146.5t55 141t86.5 105t120 42q59 0 81 -52q19 29 42 54q2 3 12 13t13 16q10 15 23 38t25 42t28 39q87 111 211.5 177
-t260.5 66q35 0 62 -4q59 64 146 64q83 0 140 -57q5 -5 5 -12q0 -5 -6 -13.5t-12.5 -16t-16 -17l-10.5 -10.5q17 -6 36 -18t19 -24q0 -6 -16 -25q157 -138 197 -378q25 30 60 30q45 0 100 -49q90 -80 90 -279z" />
- <glyph glyph-name="uniF2B3" unicode="&#xf2b3;"
-d="M917 631q0 33 -6 64h-362v-132h217q-12 -76 -74.5 -120.5t-142.5 -44.5q-99 0 -169 71.5t-70 170.5t70 170.5t169 71.5q93 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585h109v110
-h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
- <glyph glyph-name="uniF2B4" unicode="&#xf2b4;"
-d="M1536 1024v-839q0 -48 -49 -62q-174 -52 -338 -52q-73 0 -215.5 29.5t-227.5 29.5q-164 0 -370 -48v-338h-160v1368q-63 25 -101 81t-38 124q0 91 64 155t155 64t155 -64t64 -155q0 -68 -38 -124t-101 -81v-68q190 44 343 44q99 0 198 -15q14 -2 111.5 -22.5t149.5 -20.5
-q77 0 165 18q11 2 80 21t89 19q26 0 45 -19t19 -45z" />
- <glyph glyph-name="uniF2B5" unicode="&#xf2b5;" horiz-adv-x="2304"
-d="M192 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32zM1665 442q-10 13 -38.5 50t-41.5 54t-38 49t-42.5 53t-40.5 47t-45 49l-125 -140q-83 -94 -208.5 -92t-205.5 98q-57 69 -56.5 158t58.5 157l177 206q-22 11 -51 16.5t-47.5 6t-56.5 -0.5t-49 -1q-92 0 -158 -66
-l-158 -158h-155v-544q5 0 21 0.5t22 0t19.5 -2t20.5 -4.5t17.5 -8.5t18.5 -13.5l297 -292q115 -111 227 -111q78 0 125 47q57 -20 112.5 8t72.5 85q74 -6 127 44q20 18 36 45.5t14 50.5q10 -10 43 -10q43 0 77 21t49.5 53t12 71.5t-30.5 73.5zM1824 384h96v512h-93l-157 180
-q-66 76 -169 76h-167q-89 0 -146 -67l-209 -243q-28 -33 -28 -75t27 -75q43 -51 110 -52t111 49l193 218q25 23 53.5 21.5t47 -27t8.5 -56.5q16 -19 56 -63t60 -68q29 -36 82.5 -105.5t64.5 -84.5q52 -66 60 -140zM2112 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32z
-M2304 960v-640q0 -26 -19 -45t-45 -19h-434q-27 -65 -82 -106.5t-125 -51.5q-33 -48 -80.5 -81.5t-102.5 -45.5q-42 -53 -104.5 -81.5t-128.5 -24.5q-60 -34 -126 -39.5t-127.5 14t-117 53.5t-103.5 81l-287 282h-358q-26 0 -45 19t-19 45v672q0 26 19 45t45 19h421
-q14 14 47 48t47.5 48t44 40t50.5 37.5t51 25.5t62 19.5t68 5.5h117q99 0 181 -56q82 56 181 56h167q35 0 67 -6t56.5 -14.5t51.5 -26.5t44.5 -31t43 -39.5t39 -42t41 -48t41.5 -48.5h355q26 0 45 -19t19 -45z" />
- <glyph glyph-name="uniF2B6" unicode="&#xf2b6;" horiz-adv-x="1792"
-d="M1792 882v-978q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v978q0 15 11 24q8 7 39 34.5t41.5 36t45.5 37.5t70 55.5t96 73t143.5 107t192.5 140.5q5 4 52.5 40t71.5 52.5t64 35t69 18.5t69 -18.5t65 -35.5t71 -52t52 -40q110 -80 192.5 -140.5t143.5 -107
-t96 -73t70 -55.5t45.5 -37.5t41.5 -36t39 -34.5q11 -9 11 -24zM1228 297q263 191 345 252q11 8 12.5 20.5t-6.5 23.5l-38 52q-8 11 -21 12.5t-24 -6.5q-231 -169 -343 -250q-5 -3 -52 -39t-71.5 -52.5t-64.5 -35t-69 -18.5t-69 18.5t-64.5 35t-71.5 52.5t-52 39
-q-186 134 -343 250q-11 8 -24 6.5t-21 -12.5l-38 -52q-8 -11 -6.5 -23.5t12.5 -20.5q82 -61 345 -252q10 -8 50 -38t65 -47t64 -39.5t77.5 -33.5t75.5 -11t75.5 11t79 34.5t64.5 39.5t65 47.5t48 36.5z" />
- <glyph glyph-name="uniF2B7" unicode="&#xf2b7;" horiz-adv-x="1792"
-d="M1474 623l39 -51q8 -11 6.5 -23.5t-11.5 -20.5q-43 -34 -126.5 -98.5t-146.5 -113t-67 -51.5q-39 -32 -60 -48t-60.5 -41t-76.5 -36.5t-74 -11.5h-1h-1q-37 0 -74 11.5t-76 36.5t-61 41.5t-60 47.5q-5 4 -65 50.5t-143.5 111t-122.5 94.5q-11 8 -12.5 20.5t6.5 23.5
-l37 52q8 11 21.5 13t24.5 -7q94 -73 306 -236q5 -4 43.5 -35t60.5 -46.5t56.5 -32.5t58.5 -17h1h1q24 0 58.5 17t56.5 32.5t60.5 46.5t43.5 35q258 198 313 242q11 8 24 6.5t21 -12.5zM1664 -96v928q-90 83 -159 139q-91 74 -389 304q-3 2 -43 35t-61 48t-56 32.5t-59 17.5
-h-1h-1q-24 0 -59 -17.5t-56 -32.5t-61 -48t-43 -35q-215 -166 -315.5 -245.5t-129.5 -104t-82 -74.5q-14 -12 -21 -19v-928q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 832v-928q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v928q0 56 41 94
-q123 114 350 290.5t233 181.5q36 30 59 47.5t61.5 42t76 36.5t74.5 12h1h1q37 0 74.5 -12t76 -36.5t61.5 -42t59 -47.5q43 -36 156 -122t226 -177t201 -173q41 -38 41 -94z" />
- <glyph glyph-name="uniF2B8" unicode="&#xf2b8;"
-d="M330 1l202 -214l-34 236l-216 213zM556 -225l274 218l-11 245l-300 -215zM245 413l227 -213l-48 327l-245 204zM495 189l317 214l-14 324l-352 -200zM843 178l95 -80l-2 239l-103 79q0 -1 1 -8.5t0 -12t-5 -7.5l-78 -52l85 -70q7 -6 7 -88zM138 930l256 -200l-68 465
-l-279 173zM1173 267l15 234l-230 -164l2 -240zM417 722l373 194l-19 441l-423 -163zM1270 357l20 233l-226 142l-2 -105l144 -95q6 -4 4 -9l-7 -119zM1461 496l30 222l-179 -128l-20 -228zM1273 329l-71 49l-8 -117q0 -5 -4 -8l-234 -187q-7 -5 -14 0l-98 83l7 -161
-q0 -5 -4 -8l-293 -234q-4 -2 -6 -2q-8 2 -8 3l-228 242q-4 4 -59 277q-2 7 5 11l61 37q-94 86 -95 92l-72 351q-2 7 6 12l94 45q-133 100 -135 108l-96 466q-2 10 7 13l433 135q5 0 8 -1l317 -153q6 -4 6 -9l20 -463q0 -7 -6 -10l-118 -61l126 -85q5 -2 5 -8l5 -123l121 74
-q5 4 11 0l84 -56l3 110q0 6 5 9l206 126q6 3 11 0l245 -135q4 -4 5 -7t-6.5 -60t-17.5 -124.5t-10 -70.5q0 -5 -4 -7l-191 -153q-6 -5 -13 0z" />
- <glyph glyph-name="uniF2B9" unicode="&#xf2b9;" horiz-adv-x="1664"
-d="M1201 298q0 57 -5.5 107t-21 100.5t-39.5 86t-64 58t-91 22.5q-6 -4 -33.5 -20.5t-42.5 -24.5t-40.5 -20t-49 -17t-46.5 -5t-46.5 5t-49 17t-40.5 20t-42.5 24.5t-33.5 20.5q-51 0 -91 -22.5t-64 -58t-39.5 -86t-21 -100.5t-5.5 -107q0 -73 42 -121.5t103 -48.5h576
-q61 0 103 48.5t42 121.5zM1028 892q0 108 -76.5 184t-183.5 76t-183.5 -76t-76.5 -184q0 -107 76.5 -183t183.5 -76t183.5 76t76.5 183zM1664 352v-192q0 -14 -9 -23t-23 -9h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216
-q66 0 113 -47t47 -113v-224h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23z" />
- <glyph glyph-name="uniF2BA" unicode="&#xf2ba;" horiz-adv-x="1664"
-d="M1028 892q0 -107 -76.5 -183t-183.5 -76t-183.5 76t-76.5 183q0 108 76.5 184t183.5 76t183.5 -76t76.5 -184zM980 672q46 0 82.5 -17t60 -47.5t39.5 -67t24 -81t11.5 -82.5t3.5 -79q0 -67 -39.5 -118.5t-105.5 -51.5h-576q-66 0 -105.5 51.5t-39.5 118.5q0 48 4.5 93.5
-t18.5 98.5t36.5 91.5t63 64.5t93.5 26h5q7 -4 32 -19.5t35.5 -21t33 -17t37 -16t35 -9t39.5 -4.5t39.5 4.5t35 9t37 16t33 17t35.5 21t32 19.5zM1664 928q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96
-q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216q66 0 113 -47t47 -113v-224h96q13 0 22.5 -9.5t9.5 -22.5v-192zM1408 -96v1472q0 13 -9.5 22.5t-22.5 9.5h-1216
-q-13 0 -22.5 -9.5t-9.5 -22.5v-1472q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5z" />
- <glyph glyph-name="uniF2BB" unicode="&#xf2bb;" horiz-adv-x="2048"
-d="M1024 405q0 64 -9 117.5t-29.5 103t-60.5 78t-97 28.5q-6 -4 -30 -18t-37.5 -21.5t-35.5 -17.5t-43 -14.5t-42 -4.5t-42 4.5t-43 14.5t-35.5 17.5t-37.5 21.5t-30 18q-57 0 -97 -28.5t-60.5 -78t-29.5 -103t-9 -117.5t37 -106.5t91 -42.5h512q54 0 91 42.5t37 106.5z
-M867 925q0 94 -66.5 160.5t-160.5 66.5t-160.5 -66.5t-66.5 -160.5t66.5 -160.5t160.5 -66.5t160.5 66.5t66.5 160.5zM1792 416v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1792 676v56q0 15 -10.5 25.5t-25.5 10.5h-568
-q-15 0 -25.5 -10.5t-10.5 -25.5v-56q0 -15 10.5 -25.5t25.5 -10.5h568q15 0 25.5 10.5t10.5 25.5zM1792 928v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-352v96q0 14 -9 23t-23 9
-h-64q-14 0 -23 -9t-9 -23v-96h-768v96q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-96h-352q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
- <glyph glyph-name="uniF2BC" unicode="&#xf2bc;" horiz-adv-x="2048"
-d="M1024 405q0 -64 -37 -106.5t-91 -42.5h-512q-54 0 -91 42.5t-37 106.5t9 117.5t29.5 103t60.5 78t97 28.5q6 -4 30 -18t37.5 -21.5t35.5 -17.5t43 -14.5t42 -4.5t42 4.5t43 14.5t35.5 17.5t37.5 21.5t30 18q57 0 97 -28.5t60.5 -78t29.5 -103t9 -117.5zM867 925
-q0 -94 -66.5 -160.5t-160.5 -66.5t-160.5 66.5t-66.5 160.5t66.5 160.5t160.5 66.5t160.5 -66.5t66.5 -160.5zM1792 480v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1792 732v-56q0 -15 -10.5 -25.5t-25.5 -10.5h-568
-q-15 0 -25.5 10.5t-10.5 25.5v56q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5zM1792 992v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1920 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1728q-13 0 -22.5 -9.5
-t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h352v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h768v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h352q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113
-t113 47h1728q66 0 113 -47t47 -113z" />
- <glyph glyph-name="uniF2BD" unicode="&#xf2bd;" horiz-adv-x="1792"
-d="M1523 197q-22 155 -87.5 257.5t-184.5 118.5q-67 -74 -159.5 -115.5t-195.5 -41.5t-195.5 41.5t-159.5 115.5q-119 -16 -184.5 -118.5t-87.5 -257.5q106 -150 271 -237.5t356 -87.5t356 87.5t271 237.5zM1280 896q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5
-t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1792 640q0 -182 -71 -347.5t-190.5 -286t-285.5 -191.5t-349 -71q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
- <glyph glyph-name="uniF2BE" unicode="&#xf2be;" horiz-adv-x="1792"
-d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348q0 -181 -70.5 -347t-190.5 -286t-286 -191.5t-349 -71.5t-349 71t-285.5 191.5t-190.5 286t-71 347.5t71 348t191 286t286 191t348 71zM1515 185q149 205 149 455q0 156 -61 298t-164 245t-245 164t-298 61t-298 -61
-t-245 -164t-164 -245t-61 -298q0 -250 149 -455q66 327 306 327q131 -128 313 -128t313 128q240 0 306 -327zM1280 832q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5z" />
- <glyph glyph-name="uniF2C0" unicode="&#xf2c0;"
-d="M1201 752q47 -14 89.5 -38t89 -73t79.5 -115.5t55 -172t22 -236.5q0 -154 -100 -263.5t-241 -109.5h-854q-141 0 -241 109.5t-100 263.5q0 131 22 236.5t55 172t79.5 115.5t89 73t89.5 38q-79 125 -79 272q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5
-t198.5 -40.5t163.5 -109.5t109.5 -163.5t40.5 -198.5q0 -147 -79 -272zM768 1408q-159 0 -271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5zM1195 -128q88 0 150.5 71.5t62.5 173.5q0 239 -78.5 377t-225.5 145
-q-145 -127 -336 -127t-336 127q-147 -7 -225.5 -145t-78.5 -377q0 -102 62.5 -173.5t150.5 -71.5h854z" />
- <glyph glyph-name="uniF2C1" unicode="&#xf2c1;" horiz-adv-x="1280"
-d="M1024 278q0 -64 -37 -107t-91 -43h-512q-54 0 -91 43t-37 107t9 118t29.5 104t61 78.5t96.5 28.5q80 -75 188 -75t188 75q56 0 96.5 -28.5t61 -78.5t29.5 -104t9 -118zM870 797q0 -94 -67.5 -160.5t-162.5 -66.5t-162.5 66.5t-67.5 160.5t67.5 160.5t162.5 66.5
-t162.5 -66.5t67.5 -160.5zM1152 -96v1376h-1024v-1376q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1280 1376v-1472q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h352v-96q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v96h352
-q66 0 113 -47t47 -113z" />
- <glyph glyph-name="uniF2C2" unicode="&#xf2c2;" horiz-adv-x="2048"
-d="M896 324q0 54 -7.5 100.5t-24.5 90t-51 68.5t-81 25q-64 -64 -156 -64t-156 64q-47 0 -81 -25t-51 -68.5t-24.5 -90t-7.5 -100.5q0 -55 31.5 -93.5t75.5 -38.5h426q44 0 75.5 38.5t31.5 93.5zM768 768q0 80 -56 136t-136 56t-136 -56t-56 -136t56 -136t136 -56t136 56
-t56 136zM1792 288v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1408 544v64q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1792 544v64q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23
-v-64q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1792 800v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM128 1152h1792v96q0 14 -9 23t-23 9h-1728q-14 0 -23 -9t-9 -23v-96zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728
-q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
- <glyph glyph-name="uniF2C3" unicode="&#xf2c3;" horiz-adv-x="2048"
-d="M896 324q0 -55 -31.5 -93.5t-75.5 -38.5h-426q-44 0 -75.5 38.5t-31.5 93.5q0 54 7.5 100.5t24.5 90t51 68.5t81 25q64 -64 156 -64t156 64q47 0 81 -25t51 -68.5t24.5 -90t7.5 -100.5zM768 768q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z
-M1792 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1408 608v-64q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h320q14 0 23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v64
-q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 864v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1920 32v1120h-1792v-1120q0 -13 9.5 -22.5t22.5 -9.5h1728q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47
-h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
- <glyph glyph-name="uniF2C4" unicode="&#xf2c4;" horiz-adv-x="1792"
-d="M1255 749q0 318 -105 474.5t-330 156.5q-222 0 -326 -157t-104 -474q0 -316 104 -471.5t326 -155.5q74 0 131 17q-22 43 -39 73t-44 65t-53.5 56.5t-63 36t-77.5 14.5q-46 0 -79 -16l-49 97q105 91 276 91q132 0 215.5 -54t150.5 -155q67 149 67 402zM1645 117h117
-q3 -27 -2 -67t-26.5 -95t-58 -100.5t-107 -78t-162.5 -32.5q-71 0 -130.5 19t-105.5 56t-79 78t-66 96q-97 -27 -205 -27q-150 0 -292.5 58t-253 158.5t-178 249t-67.5 317.5q0 170 67.5 319.5t178.5 250.5t253.5 159t291.5 58q121 0 238.5 -36t217 -106t176 -164.5
-t119.5 -219t43 -261.5q0 -190 -80.5 -347.5t-218.5 -264.5q47 -70 93.5 -106.5t104.5 -36.5q61 0 94 37.5t38 85.5z" />
- <glyph glyph-name="uniF2C5" unicode="&#xf2c5;" horiz-adv-x="2304"
-d="M453 -101q0 -21 -16 -37.5t-37 -16.5q-1 0 -13 3q-63 15 -162 140q-225 284 -225 676q0 341 213 614q39 51 95 103.5t94 52.5q19 0 35 -13.5t16 -32.5q0 -27 -63 -90q-98 -102 -147 -184q-119 -199 -119 -449q0 -281 123 -491q50 -85 136 -173q2 -3 14.5 -16t19.5 -21
-t17 -20.5t14.5 -23.5t4.5 -21zM1796 33q0 -29 -17.5 -48.5t-46.5 -19.5h-1081q-26 0 -45 19t-19 45q0 29 17.5 48.5t46.5 19.5h1081q26 0 45 -19t19 -45zM1581 644q0 -134 -67 -233q-25 -38 -69.5 -78.5t-83.5 -60.5q-16 -10 -27 -10q-7 0 -15 6t-8 12q0 9 19 30t42 46
-t42 67.5t19 88.5q0 76 -35 130q-29 42 -46 42q-3 0 -3 -5q0 -12 7.5 -35.5t7.5 -36.5q0 -22 -21.5 -35t-44.5 -13q-66 0 -66 76q0 15 1.5 44t1.5 44q0 25 -10 46q-13 25 -42 53.5t-51 28.5q-5 0 -7 -0.5t-3.5 -2.5t-1.5 -6q0 -2 16 -26t16 -54q0 -37 -19 -68t-46 -54
-t-53.5 -46t-45.5 -54t-19 -68q0 -98 42 -160q29 -43 79 -63q16 -5 17 -10q1 -2 1 -5q0 -16 -18 -16q-6 0 -33 11q-119 43 -195 139.5t-76 218.5q0 55 24.5 115.5t60 115t70.5 108.5t59.5 113.5t24.5 111.5q0 53 -25 94q-29 48 -56 64q-19 9 -19 21q0 20 41 20q50 0 110 -29
-q41 -19 71 -44.5t49.5 -51t33.5 -62.5t22 -69t16 -80q0 -1 3 -17.5t4.5 -25t5.5 -25t9 -27t11 -21.5t14.5 -16.5t18.5 -5.5q23 0 37 14t14 37q0 25 -20 67t-20 52t10 10q27 0 93 -70q72 -76 102.5 -156t30.5 -186zM2304 615q0 -274 -138 -503q-19 -32 -48 -72t-68 -86.5
-t-81 -77t-74 -30.5q-16 0 -31 15.5t-15 31.5q0 15 29 50.5t68.5 77t48.5 52.5q183 230 183 531q0 131 -20.5 235t-72.5 211q-58 119 -163 228q-2 3 -13 13.5t-16.5 16.5t-15 17.5t-15 20t-9.5 18.5t-4 19q0 19 16 35.5t35 16.5q70 0 196 -169q98 -131 146 -273t60 -314
-q2 -42 2 -64z" />
- <glyph glyph-name="uniF2C6" unicode="&#xf2c6;" horiz-adv-x="1792"
-d="M1189 229l147 693q9 44 -10.5 63t-51.5 7l-864 -333q-29 -11 -39.5 -25t-2.5 -26.5t32 -19.5l221 -69l513 323q21 14 32 6q7 -5 -4 -15l-415 -375v0v0l-16 -228q23 0 45 22l108 104l224 -165q64 -36 81 38zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71
-t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
- <glyph glyph-name="uniF2C7" unicode="&#xf2c7;" horiz-adv-x="1024"
-d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v907h128v-907q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
-t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
-v128h192z" />
- <glyph glyph-name="uniF2C8" unicode="&#xf2c8;" horiz-adv-x="1024"
-d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v651h128v-651q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
-t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
-v128h192z" />
- <glyph glyph-name="uniF2C9" unicode="&#xf2c9;" horiz-adv-x="1024"
-d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v395h128v-395q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
-t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
-v128h192z" />
- <glyph glyph-name="uniF2CA" unicode="&#xf2ca;" horiz-adv-x="1024"
-d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v139h128v-139q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
-t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
-v128h192z" />
- <glyph glyph-name="uniF2CB" unicode="&#xf2cb;" horiz-adv-x="1024"
-d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 79 56 135.5t136 56.5t136 -56.5t56 -135.5zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5z
-M896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z" />
- <glyph glyph-name="uniF2CC" unicode="&#xf2cc;" horiz-adv-x="1920"
-d="M1433 1287q10 -10 10 -23t-10 -23l-626 -626q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l44 44q-72 91 -81.5 207t46.5 215q-74 71 -176 71q-106 0 -181 -75t-75 -181v-1280h-256v1280q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5q106 0 201 -41
-t166 -115q94 39 197 24.5t185 -79.5l44 44q10 10 23 10t23 -10zM1344 1024q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1600 896q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1856 1024q26 0 45 -19t19 -45t-19 -45t-45 -19
-t-45 19t-19 45t19 45t45 19zM1216 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1408 832q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM1728 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 768
-q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 640q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1600 768q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 512q-26 0 -45 19t-19 45t19 45t45 19t45 -19
-t19 -45t-19 -45t-45 -19zM1472 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 384
-q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 256q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19z" />
- <glyph glyph-name="uniF2CD" unicode="&#xf2cd;" horiz-adv-x="1792"
-d="M1664 448v-192q0 -169 -128 -286v-194q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v118q-63 -22 -128 -22h-768q-65 0 -128 22v-110q0 -17 -9.5 -28.5t-22.5 -11.5h-64q-13 0 -22.5 11.5t-9.5 28.5v186q-128 117 -128 286v192h1536zM704 864q0 -14 -9 -23t-23 -9t-23 9
-t-9 23t9 23t23 9t23 -9t9 -23zM768 928q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM704 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1056q0 -14 -9 -23t-23 -9t-23 9
-t-9 23t9 23t23 9t23 -9t9 -23zM704 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v640q0 106 75 181t181 75q108 0 184 -78q46 19 98 12t93 -39l22 22q11 11 22 0l42 -42
-q11 -11 0 -22l-314 -314q-11 -11 -22 0l-42 42q-11 11 0 22l22 22q-36 46 -40.5 104t23.5 108q-37 35 -88 35q-53 0 -90.5 -37.5t-37.5 -90.5v-640h1504q14 0 23 -9t9 -23zM896 1056q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1120q0 -14 -9 -23t-23 -9
-t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM896 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1248q0 -14 -9 -23
-t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1024 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1088 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23z" />
- <glyph glyph-name="uniF2CE" unicode="&#xf2ce;"
-d="M994 344q0 -86 -17 -197q-31 -215 -55 -313q-22 -90 -152 -90t-152 90q-24 98 -55 313q-17 110 -17 197q0 168 224 168t224 -168zM1536 768q0 -240 -134 -434t-350 -280q-8 -3 -15 3t-6 15q7 48 10 66q4 32 6 47q1 9 9 12q159 81 255.5 234t96.5 337q0 180 -91 330.5
-t-247 234.5t-337 74q-124 -7 -237 -61t-193.5 -140.5t-128 -202t-46.5 -240.5q1 -184 99 -336.5t257 -231.5q7 -3 9 -12q3 -21 6 -45q1 -9 5 -32.5t6 -35.5q1 -9 -6.5 -15t-15.5 -2q-148 58 -261 169.5t-173.5 264t-52.5 319.5q7 143 66 273.5t154.5 227t225 157.5t272.5 70
-q164 10 315.5 -46.5t261 -160.5t175 -250.5t65.5 -308.5zM994 800q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5zM1282 768q0 -122 -53.5 -228.5t-146.5 -177.5q-8 -6 -16 -2t-10 14q-6 52 -29 92q-7 10 3 20
-q58 54 91 127t33 155q0 111 -58.5 204t-157.5 141.5t-212 36.5q-133 -15 -229 -113t-109 -231q-10 -92 23.5 -176t98.5 -144q10 -10 3 -20q-24 -41 -29 -93q-2 -9 -10 -13t-16 2q-95 74 -148.5 183t-51.5 234q3 131 69 244t177 181.5t241 74.5q144 7 268 -60t196.5 -187.5
-t72.5 -263.5z" />
- <glyph glyph-name="uniF2D0" unicode="&#xf2d0;" horiz-adv-x="1792"
-d="M256 128h1280v768h-1280v-768zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
- <glyph glyph-name="uniF2D1" unicode="&#xf2d1;" horiz-adv-x="1792"
-d="M1792 224v-192q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
- <glyph glyph-name="uniF2D2" unicode="&#xf2d2;" horiz-adv-x="2048"
-d="M256 0h768v512h-768v-512zM1280 512h512v768h-768v-256h96q66 0 113 -47t47 -113v-352zM2048 1376v-960q0 -66 -47 -113t-113 -47h-608v-352q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h608v352q0 66 47 113t113 47h960q66 0 113 -47
-t47 -113z" />
- <glyph glyph-name="uniF2D3" unicode="&#xf2d3;" horiz-adv-x="1792"
-d="M1175 215l146 146q10 10 10 23t-10 23l-233 233l233 233q10 10 10 23t-10 23l-146 146q-10 10 -23 10t-23 -10l-233 -233l-233 233q-10 10 -23 10t-23 -10l-146 -146q-10 -10 -10 -23t10 -23l233 -233l-233 -233q-10 -10 -10 -23t10 -23l146 -146q10 -10 23 -10t23 10
-l233 233l233 -233q10 -10 23 -10t23 10zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
- <glyph glyph-name="uniF2D4" unicode="&#xf2d4;" horiz-adv-x="1792"
-d="M1257 425l-146 -146q-10 -10 -23 -10t-23 10l-169 169l-169 -169q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l169 169l-169 169q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l169 -169l169 169q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23
-l-169 -169l169 -169q10 -10 10 -23t-10 -23zM256 128h1280v1024h-1280v-1024zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
- <glyph glyph-name="uniF2D5" unicode="&#xf2d5;" horiz-adv-x="1792"
-d="M1070 358l306 564h-654l-306 -564h654zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
- <glyph glyph-name="uniF2D6" unicode="&#xf2d6;" horiz-adv-x="1794"
-d="M1291 1060q-15 17 -35 8.5t-26 -28.5t5 -38q14 -17 40 -14.5t34 20.5t-18 52zM895 814q-8 -8 -19.5 -8t-18.5 8q-8 8 -8 19t8 18q7 8 18.5 8t19.5 -8q7 -7 7 -18t-7 -19zM1060 740l-35 -35q-12 -13 -29.5 -13t-30.5 13l-38 38q-12 13 -12 30t12 30l35 35q12 12 29.5 12
-t30.5 -12l38 -39q12 -12 12 -29.5t-12 -29.5zM951 870q-7 -8 -18.5 -8t-19.5 8q-7 8 -7 19t7 19q8 8 19 8t19 -8t8 -19t-8 -19zM1354 968q-34 -64 -107.5 -85.5t-127.5 16.5q-38 28 -61 66.5t-21 87.5t39 92t75.5 53t70.5 -5t70 -51q2 -2 13 -12.5t14.5 -13.5t13 -13.5
-t12.5 -15.5t10 -15.5t8.5 -18t4 -18.5t1 -21t-5 -22t-9.5 -24zM1555 486q3 20 -8.5 34.5t-27.5 21.5t-33 17t-23 20q-40 71 -84 98.5t-113 11.5q19 13 40 18.5t33 4.5l12 -1q2 45 -34 90q6 20 6.5 40.5t-2.5 30.5l-3 10q43 24 71 65t34 91q10 84 -43 150.5t-137 76.5
-q-60 7 -114 -18.5t-82 -74.5q-30 -51 -33.5 -101t14.5 -87t43.5 -64t56.5 -42q-45 4 -88 36t-57 88q-28 108 32 222q-16 21 -29 32q-50 0 -89 -19q19 24 42 37t36 14l13 1q0 50 -13 78q-10 21 -32.5 28.5t-47 -3.5t-37.5 -40q2 4 4 7q-7 -28 -6.5 -75.5t19 -117t48.5 -122.5
-q-25 -14 -47 -36q-35 -16 -85.5 -70.5t-84.5 -101.5l-33 -46q-90 -34 -181 -125.5t-75 -162.5q1 -16 11 -27q-15 -12 -30 -30q-21 -25 -21 -54t21.5 -40t63.5 6q41 19 77 49.5t55 60.5q-2 2 -6.5 5t-20.5 7.5t-33 3.5q23 5 51 12.5t40 10t27.5 6t26 4t23.5 0.5q14 -7 22 34
-q7 37 7 90q0 102 -40 150q106 -103 101 -219q-1 -29 -15 -50t-27 -27l-13 -6q-4 -7 -19 -32t-26 -45.5t-26.5 -52t-25 -61t-17 -63t-6.5 -66.5t10 -63q-35 54 -37 80q-22 -24 -34.5 -39t-33.5 -42t-30.5 -46t-16.5 -41t-0.5 -38t25.5 -27q45 -25 144 64t190.5 221.5
-t122.5 228.5q86 52 145 115.5t86 119.5q47 -93 154 -178q104 -83 167 -80q39 2 46 43zM1794 640q0 -182 -71 -348t-191 -286t-286.5 -191t-348.5 -71t-348.5 71t-286.5 191t-191 286t-71 348t71 348t191 286t286.5 191t348.5 71t348.5 -71t286.5 -191t191 -286t71 -348z" />
- <glyph glyph-name="uniF2D7" unicode="&#xf2d7;"
-d="M518 1353v-655q103 -1 191.5 1.5t125.5 5.5l37 3q68 2 90.5 24.5t39.5 94.5l33 142h103l-14 -322l7 -319h-103l-29 127q-15 68 -45 93t-84 26q-87 8 -352 8v-556q0 -78 43.5 -115.5t133.5 -37.5h357q35 0 59.5 2t55 7.5t54 18t48.5 32t46 50.5t39 73l93 216h89
-q-6 -37 -31.5 -252t-30.5 -276q-146 5 -263.5 8t-162.5 4h-44h-628l-376 -12v102l127 25q67 13 91.5 37t25.5 79l8 643q3 402 -8 645q-2 61 -25.5 84t-91.5 36l-127 24v102l376 -12h702q139 0 374 27q-6 -68 -14 -194.5t-12 -219.5l-5 -92h-93l-32 124q-31 121 -74 179.5
-t-113 58.5h-548q-28 0 -35.5 -8.5t-7.5 -30.5z" />
- <glyph glyph-name="uniF2D8" unicode="&#xf2d8;"
-d="M922 739v-182q0 -4 0.5 -15t0 -15l-1.5 -12t-3.5 -11.5t-6.5 -7.5t-11 -5.5t-16 -1.5v309q9 0 16 -1t11 -5t6.5 -5.5t3.5 -9.5t1 -10.5v-13.5v-14zM1238 643v-121q0 -1 0.5 -12.5t0 -15.5t-2.5 -11.5t-7.5 -10.5t-13.5 -3q-9 0 -14 9q-4 10 -4 165v7v8.5v9t1.5 8.5l3.5 7
-t5 5.5t8 1.5q6 0 10 -1.5t6.5 -4.5t4 -6t2 -8.5t0.5 -8v-9.5v-9zM180 407h122v472h-122v-472zM614 407h106v472h-159l-28 -221q-20 148 -32 221h-158v-472h107v312l45 -312h76l43 319v-319zM1039 712q0 67 -5 90q-3 16 -11 28.5t-17 20.5t-25 14t-26.5 8.5t-31 4t-29 1.5
-h-29.5h-12h-91v-472h56q169 -1 197 24.5t25 180.5q-1 62 -1 100zM1356 515v133q0 29 -2 45t-9.5 33.5t-24.5 25t-46 7.5q-46 0 -77 -34v154h-117v-472h110l7 30q30 -36 77 -36q50 0 66 30.5t16 83.5zM1536 1248v-1216q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113
-v1216q0 66 47 113t113 47h1216q66 0 113 -47t47 -113z" />
- <glyph glyph-name="uniF2D9" unicode="&#xf2d9;" horiz-adv-x="2176"
-d="M1143 -197q-6 1 -11 4q-13 8 -36 23t-86 65t-116.5 104.5t-112 140t-89.5 172.5q-17 3 -175 37q66 -213 235 -362t391 -184zM502 409l168 -28q-25 76 -41 167.5t-19 145.5l-4 53q-84 -82 -121 -224q5 -65 17 -114zM612 1018q-43 -64 -77 -148q44 46 74 68zM2049 584
-q0 161 -62 307t-167.5 252t-250.5 168.5t-304 62.5q-147 0 -281 -52.5t-240 -148.5q-30 -58 -45 -160q60 51 143 83.5t158.5 43t143 13.5t108.5 -1l40 -3q33 -1 53 -15.5t24.5 -33t6.5 -37t-1 -28.5q-126 11 -227.5 0.5t-183 -43.5t-142.5 -71.5t-131 -98.5
-q4 -36 11.5 -92.5t35.5 -178t62 -179.5q123 -6 247.5 14.5t214.5 53.5t162.5 67t109.5 59l37 24q22 16 39.5 20.5t30.5 -5t17 -34.5q14 -97 -39 -121q-208 -97 -467 -134q-135 -20 -317 -16q41 -96 110 -176.5t137 -127t130.5 -79t101.5 -43.5l39 -12q143 -23 263 15
-q195 99 314 289t119 418zM2123 621q-14 -135 -40 -212q-70 -208 -181.5 -346.5t-318.5 -253.5q-48 -33 -82 -44q-72 -26 -163 -16q-36 -3 -73 -3q-283 0 -504.5 173t-295.5 442q-1 0 -4 0.5t-5 0.5q-6 -50 2.5 -112.5t26 -115t36 -98t31.5 -71.5l14 -26q8 -12 54 -82
-q-71 38 -124.5 106.5t-78.5 140t-39.5 137t-17.5 107.5l-2 42q-5 2 -33.5 12.5t-48.5 18t-53 20.5t-57.5 25t-50 25.5t-42.5 27t-25 25.5q19 -10 50.5 -25.5t113 -45.5t145.5 -38l2 32q11 149 94 290q41 202 176 365q28 115 81 214q15 28 32 45t49 32q158 74 303.5 104
-t302 11t306.5 -97q220 -115 333 -336t87 -474z" />
- <glyph glyph-name="uniF2DA" unicode="&#xf2da;" horiz-adv-x="1792"
-d="M1341 752q29 44 -6.5 129.5t-121.5 142.5q-58 39 -125.5 53.5t-118 4.5t-68.5 -37q-12 -23 -4.5 -28t42.5 -10q23 -3 38.5 -5t44.5 -9.5t56 -17.5q36 -13 67.5 -31.5t53 -37t40 -38.5t30.5 -38t22 -34.5t16.5 -28.5t12 -18.5t10.5 -6t11 9.5zM1704 178
-q-52 -127 -148.5 -220t-214.5 -141.5t-253 -60.5t-266 13.5t-251 91t-210 161.5t-141.5 235.5t-46.5 303.5q1 41 8.5 84.5t12.5 64t24 80.5t23 73q-51 -208 1 -397t173 -318t291 -206t346 -83t349 74.5t289 244.5q20 27 18 14q0 -4 -4 -14zM1465 627q0 -104 -40.5 -199
-t-108.5 -164t-162 -109.5t-198 -40.5t-198 40.5t-162 109.5t-108.5 164t-40.5 199t40.5 199t108.5 164t162 109.5t198 40.5t198 -40.5t162 -109.5t108.5 -164t40.5 -199zM1752 915q-65 147 -180.5 251t-253 153.5t-292 53.5t-301 -36.5t-275.5 -129t-220 -211.5t-131 -297
-t-10 -373q-49 161 -51.5 311.5t35.5 272.5t109 227t165.5 180.5t207 126t232 71t242.5 9t236 -54t216 -124.5t178 -197q33 -50 62 -121t31 -112zM1690 573q12 244 -136.5 416t-396.5 240q-8 0 -10 5t24 8q125 -4 230 -50t173 -120t116 -168.5t58.5 -199t-1 -208
-t-61.5 -197.5t-122.5 -167t-185 -117.5t-248.5 -46.5q108 30 201.5 80t174 123t129.5 176.5t55 225.5z" />
- <glyph glyph-name="uniF2DB" unicode="&#xf2db;"
-d="M192 256v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 512v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 768v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16
-q0 16 16 16h112zM192 1024v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 1280v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM1280 1440v-1472q0 -40 -28 -68t-68 -28h-832q-40 0 -68 28
-t-28 68v1472q0 40 28 68t68 28h832q40 0 68 -28t28 -68zM1536 208v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 464v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 720v-32
-q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 976v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 1232v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16
-h48q16 0 16 -16z" />
- <glyph glyph-name="uniF2DC" unicode="&#xf2dc;" horiz-adv-x="1664"
-d="M1566 419l-167 -33l186 -107q23 -13 29.5 -38.5t-6.5 -48.5q-14 -23 -39 -29.5t-48 6.5l-186 106l55 -160q13 -38 -12 -63.5t-60.5 -20.5t-48.5 42l-102 300l-271 156v-313l208 -238q16 -18 17 -39t-11 -36.5t-28.5 -25t-37 -5.5t-36.5 22l-112 128v-214q0 -26 -19 -45
-t-45 -19t-45 19t-19 45v214l-112 -128q-16 -18 -36.5 -22t-37 5.5t-28.5 25t-11 36.5t17 39l208 238v313l-271 -156l-102 -300q-13 -37 -48.5 -42t-60.5 20.5t-12 63.5l55 160l-186 -106q-23 -13 -48 -6.5t-39 29.5q-13 23 -6.5 48.5t29.5 38.5l186 107l-167 33
-q-29 6 -42 29t-8.5 46.5t25.5 40t50 10.5l310 -62l271 157l-271 157l-310 -62q-4 -1 -13 -1q-27 0 -44 18t-19 40t11 43t40 26l167 33l-186 107q-23 13 -29.5 38.5t6.5 48.5t39 30t48 -7l186 -106l-55 160q-13 38 12 63.5t60.5 20.5t48.5 -42l102 -300l271 -156v313
-l-208 238q-16 18 -17 39t11 36.5t28.5 25t37 5.5t36.5 -22l112 -128v214q0 26 19 45t45 19t45 -19t19 -45v-214l112 128q16 18 36.5 22t37 -5.5t28.5 -25t11 -36.5t-17 -39l-208 -238v-313l271 156l102 300q13 37 48.5 42t60.5 -20.5t12 -63.5l-55 -160l186 106
-q23 13 48 6.5t39 -29.5q13 -23 6.5 -48.5t-29.5 -38.5l-186 -107l167 -33q27 -5 40 -26t11 -43t-19 -40t-44 -18q-9 0 -13 1l-310 62l-271 -157l271 -157l310 62q29 6 50 -10.5t25.5 -40t-8.5 -46.5t-42 -29z" />
- <glyph glyph-name="uniF2DD" unicode="&#xf2dd;" horiz-adv-x="1792"
-d="M1473 607q7 118 -33 226.5t-113 189t-177 131t-221 57.5q-116 7 -225.5 -32t-192 -110.5t-135 -175t-59.5 -220.5q-7 -118 33 -226.5t113 -189t177.5 -131t221.5 -57.5q155 -9 293 59t224 195.5t94 283.5zM1792 1536l-349 -348q120 -117 180.5 -272t50.5 -321
-q-11 -183 -102 -339t-241 -255.5t-332 -124.5l-999 -132l347 347q-120 116 -180.5 271.5t-50.5 321.5q11 184 102 340t241.5 255.5t332.5 124.5q167 22 500 66t500 66z" />
- <glyph glyph-name="uniF2DE" unicode="&#xf2de;" horiz-adv-x="1792"
-d="M948 508l163 -329h-51l-175 350l-171 -350h-49l179 374l-78 33l21 49l240 -102l-21 -50zM563 1100l304 -130l-130 -304l-304 130zM907 915l240 -103l-103 -239l-239 102zM1188 765l191 -81l-82 -190l-190 81zM1680 640q0 159 -62 304t-167.5 250.5t-250.5 167.5t-304 62
-t-304 -62t-250.5 -167.5t-167.5 -250.5t-62 -304t62 -304t167.5 -250.5t250.5 -167.5t304 -62t304 62t250.5 167.5t167.5 250.5t62 304zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71
-t286 -191t191 -286t71 -348z" />
- <glyph glyph-name="uniF2E0" unicode="&#xf2e0;" horiz-adv-x="1920"
-d="M1334 302q-4 24 -27.5 34t-49.5 10.5t-48.5 12.5t-25.5 38q-5 47 33 139.5t75 181t32 127.5q-14 101 -117 103q-45 1 -75 -16l-3 -2l-5 -2.5t-4.5 -2t-5 -2t-5 -0.5t-6 1.5t-6 3.5t-6.5 5q-3 2 -9 8.5t-9 9t-8.5 7.5t-9.5 7.5t-9.5 5.5t-11 4.5t-11.5 2.5q-30 5 -48 -3
-t-45 -31q-1 -1 -9 -8.5t-12.5 -11t-15 -10t-16.5 -5.5t-17 3q-54 27 -84 40q-41 18 -94 -5t-76 -65q-16 -28 -41 -98.5t-43.5 -132.5t-40 -134t-21.5 -73q-22 -69 18.5 -119t110.5 -46q30 2 50.5 15t38.5 46q7 13 79 199.5t77 194.5q6 11 21.5 18t29.5 0q27 -15 21 -53
-q-2 -18 -51 -139.5t-50 -132.5q-6 -38 19.5 -56.5t60.5 -7t55 49.5q4 8 45.5 92t81.5 163.5t46 88.5q20 29 41 28q29 0 25 -38q-2 -16 -65.5 -147.5t-70.5 -159.5q-12 -53 13 -103t74 -74q17 -9 51 -15.5t71.5 -8t62.5 14t20 48.5zM383 86q3 -15 -5 -27.5t-23 -15.5
-q-14 -3 -26.5 5t-15.5 23q-3 14 5 27t22 16t27 -5t16 -23zM953 -177q12 -17 8.5 -37.5t-20.5 -32.5t-37.5 -8t-32.5 21q-11 17 -7.5 37.5t20.5 32.5t37.5 8t31.5 -21zM177 635q-18 -27 -49.5 -33t-57.5 13q-26 18 -32 50t12 58q18 27 49.5 33t57.5 -12q26 -19 32 -50.5
-t-12 -58.5zM1467 -42q19 -28 13 -61.5t-34 -52.5t-60.5 -13t-51.5 34t-13 61t33 53q28 19 60.5 13t52.5 -34zM1579 562q69 -113 42.5 -244.5t-134.5 -207.5q-90 -63 -199 -60q-20 -80 -84.5 -127t-143.5 -44.5t-140 57.5q-12 -9 -13 -10q-103 -71 -225 -48.5t-193 126.5
-q-50 73 -53 164q-83 14 -142.5 70.5t-80.5 128t-2 152t81 138.5q-36 60 -38 128t24.5 125t79.5 98.5t121 50.5q32 85 99 148t146.5 91.5t168 17t159.5 -66.5q72 21 140 17.5t128.5 -36t104.5 -80t67.5 -115t17.5 -140.5q52 -16 87 -57t45.5 -89t-5.5 -99.5t-58 -87.5z
-M455 1222q14 -20 9.5 -44.5t-24.5 -38.5q-19 -14 -43.5 -9.5t-37.5 24.5q-14 20 -9.5 44.5t24.5 38.5q19 14 43.5 9.5t37.5 -24.5zM614 1503q4 -16 -5 -30.5t-26 -18.5t-31 5.5t-18 26.5q-3 17 6.5 31t25.5 18q17 4 31 -5.5t17 -26.5zM1800 555q4 -20 -6.5 -37t-30.5 -21
-q-19 -4 -36 6.5t-21 30.5t6.5 37t30.5 22q20 4 36.5 -7.5t20.5 -30.5zM1136 1448q16 -27 8.5 -58.5t-35.5 -47.5q-27 -16 -57.5 -8.5t-46.5 34.5q-16 28 -8.5 59t34.5 48t58 9t47 -36zM1882 792q4 -15 -4 -27.5t-23 -16.5q-15 -3 -27.5 5.5t-15.5 22.5q-3 15 5 28t23 16
-q14 3 26.5 -5t15.5 -23zM1691 1033q15 -22 10.5 -49t-26.5 -43q-22 -15 -49 -10t-42 27t-10 49t27 43t48.5 11t41.5 -28z" />
- <glyph glyph-name="uniF2E1" unicode="&#xf2e1;" horiz-adv-x="1792"
- />
- <glyph glyph-name="uniF2E2" unicode="&#xf2e2;" horiz-adv-x="1792"
- />
- <glyph glyph-name="uniF2E3" unicode="&#xf2e3;" horiz-adv-x="1792"
- />
- <glyph glyph-name="uniF2E4" unicode="&#xf2e4;" horiz-adv-x="1792"
- />
- <glyph glyph-name="uniF2E5" unicode="&#xf2e5;" horiz-adv-x="1792"
- />
- <glyph glyph-name="uniF2E6" unicode="&#xf2e6;" horiz-adv-x="1792"
- />
- <glyph glyph-name="uniF2E7" unicode="&#xf2e7;" horiz-adv-x="1792"
- />
- <glyph glyph-name="_698" unicode="&#xf2e8;" horiz-adv-x="1792"
- />
- <glyph glyph-name="uniF2E9" unicode="&#xf2e9;" horiz-adv-x="1792"
- />
- <glyph glyph-name="uniF2EA" unicode="&#xf2ea;" horiz-adv-x="1792"
- />
- <glyph glyph-name="uniF2EB" unicode="&#xf2eb;" horiz-adv-x="1792"
- />
- <glyph glyph-name="uniF2EC" unicode="&#xf2ec;" horiz-adv-x="1792"
- />
- <glyph glyph-name="uniF2ED" unicode="&#xf2ed;" horiz-adv-x="1792"
- />
- <glyph glyph-name="uniF2EE" unicode="&#xf2ee;" horiz-adv-x="1792"
- />
- <glyph glyph-name="lessequal" unicode="&#xf500;" horiz-adv-x="1792"
- />
- </font>
-</defs></svg>
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.ttf b/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.ttf
deleted file mode 100644
index 35acda2fa11..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.ttf
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff b/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff
deleted file mode 100644
index 400014a4b06..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff2
deleted file mode 100644
index 4d13fc60404..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/lato-bold-italic.woff b/docs/themes/sphinx_rtd_theme/static/fonts/lato-bold-italic.woff
deleted file mode 100644
index 88ad05b9ff4..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/lato-bold-italic.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/lato-bold-italic.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/lato-bold-italic.woff2
deleted file mode 100644
index c4e3d804b57..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/lato-bold-italic.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/lato-bold.woff b/docs/themes/sphinx_rtd_theme/static/fonts/lato-bold.woff
deleted file mode 100644
index c6dff51f063..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/lato-bold.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/lato-bold.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/lato-bold.woff2
deleted file mode 100644
index bb195043cfc..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/lato-bold.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/lato-normal-italic.woff b/docs/themes/sphinx_rtd_theme/static/fonts/lato-normal-italic.woff
deleted file mode 100644
index 76114bc0336..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/lato-normal-italic.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/lato-normal-italic.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/lato-normal-italic.woff2
deleted file mode 100644
index 3404f37e2e3..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/lato-normal-italic.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/lato-normal.woff b/docs/themes/sphinx_rtd_theme/static/fonts/lato-normal.woff
deleted file mode 100644
index ae1307ff5f4..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/lato-normal.woff
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/fonts/lato-normal.woff2 b/docs/themes/sphinx_rtd_theme/static/fonts/lato-normal.woff2
deleted file mode 100644
index 3bf9843328a..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/fonts/lato-normal.woff2
+++ /dev/null
Binary files differ
diff --git a/docs/themes/sphinx_rtd_theme/static/js/html5shiv-printshiv.min.js b/docs/themes/sphinx_rtd_theme/static/js/html5shiv-printshiv.min.js
deleted file mode 100644
index 2b43bd062e9..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/js/html5shiv-printshiv.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
-* @preserve HTML5 Shiv 3.7.3-pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
-*/
-!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file
diff --git a/docs/themes/sphinx_rtd_theme/static/js/html5shiv.min.js b/docs/themes/sphinx_rtd_theme/static/js/html5shiv.min.js
deleted file mode 100644
index cd1c674f5e3..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/js/html5shiv.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
-* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
-*/
-!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file
diff --git a/docs/themes/sphinx_rtd_theme/static/js/modernizr.min.js b/docs/themes/sphinx_rtd_theme/static/js/modernizr.min.js
deleted file mode 100644
index f65d4797478..00000000000
--- a/docs/themes/sphinx_rtd_theme/static/js/modernizr.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Modernizr 2.6.2 (Custom Build) | MIT & BSD
- * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load
- */
-;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a){var e=a[d];if(!G(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function K(){e.input=function(c){for(var d=0,e=c.length;d<e;d++)u[c[d]]=c[d]in k;return u.list&&(u.list=!!b.createElement("datalist")&&!!a.HTMLDataListElement),u}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var d=0,e,f,h,i=a.length;d<i;d++)k.setAttribute("type",f=a[d]),e=k.type!=="text",e&&(k.value=l,k.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(f)&&k.style.WebkitAppearance!==c?(g.appendChild(k),h=b.defaultView,e=h.getComputedStyle&&h.getComputedStyle(k,null).WebkitAppearance!=="textfield"&&k.offsetHeight!==0,g.removeChild(k)):/^(search|tel)$/.test(f)||(/^(url|email)$/.test(f)?e=k.checkValidity&&k.checkValidity()===!1:e=k.value!=l)),t[a[d]]=!!e;return t}("search tel url email datetime date month week time datetime-local number range color".split(" "))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k=b.createElement("input"),l=":)",m={}.toString,n=" -webkit- -moz- -o- -ms- ".split(" "),o="Webkit Moz O ms",p=o.split(" "),q=o.toLowerCase().split(" "),r={svg:"http://www.w3.org/2000/svg"},s={},t={},u={},v=[],w=v.slice,x,y=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["&#173;",'<style id="s',h,'">',a,"</style>"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return J("flexWrap")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){return!!a.WebGLRenderingContext},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=function(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return D("background-color:rgba(150,255,150,.5)"),G(j.backgroundColor,"rgba")},s.hsla=function(){return D("background-color:hsla(120,40%,100%,.5)"),G(j.backgroundColor,"rgba")||G(j.backgroundColor,"hsla")},s.multiplebgs=function(){return D("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return J("backgroundSize")},s.borderimage=function(){return J("borderImage")},s.borderradius=function(){return J("borderRadius")},s.boxshadow=function(){return J("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return E("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return J("animationName")},s.csscolumns=function(){return J("columnCount")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return D((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),G(j.backgroundImage,"gradient")},s.cssreflections=function(){return J("boxReflect")},s.csstransforms=function(){return!!J("transform")},s.csstransforms3d=function(){var a=!!J("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return J("transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect},s.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="<svg/>",(a.firstChild&&a.firstChild.namespaceURI)==r.svg},s.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(m.call(b.createElementNS(r.svg,"animate")))},s.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(m.call(b.createElementNS(r.svg,"clipPath")))};for(var L in s)C(s,L)&&(x=L.toLowerCase(),e[x]=s[L](),v.push((e[x]?"":"no-")+x));return e.input||K(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)C(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},D(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function p(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return r.shivMethods?n(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/\w+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(r,b.frag)}function q(a){a||(a=b);var c=m(a);return r.shivCSS&&!f&&!c.hasCSS&&(c.hasCSS=!!k(a,"article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}")),j||p(a,c),a}var c=a.html5||{},d=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,f,g="_html5shiv",h=0,i={},j;(function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
diff --git a/docs/themes/sphinx_rtd_theme/static/js/theme.js b/docs/themes/sphinx_rtd_theme/static/js/theme.js
index 839d07e2b8e..1fddb6ee4a6 100644
--- a/docs/themes/sphinx_rtd_theme/static/js/theme.js
+++ b/docs/themes/sphinx_rtd_theme/static/js/theme.js
@@ -1 +1 @@
-!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("<div class='wy-table-responsive'></div>"),n("table.docutils.footnote").wrap("<div class='wy-table-responsive footnote'></div>"),n("table.docutils.citation").wrap("<div class='wy-table-responsive citation'></div>"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n('<span class="toctree-expand"></span>'),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}t.length>0&&($(".wy-menu-vertical .current").removeClass("current"),t.addClass("current"),t.closest("li.toctree-l1").addClass("current"),t.closest("li.toctree-l1").parent().addClass("current"),t.closest("li.toctree-l1").addClass("current"),t.closest("li.toctree-l2").addClass("current"),t.closest("li.toctree-l3").addClass("current"),t.closest("li.toctree-l4").addClass("current"),t.closest("li.toctree-l5").addClass("current"),t[0].scrollIntoView())}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current"),e.siblings().find("li.current").removeClass("current"),e.find("> ul li.current").removeClass("current"),e.toggleClass("current")}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t<e.length&&!window.requestAnimationFrame;++t)window.requestAnimationFrame=window[e[t]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[t]+"CancelAnimationFrame"]||window[e[t]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,t){var i=(new Date).getTime(),o=Math.max(0,16-(i-n)),r=window.setTimeout((function(){e(i+o)}),o);return n=i+o,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(n){clearTimeout(n)})}()}).call(window)},function(n,e){n.exports=jQuery},function(n,e,t){}]); \ No newline at end of file
+!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("<div class='wy-table-responsive'></div>"),n("table.docutils.footnote").wrap("<div class='wy-table-responsive footnote'></div>"),n("table.docutils.citation").wrap("<div class='wy-table-responsive citation'></div>"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n('<button class="toctree-expand" title="Open/close menu"></button>'),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t<e.length&&!window.requestAnimationFrame;++t)window.requestAnimationFrame=window[e[t]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[t]+"CancelAnimationFrame"]||window[e[t]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,t){var i=(new Date).getTime(),o=Math.max(0,16-(i-n)),r=window.setTimeout((function(){e(i+o)}),o);return n=i+o,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(n){clearTimeout(n)})}()}).call(window)},function(n,e){n.exports=jQuery},function(n,e,t){}]); \ No newline at end of file
diff --git a/docs/themes/sphinx_rtd_theme/theme.conf b/docs/themes/sphinx_rtd_theme/theme.conf
index fd0521f0258..5cc687d7f98 100644
--- a/docs/themes/sphinx_rtd_theme/theme.conf
+++ b/docs/themes/sphinx_rtd_theme/theme.conf
@@ -6,6 +6,7 @@ pygments_style = default
[options]
canonical_url =
analytics_id =
+analytics_anonymize_ip = False
collapse_navigation = True
sticky_navigation = True
navigation_depth = 4
@@ -15,4 +16,5 @@ logo_only =
display_version = True
prev_next_buttons_location = bottom
style_external_links = False
-style_nav_header_background = \ No newline at end of file
+style_nav_header_background =
+vcs_pageview_mode =
diff --git a/docs/themes/sphinx_rtd_theme/versions.html b/docs/themes/sphinx_rtd_theme/versions.html
index 7368659c439..bab969e64f0 100644
--- a/docs/themes/sphinx_rtd_theme/versions.html
+++ b/docs/themes/sphinx_rtd_theme/versions.html
@@ -1,6 +1,6 @@
{% if READTHEDOCS %}
{# Add rst-badge after rst-versions for small badge style. #}
- <div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="versions">
+ <div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="{{ _('Versions') }}">
<span class="rst-current-version" data-toggle="rst-current-version">
<span class="fa fa-book"> Read the Docs</span>
v: {{ current_version }}
diff --git a/doxygen/doxy-boot.js b/doxygen/doxy-boot.js
index 17fd6e11583..ac0b41f493e 100644
--- a/doxygen/doxy-boot.js
+++ b/doxygen/doxy-boot.js
@@ -17,22 +17,16 @@ $( document ).ready(function() {
$('img[src="ftv2ns.png"]').replaceWith('<span class="label label-danger">N</span> ');
$('img[src="ftv2cl.png"]').replaceWith('<span class="label label-danger">C</span> ');
- $("div#navrow1 > ul.tablist").addClass("nav nav-pills");
- $("div#navrow1 > ul.tablist").addClass("nav-justified");
- $("div#navrow2 > ul.tablist").addClass("nav nav-tabs");
- $("div#navrow3 > ul.tablist").addClass("pager");
- $("div#navrow4 > ul.tablist").addClass("pagination pagination-sm center");
- $("div#navrow5 > ul.tablist").addClass("pagination pagination-sm pagination-centered");
+ $("ul.tablist").addClass("nav nav-pills nav-justified");
$("ul.tablist").css("margin-top", "0.5em");
$("ul.tablist").css("margin-bottom", "0.5em");
- $("ul.tablist").css("padding-right", "50px");
$("li.current").addClass("active");
$("iframe").attr("scrolling", "yes");
$("#nav-path > ul").addClass("breadcrumb");
$("table.params").addClass("table");
- $("div.ingroups").wrapInner("<small></small>");
+ $("div.ingroups").wrapInner("<span class='text-nowrap'></span>");
$("div.levels").css("margin", "0.5em");
$("div.levels > span").addClass("btn btn-default btn-xs");
$("div.levels > span").css("margin-right", "0.25em");
@@ -59,19 +53,19 @@ $( document ).ready(function() {
$("div.ttname a").css("color", 'white');
$("div.ttdef,div.ttdoc,div.ttdeci").addClass("panel-body");
- //$('#MSearchBox').parent().remove();
+ $('div.fragment.well div.line:first').css('margin-top', '2px');
+ $('div.fragment.well div.line:last').css('margin-bottom', '2px');
- //$('div.fragment.well div.line:first').css('margin-top', '15px');
- //$('div.fragment.well div.line:last').css('margin-bottom', '15px');
+ $('table.doxtable').removeClass('doxtable').addClass('table table-striped table-bordered').each(function(){
+ $(this).prepend('<thead></thead>');
+ $(this).find('tbody > tr:first').prependTo($(this).find('thead'));
+
+ $(this).find('td > span.success').parent().addClass('success');
+ $(this).find('td > span.warning').parent().addClass('warning');
+ $(this).find('td > span.danger').parent().addClass('danger');
+ });
- $('table.doxtable').removeClass('doxtable').addClass('table table-striped table-bordered').each(function(){
- $(this).prepend('<thead></thead>');
- $(this).find('tbody > tr:first').prependTo($(this).find('thead'));
- $(this).find('td > span.success').parent().addClass('success');
- $(this).find('td > span.warning').parent().addClass('warning');
- $(this).find('td > span.danger').parent().addClass('danger');
- });
if($('div.fragment.well div.ttc').length > 0)
{
@@ -83,42 +77,195 @@ $( document ).ready(function() {
$(this).siblings('.memItemLeft').attr('align', 'left');
});
- function getOriginalWidthOfImg(img_element) {
- var t = new Image();
- t.src = (img_element.getAttribute ? img_element.getAttribute("src") : false) || img_element.src;
- return t.width;
+ $('table.memberdecls').find('.memTemplItemRight').each(function(){
+ $(this).contents().appendTo($(this).siblings('.memTemplItemLeft'));
+ $(this).siblings('.memTemplItemLeft').attr('align', 'left');
+ });
+
+ function getOriginalWidthOfImg(img_element) {
+ var t = new Image();
+ t.src = (img_element.getAttribute ? img_element.getAttribute("src") : false) || img_element.src;
+ return t.width;
+ }
+
+ $('div.dyncontent').find('img').each(function(){
+ if(getOriginalWidthOfImg($(this)[0]) > $('#content>div.container').width())
+ $(this).css('width', '100%');
+ });
+
+
+ /* responsive search box */
+ $('#MSearchBox').parent().remove();
+
+ var nav_container = $('<div class="row"></div>');
+ $('#navrow1').parent().prepend(nav_container);
+
+ var left_nav = $('<div class="col-md-9"></div>');
+ for (i = 0; i < 6; i++) {
+ var navrow = $('#navrow' + i + ' > ul.tablist').detach();
+ left_nav.append(navrow);
+ $('#navrow' + i).remove();
+ }
+ var right_nav = $('<div class="col-md-3"></div>').append('\
+ <div id="search-box" class="input-group">\
+ <div class="input-group-btn">\
+ <button aria-expanded="false" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">\
+ <span class="glyphicon glyphicon-search"></span> <span class="caret"></span>\
+ </button>\
+ <ul class="dropdown-menu">\
+ </ul>\
+ </div>\
+ <button id="search-close" type="button" class="close" aria-label="Close"><span aria-hidden="true">&times;</span></button>\
+ <input id="search-field" class="form-control" accesskey="S" onkeydown="searchBox.OnSearchFieldChange(event);" placeholder="Search ..." type="text">\
+ </div>');
+ $(nav_container).append(left_nav);
+ $(nav_container).append(right_nav);
+
+ $('#MSearchSelectWindow .SelectionMark').remove();
+ var search_selectors = $('#MSearchSelectWindow .SelectItem');
+ for (var i = 0; i < search_selectors.length; i += 1) {
+ var element_a = $('<a href="#"></a>').text($(search_selectors[i]).text());
+
+ element_a.click(function(){
+ $('#search-box .dropdown-menu li').removeClass('active');
+ $(this).parent().addClass('active');
+ searchBox.OnSelectItem($('#search-box li a').index(this));
+ searchBox.Search();
+ return false;
+ });
+
+ var element = $('<li></li>').append(element_a);
+ $('#search-box .dropdown-menu').append(element);
+ }
+ $('#MSearchSelectWindow').remove();
+
+ $('#search-box .close').click(function (){
+ searchBox.CloseResultsWindow();
+ });
+
+ $('body').append('<div id="MSearchClose"></div>');
+ $('body').append('<div id="MSearchBox"></div>');
+ $('body').append('<div id="MSearchSelectWindow"></div>');
+
+ searchBox.searchLabel = '';
+ searchBox.DOMSearchField = function() {
+ return document.getElementById("search-field");
+ }
+ searchBox.DOMSearchClose = function(){
+ return document.getElementById("search-close");
+ }
+
+
+ /* search results */
+ var results_iframe = $('#MSearchResults').detach();
+ $('#MSearchResultsWindow')
+ .attr('id', 'search-results-window')
+ .addClass('panel panel-default')
+ .append(
+ '<div class="panel-heading">\
+ <h3 class="panel-title">Search Results</h3>\
+ </div>\
+ <div class="panel-body"></div>'
+ );
+ $('#search-results-window .panel-body').append(results_iframe);
+
+ searchBox.DOMPopupSearchResultsWindow = function() {
+ return document.getElementById("search-results-window");
+ }
+
+ function update_search_results_window() {
+ $('#search-results-window').removeClass('panel-default panel-success panel-warning panel-danger')
+ var status = $('#MSearchResults').contents().find('.SRStatus:visible');
+ if (status.length > 0) {
+ switch(status.attr('id')) {
+ case 'Loading':
+ case 'Searching':
+ $('#search-results-window').addClass('panel-warning');
+ break;
+ case 'NoMatches':
+ $('#search-results-window').addClass('panel-danger');
+ break;
+ default:
+ $('#search-results-window').addClass('panel-default');
+ }
+ } else {
+ $('#search-results-window').addClass('panel-success');
}
+ }
+ $('#MSearchResults').load(function() {
+ $('#MSearchResults').contents().find('link[href="search.css"]').attr('href','../doxygen.css');
+ $('#MSearchResults').contents().find('head').append(
+ '<link href="../customdoxygen.css" rel="stylesheet" type="text/css">');
- $('div.dyncontent').find('img').each(function(){
- if(getOriginalWidthOfImg($(this)[0]) > $('#content>div.container').width())
- $(this).css('width', '100%');
+ update_search_results_window();
+
+ // detect status changes (only for search with external search backend)
+ var observer = new MutationObserver(function(mutations) {
+ update_search_results_window();
});
+ var config = { attributes: true};
+
+ var targets = $('#MSearchResults').contents().find('.SRStatus');
+ for (i = 0; i < targets.length; i++) {
+ observer.observe(targets[i], config);
+ }
+ });
+
+
+ /* enumerations */
+ $('table.fieldtable').removeClass('fieldtable').addClass('table table-striped table-bordered').each(function(){
+ $(this).prepend('<thead></thead>');
+ $(this).find('tbody > tr:first').prependTo($(this).find('thead'));
+
+ $(this).find('td > span.success').parent().addClass('success');
+ $(this).find('td > span.warning').parent().addClass('warning');
+ $(this).find('td > span.danger').parent().addClass('danger');
+ });
- $(".memitem").removeClass('memitem');
+ /* todo list */
+ var todoelements = $('.contents > .textblock > dl.reflist > dt, .contents > .textblock > dl.reflist > dd');
+ for (var i = 0; i < todoelements.length; i += 2) {
+ $('.contents > .textblock').append(
+ '<div class="panel panel-default active">'
+ + "<div class=\"panel-heading todoname\">" + $(todoelements[i]).html() + "</div>"
+ + "<div class=\"panel-body\">" + $(todoelements[i+1]).html() + "</div>"
+ + '</div>');
+ }
+ $('.contents > .textblock > dl').remove();
+
+
+ $(".memitem").removeClass('memitem');
$(".memproto").removeClass('memproto');
$(".memdoc").removeClass('memdoc');
- $("span.mlabel").removeClass('mlabel');
- $("table.memberdecls").removeClass('memberdecls');
+ $("span.mlabel").removeClass('mlabel');
+ $("table.memberdecls").removeClass('memberdecls');
$("[class^=memitem]").removeClass('memitem');
$("span.mlabels").removeClass('mlabels');
$("table.mlabels").removeClass('mlabels');
$("td.mlabels-right").removeClass('mlabels-right');
- $(".navpath").removeClass('navpath');
- $("li.navelem").removeClass('navelem');
- $("a.el").removeClass('el');
- $("div.ah").removeClass('ah');
- $("div.header").removeClass("header");
-
- $('.mdescLeft').each(function(){
- if($(this).html()=="&nbsp;") {
- $(this).siblings('.mdescRight').attr('colspan', 2);
- $(this).remove();
- }
- });
- $('td.memItemLeft').each(function(){
- if($(this).siblings('.memItemRight').html()=="") {
- $(this).attr('colspan', 2);
- $(this).siblings('.memItemRight').remove();
- }
- });
+ $(".navpath").removeClass('navpath');
+ $("li.navelem").removeClass('navelem');
+ $("a.el").removeClass('el');
+ $("div.ah").removeClass('ah');
+ $("div.header").removeClass("header");
+
+ $('.mdescLeft').each(function(){
+ if($(this).html()=="&nbsp;") {
+ $(this).siblings('.mdescRight').attr('colspan', 2);
+ $(this).remove();
+ }
+ });
+ $('td.memItemLeft').each(function(){
+ if($(this).siblings('.memItemRight').html()=="") {
+ $(this).attr('colspan', 2);
+ $(this).siblings('.memItemRight').remove();
+ }
+ });
+ $('td.memTemplItemLeft').each(function(){
+ if($(this).siblings('.memTemplItemRight').html()=="") {
+ $(this).attr('colspan', 2);
+ $(this).siblings('.memTemplItemRight').remove();
+ }
+ });
+ searchBox.CloseResultsWindow();
});
diff --git a/doxygen/doxygen.config b/doxygen/doxygen.config
index 787b8738463..accfe4b16a2 100644
--- a/doxygen/doxygen.config
+++ b/doxygen/doxygen.config
@@ -1,4 +1,4 @@
-# Doxyfile 1.8.5
+# Doxyfile 1.9.1
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project.
@@ -17,11 +17,11 @@
# 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
@@ -46,10 +46,10 @@ PROJECT_NUMBER =
PROJECT_BRIEF = "Multi-purpose emulation framework"
-# With the PROJECT_LOGO tag one can specify an logo or 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.
+# 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.
PROJECT_LOGO =
@@ -60,7 +60,7 @@ PROJECT_LOGO =
OUTPUT_DIRECTORY = output-doc
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# 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
@@ -70,27 +70,45 @@ OUTPUT_DIRECTORY = output-doc
CREATE_SUBDIRS = NO
+# 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, Brazilian, Catalan, Chinese, Chinese-
-# Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, Farsi,
-# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en,
-# Korean, Korean-en, Latvian, Norwegian, Macedonian, Persian, Polish,
-# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish,
-# Turkish, Ukrainian and Vietnamese.
+# 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 doxygen will include brief member
+# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all generated output in the proper direction.
+# Possible values are: None, LTR, RTL and Context.
+# The default value is: None.
+
+OUTPUT_TEXT_DIRECTION = None
+
+# 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 doxygen will prepend the brief
+# 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
@@ -125,7 +143,7 @@ ALWAYS_DETAILED_SEC = YES
INLINE_INHERITED_MEMB = NO
-# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# 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.
@@ -169,6 +187,16 @@ SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = YES
+# 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.
+
+JAVADOC_BANNER = 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
@@ -189,15 +217,23 @@ QT_AUTOBRIEF = YES
MULTILINE_CPP_IS_BRIEF = NO
+# 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.
+
+PYTHON_DOCSTRING = YES
+
# 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.
INHERIT_DOCS = YES
-# 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.
+# 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.
SEPARATE_MEMBER_PAGES = NO
@@ -206,7 +242,7 @@ SEPARATE_MEMBER_PAGES = NO
# uses this value to replace tabs by spaces in code fragments.
# Minimum value: 1, maximum value: 16, default value: 4.
-TAB_SIZE = 2
+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:
@@ -216,16 +252,15 @@ TAB_SIZE = 2
# 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.
+# 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 =
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding "class=itcl::class"
-# will allow you to use the command class in the itcl::class meaning.
-
-TCL_SUBST =
-
# 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
@@ -254,25 +289,40 @@ OPTIMIZE_FOR_FORTRAN = NO
OPTIMIZE_OUTPUT_VHDL = NO
+# 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,
-# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. 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.
+# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
+# Csharp (C#), C, C++, 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: 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.
+# 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 = h=C++ inc=C++
# 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 http://daringfireball.net/projects/markdown/ for details.
+# 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.
@@ -280,10 +330,19 @@ EXTENSION_MAPPING = h=C++ inc=C++
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 by putting a % sign in front of the word
-# or globally by setting AUTOLINK_SUPPORT to NO.
+# 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
@@ -305,7 +364,7 @@ BUILTIN_STL_SUPPORT = YES
CPP_CLI_SUPPORT = NO
# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
-# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# 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.
@@ -323,13 +382,20 @@ SIP_SUPPORT = NO
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
+# 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
+# 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
@@ -384,11 +450,24 @@ TYPEDEF_HIDES_STRUCT = NO
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 efficively 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
+# 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.
@@ -398,35 +477,41 @@ LOOKUP_CACHE_SIZE = 0
EXTRACT_ALL = NO
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# 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_PACKAGE tag is set to YES all members with package or internal
+# 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
+# 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
+# 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 = YES
-# This flag is only useful for Objective-C code. When set to YES local methods,
+# 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 in the documentation. If set to NO, only methods in the interface are
# included.
# The default value is: NO.
@@ -441,6 +526,13 @@ EXTRACT_LOCAL_METHODS = NO
EXTRACT_ANON_NSPACES = NO
+# 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
@@ -451,21 +543,21 @@ 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 these classes will be included in the various overviews. This option has
-# no effect if EXTRACT_ALL is enabled.
+# 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 these declarations will be
-# included in the documentation.
+# 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 these
+# 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.
@@ -478,28 +570,49 @@ HIDE_IN_BODY_DOCS = 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 = NO
# 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
+# 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 = YES
+# 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_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 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.
@@ -514,14 +627,15 @@ INLINE_INFO = YES
# 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.
+# name. If set to NO, the members will appear in declaration order.
# The default value is: YES.
SORT_MEMBER_DOCS = NO
# 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.
+# 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
@@ -565,27 +679,25 @@ SORT_BY_SCOPE_NAME = 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 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
+# 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 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.
@@ -610,8 +722,8 @@ ENABLED_SECTIONS =
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 list
-# will mention the files that were used to generate the documentation.
+# 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
@@ -656,11 +768,10 @@ 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 http://en.wikipedia.org/wiki/BibTeX for more info.
+# 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. Do not use file names with spaces, bibtex cannot handle them. See
-# also \cite for info how to create references.
+# search path. See also \cite for info how to create references.
CITE_BIB_FILES =
@@ -676,7 +787,7 @@ CITE_BIB_FILES =
QUIET = NO
# 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
+# 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.
@@ -684,7 +795,7 @@ QUIET = NO
WARNINGS = YES
-# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# 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.
@@ -701,12 +812,22 @@ WARN_IF_DOC_ERROR = 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 or incomplete parameter
-# documentation, but not about the absence of documentation.
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation. If
+# EXTRACT_ALL is set to YES then this flag will automatically be disabled.
# The default value is: NO.
WARN_NO_PARAMDOC = NO
+# 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
@@ -730,7 +851,7 @@ WARN_LOGFILE =
# 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.
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
# Note: If this tag is empty the current directory is searched.
INPUT = doxygen/README.md src/emu src/osd src/lib
@@ -738,22 +859,31 @@ INPUT = doxygen/README.md src/emu src/osd src/lib
# 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: http://www.gnu.org/software/libiconv) for the list of
-# possible encodings.
+# 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 patterns (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, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
-# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
-# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
-# *.qsf, *.as and *.js.
+# *.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++, *.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 = *.h *.cpp *.mm *.md
+FILE_PATTERNS = *.h *.cpp *.ipp *.mm *.md
# The RECURSIVE tag can be used to specify whether or not subdirectories should
# be searched for input files as well.
@@ -808,7 +938,7 @@ EXAMPLE_PATH =
# *.h) to filter out the source-files in the directories. If left blank all
# files are included.
-EXAMPLE_PATTERNS =
+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
@@ -837,6 +967,10 @@ IMAGE_PATH =
# 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 =
@@ -846,11 +980,15 @@ INPUT_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 =
# 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
+# 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.
@@ -898,7 +1036,7 @@ INLINE_SOURCES = NO
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.
+# entity all documented functions referencing it will be listed.
# The default value is: NO.
REFERENCED_BY_RELATION = NO
@@ -910,7 +1048,7 @@ REFERENCED_BY_RELATION = NO
REFERENCES_RELATION = NO
# 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
+# 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.
@@ -930,12 +1068,12 @@ 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 http://www.gnu.org/software/global/global.html). You will need version
+# (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 config file
+# - 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
#
@@ -968,13 +1106,6 @@ VERBATIM_HEADERS = NO
ALPHABETICAL_INDEX = YES
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX = 1
-
# 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
@@ -987,7 +1118,7 @@ IGNORE_PREFIX =
# Configuration options related to the HTML output
#---------------------------------------------------------------------------
-# If the GENERATE_HTML tag is set to YES 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
@@ -1049,13 +1180,15 @@ HTML_FOOTER = doxygen/footer.html
HTML_STYLESHEET =
-# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
-# defined cascading style sheet that is included after the standard style sheets
+# 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 therefor more robust against future updates.
-# Doxygen will copy the style sheet file to the output directory. For an example
-# see the documentation.
+# 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 = doxygen/style.css
@@ -1071,9 +1204,9 @@ HTML_EXTRA_STYLESHEET = doxygen/style.css
HTML_EXTRA_FILES = doxygen/doxy-boot.js
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
-# will adjust the colors in the stylesheet and background images according to
+# will adjust the colors in the style sheet and background images according to
# this color. Hue is specified as an angle on a colorwheel, see
-# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 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.
@@ -1102,12 +1235,24 @@ 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 NO can help when comparing the output of multiple runs.
-# The default value is: YES.
+# 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 = YES
+# 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.
@@ -1131,13 +1276,14 @@ 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: http://developer.apple.com/tools/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
+# 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 http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
+# 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.
@@ -1176,8 +1322,8 @@ 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
-# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
+# (see:
+# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows.
#
# 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
@@ -1199,28 +1345,29 @@ GENERATE_HTMLHELP = NO
CHM_FILE =
# 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
+# 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 =
-# 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
-# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# 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.
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.
+# 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.
@@ -1251,7 +1398,8 @@ 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: http://qt-project.org/doc/qt-4.8/qthelpproject.html#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.
@@ -1259,8 +1407,8 @@ 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: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
-# folders).
+# 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.
@@ -1268,30 +1416,30 @@ 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: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
+# 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: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
+# 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:
-# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# 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 of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
+# 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 =
@@ -1333,7 +1481,7 @@ DISABLE_INDEX = NO
# 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 stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
# further fine-tune the look of the index. 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
@@ -1361,13 +1509,24 @@ ENUM_VALUES_PER_LINE = 4
TREEVIEW_WIDTH = 250
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# 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
@@ -1375,9 +1534,9 @@ EXT_LINKS_IN_WINDOW = NO
# Minimum value: 8, maximum value: 50, default value: 10.
# This tag requires that the tag GENERATE_HTML is set to YES.
-FORMULA_FONTSIZE = 12
+FORMULA_FONTSIZE = 10
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# 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.
#
@@ -1388,9 +1547,15 @@ FORMULA_FONTSIZE = 12
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
-# http://www.mathjax.org) which uses client side Javascript for the rendering
-# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# 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.
@@ -1401,7 +1566,7 @@ USE_MATHJAX = YES
# When MathJax is enabled you can set the default output format to be used for
# the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details.
# Possible values are: HTML-CSS (which is slower, but has the best
# compatibility), NativeMML (i.e. MathML) and SVG.
# The default value is: HTML-CSS.
@@ -1416,11 +1581,11 @@ MATHJAX_FORMAT = HTML-CSS
# 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 http://www.mathjax.org before deployment.
-# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# MathJax from https://www.mathjax.org before deployment.
+# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2.
# This tag requires that the tag USE_MATHJAX is set to YES.
-MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2
# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
# extension names that should be enabled during MathJax rendering. For example
@@ -1431,7 +1596,8 @@ 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/latest/output.html) for more details. For an
+# (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.
@@ -1459,12 +1625,12 @@ MATHJAX_CODEFILE =
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 flavours 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.
+# 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.
@@ -1476,9 +1642,10 @@ SERVER_BASED_SEARCH = NO
# 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
+# Doxygen ships with an example indexer (doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/).
+# Xapian (see:
+# https://xapian.org/).
#
# See the section "External Indexing and Searching" for details.
# The default value is: NO.
@@ -1489,10 +1656,11 @@ EXTERNAL_SEARCH = NO
# 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
+# Doxygen ships with an example indexer (doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/). See the section "External Indexing and
-# Searching" for details.
+# 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 =
@@ -1527,7 +1695,7 @@ EXTRA_SEARCH_MAPPINGS =
# Configuration options related to the LaTeX output
#---------------------------------------------------------------------------
-# If the GENERATE_LATEX tag is set to YES 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 = NO
@@ -1543,22 +1711,36 @@ LATEX_OUTPUT = latex
# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
# invoked.
#
-# Note that when enabling USE_PDFLATEX this option is only used for generating
-# bitmaps for formulas in the HTML output, but not in the Makefile that is
-# written to the output directory.
-# The default file is: latex.
+# 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 = latex
+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.
MAKEINDEX_CMD_NAME = makeindex
-# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# 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.
+
+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.
# The default value is: NO.
@@ -1576,9 +1758,12 @@ COMPACT_LATEX = NO
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. To get the times font for
-# instance you can specify
-# EXTRA_PACKAGES=times
+# 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.
@@ -1592,23 +1777,36 @@ EXTRA_PACKAGES =
#
# Note: Only use a user-defined header if you know what you are doing! The
# following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
-# replace them by respectively the title of the page, the current date and time,
-# only the current date, the version number of doxygen, the project name (see
-# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_HEADER =
# The LATEX_FOOTER tag can be used to specify a personal 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.
+# 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.
#
# 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
@@ -1626,9 +1824,11 @@ LATEX_EXTRA_FILES =
PDF_HYPERLINKS = YES
-# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES to get a
-# higher quality PDF documentation.
+# 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.
@@ -1662,17 +1862,33 @@ LATEX_SOURCE_CODE = NO
# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
# bibliography, e.g. plainnat, or ieeetr. See
-# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# 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.
LATEX_BIB_STYLE = plain
+# 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_TIMESTAMP = NO
+
+# 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_EMOJI_DIRECTORY =
+
#---------------------------------------------------------------------------
# Configuration options related to the RTF output
#---------------------------------------------------------------------------
-# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# 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.
@@ -1687,7 +1903,7 @@ GENERATE_RTF = NO
RTF_OUTPUT = rtf
-# If the COMPACT_RTF tag is set to YES doxygen generates more compact 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.
# The default value is: NO.
@@ -1707,9 +1923,9 @@ COMPACT_RTF = NO
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 replacements,
-# missing definitions are set to their default value.
+# 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.
@@ -1718,17 +1934,27 @@ RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE =
# Set optional variables used in the generation of an RTF document. Syntax is
-# similar to doxygen's config file. A template extensions file can be generated
-# using doxygen -e rtf extensionFile.
+# 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 =
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE = NO
+
#---------------------------------------------------------------------------
# Configuration options related to the man page output
#---------------------------------------------------------------------------
-# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
# classes and files.
# The default value is: NO.
@@ -1752,6 +1978,13 @@ MAN_OUTPUT = man
MAN_EXTENSION = .3
+# 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
@@ -1765,7 +1998,7 @@ MAN_LINKS = NO
# Configuration options related to the XML output
#---------------------------------------------------------------------------
-# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# 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.
@@ -1779,7 +2012,7 @@ GENERATE_XML = NO
XML_OUTPUT = xml
-# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# 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.
@@ -1788,11 +2021,18 @@ XML_OUTPUT = xml
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
+
#---------------------------------------------------------------------------
# Configuration options related to the DOCBOOK output
#---------------------------------------------------------------------------
-# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook 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.
@@ -1806,23 +2046,58 @@ GENERATE_DOCBOOK = NO
DOCBOOK_OUTPUT = docbook
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
#---------------------------------------------------------------------------
# Configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
-# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
-# Definitions (see http://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 Sqlite3 output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_SQLITE3 tag is set to YES doxygen will generate a Sqlite3
+# database with symbols found by doxygen stored in tables.
+# The default value is: NO.
+
+GENERATE_SQLITE3 = NO
+
+# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database 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: sqlite3.
+# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
+
+SQLITE3_OUTPUT = sqlite3
+
+# The SQLITE3_OVERWRITE_DB tag is set to YES, the existing doxygen_sqlite3.db
+# database file will be recreated with each doxygen run. If set to NO, doxygen
+# will warn if an a database file is already found and not modify it.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
+
+SQLITE3_RECREATE_DB = YES
+
+#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
#---------------------------------------------------------------------------
-# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# 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.
@@ -1830,7 +2105,7 @@ GENERATE_AUTOGEN_DEF = NO
GENERATE_PERLMOD = NO
-# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# 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.
@@ -1838,9 +2113,9 @@ GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# 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
+# 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.
@@ -1860,14 +2135,14 @@ PERLMOD_MAKEVAR_PREFIX =
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
-# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# 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 only conditional compilation will be
+# 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.
@@ -1883,7 +2158,7 @@ MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = YES
-# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# 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.
@@ -1925,9 +2200,9 @@ PREDEFINED = DOXYGEN_GENERATED Q_REVISION
EXPAND_AS_DEFINED = ABL_DECLTYPE_RETURN
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
-# remove all refrences 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
+# 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.
@@ -1947,7 +2222,7 @@ SKIP_FUNCTION_MACROS = YES
# 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 an unique name (where the name does NOT include
+# 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.
@@ -1959,37 +2234,32 @@ TAGFILES =
GENERATE_TAGFILE = output-doc/mame.tag
-# 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.
+# 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
+# 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
-# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# 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.
EXTERNAL_PAGES = YES
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of 'which perl').
-# The default file (with absolute path) is: /usr/bin/perl.
-
-PERL_PATH = /usr/bin/perl
-
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
-# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# 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
@@ -1998,16 +2268,14 @@ PERL_PATH = /usr/bin/perl
CLASS_DIAGRAMS = YES
-# 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
+# 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.
@@ -2032,7 +2300,7 @@ HAVE_DOT = NO
DOT_NUM_THREADS = 0
-# When you want a differently looking font n the dot files that doxygen
+# 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
@@ -2080,7 +2348,7 @@ COLLABORATION_GRAPH = NO
GROUP_GRAPHS = YES
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# 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.
@@ -2097,10 +2365,32 @@ UML_LOOK = NO
# 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 HAVE_DOT is set to YES.
+# 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.
@@ -2132,7 +2422,8 @@ INCLUDED_BY_GRAPH = YES
#
# 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.
+# 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.
@@ -2143,7 +2434,8 @@ CALL_GRAPH = NO
#
# 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.
+# 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.
@@ -2166,11 +2458,15 @@ GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot.
+# 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 and svg.
+# 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.
@@ -2207,6 +2503,30 @@ DOTFILE_DIRS =
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 =
+
+# 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.
+
+PLANTUML_JAR_PATH =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+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
@@ -2243,7 +2563,7 @@ MAX_DOT_GRAPH_DEPTH = 0
DOT_TRANSPARENT = NO
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# 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.
@@ -2260,9 +2580,11 @@ DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
-# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# 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 and
+# plantuml temporary files.
# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
DOT_CLEANUP = YES
diff --git a/doxygen/footer.html b/doxygen/footer.html
index 0af5c1d455f..95f254cb1f1 100644
--- a/doxygen/footer.html
+++ b/doxygen/footer.html
@@ -1,6 +1,5 @@
<!-- HTML footer for doxygen 1.8.8-->
<!-- start footer part -->
-
<!--BEGIN GENERATE_TREEVIEW-->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
@@ -12,6 +11,10 @@
</div>
<!--END GENERATE_TREEVIEW-->
</div>
+</div>
+</div>
+</div>
+</div>
<!--BEGIN !GENERATE_TREEVIEW-->
<hr class="footer"/><address class="footer"><small>
$generatedby &#160;<a href="http://www.doxygen.org/index.html">
diff --git a/doxygen/header.html b/doxygen/header.html
index 6d4327e691e..fbee4bb77da 100644
--- a/doxygen/header.html
+++ b/doxygen/header.html
@@ -10,7 +10,6 @@
<meta name="generator" content="Doxygen $doxygenversion"/>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
- <script type="text/javascript" src="http://stevenbenner.github.io/jquery-powertip/scripts/jquery.powertip.js"></script>
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
@@ -18,29 +17,26 @@
<script type="text/javascript" src="$relpath^dynsections.js"></script>
$treeview
$search
-
+ $mathjax
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
-
- <link rel="stylesheet" href="http://bootswatch.com/journal/bootstrap.min.css">
+ $extrastylesheet
+ <link href='https://fonts.googleapis.com/css?family=Roboto+Slab' rel='stylesheet' type='text/css'>
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
<script type="text/javascript" src="$relpath^doxy-boot.js"></script>
-
- $extrastylesheet
-
</head>
- <body>
+ <body>
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
- <span class="navbar-brand">$projectname $projectnumber</span>
- </div>
- <div class="navbar-header">
- <span class="navbar-brand brief">$projectbrief</span>
+ <a class="navbar-brand">$projectname $projectnumber</a>
</div>
</div>
</nav>
-
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div class="content" id="content">
-
+ <div class="container">
+ <div class="row">
+ <div class="col-sm-12 panel " style="padding-bottom: 15px;">
+ <div style="margin-bottom: 15px;">
<!-- end header part -->
diff --git a/doxygen/style.css b/doxygen/style.css
index 91bc8ebb9a2..423b17fac31 100644
--- a/doxygen/style.css
+++ b/doxygen/style.css
@@ -100,21 +100,23 @@ h1, .h1, h2, .h2, h3, .h3{
font-weight: 200 !important;
}
-#navrow1 {
- border-bottom: 2px solid #EEEEEE;
-}
-
-#navrow2, #navrow3, #navrow4, #navrow5 {
- border-bottom: 0px solid #EEEEEE;
+#navrow1, #navrow2, #navrow3, #navrow4, #navrow5{
+ border-bottom: 1px solid #EEEEEE;
}
.adjust-right {
- margin-left: 30px !important;
- font-size: 1.15em !important;
+margin-left: 30px !important;
+font-size: 1.15em !important;
}
.navbar{
- border: 0px solid #222 !important;
+ border: 0px solid #222 !important;
+}
+table{
+ white-space:pre-wrap !important;
}
+/*
+ ===========================
+ */
/* Sticky footer styles
@@ -231,35 +233,32 @@ pre.fragment {
margin: 4px 8px 4px 2px;
overflow: auto;
word-wrap: break-word;
+ font-size: 9pt;
line-height: 125%;
font-family: monospace, fixed;
font-size: 105%;
}
div.fragment {
- margin: 8px 8px 8px 8px;
- border: 0px solid #C4CFE5;
- background-color: #F6F7F8;
- box-shadow: none;
- padding: 15px;
- padding-bottom: 10px;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ border: 1px solid #C4CFE5;
}
div.line {
- font-family: monospace, fixed;
- font-size: 15px;
- min-height: 20px;
+ font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
+ font-size: 12px;
+ min-height: 13px;
line-height: 1.0;
text-wrap: unrestricted;
white-space: -moz-pre-wrap; /* Moz */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
white-space: pre-wrap; /* CSS3 */
- word-wrap: break-word; /* IE 5.5+ */
+ word-wrap: normal; /* IE 5.5+ */
text-indent: -53px;
padding-left: 53px;
padding-bottom: 0px;
- vertical-align: middle;
margin: 0px;
-webkit-transition-property: background-color, box-shadow;
-webkit-transition-duration: 0.5s;
@@ -272,6 +271,9 @@ div.line {
transition-property: background-color, box-shadow;
transition-duration: 0.5s;
}
+div.line:hover{
+ background-color: #FBFF00;
+}
div.line.glow {
background-color: cyan;
@@ -280,18 +282,23 @@ div.line.glow {
span.lineno {
- padding-right: 5px;
+ padding-right: 4px;
text-align: right;
- border-right: 2px solid #adc;
- background-color: transparent;
+ color:rgba(0,0,0,0.3);
+ border-right: 1px solid #EEE;
+ border-left: 1px solid #EEE;
+ background-color: #FFF;
white-space: pre;
+ font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace ;
}
span.lineno a {
- background-color: #eee;
+ background-color: #FAFAFA;
+ cursor:pointer;
}
span.lineno a:hover {
- background-color: #C8C8C8;
+ background-color: #EFE200;
+ color: #1e1e1e;
}
div.groupHeader {
@@ -358,10 +365,104 @@ blockquote {
padding: 0 12px 0 16px;
}
-div.summary {
- float: right;
- font-size: 8pt;
- padding-right: 5px;
- width: 80%;
- text-align: right;
+/*---------------- Search Box */
+
+#search-box {
+ margin: 10px 0px;
+}
+#search-box .close {
+ display: none;
+ position: absolute;
+ right: 0px;
+ padding: 6px 12px;
+ z-index: 5;
+}
+
+/*---------------- Search results window */
+
+#search-results-window {
+ display: none;
+}
+
+iframe#MSearchResults {
+ width: 100%;
+ height: 15em;
+}
+
+.SRChildren {
+ padding-left: 3ex; padding-bottom: .5em
+}
+.SRPage .SRChildren {
+ display: none;
+}
+a.SRScope {
+ display: block;
+}
+a.SRSymbol:focus, a.SRSymbol:active,
+a.SRScope:focus, a.SRScope:active {
+ text-decoration: underline;
+}
+span.SRScope {
+ padding-left: 4px;
+}
+.SRResult {
+ display: none;
+}
+
+/* class and file list */
+.directory .icona,
+.directory .arrow {
+ height: auto;
+}
+.directory .icona .icon {
+ height: 16px;
+}
+.directory .icondoc {
+ background-position: 0px 0px;
+ height: 20px;
+}
+.directory .iconfopen {
+ background-position: 0px 0px;
+}
+.directory td.entry {
+ padding: 7px 8px 6px 8px;
+}
+
+.table > tbody > tr > td.memSeparator {
+ line-height: 0;
+ .table-hover;
+
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: normal;
+}
+
+/* enumerations */
+.panel-body thead > tr {
+ background-color: #e0e0e0;
+}
+
+/* todo lists */
+.todoname,
+.todoname a {
+ font-weight: bold;
+}
+
+/* Class title */
+.summary {
+ margin-top: 25px;
+}
+.page-header {
+ margin: 20px 0px !important;
+}
+.page-header .title {
+ display: inline-block;
+}
+.page-header .pull-right {
+ margin-top: 0.3em;
+ margin-left: 0.5em;
+}
+.page-header .label {
+ font-size: 50%;
}
diff --git a/hash/adam_cart.xml b/hash/adam_cart.xml
index 1d670f77739..bad9bdea96b 100644
--- a/hash/adam_cart.xml
+++ b/hash/adam_cart.xml
@@ -5,7 +5,8 @@ license:CC0
-->
<softwarelist name="adam_cart" description="Coleco Adam cartridges">
- <!--software name="adamdev" supported="no">
+ <!--
+ software name="adamdev" supported="no">
<description>ADAM Dev (Prototype)</description>
<year>198?</year>
<publisher>Coleco?</publisher>
@@ -17,7 +18,8 @@ license:CC0
<rom name="51c9-chip4-12-6-84.bin" size="8192" crc="653ff925" sha1="0df057b7b1dcd969411abb1f084cb8354013103a" offset="0x6000" />
</dataarea>
</part>
- </software-->
+ </software>
+ -->
<software name="ard" supported="no">
<description>ADAM Resident Debugger (Prototype Rev20)</description>
diff --git a/hash/apple2_flop_clcracked.xml b/hash/apple2_flop_clcracked.xml
index 7033157fb44..8dd398fd687 100644
--- a/hash/apple2_flop_clcracked.xml
+++ b/hash/apple2_flop_clcracked.xml
@@ -16653,7 +16653,7 @@ license:CC0
</software>
<software name="mnymny84">
- <description>Money Money (Version 09.13.84) (cleanly cracked)</description>
+ <description>Money! Money! (Version 09.13.84) (cleanly cracked)</description>
<year>1983</year>
<publisher>Hartley Courseware</publisher>
<info name="release" value="2017-12-23"/>
@@ -16666,7 +16666,7 @@ license:CC0
</software>
<software name="mnymny87">
- <description>Money Money (Version 07.24.87) (cleanly cracked)</description>
+ <description>Money! Money! (Version 07.24.87) (cleanly cracked)</description>
<year>1982</year>
<publisher>Hartley Courseware</publisher>
<info name="release" value="2017-04-21"/>
@@ -43092,4 +43092,305 @@ license:CC0
</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.-->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="computer drill and instruction - addition c (4am crack).dsk" size="143360" crc="bf859f12" sha1="a32092030c8bc66f71319b9e2f9350a406f111f3"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cdaidecc1">
+ <description>Computer Drill and Instruction: Decimals C-1 (cleanly cracked)</description>
+ <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.-->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="computer drill and instruction - decimals c-1 (4am crack).dsk" size="143360" crc="36702c67" sha1="af6d4273cc19b0ea40bb04972652a8fa4c5ad36b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cdaidivc">
+ <description>Computer Drill and Instruction: Division C (cleanly cracked)</description>
+ <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.-->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="computer drill and instruction - division c (4am crack).dsk" size="143360" crc="49bf476f" sha1="797fea0363fd70fd7f51058d48ea79f475eba2f3"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cdaifrcc1">
+ <description>Computer Drill and Instruction: Fractions C-1 (cleanly cracked)</description>
+ <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.-->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="computer drill and instruction - fractions c-1 (4am crack).dsk" size="143360" crc="0717fb58" sha1="4796d215b86912339feae2421cafebfe6515e1e1"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cdaimulc">
+ <description>Computer Drill and Instruction: Multiplication C (cleanly cracked)</description>
+ <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.-->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="computer drill and instruction - multiplication c (4am crack).dsk" size="143360" crc="cfd0d0ea" sha1="354c6cd98223e6cb7f882e07df1800321d8964ea"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cdaisubc">
+ <description>Computer Drill and Instruction: Subtraction C (cleanly cracked)</description>
+ <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.-->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="computer drill and instruction - subtraction c (4am crack).dsk" size="143360" crc="ada42116" sha1="876783903c8e4b78d47a8d65a57a4639cd26a033"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cdaiwnc">
+ <description>Computer Drill and Instruction: Whole Numbers C (cleanly cracked)</description>
+ <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.-->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="computer drill and instruction - whole numbers c (4am crack).dsk" size="143360" crc="6675c0c5" sha1="07fc79ab457d4e7bde9468fcbac5f9dfbf74314b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cdaitchu">
+ <description>Computer Drill and Instruction: Teacher Utilities (cleanly cracked)</description>
+ <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.-->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="computer drill and instruction - teacher utilities (4am crack).dsk" size="143360" crc="30238cd8" sha1="b9ae4e983134ac6c88c6c0b0499dbcd10991f178"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybgolf">
+ <description>Keyboard Golf (cleanly cracked)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="release" value="2021-07-24"/>
+ <!--"Keyboard Golf" is a 1981 sports game developed by Stuart Aronoff and distributed by Softsmith. 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="keyboard golf (softsmith) (4am and san inc crack) side a.dsk" size="143360" crc="649c131a" sha1="47eb07d2cb7ac399b649885828b68053bfd792d3"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="keyboard golf (softsmith) (4am and san inc crack) side b.dsk" size="143360" crc="b94e7b07" sha1="ccc7689f7f8a3fe1e7edd3497157b1a4dc74535c"/>
+ </dataarea>
+ </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.-->
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="willy byte in the digital dimension (4am crack) side a.dsk" size="143360" crc="91be8df7" sha1="e417f2941f4eeb48c951f3d26b3480d6e9048030"/>
+ </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="willy byte in the digital dimension (4am crack) side b - boot.dsk" size="143360" crc="8e14f1ea" sha1="5699302848d6b62bf34f048811e4de81c1128857"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="memmyth">
+ <description>Memory Myth (cleanly cracked)</description>
+ <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.-->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="memory myth (4am crack).dsk" size="143360" crc="2154579c" sha1="bdab7bed6f9b84a4ccb7e183cc950cd56ff16841"/>
+ </dataarea>
+ </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="medsst0883">
+ <description>Medalist Series: States (Version 08.09.83) (cleanly cracked)</description>
+ <year>1983</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="release" value="2021-08-13"/>
+ <!--"Medalist Series: States" is a 1983 educational program developed and distributed by Hartley Courseware. This version is dated 08.09.83. It is preserved here for the first time.-->
+
+ <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"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mnymny0983">
+ <description>Money! Money! (Version 09.19.83) (cleanly cracked)</description>
+ <year>1983</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="release" value="2021-08-13"/>
+ <!--"Money! Money!" 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="money money v09.19.83 (4am crack).dsk" size="143360" crc="a5e8bd1a" sha1="b8b86e8253bf986e4ad7e7ec92f5c404c07d6910"/>
+ </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>
+
</softwarelist>
diff --git a/hash/apple2_flop_orig.xml b/hash/apple2_flop_orig.xml
index 9c8588afd7d..4dae0c08cb8 100644
--- a/hash/apple2_flop_orig.xml
+++ b/hash/apple2_flop_orig.xml
@@ -17147,7 +17147,7 @@ license:CC0
<info name="release" value="2021-07-15"/>
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS"/>
<!-- It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card. -->
- <!--"Alge-Blaster Plus!" is a 1989 educational program developed by Julie Baumgartner, Anne Hertz, David Ely, and Louis X. Savain, and distributed by Davidson &amp; 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.-->
+ <!--"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">
@@ -17172,4 +17172,299 @@ license:CC0
</part>
</software>
+ <software name="retdino">
+ <description>Return of the Dinosaurs (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>American Educational Computer</publisher>
+ <info name="release" value="2021-07-20"/>
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS"/>
+ <!-- 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">
+ <rom name="return of the dinosaurs 800k.woz" size="1328970" crc="43773390" sha1="b6a6257cb9988576f0eb89daa523cc54258c4280"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswrtrpl">
+ <description>Bank Street Writer Plus (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>Broderbund Software</publisher>
+ <info name="release" value="2021-07-25"/>
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card. -->
+ <!--"Bank Street Writer Plus" is a 1989 productivity program developed by Gordon Riggs and distributed by Broderbund 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="1296171">
+ <rom name="bank street writer plus 800k.woz" size="1296171" crc="f0e20be8" sha1="d0cf9e33a4606728c297440a314a560ecff40b7a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dsgnrail">
+ <description>Design Your Own Railroad (Version 1.1C) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Abracadata</publisher>
+ <info name="release" value="2021-07-25"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- 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">
+ <rom name="design your own railroad 800k.woz" size="1296197" crc="b17c981e" sha1="9394d710e3b55e767e2022353ab4ceb7d126887d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="35grmrgm">
+ <description>Grammar Gremlins (Version 05.01.87) (800K 3.5")</description>
+ <year>1987</year>
+ <publisher>Davidson and Associates</publisher>
+ <info name="release" value="2021-07-25"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires an Apple IIgs, Apple //c+, or an Apple //e or 64K Apple ][+ and a compatible drive controller card. -->
+ <!--"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="bglwrt32">
+ <description>BeagleWrite (Version 3.2) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>Beagle Bros.</publisher>
+ <info name="release" value="2021-07-25"/>
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS"/>
+ <!-- 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="1296192">
+ <rom name="beaglewrite 800k.woz" size="1296192" crc="a9910ae5" sha1="8f8e054eef1eaddc7a38b642de0933835fb18297"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dyohint35">
+ <description>Design Your Own Home: Interior Design (Version 2) (800K 3.5")</description>
+ <year>1986</year>
+ <publisher>Abracadata</publisher>
+ <info name="release" value="2021-07-25"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- 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="1328959">
+ <rom name="design your own home- interior design 800k.woz" size="1328959" crc="f7439230" sha1="fdd1d5d537f5a54ffa49a5a2e9364722af8df346"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wllybyte">
+ <description>Willy Byte in the Digital Dimension</description>
+ <year>1984</year>
+ <publisher>Data Trek</publisher>
+ <info name="release" value="2021-07-27"/>
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- 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 II with 48K.-->
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="228163">
+ <rom name="willy byte in the digital dimension side a.woz" size="228163" crc="2c59a3a6" sha1="ec6cfdf85cb5496020d6b9ee918850b0cdd37c2f"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Boot disk"/>
+ <dataarea name="flop" size="234819">
+ <rom name="willy byte in the digital dimension side b - boot.woz" size="234819" crc="95305acc" sha1="9fb6d5b6f6595a1b7764ca4b2a7ee92d269455ce"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcaricr35v1">
+ <description>Arithmetic Critters (Version 1.0) (800K 3.5")</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="release" value="2021-08-06"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires an Apple IIgs, Apple //c+, Apple //e or 64K Apple ][+ with a compatible drive controller card. -->
+ <!--"Arithmetic Critters" is a 1986 educational program developed 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+, Apple //e or 64K Apple ][+ with a compatible drive controller card.-->
+
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345309">
+ <rom name="arithmetic critters 800k.woz" size="1345309" crc="c0d3ee81" sha1="e5eeb26b7695df448cfc007631dcabd948e49205"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="clckwrks">
+ <description>Clock Works (Version 1.0) (800K 3.5")</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="release" value="2021-08-09"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires an Apple IIgs, Apple //c+, Apple //e or 64K Apple ][+ with a compatible drive controller card. -->
+ <!--"Clock Works" is a 1986 educational program developed 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+, Apple //e or 64K Apple ][+ with a compatible drive controller card.-->
+
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345301">
+ <rom name="clock works 800k.woz" size="1345301" crc="f96310d8" sha1="22a4dc3e58b2b2af8ef3d255bfc5f9cb8b68a373"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bckydbrd35">
+ <description>Backyard Birds (Version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="release" value="2021-08-09"/>
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card. -->
+ <!--"Backyard Birds" is a 1989 educational program developed by Hassan Kaganda, John Persoon, Larry Phenow, Diane Portner, and James L. Thompson, 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="1345385">
+ <rom name="backyard birds 800k.woz" size="1345385" crc="983f4369" sha1="1a96d62aa167fe3193dbe4be2b1461e3ec23c750"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcchembe35">
+ <description>Chemistry: Balancing Equations (Version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="release" value="2021-08-09"/>
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card. -->
+ <!--"Chemistry: Balancing Equations" is a 1990 educational program developed by Beth Bell, Gene Breault, Scott Jensen, and Elizabeth Wendland, 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="1296232">
+ <rom name="chemistry- balancing equations 800k.woz" size="1296232" crc="741bcaa4" sha1="93f7dc5c6b6b9737628bcbd540918aee4ec7e746"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="clnwtdet35">
+ <description>Cleanwater Detectives (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="release" value="2021-08-09"/>
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card. -->
+ <!--"Cleanwater Detectives" is a 1991 educational program developed by Vincent J. Erickson, John Ojanen, and Diane Portner, 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="1345366">
+ <rom name="cleanwater detectives 800k.woz" size="1345366" crc="051bbdd2" sha1="64306906c5ea53e08c80f86d56eb1840e15f0277"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cirmth35">
+ <description>Circus Math (Version 1.0) (800K 3.5")</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="release" value="2021-08-10"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires an Apple IIgs, Apple //c+, Apple //e, or 64K Apple ][+ with a compatible drive controller card. -->
+ <!--"Circus Math" 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. 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="1345309">
+ <rom name="circus math 800k.woz" size="1345309" crc="e676033e" sha1="f12e92bd54cbfb5bfb37181b8106031fb1a43feb"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vcrc1135">
+ <description>VCR Companion (Version 1.1) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>Broderbund Software</publisher>
+ <info name="release" value="2021-08-10"/>
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card. -->
+ <!--"VCR Companion" is a 1988 graphics program developed by Louis Ewens and Lauren Elliott, and distributed by Broderbund 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="carbld35">
+ <description>Car Builder (800K 3.5")</description>
+ <year>1985</year>
+ <publisher>Optimum Resource</publisher>
+ <info name="release" value="2021-08-10"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires an Apple IIgs, Apple //c+, Apple //e, or 64K Apple ][+ with a compatible drive controller card. -->
+ <!--"Car Builder" is a 1985 educational program developed by Richard Hefter and David Cunningham, and distributed by Optimum Resource. 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="1297213">
+ <rom name="car builder 800k.woz" size="1297213" crc="8d78c9a0" sha1="05a0f9e0e3d0d7be1c0a978e1314cc604b3d52cc"/>
+ </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="release" value="2021-08-11"/>
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card. -->
+ <!--"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="release" value="2021-08-11"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires a 48K Apple II+ or later. -->
+ <!--"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="release" value="2021-08-16"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires an Apple IIgs, Apple //c+, Apple //e, or 64K Apple ][+ with a compatible drive controller card. -->
+ <!--"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>
+
</softwarelist>
diff --git a/hash/apple2gs_flop_orig.xml b/hash/apple2gs_flop_orig.xml
index c19f0ea84fe..57c4fc3107e 100644
--- a/hash/apple2gs_flop_orig.xml
+++ b/hash/apple2gs_flop_orig.xml
@@ -3313,4 +3313,111 @@ license:CC0
</part>
</software>
+ <software name="rrbit23">
+ <description>Reader Rabbit (Version 2.3)</description>
+ <year>1987</year>
+ <publisher>The Learning Company</publisher>
+ <info name="release" value="2021-07-25"/>
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- 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. This is version 2.3. It requires a 256K Apple IIgs.-->
+
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296165">
+ <rom name="reader rabbit iigs.woz" size="1296165" crc="fc417d0a" sha1="5d6c7179955c227182a5e48f0f1ef16de8b710e5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="madlibs">
+ <description>Mad Libs (Version 1.0)</description>
+ <year>1987</year>
+ <publisher>First Byte</publisher>
+ <info name="release" value="2021-07-25"/>
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- It requires a 512K Apple IIgs. -->
+ <!--"Mad Libs" is a 1987 educational program developed and distributed by First Byte. This is version 1.0. It requires a 512K Apple IIgs.-->
+
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1328903">
+ <rom name="mad libs iigs.woz" size="1328903" crc="91007135" sha1="73eba5eb4cb6b0b99d04c6b8aa9790ccb866b2d4"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tarabn">
+ <description>Tales From The Arabian Nights</description>
+ <year>1988</year>
+ <publisher>Unicorn Software</publisher>
+ <info name="release" value="2021-07-26"/>
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- It requires a 768K Apple IIgs. -->
+ <!--"Tales From The Arabian Nights" is a 1988 educational program developed by Stanley Brewster and June Stark, and distributed by Unicorn Software. It requires a 768K Apple IIgs.-->
+
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="1296716">
+ <rom name="tales from the arabian nights iigs - disk 1.woz" size="1296716" crc="551d0a16" sha1="b446d573570b7686a76ce7071122dd68dcfce86b"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="1296204">
+ <rom name="tales from the arabian nights iigs - disk 2.woz" size="1296204" crc="06407198" sha1="9c8cf68514acfa818ce6e1807e5cfa05f40d8eb2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rdarama">
+ <description>Read-A-Rama</description>
+ <year>1989</year>
+ <publisher>Unicorn Software</publisher>
+ <info name="release" value="2021-07-26"/>
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- It requires a 1MB Apple IIgs. -->
+ <!--"Read-A-Rama" is a 1989 educational program developed by Stan Brewster and Joseph Hewitt, and distributed by Unicorn Software. It requires a 1MB Apple IIgs.-->
+
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Boot disk"/>
+ <dataarea name="flop" size="1296719">
+ <rom name="read-a-rama iigs - disk 1 - boot disk.woz" size="1296719" crc="e430df4a" sha1="96dba78e27ab06de97117a27542c3ce211a7bd44"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Level 1"/>
+ <dataarea name="flop" size="1296205">
+ <rom name="read-a-rama iigs - disk 2 - level 1.woz" size="1296205" crc="9b23b421" sha1="0fc3c37883a2358c7644785eaa7488184d431558"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 3 - Level 2"/>
+ <dataarea name="flop" size="1296216">
+ <rom name="read-a-rama iigs - disk 3 - level 2.woz" size="1296216" crc="7420be24" sha1="1bb82fc0da0c56c291fda9c19213659123fde543"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="readnme">
+ <description>Reading and Me (Version 1.0)</description>
+ <year>1988</year>
+ <publisher>Davidson and Associates</publisher>
+ <info name="release" value="2021-07-25"/>
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- 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 and Associates. This is version 1.0. It requires a 512K Apple IIgs.-->
+
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Program disk"/>
+ <dataarea name="flop" size="1328940">
+ <rom name="reading and me iigs - disk 1 - program.woz" size="1328940" crc="598bd916" sha1="aeff5dc46e4175b69702fd393eea6fc3d95f089c"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Data disk"/>
+ <dataarea name="flop" size="1312556">
+ <rom name="reading and me iigs - disk 2 - data.woz" size="1312556" crc="8c0d3e1f" sha1="ba53651eed2bd0393b8d83390555825302b9bba5"/>
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/apxen_flop.xml b/hash/apxen_flop.xml
new file mode 100644
index 00000000000..cfd9b7d2676
--- /dev/null
+++ b/hash/apxen_flop.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<!--
+license:CC0
+-->
+
+<softwarelist name="apxen_flop" description="ACT Apricot XEN floppy disks">
+
+ <!-- MS-DOS 3.2 / BIOS 1.9.0 -->
+ <!-- Unknown if this is anything official -->
+ <software name="xenboot">
+ <description>XEN Boot Disk MS-DOS 3.2 BIOS 1.9.0 and Utilities</description>
+ <year>1987</year>
+ <publisher>ACT</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="668733">
+ <rom name="xenboot.dsk" size="668733" crc="d4333892" sha1="296ef0a4af096834a5d7d71eb1378786d3e1ed4a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- Unknown if this is anything official -->
+ <software name="diag">
+ <description>Various Diags, XEEROM</description>
+ <year>1986</year>
+ <publisher>ACT</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="705879">
+ <rom name="diag.dsk" size="705879" crc="9d48118f" sha1="2ba690bcc443fd1b02d5eb3017ea12d6172c6985"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- Copy protection on XEEROM.COM removed -->
+ <software name="diag_cr">
+ <description>Various Diags, XEEROM (cracked)</description>
+ <year>1986</year>
+ <publisher>ACT</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="705879">
+ <rom name="diag.dsk" size="705879" crc="e3a6ed93" sha1="9bff5f338c321c29416c89c1680cf69dccb58856"/>
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/arb.xml b/hash/arb.xml
index 8baf18687b3..7441470af7b 100644
--- a/hash/arb.xml
+++ b/hash/arb.xml
@@ -22,6 +22,21 @@ license:CC0
</part>
</software>
+ <software name="avelan">
+ <description>Avelan</description>
+ <year>198?</year>
+ <publisher>AVE Micro Systems</publisher>
+ <part name="cart" interface="arb">
+ <feature name="altboard" value="1" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="avelan.bin" offset="0x4000" size="0x1000" crc="01e713d1" sha1="a32e22de4d32fd0a97f8be6b5bc33d0c558aa323" />
+ <rom offset="0x5000" size="0x1000" loadflag="reload" />
+ <rom offset="0x6000" size="0x1000" loadflag="reload" />
+ <rom offset="0x7000" size="0x1000" loadflag="reload" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="gms40">
<description>Grand Master Series 4.0</description>
<year>1984</year>
diff --git a/hash/cd32.xml b/hash/cd32.xml
index 1b37e25d547..8db63de2626 100644
--- a/hash/cd32.xml
+++ b/hash/cd32.xml
@@ -1751,20 +1751,19 @@ license:CC0
</software>
<!-- http://redump.org/disc/3366/ -->
- <!--
- <software name="suprfrog" supported="no">
- <description>Superfrog (Rev 1)</description>
- <year>1999</year>
- <publisher>Islona</publisher>
- <info name="barcode" value="5 022358 170384" />
- <info name="disc_matrix" value="FD7989 THAMESDOWN 01793 421300 ZFS1" />
- <part name="cdrom" interface="cd32_cdrom">
- <diskarea name="cdrom">
- <disk name="superfrog (europe) (rev 1)" sha1=""/>
- </diskarea>
- </part>
+ <!-- Listed as possible bad dump on redump.org -->
+ <software name="suprfrog1" supported="no">
+ <description>Superfrog (Rev 1)</description>
+ <year>1999</year>
+ <publisher>Islona</publisher>
+ <info name="barcode" value="5 022358 170384" />
+ <info name="disc_matrix" value="FD7989 THAMESDOWN 01793 421300 ZFS1" />
+ <part name="cdrom" interface="cd32_cdrom">
+ <diskarea name="cdrom">
+ <disk name="superfrog (europe) (rev 1)" sha1="4295e7e97d90f3709cad9361841942a3f09866c8" status="baddump"/>
+ </diskarea>
+ </part>
</software>
- -->
<!-- http://redump.org/disc/3434/ -->
<software name="surfninj" supported="no">
diff --git a/hash/coco_flop.xml b/hash/coco_flop.xml
index 4aa48581f9a..fc34855575e 100644
--- a/hash/coco_flop.xml
+++ b/hash/coco_flop.xml
@@ -66,6 +66,21 @@ license:CC0
</part>
</software>
+ <!-- coco3 only requires 512Kb, run best with a 6309? - coco3h driver) -->
+ <software name="joust" supported ="partial">
+ <description>Joust (6809 Transcoded - v1.10) (512kb)</description>
+ <year>2021</year>
+ <publisher>Glen Hewlett</publisher>
+ <info name="author" value="Glen Hewlett" />
+ <info name="usage" value="RUN&quot;JOUST&quot;" />
+ <sharedfeat name="compatibility" value="COCO3" />
+ <part name="flop0" interface="floppy_5_25">
+ <dataarea name="flop" size="161280">
+ <rom name="joust.dsk" size="161280" crc="5a2437c0" sha1="72b3b88eef1f61cba8d43ed6a828a773c4c703f8"/>
+ </dataarea>
+ </part>
+ </software>
+
<!-- This begins the Rainbow On Disk archives. Rainbow Magazine was a TRS-80
Color Computer-focused magazine published in the USA that received
worldwide distribution. For an additional fee, you could receive a
diff --git a/hash/easy_karaoke_cart.xml b/hash/easy_karaoke_cart.xml
index cf483e3b4b5..0eea6e2cdc6 100644
--- a/hash/easy_karaoke_cart.xml
+++ b/hash/easy_karaoke_cart.xml
@@ -33,4 +33,18 @@ license:CC0
</part>
</software>
+ <software name="ekmh2" supported="no">
+ <description>Mega Hits Vol.2</description>
+ <year>2004</year>
+ <publisher>IVL Technologies</publisher>
+ <part name="cart" interface="easy_karaoke_cart">
+ <dataarea name="rom" size="0x80000">
+ <rom name="29lv040.u4" size="0x80000" crc="3affd9b1" sha1="658f35d664779041d445e085f8bbcf2301dac3e8" />
+ </dataarea>
+ <dataarea name="mcu" size="0x2000"> <!-- XTAL: 24DBBJK3 -->
+ <rom name="IC89LV52A-24PQ.U1" size="0x2000" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/fm7_cass.xml b/hash/fm7_cass.xml
index 9e0f48bf684..d00b0488762 100644
--- a/hash/fm7_cass.xml
+++ b/hash/fm7_cass.xml
@@ -142,7 +142,7 @@ Titles, serial #s, publishers and release dates taken from:
</dataarea>
</part>
</software>
-
+
<software name="biotek">
<description>Biotek</description>
<year>1983</year>
@@ -156,7 +156,7 @@ Titles, serial #s, publishers and release dates taken from:
</dataarea>
</part>
</software>
-
+
<software name="blckonyx">
<description>The Black Onyx</description>
<year>1985</year>
@@ -604,7 +604,7 @@ Titles, serial #s, publishers and release dates taken from:
</dataarea>
</part>
</software>
-
+
<software name="elevgame">
<description>Elevator Game</description>
<year>19??</year>
@@ -616,7 +616,7 @@ Titles, serial #s, publishers and release dates taken from:
</dataarea>
</part>
</software>
-
+
<software name="enterprs">
<description>Enterprise</description>
<year>1983</year>
@@ -2480,7 +2480,7 @@ Titles, serial #s, publishers and release dates taken from:
</dataarea>
</part>
</software>
-
+
<software name="zaiko">
<description>Zaiko Kanri</description>
<year>1981</year>
diff --git a/hash/ibm5170.xml b/hash/ibm5170.xml
index 0ab9d5f8572..c131c19a398 100644
--- a/hash/ibm5170.xml
+++ b/hash/ibm5170.xml
@@ -16848,6 +16848,23 @@ license:CC0
</part>
</software>
+ <software name="sinkswim">
+ <description>Sink or Swim</description>
+ <year>1993</year>
+ <publisher>Zeppelin Games</publisher>
+ <info name="developer" value="Adventuresoft" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="Sink or Swim [Zeppelin] [1993] [3.5HD] [Disk 1 of 2].img" size="1474560" crc="c7e68995" sha1="cd16f38c42dfb952f75990293f565a561d7c228f"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="Sink or Swim [Zeppelin] [1993] [3.5HD] [Disk 2 of 2].img" size="1474560" crc="1d58b046" sha1="a35ad9ddd11b149e0c36b664cbc90ab949a77ab7"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="sleepwalker">
<description>Sleepwalker</description>
<year>1993</year>
@@ -17348,35 +17365,69 @@ license:CC0
<description>Star Wars - X-Wing - Space Combat Simulator</description>
<year>1993</year>
<publisher>LucasArts</publisher>
+ <info name="version" value="Version 1.0" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1474560">
+ <rom name="X-wing [LucasArts] [1993] [3.5HD] [Disk 1 of 5].img" size="1474560" crc="74b332c7" sha1="84f7d9934516350d10ff395d2521332681f9f673"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size="1474560">
+ <rom name="X-wing [LucasArts] [1993] [3.5HD] [Disk 2 of 5].img" size="1474560" crc="dcea06c0" sha1="ee0ca56f0971840011ebb9dfc49d215cbda36cec"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <dataarea name="flop" size="1474560">
+ <rom name="X-wing [LucasArts] [1993] [3.5HD] [Disk 3 of 5].img" size="1474560" crc="6e07ebc1" sha1="2282d5b478b28181cbfe88223301076fcfcfa3e6"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <dataarea name="flop" size="1474560">
+ <rom name="X-wing [LucasArts] [1993] [3.5HD] [Disk 4 of 5].img" size="1474560" crc="5aeca402" sha1="bd2269f36cebc89c59901a56ed3ec32695aae6ca"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <dataarea name="flop" size="1474560">
+ <rom name="X-wing [LucasArts] [1993] [3.5HD] [Disk 5 of 5].img" size="1474560" crc="bd2d8f46" sha1="80e364378c191600ba05beff6ae73a4c90465de6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- The game is the same as the parent, only the readme file is translated to german -->
+ <software name="swxwingde" cloneof="swxwing">
+ <description>Star Wars - X-Wing - Space Combat Simulator (Germany)</description>
+ <year>1993</year>
+ <publisher>LucasArts</publisher>
+ <info name="version" value="Version 1.0" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1474560">
- <rom name="disk1.img" size="1474560" crc="8e8f9d0b" sha1="c98d3d8560f9d6ef9f8052f75928b4e2a93164e7"/>
+ <rom name="X-wing (Germany) [LucasArts] [1993] [3.5HD] [Disk 1 of 5].img" size="1474560" crc="9d74e6c4" sha1="e6c010aad3c90efe009b2a98b5651689d9e35e58"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
<dataarea name="flop" size="1474560">
- <rom name="disk2.img" size="1474560" crc="adb091f3" sha1="5b6be2f738b21aea59a089c8e7d5bda852d6f5af"/>
+ <rom name="X-wing (Germany) [LucasArts] [1993] [3.5HD] [Disk 2 of 5].img" size="1474560" crc="dcea06c0" sha1="ee0ca56f0971840011ebb9dfc49d215cbda36cec"/>
</dataarea>
</part>
<part name="flop3" interface="floppy_3_5">
<dataarea name="flop" size="1474560">
- <rom name="disk3.img" size="1474560" crc="9d516d11" sha1="c7c1cf18af49153aec0f14cbb8df32db33c150db"/>
+ <rom name="X-wing (Germany) [LucasArts] [1993] [3.5HD] [Disk 3 of 5].img" size="1474560" crc="6e07ebc1" sha1="2282d5b478b28181cbfe88223301076fcfcfa3e6"/>
</dataarea>
</part>
<part name="flop4" interface="floppy_3_5">
<dataarea name="flop" size="1474560">
- <rom name="disk4.img" size="1474560" crc="5981f879" sha1="85dc83fecdb8b754c8d10c8579e0e644435eb7be"/>
+ <rom name="X-wing (Germany) [LucasArts] [1993] [3.5HD] [Disk 4 of 5].img" size="1474560" crc="5aeca402" sha1="bd2269f36cebc89c59901a56ed3ec32695aae6ca"/>
</dataarea>
</part>
<part name="flop5" interface="floppy_3_5">
<dataarea name="flop" size="1474560">
- <rom name="disk5.img" size="1474560" crc="3af204de" sha1="8984ca008b4948b1c9066c9314f6c0e80c085fe4"/>
+ <rom name="X-wing (Germany) [LucasArts] [1993] [3.5HD] [Disk 5 of 5].img" size="1474560" crc="bd2d8f46" sha1="80e364378c191600ba05beff6ae73a4c90465de6"/>
</dataarea>
</part>
</software>
<software name="swxwingbw" cloneof="swxwing">
- <description>Star Wars - X-Wing B-Wing Expansion</description>
+ <description>Star Wars - X-Wing: B-Wing Expansion</description>
<year>1993</year>
<publisher>LucasArts</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -17387,13 +17438,13 @@ license:CC0
</software>
<software name="swxwingip" cloneof="swxwing">
- <!-- Was once Virus Infected -->
- <description>Star Wars - X-Wing Imperial Pursuit</description>
+ <description>Star Wars - X-Wing: Imperial Pursuit</description>
<year>1993</year>
<publisher>LucasArts</publisher>
+ <info name="version" value="Version 1.1" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1474560">
- <rom name="xwing.img" size="1474560" crc="34eebdb6" sha1="fcee862c9b2460aed9cbf3b46657ad4e4eff5dcd" status="baddump" />
+ <rom name="X-Wing Imperial Pursuit [LucasArts] [1994] [3.5HD] [Disk 1 of 1].img" size="1474560" crc="8ac9c001" sha1="31a7ad14658f78e11b331831cc6c0c32fc2bce96"/>
</dataarea>
</part>
</software>
@@ -17923,6 +17974,29 @@ license:CC0
</part>
</software>
+ <software name="wallrome">
+ <description>Walls of Rome</description>
+ <year>1993</year>
+ <publisher>Mindcraft</publisher>
+ <info name="developer" value="Mindcraft" />
+ <info name="version" value="v1.00 Nov 02 1993" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1474560">
+ <rom name="Walls of Rome [Mindcraft] [1993] [3.5HD] [Disk 1 of 3].img" size="1474560" crc="38d8b24b" sha1="4e92e80951791eb2ef41ff7312cc0e883dd54b24"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="Walls of Rome [Mindcraft] [1993] [3.5HD] [Disk 2 of 3].img" size="1474560" crc="a55b7d3f" sha1="26d6282640ff4341458a1a176f5f04bec4c169cd"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="Walls of Rome [Mindcraft] [1993] [3.5HD] [Disk 3 of 3].img" size="1474560" crc="def7ebcd" sha1="571297248e7ba6f13c33b74ddab33b3849df3020"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="warcraft">
<!-- Dumped via Kryoflux from original disks, all tracks show as modified -->
<description>WarCraft - Orcs &amp; Humans</description>
diff --git a/hash/ibm5170_cdrom.xml b/hash/ibm5170_cdrom.xml
index 8106567894f..f5d48a16cfe 100644
--- a/hash/ibm5170_cdrom.xml
+++ b/hash/ibm5170_cdrom.xml
@@ -698,6 +698,23 @@ license:CC0
</part>
</software>
+ <!-- DOS -->
+ <!-- Created from original media. size="1386496" crc="8B00FD46" sha1="5E85EAECDDBBD0D91B01F315F2E040247E36FA5A" -->
+ <!-- Originally released on two PC Booter 5.25" floppies and one 3.5" PC Booter floppy. Reprinted on CD by -->
+ <!-- GT Interactive as a standalone release, and as part of "Arcade Favorites CD-Rom 5 Pak. -->
+ <!-- Game can be run straight from the CD." -->
+ <software name="bad_dudescd">
+ <description>Bad Dudes (1995 CD release)</description>
+ <year>1995</year>
+ <publisher>GT Interactive</publisher>
+
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="bad_dudes_cd" sha1="97d6a57218a1ffaf50f7d89071e21d784855381c" />
+ </diskarea>
+ </part>
+ </software>
+
<!-- Windows 3.1 -->
<!-- Disc label Bad_mojo_uk -->
<!-- TODO: weird installer, missing graphics? -->
@@ -2105,6 +2122,22 @@ license:CC0
</part>
</software>
+ <!-- DOS -->
+ <!-- Created from original media. size="1239040" crc="A9510DC8" sha1="609D186B01197D971D0C1A20DC8954F79DAC80D9" -->
+ <!-- Originally released on two 5.25" floppies. Reprinted on CD by GT Interactive as a standalone release, -->
+ <!-- and as part of "Arcade Favorites CD-Rom 5 Pak. Game can be run straight from the CD." -->
+ <software name="heavybarrelcd">
+ <description>Heavy Barrel (1995 CD release)</description>
+ <year>1995</year>
+ <publisher>GT Interactive</publisher>
+
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="heavybarrel_cd" sha1="0d6ea927d897d36f71d49950ccb805e807b92857" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="ironbld">
<description>Iron Blood</description>
<year>1996</year>
@@ -2239,6 +2272,22 @@ license:CC0
</part>
</software>
+ <!-- DOS -->
+ <!-- Created from original media. size="931840" crc="25324098" sha1="15C4E7C307CCFC972A73C7C309E4104579D41287" -->
+ <!-- Originally released on PC Booter 5.25" floppies. Reprinted on CD by GT Interactive as a standalone release, -->
+ <!-- and as part of "Arcade Favorites CD-Rom 5 Pak. Game can be run straight from the CD." -->
+ <software name="karnovcd">
+ <description>Karnov (1995 CD release)</description>
+ <year>1995</year>
+ <publisher>GT Interactive</publisher>
+
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="karnov_cd" sha1="6fb90bf33a608b855b917c8dfe94c900b10c47a9" />
+ </diskarea>
+ </part>
+ </software>
+
<!-- Windows 3.1 -->
<software name="letlaw">
<description>Buichi Terasawa's Takeru - Letter of the Law</description>
@@ -2397,6 +2446,23 @@ license:CC0
</part>
</software>
+ <!-- DOS -->
+ <!-- Created from an ISO. size="6352896" crc="DCEEEB82" sha1="EA7BE8CB7E91FB97C590D23AEDFA371DC98CF5C0" -->
+ <!-- Originally released on 3.5" and 5.25" floppies. Reprinted on CD by GT Interactive and included in -->
+ <!-- "Arcade Favorites CD-Rom 5 Pak." Game can be run straight from the CD or installed to a hard drive. -->
+ <software name="pipemaniacd">
+ <description>Pipe Mania (1995 CD release)</description>
+ <year>1995</year>
+ <publisher>GT Interactive</publisher>
+ <info name="alt_title" value="Pipe Dream" />
+
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="pipemaniacd" sha1="be7d5677f92a9820b5114980f70ab153f9e9b7b7" />
+ </diskarea>
+ </part>
+ </software>
+
<!-- Windows 3.x -->
<!-- TODO: 256 colors shifting issue, sound is too slow? -->
<software name="plumber" supported="partial">
@@ -2666,6 +2732,21 @@ license:CC0
</part>
</software>
+ <!-- DOS -->
+ <!-- Created from original media. size="1230848" crc="71FF88DB" sha1="5AA5CB751B6236892CF74AB37A8A7E3953E866E0" -->
+ <!-- Originally released on one PC Booter 5.25" floppy disk. Reprinted on CD by GT Interactive as a -->
+ <!-- standalone release, and as part of "Arcade Favorites CD-Rom 5 Pak. Game can be run straight from the CD." -->
+ <software name="tagteamcd">
+ <description>Tag Team Wrestling (1995 CD release)</description>
+ <year>1995</year>
+ <publisher>GT Interactive</publisher>
+
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="tagteam_cd" sha1="33eaebcca48c8a4382dc3ac87e346e393f47b2d8" />
+ </diskarea>
+ </part>
+ </software>
<software name="turricn2">
<description>Turrican II - The Final Fight</description>
diff --git a/hash/jazz.xml b/hash/jazz.xml
index cff0333cc36..8974804877b 100644
--- a/hash/jazz.xml
+++ b/hash/jazz.xml
@@ -13,7 +13,7 @@ license:CC0
<part name="hdd" interface="scsi_hdd">
<diskarea name="harddriv">
- <disk name="jazz_winnt31" sha1="5d556b4df2dccdc681095fedcf836a5b0a7782a0" writeable="yes" />
+ <disk name="jazz_winnt31" sha1="" writeable="yes" status="nodump" />
</diskarea>
</part>
</software>
diff --git a/hash/k28m2.xml b/hash/k28m2.xml
index 81b7798c541..64c1d8076d6 100644
--- a/hash/k28m2.xml
+++ b/hash/k28m2.xml
@@ -62,7 +62,7 @@ license:CC0
<info name="serial" value="CM62218"/>
<part name="cart" interface="k28m2">
<dataarea name="rom" size="0x4000">
- <rom name="cm62218.vsm" size="0x4000" crc="x" sha1="x" />
+ <rom name="cm62218.vsm" size="0x4000" crc="" sha1="" status="nodump" />
</dataarea>
</part>
</software>
diff --git a/hash/megadriv.xml b/hash/megadriv.xml
index 938c77c8957..ead262b5833 100644
--- a/hash/megadriv.xml
+++ b/hash/megadriv.xml
@@ -19198,8 +19198,8 @@ but dumps still have to be confirmed.
<dataarea name="rom" width="16" endianness="big" size="1048576">
<rom name="mega turrican (may 18, 1993 prototype).bin" size="1048576" crc="3ba35acd" sha1="486fd963b1389806a565dab21c81c46c273c8e5f"/>
<!-- labels on 512K 27C040s:
- <rom name="megaturrican odd" size="524288" crc="" sha1="" offset="0x000001" loadflag="load16_byte"/>
- <rom name="megaturrican even" size="524288" crc="" sha1="" offset="0x000000" loadflag="load16_byte"/>
+ <rom name="megaturrican odd" size="524288" crc="b24e7a97" sha1="37039c6d7e86c859ab8e09c3c1b9f76020806654" offset="0x000000" loadflag="load16_byte"/>
+ <rom name="megaturrican even" size="524288" crc="5575b737" sha1="e33960471e50beff20320b0e40115aa872452c3c" offset="0x000001" loadflag="load16_byte"/>
-->
</dataarea>
</part>
@@ -31412,7 +31412,7 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<!-- dumps which need ad hoc handlers to be installed in the emulator -->
-<!-- This cart is missing the higher bank containing Dragon Ball game -->
+ <!-- This cart is missing the higher bank containing Dragon Ball game -->
<software name="12in1">
<description>12 in 1 (Incomplete Dump)</description>
<year>199?</year>
@@ -31497,7 +31497,7 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</part>
</software>
- <!-- // this contains only the first bank, so most of the games are missing -->
+ <!-- This contains only the first bank, so most of the games are missing -->
<software name="golden10" supported="partial">
<description>Golden 10 in 1 (Incomplete Dump)</description>
<year>199?</year>
@@ -31710,14 +31710,16 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</part>
</software>
+
+ <!-- This dump is incomplete and is missing the entire second half -->
<software name="s19in1" supported="partial">
<description>Super 19 in 1 (Pirate)</description>
<year>199?</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_mcpir"/>
- <dataarea name="rom" width="16" endianness="big" size="4194304">
- <rom name="super 19-in-1 (pirate).bin" size="4194304" crc="0ad2b342" sha1="e1c041ba69da087c428dcda16850159f3caebd4b" offset="00000"/>
+ <dataarea name="rom" width="16" endianness="big" size="2097152">
+ <rom name="super 19-in-1 (pirate).bin" size="2097152" crc="52224f30" sha1="b4c822f8a36083b282cec7c6353ce6bcbc063972" offset="00000" status="baddump"/>
</dataarea>
</part>
</software>
diff --git a/hash/msx1_cart.xml b/hash/msx1_cart.xml
index 1e5a09bf6a2..e95237e2c12 100644
--- a/hash/msx1_cart.xml
+++ b/hash/msx1_cart.xml
@@ -1012,7 +1012,7 @@ kept for now until finding out what those bytes affect...
<feature name="slot" value="ascii8" />
<feature name="mapper" value="M60002-0125SP" />
<dataarea name="rom" size="262144">
- <rom name="lh532045" size="262144" crc="" sha1="" offset="0" />
+ <rom name="lh532045" size="262144" crc="" sha1="" offset="0" status="nodump" />
</dataarea>
</part>
</software>
@@ -1045,7 +1045,7 @@ kept for now until finding out what those bytes affect...
<feature name="slot" value="ascii8" />
<feature name="mapper" value="LZ93A13" />
<dataarea name="rom" size="131072">
- <rom name="m5m27512p" size="131072" crc="" sha1="" offset="0" />
+ <rom name="m5m27512p" size="131072" crc="" sha1="" offset="0" status="nodump" />
</dataarea>
</part>
</software>
@@ -1062,8 +1062,8 @@ kept for now until finding out what those bytes affect...
<feature name="slot" value="ascii8" />
<feature name="mapper" value="LZ93A13" />
<dataarea name="rom" size="262144">
- <rom name="m5m27512p" size="131072" crc="" sha1="" offset="0" />
- <rom name="a27512zb" size="65536" crc="" sha1="" offset="0x20000" />
+ <rom name="m5m27512p" size="131072" crc="" sha1="" offset="0" status="nodump" />
+ <rom name="a27512zb" size="65536" crc="" sha1="" offset="0x20000" status="nodump" />
</dataarea>
</part>
</software>
diff --git a/hash/msx2_cart.xml b/hash/msx2_cart.xml
index 5a9e10567d8..1663109c866 100644
--- a/hash/msx2_cart.xml
+++ b/hash/msx2_cart.xml
@@ -755,10 +755,10 @@ LZ93A13 (32 pin) - 8KB banks
<feature name="mapper" value="M60002-0115FP" />
<feature name="sram" value="D4464C-20L" />
<dataarea name="rom" size="">
- <rom name="jr_mate_1_v1.0" size="131072" crc="" sha1="" offset="0" />
- <rom name="jr_mate_2_v1.0" size="131072" crc="" sha1="" offset="0x20000" />
+ <rom name="jr_mate_1_v1.0" size="131072" crc="" sha1="" offset="0" status="nodump" />
+ <rom name="jr_mate_2_v1.0" size="131072" crc="" sha1="" offset="0x20000" status="nodump" />
<!- Kanji rom ->
- <rom name="tc531000p-6616" size="131072" crc="" sha1="" offset="0x40000" />
+ <rom name="tc531000p-6616" size="131072" crc="" sha1="" offset="0x40000" status="nodump" />
</dataarea>
</part>
</software>
@@ -842,7 +842,7 @@ LZ93A13 (32 pin) - 8KB banks
<feature name="slot" value="ascii8" />
<feature name="mapper" value="NEOS MR6401" />
<dataarea name="rom" size="131072">
- <rom name="rp231024d" size="131072" crc="" sha1="" offset="0" />
+ <rom name="rp231024d" size="131072" crc="" sha1="" offset="0" status="nodump" />
</dataarea>
</part>
</software>
diff --git a/hash/n64.xml b/hash/n64.xml
index 5c61ef08dd8..77950c42bf9 100644
--- a/hash/n64.xml
+++ b/hash/n64.xml
@@ -14715,6 +14715,20 @@ clips onto the player's ear.
</part>
</software>
+ <!-- Unlicensed cart that allows playing Game Boy games on a Nintendo 64.
+ Two cart female sockets, one for the Game Boy game and the other for a genuine N64 game cart for bypassing the protection.
+ Hardware on the cart PCB: Two 29LE010 EEPROMs and a Datel custom LZ9FC17 GAL labeled as "Action Replay" -->
+ <software name="pwrflashe" supported="no">
+ <description>PowerFlash (Europe)</description>
+ <year>19??</year>
+ <publisher>Datel</publisher>
+ <part name="cart" interface="n64_cart">
+ <dataarea name="rom" size="262144">
+ <rom name="PowerFlash (Europe) (Unl).bin" size="262144" crc="0e15b8a4" sha1="22169ccc5be0d3bf481056f4a004ee6959e0409b" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="xplor64" supported="no">
<description>Xplorer 64 (Germany, v1.067)</description>
<year>19??</year>
diff --git a/hash/neogeo.xml b/hash/neogeo.xml
index a419a2f00ab..a3a820c29d7 100644
--- a/hash/neogeo.xml
+++ b/hash/neogeo.xml
@@ -1123,7 +1123,7 @@ license:CC0
<rom loadflag="load16_word_swap" name="019-p1.p1" offset="0x000000" size="0x080000" crc="a2de8445" sha1="893d7ae72b4644123469de143fa35fac1cbcd61e" /> <!-- TC534200 -->
</dataarea>
<dataarea name="mcu" size="0x1000">
- <!-- <rom name="hd6301v1p.com", 0x0000, 0x1000, NO_DUMP /> --> <!-- Hitachi HD6301V1 MCU -->
+ <!-- <rom name="hd6301v1p.com" offset="0x0000" size="0x1000" crc="" sha1="" status="nodump" /> --> <!-- Hitachi HD6301V1 MCU -->
</dataarea>
<dataarea name="fixed" size="0x040000">
<rom offset="0x000000" size="0x020000" name="019-s1.s1" crc="5fcdc0ed" sha1="86415077e7adc3ba6153eeb4fb0c62cf36e903fa" /> <!-- TC531000 -->
@@ -2107,7 +2107,7 @@ license:CC0
<rom loadflag="load16_word_swap" name="038-p2.p2" offset="0x080000" size="0x080000" crc="a5193e2f" sha1="96803480439e90da23cdca70d59ff519ee85beeb" /> <!-- TC534200 -->
</dataarea>
<dataarea name="mcu" size="0x1000">
- <!-- <rom name="hd6301v1p.hd6301v1", 0x0000, 0x1000, NO_DUMP /> --> <!-- Hitachi HD6301V1 MCU -->
+ <!-- <rom name="hd6301v1p.hd8301v1" offset="0x0000" size="0x1000" crc="" sha1="" status="nodump" /> --> <!-- Hitachi HD6301V1 MCU -->
</dataarea>
<dataarea name="fixed" size="0x040000">
<rom offset="0x000000" size="0x020000" name="038-s1.s1" crc="fff62ae3" sha1="6510a762ea41557a8938cbfc0557cd5921306061" /> <!-- TC531000 -->
diff --git a/hash/nes.xml b/hash/nes.xml
index 68e739842ed..909c1363771 100644
--- a/hash/nes.xml
+++ b/hash/nes.xml
@@ -16488,7 +16488,7 @@ license:CC0
</part>
</software>
- <software name="highway" cloneof="radracer">
+ <software name="highway" cloneof="radracer" supported="partial">
<description>Highway Star (Jpn)</description>
<year>1987</year>
<publisher>Square</publisher>
@@ -30442,7 +30442,7 @@ license:CC0
</part>
</software>
- <software name="radraceru" cloneof="radracer">
+ <software name="radraceru" cloneof="radracer" supported="partial">
<description>Rad Racer (USA)</description>
<year>1987</year>
<publisher>Nintendo</publisher>
@@ -30462,7 +30462,7 @@ license:CC0
</part>
</software>
- <software name="radracer">
+ <software name="radracer" supported="partial">
<description>Rad Racer (Euro)</description>
<year>1988</year>
<publisher>Nintendo</publisher>
@@ -50235,8 +50235,8 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
<info name="release" value="19880826"/>
<info name="alt_title" value="スーパーダイナミックス バドミントン"/>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="nrom" />
- <feature name="pcb" value="NES-NROM-256" />
+ <feature name="slot" value="cnrom" />
+ <feature name="pcb" value="HVC-CNROM" />
<feature name="mirroring" value="vertical" />
<dataarea name="prg" size="32768">
<rom name="0.prg" size="32768" crc="d0eda7ba" sha1="7ae0bb48c4cdd8b634a77af2a486634ff8a1fac4" offset="00000" status="baddump" />
@@ -51523,7 +51523,7 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
- <software name="maxi15ua" cloneof="maxi15" supported="no">
+ <software name="maxi15ua" cloneof="maxi15">
<description>Maxi 15 (USA)</description>
<year>1992</year>
<publisher>American Video Entertainment</publisher>
@@ -51540,7 +51540,7 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
- <software name="maxi15u" cloneof="maxi15" supported="no">
+ <software name="maxi15u" cloneof="maxi15">
<description>Maxi 15 (USA, v2.0)</description>
<year>1992</year>
<publisher>American Video Entertainment</publisher>
@@ -51557,7 +51557,7 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
- <software name="maxi15" supported="no">
+ <software name="maxi15">
<description>Maxi 15 (Aus)</description>
<year>1992</year>
<publisher>HES</publisher>
@@ -51669,7 +51669,110 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</software>
-<!-- J.Y. Company -->
+<!-- J.Y. Company (sorted by serial code) -->
+
+<!-- Different game set than earlier JY-001 -->
+ <software name="mc_4jy1">
+ <description>1994 Super HiK 4 in 1 (JY-001)</description>
+ <year>1994</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom0" />
+ <dataarea name="prg" size="524288">
+ <rom name="1994 super hik 4-in-1 (jy-001 rev1).prg" size="524288" crc="dbdfef5e" sha1="289a97175056bc5bff5c5c09635a450bda7058ad" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1994 super hik 4-in-1 (jy-001 rev1).chr" size="524288" crc="07f696d6" sha1="1b54c0cb154de77d3b351032887fe694cdfb51e3" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4jy1a">
+ <description>1993 Heroe Series 4 in 1 (JY-001)</description>
+ <year>1993</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom0" />
+ <dataarea name="prg" size="524288">
+ <rom name="1993 heroe series 4-in-1 (jy-001).prg" size="524288" crc="8e40296d" sha1="5d0b50d195f11a656f6d46c369bb3f60000ed085" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1993 heroe series 4-in-1 (jy-001).chr" size="524288" crc="1d88439b" sha1="6e7bbdbc468f36ab2e95361a5ae95de605dee1d7" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4jy2">
+ <description>1994 Super HiK 4 in 1 (JY-002)</description>
+ <year>1994</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom0" />
+ <dataarea name="prg" size="524288">
+ <rom name="1994 super hik 4-in-1 (jy-002).prg" size="524288" crc="fbc1ee6b" sha1="7c82449372191ac3b6cfa4cc72e53b860c9f635b" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1994 super hik 4-in-1 (jy-002).chr" size="524288" crc="86ce512c" sha1="9ecbfe926d9f74680c6dba1464f2e7388dc17de2" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4jy3">
+ <description>1994 Super HiK 4 in 1 (JY-003)</description>
+ <year>1994</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom0" />
+ <dataarea name="prg" size="524288">
+ <rom name="1994 super hik 4-in-1 (jy-003).prg" size="524288" crc="f6822fe5" sha1="81dcace66ae60a4fe4035bb8b2e7901a8b33170f" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1994 super hik 4-in-1 (jy-003).chr" size="524288" crc="cb00a07d" sha1="af2a4f72e0923ed2897efd0ca96fb79a0f242abd" status="baddump" />
+ </dataarea>
+ <!-- 8k WRAM on cartridge -->
+ <dataarea name="wram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_3jy7">
+ <description>1994 Super HiK 3 in 1 (JY-007)</description>
+ <year>1994</year>
+ <publisher>J.Y. Company</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="bmc_830832c" />
+ <dataarea name="prg" size="524288">
+ <rom name="1994 super hik 3-in-1 (jy-007).prg" size="524288" crc="f1e99930" sha1="7851a79f96af1849837bb53af5c07e00d737bf6b" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1994 super hik 3-in-1 (jy-007).chr" size="524288" crc="cfd16e34" sha1="b35b97d3858de0ce02a85768dcfd82effba21210" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4jy8">
+ <description>1995 Super HiK 4 in 1 (JY-008)</description>
+ <year>1995</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom0" />
+ <dataarea name="prg" size="524288">
+ <rom name="1995 super hik 4-in-1 (jy-008).prg" size="524288" crc="74a6176e" sha1="920e7a9a42b903b98c80166bc3dbf0aa50367709" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1995 super hik 4-in-1 (jy-008).chr" size="524288" crc="9127a998" sha1="1c607d8dab49b01e0b945f1ec4aa2af2f5f706d4" status="baddump" />
+ </dataarea>
+ <!-- 8k WRAM on cartridge, battery backed up -->
+ <dataarea name="bwram" size="8192">
+ <rom value="0x00" size="8192" offset="0" loadflag="fill" />
+ </dataarea>
+ </part>
+ </software>
<software name="mc_4jy9">
<description>1994 Ball 4 in 1 Series (JY-009)</description>
@@ -51686,6 +51789,22 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
+ <software name="mc_4jy13">
+ <description>Mario Series 4 in 1 (JY-013)</description>
+ <year>199?</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom0" />
+ <dataarea name="prg" size="524288">
+ <rom name="mario series 4-in-1 (jy-013).prg" size="524288" crc="4558acd5" sha1="86d99d13e813f19c792fac8802c15888739179d2" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="mario series 4-in-1 (jy-013).chr" size="524288" crc="c89f1e34" sha1="33debec38feca775d185c0cff578bcbdbe7c677b" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mc_4jy18">
<description>1996 Super HiK 4 in 1 (JY-018)</description>
<year>1996</year>
@@ -51731,6 +51850,256 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
+ <software name="mc_4jy23">
+ <description>1995 Super HiK 4 in 1 (JY-023)</description>
+ <year>1995</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom0" />
+ <dataarea name="prg" size="524288">
+ <rom name="1995 super hik 4-in-1 (jy-023).prg" size="524288" crc="cadebc3e" sha1="92024688aaa583c673801bc585c4d693458f4d78" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1995 super hik 4-in-1 (jy-023).chr" size="524288" crc="dcdab70a" sha1="6374b768f0ca35f7b69708df573e69a327871247" status="baddump" />
+ </dataarea>
+ <!-- 8k WRAM on cartridge -->
+ <dataarea name="wram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4jy24">
+ <description>1997 Super HiK 4 in 1 (JY-024)</description>
+ <year>1997</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom0" />
+ <dataarea name="prg" size="524288">
+ <rom name="1997 super hik 4-in-1 (jy-024 rev1).prg" size="524288" crc="cef38f6c" sha1="5aebb9e0bb157d3eaa53204607610c22e8bc2548" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1997 super hik 4-in-1 (jy-024 rev1).chr" size="524288" crc="4961a797" sha1="fe1e710c2d22c5480951e11f2326d2814521b358" status="baddump" />
+ </dataarea>
+ <!-- 8k WRAM on cartridge -->
+ <dataarea name="wram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4jy24a" cloneof="mc_4jy24">
+ <description>1995 Super HiK 4 in 1 (JY-024)</description>
+ <year>1995</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom0" />
+ <dataarea name="prg" size="524288">
+ <rom name="1995 super hik 4-in-1 (jy-024).prg" size="524288" crc="cef38f6c" sha1="5aebb9e0bb157d3eaa53204607610c22e8bc2548" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1995 super hik 4-in-1 (jy-024).chr" size="524288" crc="62327fda" sha1="91716488bb6a9626234df2f7359f86bc6b5c8cfd" status="baddump" />
+ </dataarea>
+ <!-- 8k WRAM on cartridge -->
+ <dataarea name="wram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4jy38">
+ <description>1995 Super HiK 4 in 1 (JY-038)</description>
+ <year>1995</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom0" />
+ <dataarea name="prg" size="524288">
+ <rom name="1995 super hik 4-in-1 (jy-038).prg" size="524288" crc="bd705234" sha1="499393d8bd79b3de5a2ada099fc9477a573cc6ef" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1995 super hik 4-in-1 (jy-038).chr" size="524288" crc="60f4b6b1" sha1="9bf65398797b3d02ef1c329ef44f5d1d404d1b9f" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4jy39">
+ <description>1995 Super HiK 4 in 1 (JY-039)</description>
+ <year>1995</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom2" />
+ <dataarea name="prg" size="524288">
+ <rom name="1995 super hik 4-in-1 (jy-039).prg" size="524288" crc="a32b698b" sha1="f12d34c330d0577aa560507d15c3083a885138fa" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="1048576">
+ <rom name="1995 super hik 4-in-1 (jy-039).chr" size="1048576" crc="dc8b5fbc" sha1="0cbefbc986b9ec9f231294004d2be32a3c75115f" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4jy40">
+ <description>1995 Super HiK 4 in 1 (JY-040)</description>
+ <year>1995</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom2" />
+ <dataarea name="prg" size="524288">
+ <rom name="1995 super hik 4-in-1 (jy-040).prg" size="524288" crc="677c6862" sha1="1f212b29ac4c7fa52eed6dbe4ef2ce62ed7e3bda" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="1048576">
+ <rom name="1995 super hik 4-in-1 (jy-040).chr" size="1048576" crc="dc6704ce" sha1="0aa69fb1cd5d9bdd8b4d6c8626dea7fd0fd869e1" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4jy43">
+ <description>1995 Super HiK 4 in 1 (JY-043)</description>
+ <year>1995</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom1" />
+ <dataarea name="prg" size="1048576">
+ <rom name="1995 super hik 4-in-1 (jy-043).prg" size="1048576" crc="a5d89dc1" sha1="cf238422714e35e86e6e2fa5dd3fc0a64230db6e" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1995 super hik 4-in-1 (jy-043).chr" size="524288" crc="5325e3ca" sha1="1521ab5918bc13a3989fc7e08cf76c2ce04a21ce" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+<!-- Different game set than earlier JY-047 -->
+ <software name="mc_4jy47">
+ <description>1997 Super HiK 4 in 1 (JY-047)</description>
+ <year>1997</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom0" />
+ <dataarea name="prg" size="524288">
+ <rom name="1997 super hik 4-in-1 (jy-047).prg" size="524288" crc="7a82a25c" sha1="f05a95eecd16073e82d5ec8e05c6cdf262025735" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1997 super hik 4-in-1 (jy-047).chr" size="524288" crc="4a6cb431" sha1="fcaa7266696e275b729690c67f8dc1d33fccd6c8" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4jy47a">
+ <description>1995 Super HiK 4 in 1 (JY-047)</description>
+ <year>1995</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom0" />
+ <dataarea name="prg" size="524288">
+ <rom name="1995 super hik 4-in-1 (jy-047 rev0).prg" size="524288" crc="113688e2" sha1="600e52f8a93cf3aa0bbb09e56bf570ad09d10184" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1995 super hik 4-in-1 (jy-047 rev0).chr" size="524288" crc="cb1a40b5" sha1="9dd3e05ec59efe91dfc465150d8420965714539a" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_8jy50">
+ <description>1995 Super 8 in 1 (JY-050)</description>
+ <year>1995</year>
+ <publisher>J.Y. Company</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="bmc_850437c" />
+ <dataarea name="prg" size="1048576">
+ <rom name="1995 super 8-in-1 (jy-050 rev0).prg" size="1048576" crc="626f9183" sha1="777416ba5fc2a535c30fb04ee27b65bdbb8d6ef7" status="baddump" />
+ </dataarea>
+ <!-- 8k VRAM on cartridge -->
+ <dataarea name="vram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4jy57">
+ <description>1996 Super HiK 4 in 1 (JY-057)</description>
+ <year>1996</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom2" />
+ <dataarea name="prg" size="524288">
+ <rom name="1996 super hik 4-in-1 (jy-057).prg" size="524288" crc="142184be" sha1="eec27f45ded5a7111e7b2d5ac8e0d33b0f6449cc" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="1048576">
+ <rom name="1996 super hik 4-in-1 (jy-057).chr" size="1048576" crc="9bf7f019" sha1="f5ed8782a1b1c7f33cb61fad174bd0a483748c12" status="baddump" />
+ </dataarea>
+ <!-- 8k WRAM on cartridge -->
+ <dataarea name="wram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4jy58">
+ <description>1996 Super HiK 4 in 1 (JY-058)</description>
+ <year>1996</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom2" />
+ <dataarea name="prg" size="524288">
+ <rom name="1996 super hik 4-in-1 (jy-058).prg" size="524288" crc="019a5cf7" sha1="ace2c8eada92bda13ca9bd3e3dc336648ebb28c7" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="1048576">
+ <rom name="1996 super hik 4-in-1 (jy-058).chr" size="1048576" crc="328168e5" sha1="9e457fbc8a784333be1dc88b68ceb2c6e832a0a2" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4jy72">
+ <description>1996 Super HiK 4 in 1 (JY-072)</description>
+ <year>1996</year>
+ <publisher>J.Y. Company</publisher>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="resettxrom0" />
+ <dataarea name="prg" size="524288">
+ <rom name="1996 super hik 4-in-1 (jy-072).prg" size="524288" crc="8b1f7c74" sha1="0987c7b4aaf4419605e71a65405c9fe7a1e98a04" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1996 super hik 4-in-1 (jy-072).chr" size="524288" crc="6369e559" sha1="ae52438a20d3d4da9cd999846b206c2f8f3799b7" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_8jy85">
+ <description>Super 8 in 1 Gold Card Series (JY-085)</description>
+ <year>1995</year>
+ <publisher>J.Y. Company</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="bmc_850437c" />
+ <dataarea name="prg" size="1048576">
+ <rom name="super 8-in-1 gold card series (jy-085).prg" size="1048576" crc="62ffe7d4" sha1="022728e75e1d76a1ae9053ff7a8e605824960709" status="baddump" />
+ </dataarea>
+ <!-- 8k VRAM on cartridge -->
+ <dataarea name="vram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_8jy86">
+ <description>Super 8 in 1 Gold Card Series (JY-086)</description>
+ <year>1995</year>
+ <publisher>J.Y. Company</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="bmc_850437c" />
+ <dataarea name="prg" size="1048576">
+ <rom name="super 8-in-1 gold card series (jy-086).prg" size="1048576" crc="a7e12742" sha1="30747477bfc17e84917cd84ea90be7ac7910f2c7" status="baddump" />
+ </dataarea>
+ <!-- 8k VRAM on cartridge -->
+ <dataarea name="vram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
<software name="mc_8j119">
<description>FC Genjin 8 in 1 (JY-119)</description>
<year>199?</year>
@@ -51746,6 +52115,96 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
+ <software name="mc_7j201">
+ <description>1997 Super 7 in 1 (JY-201)</description>
+ <year>1997</year>
+ <publisher>J.Y. Company</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="a88s1" />
+ <dataarea name="prg" size="524288">
+ <rom name="1997 super 7-in-1 (jy-201).prg" size="524288" crc="9cbd3e46" sha1="22fc415f12784577f001cc869099646fca44cb36" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1997 super 7-in-1 (jy-201).chr" size="524288" crc="2bd6a3b9" sha1="e05518cfc75c87a2ac1148c86459bcbfd9b8de0f" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_6j202">
+ <description>1997 Super 6 in 1 (JY-202)</description>
+ <year>1997</year>
+ <publisher>J.Y. Company</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="a88s1" />
+ <dataarea name="prg" size="524288">
+ <rom name="1997 super 6-in-1 (jy-202).prg" size="524288" crc="8e0fbb39" sha1="b39be158a396d5200593146348258835a603c647" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1997 super 6-in-1 (jy-202).chr" size="524288" crc="1d7fbd76" sha1="0507c7faf786760c9d23e69293f7a098dc429f67" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_7j203">
+ <description>1997 Super 7 in 1 (JY-203)</description>
+ <year>1997</year>
+ <publisher>J.Y. Company</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="a88s1" />
+ <dataarea name="prg" size="524288">
+ <rom name="1997 super 7-in-1 (jy-203).prg" size="524288" crc="e6f92fb4" sha1="7aaf73138354ee1ccc4820b4f7583fdeadcc85e3" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1997 super 7-in-1 (jy-203).chr" size="524288" crc="6a07ab58" sha1="7987431bf7f6cb2bf5d66243477ac719e1c2ea27" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_7j204">
+ <description>1997 Super 7 in 1 (JY-204)</description>
+ <year>1997</year>
+ <publisher>J.Y. Company</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="a88s1" />
+ <dataarea name="prg" size="524288">
+ <rom name="1997 super 7-in-1 (jy-204).prg" size="524288" crc="709fd021" sha1="75c7861c574187e866a41750fefc3207f4da3ab7" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1997 super 7-in-1 (jy-204).chr" size="524288" crc="b40d4712" sha1="6b2302f8f8e4798a242f7944976dacbb13bb00bb" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_7j205">
+ <description>1997 Super 7 in 1 (JY-205)</description>
+ <year>1997</year>
+ <publisher>J.Y. Company</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="a88s1" />
+ <dataarea name="prg" size="524288">
+ <rom name="1997 super 7-in-1 (jy-205).prg" size="524288" crc="469c347c" sha1="38743af3e494f33f0a974b8c8c8df901d93df226" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1997 super 7-in-1 (jy-205).chr" size="524288" crc="7adad667" sha1="c0d5719dd545af977cef7c425567207c2056954b" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_7j206">
+ <description>1997 Super 7 in 1 (JY-206)</description>
+ <year>1997</year>
+ <publisher>J.Y. Company</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="a88s1" />
+ <dataarea name="prg" size="524288">
+ <rom name="1997 super 7-in-1 (jy-206).prg" size="524288" crc="1ffec616" sha1="2e8c2d51fa28d460ce03620eac2b5de33bcb4215" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="1997 super 7-in-1 (jy-206).chr" size="524288" crc="02f10803" sha1="d8bc4e1fbbd14fc2279036df87bad148d2c27204" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
<!-- Sachen / Thin Chen (and clones) -->
@@ -53712,22 +54171,22 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</software>
<!-- Dump not available. Game is also in 9in1cal.
- <software name="supergun">
- <description>Super Gun (Asia)</description>
- <year>1992</year>
- <publisher>Caltron</publisher>
- <info name="serial" value="CN-12"/>
- <part name="cart" interface="nes_cart">
- <feature name="slot" value="ntdec_n715021" />
- <feature name="mirroring" value="horizontal" />
- <dataarea name="prg" size="65536">
- <rom name="prg.u1" size="65536" crc="" sha1="" status="nodump" />
- </dataarea>
- <dataarea name="chr" size="32768">
- <rom name="chr.u2" size="32768" crc="" sha1="" status="nodump" />
- </dataarea>
- </part>
- </software>
+ <software name="supergun">
+ <description>Super Gun (Asia)</description>
+ <year>1992</year>
+ <publisher>Caltron</publisher>
+ <info name="serial" value="CN-12"/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="ntdec_n715021" />
+ <feature name="mirroring" value="horizontal" />
+ <dataarea name="prg" size="65536">
+ <rom name="prg.u1" size="65536" crc="" sha1="" status="nodump" />
+ </dataarea>
+ <dataarea name="chr" size="32768">
+ <rom name="chr.u2" size="32768" crc="" sha1="" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
-->
<software name="destroyr">
@@ -61438,9 +61897,9 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
- <software name="2dkjb" supported="no">
+ <software name="2dkjb" supported="partial">
<description>2 in 1 - Donkey Kong &amp; Jungle Book</description>
- <year>19??</year>
+ <year>1997</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
<feature name="slot" value="jyc_b" />
@@ -61470,6 +61929,37 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
+<!-- Bomber Boy has two levels, 2-4 and 5-3, that are not completable due to programming errors. -->
+ <software name="2lkbb">
+ <description>2 in 1 - The Lion King &amp; Bomber Boy</description>
+ <year>199?</year>
+ <publisher>Super Games</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="8237" />
+ <dataarea name="prg" size="524288">
+ <rom name="2-in-1 - the lion king, bomber boy.prg" size="524288" crc="5039aca5" sha1="f0162e3788b6be5d46cd47af6f6ce0cd6c6514d0" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="2-in-1 - the lion king, bomber boy.chr" size="524288" crc="789c0478" sha1="deb9f0b9d3e3b57809be4044e1dbda31f0e24d9d" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="2mk67" supported="partial">
+ <description>2 in 1 - Mortal Kombat 6 &amp; Mortal Kombat 7</description>
+ <year>199?</year>
+ <publisher>Kasheng</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="nt639" />
+ <dataarea name="prg" size="262144">
+ <rom name="2-in-1 - mortal kombat 6 + 7 (nt-639).prg" size="262144" crc="e1e81430" sha1="4478cd97d34a1e5b7e0498851b36d6afa8172a76" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="2-in-1 - mortal kombat 6 + 7 (nt-639).chr" size="524288" crc="de87a98e" sha1="35ad99a2a3964be112d5a449f7208b52e6f476a3" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="2s5ej3" supported="no">
<description>2 in 1 - Sonic 5 + Earthworm Jim 3 (Asia)</description>
<year>19??</year>
@@ -61502,13 +61992,12 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
- <software name="sdance" supported="no">
+ <software name="sdance" supported="partial">
<description>Street Dance (Asia, Hacked?)</description>
- <year>19??</year>
+ <year>2000</year>
<publisher>Invent</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="nrom" />
- <feature name="pcb" value="NES-NROM-128" /> <!-- wrong PCB? -->
+ <feature name="slot" value="txrom" /> <!-- is this the right board? some songs don't play -->
<dataarea name="chr" size="262144">
<rom name="street dance (invent) (unl).chr" size="262144" crc="28cf7806" sha1="7332aa10ad616dbbf74e1e53bb204d431caa0c6f" offset="00000" status="baddump" />
</dataarea>
@@ -61534,7 +62023,7 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
-<!-- FIXME: which board should use this game?? -->
+<!-- FIXME: which board should this game use?? -->
<software name="2yudb" supported="no">
<description>2 in 1 - Yu Yu + Dragonball Z</description>
<year>19??</year>
@@ -62485,14 +62974,13 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
-<!-- FIXME: which board should use this game?? -->
- <software name="ejim2d" cloneof="ejim2" supported="no">
+<!-- This seems to be a slightly modified extract from Golden Card 6 in 1. -->
+ <software name="ejim2d" cloneof="ejim2">
<description>Earthworm Jim 2 (Asia, Hacked?)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="unknown" />
- <feature name="pcb" value="UNKNOWN" />
+ <feature name="slot" value="8237" />
<dataarea name="chr" size="262144">
<rom name="earth worm jim 2 (unl)[no memu by maxzhou88].chr" size="262144" crc="66c57a10" sha1="0f6a5f2c75037a2213629ea45d79dcd0acacf48f" offset="00000" status="baddump" />
</dataarea>
@@ -62523,8 +63011,7 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
<year>19??</year>
<publisher>SuperGame</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="bmc_gc6in1" />
- <feature name="pcb" value="BMC-GOLDENCARD-6IN1" />
+ <feature name="slot" value="8237" />
<dataarea name="chr" size="262144">
<rom name="earthworm jim 2 (unl) (supergame).chr" size="262144" crc="66c57a10" sha1="0f6a5f2c75037a2213629ea45d79dcd0acacf48f" offset="00000" status="baddump" />
</dataarea>
@@ -62868,6 +63355,38 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
+ <software name="highwayk" cloneof="radracer" supported="partial">
+ <description>Highway Star (Kaiser bootleg)</description>
+ <year>19??</year>
+ <publisher>Kaiser</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="ks7013b" />
+ <feature name="pcb" value="UNL-KS7013B" />
+ <dataarea name="prg" size="131072">
+ <rom name="ks114" size="131072" crc="95ce148a" sha1="eabaefb8ef07c701f7c2d8df6b132a7974c1e9b4" status="baddump" />
+ </dataarea>
+ <!-- 8k VRAM on cartridge -->
+ <dataarea name="vram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="highwayw" cloneof="radracer" supported="partial">
+ <description>Highway Star (Whirlwind Manu bootleg)</description>
+ <year>19??</year>
+ <publisher>Whirlwind Manu</publisher>
+ <info name="serial" value="LH42"/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="unl_lh42" />
+ <dataarea name="prg" size="131072">
+ <rom name="highway star (whirlwind manu).prg" size="131072" crc="8f4ae8aa" sha1="ce4851d8f89cacb212ef645f20201c2634f7253a" status="baddump" />
+ </dataarea>
+ <!-- 8k VRAM on cartridge -->
+ <dataarea name="vram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
<software name="hstar2" cloneof="f1hero2">
<description>High Way Star II (Ripped from F-646 HIGH K Power Sports 4-in-1)</description>
<year>19??</year>
@@ -63417,7 +63936,7 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
<description>Mickey Mania 7</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="serial" value="JY-001"/>
+ <info name="serial" value="JY001"/>
<part name="cart" interface="nes_cart">
<feature name="slot" value="jyc_a" />
<feature name="pcb" value="JYCOMPANY-A" />
@@ -63572,10 +64091,10 @@ We don't include these hacks because they were not burned into real carts nor so
<software name="pocohon">
<description>Pocohontos (Asia)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1997</year>
+ <publisher>Hosenkan</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="hosenkan" />
+ <feature name="slot" value="sg_lionk" />
<feature name="pcb" value="UNL-HOSENKAN" />
<dataarea name="chr" size="262144">
<rom name="pocohontos (199x)(-)(as)[p].chr" size="262144" crc="f995a526" sha1="3829b9da7a1a55e4b8d3f89e91d535ffa6004224" offset="00000" status="baddump" />
@@ -64281,7 +64800,7 @@ We don't include these hacks because they were not burned into real carts nor so
<description>Tiny Toon Adventures 6 (Asia)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="serial" value="JY-007"/>
+ <info name="serial" value="JY007"/>
<part name="cart" interface="nes_cart">
<feature name="slot" value="jyc_b" />
<feature name="pcb" value="JYCOMPANY-B" />
@@ -66267,10 +66786,10 @@ All musics were removed in this game.
<software name="sdkong">
<description>Super Donkey Kong (Asia)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1997?</year>
+ <publisher>Hosenkan</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="hosenkan" />
+ <feature name="slot" value="sg_lionk" />
<feature name="pcb" value="UNL-HOSENKAN" />
<dataarea name="chr" size="131072">
<rom name="super donkey kong (unl).chr" size="131072" crc="d0883ac5" sha1="63a66b7f17e8520cb88916893c0a4200caa06365" offset="00000" status="baddump" />
@@ -67008,22 +67527,6 @@ Also notice that VRAM & WRAM are probably incorrect for some of these sets, at t
</part>
</software>
- <software name="hstarfds">
- <description>Highway Star (Asia, FDS conversion)</description>
- <year>19??</year>
- <publisher>Kaiser</publisher>
- <part name="cart" interface="nes_cart">
- <feature name="slot" value="ks7013b" />
- <feature name="pcb" value="UNL-KS7013B" />
- <dataarea name="prg" size="131072">
- <rom name="highway star (kaiser) (fds conversion) (unl).prg" size="131072" crc="95ce148a" sha1="eabaefb8ef07c701f7c2d8df6b132a7974c1e9b4" offset="00000" status="baddump" />
- </dataarea>
- <!-- 8k VRAM on cartridge -->
- <dataarea name="vram" size="8192">
- </dataarea>
- </part>
- </software>
-
<software name="hikaris">
<description>Hikari Shinwa - Palthena no Kagami (Asia, FDS conversion)</description>
<year>19??</year>
@@ -67559,7 +68062,7 @@ Also notice that VRAM & WRAM are probably incorrect for some of these sets, at t
</part>
</software>
-<!-- FIXME: which board should use this game?? -->
+<!-- FIXME: which board should this game use?? -->
<software name="cluclud" supported="no">
<description>Clu Clu Land D (Asia, FDS conversion)</description>
<year>19??</year>
@@ -68852,7 +69355,7 @@ Also notice that VRAM & WRAM are probably incorrect for some of these sets, at t
</software>
<!-- is this correct?!? -->
- <software name="highwayh" cloneof="radracer" supported="partial">
+ <software name="highwayh" cloneof="radracer" supported="no">
<description>Highway Star (FMG pirate)</description>
<year>1987</year>
<publisher>FMG</publisher>
@@ -72214,7 +72717,7 @@ Other
</part>
</software>
- <software name="booger" supported="no">
+ <software name="booger">
<description>Boogerman (Rus)</description>
<year>19??</year>
<publisher>Sugar Softec</publisher>
@@ -73364,9 +73867,9 @@ Other
</software>
<software name="lionkingp2" cloneof="lionking">
- <description>The Lion King (Pirate, Super Game, Alt)</description>
- <year>19??</year>
- <publisher>&lt;pirate&gt;</publisher>
+ <description>The Lion King (pirate, alt)</description>
+ <year>199?</year>
+ <publisher>Super Game</publisher>
<part name="cart" interface="nes_cart">
<feature name="slot" value="sg_lionk" />
<feature name="pcb" value="UNL-SUPERGAME" />
@@ -73379,6 +73882,22 @@ Other
</part>
</software>
+ <software name="lionkingp3" cloneof="lionking">
+ <description>The Lion King (pirate, alt 2)</description>
+ <year>199?</year>
+ <publisher>Super Game</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="sg_lionk" />
+ <feature name="pcb" value="UNL-SUPERGAME" />
+ <dataarea name="prg" size="262144">
+ <rom name="super lion king (rev0).prg" size="262144" crc="6de1fc41" sha1="2be2b2f4639a1e0b9a654e0cca7736da5486fd91" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="262144">
+ <rom name="super lion king (rev0).chr" size="262144" crc="cf6908dd" sha1="2bb3d606ce7f84f540279ef4458a32d9560407bc" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mermaidh" cloneof="mermaid">
<description>Little Mermaid (Pirate)</description>
<year>19??</year>
@@ -74109,8 +74628,8 @@ Other
</part>
</software>
- <software name="smb3h1" cloneof="smb3" supported="partial">
- <description>Super Mario Bros. 3 (Pirate, Alt)</description>
+ <software name="smb3h1" cloneof="smb3">
+ <description>Super Mario Bros. 3 (pirate, alt)</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
@@ -74234,13 +74753,14 @@ Other
</part>
</software>
+<!-- CHR hack of dondoko2. As such it crashes in exactly the same spot at the first boss. -->
<software name="smb8a" cloneof="dondoko2" supported="partial">
<description>Super Bros 8 (Don Doko Don 2 pirate, Alt)</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="tc0190fmc" />
- <feature name="pcb" value="TAITO-TC0190FMC" />
+ <feature name="slot" value="tc0190fmcp" />
+ <feature name="pcb" value="TAITO-TC0190FMC+PAL16R4" />
<dataarea name="chr" size="262144">
<rom name="super bros 8 (unl).chr" size="262144" crc="6b0b0d7e" sha1="fd7900112340f16ab9015f38bf288ae594a2db3f" offset="00000" status="baddump" />
</dataarea>
@@ -75782,8 +76302,7 @@ be better to redump them properly. -->
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="kof96" />
- <feature name="pcb" value="UNL-KOF96" />
+ <feature name="slot" value="txrom" />
<dataarea name="chr" size="262144">
<rom name="sonic 3d blast 6 [h1] [decrypted].chr" size="262144" crc="32c4a5d0" sha1="1e1f07a41283b869fc5cc198bb48256c702e561e" offset="00000" status="baddump" />
</dataarea>
@@ -75941,13 +76460,12 @@ be better to redump them properly. -->
</part>
</software>
- <software name="garousp1" cloneof="garousp" supported="no">
- <description>Garou Densetsu Special (Asia, Alt)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="garousp1" cloneof="garousp">
+ <description>Garou Densetsu Special (Asia, alt)</description>
+ <year>1995</year>
+ <publisher>Kasheng</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="kof96" />
- <feature name="pcb" value="UNL-KOF96" />
+ <feature name="slot" value="kasing" />
<dataarea name="chr" size="262144">
<rom name="garou densetsu special (unl)[a1].chr" size="262144" crc="09817b25" sha1="a07c8754b8a3017d2544527a12b6683969e2de62" offset="00000" status="baddump" />
</dataarea>
@@ -76251,13 +76769,13 @@ be better to redump them properly. -->
</part>
</software>
+<!-- Did this ever exist on an individual cart? Its CRCs match Golden Card 6 in 1 (the third 256K chunks). -->
<software name="mk3a">
<description>Mortal Kombat 3 (Asia, Alt)</description>
<year>19??</year>
<publisher>Super Games</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="bmc_gc6in1" />
- <feature name="pcb" value="BMC-GOLDENCARD-6IN1" />
+ <feature name="slot" value="8237" />
<dataarea name="chr" size="262144">
<rom name="mortal kombat 3 (unl) (supergame).chr" size="262144" crc="a9dfc575" sha1="d6f89cd05070dff0ed6efbe824798a760a87fa15" offset="00000" status="baddump" />
</dataarea>
@@ -76267,14 +76785,14 @@ be better to redump them properly. -->
</part>
</software>
- <software name="mk3ex60" supported="no">
+ <software name="mk3ex60">
<description>Mortal Kombat 3 Extra 60 (Asia)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="serial" value="M-E3"/>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="sg_boog" />
- <feature name="pcb" value="SUPERGAME-BOOGERMAN" />
+ <feature name="slot" value="8237" />
+ <feature name="pcb" value="UNL-8237" />
<dataarea name="chr" size="524288">
<rom name="mortal combat 3 extra 60 [m-e3] (pirate original).chr" size="524288" crc="559ec915" sha1="3301376fc480db7383a3ea520be041534426287d" offset="00000" status="baddump" />
</dataarea>
@@ -76284,13 +76802,13 @@ be better to redump them properly. -->
</part>
</software>
- <software name="mk3ex60a" cloneof="mk3ex60" supported="no">
+ <software name="mk3ex60a" cloneof="mk3ex60">
<description>Mortal Kombat 3 Extra 60 (Asia, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="sg_boog" />
- <feature name="pcb" value="SUPERGAME-BOOGERMAN" />
+ <feature name="slot" value="8237" />
+ <feature name="pcb" value="UNL-8237" />
<dataarea name="chr" size="262144">
<rom name="mortal kombat 3 - extra 60 (unl) (supergame).chr" size="262144" crc="0f448984" sha1="58d5dab667a4fcbb17652314a410569bb1d7152f" offset="00000" status="baddump" />
</dataarea>
@@ -76384,38 +76902,6 @@ be better to redump them properly. -->
</part>
</software>
- <software name="mk6u1" cloneof="mk6">
- <description>Mortal Kombat 6 (Asia, Unprotected, Ripped from multicart)</description>
- <year>1996</year>
- <publisher>N.T</publisher>
- <part name="cart" interface="nes_cart">
- <feature name="slot" value="txrom" />
- <feature name="pcb" value="NES-TLROM" />
- <dataarea name="chr" size="262144">
- <rom name="mortal kombat 6 (unprotected)(unl).chr" size="262144" crc="93c43dc7" sha1="5828c8d83ef5d70e935312f64d47bcc06e059fac" offset="00000" status="baddump" />
- </dataarea>
- <dataarea name="prg" size="131072">
- <rom name="mortal kombat 6 (unprotected)(unl).prg" size="131072" crc="fa1a7d21" sha1="2ddfe7490716b960074b48c9e37f2ecf69975e7f" offset="00000" status="baddump" />
- </dataarea>
- </part>
- </software>
-
- <software name="mk7" supported="no">
- <description>Mortal Kombat 7 (Asia, Unprotected, Ripped from multicart)</description>
- <year>1996</year>
- <publisher>N.T</publisher>
- <part name="cart" interface="nes_cart">
- <feature name="slot" value="txrom" />
- <feature name="pcb" value="NES-TLROM" />
- <dataarea name="chr" size="262144">
- <rom name="mortal kombat 7 (unprotected)(unl).chr" size="262144" crc="991f0081" sha1="578c2ef7c90fd1397b3a5e82bafd4f0a16abd01f" offset="00000" status="baddump" />
- </dataarea>
- <dataarea name="prg" size="131072">
- <rom name="mortal kombat 7 (unprotected)(unl).prg" size="131072" crc="11dff499" sha1="7f059f45d194559ac40a9c0f6097a88e0b5a76a1" offset="00000" status="baddump" />
- </dataarea>
- </part>
- </software>
-
<software name="mk2blue" supported="partial">
<description>Mortal Kombat II (Asia, Blue Version)</description>
<year>19??</year>
@@ -77398,7 +77884,7 @@ be better to redump them properly. -->
</part>
</software>
- <software name="yuyu97">
+ <software name="yuyu97" supported="partial">
<description>Yu Yu Hakusho 97 V (Asia)</description>
<year>1997</year>
<publisher>N.T</publisher>
@@ -77417,7 +77903,7 @@ be better to redump them properly. -->
</part>
</software>
- <software name="yuyufinc" cloneof="yuyufin">
+ <software name="yuyufinc" cloneof="yuyufin" supported="partial">
<description>Yu Yu Hakusho Final - Makai Saikyou Retsuden (Asia, Chinese, Hacked)</description>
<year>1996</year>
<publisher>N.T</publisher>
@@ -77434,7 +77920,7 @@ be better to redump them properly. -->
</part>
</software>
- <software name="yuyufin">
+ <software name="yuyufin" supported="partial">
<description>Yu Yu Hakusho Final - Makai Saikyou Retsuden (Asia, English)</description>
<year>1996</year>
<publisher>N.T</publisher>
@@ -77594,8 +78080,7 @@ be better to redump them properly. -->
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="waixing_wxzs2" />
- <feature name="pcb" value="WAIXING-PS2" />
+ <feature name="slot" value="bmc_k1029" />
<dataarea name="prg" size="1048576">
<rom name="100-in-1 contra function 16.prg" size="1048576" crc="1b219e01" sha1="6b519f41bbd1984739b6a226140c0f0871889c2f" offset="00000" status="baddump" />
</dataarea>
@@ -77722,29 +78207,12 @@ be better to redump them properly. -->
</part>
</software>
-<!-- According to Cah4e3 this dumps has corrupted chunks of PRG. Investigate... -->
- <software name="mc_110a" cloneof="mc_110">
- <description>110 in 1 (Bad?)</description>
- <year>19??</year>
- <publisher>&lt;pirate&gt;</publisher>
- <part name="cart" interface="nes_cart">
- <feature name="slot" value="bmc_110in1" />
- <feature name="pcb" value="BMC-110IN1" />
- <dataarea name="chr" size="1048576">
- <rom name="110-in-1 [p1].chr" size="1048576" crc="122d2157" sha1="46f495db08201250de51f7a4ac3ab7b09089b7b9" offset="00000" status="baddump" />
- </dataarea>
- <dataarea name="prg" size="2097152">
- <rom name="110-in-1 [p1].prg" size="2097152" crc="78fcf4fa" sha1="763741abc3d6f6e9cf90a8ae6d337e26853f478b" offset="00000" status="baddump" />
- </dataarea>
- </part>
- </software>
-
- <software name="mc_110" supported="partial">
+ <software name="mc_110">
<description>110 in 1</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="bmc_110in1" />
+ <feature name="slot" value="bmc_72in1" />
<feature name="pcb" value="BMC-110IN1" />
<dataarea name="chr" size="1048576">
<rom name="110-in-1.chr" size="1048576" crc="122d2157" sha1="46f495db08201250de51f7a4ac3ab7b09089b7b9" offset="00000" status="baddump" />
@@ -77755,7 +78223,7 @@ be better to redump them properly. -->
</part>
</software>
- <software name="mc_115" supported="no">
+ <software name="mc_115">
<description>115 in 1</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
@@ -78084,12 +78552,11 @@ be better to redump them properly. -->
</software>
<software name="mc_168">
- <description>168 in 1</description>
+ <description>168 in 1 New Contra Function 16</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="waixing_wxzs2" />
- <feature name="pcb" value="WAIXING-PS2" />
+ <feature name="slot" value="bmc_k1029" />
<dataarea name="prg" size="1048576">
<rom name="168-in-1 [p1].prg" size="1048576" crc="9bbf3e5d" sha1="123105a996b3f325e55b7080ddd83d4cf043e543" offset="00000" status="baddump" />
</dataarea>
@@ -78221,13 +78688,13 @@ be better to redump them properly. -->
</part>
</software>
- <software name="mc_2jm2" supported="no">
+ <software name="mc_2jm2">
<description>2 in 1 (J-M2)</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="sg_boog" />
- <feature name="pcb" value="SUPERGAME-BOOGERMAN" />
+ <feature name="slot" value="8237" />
+ <feature name="pcb" value="UNL-8237" />
<dataarea name="chr" size="524288">
<rom name="2-in-1 j-m2 (unl).chr" size="524288" crc="5ddcc731" sha1="cc2555380f2dfb46a73b64d9e1e4fec2ab3d3892" offset="00000" status="baddump" />
</dataarea>
@@ -78237,13 +78704,13 @@ be better to redump them properly. -->
</part>
</software>
- <software name="mc_2kin5" supported="no">
+ <software name="mc_2kin5">
<description>2 in 1 (King005)</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="sg_boog" />
- <feature name="pcb" value="SUPERGAME-BOOGERMAN" />
+ <feature name="slot" value="8237" />
+ <feature name="pcb" value="UNL-8237" />
<dataarea name="chr" size="524288">
<rom name="2-in-1 king005 (unl).chr" size="524288" crc="559ec915" sha1="3301376fc480db7383a3ea520be041534426287d" offset="00000" status="baddump" />
</dataarea>
@@ -78253,13 +78720,13 @@ be better to redump them properly. -->
</part>
</software>
- <software name="mc_2s808" supported="no">
+ <software name="mc_2s808">
<description>2 in 1 Super 808</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="sg_boog" />
- <feature name="pcb" value="SUPERGAME-BOOGERMAN" />
+ <feature name="slot" value="8237" />
+ <feature name="pcb" value="UNL-8237" />
<dataarea name="chr" size="524288">
<rom name="2-in-1 super 808 (unl)[p1].chr" size="524288" crc="65b3e791" sha1="7f342d5fa4d20649f8e2dfbf062111196a0e4893" offset="00000" status="baddump" />
</dataarea>
@@ -78461,14 +78928,14 @@ be better to redump them properly. -->
</part>
</software>
- <software name="mc_22rb" supported="partial">
+ <software name="mc_22rb">
<description>22 in 1 (Reset Based)</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
+ <info name="usage" value="Press reset to use multigame menu."/>
<part name="cart" interface="nes_cart">
<feature name="slot" value="bmc_22games" />
<feature name="pcb" value="BMC-22GAMES" />
- <feature name="mirroring" value="vertical" />
<dataarea name="prg" size="655360">
<rom name="22 in 1 (reset based).prg" size="655360" crc="03fdefad" sha1="4e84be9a20c5e385ae71c466a02613d5a74de01e" offset="00000" status="baddump" />
</dataarea>
@@ -79217,6 +79684,22 @@ be better to redump them properly. -->
</part>
</software>
+<!-- SMB 1 and 2 have swapped graphics assets. This occurs on hardware. -->
+ <software name="mc_4hq">
+ <description>4 in 1 HQ</description>
+ <year>19??</year>
+ <publisher>&lt;pirate&gt;</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="n32_4in1" />
+ <dataarea name="prg" size="131072">
+ <rom name="4-in-1 hq.prg" size="131072" crc="f4a72781" sha1="d7c235b7c72116c304eb57e286fcb5210d2be1d7" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="32768">
+ <rom name="4-in-1 hq.chr" size="32768" crc="5a1b3ed8" sha1="b3ecce305bcd1494bdba6df1044cfd67759b7bf7" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mc_4k106">
<description>4 in 1 (KS-106C)</description>
<year>19??</year>
@@ -79233,6 +79716,42 @@ be better to redump them properly. -->
</part>
</software>
+ <software name="mc_4k1gs">
+ <description>4 in 1 (K-3131GS)</description>
+ <year>199?</year>
+ <publisher>&lt;pirate&gt;</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="bmc_gn45" />
+ <dataarea name="prg" size="524288">
+ <rom name="4-in-1 (k-3131gs, gn-45).prg" size="524288" crc="dc835c48" sha1="ef17c86e521110637b443437fca269f2e3f2385f" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="4-in-1 (k-3131gs, gn-45).chr" size="524288" crc="b551ccdb" sha1="fc17c81a23bd55b9195d8f166aad313f29067ed1" status="baddump" />
+ </dataarea>
+ <!-- 8k WRAM on cartridge -->
+ <dataarea name="wram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_4k1ss">
+ <description>4 in 1 (K-3131SS)</description>
+ <year>199?</year>
+ <publisher>&lt;pirate&gt;</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="bmc_gn45" />
+ <dataarea name="prg" size="524288">
+ <rom name="4-in-1 (k-3131ss, gn-45).prg" size="524288" crc="466bdb58" sha1="354116730efa2131172ccca3793a065abee6026e" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="4-in-1 (k-3131ss, gn-45).chr" size="524288" crc="08d7aa1b" sha1="f78aa3ff4345a31ece3b26cacdb86d437c5c0e17" status="baddump" />
+ </dataarea>
+ <!-- 8k WRAM on cartridge -->
+ <dataarea name="wram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
<software name="mc_4kt34" supported="no">
<description>4 in 1 (KT-3445AB)</description>
<year>19??</year>
@@ -79711,13 +80230,28 @@ be better to redump them properly. -->
</part>
</software>
- <software name="mc_5spc5" supported="no">
+ <software name="mc_5m">
+ <description>5000000 in 1 (JPx72)</description>
+ <year>19??</year>
+ <publisher>&lt;pirate&gt;</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="n625092" />
+ <dataarea name="prg" size="524288">
+ <rom name="5000000-in-1 (jpx72).prg" size="524288" crc="a831426d" sha1="93c6a3eff4c120e6837639af272f3142be5b0e1d" status="baddump" />
+ </dataarea>
+ <!-- 8k VRAM on cartridge -->
+ <dataarea name="vram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_5spc5">
<description>5 in 1 (SPC005)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="sg_boog" />
- <feature name="pcb" value="SUPERGAME-BOOGERMAN" />
+ <feature name="slot" value="8237" />
+ <feature name="pcb" value="UNL-8237" />
<dataarea name="chr" size="1048576">
<rom name="5-in-1 (spc005)[p1].chr" size="1048576" crc="28197d63" sha1="8d11188e5cde7cb9e604db1525502f1f09ce1f3c" offset="00000" status="baddump" />
</dataarea>
@@ -80511,7 +81045,7 @@ be better to redump them properly. -->
</part>
</software>
- <software name="mc_9king" supported="no">
+ <software name="mc_9king" supported="partial">
<description>9 in 1 King001</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
@@ -80575,6 +81109,21 @@ be better to redump them properly. -->
</part>
</software>
+ <software name="mc_9tech">
+ <description>9 in 1</description>
+ <year>199?</year>
+ <publisher>&lt;pirate&gt;</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="tech9in1" />
+ <dataarea name="prg" size="524288">
+ <rom name="9-in-1.prg" size="524288" crc="cff59dab" sha1="ca74c4f097703813e1fce6e56e12a77f4b031e81" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="524288">
+ <rom name="9-in-1.chr" size="524288" crc="46cfa6fa" sha1="ed79cc1ad7696d73a197dd179dbe104918587ade" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mc_90cs3">
<description>90 in 1 Cartridge Story (III)</description>
<year>1991?</year>
@@ -80902,8 +81451,7 @@ be better to redump them properly. -->
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="bmc_gc6in1" />
- <feature name="pcb" value="BMC-GOLDENCARD-6IN1" />
+ <feature name="slot" value="8237" />
<dataarea name="chr" size="1048576">
<rom name="golden card 6 in 1 (unl).chr" size="1048576" crc="8ddf8be7" sha1="24614a448d7da088844239ea57b68283694cc984" offset="00000" status="baddump" />
</dataarea>
@@ -81342,13 +81890,13 @@ to check why this is different -->
</part>
</software>
- <software name="mc_s308" supported="no">
+ <software name="mc_s308">
<description>Super 308 3 in 1</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="sg_boog" />
- <feature name="pcb" value="SUPERGAME-BOOGERMAN" />
+ <feature name="slot" value="8237" />
+ <feature name="pcb" value="UNL-8237" />
<dataarea name="chr" size="524288">
<rom name="super 308 3 in 1 (unl).chr" size="524288" crc="9f5294de" sha1="c1435c9b24668da324363290ecd2bb7734b8eacc" offset="00000" status="baddump" />
</dataarea>
@@ -81870,15 +82418,34 @@ to check why this is different -->
</part>
</software>
- <software name="mc_tf6" supported="no">
+ <software name="mc_tf5" cloneof="mc_tf6">
+ <description>Tetris Family 5 in 1</description>
+ <year>199?</year>
+ <publisher>RCM</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="gs2004" />
+ <feature name="mirroring" value="vertical" />
+ <dataarea name="prg" size="270336">
+ <rom name="tetris family 5-in-1.prg0" size="262144" crc="0ab2e826" sha1="b813808fc4ac25fbb9bd829410ab1a8d39c56576" offset="0x00000" status="baddump" />
+ <rom name="tetris family 5-in-1.prg1" size="8192" crc="255bc6ed" sha1="6226ec49d548a92d8abefb619efc52fe08a08899" offset="0x40000" status="baddump" />
+ </dataarea>
+ <!-- 8k VRAM on cartridge -->
+ <dataarea name="vram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mc_tf6">
<description>Tetris Family 6 in 1 (GS-2004)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>199?</year>
+ <publisher>RCM</publisher>
<part name="cart" interface="nes_cart">
<feature name="slot" value="gs2004" />
<feature name="pcb" value="BMC-GS-2004" />
- <dataarea name="prg" size="262144">
- <rom name="tetris family 6-in-1 (gs-2004) [u].prg" size="262144" crc="0ab2e826" sha1="b813808fc4ac25fbb9bd829410ab1a8d39c56576" offset="00000" status="baddump" />
+ <feature name="mirroring" value="vertical" />
+ <dataarea name="prg" size="270336">
+ <rom name="tetris family 6-in-1 (gs-2004).prg0" size="262144" crc="0ab2e826" sha1="b813808fc4ac25fbb9bd829410ab1a8d39c56576" offset="0x00000" status="baddump" />
+ <rom name="tetris family 6-in-1 (gs-2004).prg1" size="8192" crc="08e73de1" sha1="1ff9bdf51482adfcd040c81fa0243c75c0f0536f" offset="0x40000" status="baddump" />
</dataarea>
<!-- 8k VRAM on cartridge -->
<dataarea name="vram" size="8192">
@@ -81888,8 +82455,8 @@ to check why this is different -->
<software name="mc_tf9">
<description>Tetris Family 9 in 1</description>
- <year>19??</year>
- <publisher>&lt;pirate&gt;</publisher>
+ <year>1991</year>
+ <publisher>RCM</publisher>
<part name="cart" interface="nes_cart">
<feature name="slot" value="tf9in1" />
<feature name="pcb" value="RCM-TETRISFAMILY" />
@@ -81902,13 +82469,14 @@ to check why this is different -->
</part>
</software>
- <software name="mc_tf12" supported="no">
+ <software name="mc_tf12">
<description>Tetris Family 12 in 1 (GS-2013)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1991</year>
+ <publisher>RCM</publisher>
<part name="cart" interface="nes_cart">
<feature name="slot" value="gs2013" />
<feature name="pcb" value="BMC-GS-2013" />
+ <feature name="mirroring" value="vertical" />
<dataarea name="prg" size="327680">
<rom name="tetris family 12-in-1 (gs-2013) [u].prg" size="327680" crc="8cde7cb9" sha1="0119413febd9a6c5a7c4f0673c42356247a4ade8" offset="00000" status="baddump" />
</dataarea>
diff --git a/hash/pc8801_flop.xml b/hash/pc8801_flop.xml
index e0b6124ef0f..71543c43795 100644
--- a/hash/pc8801_flop.xml
+++ b/hash/pc8801_flop.xml
@@ -1271,7 +1271,8 @@ INVESTIGATE
</part>
</software>
- <software name="acrojet" supported="no">
+ <!-- copy protection repaired by hand -->
+ <software name="acrojet">
<description>AcroJet</description>
<year>1988</year>
<publisher>システムソフト (System Software)</publisher>
@@ -1279,9 +1280,15 @@ INVESTIGATE
<info name="release" value="198810xx"/>
<info name="alt_title" value="アクロジェット"/>
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="348848"> <!-- Data CRC16: 23888 -->
+ <!-- Data CRC16: 23888 -->
+ <!--
+ <dataarea name="flop" size="348848">
<rom name="acrojet.d88" size="348848" crc="dc271a9c" sha1="a0475d9c80c74b596fee938ba7b682e5d92dde44"/>
</dataarea>
+ -->
+ <dataarea name="flop" size="349120">
+ <rom name="acrojet_repair.d88" size="349120" crc="c8168a1b" sha1="f4b0e76e9a8d19f02441a9c17d223fcecdfdeb4e" status="baddump"/>
+ </dataarea>
</part>
</software>
@@ -10988,7 +10995,9 @@ ExtractDisk [02]"MAPディスク " -> "duel kawanakajima_02.d88"
</part>
</software>
- <software name="emeraldd">
+ <!-- Displays Glodia transition then logo keeps scrolling left -->
+ <!-- Same as Vain Dream? -->
+ <software name="emeraldd" supported="no">
<description>Emerald Dragon</description>
<year>1989</year>
<publisher>バショウハウス (Bashou House)</publisher>
@@ -15414,6 +15423,7 @@ ExtractDisk [03]"シナリオ " -> "gundam tactical operation_03.d88"
</part>
</software>
+ <!-- copy protection repaired by hand -->
<software name="holein1">
<description>Hole in One</description>
<year>1985</year>
@@ -15422,9 +15432,14 @@ ExtractDisk [03]"シナリオ " -> "gundam tactical operation_03.d88"
<info name="release" value="198508xx"/>
<info name="alt_title" value="ホールインワン"/>
<part name="flop1" interface="floppy_5_25">
+ <!--
<dataarea name="flop" size="348832">
<rom name="hole in one.d88" size="348832" crc="fdc86c72" sha1="12a1424aced7a859fccb5f00b9fbe314495b46b0"/>
</dataarea>
+ -->
+ <dataarea name="flop" size="349120">
+ <rom name="hole in one_repair.d88" size="349120" crc="aaff0df9" sha1="03179fed67c9addc8323d0c99322ccd6fcc86f44" status="baddump"/>
+ </dataarea>
</part>
</software>
@@ -23448,7 +23463,10 @@ ExtractDisk [03]"USER_DISK " -> "maha-kala_03.d88"
</part>
</software>
- <software name="valis2">
+ <!-- boot OK -->
+ <!-- Omake: press F5 during opening for music test, alternatively just boot disk G from drive 1 -->
+ <!-- TODO: checkout if there are other hidden hotkeys like PC98 version -->
+ <software name="valis2" supported="yes">
<description>Mugen Senshi Valis II</description>
<year>1989</year>
<publisher>日本テレネット (Nihon Telenet)</publisher>
@@ -23686,12 +23704,12 @@ ExtractDisk [03]"USER_DISK " -> "maha-kala_03.d88"
</software>
<software name="navitune">
- <description>Navitune</description>
+ <description>Navitune - Dragon Koukaiki</description>
<year>1989</year>
<publisher>工画堂スタジオ (Kogado Studio)</publisher>
<!-- PC8801mk2SR -->
<info name="release" value="198911xx"/>
- <info name="alt_title" value="ナビチューン"/>
+ <info name="alt_title" value="ナビチューン ドラゴン航海記"/>
<!--combined image-->
<!--rom name="navitune.d88" size="1662512" crc="b9540b35" sha1="8d937c8acfb62a12d24596114e7168db1087eaf0"/-->
@@ -36112,7 +36130,9 @@ ExtractDisk [03]"Ulysses_Disk1 " -> "ulysses_v80_03.d88" (same as ulyssesa)
</part>
</software>
- <software name="vaindrea">
+ <!-- Displays Glodia transition then logo keeps scrolling left with wrong colors -->
+ <!-- Known to be related to write protect flag on System disk that must be ON (PC=0xB0A4) -->
+ <software name="vaindrea" supported="no">
<description>Vain Dream</description>
<year>1991</year>
<publisher>グローディア (Global Media)</publisher>
diff --git a/hash/pc98.xml b/hash/pc98.xml
index 1711d487170..71ca5a12016 100644
--- a/hash/pc98.xml
+++ b/hash/pc98.xml
@@ -12,28 +12,37 @@ license:CC0
for sharing and dumping a lot of disks and for the researches on the disks
-->
-
-
<!--
+Compatibility notes:
+- \(.*\) for additional testing notes (btanb moniker goes here);
+- \[.*\] for extended developer info;
+
TODO:
-- test all games and double check support status
-- identify any FDI that has a size different than 1265664 (== 3'5" floppy image)
-- document any unorthodox way for running a given sw
+- Verify disk labels, several are mislabeled (i.e. has numbers instead of letters and viceversa);
+- Mark as baddump any SW disk(s) that sports non-default factory saves;
+- identify any FDI that has a size bigger than 1265664 (== 3'5" floppy image);
+- document any unorthodox way for running a given sw;
- document (and support) alternative file types (FDD, NFD, FIX)
can we convert some of those to FDI or D88? or some protection schemes need
such format? (Note that some disks come in DIP, DCP, DCU formats: these shall
be just plain images, like FDI, just with different headers with the track
"map")
-- fix doujin software names
+- fix doujin software names;
+- Remove manufacturer=<unofficial> and instead assign proper manufacturer naming for
+ Victor freeware software (+ bad dump flag), bootleg for the PC9801 Game Packs;
+- Identify any software that uses the MAD Factory NAX.EXE driver for Otomi-chan Kai sound board;
+- Find a bulletproof way to anti-virus scan all disks, particularly true for DOS SWs;
+- DIR the Wizard98 disks and understand how they works exactly (those supposedly are cracks for copy protected disks);
-->
<!-- System disks & Utils -->
-
- <software name="pc98dosd">
+ <!-- Heavy GFX glitches on VM class, on RS class it has minor GFX layer clearance issues -->
+ <!-- TODO: Does the disk requires 98DO+ specifically? -->
+ <software name="pc98dosd" supported="partial">
<description>PC-98DO+ System Disk</description>
<year>19??</year>
<publisher>NEC</publisher>
@@ -44,15 +53,11 @@ TODO:
</part>
</software>
-<!--
-PC-9821Xw System Restore startup disk
-
-this is a System Restore startup disk for PC-9821Xw
-but not a Windows install source(need more disk?)
-
-only have some part of Windows file and a Video driver(CLGD?).
--->
- <software name="sysrest">
+ <!-- PC-9821Xw System Restore startup disk -->
+ <!-- this is a System Restore startup disk for PC-9821Xw -->
+ <!-- but not a Windows install source(need more disk?) -->
+ <!-- only have some part of Windows file and a Video driver(CLGD?). -->
+ <software name="sysrest" supported="no">
<description>System Restore Disk</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -1883,8 +1888,11 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="epdiag">
- <description>EPSON Jiko Shindan Program</description>
+ <!-- boot OK -->
+ <!-- several unsupported features, has misaligned vertical lines on GFX boxes -->
+ <!-- on VM class FM sound test runs way too fast -->
+ <software name="epdiag" supported="partial">
+ <description>EPSON Jiko Shindan Program (v1.10)</description>
<year>1991</year>
<publisher>EPSON</publisher>
<info name="alt_title" value="自己診断プログラム" />
@@ -1895,7 +1903,7 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <!-- "Disk I/O Error" on boot -->
+ <!-- "Disk I/O Error" on boot (btanb, needs Epson class machine) -->
<software name="epinstal" supported="no">
<description>EPSON Software Installation Program (v3.02)</description>
<year>19??</year>
@@ -1944,7 +1952,10 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="epsonb2">
+ <!-- boot OK -->
+ <!-- Utility disk file "BMENU." sports ugly GFX cyan fills -->
+ <!-- (especially noticeable when clearing them, leaving black trails) -->
+ <software name="epsonb2" supported="partial">
<description>EPSON Nihongo Disk BASIC v2.0</description>
<year>1988</year>
<publisher>EPSON</publisher>
@@ -1962,7 +1973,10 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="epsonb5">
+ <!-- boot OK -->
+ <!-- Utility disk file "BMENU." sports ugly GFX cyan fills -->
+ <!-- (especially noticeable when clearing them, leaving black trails) -->
+ <software name="epsonb5" supported="partial">
<description>EPSON Nihongo Disk BASIC v5.0</description>
<year>1990</year>
<publisher>EPSON</publisher>
@@ -1980,8 +1994,6 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
-
-
<software name="wrp91021" supported="no">
<description>Wizard98 Report Vol 91.2-1</description>
<year>1991</year>
@@ -2402,7 +2414,10 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <!-- Keyboard doesn't work on PC-9801F; runs too fast on later models -->
+ <!-- boot OK -->
+ <!-- Keyboard is sometimes unresponsive on vanilla class (noticeable with jumps) -->
+ <!-- Runs too fast on later models -->
+ <!-- TODO: may require 8MHz fix -->
<software name="177" supported="partial">
<description>177</description>
<year>1986</year>
@@ -2501,16 +2516,21 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="38man">
+ <!-- no sound on VM class (regression?) -->
+ <!-- eventually hangs on gameplay with no drawn text -->
+ <!-- loading save box doesn't draw on RS class and UX class (and hangs) -->
+ <!-- TODO: sometimes it throws an error during MEGDOS boot, translate message -->
+ <software name="38man" supported="no">
<description>38 Man Kilo no Kokuu</description>
<year>1989</year>
<publisher>システムサコム (System Sacom)</publisher>
<info name="alt_title" value="38万キロの虚空" />
<info name="release" value="198912xx" />
+ <!-- baddump: contains non-factory saves -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="1265664">
- <rom name="38mank1.fdi" size="1265664" crc="2ff633b4" sha1="c7f4a7b6c7baf944aac85e0786b0f31b95510892" offset="0" />
+ <rom name="38mank1.fdi" size="1265664" crc="2ff633b4" sha1="c7f4a7b6c7baf944aac85e0786b0f31b95510892" offset="0" status="baddump" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
@@ -2563,6 +2583,7 @@ only have some part of Windows file and a Video driver(CLGD?).
</software>
<!-- boot OK with the given instructions -->
+ <!-- Omake: boot DOS, insert and switch prompt to system disk, issue "MUSIC TEST" (latter is case sensitive) for a sound test menu -->
<software name="46okunen" supported="yes">
<description>46 Okunen Monogatari - The Shinkaron</description>
<year>1990</year>
@@ -3445,7 +3466,7 @@ only have some part of Windows file and a Video driver(CLGD?).
<software name="advpowd2pd" cloneof="advpowd2">
<description>Advanced Power Dolls 2 - Premium Disk</description>
<year>1995</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="アドヴァンスド パワードール2 プレミアムディスク" />
<info name="release" value="199502xx" />
<part name="flop1" interface="floppy_5_25">
@@ -4138,7 +4159,8 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="alantia">
+ <!-- boot OK -->
+ <software name="alantia" supported="yes">
<description>Alantia</description>
<year>1988</year>
<publisher>ビクター音楽産業 (Victor Musical Industries)</publisher>
@@ -4277,7 +4299,7 @@ only have some part of Windows file and a Video driver(CLGD?).
<software name="algtsub">
<description>Algeese no Tsubasa - Youka Ankoku Hen</description>
<year>1988</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="アルギースの翼 ~妖華暗黒変~" />
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Game"/>
@@ -4545,12 +4567,7 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <!--
- Seems to have some kind of trouble with changing disks. Starting the game from the opening sequence (オープニングから始める) doesn't work
- because it doesn't recognize Data Disk A afterwards, but starting from the beginning of the game itself (最初から始める) works.
-
- Needs further testing in order to confirm if later disk changes also fail.
- -->
+ <!-- boot OK, has disk swap issues (needs to swap multiple times in order to actually make the game to recognize) -->
<software name="alvaleak" supported="partial">
<!-- Origin: Neo Kobe Collection -->
<description>Alvaleak Boukenki</description>
@@ -6516,7 +6533,7 @@ only have some part of Windows file and a Video driver(CLGD?).
</software>
<!-- Can't play any music. It recognizes the MIDI interface correctly, but complains about the interrupt line settings not being correct. -->
- <!-- Supported MIDI interfaces: Roland MT-32, Roland D-10/D-110, Kawai MSB-98, Korg M1 -->
+ <!-- Supported MIDI interfaces according to menu: Roland MT-32, Roland D-10/D-110, Kawai MSB-98, Korg M1 -->
<software name="bandkun" supported="no">
<description>Band-kun - Sound Entertainment</description>
<year>1990</year>
@@ -6524,6 +6541,7 @@ only have some part of Windows file and a Video driver(CLGD?).
<info name="alt_title" value="バンドくん" />
<info name="release" value="199011xx" />
<info name="usage" value="Requires a MIDI interface. Run KOEI.COM from DOS to boot, or BKINST.EXE to install to HDD." />
+ <!-- TODO: additional instructions to actually interface MIDI properly, cfr. manual -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Program Disk"/>
<dataarea name="flop" size="1281968">
@@ -7862,6 +7880,7 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
+ <!-- -->
<software name="blockbst">
<description>The Block Buster</description>
<year>1995</year>
@@ -8123,12 +8142,14 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="panicbom">
+ <!-- boot OK -->
+ <software name="panicbom" supported="yes">
<description>Bomberman - Panic Bomber</description>
<year>1995</year>
<publisher>アスキー (ASCII)</publisher>
<info name="alt_title" value="ボンバーマン ぱにっくボンバー" />
<info name="release" value="19950405" />
+ <info name="usage" value="Requires a 9821 class machine and 3MB of RAM" />
<!-- was mislabeled as hldrun clone -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="1281968">
@@ -11401,7 +11422,7 @@ only have some part of Windows file and a Video driver(CLGD?).
<software name="csoldier">
<description>Cosmic Soldier</description>
<year>1985</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="コズミックソルジャー" />
<info name="release" value="198510xx" />
<part name="flop1" interface="floppy_5_25">
@@ -12264,7 +12285,13 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="dark">
+ <!-- boot OK, cannot disk swap -->
+ <!-- Cheat: in a dungeon hold SHIFT and CTRL then press any of the listed f-keys for desired effect: -->
+ <!-- F1: Auto game over -->
+ <!-- F2: Full restore HP/MP -->
+ <!-- F3: Level up -->
+ <!-- F5: Calls a user interactable (fake?) prompt, then asks to insert disk B in drive 2 (boss key? temp save?) -->
+ <software name="dark" supported="no">
<description>D'ark</description>
<year>1992</year>
<publisher>姫屋ソフト (Himeya Soft)</publisher>
@@ -12863,6 +12890,8 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
+ <!-- Omake: boot Umi disk in drive 1 and System in drive 2 for music test -->
+ <!-- Omake: boot DOS, insert System disk, execute "fmdrv.com, mouse.com, cls, end" for ending sequence -->
<software name="daikokai">
<description>Daikoukai Jidai</description>
<year>1990</year>
@@ -13478,7 +13507,11 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="dwraith">
+ <!-- Reportedly has copy protection checks: -->
+ <!-- Level ups do not give stat boosts -->
+ <!-- By testing: MC has LV 0 and zero gold, leveling up takes an absurd number of fights and stats gain is negligible -->
+ <!-- Is it really game like intended? FDC investigation required -->
+ <software name="dwraith" supported="no">
<description>Dark Wraith</description>
<year>1989</year>
<publisher>アーテック (Artec)</publisher>
@@ -16401,7 +16434,10 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <!-- The controls don't work properly -->
+ <!-- Keyboard inputs are very unresponsive, and eventually stops working -->
+ <!-- (press space to skip opening then "golflife" main menu or "playgolf" course select) -->
+ <!-- Main menu doesn't show the initial cursor (related) -->
+ <!-- [Reads key sense thru BIOS int 18h at PC=312db] -->
<software name="dbleagle" supported="no">
<description>Double Eagle</description>
<year>1989</year>
@@ -16665,16 +16701,18 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="drageyes">
+ <!-- boot OK -->
+ <software name="drageyes" supported="yes">
<description>Dragon Eyes</description>
<year>1991</year>
<publisher>GAMEテクノポリス (Game Technopolis)</publisher>
<info name="alt_title" value="ドラゴンアイズ" />
<info name="release" value="19910123" />
+ <!-- baddump: contains non-factory save -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="1442128">
- <rom name="dragonea.d88" size="1442128" crc="54738bd5" sha1="cdd4d85a57f46b447c41fbcdaa8e4d2d034803bd" offset="0" />
+ <rom name="dragonea.d88" size="1442128" crc="54738bd5" sha1="cdd4d85a57f46b447c41fbcdaa8e4d2d034803bd" offset="0" status="baddump" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
@@ -18358,7 +18396,12 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="emeraldd">
+ <!-- boot OK -->
+ <!-- Sometimes keyboard stuck pressed keys and becomes unresponsive (on RS class at very least) -->
+ <!-- VM class sports video glitches on scroll -->
+ <!-- Omake: boot up an MS-DOS, insert Opening Disk, execute "CKMUS %1" for music test -->
+ <!-- Parameter is a file with .s extension also inside disk contents (also cfr. readme.doc) -->
+ <software name="emeraldd" supported="no">
<description>Emerald Dragon</description>
<year>1989</year>
<publisher>グローディア (Glodia)</publisher>
@@ -18376,10 +18419,11 @@ only have some part of Windows file and a Video driver(CLGD?).
<rom name="emerald dragon disk2 opening disk.fdi" size="1261568" crc="d5f8ba83" sha1="2d8cee17aa2cb1eae24e0837708bd3d12984970f" offset="0" />
</dataarea>
</part>
+ <!-- baddump: contains non-factory saves -->
<part name="flop3" interface="floppy_5_25">
<feature name="part_id" value="Data Disk"/>
<dataarea name="flop" size="1261568">
- <rom name="emerald dragon disk3 data disk.fdi" size="1261568" crc="f850549e" sha1="a2aefac04d1649507da699710f000d1d19259c2e" offset="0" />
+ <rom name="emerald dragon disk3 data disk.fdi" size="1261568" crc="f850549e" sha1="a2aefac04d1649507da699710f000d1d19259c2e" offset="0" status="baddump" />
</dataarea>
</part>
</software>
@@ -18683,6 +18727,7 @@ only have some part of Windows file and a Video driver(CLGD?).
</software>
<!-- Black screen on boot -->
+ <!-- [Never goes past initial reading from floppy, may require a 2DD exclusive setting/BIOS] -->
<software name="executiv" supported="no">
<description>Executive e no Michi</description>
<year>1987</year>
@@ -19096,6 +19141,7 @@ only have some part of Windows file and a Video driver(CLGD?).
</software>
<!-- Black screen on boot -->
+ <!-- [Never goes past initial reading from floppy, may require a 2DD exclusive setting/BIOS] -->
<software name="fairytal" supported="no">
<description>Fairytale</description>
<year>1987</year>
@@ -21994,7 +22040,9 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="gods">
+ <!-- "Packed file is corrupt" during boot -->
+ <!-- eventually goes to title screen with no working inputs & selection cursor that keeps switching (related?) -->
+ <software name="gods" supported="no">
<description>Gods - Kami to Naru Otoko no Densetsu</description>
<year>1992</year>
<publisher>PCMコンプリート (PCM Complete)</publisher>
@@ -22014,7 +22062,8 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="goh2">
+ <!-- boot OK -->
+ <software name="goh2" supported="yes">
<description>Goh II</description>
<year>1992</year>
<publisher>日本テレネット (Nihon Telenet)</publisher>
@@ -22347,6 +22396,7 @@ only have some part of Windows file and a Video driver(CLGD?).
<publisher>日本テレネット (Nihon Telenet)</publisher>
<info name="alt_title" value="ザ・グレイル・ハンター" />
<info name="release" value="19941224" />
+ <info name="usage" value="Boot DOS from floppy, insert disk 1 and run INSTALL.EXE" />
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="1265664">
@@ -22592,7 +22642,9 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="grossede">
+ <!-- boot OK with the 1S disk, GFX boxes leaves trails on gameplay -->
+ <!-- TODO: to install to HDD should be "INST1.BAT B: A:<folder>" but it fails recognizing disk 2 -->
+ <software name="grossede" supported="partial">
<description>Groß Deutschland</description>
<year>1992</year>
<publisher>ジェネラル・サポート (General Support)</publisher>
@@ -22622,10 +22674,12 @@ only have some part of Windows file and a Video driver(CLGD?).
<rom name="gd4.fdi" size="1265664" crc="bebd9681" sha1="dd76a48693533f70beab39c9efe1931e81791f91" offset="0" />
</dataarea>
</part>
+ <!-- baddump: autobootable Disk 1 copy generated by user -->
+ <!-- (should be a 4 disks game) -->
<part name="flop5" interface="floppy_5_25">
<feature name="part_id" value="Disk 1S?"/>
<dataarea name="flop" size="1265664">
- <rom name="gd1s.fdi" size="1265664" crc="486dd401" sha1="8bbb4b075a21612519f2e47fff5b062a51894aaf" offset="0" />
+ <rom name="gd1s.fdi" size="1265664" crc="486dd401" sha1="8bbb4b075a21612519f2e47fff5b062a51894aaf" offset="0" status="baddump" />
</dataarea>
</part>
</software>
@@ -23158,7 +23212,7 @@ only have some part of Windows file and a Video driver(CLGD?).
<software name="afterdrk">
<description>Harajuku After Dark</description>
<year>1988</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="原宿アフターダーク" />
<info name="release" value="198806xx" />
<part name="flop1" interface="floppy_5_25">
@@ -25958,6 +26012,7 @@ only have some part of Windows file and a Video driver(CLGD?).
</software>
<!-- boot OK -->
+ <!-- TODO: cannot make sound to work on VM class, regressed? -->
<software name="karateka" supported="yes">
<description>Karateka</description>
<year>1988</year>
@@ -27605,28 +27660,35 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="lastarmg">
+ <!-- boot OK -->
+ <!-- no sound on RS class (btanb?) -->
+ <!-- TODO: source claims that booting with disks C and D in gives a more extensive monster book -->
+ <!-- what's "disk D" tho? Game package contains three disks only, and alienzuk loaded in drive 2 doesn't seem to work -->
+ <software name="lastarmg" supported="partial">
<description>Last Armageddon</description>
<year>1988</year>
<publisher>ブレイングレイ (Brain Grey)</publisher>
<info name="alt_title" value="ラストハルマゲドン" />
<info name="release" value="198808xx" />
+ <info name="usage" value="Boot disk A for opening, disks C and B for actual game." />
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="1265664">
<rom name="lastarma.fdi" size="1265664" crc="377a8ee9" sha1="20c923d3130be3496d380e57c2b0908120f46194" offset="0" />
</dataarea>
</part>
+ <!-- baddump: contains non-factory save -->
<part name="flop2" interface="floppy_5_25">
<feature name="part_id" value="Disk B"/>
<dataarea name="flop" size="1265664">
- <rom name="lastarmb.fdi" size="1265664" crc="391d8c0f" sha1="5c2f6b8459f81c0b5ff71c27c5a9b1cba7f9e18e" offset="0" />
+ <rom name="lastarmb.fdi" size="1265664" crc="391d8c0f" sha1="5c2f6b8459f81c0b5ff71c27c5a9b1cba7f9e18e" offset="0" status="baddump" />
</dataarea>
</part>
+ <!-- baddump: contains partially filled compendium (item 3) -->
<part name="flop3" interface="floppy_5_25">
<feature name="part_id" value="Disk C"/>
<dataarea name="flop" size="1265664">
- <rom name="lastarmc.fdi" size="1265664" crc="c4647efa" sha1="6ad35f7cf5f917c25327d2613d21c425ab1d8b92" offset="0" />
+ <rom name="lastarmc.fdi" size="1265664" crc="c4647efa" sha1="6ad35f7cf5f917c25327d2613d21c425ab1d8b92" offset="0" status="baddump"/>
</dataarea>
</part>
</software>
@@ -28083,15 +28145,18 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="lightbac">
+ <!-- "No system files" but should be autobootable -->
+ <software name="lightbac" supported="no">
<description>Lightning Bacchus - The Knight of Iron</description>
<year>1989</year>
<publisher>NCS</publisher>
<info name="alt_title" value="ライトニングバッカス THE KNIGHT of IRON" />
<info name="release" value="198903xx" />
+ <!-- baddump: mangled filesystem, contains a 6.20 DOS and a 2015 user override -->
+ <!-- latter half of disk cannot be read back, converting disk to D88 causes MSDOS.SYS error at DOS boot. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="741376">
- <rom name="lightning vaccus - the knight of iron (1989)(ncs).fdi" size="741376" crc="e58f3dd2" sha1="3377eb54856d545d12354909014eedf168410535" offset="0" />
+ <rom name="lightning vaccus - the knight of iron (1989)(ncs).fdi" size="741376" crc="e58f3dd2" sha1="3377eb54856d545d12354909014eedf168410535" offset="0" status="baddump" />
</dataarea>
</part>
</software>
@@ -28349,7 +28414,9 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="ldb_manh">
+ <!-- After selecting sound and input methods shows Riverhill Soft logo then black screen -->
+ <!-- [Reads upd7220 bitmap status at PC=0x1e8fe, masking with drawing in progress, DMA and FIFO not empty flags] -->
+ <software name="ldb_manh" supported="no">
<description>LOGiN Disk &amp; Book Series - Manhattan Requiem - Angels Flying in the Dark</description>
<year>1993</year>
<publisher>アスキー (ASCII)</publisher>
@@ -28484,7 +28551,9 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="lovechas">
+ <!-- Black screen on boot -->
+ <!-- [Never goes past initial reading from floppy, may require a 2DD exclusive setting/BIOS] -->
+ <software name="lovechas" supported="no">
<description>Love Chaser</description>
<year>1987</year>
<publisher>チャンピオンソフト (Champion Soft)</publisher>
@@ -28906,8 +28975,9 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
-<!-- mixed? -->
- <software name="mjclinic">
+ <!-- Throws "error code 34" on boot -->
+ <!-- mixed 5'25/3'5 dump? Looks extremely unlikely -->
+ <software name="mjclinic" supported="no">
<description>Mahjong Clinic Zoukan-gou</description>
<year>1990</year>
<publisher>ホームデータ (Home Data)</publisher>
@@ -30209,13 +30279,14 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="meikyuu">
+ <!-- doesn't recognize disk swaps -->
+ <software name="meikyuu" supported="no">
<description>Meikyuu Gakuensai - Kyuukousha no Nazo</description>
<year>1994</year>
<publisher>ウィッシュボーン (Wishbone)</publisher>
<info name="alt_title" value="迷宮学園祭 旧校舎の謎" />
<info name="release" value="19941028" />
- <info name="usage" value="Boot with Disk 1 and Disk 7 inserted" />
+ <info name="usage" value="Boot with Disk A and Disk G inserted" />
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="1265664">
@@ -30877,12 +30948,18 @@ only have some part of Windows file and a Video driver(CLGD?).
</part>
</software>
- <software name="msfsim50">
+ <!-- Black screen while running FS.BAT -->
+ <!-- [Does extensive SVGA checks] -->
+ <!-- Supported CAD cards according to SETUP.COM: -->
+ <!-- I-O Data GA-1024, GA-1280, GB-98NB -->
+ <!-- Melco WAB-S/1000, WAP-2000, WSR-E/G, WAB-2000, WAP-4000 -->
+ <software name="msfsim50" supported="no">
<description>Microsoft Flight Simulator Version 5.0</description>
<year>1994</year>
<publisher>マイクロソフト (Microsoft)</publisher>
<info name="alt_title" value="マイクロソフト フライトシミュレーター Ver5.0" />
<info name="release" value="19941028" />
+ <info name="usage" value="Minimum requirements 9821 MATE A, 9821 MATE B or a compatible CAD card. Run SETUP.COM to install to a DOS HDD" />
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="1281968">
@@ -31477,12 +31554,17 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="gundamco">
+ <!-- "System Error" on vanilla class (expects 16 colors mode, btanb) -->
+ <!-- boot OK on VM and RS class -->
+ <!-- On VM class it has slight layer clearance bugs -->
+ <!-- keyboard is very unresponsive on gameplay (or even won't work properly for VM class) -->
+ <software name="gundamco" supported="no">
<description>Mobile Suit Gundam - Classic Operation</description>
<year>1990</year>
<publisher>ファミリーソフト (Family Soft)</publisher>
<info name="alt_title" value="機動戦士ガンダム クラシックオペレーション" />
<info name="release" value="19900810" />
+ <info name="usage" value="Expects analog 16 mode on" />
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="1089776">
@@ -31858,14 +31940,22 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="moritash">
- <description>Morita Kazuo no Shougi</description>
+ <!-- Shows a bare title screen then hangs -->
+ <!-- [Calls a routine at PC=0x14792 that decidedly wipes the program code with NOPs]-->
+ <!-- repaired copy protection by hand -->
+ <software name="moritash" supported="yes">
+ <description>Morita Kazuo no Shougi (v1.2)</description>
<year>1985</year>
<publisher>エニックス (Enix)</publisher>
<info name="alt_title" value="森田和郎の将棋" />
<part name="flop1" interface="floppy_5_25">
+ <!--
<dataarea name="flop" size="1281968">
- <rom name="morita.d88" size="1281968" crc="7cce82c7" sha1="73bfd089cff665af607ed8c4d3bbc2c9793318ec" offset="0" />
+ <rom name="morita.d88" size="1281968" crc="7cce82c7" sha1="73bfd089cff665af607ed8c4d3bbc2c9793318ec" offset="0" />
+ </dataarea>
+ -->
+ <dataarea name="flop" size="4016040">
+ <rom name="morita.mfm" size="4016040" crc="525cdada" sha1="484194694bd17227d6526232a0f44f0f1d77ec8a" offset="0" status="baddump" />
</dataarea>
</part>
</software>
@@ -31906,7 +31996,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
<software name="madara">
<description>Mouryou Senki Madara - Daikongourin Hen</description>
<year>1993</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="魍魎戦記MADARA 大金剛輪編" />
<info name="release" value="19930910" />
<part name="flop1" interface="floppy_5_25">
@@ -32042,26 +32132,34 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="valis2">
+ <!-- boot OK -->
+ <!-- Omake: press F1 up to F6 during opening for music test (tenkey for up/down, space to select, enter to quit) -->
+ <!-- Cheat: press F2 + F4 + F5 during gameplay for jewel refill -->
+ <!-- TODO: cannot make following two to work, F1 is the inventory menu call, may require key repeat? -->
+ <!-- Omake: press F1 + F4 during gameplay for partial MIDI support -->
+ <!-- Cheat: press F1 + F6 during gameplay for rapid fire -->
+ <software name="valis2" supported="yes">
<description>Mugen Senshi Valis II</description>
<year>1989</year>
<publisher>日本テレネット (Nihon Telenet)</publisher>
<info name="alt_title" value="夢幻戦士ヴァリス2" />
<info name="release" value="19890805" />
+
+ <!-- baddump: contains non-factory save (confirm which disk contains user data) -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
+ <feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="1265664">
- <rom name="mugen senshi valis 2 (1986)(nihon telenet)(disc 1 of 3)(disk a).fdi" size="1265664" crc="ceb883b9" sha1="36f06cfdf9b43184a58521c0ec57777eb890c2ab" offset="0" />
+ <rom name="mugen senshi valis 2 (1986)(nihon telenet)(disc 1 of 3)(disk a).fdi" size="1265664" crc="ceb883b9" sha1="36f06cfdf9b43184a58521c0ec57777eb890c2ab" offset="0" status="baddump" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
+ <feature name="part_id" value="Disk B"/>
<dataarea name="flop" size="1265664">
- <rom name="mugen senshi valis 2 (1986)(nihon telenet)(disc 2 of 3)(disk b).fdi" size="1265664" crc="38cbab2a" sha1="4eff9c916e7f939b68b01da673350200aff430ba" offset="0" />
+ <rom name="mugen senshi valis 2 (1986)(nihon telenet)(disc 2 of 3)(disk b).fdi" size="1265664" crc="38cbab2a" sha1="4eff9c916e7f939b68b01da673350200aff430ba" offset="0" status="baddump" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
+ <feature name="part_id" value="Disk C"/>
<dataarea name="flop" size="1265664">
<rom name="mugen senshi valis 2 (1986)(nihon telenet)(disc 3 of 3)(disk c).fdi" size="1265664" crc="bf57cbfc" sha1="550606a177b52ef6e5c3480a0ee975fc4eedfddf" offset="0" />
</dataarea>
@@ -32323,9 +32421,9 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</software>
<software name="navitune">
- <description>Navitune</description>
+ <description>Navitune - Dragon Koukaiki</description>
<year>1990</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="ナビチューン ドラゴン航海記" />
<info name="release" value="19901207" />
<part name="flop1" interface="floppy_5_25">
@@ -32342,9 +32440,11 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="nazopuyo">
+ <!-- Cannot read neither keyboard nor joystick inputs, only mouse works -->
+ <!-- (Happens on 9821 and RS class and sound boards -26 and -86) -->
+ <software name="nazopuyo" supported="no">
<description>Nazo Puyo</description>
- <year>1984</year>
+ <year>1994</year>
<publisher>コンパイル (Compile)</publisher>
<info name="alt_title" value="なぞぷよ" />
<info name="release" value="19941111" />
@@ -34112,7 +34212,9 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="paradice">
+ <!-- boot OK -->
+ <!-- TODO: check zooming effect on battle transitions (looks ugly but right?) -->
+ <software name="paradice" supported="yes">
<description>Para-Dice - Kimi wa Oihagi o Mita ka?</description>
<year>1991</year>
<publisher>アイオン (Aion)</publisher>
@@ -35515,7 +35617,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
<software name="powdoll">
<description>Power Dolls</description>
<year>1994</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="パワードール" />
<info name="release" value="19940114" />
<part name="flop1" interface="floppy_5_25">
@@ -35548,7 +35650,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
<software name="powdoll2pd" cloneof="powdoll2">
<description>Power Dolls 2 Premium Disc</description>
<year>1995</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="パワードール2 プレミアムディスク" />
<info name="release" value="199502xx" />
<part name="flop1" interface="floppy_5_25">
@@ -35988,7 +36090,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</software>
<!-- boot OK on RS class, on VM class hangs with a black screen while attempting to access main menu from title. -->
- <!-- (hangs on a slave upd7220 FIFO empty/vsync check that never occurs, regression?) -->
+ <!-- (hangs on a bitmap upd7220 FIFO empty/vsync check that never occurs, regression?) -->
<software name="ppersia" supported="partial">
<description>Prince of Persia</description>
<year>1990</year>
@@ -36283,10 +36385,11 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
+ <!-- TODO: Is this a graphic tool? No readme in disk contents -->
<software name="prism98">
- <description>Prism 98</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>Prism 98 (v1.00)</description>
+ <year>1992</year>
+ <publisher>ウルフチーム (WolfTeam)</publisher>
<info name="alt_title" value="プリズム98" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="1281968">
@@ -36295,7 +36398,8 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="privates">
+ <!-- boot OK -->
+ <software name="privates" supported="yes">
<description>Private School</description>
<year>1989</year>
<publisher>エルフ (Elf)</publisher>
@@ -36314,12 +36418,14 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="proyakfn">
+ <!-- boot OK -->
+ <software name="proyakfn" supported="yes">
<description>Pro Yakyu FAN Telenet Stadium</description>
<year>1988</year>
<publisher>日本テレネット (Nihon Telenet)</publisher>
<info name="alt_title" value="プロ野球FAN テレネットスタジアム" />
<info name="release" value="198803xx" />
+ <!-- key mapping: numpad to move, '_' button 1, ':' button 2 -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="1357680">
<rom name="pro yakyu fan telenet stadium (1988)(telenet).d88" size="1357680" crc="0af4321b" sha1="780ac406b24c0b8f33ce1c0b25918f73d1b94ac3" offset="0" />
@@ -36327,7 +36433,8 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="prodmang">
+ <!-- boot OK -->
+ <software name="prodmang" supported="yes">
<description>Production Manager</description>
<year>1988</year>
<publisher>コムパック (Compac)</publisher>
@@ -36458,7 +36565,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
<software name="psychwar">
<description>Psychic War - Cosmic Soldier 2</description>
<year>1988</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="サイキックウォー コズミックソルジャー2" />
<info name="release" value="19880626" />
<part name="flop1" interface="floppy_5_25">
@@ -36488,16 +36595,19 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="pure">
+ <!-- boot OK -->
+ <software name="pure" supported="yes">
<description>Pure</description>
<year>1989</year>
<publisher>クィーンソフト (Queensoft)</publisher>
<info name="alt_title" value="ピュア" />
<info name="release" value="19890513" />
+ <!-- baddump: contains non-default saves -->
+ <!-- CONFIG.BAK and AUTOEXEC.BAK seems hotfixes that are left in production? -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="1261568">
- <rom name="pure_a.fdi" size="1261568" crc="21e59c3d" sha1="82aa702c52adbe08e64be0dc4b012526d0a4ad9c" offset="0" />
+ <rom name="pure_a.fdi" size="1261568" crc="21e59c3d" sha1="82aa702c52adbe08e64be0dc4b012526d0a4ad9c" offset="0" status="baddump" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
@@ -36644,7 +36754,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</software>
<!-- boot OK -->
- <!-- Has DAC1BIT Note class switch option, has Epson class mixing option -->
+ <!-- Has DAC1BIT Note class switch option, has Epson class sound mixing option -->
<software name="puyopuyo" supported="yes">
<description>Puyo Puyo</description>
<year>1993</year>
@@ -38690,10 +38800,22 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
<software name="sabnack">
<description>Sabnack</description>
<year>1991</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="サブナック" />
<info name="release" value="19910628" />
<part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size = "1261568">
+ <rom name="sabnack.hdm" size="1261568" crc="ab9822da" sha1="6c7ead399da89c0ff03c1b5f646d0f402f5a8cb6" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sabnackd" cloneof="sabnack">
+ <description>Sabnack (Demo)</description>
+ <year>1991</year>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
+ <info name="alt_title" value="サブナック" />
+ <part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="1265664">
<rom name="sabnack (j).fdi" size="1265664" crc="3678bad7" sha1="6b251cdc11ff17da1b9a1ff4b0bce2be4d9b0619" offset="0" />
</dataarea>
@@ -38821,9 +38943,11 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="salamand">
- <description>Salamander</description>
+ <!-- boot OK on RS class -->
+ <software name="salamand" supported="yes">
+ <description>Salamander (v92-03-01)</description>
<year>1992</year>
+ <!-- Konami / LOGIN / Gold Cats -->
<publisher>Gold Cats</publisher>
<info name="alt_title" value="沙羅曼蛇" />
<part name="flop1" interface="floppy_5_25">
@@ -39225,7 +39349,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
<software name="schwarzs">
<description>Schwarzschild - Kyouran no Ginga</description>
<year>1988</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="シュヴァルツシルト" />
<info name="release" value="19881209" />
<part name="flop1" interface="floppy_5_25">
@@ -39245,7 +39369,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
<software name="schwarz2">
<description>Schwarzschild II - Teikoku no Haishin</description>
<year>1989</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="シュヴァルツシルト2 帝國ノ背信" />
<info name="release" value="19890630" />
<part name="flop1" interface="floppy_5_25">
@@ -39265,7 +39389,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
<software name="schwarz3">
<description>Schwarzschild III - Wakusei Desperan</description>
<year>1992</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="シュヴァルツシルト3 惑星デスペラン" />
<info name="release" value="19920228" />
<part name="flop1" interface="floppy_5_25">
@@ -39291,7 +39415,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
<software name="schwarz3a" cloneof="schwarz3">
<description>Schwarzschild III - Wakusei Desperan (Alt)</description>
<year>1992</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="シュヴァルツシルト3 惑星デスペラン" />
<info name="release" value="19920228" />
<part name="flop1" interface="floppy_5_25">
@@ -39317,7 +39441,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
<software name="schwarz4">
<description>Schwarzschild IV - The Cradle End</description>
<year>1993</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="シュヴァルツシルト4 THE CRADLE END" />
<info name="release" value="19930402" />
<part name="flop1" interface="floppy_5_25">
@@ -40869,6 +40993,8 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</software>
<!-- 2dd images, attempt to map them on 9801F (in drive 2 + BIOS enabled in Machine Config) causes access violation -->
+ <!-- [On RS class with FDC set as 2HD it never completes sub-routine at PC=0x1fc99] -->
+ <!-- [Jumps off the weed with 2DD mode, never initializes 0x1fc00 onward.] -->
<software name="sorcer" supported="no">
<description>Sorcerian</description>
<year>1988</year>
@@ -41330,92 +41456,95 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="sstrider">
+ <!-- During install pcm482.pc8 throws a CRC error at the end of disk J extraction -->
+ <!-- TODO: check if it needs redump -->
+ <!-- Extremely slow during gameplay (at least on RS class) -->
+ <software name="sstrider" supported="no">
<description>Star Striders</description>
<year>1994</year>
<publisher>ケイエスエス (KSS)</publisher>
<info name="alt_title" value="スターストライダーズ" />
<info name="release" value="19941216" />
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
+ <feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="1265664">
<rom name="sstriders_01.fdi" size="1265664" crc="4cc2d7b9" sha1="304d875d0e98ab96b2e7aa218983b2939cb4e64d" offset="0" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
+ <feature name="part_id" value="Disk B"/>
<dataarea name="flop" size="1265664">
<rom name="sstriders_02.fdi" size="1265664" crc="3fc15627" sha1="45f8de723fd987db1c954b44e4c8297bffaaf83d" offset="0" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
+ <feature name="part_id" value="Disk C"/>
<dataarea name="flop" size="1265664">
<rom name="sstriders_03.fdi" size="1265664" crc="b2cbd5af" sha1="dcf5c6087d35cb05ff492b99ce1d7c3e3e24c782" offset="0" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
+ <feature name="part_id" value="Disk D"/>
<dataarea name="flop" size="1265664">
<rom name="sstriders_04.fdi" size="1265664" crc="3472dd1d" sha1="2bb6e4efcac4e5dc283a641f2b4dc130750a2db5" offset="0" />
</dataarea>
</part>
<part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5"/>
+ <feature name="part_id" value="Disk E"/>
<dataarea name="flop" size="1265664">
<rom name="sstriders_05.fdi" size="1265664" crc="b8461eee" sha1="65883e9a9b6dbeafc752b6207853aa8af88be97c" offset="0" />
</dataarea>
</part>
<part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 6"/>
+ <feature name="part_id" value="Disk F"/>
<dataarea name="flop" size="1265664">
<rom name="sstriders_06.fdi" size="1265664" crc="eb432a33" sha1="cef1f47d35457f0e6cf2c84f41085805ce882be2" offset="0" />
</dataarea>
</part>
<part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 7"/>
+ <feature name="part_id" value="Disk G"/>
<dataarea name="flop" size="1265664">
<rom name="sstriders_07.fdi" size="1265664" crc="70bb07a0" sha1="f484f263f7db17760bc655da7882c049e769d0a8" offset="0" />
</dataarea>
</part>
<part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk 8"/>
+ <feature name="part_id" value="Disk H"/>
<dataarea name="flop" size="1265664">
<rom name="sstriders_08.fdi" size="1265664" crc="fab000b7" sha1="1a96b7ef8ece87fb99621719393d899d999f7c34" offset="0" />
</dataarea>
</part>
<part name="flop9" interface="floppy_5_25">
- <feature name="part_id" value="Disk 9"/>
+ <feature name="part_id" value="Disk I"/>
<dataarea name="flop" size="1265664">
<rom name="sstriders_09.fdi" size="1265664" crc="94bd08f2" sha1="4cdb7d3eaae9a0c13174312fe8ca9b451ee9d05e" offset="0" />
</dataarea>
</part>
<part name="flop10" interface="floppy_5_25">
- <feature name="part_id" value="Disk 10"/>
+ <feature name="part_id" value="Disk J"/>
<dataarea name="flop" size="1265664">
<rom name="sstriders_10.fdi" size="1265664" crc="6610a8e6" sha1="0c44e7f57056939f014dc76bd78a8dab7aafbe17" offset="0" />
</dataarea>
</part>
<part name="flop11" interface="floppy_5_25">
- <feature name="part_id" value="Disk 11"/>
+ <feature name="part_id" value="Disk K"/>
<dataarea name="flop" size="1265664">
<rom name="sstriders_11.fdi" size="1265664" crc="f0b38f13" sha1="b1653ee90c732344262343b59133894a5809cb65" offset="0" />
</dataarea>
</part>
<part name="flop12" interface="floppy_5_25">
- <feature name="part_id" value="Disk 12"/>
+ <feature name="part_id" value="Disk L"/>
<dataarea name="flop" size="1265664">
<rom name="sstriders_12.fdi" size="1265664" crc="946e1f33" sha1="40b043f86a66d1f025e0ef44711b14f5f520e2bf" offset="0" />
</dataarea>
</part>
<part name="flop13" interface="floppy_5_25">
- <feature name="part_id" value="Disk 13"/>
+ <feature name="part_id" value="Disk M"/>
<dataarea name="flop" size="1265664">
<rom name="sstriders_13.fdi" size="1265664" crc="eff2168d" sha1="5934fe8379937296ee4e68d9826dcfdf355535b9" offset="0" />
</dataarea>
</part>
<part name="flop14" interface="floppy_5_25">
- <feature name="part_id" value="Disk 14"/>
+ <feature name="part_id" value="Disk N"/>
<dataarea name="flop" size="1265664">
<rom name="sstriders_14.fdi" size="1265664" crc="6b66e4a8" sha1="0a1a2a9f4be6d5a8b6b6cc08a9693ab7e67e85fb" offset="0" />
</dataarea>
@@ -42639,12 +42768,15 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="taiheiyo">
+ <!-- "Illegal function call in 1050" for VM class and RS class (btanb?) -->
+ <!-- Black screen on vanilla class -->
+ <software name="taiheiyo" supported="no">
<description>Taiheiyou no Arashi</description>
<year>1987</year>
<publisher>ジーエーエム (GAM)</publisher>
<info name="alt_title" value="太平洋の嵐" />
<info name="release" value="19871208" />
+ <!-- TODO: Verify usage, should really be "vanilla" class only -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="1086448">
@@ -42918,7 +43050,8 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="telenetm">
+ <!-- boot OK -->
+ <software name="telenetm" supported="yes">
<description>Telenet Music Box</description>
<year>1989</year>
<publisher>日本テレネット (Nihon Telenet)</publisher>
@@ -43650,7 +43783,9 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="tenkyuh">
+ <!-- boot OK on RS class -->
+ <!-- throws "heap stack over" on VM class (or outright hangs on title screen) -->
+ <software name="tenkyuh" supported="partial">
<description>Tenkyuuhai</description>
<year>1989</year>
<publisher>パンサーソフトウェア (Panther Software)</publisher>
@@ -44276,12 +44411,15 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="tokisg2">
+ <!-- boot OK on VM class -->
+ <!-- Throws a "NEC PC-9801 only -> int trap halt" on RS class (btanb) -->
+ <software name="tokisg2" supported="yes">
<description>Tokimeki Sports Gal II</description>
<year>1988</year>
<publisher>アダルティン (Adult Inn)</publisher>
<info name="alt_title" value="ときめきスポーツギャル2" />
<info name="release" value="198809xx" />
+ <info name="usage" value="Boots on V30 class machines only" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="1265664">
<rom name="soprtgal2.fdi" size="1265664" crc="d36dfda4" sha1="42cfbc41b04320874371dd68c4ef4edbffa8f262" offset="0" />
@@ -46196,7 +46334,10 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="vaindrem">
+ <!-- boot OK -->
+ <!-- TODO: it reportedly has copy protection check near the ending, -->
+ <!-- where character(s) scolds the player and refuses to continue. -->
+ <software name="vaindrem" supported="yes">
<description>Vain Dream</description>
<year>1991</year>
<publisher>グローディア (Glodia)</publisher>
@@ -50779,6 +50920,10 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</software>
<!-- Hangs at the main menu -->
+ <!-- [Expects upd7220 bitmap port to have bit 3 status (drawing in progress) held high for a bit longer causing the hang] -->
+ <!-- Draws GFX boxes with incorrect doubled height. -->
+ <!-- Eventually hangs after disk swap on gameplay anyway. -->
+ <!-- Uses NAX.EXE -->
<software name="deep" supported="no">
<description>Deep</description>
<year>1994</year>
@@ -50835,7 +50980,9 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="diamondp">
+ <!-- boot OK -->
+ <!-- during a game mouse clicking is too fast (skips intermediate selections) -->
+ <software name="diamondp" supported="partial">
<description>Diamond Players</description>
<year>1992</year>
<publisher>日本テレネット (Nihon Telenet)</publisher>
@@ -51338,6 +51485,8 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
+ <!-- Black screen on boot -->
+ <!-- "Bad allocation table" by issuing a files command in a Disk BASIC -->
<software name="gandhara" supported="no">
<description>Gandhara</description>
<year>1988</year>
@@ -52552,12 +52701,14 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="localba" supported="no">
+ <!-- boot OK -->
+ <software name="localba" supported="yes">
<description>Locus Alba</description>
<year>1995</year>
<publisher>アルゴラボ 算法研究所 (Algolab)</publisher>
<info name="alt_title" value="ロクス・アルバ" />
<info name="release" value="19950421" />
+ <info name="usage" value="Needs a DOS install from HDD, run LAINST.BAT" />
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="1329680">
@@ -53010,6 +53161,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
+ <!-- Doesn't display GFXs properly, gameplay is blacked out etc. -->
<software name="loopz" supported="no">
<description>Loopz</description>
<year>1991</year>
@@ -53030,12 +53182,15 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="loopyq">
+ <!-- boot OK -->
+ <software name="loopyq" supported="yes">
<description>LoopyQ</description>
<year>1992</year>
<publisher>日本ソフテック (Nihon Softec)</publisher>
<info name="alt_title" value="ルービーQ" />
<info name="release" value="19921119" />
+ <!-- Directions with numpad, 'Z' key to select -->
+ <!-- cfr. bp 10900, (eax & 0xff) != 0 -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="1261568">
<rom name="loopyq.hdm" size="1261568" crc="5aaf0dc8" sha1="d9720bc05f91354187ff362ceefe43d81234f84d" offset="0" />
@@ -53043,13 +53198,18 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="lotus123" supported="no">
+ <!-- Launching LOTUS.COM and selecting any option except the demo prompts the user for a system or data disk -->
+ <!-- Is this a partial user massaged dump to be autobootable? -->
+ <software name="lotus123" supported="partial">
+ <!-- based off R2.2J according to LOTUS.COM -->
<description>Lotus 1-2-3 (Demo)</description>
- <year>19??</year>
+ <!-- all files sports a 1989 timestamp but AUTOEXEC.BAT (1990-08-02) -->
+ <year>1989?</year>
+ <!-- "Lotus Development Japan Ltd." -->
<publisher>Lotus</publisher>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="1261568">
- <rom name="lotus123_demo.hdm" size="1261568" crc="20a570a9" sha1="d74a9dc3564adf145427200faa13521d57a27a22" offset="0" />
+ <rom name="lotus123_demo.hdm" size="1261568" crc="20a570a9" sha1="d74a9dc3564adf145427200faa13521d57a27a22" offset="0" status="baddump" />
</dataarea>
</part>
</software>
@@ -53128,6 +53288,8 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
+ <!-- Hangs while executing ISD.EXE -->
+ <!-- (r/w I/O ports $d0 and $40, expecting a device to be connected to parallel port?) -->
<software name="magicart" supported="no">
<description>Magical Art</description>
<year>19??</year>
@@ -53161,6 +53323,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
<publisher>日本物産 (Nihon Bussan)</publisher>
<info name="alt_title" value="麻雀王伝説" />
<info name="release" value="19920626" />
+ <!-- TODO: Most likely requires DOS user disk creation like 46okunen -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="1329680">
@@ -53262,7 +53425,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
<software name="lavaleur" supported="no">
<description>Mashou Denki La Valeur</description>
<year>1989</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="魔晶伝記ラヴァルー" />
<info name="release" value="19891130" />
<part name="flop1" interface="floppy_5_25">
@@ -55498,8 +55661,10 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
-<!-- confirmed as good by peter_j -->
- <software name="trial4" supported="no">
+ <!-- doesn't boot if launched stand-alone -->
+ <!-- It does from a DOS HDD install with no FM sound -->
+ <!-- confirmed as good by peter_j -->
+ <software name="trial4" supported="partial">
<description>Trial of Fours</description>
<year>1992</year>
<publisher>ウエストサイド (WestSide)</publisher>
@@ -55512,12 +55677,17 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</part>
</software>
- <software name="ultrasak">
+ <!-- fails disk swap, even on DOS while installing game -->
+ <!-- Omake: system disk contains a "jafcon92.lzh" in a demo folder -->
+ <software name="ultrasak" supported="no">
<description>Ultra Sakusen - Kagaku Tokusoutai Shutsugeki Seyo!</description>
<year>1992</year>
<publisher>バンプレスト (Banpresto)</publisher>
<info name="alt_title" value="ウルトラ作戦 科学特捜隊出撃せよ!" />
<info name="release" value="19921208" />
+ <!-- all disks contains a "DID" file with single ASCII byte for identification -->
+ <!-- 0 for System Disk, 1 for Disk 1, 2 for Disk 2 etc. -->
+ <!-- TODO: actual disks comes with story labels -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="System Disk"/>
<dataarea name="flop" size="1261568">
@@ -55525,37 +55695,37 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?)
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk A"/>
+ <feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="1261568">
<rom name="a.hdm" size="1261568" crc="8daf39f0" sha1="53a1f3290b2cd07b72fb42eb970b0120106b76fd" offset="0" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk B"/>
+ <feature name="part_id" value="Disk 2"/>
<dataarea name="flop" size="1261568">
<rom name="b.hdm" size="1261568" crc="bc7ebede" sha1="b6cc7d3d18198deb918556eaefb422c3f9311148" offset="0" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk C"/>
+ <feature name="part_id" value="Disk 3"/>
<dataarea name="flop" size="1261568">
<rom name="c.hdm" size="1261568" crc="1513def4" sha1="fabc4016c6f38e98a36a6a8b04e9e8b6a21a9599" offset="0" />
</dataarea>
</part>
<part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk D"/>
+ <feature name="part_id" value="Disk 4"/>
<dataarea name="flop" size="1261568">
<rom name="d.hdm" size="1261568" crc="dfa1fbd2" sha1="22bbc1bfcbef5807241a3958a3773c959948b209" offset="0" />
</dataarea>
</part>
<part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk E"/>
+ <feature name="part_id" value="Disk 5"/>
<dataarea name="flop" size="1261568">
<rom name="e.hdm" size="1261568" crc="553015ef" sha1="085e87a73ccc767ff157e0ef8342fc2dd3a69217" offset="0" />
</dataarea>
</part>
<part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk F"/>
+ <feature name="part_id" value="Disk 6"/>
<dataarea name="flop" size="1261568">
<rom name="f.hdm" size="1261568" crc="1e0680ce" sha1="52fb9ecd5edab9c8f653330699849ad075344cbb" offset="0" />
</dataarea>
@@ -56233,7 +56403,7 @@ SPACE EMPIRE
<software name="advpowd2">
<description>Advanced Power Dolls 2</description>
<year>1996</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="アドヴァンスド パワードール2" />
<info name="release" value="19960223" />
<info name="usage" value="Boot DOS from floppy, insert disk 1 and run INST.EXE" />
@@ -57168,6 +57338,8 @@ SPACE EMPIRE
</part>
</software>
+ <!-- TODO: verify support status -->
+ <!-- Omake: boot DOS, insert Disk 2, run omake.com for hidden developer message -->
<software name="macross3" supported="no">
<description>Choujikuu Yousai Macross - Love Stories</description>
<year>1994</year>
@@ -57734,16 +57906,19 @@ SPACE EMPIRE
</part>
</software>
- <software name="dennoga3">
+ <!-- boot OK -->
+ <software name="dennoga3" supported="yes">
<description>Cybernetic Hi-School / Dennou Gakuen III - Top wo Nerae!</description>
<year>1990</year>
+ <!-- Bandai/Victor/Gainax -->
<publisher>ガイナックス (Gainax)</publisher>
<info name="alt_title" value="電脳学園3 トップをねらえ!" />
<info name="release" value="19900324" />
+ <!-- baddump: contains non-factory save -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="1143804">
- <rom name="denno gakuen 3 (1990)(gainax)(disk 1 of 4)(disk a).fdd" size="1143804" crc="cd97dbbd" sha1="8c44093cd8a303dfe764f675444a8259cc144d35" offset="0" />
+ <rom name="denno gakuen 3 (1990)(gainax)(disk 1 of 4)(disk a).fdd" size="1143804" crc="cd97dbbd" sha1="8c44093cd8a303dfe764f675444a8259cc144d35" offset="0" status="baddump" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
@@ -61360,7 +61535,9 @@ SPACE EMPIRE
</part>
</software>
- <software name="jastrike" supported="no">
+ <!-- boot OK -->
+ <!-- TODO: is mouse input supposed to work on gameplay too? -->
+ <software name="jastrike" supported="partial">
<description>Metal Mover Jastrike</description>
<year>1995</year>
<publisher>アップルパイ/コーヒーぶれいく (Apple Pie / Coffee Break)</publisher>
@@ -61937,7 +62114,7 @@ SPACE EMPIRE
<software name="powdoll2" supported="no">
<description>Power Dolls 2</description>
<year>1995</year>
- <publisher>工画堂 (Kogado)</publisher>
+ <publisher>工画堂スタジオ (Kogado Studio)</publisher>
<info name="alt_title" value="パワードール2" />
<info name="release" value="19941202" />
<part name="flop1" interface="floppy_5_25">
@@ -65741,8 +65918,11 @@ SPACE EMPIRE
</part>
</software>
- <software name="superdep">
- <description>Super Depth - The Ultimate Hyper Battleship</description>
+ <!-- boot OK (abuses of DAC1BIT for sound) -->
+ <software name="superdep" supported="yes">
+ <!-- versioning is in depth.doc -->
+ <!-- 10th August 1991 according to ranking screen -->
+ <description>Super Depth - The Ultimate Hyper Battleship (v1.00)</description>
<year>1991</year>
<publisher>バイオひゃくパーセント (Bio 100%)</publisher>
<part name="flop1" interface="floppy_5_25">
@@ -65759,7 +65939,6 @@ SPACE EMPIRE
These were available for download at Vector's homepage
The disk images below have been created by users to launch the games in emulators
-
-->
<software name="7narabe">
@@ -65796,7 +65975,8 @@ SPACE EMPIRE
</part>
</software>
- <!-- This game plays music through the beeper, but it doesn't work in MAME - it just outputs a constant beep -->
+ <!-- boot OK -->
+ <!-- DAC1BIT is very grainy to say the least on RS class -->
<software name="aisland" supported="partial">
<description>Aisland</description>
<year>19??</year>
@@ -65819,7 +65999,9 @@ SPACE EMPIRE
</part>
</software>
- <!-- Wrong sound effects (they are supposed to have different tones, not just a constant beep) -->
+ <!-- boot OK -->
+ <!-- TODO: checkout if it needs a specific key to attack or somehow increase the score -->
+ <!-- (X jumps, left/right to move. Marked as kusoge by game itself) -->
<software name="baka" supported="partial">
<description>BAKA - Boss of the Sunset</description>
<year>19??</year>
@@ -65854,8 +66036,10 @@ SPACE EMPIRE
</part>
</software>
- <software name="casinodr">
- <description>Casino Dream</description>
+ <!-- boot OK -->
+ <software name="casinodr" supported="yes">
+ <!-- Ver.4.4 By SIMONS -->
+ <description>Casino Dream (v4.4)</description>
<year>19??</year>
<publisher>&lt;unofficial&gt;</publisher>
<part name="flop1" interface="floppy_5_25">
@@ -66064,9 +66248,12 @@ SPACE EMPIRE
</part>
</software>
- <software name="matsulab">
+ <!-- boot OK -->
+ <software name="matsulab" supported="yes">
<description>Matsudo Labo</description>
- <year>19??</year>
+ <!-- dir contents shows game files being touched 93-04-01, -->
+ <!-- a first COMMAND.COM files in '94 then CONFIG.SYS / AUTOEXEC.BAT in 2013 -->
+ <year>1993?</year>
<publisher>&lt;unofficial&gt;</publisher>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="1265664">
@@ -66700,7 +66887,7 @@ doujin?!?
<description>Bounty Hunter Akemi</description>
<year>19??</year>
<publisher>&lt;doujin&gt;</publisher>
- <info name="author" value="Soft House Indojin" />
+ <info name="author" value="SOFT HOUSE 印度人 (Soft House Indojin)" />
<info name="alt_title" value="バウンティーハンター アケミ" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1478656">
@@ -66908,7 +67095,8 @@ doujin?!?
</part>
</software>
- <software name="smajokko">
+ <!-- boot OK -->
+ <software name="smajokko" supported="yes">
<description>Dai-2-Ji Super Majokko Taisen</description>
<year>1995</year>
<publisher>&lt;doujin&gt;</publisher>
@@ -67682,6 +67870,20 @@ doujin?!?
</part>
</software>
+ <software name="marubats">
+ <description>Marubatsu EXE</description>
+ <year>1989</year>
+ <publisher>&lt;doujin&gt;</publisher>
+ <info name="author" value="SOFT HOUSE 印度人 (Soft House Indojin)" />
+ <info name="alt_title" value="マルバツEXE" />
+ <info name="version" value="1.0" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size = "1086448">
+ <rom name="marubatsu exe.d88" size="1086448" crc="c56e4a9d" sha1="6e8deb4eabb1891aa870a6b53e155736e269897a" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="masthand" supported="no">
<description>Master Hand</description>
<year>19??</year>
@@ -68908,9 +69110,11 @@ doujin?!?
</part>
</software>
- <software name="yukoanat">
+ <!-- boot OK -->
+ <software name="yukoanat" supported="yes">
<description>Youko to Anata - Hard Porno Soft</description>
- <year>19??</year>
+ <!-- Latest file has a timestamp of 1988-12-24, may be released in '89 -->
+ <year>1988?</year>
<publisher>&lt;doujin&gt;</publisher>
<info name="alt_title" value="ようことあなた" />
<info name="author" value="OPC Soft" />
@@ -69454,8 +69658,10 @@ Same as Police Quest 2 - Quest for Glory stand-alone disks
<!-- Investigate! Identify precisely these sets -->
-<!-- Dante 98 soft? check: http://nekonojidai.web.fc2.com/otherdante.htm -->
- <software name="seikenmd">
+ <!-- Based off RPGツクールDante98 software ('92 ASCII/LOGiN original print of RPG Maker) -->
+ <!-- http://nekonojidai.web.fc2.com/otherdante.htm -->
+ <!-- Hangs on bare title display on RS class -->
+ <software name="seikenmd" supported="no">
<description>Seiken to Maken no Densetsu</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -69474,11 +69680,12 @@ Same as Police Quest 2 - Quest for Glory stand-alone disks
</part>
</software>
-
- <software name="sengoku">
- <description>Sengoku (?)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <!-- boot OK on RS class -->
+ <software name="sengoku" supported="yes">
+ <description>Yamashina Keisuke no Sengoku</description>
+ <year>1992</year>
+ <publisher>ファミリーソフト (Family Soft)</publisher>
+ <info name="alt_title" value="山科けいすけのSENGOKU" />
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="1281968">
@@ -69493,13 +69700,16 @@ Same as Police Quest 2 - Quest for Glory stand-alone disks
</part>
</software>
- <!-- "Presented by Splush Wave" then black screen -->
- <software name="datsumj" supported="no">
+ <!-- "Presented by Splush Wave" then hard crashes machine -->
+ <!-- Uses NAX.EXE, and it actually checks for the presence of PCM.TBL, which is provided by the Otomi-chan Kai install disks (undumped) -->
+ <!-- boot otherwise with the provided instructions with no voice samples -->
+ <software name="datsumj" supported="partial">
<description>Datsui Mahjong Margarita</description>
<year>199?</year>
<publisher>Splush Wave (Doujin)</publisher>
<info name="alt_title" value="脱衣麻雀マルガリータ" />
- <info name="usage" value="From DOS, run MA.BAT" />
+ <info name="usage" value="From DOS, install to HDD via INSTALL.BAT. SEDIT the resulting MA.BAT, edit NAX.EXE line suffixing a -2 or -3 (-26/-86 compatible mode respectively), save and launch it" />
+ <!-- alt way: Just save an empty PCM.TBL in the directory -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="1265664">
<rom name="margarita.fdi" size="1265664" crc="2d77f72a" sha1="d0788b24bd6e32ea74b6edefd59bddb6795b3d64" offset="0" />
@@ -69519,10 +69729,13 @@ Same as Police Quest 2 - Quest for Glory stand-alone disks
</part>
</software>
- <software name="joro2">
+ <!-- definitely needs a 9821 machine -->
+ <!-- after install instructions claims to switch to HDD directory and run "kumo", this is nowhere to be found? -->
+ <software name="joro2" supported="no">
<description>Joro v2 (?)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1997?</year>
+ <publisher>Stone Heads</publisher>
+ <info name="usage" value="From DOS, run hds.bat and select a drive to install separated with semicolon (a; not a:)" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="1265664">
<rom name="jorov21.fdi" size="1265664" crc="973c2459" sha1="1650606de9b246cfa24c8731d36c2204dac4e04f" offset="0" />
@@ -69535,8 +69748,6 @@ Same as Police Quest 2 - Quest for Glory stand-alone disks
</part>
</software>
-
-
<!-- <software name="">
<description>lodoss tou senki - custom (turbo program?) / ロードス島戦記カスタム</description>
<year>19??</year>
diff --git a/hash/pc98_cd.xml b/hash/pc98_cd.xml
index d10cdb614c2..58f88858375 100644
--- a/hash/pc98_cd.xml
+++ b/hash/pc98_cd.xml
@@ -18,6 +18,38 @@ license:CC0
<!-- OS disks -->
+ <!--
+ PC-9801RS is the only machine that can boot the install disk in MAME, others complain about the CPU not being set to HIGH.
+ Even on the RS, it doesn't launch the GUI part of the install program, so you are left with an incomplete installation.
+ These are emulation bugs, it works correctly on real hardware.
+ -->
+ <software name="os2warp3" supported="no">
+ <!--
+ Origin: private dump (sampson)
+ <rom name="NEC PC-9800 Series Software Library OS2 Warp V3-Japanese Version.iso" size="626159616" crc="8c7f8ee4" sha1="e43ff429f3100d00197d8b3cf5dd0838457ae0b8"/>
+ -->
+ <description>OS/2 Warp V3 - Nihongo-ban</description>
+ <year>1995</year>
+ <publisher>NEC / IBM</publisher>
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Install Disk" />
+ <dataarea name="flop" size="1261568">
+ <rom name="installation disk [fd].hdm" size="1261568" crc="afac2fa0" sha1="10fe461659220379a0daad875e6e1c3f9e70f60e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="1261568">
+ <rom name="disk 1 [fd].hdm" size="1261568" crc="7f61ff57" sha1="cad9ab86ae7e5d5c6ab92a374efc71034f443604" offset="0" />
+ </dataarea>
+ </part>
+ <!-- The package also includes a "Device Support Disk" floppy, but the one in this copy was damaged -->
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="nec pc-9800 series software library os2 warp v3-japanese version" sha1="1d7f2f166016a665091ffae6e759541a76d69485" />
+ </diskarea>
+ </part>
+ </software>
<!--
@@ -578,9 +610,45 @@ license:CC0
<software name="akikogld">
<!--
- Origin: peter_j (Super Lonely Terminal)
- <rom name="ides_022.bin" size="683782848" crc="d90e7b58" sha1="133338cf93152d5dc89d75d5677eb1ceb89b5e90"/>
- <rom name="ides_022.cue" size="2954" crc="c254073b" sha1="59704849bffb5e008d361c2254882260fb2276db"/>
+ Origin: redump.org (CD) / wiggy2k (floppy)
+ <rom name="Akiko Gold (Japan) (Track 01).bin" size="11301360" crc="3eab8f9b" sha1="a27acf0512a8be7ba87dfe9bd029966f4fb1f3ca"/>
+ <rom name="Akiko Gold (Japan) (Track 02).bin" size="25208736" crc="a89d7738" sha1="e41233aa3762927bbd38fe84afdc62c576e18f53"/>
+ <rom name="Akiko Gold (Japan) (Track 03).bin" size="29068368" crc="363c4abb" sha1="04f1eda6a431ed689954d4c3ad25d833777381e4"/>
+ <rom name="Akiko Gold (Japan) (Track 04).bin" size="26937456" crc="82a9bac7" sha1="f0710bdbfbc04acd44857172ac405b0a4788a72e"/>
+ <rom name="Akiko Gold (Japan) (Track 05).bin" size="27694800" crc="021de085" sha1="09f30a8c1f179691bd3118da0da87618d20f28b8"/>
+ <rom name="Akiko Gold (Japan) (Track 06).bin" size="28534464" crc="d06a5427" sha1="242026ba38f73693c990924c11653cd0716d4da4"/>
+ <rom name="Akiko Gold (Japan) (Track 07).bin" size="26462352" crc="60feb7fd" sha1="58f01524f34792af2ad6976535adeeac92360e3f"/>
+ <rom name="Akiko Gold (Japan) (Track 08).bin" size="25486272" crc="d17aff01" sha1="cfb4afcaf10a09f3027abc05d665932e7afae6a4"/>
+ <rom name="Akiko Gold (Japan) (Track 09).bin" size="30427824" crc="501287e3" sha1="a17102dceee950cb9ecc1a25ddbfe92055a313c9"/>
+ <rom name="Akiko Gold (Japan) (Track 10).bin" size="28955472" crc="0b80fb20" sha1="c819dabf9758d8cd69175d11f0d9f3e1b3378724"/>
+ <rom name="Akiko Gold (Japan) (Track 11).bin" size="25843776" crc="68e9b6c3" sha1="410b16794f1d149b509cec218583ad1454ee5ffe"/>
+ <rom name="Akiko Gold (Japan) (Track 12).bin" size="38015376" crc="5720bd3e" sha1="07d08be4f373a18042a53a5cda43f99973d98971"/>
+ <rom name="Akiko Gold (Japan) (Track 13).bin" size="26076624" crc="5f4c36a2" sha1="f841141b04f6f0e239d6610db2c11a8453e4f8cb"/>
+ <rom name="Akiko Gold (Japan) (Track 14).bin" size="26918640" crc="c9eb0165" sha1="024dc393ec570c787d0fbf6af8e7b7a673785fa1"/>
+ <rom name="Akiko Gold (Japan) (Track 15).bin" size="28978992" crc="24f549ca" sha1="32e02886a49e1ba08343a66e15f33f64bb2b7f01"/>
+ <rom name="Akiko Gold (Japan) (Track 16).bin" size="32951520" crc="b001a90b" sha1="705570289cb1c426618f9136a3f0c32638bb8ecf"/>
+ <rom name="Akiko Gold (Japan) (Track 17).bin" size="29202432" crc="c521a421" sha1="840767a253ce91b7546e790b45542c042d60ae74"/>
+ <rom name="Akiko Gold (Japan) (Track 18).bin" size="27882960" crc="89e1305c" sha1="35ee2abefd37b0a491e86073b0cee03abad2927f"/>
+ <rom name="Akiko Gold (Japan) (Track 19).bin" size="8998752" crc="9d71b2fe" sha1="2980454025482075b0456e541cd8ace9d847247c"/>
+ <rom name="Akiko Gold (Japan) (Track 20).bin" size="11256672" crc="f69b7391" sha1="8bc9e633c009890554dbe27d3f1274715c2b5f07"/>
+ <rom name="Akiko Gold (Japan) (Track 21).bin" size="11522448" crc="74da3236" sha1="5938b69115afc34c55992b629dd6135e08449f07"/>
+ <rom name="Akiko Gold (Japan) (Track 22).bin" size="15276240" crc="751622ef" sha1="2f761386e77a3484504dc88cea3d4db9227320bb"/>
+ <rom name="Akiko Gold (Japan) (Track 23).bin" size="7366464" crc="b1977fd0" sha1="6c2eb27ecfd5523a9574b8de8238138b2ec32ac4"/>
+ <rom name="Akiko Gold (Japan) (Track 24).bin" size="9956016" crc="a4bf7f35" sha1="65d6fd8abc46ea4a664d199f5b3298854ed2ccdf"/>
+ <rom name="Akiko Gold (Japan) (Track 25).bin" size="11042640" crc="9c0012b9" sha1="e6a4e884fb71433bed8a48da33c153a3225d939b"/>
+ <rom name="Akiko Gold (Japan) (Track 26).bin" size="12632592" crc="938da1ad" sha1="a4660ec66e4f393410e47ca7beab7927528cfa60"/>
+ <rom name="Akiko Gold (Japan) (Track 27).bin" size="8424864" crc="9a151058" sha1="e1e4a8589b0fc2dbf5d583b3be741a651cfed76b"/>
+ <rom name="Akiko Gold (Japan) (Track 28).bin" size="16673328" crc="51739989" sha1="1614241aef967d460ded7f7826ef3a3740333c66"/>
+ <rom name="Akiko Gold (Japan) (Track 29).bin" size="8634192" crc="f88a1ba2" sha1="a620ecba85aa458c57bf783efa8d67795feea887"/>
+ <rom name="Akiko Gold (Japan) (Track 30).bin" size="9311568" crc="69f569e9" sha1="ec5d6381f18900246d131684a756f30669e21fa4"/>
+ <rom name="Akiko Gold (Japan) (Track 31).bin" size="5950560" crc="ca0260cc" sha1="6f85abcdbb506cf18b50fe0c51463faef0e59e32"/>
+ <rom name="Akiko Gold (Japan) (Track 32).bin" size="7451136" crc="a5aa2c72" sha1="bae30dfb68ffc48be7d770eaee116cc83dbd51ba"/>
+ <rom name="Akiko Gold (Japan) (Track 33).bin" size="8930544" crc="b15af89f" sha1="7d80a805aeb02b3f30f97659e4e9f0e224785867"/>
+ <rom name="Akiko Gold (Japan) (Track 34).bin" size="12110448" crc="56fe58f4" sha1="1046bb38914c5343a5bf41434d83d76be092b719"/>
+ <rom name="Akiko Gold (Japan) (Track 35).bin" size="8780016" crc="7f99b9b1" sha1="77369b568a30df87382f8e364f22b6a78a8d9d00"/>
+ <rom name="Akiko Gold (Japan) (Track 36).bin" size="11397792" crc="81d702e7" sha1="70a0d374b6bade93dae40308da26e3fca2f9aeb1"/>
+ <rom name="Akiko Gold (Japan) (Track 37).bin" size="2471952" crc="76894478" sha1="bea1a8676170693f293ce07d51e5d3040293bd06"/>
+ <rom name="Akiko Gold (Japan).cue" size="4741" crc="173e4263" sha1="65959e9655e73d93663152cc9686b35fc7cbdce9"/>
-->
<description>Akiko Gold - The Queen of Adult</description>
<year>1995</year>
@@ -589,13 +657,14 @@ license:CC0
<info name="alt_title" value="亜紀子 GOLD" />
<info name="release" value="19950127" />
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A" />
<dataarea name="flop" size="1261568">
- <rom name="queen_of_adult_gold.hdm" size="1261568" crc="1f3b2827" sha1="474844f857f2b8b2f063c509f1ebf49d1b533650" offset="0" />
+ <rom name="akiko_gold_disk_a.hdm" size="1261568" crc="110cfa6c" sha1="d27aa70f07bd45d751ee14f5841ed60f732e25af" offset="0" />
</dataarea>
</part>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="ides_022" sha1="0926c648f51ca16be9094ab3c3bf261c28094f99"/>
+ <disk name="akiko gold (japan)" sha1="c4945f53980f782a95439f1bb4877be9e44b8018"/>
</diskarea>
</part>
</software>
@@ -793,18 +862,21 @@ license:CC0
<!-- PC-98x1 / FM Towns hybrid, also included in fmtowns_cd.xml -->
<software name="bacta12v">
<!--
- Origin: Neo Kobe Collection
- <rom name="Bacta 1&amp;2 + Voice.ccd" size="1342" crc="eaecbaee" sha1="08a2203ca5ce3ff931611ec0a6fa03d7e3dbc20f"/>
- <rom name="Bacta 1&amp;2 + Voice.cue" size="198" crc="9b35ee13" sha1="1386512259df3e4aade1d76ed526bc2648082902"/>
- <rom name="Bacta 1&amp;2 + Voice.img" size="284514384" crc="ee8f9e72" sha1="2a2a89d6e7d4795d7b315468d2b9b0297694452f"/>
- <rom name="Bacta 1&amp;2 + Voice.sub" size="11612832" crc="ad18c1ea" sha1="1d98f9eec9dbb2d810bf687df3cf94fb9a30c036"/>
+ Origin: redump.org
+ <rom name="Bacta 1&amp;2 + Voice (Japan) (Track 1).bin" size="144902016" crc="d12e3a7b" sha1="09f54372fea60463bdd33ed0ac471eef2b06d526"/>
+ <rom name="Bacta 1&amp;2 + Voice (Japan) (Track 2).bin" size="53324544" crc="6c7d8b47" sha1="a42d76400c52b907baee054de9027236e1308516"/>
+ <rom name="Bacta 1&amp;2 + Voice (Japan) (Track 3).bin" size="49354368" crc="e4f2c52e" sha1="7c492d8f6b13c0a179491f499d516c73208acd9f"/>
+ <rom name="Bacta 1&amp;2 + Voice (Japan) (Track 4).bin" size="36933456" crc="e8549c59" sha1="64a00cc777e53974197074a784f161a2859bc2bb"/>
+ <rom name="Bacta 1&amp;2 + Voice (Japan).cue" size="412" crc="10089594" sha1="f22771fc9c541ade004e361f969bb54c2e897aa0"/>
-->
<description>Bacta 1 &amp; 2 + Voice</description>
<year>1996</year>
<publisher>姫屋ソフト (Himeya Soft)</publisher>
+ <info name="serial" value="HMS-00306"/>
+ <info name="release" value="199601xx" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="bacta 1 &amp; 2 + voice" sha1="86c2d8dcb4e40b108e7e8fab5c1f9f3609f65ed7" />
+ <disk name="bacta 1&amp;2 + voice (japan)" sha1="985816039d5494a48a758d625974e5947d890a3d" />
</diskarea>
</part>
</software>
@@ -832,11 +904,9 @@ license:CC0
<!-- PC-9801 / FM Towns hybrid -->
<software name="bellsav2">
<!--
- Origin: P2P
- <rom name="Image.cdm" size="868" crc="63675719" sha1="fa2aa05c7cd3ad9676acb1a490911138106c9e71"/>
- <rom name="Image.cue" size="71" crc="b496048a" sha1="8590392ca153b7559d50bef2f83defc45e315624"/>
- <rom name="Image.img" size="5992896" crc="4f23167d" sha1="79efe054b0a816397e61b6c17342fc3330c8aefc"/>
- <rom name="Image.sub" size="244608" crc="3dd77ccf" sha1="fb5e200113b601fd5ff729c6fd48fbdffae0c2b8"/>
+ Origin: redump.org
+ <rom name="Bell's Avenue Vol. 2 (Japan).bin" size="5992896" crc="4f23167d" sha1="79efe054b0a816397e61b6c17342fc3330c8aefc"/>
+ <rom name="Bell's Avenue Vol. 2 (Japan).cue" size="140" crc="5ce92f45" sha1="0a1047b93e133079dea268f8101a32e70904994e"/>
-->
<description>Bell's Avenue Vol. 2</description>
<year>1994</year>
@@ -845,7 +915,7 @@ license:CC0
<info name="release" value="199401xx" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="bellsav2" sha1="c910ef48ea6677c77d40518f75af2160e58ae763" />
+ <disk name="bell's avenue vol. 2 (japan)" sha1="f7dbb84b48c5037e491b883f359de6b9438a72ee" />
</diskarea>
</part>
</software>
@@ -915,31 +985,30 @@ license:CC0
</part>
</software>
- <software name="bhludy">
+ <software name="bhrudy">
<!--
- Origin: Neo Kobe Collection
- CCD converted to CUE with GNU ccd2cue
- <rom name="Bounty Hunter Ludy.ccd" size="768" crc="75401494" sha1="4ac577a3ea4a5750948e6d6e04009f452e7db84e"/>
- <rom name="Bounty Hunter Ludy.cue" size="80" crc="cc44dd10" sha1="26bf267681c74a7fef09a012dc41cb0e670b0453"/>
- <rom name="Bounty Hunter Ludy.img" size="11061456" crc="785c3a51" sha1="5d2abc3e2162ed107e1f01739b989994e2be2a23"/>
- <rom name="Bounty Hunter Ludy.sub" size="451488" crc="0c62c662" sha1="a1079ecbed0045b1d0a573f0a61b9ee57191568f"/>
+ Origin: redump.org
+ <rom name="Bounty Hunter Rudy (Japan).bin" size="11061456" crc="785c3a51" sha1="5d2abc3e2162ed107e1f01739b989994e2be2a23"/>
+ <rom name="Bounty Hunter Rudy (Japan).cue" size="115" crc="d7a98d37" sha1="806f96e5d2411f86b91c7eecfee54dd99c4edf4c"/>
-->
- <description>Bounty Hunter Ludy</description>
+ <description>Bounty Hunter Rudy</description> <!-- The volume label of the CD says "Ludy", but ScooP's old website and most other sources romanize it as "Rudy" -->
<year>1996</year>
<publisher>ScooP</publisher>
+ <info name="serial" value="SLP-WIN95-HADV-0007"/>
<info name="alt_title" value="バウンティハンター ルディ" />
<info name="release" value="19961025" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="bounty hunter ludy" sha1="a8e3f4b21f23f3dac1f0b54e1620c572ae695236" />
+ <disk name="bounty hunter rudy (japan)" sha1="a8e3f4b21f23f3dac1f0b54e1620c572ae695236" />
</diskarea>
</part>
</software>
<software name="blandia">
<!--
- Origin: peter_j (Super Lonely Terminal)
- <rom name="blandia98.iso" size="7811072" crc="74a23c59" sha1="9bd64b8dd195b93dbbf94206df4021b26c779b6c"/>
+ Origin: redump.org
+ <rom name="Blandia 98 (Japan).bin" size="8970528" crc="11a2fa28" sha1="33e73658b15d8f9cd206d83bef44af7f75123d2c"/>
+ <rom name="Blandia 98 (Japan).cue" size="84" crc="32b82ae1" sha1="d1b428d0dad3fe5c9123eccf7f59f1682ab6bb42"/>
-->
<description>Blandia 98</description>
<year>1995</year>
@@ -949,7 +1018,7 @@ license:CC0
<info name="release" value="19950622" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="vhmd131" sha1="fd3f2db19e613b384ea362fbba8421aeb6b556b6"/>
+ <disk name="blandia 98 (japan)" sha1="e13542721b25079bac996733d2c4f2bcc788f079"/>
</diskarea>
</part>
</software>
@@ -1195,6 +1264,43 @@ license:CC0
</part>
</software>
+ <!-- Windows / PC-9801 hybrid -->
+ <software name="chushaki">
+ <!--
+ Origin: redump.org
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 01).bin" size="23390640" crc="5e5bf56f" sha1="9b5f889f837f43c87b1eac6d12feedfcc17e6de8"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 02).bin" size="22099392" crc="229c9c90" sha1="f272a3eb13262d4bdb22622cd38335c36bca6e64"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 03).bin" size="21732480" crc="32dc10a7" sha1="f5a2a5e063cf5549355850a3112bda625238d77f"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 04).bin" size="22527456" crc="26778a44" sha1="562390d337a8be82cd7fb7a6d5d92c97b7e61217"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 05).bin" size="22706208" crc="e4319540" sha1="617c79f9751ff6f6c39d0eb5930f54d6f96b4693"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 06).bin" size="21450240" crc="6ba8cdfc" sha1="f9d0f63971d449e9183ff6024d128026977c2343"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 07).bin" size="23214240" crc="f8d832e5" sha1="a32b11f613b3aa6dbec72122102031c27560fa70"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 08).bin" size="22221696" crc="9aed99e8" sha1="2718ed4f918ba0ccd94e582de525f9ae38c07a9f"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 09).bin" size="22266384" crc="ba398e9b" sha1="beea65e885176018b3f69f2a1014b1f4e219f0cb"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 10).bin" size="22346352" crc="8f96a5c8" sha1="7742d3c8d5a307b3fcd33f47d38cec35555abdf6"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 11).bin" size="21833616" crc="b441e1b8" sha1="8f4456bc51134b3d20c061a28cb95d8035473d15"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 12).bin" size="24082128" crc="0df65c34" sha1="d368de83a7437d466e8a8f3f3168461e96ba84f0"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 13).bin" size="21518448" crc="c58a089e" sha1="b5e310da088d34d64c28be88e58daa3d75e0e94a"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 14).bin" size="22050000" crc="7623bbe4" sha1="df17ac4b18ccb5f58aed71817ff36bdb5a59c6d1"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 15).bin" size="23334192" crc="7ef323dc" sha1="335d283a97c548bfb8054efa5576f654b859c04b"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 16).bin" size="23146032" crc="0478e8e7" sha1="8387b6455db2147a78c208e8e9f115adbc9f277a"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 17).bin" size="23397696" crc="1181caba" sha1="4a1ed0c2e7e49c53bdf7138bca2571bb6e7cd5ee"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 18).bin" size="23364768" crc="2faeed4e" sha1="f90cab13a35a3e780e4c35e8c01ec5086bf31bd1"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan) (Track 19).bin" size="5386080" crc="50f2c593" sha1="da0a7a8c5dabcfaa1870878459b5877c92e78eab"/>
+ <rom name="Chuushaki - Hirasawa Nurse School (Japan).cue" size="2175" crc="5f3f2a6f" sha1="568d26425c5437d0389d2378eb25631303ff8ded"/>
+ -->
+ <description>Chuushaki - Hirasawa Nurse School</description>
+ <year>1996</year>
+ <publisher>アーヴォリオ (Aypio)</publisher>
+ <info name="alt_title" value="注射器 Hirasawa Nurse School" />
+ <info name="release" value="19960726" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="chuushaki - hirasawa nurse school (japan)" sha1="ca6b4ccb53e3fec00a59c507f231b6e2adb65e45"/>
+ </diskarea>
+ </part>
+ </software>
+
<software name="classro4">
<!--
Origin: P2P
@@ -1450,20 +1556,81 @@ license:CC0
<!-- Hangs shortly after starting a new game -->
<software name="diesirae" supported="no">
<!--
- Origin: Neo Kobe Collection
- <rom name="Dies Irae.ccd" size="13658" crc="281e6765" sha1="7ecc5e5d865978aeb448da60ea3b50144ed3f55a"/>
- <rom name="Dies Irae.cue" size="3823" crc="0560c5d5" sha1="f2718512f47ad11cc8c69f88bae10fdd117e8a16"/>
- <rom name="Dies Irae.img" size="585499824" crc="8a29ef18" sha1="c3b68a3a408a47d024ae4f63a437d3e5b68c0b02"/>
- <rom name="Dies Irae.sub" size="23897952" crc="c51cda60" sha1="8c539942f9458f34b5d164add098578a4cb96e53"/>
+ Origin: redump.org
+ <rom name="Dies Irae (Japan) (Track 01).bin" size="12272736" crc="d5c723ca" sha1="158e4de6a5d908bafd2d0a8dc651f1cbdaf2c47d"/>
+ <rom name="Dies Irae (Japan) (Track 02).bin" size="34395648" crc="6dd62f4a" sha1="3e614f718d2de76ba8b2b5c945ee7c3e9d9cf1f6"/>
+ <rom name="Dies Irae (Japan) (Track 03).bin" size="21342048" crc="6529d21f" sha1="cb0f035bdd95bac2350751ccd20b9054147b8c87"/>
+ <rom name="Dies Irae (Japan) (Track 04).bin" size="23101344" crc="01ca150e" sha1="33faf9e2d640fb574d4d08a9b8f94b09741be2bc"/>
+ <rom name="Dies Irae (Japan) (Track 05).bin" size="34127520" crc="0465c1ff" sha1="ac56ae59c199179fb62f304b6b6a875706a970fe"/>
+ <rom name="Dies Irae (Japan) (Track 06).bin" size="24086832" crc="95caa618" sha1="08ade3d07d242a2e9a70db9eeea8809fe2028d03"/>
+ <rom name="Dies Irae (Japan) (Track 07).bin" size="28355712" crc="8f6329f2" sha1="3ea5d86c57cf0d165428eec04ac4d0eb368f11ed"/>
+ <rom name="Dies Irae (Japan) (Track 08).bin" size="24526656" crc="c58062e1" sha1="82f41a1d41dbd11fb8c84e0e4ee9c89c01c9f94d"/>
+ <rom name="Dies Irae (Japan) (Track 09).bin" size="23141328" crc="a7e93649" sha1="6fa35d89e668095aa3884dc6126bfb72c601cf0e"/>
+ <rom name="Dies Irae (Japan) (Track 10).bin" size="43392048" crc="0c61e269" sha1="d664b1b4f83810b57df17310e026fa4827a1b714"/>
+ <rom name="Dies Irae (Japan) (Track 11).bin" size="40649616" crc="482458b5" sha1="54bd89a4049a838d67d404388da9b9697198894e"/>
+ <rom name="Dies Irae (Japan) (Track 12).bin" size="27151488" crc="12d86ef7" sha1="f6e3be52f44fc3c1da22f567bd9c613479e4f63b"/>
+ <rom name="Dies Irae (Japan) (Track 13).bin" size="33584208" crc="4dcf6d19" sha1="04c7cea891c1dc21a536b56a3b18c87a9cf3053c"/>
+ <rom name="Dies Irae (Japan) (Track 14).bin" size="37131024" crc="6ca89a61" sha1="5f749f3a843353137db61c692c8eea0fc94e9498"/>
+ <rom name="Dies Irae (Japan) (Track 15).bin" size="6369216" crc="4f7cd665" sha1="f2667dc587b22931778b009703dafdeef0b59cfb"/>
+ <rom name="Dies Irae (Japan) (Track 16).bin" size="8053248" crc="5eacc261" sha1="61739cb9032dd59e4a178266480d592153d6176d"/>
+ <rom name="Dies Irae (Japan) (Track 17).bin" size="16710960" crc="a0dd0d59" sha1="23e4e1dfed9e32e298a764515c0c90f22e104dc6"/>
+ <rom name="Dies Irae (Japan) (Track 18).bin" size="1430016" crc="bad9b794" sha1="f3bb4809513d371c145f32ba303cb767376e181d"/>
+ <rom name="Dies Irae (Japan) (Track 19).bin" size="1430016" crc="c10b469d" sha1="7d01067f5446cafd85d5805e44b4cf1eb3c9e84d"/>
+ <rom name="Dies Irae (Japan) (Track 20).bin" size="1430016" crc="ea678a1a" sha1="dadb2678df5ed90f2186f86dc97ab2490308e219"/>
+ <rom name="Dies Irae (Japan) (Track 21).bin" size="3713808" crc="c8b49cc0" sha1="1054132255a8dfabf7ac07e39daf464310af623c"/>
+ <rom name="Dies Irae (Japan) (Track 22).bin" size="4090128" crc="1f644672" sha1="79a6a8614bd77fe7c5e95acb453d54737048c642"/>
+ <rom name="Dies Irae (Japan) (Track 23).bin" size="1430016" crc="6612ad91" sha1="f4d6cf47054975c0c182a5a54bdb0b41ae285550"/>
+ <rom name="Dies Irae (Japan) (Track 24).bin" size="1430016" crc="355fcb74" sha1="27a03b91e5a970a8f1e93344e3b431b566f5d375"/>
+ <rom name="Dies Irae (Japan) (Track 25).bin" size="1430016" crc="b9c05a35" sha1="c05093541cbf8d39f11faec23ec97791e62ceb8f"/>
+ <rom name="Dies Irae (Japan) (Track 26).bin" size="1430016" crc="11d4fe7c" sha1="1aade39b0d74a2437196f3631d1ee9abd055b8ba"/>
+ <rom name="Dies Irae (Japan) (Track 27).bin" size="1430016" crc="6d2df04d" sha1="0aa4cf13e487abb35286431d5ad7fdb99aa15e3f"/>
+ <rom name="Dies Irae (Japan) (Track 28).bin" size="1430016" crc="84cd8237" sha1="100d5178885d489988f60024e6e3eccba7f5ee74"/>
+ <rom name="Dies Irae (Japan) (Track 29).bin" size="9231600" crc="0841ecc5" sha1="29300b68f00405a39d536902df1b7754c32a2603"/>
+ <rom name="Dies Irae (Japan) (Track 30).bin" size="8782368" crc="3acdc580" sha1="18eb8190fee922b5ecacaa4b055d2087132f26fa"/>
+ <rom name="Dies Irae (Japan) (Track 31).bin" size="2413152" crc="889ce662" sha1="8388c25e85fc70d76f448ec810096d3628b23d46"/>
+ <rom name="Dies Irae (Japan) (Track 32).bin" size="3276336" crc="c189fafa" sha1="1157e07df2f51c1d93b0edfd2db329cfdc7b7aa3"/>
+ <rom name="Dies Irae (Japan) (Track 33).bin" size="6204576" crc="5415b196" sha1="c52834fca27f60bbc13246f052b0070f2657bb2e"/>
+ <rom name="Dies Irae (Japan) (Track 34).bin" size="1430016" crc="25a17fd8" sha1="1cea3a9b14092fab29cc1bebf45b8263c9ba8261"/>
+ <rom name="Dies Irae (Japan) (Track 35).bin" size="1855728" crc="617f1fea" sha1="b60c9382217bb964af40ec239c6c08090731264b"/>
+ <rom name="Dies Irae (Japan) (Track 36).bin" size="1430016" crc="327b4f8f" sha1="36594e70362c98832d01edfd8978f78c62dd5f89"/>
+ <rom name="Dies Irae (Japan) (Track 37).bin" size="4922736" crc="c16b2d6d" sha1="dcd159721298fa4887bfe16da4f9a58d8ca4d64a"/>
+ <rom name="Dies Irae (Japan) (Track 38).bin" size="1430016" crc="2e63295e" sha1="2bd8e9fea2bda3f4c254846e32a781de74360dba"/>
+ <rom name="Dies Irae (Japan) (Track 39).bin" size="7251216" crc="f0c0a473" sha1="0c8d3d73c2a940763aabe83126b5f46743d81cef"/>
+ <rom name="Dies Irae (Japan) (Track 40).bin" size="5063856" crc="f2edc886" sha1="5c60a2a693a88150b72a9e7a5033a630548d77f5"/>
+ <rom name="Dies Irae (Japan) (Track 41).bin" size="3577392" crc="c6a7cb8a" sha1="2c3bc96c64b95a5e9fbcf8e2ef39eee1040b76fb"/>
+ <rom name="Dies Irae (Japan) (Track 42).bin" size="5132064" crc="3b10c3df" sha1="a3ab2b1b735205e4c4df6db1ab391d398d316fea"/>
+ <rom name="Dies Irae (Japan) (Track 43).bin" size="2123856" crc="9cbee905" sha1="e24f6c4c1dd233814a1964eee370d2fde19404b7"/>
+ <rom name="Dies Irae (Japan) (Track 44).bin" size="1430016" crc="426b2483" sha1="620ac8def920b5bcfbeda15f462e5ff3deea1497"/>
+ <rom name="Dies Irae (Japan) (Track 45).bin" size="6007008" crc="fc189061" sha1="7cfa227330ac373ffd4f4a8d066abd87e5ae3c58"/>
+ <rom name="Dies Irae (Japan) (Track 46).bin" size="3575040" crc="ec94d54c" sha1="b21730b7989db63395348d82366e051740a67d9d"/>
+ <rom name="Dies Irae (Japan) (Track 47).bin" size="5491920" crc="8dd29bf0" sha1="0a824d1e70cc3799be246ce2e4f2dcff3cf004e2"/>
+ <rom name="Dies Irae (Japan) (Track 48).bin" size="4873344" crc="fb12c347" sha1="2cba592c13e7e37e9d2a13baa62e6b4401504368"/>
+ <rom name="Dies Irae (Japan) (Track 49).bin" size="1430016" crc="a44dfcfe" sha1="acb782d574d6717a84e98ffbb643c4639acf0946"/>
+ <rom name="Dies Irae (Japan) (Track 50).bin" size="2709504" crc="fde5a3f5" sha1="eb1844a081b5c0723e939b8b7ae94a24995eaab7"/>
+ <rom name="Dies Irae (Japan) (Track 51).bin" size="6722016" crc="c2a8029f" sha1="d1ed3dd28c5af7bcd23f13cdbff585c938257031"/>
+ <rom name="Dies Irae (Japan) (Track 52).bin" size="1430016" crc="74d5d2cf" sha1="8d63cb88933d2197835da98e6bb621c0762c01e5"/>
+ <rom name="Dies Irae (Japan) (Track 53).bin" size="2744784" crc="571056fd" sha1="547581e54cc253fa8c5452a894010c5a4b12aca1"/>
+ <rom name="Dies Irae (Japan) (Track 54).bin" size="3081120" crc="3c6c2228" sha1="b4c96fbc1d93007517cb53bbfafab537e40a1c2c"/>
+ <rom name="Dies Irae (Japan) (Track 55).bin" size="2328480" crc="e7b3ae7e" sha1="d86fa299acd1f2e06160cdfd18475094bca9d3fc"/>
+ <rom name="Dies Irae (Japan) (Track 56).bin" size="6162240" crc="2dcad307" sha1="abd3d1c70e1694dbe7c48ea5f2fba4839e533f96"/>
+ <rom name="Dies Irae (Japan) (Track 57).bin" size="1430016" crc="2cd299c6" sha1="e65c0ff66661303da656628799cb45451cc82c11"/>
+ <rom name="Dies Irae (Japan) (Track 58).bin" size="1430016" crc="bae53ddc" sha1="2f7518da73e054fd163064078f67541dfd793ed0"/>
+ <rom name="Dies Irae (Japan) (Track 59).bin" size="1430016" crc="cdbdace5" sha1="223cc991bf63837ea225d50cc283904f70e2b2b5"/>
+ <rom name="Dies Irae (Japan) (Track 60).bin" size="2396688" crc="36e9492e" sha1="1ac037e81e7a769608eb103329e5bbc7e9411001"/>
+ <rom name="Dies Irae (Japan) (Track 61).bin" size="3139920" crc="aef5cad4" sha1="f040da37ef07f2bd50ec2ae098980ec9836d3ae8"/>
+ <rom name="Dies Irae (Japan) (Track 62).bin" size="3067008" crc="f1e5be5c" sha1="0f7f80828ebe0d60956348c07be0c86c422d5c3f"/>
+ <rom name="Dies Irae (Japan) (Track 63).bin" size="1430016" crc="094e92b4" sha1="0bfe14dcd5779b3d3163e48c59a20c7722579268"/>
+ <rom name="Dies Irae (Japan).cue" size="7061" crc="a934dac1" sha1="85932174eeb889c494f4396635132daeab8ba639"/>
-->
<description>Dies Irae</description>
<year>1996</year>
<publisher>ファミリーソフト (Family Soft)</publisher>
+ <info name="serial" value="21D-2032"/>
<info name="alt_title" value="ディエス イレ" />
<info name="release" value="19960215" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="dies irae" sha1="ad4d50b2ddfa35a087b4d9b63058a36dac780c53" />
+ <disk name="dies irae (japan)" sha1="2450d001967e1e5e884c3cbc7a4723dddbe3d1b7" />
</diskarea>
</part>
</software>
@@ -1728,6 +1895,27 @@ license:CC0
</part>
</software>
+ <!-- PC-9801 / FM Towns hybrid -->
+ <!-- Is this missing a floppy disk? The SYSINST program seems to expect one -->
+ <software name="dreamy" supported="no">
+ <!--
+ Origin: redump.org
+ <rom name="Yumeutsutsu - Dreamy (Japan).bin" size="29056608" crc="616488db" sha1="c578eb8d274954d89ec7c6d71cd556e8848dc01d"/>
+ <rom name="Yumeutsutsu - Dreamy (Japan).cue" size="117" crc="c007b161" sha1="b6b95b651e8d55344e263bcda591ea1960a98c2a"/>
+ -->
+ <description>Yumeutsutsu - Dreamy</description>
+ <year>1992</year>
+ <publisher>Megami</publisher>
+ <info name="serial" value="2TD-3017"/>
+ <info name="alt_title" value="夢現 -Dreamy-" />
+ <info name="release" value="199205xx" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="yumeutsutsu - dreamy (japan)" sha1="cd2a18850570ec92b2ae79556db19d2ff4adb73e" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="dstat_09">
<!--
Origin: redump.org
@@ -1912,21 +2100,60 @@ license:CC0
<software name="elhazard">
<!--
- Origin: Neo Kobe Collection
- CCD converted to CUE with GNU ccd2cue
- <rom name="El-Hazard - The Magnificent World.ccd" size="8649" crc="dfd7fc62" sha1="303d217b45060a322a4d12b996cba8be49cb0891"/>
- <rom name="El-Hazard - The Magnificent World.cue" size="1708" crc="e03173b3" sha1="5db1a495dd8a6690d618a3a286e689be0c14fe79"/>
- <rom name="El-Hazard - The Magnificent World.img" size="556048080" crc="8170ea36" sha1="35574d11fdeed2ca97882441cce594693439383e"/>
- <rom name="El-Hazard - The Magnificent World.sub" size="22695840" crc="51460979" sha1="30ba20e773add8fd366b829a8d72e1f34674d2d3"/>
+ Origin: redump.org
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 01).bin" size="62012832" crc="60283f19" sha1="8fcd40493d5cafe40a7a7f3fa091a928bf8dd109"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 02).bin" size="16623936" crc="93f108d9" sha1="a497fc65de1cce084fd20def89bf43ca8c01acb5"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 03).bin" size="14568288" crc="52936afa" sha1="47274d4fa08e59923f9a2fc10a273d1fb3002549"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 04).bin" size="17176656" crc="a1c5f3e7" sha1="7510f60ef2c143ff131bdeda5501831aaab470d9"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 05).bin" size="21236208" crc="aaa24c92" sha1="5b7f06d18bf484deaf2b04d8e7925db4996c4b3d"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 06).bin" size="8340192" crc="fcec01ea" sha1="0ad47fb32ec7861fff86ba11367553173e881fa5"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 07).bin" size="9676128" crc="10889230" sha1="b7367975089ee2df2f3ac356641135e2d4767ed6"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 08).bin" size="23769312" crc="5e833420" sha1="a1b6b09892cbc03bf10db43c11a377da3196c037"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 09).bin" size="12209232" crc="7d55414e" sha1="d13d8a8fc564dc479470cf6d45a1b3e80bdcbcf0"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 10).bin" size="7992096" crc="9462744d" sha1="02ccd0fe7406007fd4fbe8ff6d26a10490d30c04"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 11).bin" size="17487120" crc="341731be" sha1="7977b4e4ad9ab648ba5593367e51e6ffb1333474"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 12).bin" size="7909776" crc="2403417d" sha1="a3a101b0fc3165fa8196decc3133bd823bc4d6dd"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 13).bin" size="13192368" crc="bf6ca073" sha1="7574ac157be3283a8f6f1692f9bfbec4cb193fff"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 14).bin" size="10760400" crc="a2b04701" sha1="6c092b2679547ca9473e11149500cae1512f0daa"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 15).bin" size="13246464" crc="90aefb15" sha1="3681a7346908c7fc55f8073f15b1ea979d9b6415"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 16).bin" size="9972480" crc="20598b78" sha1="928e21fb7131c3a1ade74948efaf4eb874073653"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 17).bin" size="16459296" crc="bb7dfc3d" sha1="3c2a2a264dec7d0d5810243e7f27a86d874cd5e9"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 18).bin" size="11204928" crc="bd8cb247" sha1="12f7b2d74d46a3afcdba4227c2f67b4b85b7fec6"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 19).bin" size="18006912" crc="93acf6c6" sha1="33692b186097bd25f6d509d618153c2fae3fa7b7"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 20).bin" size="15036336" crc="856df6a5" sha1="6597b9bde6faa402b0c5909c05b2d5ebfc966f33"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 21).bin" size="9283344" crc="86a35393" sha1="ff773544157dc4790b6c28017295940baff2667b"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 22).bin" size="13801536" crc="b6677525" sha1="556449580fcce95605e82aba3e211d366c0e9a67"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 23).bin" size="11677680" crc="202decf8" sha1="c658a895bbe3d2d036a5c56ba965bd2e1970b284"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 24).bin" size="13794480" crc="41f0b0d7" sha1="f562831e06760fa129bb41307163b15cb162931f"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 25).bin" size="15753696" crc="d46b4277" sha1="31f128cd9331d45fbf3c040526648e0469292d35"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 26).bin" size="11244912" crc="f7c6e997" sha1="1694db7e8470c73bba3e946640bd15bc32336b44"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 27).bin" size="8488368" crc="ec6bd604" sha1="0a8a2a191eb511d895ecc22ddb5db37516c62634"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 28).bin" size="12983040" crc="bf83e204" sha1="40790fd9ff93815aaf004b441c052ad4027f8f22"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 29).bin" size="9433872" crc="34c23acc" sha1="20a731b27f557dcf086c94bcc3acce757a52f42d"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 30).bin" size="9325680" crc="3bec26e3" sha1="080fb069fbb6c68ee634e15fd5c997ceb4392cc5"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 31).bin" size="14768208" crc="2d7ead0f" sha1="cadba4cf6d5e2e9f74b49a99993bf2545dc9e976"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 32).bin" size="8810592" crc="2587db37" sha1="78e74f72da4db43783f85a4050825c3c3f2937fa"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 33).bin" size="7813344" crc="40c24183" sha1="4ee788f22e2ee9f66d0e87782f64a54960e990af"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 34).bin" size="16071216" crc="1709d7a3" sha1="5b3d4e082d2781d9c455b4f8d763dd6bc59a7a29"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 35).bin" size="33137328" crc="17acd3bb" sha1="c3e64a5f6b03a3c00434f69f0abb73c4edd42916"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 36).bin" size="17470656" crc="490a1f79" sha1="746db300442e42c3d05bf3ade5bd71c84d034e65"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 37).bin" size="1279488" crc="2a91043a" sha1="bee56cd009eb6ece584eea9cf1311e74a799b83c"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 38).bin" size="2029776" crc="19ba5787" sha1="09cb08df27186b7826bf839b5e27bf3d776771d2"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 39).bin" size="5016816" crc="c6489ea2" sha1="15cc546aecea4fdcb67e7af00aea1c8eca2faad7"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 40).bin" size="3203424" crc="7d7e8847" sha1="494f6fcb7de038daf6479fdfdb52c808c71149e8"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 41).bin" size="1446480" crc="ee5ad8d9" sha1="3a8973f38d54147815eb79e1e4df329b9cde27af"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan) (Track 42).bin" size="2333184" crc="599e9acb" sha1="e52e312fcb4564c10b293edfcdf98553cd6c5582"/>
+ <rom name="Shinpi no Sekai El-Hazard - El-Hazard - The Magnificent World (Japan).cue" size="6870" crc="9e3099f9" sha1="3453479128a059c08262ade5c6d54fdaa8c1f7bb"/>
-->
<description>El-Hazard - The Magnificent World</description>
<year>1996</year>
<publisher>パイオニアLDC (Pioneer LDC)</publisher>
+ <info name="serial" value="21D-2077 / PIRW-1014"/>
<info name="alt_title" value="神秘の世界エルハザード" />
<info name="release" value="19960322" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="el-hazard - the magnificent world" sha1="0bd04fd147be6361ff63ae5e8321dd236d3046a9" />
+ <disk name="shinpi no sekai el-hazard - el-hazard - the magnificent world (japan)" sha1="0d4e2b7c7830dcca684f48c6bcdbd10e5ddc93be" />
</diskarea>
</part>
</software>
@@ -2607,22 +2834,36 @@ license:CC0
</part>
</software>
- <!-- PC-98x1 / FM Towns hybrid, also included in fmtowns_cd.xml -->
+ <!-- PC-9821 / FM Towns hybrid -->
<software name="hoshisn3">
<!--
- Origin: Neo Kobe Collection
- <rom name="Hoshi no Suna Monogatari 3.ccd" size="3455" crc="ad50647d" sha1="68ff4745927e47067532944526ac7bf8e8833ba9"/>
- <rom name="Hoshi no Suna Monogatari 3.cue" size="642" crc="f265ee91" sha1="adfa68ba2ff31b0571545d5cad570decaf8bbcc9"/>
- <rom name="Hoshi no Suna Monogatari 3.img" size="573629280" crc="b05d7668" sha1="31c30dd9d033c707a4732fa5613fa823aa1ff0ff"/>
- <rom name="Hoshi no Suna Monogatari 3.sub" size="23413440" crc="7bda5e31" sha1="dd8acb239c334b3795dfd4f20f3bd7d0016d0b02"/>
+ Origin: redump.org
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 01).bin" size="220144848" crc="a26242ea" sha1="12e33aba531e242f9e7ba7702469d0cb44ad2bd8"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 02).bin" size="28042896" crc="375957b6" sha1="f974d69e8e6b10f41e34775bb90f2ee1be133722"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 03).bin" size="20119008" crc="e9d7bee7" sha1="db33045d818a6cc784bb770becd61e941e082023"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 04).bin" size="17411856" crc="afbdee5e" sha1="c697a7da59dafc9fee152b437c87c007aefdcdb4"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 05).bin" size="27859440" crc="e3aabe5a" sha1="e447152a976b0616083ff5b8d89e25e8cc0ebc2f"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 06).bin" size="26441184" crc="0c6ea63a" sha1="ebad5effcf9626262b374c030ae2c0f4cef49432"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 07).bin" size="26575248" crc="39873cde" sha1="3636fa1347b54d1a74e748a7b65c1bd295685894"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 08).bin" size="29122464" crc="c1f9c16e" sha1="538701991c57324b3234580a20d586e36acbccb2"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 09).bin" size="24373776" crc="f9c1b807" sha1="dc293be518a7fe7d8c7e21a6370e773eaca42efb"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 10).bin" size="19674480" crc="92d85f4a" sha1="0e3a2b01b08918305ab101ea2bbeed3c2b64c8f8"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 11).bin" size="24418464" crc="5b488a1b" sha1="0a49027b1d1bc6f83f223f4f5ffa4b3ece1f2802"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 12).bin" size="21927696" crc="3858e0e0" sha1="1e19b51d998cd58d6a9596756687e5bd2cad7fbd"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 13).bin" size="32389392" crc="31019927" sha1="bc80d770c39c8e554bddfa5b5204b66d1854f346"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 14).bin" size="21927696" crc="2dc874e4" sha1="30c66cc7ec878c3f35bf568291f3578184e091fe"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan) (Track 15).bin" size="33200832" crc="2d43bb87" sha1="6d1213231a73d3e2c646775a69bbe18f8ce0c6e5"/>
+ <rom name="Hoshi no Suna Monogatari 3 (Japan).cue" size="1618" crc="6bebe8cb" sha1="babf51185c2ba7052804e6058bcde22b89ac0939"/>
-->
<description>Hoshi no Suna Monogatari 3</description>
<year>1995</year>
<publisher>ディー・オー (D.O.)</publisher>
+ <info name="serial" value="DCD-0006"/>
+ <info name="alt_title" value="星の砂物語3" />
<info name="release" value="199508xx" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="hoshi no suna monogatari 3" sha1="6526c4192fcfb73dbf32f4d2a2575ae6a554d376" />
+ <disk name="hoshi no suna monogatari 3 (japan)" sha1="f1e43060237558610d7f924e6c0d8fc4ff5ed39f" />
</diskarea>
</part>
</software>
@@ -2649,6 +2890,26 @@ license:CC0
</part>
</software>
+ <!-- PC-9801 / FM Towns hybrid -->
+ <software name="if">
+ <!--
+ Origin: redump.org
+ <rom name="if - Invitations from Fantastic Stories (Japan).bin" size="10231200" crc="dada6d70" sha1="5b2b80e25fc07cb805ffb8219e7761a1bebeb47c"/>
+ <rom name="if - Invitations from Fantastic Stories (Japan).cue" size="113" crc="018a1c52" sha1="4975b59268879cacae2b196120d4deabe8287a64"/>
+ -->
+ <description>if - Invitations from Fantastic Stories</description>
+ <year>1993</year>
+ <publisher>アクティブ (Active)</publisher>
+ <info name="serial" value="HME-152 / MTC-1051"/>
+ <info name="alt_title" value="イフ Invitations from Fantastic Stories" />
+ <info name="release" value="199306xx" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="if - invitations from fantastic stories (japan)" sha1="a3963c710a9476b96933976e6dc716b73d2da054" />
+ </diskarea>
+ </part>
+ </software>
+
<!-- Windows / PC-9801 / FM Towns hybrid -->
<software name="if123">
<!--
@@ -2679,7 +2940,7 @@ license:CC0
<year>1993</year>
<publisher>アクティブ (Active)</publisher>
<info name="serial" value="HMF-228 / 2TD-3003"/>
- <info name="alt_title" value="イフ2" />
+ <info name="alt_title" value="イフ2 Invitations from Fantastic Stories" />
<info name="release" value="19931119" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -2688,6 +2949,26 @@ license:CC0
</part>
</software>
+ <!-- PC-9801 / FM Towns hybrid -->
+ <software name="if3">
+ <!--
+ Origin: redump.org
+ <rom name="if 3 - Invitations from Fantastic Stories (Japan).bin" size="17578848" crc="6cb1a706" sha1="76d814edcad5ec356869e249a25a5917948a22fe"/>
+ <rom name="if 3 - Invitations from Fantastic Stories (Japan).cue" size="138" crc="2af11088" sha1="4f73bb477c5e33fc7333ac98558ca658eb4c4e98"/>
+ -->
+ <description>if 3 - Invitations from Fantastic Stories</description>
+ <year>1995</year>
+ <publisher>アクティブ (Active)</publisher>
+ <info name="serial" value="2TD-3021"/>
+ <info name="alt_title" value="イフ3 Invitations from Fantastic Stories" />
+ <info name="release" value="199504xx" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="if 3 - invitations from fantastic stories (japan)" sha1="3d9672f8bcf7d558fd532ddefd3bc0dfa14e816a" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="inhearth">
<!--
Origin unknown
@@ -2749,26 +3030,73 @@ license:CC0
<software name="jinmon">
<!--
- Origin: Neo Kobe Collection
- CCD converted to CUE with GNU ccd2cue
- <rom name="Jinmon Yuugi.ccd" size="3248" crc="6a88a204" sha1="ef45500d866ac9144ebd35ad4b70d4076c4f9181"/>
- <rom name="Jinmon Yuugi.cue" size="573" crc="cdfa00b4" sha1="0c49ebac74ef721e1b317e8cbd734eb3e5e0cd54"/>
- <rom name="Jinmon Yuugi.img" size="547482096" crc="8fb421ee" sha1="cd75c232e7e194d64c0c5d83ede5b2ff84e922bd"/>
- <rom name="Jinmon Yuugi.sub" size="22346208" crc="6ffdd73c" sha1="90d1cd4ab0cfc2251d8bd54c3e6e20fd0e590caf"/>
+ Origin: redump.org (CD) / Neo Kobe Collection (floppy)
+ <rom name="Jinmon Yuugi (Japan) (Track 01).bin" size="12348000" crc="041daee0" sha1="a52d29784b79e34e64d52dd53b32c8e5ae42259f"/>
+ <rom name="Jinmon Yuugi (Japan) (Track 02).bin" size="47618592" crc="4d6fa9a6" sha1="32baabed44139a254d1a5920a90d195eca98e402"/>
+ <rom name="Jinmon Yuugi (Japan) (Track 03).bin" size="37928352" crc="9b562d2f" sha1="2b56cc4c47dcb669531aff3ad99d367be20ae517"/>
+ <rom name="Jinmon Yuugi (Japan) (Track 04).bin" size="35639856" crc="3005dcdd" sha1="9ba3cb0e52d4457571ce0913713033885ba1e898"/>
+ <rom name="Jinmon Yuugi (Japan) (Track 05).bin" size="41131776" crc="b03f0eb1" sha1="ed1df89960ac404342b25b23fa9a727249f5bb7b"/>
+ <rom name="Jinmon Yuugi (Japan) (Track 06).bin" size="44513952" crc="5c78a6ba" sha1="b6f15a1757b67b7bd229ec621ffcc6e55224039a"/>
+ <rom name="Jinmon Yuugi (Japan) (Track 07).bin" size="46809504" crc="7f118754" sha1="a9351bcfb4e55ba9aaadc4267d5a50e907501170"/>
+ <rom name="Jinmon Yuugi (Japan) (Track 08).bin" size="37359168" crc="689bd75f" sha1="2a21d7fa0d95d5505014df0308e2be244d875cf6"/>
+ <rom name="Jinmon Yuugi (Japan) (Track 09).bin" size="40633152" crc="a71cfec1" sha1="fd62eb52376d7f0bfd94bbf42209a66a6f36478f"/>
+ <rom name="Jinmon Yuugi (Japan) (Track 10).bin" size="42484176" crc="451d14ca" sha1="5b21cf3d8db31862f34c02a3625f2744130d677d"/>
+ <rom name="Jinmon Yuugi (Japan) (Track 11).bin" size="39111408" crc="8a6cc73b" sha1="aa0715f51a4555a5637fd17957dae6fc05f90fa0"/>
+ <rom name="Jinmon Yuugi (Japan) (Track 12).bin" size="43838928" crc="13564395" sha1="21c60bce41b931a4e83b7b381a418aa5125f5d19"/>
+ <rom name="Jinmon Yuugi (Japan) (Track 13).bin" size="42811104" crc="d2fc74db" sha1="3dd3c2c231b257462480b1737fe96df3e23a4266"/>
+ <rom name="Jinmon Yuugi (Japan) (Track 14).bin" size="35254128" crc="2ca89162" sha1="d2c6bf4421da2054dcdafc3c9e51a0bbc79db1b4"/>
+ <rom name="Jinmon Yuugi (Japan).cue" size="1339" crc="110e86a4" sha1="6e38e53d84bd1e81778b9cdd21f731aeb356412f"/>
-->
<description>Jinmon Yuugi</description>
<year>1995</year>
<publisher>フェアリーテール (Fairytale)</publisher>
+ <info name="serial" value="IDES-040"/>
<info name="alt_title" value="尋問遊戯" />
<info name="release" value="19950811" />
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A" />
<dataarea name="flop" size="1261568">
<rom name="jinmon yuugi (cd boot disk).hdm" size="1261568" crc="61d5fdb9" sha1="47caf5d5562e67df53e614fd17fd74dfd3ff0f09" offset="000000" />
</dataarea>
</part>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="jinmon yuugi" sha1="0993066479bf5de13e6cfc9c87e44356992bf92a"/>
+ <disk name="jinmon yuugi (japan)" sha1="d9c1069b6c3b9f9490c8568f19352669d632630c"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="kanako">
+ <!--
+ Origin: redump.org (CD) / wiggy2k (floppy)
+ <rom name="Kanako (Japan) (Track 01).bin" size="18028080" crc="46caaf67" sha1="0a2f8a28e2c8cab9bccf6f20e6b14d14ba49714d"/>
+ <rom name="Kanako (Japan) (Track 02).bin" size="36815856" crc="916dde65" sha1="93d5fdafa3c3ee9fae7c0c63e43e32e7a9ebf373"/>
+ <rom name="Kanako (Japan) (Track 03).bin" size="44488080" crc="f01254eb" sha1="40bf3fbacd68a5c1e5845367947d07e9e7d0296d"/>
+ <rom name="Kanako (Japan) (Track 04).bin" size="47496288" crc="54494ffb" sha1="399f60ae82c5c042cb25b4cde2f580e63797e045"/>
+ <rom name="Kanako (Japan) (Track 05).bin" size="22082928" crc="788f4681" sha1="5a38a1b17227e88918607cd7b6f37bad7bc6c0fb"/>
+ <rom name="Kanako (Japan) (Track 06).bin" size="32078928" crc="7a7ea51a" sha1="55766a33b128bbc23756c927e34388e699df389c"/>
+ <rom name="Kanako (Japan) (Track 07).bin" size="38076528" crc="fdcd9496" sha1="30a835c2ba386370fefe7e8d5883ac06f86aa0a4"/>
+ <rom name="Kanako (Japan) (Track 08).bin" size="21817152" crc="07366e67" sha1="192a1c167a393157468ad50142e0e81fc31eecd4"/>
+ <rom name="Kanako (Japan) (Track 09).bin" size="42016128" crc="c65863b4" sha1="21ab65675cc12c0e453945c9c62d52a7ff809f97"/>
+ <rom name="Kanako (Japan) (Track 10).bin" size="26024880" crc="be8d4769" sha1="5ffbae4df7d2c1687bdd58a2aefbf636b28bd026"/>
+ <rom name="Kanako (Japan) (Track 11).bin" size="48865152" crc="d0e79545" sha1="95c8416f02e4b2575a739c89e992b9e0a353b958"/>
+ <rom name="Kanako (Japan).cue" size="974" crc="8697ae18" sha1="4cba4c5a7cae19f90dd84dd3a1808e76f4be9323"/>
+ -->
+ <description>Kanako</description>
+ <year>1996</year>
+ <publisher>フェアリーテール (Fairytale)</publisher>
+ <info name="serial" value="IDES-050"/>
+ <info name="alt_title" value="香奈子" />
+ <info name="release" value="19960322" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A" />
+ <dataarea name="flop" size="1261568">
+ <rom name="kanako_disk_a.hdm" size="1261568" crc="7f8f4bc8" sha1="15a66cf6e85b70ade329c0be1c7fc0866abf5708" offset="000000" />
+ </dataarea>
+ </part>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="kanako (japan)" sha1="30f45b9d9d5f408db405d3c1a092f6e562e1606c"/>
</diskarea>
</part>
</software>
@@ -2878,6 +3206,42 @@ license:CC0
</part>
</software>
+ <software name="kouyoro">
+ <!--
+ Origin: redump.org
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 01).bin" size="204769824" crc="141bf95c" sha1="c4167fceefa1aec7492ae5b79f20f074d5536c44"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 02).bin" size="24601920" crc="342c4aa9" sha1="7d2a9bab46d8d470542432747fd1d6de31c7d4c4"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 03).bin" size="21765408" crc="25cd8fb4" sha1="6620cdddcfc6bd96f02f2386bd8d0d546c9d2bb2"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 04).bin" size="23889264" crc="3da9840b" sha1="61b1447e995542d49deb3c53875c30d7e1a27f33"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 05).bin" size="23595264" crc="242b692e" sha1="54133ed2863bb6016ee3dfe29783a8216a03d886"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 06).bin" size="23171904" crc="3faa54bb" sha1="1fa338e02a0da1aa8c0d964d4eb8d26acec0a75b"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 07).bin" size="23353008" crc="920c052b" sha1="34185259675a4442daa29d09e5d337d0d42cb22e"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 08).bin" size="23110752" crc="7ffb9d7f" sha1="956902ac63e204a4a2838ab625a36a5e4043ec23"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 09).bin" size="23157792" crc="7a522ae9" sha1="735a38a5f365bbfaa78738dfb03de9d2ca45691b"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 10).bin" size="23011968" crc="406cf020" sha1="a6aa2ee7ca3c809ca23e2a58268d55b49e999d3d"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 11).bin" size="31735536" crc="0e0a077e" sha1="a0a0479bad71f8732097e3e8f520680b5b5fe3d0"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 12).bin" size="23381232" crc="2c4a9f48" sha1="99861f53d444563c784aa25ae2fd49326508c883"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 13).bin" size="2798880" crc="009995ea" sha1="4d05164bdf01d11ec8b86f787ac29ed878b4b70c"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 14).bin" size="4007808" crc="598fb30b" sha1="1ce58c26584fd0659c5e28fa0176a7c52ccff91a"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 15).bin" size="3248112" crc="e4ec72d5" sha1="8628d868782a8ad7eb7c28edc053f50cf7238848"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 16).bin" size="4492320" crc="c2c17f58" sha1="b1a4b1fc89f6ed3b1ecc0727177fab2bb5f40155"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 17).bin" size="3137568" crc="8e90d645" sha1="c342f4f934ce4c254bc83ec33ef1967a3aba3d67"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan) (Track 18).bin" size="12220992" crc="ebd31d37" sha1="99d7db6d5938935e0fb3783e037f08893f58ca19"/>
+ <rom name="Kousoku - Yorokobi no Aegi (Japan).cue" size="2304" crc="e5fd2ec0" sha1="f3d6766e37624dabc6e5642aa59d1825e7e86437"/>
+ -->
+ <description>Kousoku - Yorokobi no Aegi</description>
+ <year>1996</year>
+ <publisher>ペルシャソフト (Persian Soft)</publisher>
+ <info name="serial" value="PERS-9512"/>
+ <info name="alt_title" value="拘束 ~悦びの淫声~" /> <!-- あえぎ is written in furigana above 淫声 -->
+ <info name="release" value="19960725" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="kousoku - yorokobi no aegi (japan)" sha1="93ece9c4353e4228e1eda55afc394b9d1d056977"/>
+ </diskarea>
+ </part>
+ </software>
+
<!-- Windows / PC-9801 / FM Towns hybrid -->
<software name="kusuriyu">
<!--
@@ -3139,6 +3503,35 @@ license:CC0
</part>
</software>
+ <software name="lodoss2">
+ <!--
+ Origin redump.org (CD) / wiggy2k (floppy)
+ <rom name="Record of Lodoss War - Lodoss-tou Senki II - Goshiki no Maryuu (Japan) (Track 1).bin" size="4694592" crc="ba8e3676" sha1="ff5c29440cab3d4d533fa367e7c7d98af7add28c"/>
+ <rom name="Record of Lodoss War - Lodoss-tou Senki II - Goshiki no Maryuu (Japan) (Track 2).bin" size="31657920" crc="160d33f7" sha1="004e42b6f7303e2cf6a89eaa065903109685502f"/>
+ <rom name="Record of Lodoss War - Lodoss-tou Senki II - Goshiki no Maryuu (Japan) (Track 3).bin" size="25406304" crc="1df6d046" sha1="0540e478f4878c2166ad05aefce006adf825cf79"/>
+ <rom name="Record of Lodoss War - Lodoss-tou Senki II - Goshiki no Maryuu (Japan) (Track 4).bin" size="68299728" crc="83ebe3a4" sha1="a1be021cbe270f1cfe145b52b38c7f3e64fea8cd"/>
+ <rom name="Record of Lodoss War - Lodoss-tou Senki II - Goshiki no Maryuu (Japan) (Track 5).bin" size="37300368" crc="c5006539" sha1="2be45b55be88118ce085909376f26c16e1883f99"/>
+ <rom name="Record of Lodoss War - Lodoss-tou Senki II - Goshiki no Maryuu (Japan) (Track 6).bin" size="1234800" crc="d42c677c" sha1="37276f79e8923d659b24ed3ab916b9191e89f5c6"/>
+ <rom name="Record of Lodoss War - Lodoss-tou Senki II - Goshiki no Maryuu (Japan).cue" size="989" crc="f5b37a02" sha1="b45f2d2f1b6aefa38d24a0fddfceb6ff71f75534"/>
+ -->
+ <description>Record of Lodoss War II - Goshiki no Maryuu</description>
+ <year>1994</year>
+ <publisher>ハミングバード (HummingBird)</publisher>
+ <info name="alt_title" value="ロードス島戦記Ⅱ ~五色の魔竜~" />
+ <info name="release" value="19940527" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Hozon-you Kidou Disk" />
+ <dataarea name="flop" size="1261568">
+ <rom name="record_of_lodoss_war_2.hdm" size="1261568" crc="4b65f375" sha1="d00436addaaf3e51936866691d227f3c8d281a0d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="record of lodoss war - lodoss-tou senki ii - goshiki no maryuu (japan)" sha1="0c0dd3d5c3852c789d63be240b72ff7035189456"/>
+ </diskarea>
+ </part>
+ </software>
+
<software name="loh3">
<!--
Origin: Neo Kobe Collection
@@ -3179,21 +3572,19 @@ license:CC0
<software name="loveesc">
<!--
- Origin: Neo Kobe Collection
- CCD converted to CUE with GNU ccd2cue
- <rom name="Love Escalator.ccd" size="769" crc="712f7218" sha1="976ac5dc6b88ba098e3681f923b2806375e6bf10"/>
- <rom name="Love Escalator.cue" size="76" crc="7c805a73" sha1="89e45fcafe61129bbaedfed1ba404ccee68a2c72"/>
- <rom name="Love Escalator.img" size="37060464" crc="d174d831" sha1="8d59c23e53025e854819babcf290ae8fef7e4344"/>
- <rom name="Love Escalator.sub" size="1512672" crc="1db6e3c1" sha1="8b525f8c109fd0cddacbb4fe2caa34d3ac463912"/>
+ Origin: redump.org
+ <rom name="Love Escalator (Japan).bin" size="37060464" crc="b97cbb90" sha1="6c1457a36f61d20428726eeea0d63e64778a2b2c"/>
+ <rom name="Love Escalator (Japan).cue" size="88" crc="c1fca4f5" sha1="1fdc2ee9c87cd7d669230cd09bccacf7a56604c3"/>
-->
<description>Love Escalator</description>
<year>1998</year>
<publisher>海月製作所 (Umitsuki Seisakusho)</publisher>
+ <info name="serial" value="UDC-102"/>
<info name="alt_title" value="ラブ・エスカレーター" />
<info name="release" value="19980417" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="love escalator" sha1="6e5316d0877fb67b08306086cc2233886b52fe78" />
+ <disk name="love escalator (japan)" sha1="aaa58013d9b02490c304bbdbc69b3ac5afc7c1e4" />
</diskarea>
</part>
</software>
@@ -3239,19 +3630,36 @@ license:CC0
</part>
</software>
+ <!-- Windows / PC-9801 hybrid -->
<software name="makcandy">
<!--
- Origin: P2P
- <rom name="CANDY.cue" size="709" crc="a1f98504" sha1="510e706684d665a7d8754fe3926a521291cf2aee"/>
- <rom name="CANDY.img" size="399423696" crc="74ecf451" sha1="529bf5d043ce96e0e2506a778e7b163410f1d2a9"/>
+ Origin: redump.org
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 01).bin" size="22207584" crc="b9caffeb" sha1="46e1c1424bc07272df60126afe4117cc01136c7e"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 02).bin" size="34790784" crc="86dc89c9" sha1="3a06bd719ec649a2100a3f8e7e601cb877b65e98"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 03).bin" size="37944816" crc="81d82ed3" sha1="68b92c511772436eaeebca8dc5b82bc57c982d61"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 04).bin" size="7714560" crc="ef444dcd" sha1="8c0e8dfc31ef1ded1f82ca02db8aefe3dffc7cb2"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 05).bin" size="20984544" crc="91f725de" sha1="5c265283b79be763c9c7f52aa598330bf8043ca0"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 06).bin" size="34358016" crc="7d806a7e" sha1="1007a0c2e0a45968556a6931b712c47a49871a99"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 07).bin" size="28612080" crc="202c8dab" sha1="9dacb370fc8bea815e670f74e42f20398b4b5ee0"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 08).bin" size="20622336" crc="ab85178d" sha1="d45813e824337c7610fb4ab732c98bbd8cc1b330"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 09).bin" size="16682736" crc="233e9285" sha1="7c4fc5767de9b9ce25f1cec8df59cabfa9673c7a"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 10).bin" size="32337648" crc="cf02e5e6" sha1="9a97d3dbbe0c2302db980a7cc21322e2aa23101e"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 11).bin" size="22790880" crc="19435b62" sha1="b2e901778da55cd8f023bb19aaf3aeb75a35aa5d"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 12).bin" size="44982000" crc="6ff1c980" sha1="7c34b5ee2685286acd0406f30dc2034b38b5274d"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 13).bin" size="13253520" crc="f8b0e574" sha1="59915ac9538f0d3578a0fe894c3823eab844c6cb"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 14).bin" size="21960624" crc="b64227e1" sha1="64775f387acd824c4ba3d11ee3e8a8f15c22e681"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 15).bin" size="34908384" crc="a87d799d" sha1="beaf7da9aa6b6088794334ebd0c4f68d2fec6b05"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan) (Track 16).bin" size="5273184" crc="62b7b325" sha1="832dbf7921a6630f67492d4b37e81643ff8d4182"/>
+ <rom name="Making Candy - Oki ni Mesumama (Japan).cue" size="2110" crc="ee87418a" sha1="2adc56cf8461c66d5eaf621dbe7269d3b50bf6cb"/>
-->
<description>Making Candy - Oki ni Mesumama</description>
<year>1996</year>
<publisher>きゅろっと (Curott)</publisher>
+ <info name="serial" value="WIC-5461"/>
<info name="alt_title" value="Making Candy ~お気に召すまま~" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="candy" sha1="30a9125eb6a2ab7d28aaa8974afab97882289075" />
+ <disk name="making candy - oki ni mesumama (japan)" sha1="83517e67796b7703f1048ac39d40d623ab87c5c2" />
</diskarea>
</part>
</software>
@@ -3464,6 +3872,24 @@ license:CC0
</part>
</software>
+ <software name="mjpanic2">
+ <!--
+ Origin: redump.org
+ <rom name="Waku Waku Mahjong Panic! 2 - Kokushi Musou (Japan).bin" size="52567200" crc="a7a924e1" sha1="8f23e98f56a5f9f778af920ad5608f02b76f8efa"/>
+ <rom name="Waku Waku Mahjong Panic! 2 - Kokushi Musou (Japan).cue" size="116" crc="c2008e4d" sha1="a12cf877c09185091d290c3d58a96c8ebb9d8888"/>
+ -->
+ <description>Waku Waku Mahjong Panic! 2 - Kokushi Musou</description>
+ <year>1996</year>
+ <publisher>フォアナイン (Fournine)</publisher>
+ <info name="alt_title" value="わくわく麻雀パニック!2 ~刻視夢想~" />
+ <info name="release" value="19960719" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="waku waku mahjong panic 2 - kokushi musou (japan)" sha1="20f4bd084f4e22a045a7365fe388981296fe1cfa" />
+ </diskarea>
+ </part>
+ </software>
+
<!-- Windows / PC-9801 / FM Towns hybrid -->
<software name="misato">
<!--
@@ -3484,6 +3910,112 @@ license:CC0
</part>
</software>
+ <software name="mlenergy2">
+ <!--
+ Origin: redump.org
+ <rom name="Moonlight Energy 2 (Japan).bin" size="11964624" crc="78b82b32" sha1="8ab52fa036cae59eb7ee0f8d97e0b4f234d9fa5c"/>
+ <rom name="Moonlight Energy 2 (Japan).cue" size="115" crc="59ecdc47" sha1="9581056a8cc20ed2d8f4cd5b1095536854349a06"/>
+ -->
+ <description>Moonlight Energy 2</description>
+ <year>1996</year>
+ <publisher>インターハート (Inter Heart)</publisher>
+ <info name="serial" value="21D-2054 / INH-160"/>
+ <info name="alt_title" value="ムーンライト・エナジー2" />
+ <info name="release" value="19960524" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="moonlight energy 2 (japan)" sha1="bdb61ff163d697a859353232a890b4911d5a8a63" />
+ </diskarea>
+ </part>
+ </software>
+
+ <!-- Missing a floppy disk -->
+ <software name="moonchan" supported="no">
+ <!--
+ Origin: redump.org
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 01).bin" size="6091680" crc="1d09415d" sha1="70c72dbc1be48139d11329f7d37698473c17060d"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 02).bin" size="4739280" crc="5ba0fa31" sha1="0363bc9dfe039ab02d54d2ecbd8c5674aa80aaa0"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 03).bin" size="8502480" crc="c728d9c2" sha1="949fddc2275e8ecd09fa1338123ba5cf24cea063"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 04).bin" size="8455440" crc="c4803ddc" sha1="490e572592f92c279bf58e4c9893e507ffee99e6"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 05).bin" size="8401344" crc="9d49d5a9" sha1="05f518635e08f60e0abe68c3a613774c015bed13"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 06).bin" size="9643200" crc="287dc885" sha1="703e5543b8fbadf242fdabb2464d75e0f6f33955"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 07).bin" size="9979536" crc="d6531b2c" sha1="7f71993aa33d8391952a01c0a187a07d4daca10a"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 08).bin" size="8290800" crc="65bf91d9" sha1="349a0249c81c0be504a00b74c01e3093a651a492"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 09).bin" size="8596560" crc="e0a04d9c" sha1="244dd9524f44d23049537091338d3910644b60d4"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 10).bin" size="9796080" crc="14017854" sha1="851928eeba7422b29c8eec599dc7061524ed27fd"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 11).bin" size="56589120" crc="268c8765" sha1="55d536867f6d972c03336d040dbc5bcccb28bc0d"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 12).bin" size="1058400" crc="608ebfad" sha1="bfaac55fb956dde2f8a2c3d4f6271b434248f6a3"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 13).bin" size="1063104" crc="554fc4e2" sha1="cd1ff3f456373877d55aa3043416c6cee8c15010"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 14).bin" size="1364160" crc="c7713d67" sha1="9e674f7d5d8489243ccad8a233c8aab15fbce9a4"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 15).bin" size="1688736" crc="86f9ecb0" sha1="a4f04fd00537e18b1470ce9b1516d4b04046fe89"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 16).bin" size="1227744" crc="61a4291e" sha1="17dad66974b08d30051fd4983b26e11885941cb2"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 17).bin" size="1258320" crc="d692b9bb" sha1="ad877a50f292f06f7cdf06a31dc0ac98640aef97"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 18).bin" size="2547216" crc="b6cedf59" sha1="203210200039c374b69a4e434ece9b01b4505195"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 19).bin" size="1152480" crc="09113218" sha1="86439105fe0552656369b5abf424af84a2518c10"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 20).bin" size="1439424" crc="2fe93007" sha1="ffdb3e1344036892e711658ffd2fd8bdc4395a6b"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 21).bin" size="1375920" crc="88ae2d41" sha1="360a57f68927823e24787caad44d53fff401c893"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 22).bin" size="1629936" crc="0e6501ea" sha1="4a00005f386630947c4eae04a7829db55803274b"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 23).bin" size="1627584" crc="16014d47" sha1="569e0ce4835d90fd36e87e772853aa5ea9be6fa4"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 24).bin" size="1618176" crc="70dc9108" sha1="fb69926bbff3a3a179c8653766c08ecd7a2da155"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 25).bin" size="2657760" crc="07cd1078" sha1="9807b57740f02529fde119a5a142bd60b204c09f"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 26).bin" size="1340640" crc="ecb7b072" sha1="bd09151db240deb074de5aa4fcd59274f607ed9f"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 27).bin" size="1227744" crc="9dd160be" sha1="957b5905c75067aed4fe37006ca6d7dcb4638d59"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 28).bin" size="1281840" crc="ff6dbb06" sha1="b225cfab1f0dc2bb3d3a273897822adf1cc4d9a2"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 29).bin" size="1916880" crc="1716db88" sha1="6aa3a44e6b8658d34d10d759e6cfcf85c793a3da"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 30).bin" size="1505280" crc="33fd0b32" sha1="59b75909d29a5fe6890eb97d2bb7d719fa8226a2"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 31).bin" size="1681680" crc="cc438cc9" sha1="002b2e23c489262e4845ba714dbea24da820ad86"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 32).bin" size="2740080" crc="a1264910" sha1="4eaeeedf47013d2d1761f0b6dcc0d1d83cc88bd1"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 33).bin" size="924336" crc="eaf53f45" sha1="aac75a9dbb8ac643e2c6c3a77e17dc20ad49022f"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 34).bin" size="1458240" crc="132db3f7" sha1="2753e21cfe0292e438d929b04135e4c6f69f205b"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 35).bin" size="1340640" crc="1a79a0a9" sha1="fb079ad0c8cd8ade80d0adc618631d2268fa7166"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 36).bin" size="1858080" crc="e2faac96" sha1="c924ae9406ab6db87f499ce7bebb071c7597258a"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 37).bin" size="1916880" crc="7f149da7" sha1="1a4bfc774276a481ca0e300db2cf649c7959a507"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 38).bin" size="1646400" crc="004e7aea" sha1="3437e973932462453034b62f87b1e414976393c6"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 39).bin" size="3062304" crc="7447b256" sha1="5d93b8b3ada55869e6adb64936f926ac236c5ee6"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 40).bin" size="964320" crc="60f937a9" sha1="c9fc83efcb98dcaa1d4b351c1602ff4f4596d6db"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 41).bin" size="1618176" crc="a711b323" sha1="4759d3371c91d582f104f62f4266222231decf2c"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 42).bin" size="1528800" crc="f96758db" sha1="27c590ec7405eea72deacfab5d66f41eff81e33f"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 43).bin" size="1557024" crc="86c22458" sha1="9922770cda3f943dd1ce0e876a452da573c69b62"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 44).bin" size="1900416" crc="758bd87e" sha1="75395ae613c7131b7b526d1377b4913dde227fbc"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 45).bin" size="1987440" crc="ba27cdbe" sha1="fafa42c6f5131428aa0ba8e9ff745ea738f30677"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 46).bin" size="2544864" crc="6a8535e1" sha1="396e4e0c56bcad470452f3f2aef8b35f2a48f26f"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 47).bin" size="1559376" crc="6e940488" sha1="9dfc82f127c66c85b3787664018611112b871790"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 48).bin" size="1364160" crc="c2b2414d" sha1="ade045500bdd5ac987f5d627a0c8db1c92dbad64"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 49).bin" size="1446480" crc="e5a72a47" sha1="80bd8511abc5e82a832e730c5f81ee8ea27e2a0e"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 50).bin" size="1893360" crc="b0815743" sha1="b089e297742a0257eb177202b9716e89a3fb7044"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 51).bin" size="1940400" crc="106cea32" sha1="f968972e9bb23a61af302bf56dcb3bd49356b6c0"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 52).bin" size="1752240" crc="3273bda3" sha1="ff97e10285113523c26f2ce7d2439cd44c9f2a58"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 53).bin" size="2015664" crc="04e8dc2c" sha1="10d4867fcee1b4c304d2de9ce64d21a1e27c58a2"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 54).bin" size="1418256" crc="9fd43469" sha1="cacb8386b9a0c48d717827b05a20a7f48d488040"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 55).bin" size="1364160" crc="ee312e62" sha1="3f3dfd275b7f4f45df13e80c30b05f9d7ee0ee90"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 56).bin" size="1933344" crc="25209148" sha1="256beb4c0589d2e7e55a5785e7e18e18703c567f"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 57).bin" size="1693440" crc="a4f22989" sha1="83a6565c57cb25f90dba229886c387f731af7794"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 58).bin" size="1787520" crc="f8e6618f" sha1="0e9eef4d3babb56e37567cbce8b2e80e06eb9417"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 59).bin" size="2312016" crc="42118ed1" sha1="3f023624bbb62bb10e511f9b2f61c896c18cf275"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 60).bin" size="2180304" crc="b90fb5e5" sha1="2fec7347b3b1b39c835ded7a06aa548eab57de4e"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 61).bin" size="2140320" crc="40acffbe" sha1="87bb300fa78f5c63541debb6e7290c65a6762b9a"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 62).bin" size="1787520" crc="b61a43e2" sha1="7a97c5aa5888a0f359cb2343752c2d5987a722c8"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 63).bin" size="2653056" crc="5d182238" sha1="711a3818345aed0e8c3b3024cd3cf4ffecba9918"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 64).bin" size="3038784" crc="2bd15af1" sha1="3ec171e3f6c7ca507b79fe3a1fd3d2bda0b8a006"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 65).bin" size="2528400" crc="f1154436" sha1="a697d3a1bd666cce8fa26ad59bf3b10352662170"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 66).bin" size="1923936" crc="37059c76" sha1="b600b333285da0fb43ade8af0768e481b3a90c73"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 67).bin" size="2963520" crc="a5da12a5" sha1="471a7a61147e45a0bc1ac3fcab9f2c9ce72effa8"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 68).bin" size="2239104" crc="1878f1b3" sha1="1486f33b79ab59e614940f503898997fb338eab8"/>
+ <rom name="Moonlight-chan Rin shan (Japan) (Track 69).bin" size="27447840" crc="f6fee3a2" sha1="7920d6d0199fc5117eecede3c8d9df59a0b1bc82"/>
+ <rom name="Moonlight-chan Rin shan (Japan).cue" size="8699" crc="ad6c8851" sha1="e43876bbce0487c18bfb36fd044fbf9aeea936a0"/>
+ -->
+ <description>Moonlight-chan Rinshan</description>
+ <year>1993</year>
+ <publisher>ディー・オー (D.O.)</publisher>
+ <info name="serial" value="2TD-3001"/>
+ <info name="alt_title" value="Mゥーンライトちゃんリンしゃん" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="moonlight-chan rin shan (japan)" sha1="ad099754d15bc436ddec50130cd3d89253f6957e" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="msdet1">
<!--
Origin: P2P
@@ -3661,31 +4193,44 @@ license:CC0
</part>
</software>
- <!-- PC-98x1 / FM Towns hybrid, also included in fmtowns_cd.xml -->
+ <!-- PC-9821 / FM Towns hybrid -->
<software name="mujintou">
<!--
- Origin: Neo Kobe Collection
- <rom name="Mujintou Monogatari.ccd" size="3456" crc="275a291d" sha1="81c9565f559f59cfe9ff4e666a2a9822915624ea"/>
- <rom name="Mujintou Monogatari.cue" size="847" crc="3e4f0013" sha1="3767ed59ebeb718d449d4d80beb1e1fb4ff14c44"/>
- <rom name="Mujintou Monogatari.img" size="696972864" crc="aff89b05" sha1="419d472dbf69d3cd204e0f07ddce900233f4b7f2"/>
- <rom name="Mujintou Monogatari.sub" size="28447872" crc="68370f53" sha1="31d57842f7a5a0a71e27c36aa272ae0b27be9d91"/>
+ Origin: redump.org
+ <rom name="Mujintou Monogatari (Japan) (Track 01).bin" size="37467360" crc="063a11b1" sha1="aeb0d51a31eba2349e835dab6372a59546216a18"/>
+ <rom name="Mujintou Monogatari (Japan) (Track 02).bin" size="464901024" crc="fcdf3058" sha1="44cb4c06b72e049f6f7233b42c025dcf8d0b5a67"/>
+ <rom name="Mujintou Monogatari (Japan) (Track 03).bin" size="21610176" crc="0f4d9699" sha1="ccac69b20cfe1683ab25bdac37775c087f37466d"/>
+ <rom name="Mujintou Monogatari (Japan) (Track 04).bin" size="21403200" crc="2d1876e1" sha1="2058b15a0c341eb73ef8ccf9d1a4bb54c1b3d4cc"/>
+ <rom name="Mujintou Monogatari (Japan) (Track 05).bin" size="21466704" crc="02bdf529" sha1="1ab60705781b0a6169cf1b807ad08818e1ec40b2"/>
+ <rom name="Mujintou Monogatari (Japan) (Track 06).bin" size="10889760" crc="634fd5bf" sha1="599af77c759485c12f19f83ab0320a9d949417c6"/>
+ <rom name="Mujintou Monogatari (Japan) (Track 07).bin" size="10983840" crc="81cdca09" sha1="0b0a1af4d2f59093849ecdfecf4146e9c05717e6"/>
+ <rom name="Mujintou Monogatari (Japan) (Track 08).bin" size="10873296" crc="351db652" sha1="f61f51efbeab0afc9bb8f055bce392cd2b92e2be"/>
+ <rom name="Mujintou Monogatari (Japan) (Track 09).bin" size="21509040" crc="bd74a489" sha1="436ee221bdd960235a27068da07154206570b316"/>
+ <rom name="Mujintou Monogatari (Japan) (Track 10).bin" size="21631344" crc="09097d83" sha1="84eb930e9704b4fafb436908a87fceb5ea9a1eb3"/>
+ <rom name="Mujintou Monogatari (Japan) (Track 11).bin" size="21574896" crc="c5ada574" sha1="e125c0bda977fbdc1837cef8ee75cbfb48466ec2"/>
+ <rom name="Mujintou Monogatari (Japan) (Track 12).bin" size="10854480" crc="fce2838a" sha1="707d53a04fc3f88eabe4b2e8e9ec459d72f6899a"/>
+ <rom name="Mujintou Monogatari (Japan) (Track 13).bin" size="11124960" crc="18406ab1" sha1="020167d6f28842b3247353cd67b2af097b52d63d"/>
+ <rom name="Mujintou Monogatari (Japan) (Track 14).bin" size="10682784" crc="4240e757" sha1="77b8f324f6f677ab033460b7b388ec8d3b6e47cd"/>
+ <rom name="Mujintou Monogatari (Japan).cue" size="1690" crc="891d7bbd" sha1="f70e8405706fe06ef9de85e339fd1fedf8a2ec23"/>
-->
<description>Mujintou Monogatari</description>
<year>1995</year>
<publisher>ケイエスエス (KSS)</publisher>
+ <info name="serial" value="JSGF60028"/>
<info name="alt_title" value="無人島物語" />
<info name="release" value="199509xx" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="mujintou monogatari" sha1="7cfe7c2b9d4bef30c1db4dbeae0a99799a90dea0" />
+ <disk name="mujintou monogatari (japan)" sha1="4c3953dca5df12765fcf3b33c7cf18c8bb7b96cf" />
</diskarea>
</part>
</software>
<software name="myhomed2">
<!--
- Origin: P2P
- <rom name="マイホームドリーム2.iso" size="9844736" crc="4e52179b" sha1="1184664bc1a77f8f659d05e6db1c59a98f80e38b"/>
+ Origin: redump.org
+ <rom name="My Home Dream 2 (Japan).bin" size="11306064" crc="7dc54aca" sha1="e9b63ba27c34e89c5dc2d420270f596463dc2b49"/>
+ <rom name="My Home Dream 2 (Japan).cue" size="112" crc="63521769" sha1="b7ee876422ff75340a7fd03d186dc5aec47228b0"/>
-->
<description>My Home Dream 2</description>
<year>1995</year>
@@ -3693,7 +4238,7 @@ license:CC0
<info name="alt_title" value="マイホームドリーム2" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="myhomed2" sha1="cf40d4a36b83bb8fa55d0b8108f28bc5c7a062ba" />
+ <disk name="my home dream 2 (japan)" sha1="b398cdbc0ef8d0e4ac379cc6d686d82a68824400" />
</diskarea>
</part>
</software>
@@ -3919,21 +4464,19 @@ license:CC0
<software name="pilcasex">
<!--
- Origin: Neo Kobe Collection
- CCD converted to CUE with GNU ccd2cue
- <rom name="PILcaSEX.ccd" size="768" crc="a685bc55" sha1="2e9c74a53d0b01a3673322aa56d9d72a7be2f5fe"/>
- <rom name="PILcaSEX.cue" size="70" crc="95b9d552" sha1="b38501e438107d9f34ed227d61a93a956f903327"/>
- <rom name="PILcaSEX.img" size="10440528" crc="c4f34aa6" sha1="1521ae3dfbc6253cf658e58545d9ca0395e83b1c"/>
- <rom name="PILcaSEX.sub" size="426144" crc="7a9a7aab" sha1="bc1c5af8fecb3872206bdf8bd1347a0e7f904244"/>
+ Origin: redump.org
+ <rom name="PILcaSEX (Japan).bin" size="10440528" crc="c4f34aa6" sha1="1521ae3dfbc6253cf658e58545d9ca0395e83b1c"/>
+ <rom name="PILcaSEX (Japan).cue" size="105" crc="6b9d768d" sha1="79ffc6a26722a081896a5467f08a23df88aeede1"/>
-->
<description>PILcaSEX</description>
<year>1996</year>
<publisher>PIL</publisher>
+ <info name="serial" value="PIL-0304"/>
<info name="alt_title" value="ピルケース" />
<info name="release" value="19960726" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="pilcasex" sha1="9a2e11eb9b919af0111ae50a469a7ed662b276b1" />
+ <disk name="pilcasex (japan)" sha1="9a2e11eb9b919af0111ae50a469a7ed662b276b1" />
</diskarea>
</part>
</software>
@@ -4092,14 +4635,15 @@ license:CC0
</part>
</software>
+ <!-- DOS/V / PC-9821 / FM Towns hybrid. Each version requires a different floppy disk, but the CD is shared between them. -->
<software name="psydet1">
<!--
- Origin: Neo Kobe Collection
- CCD converted to CUE with GNU ccd2cue
- <rom name="Psychic Detective Series Vol. 1 - Invitation.ccd" size="1356" crc="2422b0af" sha1="3b6e7f9a5859c025547827665eb280e20ab9f333"/>
- <rom name="Psychic Detective Series Vol. 1 - Invitation.cue" size="242" crc="2e738f92" sha1="a96dded98cd0ebe78292d1a22279042fdad01cfe"/>
- <rom name="Psychic Detective Series Vol. 1 - Invitation.img" size="355210800" crc="6d3ea2b1" sha1="9c6f3d3d76407f598cf5d2dd796333793845b277"/>
- <rom name="Psychic Detective Series Vol. 1 - Invitation.sub" size="14498400" crc="ac3f524a" sha1="21f4b4b34242c7a586652383fd9de91df3e90aac"/>
+ Origin: redump.org (CD) / Neo Kobe Collection (floppy)
+ <rom name="Psychic Detective Series Vol. 1 - Invitation (Japan) (Remake) (Track 1).bin" size="201448800" crc="5d2529aa" sha1="24dda7bd89762a5b7280c9b83542ed042b6ff34b"/>
+ <rom name="Psychic Detective Series Vol. 1 - Invitation (Japan) (Remake) (Track 2).bin" size="72335760" crc="72a4dd12" sha1="aef73c8cda5335fb05c43c9e57ad7cfa64573bc7"/>
+ <rom name="Psychic Detective Series Vol. 1 - Invitation (Japan) (Remake) (Track 3).bin" size="31328640" crc="b3cb10bf" sha1="8cfd1a51ec1caa3ac26c158f8700f2bf929a1820"/>
+ <rom name="Psychic Detective Series Vol. 1 - Invitation (Japan) (Remake) (Track 4).bin" size="50097600" crc="a0a77753" sha1="c29cb243ac9ac9580a69d7bbaebb044d9775eafd"/>
+ <rom name="Psychic Detective Series Vol. 1 - Invitation (Japan) (Remake).cue" size="602" crc="f704a7e8" sha1="90308874f4e01b97b381d3a058c9539ae2928d49"/>
-->
<description>Psychic Detective Series Vol. 1 - Invitation - Kage kara no Shoutaijou</description>
<year>1993</year>
@@ -4113,7 +4657,7 @@ license:CC0
</part>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="psychic detective series vol. 1 - invitation" sha1="0c74357b7739003b96d20a2e050e254463d77dfc" />
+ <disk name="psychic detective series vol. 1 - invitation (japan) (remake)" sha1="5616c229de4b9c890af7955a1de4e34106f139e8" />
</diskarea>
</part>
</software>
@@ -4170,6 +4714,33 @@ license:CC0
</part>
</software>
+ <!-- DOS/V / PC-9821 / FM Towns hybrid. Each version requires a different floppy disk, but the CD is shared between them. -->
+ <!-- Missing the floppy disk for the PC-98 version -->
+ <software name="psydet4" supported="no">
+ <!--
+ Origin: redump.org
+ <rom name="Psychic Detective Series Vol. 4 - Orgel (Japan) (Remake) (Track 1).bin" size="107361744" crc="76efc65e" sha1="20caaa48aa247a8c46bd7efbe8902e83194771d5"/>
+ <rom name="Psychic Detective Series Vol. 4 - Orgel (Japan) (Remake) (Track 2).bin" size="6599712" crc="163ccb38" sha1="cbf30d28a9509f9a4613133a2098b420cc20bb88"/>
+ <rom name="Psychic Detective Series Vol. 4 - Orgel (Japan) (Remake) (Track 3).bin" size="51791040" crc="a2fc69e8" sha1="4662b38ae6ae66ef79809afe90828197dc63d777"/>
+ <rom name="Psychic Detective Series Vol. 4 - Orgel (Japan) (Remake) (Track 4).bin" size="31634400" crc="57f4519d" sha1="4b3ce86bf1a943db6b66143521da0887a521b561"/>
+ <rom name="Psychic Detective Series Vol. 4 - Orgel (Japan) (Remake) (Track 5).bin" size="22383984" crc="80fc3fc0" sha1="fb866ed8de91f1304e0236ca768d5bf05f2d67e8"/>
+ <rom name="Psychic Detective Series Vol. 4 - Orgel (Japan) (Remake) (Track 6).bin" size="26547024" crc="f26e504b" sha1="5bc1a0dc632af0035a2bf2f62e3853e1cd705823"/>
+ <rom name="Psychic Detective Series Vol. 4 - Orgel (Japan) (Remake) (Track 7).bin" size="28567392" crc="289076d2" sha1="cc07a9e6befdcbfdaee1cb28b8a922819e0c89f9"/>
+ <rom name="Psychic Detective Series Vol. 4 - Orgel (Japan) (Remake).cue" size="1055" crc="05e069cb" sha1="af74b4b4776c824cffad757a4812f298148b2519"/>
+ -->
+ <description>Psychic Detective Series Vol. 4 - Orgel</description>
+ <year>1994</year>
+ <publisher>データウエスト (Data West)</publisher>
+ <info name="serial" value="DWDC4023"/>
+ <info name="alt_title" value="サイキック・ディテクティヴ・シリーズ Vol.4 オルゴール" />
+ <info name="release" value="199412xx" />
+ <part name="cdrom" interface="fmt_cdrom">
+ <diskarea name="cdrom">
+ <disk name="psychic detective series vol. 4 - orgel (japan) (remake)" sha1="60b1d1a9085734c7d86d9d88c1590610b179567c" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="puyopuy2">
<!--
Origin: redump.org
@@ -4605,23 +5176,22 @@ license:CC0
</part>
</software>
- <!-- PC-98x1 / FM Towns hybrid -->
+ <!-- PC-9801 / FM Towns hybrid -->
<software name="sakumori">
<!--
- Origin: P2P
- <rom name="Image.cdm" size="868" crc="8bab4d7b" sha1="dec4dc62f9c5446d07c280c5563bedff37e9f4f4"/>
- <rom name="Image.cue" size="71" crc="b496048a" sha1="8590392ca153b7559d50bef2f83defc45e315624"/>
- <rom name="Image.img" size="23317728" crc="ec413202" sha1="1f368669d90cca79982c174970ca2ca942fcb291"/>
- <rom name="Image.sub" size="951744" crc="955d3498" sha1="e8acdd0fb86ee2217fdeed8cd13e1ac96422afc0"/>
+ Origin: redump.org
+ <rom name="Sakura no Mori (Japan).bin" size="23317728" crc="ec413202" sha1="1f368669d90cca79982c174970ca2ca942fcb291"/>
+ <rom name="Sakura no Mori (Japan).cue" size="111" crc="e0fa0181" sha1="6a644b411fcebebdd8715ac61e4917ba06d9ec63"/>
-->
<description>Sakura no Mori</description>
<year>1995</year>
<publisher>アクティブ (Active)</publisher>
+ <info name="serial" value="2TD-2052"/>
<info name="alt_title" value="櫻の杜" />
<info name="release" value="19951027" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="sakumori" sha1="36bfe8686bb2eadb962852e5e1e44de94e654c23" />
+ <disk name="sakura no mori (japan)" sha1="63f2a22197644867cd3374936716e187cf02e44d" />
</diskarea>
</part>
</software>
@@ -4775,78 +5345,92 @@ license:CC0
<!-- Doesn't recognize the CD-ROM - the same image works on real hardware -->
<software name="schwarex" supported="no">
<!--
- Origin: Neo Kobe Collection
- CCD converted to CUE with GNU ccd2cue
- <rom name="Schwarzschild EX - Tessa no Seigun.ccd" size="4023" crc="6b9a81a0" sha1="c194537cd16be86b76bed370967a38c122374a3b"/>
- <rom name="Schwarzschild EX - Tessa no Seigun.cue" size="773" crc="3a32e339" sha1="db52ea9d41eba43cc6b0daa9f202a4c681633187"/>
- <rom name="Schwarzschild EX - Tessa no Seigun.img" size="448829808" crc="87b2838f" sha1="7219afee2ce909d69a533016d878c71a1bd0dd91"/>
- <rom name="Schwarzschild EX - Tessa no Seigun.sub" size="18319584" crc="7a5ee540" sha1="39481c4f02697cb6260900fde332e48bc474f1c3"/>
+ Origin: redump.org
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 01).bin" size="12395040" crc="bcb595bf" sha1="545ffbbdda0a051bd9e6feee64ebe43a1cac89fb"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 02).bin" size="1060752" crc="b82aea6e" sha1="73faef5a8e3ce984f9b4913d93a3ddeff357c66e"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 03).bin" size="30625392" crc="f29c3b2d" sha1="1b2c2711dd63f2a21224b592d069500c0238b392"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 04).bin" size="34242768" crc="6bcfd5ce" sha1="ab98618c329fe78eab890b255966233b43fd05bd"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 05).bin" size="27654816" crc="e8573396" sha1="836f8f4709085850bbbeb721ec5c289be743e907"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 06).bin" size="28769664" crc="094fa776" sha1="3e10b76add4b44cfab20f033f4efd94d34423b47"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 07).bin" size="19161744" crc="dd8d7ffe" sha1="72b34f1c3e46a285213096e6a9ffb2d5211b000c"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 08).bin" size="28597968" crc="4e1bd5d8" sha1="33e1b5a09e48b73cab67f9991ecc4f4ef2ee862b"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 09).bin" size="14817600" crc="4bde9715" sha1="7348e6edfc99461b438e2db63323828852f4a9f2"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 10).bin" size="33410160" crc="405f57dc" sha1="a9bac4437dcf6f90ec367d8f58ebff88bd4a10e7"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 11).bin" size="34325088" crc="d1953660" sha1="f702dc88174a3017fb98957bfcffaa3351b932ab"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 12).bin" size="25222848" crc="e4fe6d99" sha1="86d599263e5fedc159d6ad3e3d4ecf28e970e06d"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 13).bin" size="25808496" crc="5b32950a" sha1="334e373139856f6356ad6968c601c2c6a1abc584"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 14).bin" size="27120912" crc="694cf5af" sha1="f314c688e1d4f0b31b87d52448a171378290ed67"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 15).bin" size="29663424" crc="2b416b13" sha1="11890881b0174967ce6e1336875fa8138a71ea2a"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 16).bin" size="18656064" crc="c7f6bc92" sha1="c6ff6e1e6d64b49f04e35d6e096b755c19d16197"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 17).bin" size="30169104" crc="4fcc01a3" sha1="bbb1376ba7f11f25310c73fd19860b9c9efca2e5"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan) (Track 18).bin" size="27127968" crc="db9cfd71" sha1="ff05b47c00df7db31493ffec47441c263170aeb0"/>
+ <rom name="Schwarzschild EX - Tessa no Seigun (Japan).cue" size="2103" crc="ece7925a" sha1="9a6827afce53993c9157e4df3fea86ee25607902"/>
-->
<description>Schwarzschild EX - Tessa no Seigun</description>
<year>1995</year>
<publisher>工画堂 (Kogado)</publisher>
+ <info name="serial" value="9214-55HM10" />
<info name="alt_title" value="シュヴァルツシルトEX 鉄鎖の星群" />
+ <info name="release" value="19950718" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="schwarzschild ex - tessa no seigun" sha1="e855469cd1cea5fd01e09d686f746930dc0e8337" />
+ <disk name="schwarzschild ex - tessa no seigun (japan)" sha1="97e4175681789c132342f2ca82e1c56b41fcad6c" />
</diskarea>
</part>
</software>
<!-- Needs the mouse driver loaded, otherwise displays everything at double size. Doesn't happen on real hardware. -->
+ <!-- Windows / PC-9801 hybrid -->
<software name="schwargx">
<!--
- Origin: P2P
- <rom name="Schwarzschild GX CD (1997)(KOGADO).ccd" size="7542" crc="ac4f05b3" sha1="add60653a0482dddd836c9de107b90b61eae96d2"/>
- <rom name="Schwarzschild GX CD (1997)(KOGADO).img" size="560345184" crc="5b18f6a7" sha1="55605ee1ef9d3c316de2bf6d2f40265423a9b0a6"/>
- <rom name="Schwarzschild GX CD (1997)(KOGADO).sub" size="22871232" crc="5a7443c6" sha1="c3e385106fe5994a935f1e6245502c5df7646383"/>
-
- *after conversion with IsoBuster+EAC *
- <rom name="Schwarzschild GX CD (1997)(KOGADO).cue" size="4493" crc="a777c5dc" sha1="82d1aa50f8bebaa042eb1ffc3ca3a84994474a4b"/>
- <rom name="Track01.bin" size="22111152" crc="ea405f75" sha1="010e133a25f397140eefdcf98a1f47a8a52d9391"/>
- <rom name="Track02.bin" size="1411200" crc="96ddfabe" sha1="842a3c7a1ba76191f196f6fa6f64862347d4c28d"/>
- <rom name="Track03.bin" size="19161744" crc="b6d75d6e" sha1="27e31f0705b7c6096e0117ccc3538aed37677e9a"/>
- <rom name="Track04.bin" size="22680336" crc="43559b63" sha1="90b7ac3a84f9ecb484c5766fc630fed6b6dfa45f"/>
- <rom name="Track05.bin" size="17898720" crc="d074ded1" sha1="c715bd09b6304bd5e954f4880fec841255687c11"/>
- <rom name="Track06.bin" size="19808544" crc="b3d2cd24" sha1="735e1e77c9cf78903a0da4240a9c7960bd3f2265"/>
- <rom name="Track07.bin" size="18724272" crc="23887f84" sha1="ffa880b0f2a2f539f2de2983c3c8068c7e2f6934"/>
- <rom name="Track08.bin" size="9941904" crc="541a82c4" sha1="67f8fa3cd9999aa0baeb7e64739a0a72e73ba31d"/>
- <rom name="Track09.bin" size="15412656" crc="cb1ad81c" sha1="7c44432c6796e006def0434f05cdde566d8025d9"/>
- <rom name="Track10.bin" size="15092784" crc="7ea10a5a" sha1="8f59ad2bae40bc1256a8dae508e46a51526977ba"/>
- <rom name="Track11.bin" size="11040288" crc="cc644633" sha1="997e9d170f3df6f976477cb83f621e72b3c62bb2"/>
- <rom name="Track12.bin" size="14657664" crc="4e60087c" sha1="6191fe6f1554fa912b4eb201f4a4a33d5d26d0d8"/>
- <rom name="Track13.bin" size="15739584" crc="43aa2f4c" sha1="69d92042040a069d31e21b3fc007ef9285dc0eae"/>
- <rom name="Track14.bin" size="18251520" crc="e23c4d20" sha1="bfd3f278bedb72a9ad7d3cb2f4f8e6a3dadcafdd"/>
- <rom name="Track15.bin" size="16111200" crc="f4b8fda5" sha1="27efff152546d9bd0bce334d6c3217e2c0f4d60f"/>
- <rom name="Track16.bin" size="12009312" crc="c5d679ad" sha1="151ae62efccd4cc67268269f1591ed7962d2cd91"/>
- <rom name="Track17.bin" size="32763360" crc="ad6282fc" sha1="d670ec36430bc9251710e2d60bd2dd67802e9388"/>
- <rom name="Track18.bin" size="48218352" crc="4a8af34c" sha1="598512c5f9fe3224173c75ee548c41cbc9c076bc"/>
- <rom name="Track19.bin" size="50483328" crc="b4be8681" sha1="9a40b5cc1ce623dc672e456d10bf324ac83df48e"/>
- <rom name="Track20.bin" size="3455088" crc="04e65bc6" sha1="cb807210846976da5a19bf4c34ab501a649938d8"/>
- <rom name="Track21.bin" size="5854128" crc="037b032a" sha1="1157ebcc1fa1f0e1d69a457236a5df1c7fabef02"/>
- <rom name="Track22.bin" size="14387184" crc="04fd9192" sha1="52504d1b78c62929e73e8d9130d02309b0190cae"/>
- <rom name="Track23.bin" size="3426864" crc="a4027014" sha1="5724b98c79ecb9d41dba8c37adb2315428d97181"/>
- <rom name="Track24.bin" size="2469600" crc="8bca924a" sha1="dd663d8476b314b61ab14fb321f289b601ea0c01"/>
- <rom name="Track25.bin" size="12117504" crc="dfcb280d" sha1="4c35fc433176af42f452bc37484fbc45de095894"/>
- <rom name="Track26.bin" size="18564336" crc="5f332575" sha1="0b08a6aa2f09839d708775f83618f2e2fd9fb1a2"/>
- <rom name="Track27.bin" size="23929248" crc="5ed350ab" sha1="919f86d32141b0134868578036376083b2758a20"/>
- <rom name="Track28.bin" size="10699248" crc="71c975b2" sha1="5be6ece028b670f4332d5495dd97e3cbf7326899"/>
- <rom name="Track29.bin" size="7526400" crc="3ef32e52" sha1="d7642b457700f15f8400b13cec78d7ac412303e7"/>
- <rom name="Track30.bin" size="20114304" crc="4cbf40e1" sha1="e58f6521d09a23395bbd1387f5205d44f96d11f8"/>
- <rom name="Track31.bin" size="8347248" crc="7f1599be" sha1="bad1cd67ef8c78afffe082a5eb0e6115978b1054"/>
- <rom name="Track32.bin" size="10696896" crc="1aad8a60" sha1="7d56611f13d909021e30490dbaee767bd7753945"/>
- <rom name="Track33.bin" size="6905472" crc="140f86cb" sha1="7e74284b66bf4e37c2be615eeb18a9a101caa425"/>
- <rom name="Track34.bin" size="8761200" crc="8b939bfd" sha1="e2b96f88412a8c1ce16c916bb7f7cd770a694103"/>
- <rom name="Track35.bin" size="9758448" crc="393a430a" sha1="4977a91e035164b2d9f1f789556c07f00f0322f8"/>
- <rom name="Track36.bin" size="11814096" crc="30450f84" sha1="f0347acbb558b4a040f14467af375a6eb431fba9"/>
+ Origin: redump.org
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 01).bin" size="22111152" crc="ea405f75" sha1="010e133a25f397140eefdcf98a1f47a8a52d9391"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 02).bin" size="1058400" crc="648c227c" sha1="729c8d0d2eb161d068c48a84826268f9ec790222"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 03).bin" size="19161744" crc="354ed792" sha1="c72e731726e196508bc3de66797acd292bf868ea"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 04).bin" size="22680336" crc="ba3e56e7" sha1="a780b2e5d99e1228604d9b67ff642853dd0f726d"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 05).bin" size="17898720" crc="641a0030" sha1="c8bc9da96d9dad46c836db643acb081da63a0df7"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 06).bin" size="19808544" crc="c65deec7" sha1="daf7af331cf992c3202e491eb587b03bde0257e1"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 07).bin" size="18724272" crc="22af7a65" sha1="94f8ff1e23163ac201f2a98d8622b85ddae990de"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 08).bin" size="9941904" crc="a5f9dac6" sha1="3aa403e46974524c097b4ecc0279d1ee3bb3fea5"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 09).bin" size="15412656" crc="f9a6fef5" sha1="4c521ab4a54cdf398caaecab943d432f42dbe645"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 10).bin" size="15092784" crc="2b585d61" sha1="dc88f41f89ec401639fa42da81682cfc79c2e378"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 11).bin" size="11040288" crc="259f6e79" sha1="888f7dc6b3653e1557c1caacf4f0cf2fd86afb7e"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 12).bin" size="14657664" crc="0b10650c" sha1="118714a22b2eb50d3f4d3b7dc87a029f756ab0f4"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 13).bin" size="15739584" crc="c1d3f1b8" sha1="d259ffaf7711a85f4783ef281fd42acc8f8605e7"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 14).bin" size="18251520" crc="62395f03" sha1="c0ffe8ca727940dc8388af97d207efddcc5d86c0"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 15).bin" size="16111200" crc="32a6ac49" sha1="3869b8b875e1dc1f74e0e41b94f77f9a3ce2dfc4"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 16).bin" size="12009312" crc="dd18497b" sha1="7799517e69c2e4b59ac1a01007f2dc5183fa98fd"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 17).bin" size="32763360" crc="3a58b1bb" sha1="55921d7a5928e99aa6f2880d362fc14c59c9d978"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 18).bin" size="48218352" crc="dda8a325" sha1="bd8f163f040c22dddcc32794f14d7ef6842128e3"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 19).bin" size="50483328" crc="e5bf6ca4" sha1="f0512eba7e0e891faa2ca47e1619e2cfa5ee585e"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 20).bin" size="3455088" crc="da04db73" sha1="fc46698f4e6326aad69ebf69776cdfc6531fbdbe"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 21).bin" size="5854128" crc="b6cd31ba" sha1="c50770e1d778fb2333815819e8b81d7b138a9e79"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 22).bin" size="14387184" crc="7038491f" sha1="7ae38d0e2bac4822bc7d5ed2b7f1f14825c1edf1"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 23).bin" size="3426864" crc="9c6e7814" sha1="11a00a4f3bb254d69abb4445b8a5c354df7ecbda"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 24).bin" size="2469600" crc="d5d52713" sha1="2c220a8530ec1fb3995b67d88bf7be2fa5f77115"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 25).bin" size="12117504" crc="0ce955aa" sha1="2bfc3250c47b49e68864ce8a0680e7aa09b957c9"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 26).bin" size="18564336" crc="6b1cfd59" sha1="778b8228eb4967dc227b6b878b8d807094227aef"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 27).bin" size="23929248" crc="ef3a99b1" sha1="100cfdf4b5667003f429ae08e7c0d994fb168a5b"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 28).bin" size="10699248" crc="3c4c5dd2" sha1="068b9c2bf5b1c6f2ab800f5cb8091d584481ad62"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 29).bin" size="7526400" crc="6d479d1f" sha1="b78d55ff46f67cb9372fea1d6560e9bb695fcd05"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 30).bin" size="20114304" crc="c297f84a" sha1="a7582016feba6cb405b141b6aca1a03fcc7ee222"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 31).bin" size="8347248" crc="9bc7ee22" sha1="e91d74ad93f82b3854db564284a9e1c7b261d538"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 32).bin" size="10696896" crc="faf97ec0" sha1="53fa4876bcd23bcc37053fc0d501c055231d9757"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 33).bin" size="6905472" crc="8084dab7" sha1="e11ea1180c10effa4fde90009860d7e3d7f9cd3b"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 34).bin" size="8761200" crc="06ccc6ca" sha1="18050e588cd32fcc1da52596b3ccc853dc1bae1f"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 35).bin" size="9758448" crc="3a1dd439" sha1="eba3ad13a93eae0eef6c220d1eca12c6b732558b"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan) (Track 36).bin" size="12166896" crc="74b109e9" sha1="87aec6662d9a16de954c5bc54e41badf0a916064"/>
+ <rom name="Schwarzschild GX - Sabita Sousei (Japan).cue" size="4865" crc="45d03fd6" sha1="6cde5e8ecd9fc0e32dbc2e74b949539c855a50c3"/>
-->
<description>Schwarzschild GX - Sabita Sousei</description>
<year>1997</year>
<publisher>工画堂 (Kogado)</publisher>
+ <info name="serial" value="9531-77-01" />
<info name="alt_title" value="シュヴァルツシルトGX 錆びた蒼星" />
+ <info name="release" value="19970715" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="schwarzschild gx cd (1997)(kogado)" sha1="4f37477d1fc04b1d3a11316b4084ae96fe0e28cc" />
+ <disk name="schwarzschild gx - sabita sousei (japan)" sha1="acb0f3a6c6c9ba51614a6ade9c6bcde6cb075097" />
</diskarea>
</part>
</software>
@@ -4965,6 +5549,31 @@ license:CC0
</part>
</software>
+ <!-- Subtitles overlap each other during the intro - works otherwise -->
+ <software name="silentsr" supported="partial">
+ <!--
+ Origin: redump.org (CD) / wiggy2k (floppy)
+ <rom name="Silent Service, The - Chinmoku no Kantai (Japan).bin" size="152468400" crc="58825f3b" sha1="c9576c9a63f3539ac9b3bf799a619bc8ec82a343"/>
+ <rom name="Silent Service, The - Chinmoku no Kantai (Japan).cue" size="114" crc="72458bc6" sha1="b0456e4cfd549755a4790b603ebcc6e646cf918b"/>
+ -->
+ <description>The Silent Service - Chinmoku no Kantai</description>
+ <year>1993</year>
+ <publisher>ジーエーエム (GAM)</publisher>
+ <info name="serial" value="DWPC3808" />
+ <info name="alt_title" value="沈黙の艦隊" />
+ <info name="release" value="19930410" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="1261568">
+ <rom name="silent_service.hdm" size="1261568" crc="f0ed606a" sha1="2852329d81afa0adccd362f539dc949e6dc208c0" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="silent service, the - chinmoku no kantai (japan)" sha1="978b7938a3570b772ed6a3097ab10abae6a4a706" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="sofcom9">
<!--
Origin: Tokugawa Corporate Forums (peter_j)
@@ -5055,6 +5664,26 @@ license:CC0
</part>
</software>
+ <!-- Missing a floppy disk -->
+ <software name="syndicat" supported="no">
+ <!--
+ Origin: redump.org
+ <rom name="Syndicate (Japan).bin" size="28677936" crc="eddd9239" sha1="ea240d9a404b82b4d1312314b8ed6a257f382bee"/>
+ <rom name="Syndicate (Japan).cue" size="106" crc="638a1ca6" sha1="ea4b8493a0c47738a8952306f229acb941b96b8a"/>
+ -->
+ <description>Syndicate</description>
+ <year>1994</year>
+ <publisher>エレクトロニック・アーツ・ビクター (Electronic Arts Victor)</publisher>
+ <info name="serial" value="ENP-7009"/>
+ <info name="alt_title" value="シンジケート" />
+ <info name="release" value="19940728" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="syndicate (japan)" sha1="cd89a82b016f053cf2122f4862a36c7a1e3bca9f" />
+ </diskarea>
+ </part>
+ </software>
+
<!-- PC-98x1 / FM Towns hybrid, also included in fmtowns_cd.xml -->
<software name="takamiza">
<!--
@@ -5127,6 +5756,26 @@ license:CC0
</part>
</software>
+ <!-- Windows / PC-9801 / FM Towns hybrid -->
+ <software name="tania">
+ <!--
+ Origin: redump.org
+ <rom name="Tania (Japan).bin" size="6792576" crc="8d817419" sha1="ba5af267c605e62015739104963dfda4680f40b3"/>
+ <rom name="Tania (Japan).cue" size="79" crc="4858940d" sha1="d7c399c0a1c744a9050c1d9ff020014a40b4c98f"/>
+ -->
+ <description>Tania</description>
+ <year>1996</year>
+ <publisher>チップス (Tips)</publisher>
+ <info name="serial" value="WIC-5384"/>
+ <info name="alt_title" value="タニア" />
+ <info name="release" value="199611xx" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="tania (japan)" sha1="ff986d0facbe06ba42b2104ba01eaeafe1e0e382" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="tfx">
<!--
Origin: redump.org
@@ -5561,6 +6210,42 @@ license:CC0
</part>
</software>
+ <software name="vircall">
+ <!--
+ Origin: redump.org (CD) / wiggy2k (floppy)
+ <rom name="Virtuacall (Japan) (Track 01).bin" size="16567488" crc="be05a860" sha1="15158bcb5999ea9d8b856990c71e46baca13b31f"/>
+ <rom name="Virtuacall (Japan) (Track 02).bin" size="45407712" crc="d33414d1" sha1="45c3624c810ee4a1a22cd2c68c69ab98a92546cb"/>
+ <rom name="Virtuacall (Japan) (Track 03).bin" size="46698960" crc="941a9337" sha1="087326046904d421446bb239582c2a3983135c34"/>
+ <rom name="Virtuacall (Japan) (Track 04).bin" size="47385744" crc="eaace6bb" sha1="99d889e1c2cde34d561b3dbcb395440a4df591e9"/>
+ <rom name="Virtuacall (Japan) (Track 05).bin" size="45943968" crc="2549502d" sha1="6204e9374eff7a14d63299fc8fc40bc57a48541c"/>
+ <rom name="Virtuacall (Japan) (Track 06).bin" size="42105504" crc="9654bce6" sha1="6a17a51f92bf67a602df3abda1a85890097e657e"/>
+ <rom name="Virtuacall (Japan) (Track 07).bin" size="43871856" crc="16bd010c" sha1="c9d120a5667741a99467005767f5d2674b7edae8"/>
+ <rom name="Virtuacall (Japan) (Track 08).bin" size="47119968" crc="eaf444d6" sha1="d3b6d06fc950f974a64c2016ea250ca18956eef0"/>
+ <rom name="Virtuacall (Japan) (Track 09).bin" size="46917696" crc="1adc3cfb" sha1="2c61ec192c30f46afc14ec3f8d2f009e735a6f09"/>
+ <rom name="Virtuacall (Japan) (Track 10).bin" size="42343056" crc="993d9976" sha1="771aa8bd6f11614505a06c863f0c46254be78da4"/>
+ <rom name="Virtuacall (Japan) (Track 11).bin" size="42884016" crc="1e31afa1" sha1="39f43143b0f16a8c4c733d29e493342d3dad7287"/>
+ <rom name="Virtuacall (Japan) (Track 12).bin" size="16555728" crc="1ced2972" sha1="555793915bc8af79ba7d71518d4059441337d8e6"/>
+ <rom name="Virtuacall (Japan) (Track 13).bin" size="41096496" crc="14f7bbf6" sha1="759a7f1dbeac219e14f8eded726f7ddb62216671"/>
+ <rom name="Virtuacall (Japan).cue" size="1474" crc="40f011e6" sha1="55f84e2306b9421c668983d133b0909641a337b3"/>
+ -->
+ <description>Virtuacall</description>
+ <year>1995</year>
+ <publisher>フェアリーテール (Fairytale)</publisher>
+ <info name="serial" value="IDES-032"/>
+ <info name="release" value="19950407" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A" />
+ <dataarea name="flop" size="1261568">
+ <rom name="virtuacall_disk_a.hdm" size="1261568" crc="ff512460" sha1="30b1796781f23aba0c2a77b08e87bb93ab62ea3b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="virtuacall (japan)" sha1="451868c726b1356c0168a3719151f3741603cd1f" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="vircall2">
<!--
Origin: Neo Kobe Collection
@@ -5605,21 +6290,19 @@ license:CC0
<software name="watashi">
<!--
- Origin: Neo Kobe Collection
- CCD converted to CUE with GNU ccd2cue
- <rom name="Watashi.ccd" size="770" crc="8ea97235" sha1="d3ed300a4c680ef01e204b24eb3f2a9a0bce184e"/>
- <rom name="Watashi.cue" size="69" crc="f46549be" sha1="f6163394fd4c2b25fa11c8dd697d5009fec63d39"/>
- <rom name="Watashi.img" size="31173408" crc="dd806876" sha1="a1010e9c579ad089ec68744b026bc900b20b6731"/>
- <rom name="Watashi.sub" size="1272384" crc="9d55c9fd" sha1="afc2087941a4805afbb289644f17c7ea910cbd6b"/>
+ Origin: redump.org
+ <rom name="Watashi (Japan).bin" size="31173408" crc="1b818680" sha1="ef88d60cbf3251a4236eefd37a0d54dff310904e"/>
+ <rom name="Watashi (Japan).cue" size="81" crc="34a5bba3" sha1="8546eea2176a85257c1a60bd1cdd17395fc1554a"/>
-->
<description>Watashi</description>
<year>1997</year>
<publisher>パールソフト (Pearl Soft)</publisher>
+ <info name="serial" value="EXC-005"/>
<info name="alt_title" value="私" />
<info name="release" value="19970110" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="watashi" sha1="153e530657947b803c33cdeb7d78eb17cdb894be" />
+ <disk name="watashi (japan)" sha1="0e51cfa626c8943311de2298f7c4adc00fc587ae" />
</diskarea>
</part>
</software>
@@ -5745,39 +6428,79 @@ license:CC0
<software name="yuno">
<!--
- Origin: Unknown
- <rom name="yu_no.bin" size="315581440" crc="c6f2d29b" sha1="a245fec6fb7dd0d82eec14dd9625d88e2a30d103"/>
- <rom name="yu_no.cue" size="645" crc="d375372b" sha1="0bbe382a4e1eebd5a513c84014c414b37354c4be"/>
+ Origin: redump.org
+ <rom name="Konoyo no Hate de Koi o Utau Shoujo - Yu-No (Japan) (Track 01).bin" size="56614992" crc="9c68667d" sha1="4d2300478b56f39e0104eb5485b5ea6d1e90de0a"/>
+ <rom name="Konoyo no Hate de Koi o Utau Shoujo - Yu-No (Japan) (Track 02).bin" size="31079328" crc="e11cd6a1" sha1="1759a9705518ec64fecccb108753503bffacfadd"/>
+ <rom name="Konoyo no Hate de Koi o Utau Shoujo - Yu-No (Japan) (Track 03).bin" size="24169152" crc="bcbef29b" sha1="8429132b4bc2a99ec91389df8898a44b84316a97"/>
+ <rom name="Konoyo no Hate de Koi o Utau Shoujo - Yu-No (Japan) (Track 04).bin" size="37751952" crc="84bc5d0f" sha1="b3dde99e4af465de32b2eda42f1d9dff1fd7776d"/>
+ <rom name="Konoyo no Hate de Koi o Utau Shoujo - Yu-No (Japan) (Track 05).bin" size="32017776" crc="f81f4ba4" sha1="156927c118901e5d9e883c365f0415eb81ed4d09"/>
+ <rom name="Konoyo no Hate de Koi o Utau Shoujo - Yu-No (Japan) (Track 06).bin" size="20570592" crc="99ac90a8" sha1="d58c96bb56355aade78e3d6924bd7d6ac41ac166"/>
+ <rom name="Konoyo no Hate de Koi o Utau Shoujo - Yu-No (Japan) (Track 07).bin" size="26462352" crc="1cb8584b" sha1="ebc40612226580807529453823084ce2567c6a89"/>
+ <rom name="Konoyo no Hate de Koi o Utau Shoujo - Yu-No (Japan) (Track 08).bin" size="38916192" crc="87b7aac9" sha1="9ee3d2206f53b88a8929288d3b1a76ac251a7d35"/>
+ <rom name="Konoyo no Hate de Koi o Utau Shoujo - Yu-No (Japan) (Track 09).bin" size="21692496" crc="139e335d" sha1="17f0387544681efc3b4ac67a24e9da452ee659e6"/>
+ <rom name="Konoyo no Hate de Koi o Utau Shoujo - Yu-No (Japan) (Track 10).bin" size="33976992" crc="93868d0b" sha1="7063997930fc71b6f93814c071bd3c98794cbe0d"/>
+ <rom name="Konoyo no Hate de Koi o Utau Shoujo - Yu-No (Japan).cue" size="1258" crc="bf38faba" sha1="941cdb300f68073f98d20b60cf8221a5e2994de2"/>
-->
<description>Kono Yo no Hate de Koi wo Utau Shoujo YU-NO</description>
<year>1996</year>
<publisher>エルフ (Elf)</publisher>
+ <info name="serial" value="21D-2080"/>
<info name="alt_title" value="この世の果てで恋を唄う少女 YU-NO" />
<info name="release" value="19961226" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="yu_no" sha1="3c68242c9eb1ae0d1e79549391afbc988d0ae94f" />
+ <disk name="konoyo no hate de koi o utau shoujo - yu-no (japan)" sha1="6f742ce305170ab4aa853f358346dc5f7d57e401" />
</diskarea>
</part>
</software>
- <software name="yuudisk">
+ <!--
+ Bundled with the book "CD-ROM Bishoujo Senshi Collection". Includes:
+ Cybernoid Alpha
+ Exterlien Custom
+ Crystal Rinal Otanoshimi Disc
+
+ Windows / PC-9801 / FM Towns hybrid.
+ -->
+ <software name="yuudisc">
<!--
- Origin: Neo Kobe Collection
- CCD converted to CUE with GNU ccd2cue
- <rom name="Yuu Disk Special - CD-ROM Bishoujo Collection.ccd" size="5373" crc="de9649c9" sha1="bbe34c70fe69ca4161b80ff96bb22acdd1ef4dab"/>
- <rom name="Yuu Disk Special - CD-ROM Bishoujo Collection.cue" size="1057" crc="a6480a35" sha1="4cb5d5c76856c84311fd80701e0c20252a0ec747"/>
- <rom name="Yuu Disk Special - CD-ROM Bishoujo Collection.img" size="449300208" crc="78603df8" sha1="bd6365d50398d49fb57fb6a4ae4719a55ffbfa86"/>
- <rom name="Yuu Disk Special - CD-ROM Bishoujo Collection.sub" size="18338784" crc="29bf9e2d" sha1="aedf918cbf396dd6caa9f544acf61921c1280184"/>
- -->
- <description>Yuu Disk Special - CD-ROM Bishoujo Collection</description>
+ Origin: redump.org
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 01).bin" size="46849488" crc="c1dea552" sha1="d9305e545cc2d28ec71d4317af3f0bd1726d8ab1"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 02).bin" size="17458896" crc="5a2ce11b" sha1="50001f2a6c90ce9b7b58dc18adc6d97c738e95d3"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 03).bin" size="17181360" crc="59bcaaf8" sha1="3857cb37b0976e7e042ac0780fd211b131e8bb97"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 04).bin" size="12475008" crc="b0bb1501" sha1="7bb3d52c5b043172c0a335d906e9b72e8e9e1031"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 05).bin" size="18917136" crc="b75e9917" sha1="43d3dd874f520a2ad95e07da1a6bb76ff9f30863"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 06).bin" size="20351856" crc="90dafa16" sha1="a56bb542c7129c2881e440432f4217c7f1801c26"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 07).bin" size="17004960" crc="7dbda323" sha1="6316f0b4b6bf2184da12453cdb5ed3c87df4ccef"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 08).bin" size="16148832" crc="b938b866" sha1="9443dc1f7db134453dab5a291f3b3e0ef4d19c38"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 09).bin" size="15974784" crc="25c7ea9d" sha1="20373281b5bfc89334ca1073f55fd3301d881763"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 10).bin" size="15111600" crc="f6db5bdb" sha1="1e05255495b06cf3f10f14dd173669afddb9aaeb"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 11).bin" size="14563584" crc="be1d7e07" sha1="36559a1c84b05c06e307c98028235c2a4d743d85"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 12).bin" size="20735232" crc="4d2e702c" sha1="77bcda85c2c508de9820a7911411710969f0bae3"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 13).bin" size="15017520" crc="9b4caa44" sha1="884f8f1cea1c99e0f0286a18bbd323556cbdf3d3"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 14).bin" size="18315024" crc="bcf2f7c8" sha1="7f6ed0c9c340e06c7593c14154f51e5593323a64"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 15).bin" size="15861888" crc="2dc8078e" sha1="683284977863345b9871dd7c2a82522afc8d3ad4"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 16).bin" size="15857184" crc="a3f36f72" sha1="8732e7523e48503b7556335866e1b97d59f9d913"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 17).bin" size="14330736" crc="a09173e7" sha1="1977677c4c1e6788d95fd1be284d6fc36a03c090"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 18).bin" size="19239360" crc="72b43578" sha1="ec16e957dae98c7046e14dbbffbfcfde86298388"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 19).bin" size="14711760" crc="b0f6cd9a" sha1="a3012b82271c37778c8c24b0496f13a34c5e2c96"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 20).bin" size="17141376" crc="ea55a5b9" sha1="c3c460f45e0cd51c65a68cbae61b3f6928b731a4"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 21).bin" size="13549872" crc="8555c27d" sha1="d25ffc3671489916867d9a4034cd757e5ab57fab"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 22).bin" size="18277392" crc="d22dbeb2" sha1="73296eb28205bf72e13253f1eaf5266859f302c3"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 23).bin" size="19481616" crc="61757b43" sha1="26c32fd9caa83d3bd3169be998ceb307d2477823"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 24).bin" size="15353856" crc="185178ff" sha1="86baf111632b5c3ec7dbb2215cf08b5bc5001a62"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan) (Track 25).bin" size="19389888" crc="bc2a3bac" sha1="33639d313fea6362717197a42c0b4c62afbf78a6"/>
+ <rom name="CD-ROM Bishoujo Senshi Collection - Yuu Disc Special (Japan).cue" size="3328" crc="5e5173ce" sha1="624a5d26a346867139a682d94c8b0a66b853a6e0"/>
+ -->
+ <description>CD-ROM Bishoujo Senshi Collection - Yuu Disc Special</description>
<year>1996</year>
<publisher>ディー・オー (D.O.)</publisher>
- <info name="alt_title" value="遊ディスクスペシャル CD-ROM美少女コレクション" />
+ <info name="serial" value="MCD-008"/>
+ <info name="alt_title" value="CD‐ROM美少女戦士コレクション ~遊ディスクスペシャル~" />
<info name="release" value="199604xx" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="yuu disk special - cd-rom bishoujo collection" sha1="ca1f0985b942c00359b72f84c1f45b06df6407e1" />
+ <disk name="cd-rom bishoujo senshi collection - yuu disc special (japan)" sha1="6d278f5fe3416d01882dee43c7ccb4c3d706c229" />
</diskarea>
</part>
</software>
diff --git a/hash/pico.xml b/hash/pico.xml
index b5dac0c391b..6e2a035daf2 100644
--- a/hash/pico.xml
+++ b/hash/pico.xml
@@ -6341,15 +6341,15 @@ But how do later protos fit with this theory? Maybe the later protos were from t
<!--
-Remaining hoarded / unavailable dumps
+Remaining hoarded / unavailable dumps as detailed in GoodPico v3.15
<software name="hellokmd">
<description>Hello Kitty to McDonald de Asobo! (Jpn)</description>
<year>199?</year>
<publisher>Sega?</publisher>
<part name="cart" interface="pico_cart">
- <dataarea name="rom" size="????">
- <rom name="Hello Kitty to McDonald de Asobo (J) [!p].bin" size="????" crc="d81acb46" sha1="e4a51f8894157dc8ef845931366d2ab482d43839" offset="000000" loadflag="load16_word_swap" />
+ <dataarea name="rom" size="2097152">
+ <rom name="Hello Kitty to McDonald de Asobo (J) [!p].bin" size="2097152" crc="d81acb46" sha1="e4a51f8894157dc8ef845931366d2ab482d43839" offset="000000" loadflag="load16_word_swap" />
</dataarea>
</part>
</software>
@@ -6359,8 +6359,8 @@ Remaining hoarded / unavailable dumps
<year>199?</year>
<publisher>Sega?</publisher>
<part name="cart" interface="pico_cart">
- <dataarea name="rom" size="????">
- <rom name="Richard Scarry's - Huckle and Lowly's Busiest Day Ever (F) [!p].bin" size="????" crc="126ca6f0" sha1="1e2898a56cf47576e68db772639c23a7efcaf026" offset="000000" loadflag="load16_word_swap" />
+ <dataarea name="rom" size="1048576">
+ <rom name="Richard Scarry's - Huckle and Lowly's Busiest Day Ever (F) [!p].bin" size="1048576" crc="126ca6f0" sha1="1e2898a56cf47576e68db772639c23a7efcaf026" offset="000000" loadflag="load16_word_swap" />
</dataarea>
</part>
</software>
@@ -6370,8 +6370,8 @@ Remaining hoarded / unavailable dumps
<year>199?</year>
<publisher>Sega?</publisher>
<part name="cart" interface="pico_cart">
- <dataarea name="rom" size="????">
- <rom name="Sanou Kaihatsu Series 1 - Atama ga Yoku Naru - Zukei Ninshiki (J) [!p].bin" size="????" crc="e81acb46" sha1="f4a51f8894157dc8ef845931366d2ab482d43839" offset="000000" loadflag="load16_word_swap" />
+ <dataarea name="rom" size="524288">
+ <rom name="Sanou Kaihatsu Series 1 - Atama ga Yoku Naru - Zukei Ninshiki (J) [!p].bin" size="524288" crc="e81acb46" sha1="f4a51f8894157dc8ef845931366d2ab482d43839" offset="000000" loadflag="load16_word_swap" />
</dataarea>
</part>
</software>
@@ -6381,8 +6381,8 @@ Remaining hoarded / unavailable dumps
<year>199?</year>
<publisher>Sega?</publisher>
<part name="cart" interface="pico_cart">
- <dataarea name="rom" size="????">
- <rom name="Sanou Kaihatsu Series 4 - Atama ga Yoku Naru - Suiri - Kousei (J) [!p].bin" size="????" crc="f81acb46" sha1="04a51f8894157dc8ef845931366d2ab482d43839" offset="000000" loadflag="load16_word_swap" />
+ <dataarea name="rom" size="524288">
+ <rom name="Sanou Kaihatsu Series 4 - Atama ga Yoku Naru - Suiri - Kousei (J) [!p].bin" size="524288" crc="f81acb46" sha1="04a51f8894157dc8ef845931366d2ab482d43839" offset="000000" loadflag="load16_word_swap" />
</dataarea>
</part>
</software>
diff --git a/hash/saturn.xml b/hash/saturn.xml
index 06d41a18f76..6c41de53d40 100644
--- a/hash/saturn.xml
+++ b/hash/saturn.xml
@@ -23466,7 +23466,7 @@ Olympic Soccer (Fra) T-7904H-09
<!-- Identifying Isto E Zico - Zico no Kangaeru Soccer (T-18802G)... -->
<software name="zico" supported="no">
- <description>Isto E Zico - Zico no Kangaeru Soccer (Jpn)</description>
+ <description>Isto é Zico - Zico no Kangaeru Soccer (Jpn)</description>
<year>1996</year>
<publisher>Mizuki</publisher>
<info name="serial" value="T-18802G"/>
diff --git a/hash/snes.xml b/hash/snes.xml
index 5fd3ec42441..5bda5ad2037 100644
--- a/hash/snes.xml
+++ b/hash/snes.xml
@@ -385,8 +385,8 @@ Beyond that last category are the roms waiting to be classified.
<feature name="cart_back_label" value="920214" />
<dataarea name="rom" size="1572864">
<rom name="dai-3-ji super robot taisen (japan) (rev 3).sfc" size="1572864" crc="C2941881" offset="0x000000" />
- <rom name="shvc-rt-3 p0.u1" size="1048576" crc="" sha1="" offset="0x000000" />
- <rom name="shvc-rt-3 p1.u2" size="524288" crc="" sha1="" offset="0x100000" />
+ <rom name="shvc-rt-3 p0.u1" size="1048576" crc="" sha1="" offset="0x000000" status="nodump" />
+ <rom name="shvc-rt-3 p1.u2" size="524288" crc="" sha1="" offset="0x100000" status="nodump" />
</dataarea>
<dataarea name="nvram" size="8192">
</dataarea>
@@ -699,8 +699,8 @@ Beyond that last category are the roms waiting to be classified.
<feature name="battery" value="BATT CR2032" />
<feature name="cart_model" value="no shell" />
<dataarea name="rom" size="1048576">
- <rom name="bio-metal 7-16 0.u1" size="524288" crc="" sha1="" offset="0x000000" />
- <rom name="bio-metal 7-16 1.u2" size="524288" crc="" sha1="" offset="0x080000" />
+ <rom name="bio-metal 7-16 0.u1" size="524288" crc="" sha1="" offset="0x000000" status="nodump" />
+ <rom name="bio-metal 7-16 1.u2" size="524288" crc="" sha1="" offset="0x080000" status="nodump" />
</dataarea>
<dataarea name="nvram" size="8192">
</dataarea>
@@ -721,7 +721,7 @@ Beyond that last category are the roms waiting to be classified.
<feature name="lockout" value="" />
<feature name="cart_model" value="no shell" />
<dataarea name="rom" size="524288">
- <rom name="brainy v0.0 5-22-93 ce76.u1" size="524288" crc="" sha1="" offset="0x000000" />
+ <rom name="brainy v0.0 5-22-93 ce76.u1" size="524288" crc="" sha1="" offset="0x000000" status="nodump" />
</dataarea>
</part>
</software>
@@ -912,10 +912,10 @@ Beyond that last category are the roms waiting to be classified.
<feature name="battery" value="BATT CR2032" />
<feature name="cart_model" value="SHVC-006" />
<dataarea name="rom" size="2097152">
- <rom name="u1" size="524288" crc="" sha1="" offset="0x000000" />
- <rom name="u2" size="524288" crc="" sha1="" offset="0x080000" />
- <rom name="u3" size="524288" crc="" sha1="" offset="0x100000" />
- <rom name="u4" size="524288" crc="" sha1="" offset="0x180000" />
+ <rom name="u1" size="524288" crc="" sha1="" offset="0x000000" status="nodump" />
+ <rom name="u2" size="524288" crc="" sha1="" offset="0x080000" status="nodump" />
+ <rom name="u3" size="524288" crc="" sha1="" offset="0x100000" status="nodump" />
+ <rom name="u4" size="524288" crc="" sha1="" offset="0x180000" status="nodump" />
</dataarea>
<dataarea name="nvram" size="8192">
</dataarea>
@@ -1112,12 +1112,12 @@ Beyond that last category are the roms waiting to be classified.
<dataarea name="rom" size="3145728">
<rom name="earthbound (prototype 19950327).sfc" size="3145728" crc="d3fa35aa" sha1="0686c4d339657489890e43fd39797c893cb992e9" offset="0x000000" />
<!-- released as binary blob above, these are the eventual label/socket names
- <rom name="earth bound 3-27-95 e.7 e 0.u1" size="524288" crc="" sha1="" offset="0x000000" />
- <rom name="earth bound 3-27-95 e.7 e 1.u2" size="524288" crc="" sha1="" offset="0x080000" />
- <rom name="earth bound 3-27-95 e.7 e 2.u3" size="524288" crc="" sha1="" offset="0x100000" />
- <rom name="earth bound 3-27-95 e.7 e 3.u4" size="524288" crc="" sha1="" offset="0x180000" />
- <rom name="earth bound 3-27-95 e.7 e 4.u5" size="524288" crc="" sha1="" offset="0x200000" />
- <rom name="earth bound 3-27-95 e.7 e 5.u6" size="524288" crc="" sha1="" offset="0x280000" />
+ <rom name="earth bound 3-27-95 e.7 e 0.u1" size="524288" crc="ea6e34d3" sha1="f1adacaa247dd78f7509ac630fb3890d2ccd562b" offset="0x000000" />
+ <rom name="earth bound 3-27-95 e.7 e 1.u2" size="524288" crc="caf42319" sha1="89a26789e5673b35295bcf2abaa6ae1619f6513a" offset="0x080000" />
+ <rom name="earth bound 3-27-95 e.7 e 2.u3" size="524288" crc="5f01f45c" sha1="7f40e9d00c64d7692a52bce00bc6750c8f545d82" offset="0x100000" />
+ <rom name="earth bound 3-27-95 e.7 e 3.u4" size="524288" crc="6d0a7e82" sha1="2208ab837d6ab3fcfd9381af11cefac8fb024381" offset="0x180000" />
+ <rom name="earth bound 3-27-95 e.7 e 4.u5" size="524288" crc="9775520f" sha1="40b6e1f22836ebc0672e24d2963b78466856c518" offset="0x200000" />
+ <rom name="earth bound 3-27-95 e.7 e 5.u6" size="524288" crc="ecb9cf89" sha1="d62d917e373ab50dc3ced5d3d721d37995cbfd6b" offset="0x280000" />
-->
</dataarea>
<dataarea name="nvram" size="65536">
@@ -1703,10 +1703,10 @@ Beyond that last category are the roms waiting to be classified.
<feature name="battery" value="BATT CR2032" />
<feature name="cart_model" value="no shell" />
<dataarea name="rom" size="2097152">
- <rom name="u1" size="524288" crc="" sha1="" offset="0x000000" />
- <rom name="u2" size="524288" crc="" sha1="" offset="0x080000" />
- <rom name="jammit u3 0301 1.u3" size="524288" crc="" sha1="" offset="0x100000" />
- <rom name="u4" size="524288" crc="" sha1="" offset="0x180000" />
+ <rom name="u1" size="524288" crc="" sha1="" offset="0x000000" status="nodump" />
+ <rom name="u2" size="524288" crc="" sha1="" offset="0x080000" status="nodump" />
+ <rom name="jammit u3 0301 1.u3" size="524288" crc="" sha1="" offset="0x100000" status="nodump" />
+ <rom name="u4" size="524288" crc="" sha1="" offset="0x180000" status="nodump" />
</dataarea>
</part>
</software>
@@ -1951,8 +1951,8 @@ Beyond that last category are the roms waiting to be classified.
<feature name="battery" value="BATT CR2032" />
<feature name="cart_model" value="no shell" />
<dataarea name="rom" size="1048576">
- <rom name="mpso-0.bin snes mickey's ultimate challenge 11-3-93 lo.u1" size="524288" crc="" sha1="" offset="0x000000" />
- <rom name="mpso-0.bin snes mickey's ultimate challenge 11-3-93 hi.u2" size="524288" crc="" sha1="" offset="0x080000" />
+ <rom name="mpso-0.bin snes mickey's ultimate challenge 11-3-93 lo.u1" size="524288" crc="" sha1="" offset="0x000000" status="nodump" />
+ <rom name="mpso-0.bin snes mickey's ultimate challenge 11-3-93 hi.u2" size="524288" crc="" sha1="" offset="0x080000" status="nodump" />
</dataarea>
<dataarea name="nvram" size="8192">
</dataarea>
@@ -2191,10 +2191,10 @@ Beyond that last category are the roms waiting to be classified.
<feature name="battery" value="BATT1 CR2032" />
<feature name="cart_model" value="no shell" />
<dataarea name="rom" size="2097152">
- <rom name="0.u1" size="524288" crc="" sha1="" offset="0x000000" />
- <rom name="1.u2" size="524288" crc="" sha1="" offset="0x080000" />
- <rom name="ncw 2.u3" size="524288" crc="" sha1="" offset="0x100000" />
- <rom name="3.u4" size="524288" crc="" sha1="" offset="0x180000" />
+ <rom name="0.u1" size="524288" crc="" sha1="" offset="0x000000" status="nodump" />
+ <rom name="1.u2" size="524288" crc="" sha1="" offset="0x080000" status="nodump" />
+ <rom name="ncw 2.u3" size="524288" crc="" sha1="" offset="0x100000" status="nodump" />
+ <rom name="3.u4" size="524288" crc="" sha1="" offset="0x180000" status="nodump" />
</dataarea>
</part>
</software>
@@ -2285,12 +2285,12 @@ Beyond that last category are the roms waiting to be classified.
<feature name="battery" value="BATT1 CR2032" />
<feature name="cart_model" value="no shell" />
<dataarea name="rom" size="3145728">
- <rom name="nfl 0.u1" size="524288" crc="" sha1="" offset="0x000000" />
- <rom name="u2" size="524288" crc="" sha1="" offset="0x080000" />
- <rom name="u3" size="524288" crc="" sha1="" offset="0x100000" />
- <rom name="quarterback 3.u4" size="524288" crc="" sha1="" offset="0x180000" />
- <rom name="u5" size="524288" crc="" sha1="" offset="0x200000" />
- <rom name="u6" size="524288" crc="" sha1="" offset="0x280000" />
+ <rom name="nfl 0.u1" size="524288" crc="" sha1="" offset="0x000000" status="nodump" />
+ <rom name="u2" size="524288" crc="" sha1="" offset="0x080000" status="nodump" />
+ <rom name="u3" size="524288" crc="" sha1="" offset="0x100000" status="nodump" />
+ <rom name="quarterback 3.u4" size="524288" crc="" sha1="" offset="0x180000" status="nodump" />
+ <rom name="u5" size="524288" crc="" sha1="" offset="0x200000" status="nodump" />
+ <rom name="u6" size="524288" crc="" sha1="" offset="0x280000" status="nodump" />
</dataarea>
<!- - memory capacity to be confirmed - ->
<dataarea name="nvram" size="131072">
@@ -2375,7 +2375,7 @@ Beyond that last category are the roms waiting to be classified.
<feature name="cart_back_label" value="n/a" />
<feature name="slot" value="lorom_dsp" />
<dataarea name="rom" size="524288">
- <rom name="90-10-25 nes pw" size="524288" crc="" sha1="" offset="0x000000" />
+ <rom name="90-10-25 nes pw" size="524288" crc="" sha1="" offset="0x000000" status="nodump" />
</dataarea>
<dataarea name="addon" size="10240">
<rom name="dsp1.u5" size="10240" crc="2838f9f5" sha1="0a03ccb1fd2bea91151c745a4d1f217ae784f889" offset="0x000000" />
@@ -2757,8 +2757,8 @@ Beyond that last category are the roms waiting to be classified.
<feature name="battery" value="BATT CR2032" />
<feature name="cart_model" value="no shell" />
<dataarea name="rom" size="1048576">
- <rom name="u1" size="524288" crc="" sha1="" offset="0x000000" />
- <rom name="u2" size="524288" crc="" sha1="" offset="0x080000" />
+ <rom name="u1" size="524288" crc="" sha1="" offset="0x000000" status="nodump" />
+ <rom name="u2" size="524288" crc="" sha1="" offset="0x080000" status="nodump" />
</dataarea>
<!- - memory capacity to be confirmed - ->
<dataarea name="nvram" size="131072">
@@ -2928,8 +2928,8 @@ Beyond that last category are the roms waiting to be classified.
<rom name="snsp p-cq.u1" size="1048576" crc="24935769" sha1="de21be64fde447d9c6a2f1b063d2f2e0d4034ca0" offset="0x000000" />
</dataarea>
<dataarea name="nvram" size="73728">
- <!--rom name="u2" size="65536" offset="0x000000" /-->
- <!--rom name="u3" size="8192" offset="0x010000" /-->
+ <!--rom name="u2" size="65536" crc="" sha1="" offset="0x000000" status="nodump" /-->
+ <!--rom name="u3" size="8192" crc="" sha1="" offset="0x010000" status="nodump" /-->
</dataarea>
</part>
</software>
@@ -2955,8 +2955,8 @@ Beyond that last category are the roms waiting to be classified.
<feature name="battery" value="BATT CR2032" />
<feature name="cart_model" value="no shell" />
<dataarea name="rom" size="2097152">
- <rom name="u1" size="524288" crc="" sha1="" offset="0x000000" />
- <rom name="u2" size="524288" crc="" sha1="" offset="0x080000" />
+ <rom name="u1" size="524288" crc="" sha1="" offset="0x000000" status="nodump" />
+ <rom name="u2" size="524288" crc="" sha1="" offset="0x080000" status="nodump" />
</dataarea>
</part>
</software>
@@ -3191,7 +3191,7 @@ Beyond that last category are the roms waiting to be classified.
<feature name="cart_back_label" value="n/a" />
<feature name="slot" value="hirom_dsp" />
<dataarea name="rom" size="524288">
- <rom name="kart.u1" size="524288" crc="" sha1="" offset="0x000000" />
+ <rom name="kart.u1" size="524288" crc="" sha1="" offset="0x000000" status="nodump" />
</dataarea>
<dataarea name="addon" size="10240">
<rom name="dsp1.bin" size="10240" crc="2838f9f5" sha1="0a03ccb1fd2bea91151c745a4d1f217ae784f889" offset="0x000000" />
@@ -3275,8 +3275,8 @@ Beyond that last category are the roms waiting to be classified.
<rom name="sns-p yi 3.u4" size="524288" crc="6ff20708" sha1="5858fd056c33b656367b894f77f1b112260e494d" offset="0x180000" />
</dataarea>
<dataarea name="nvram" size="139264">
- <!--rom name="u5" size="131072" offset="0x000000" /-->
- <!--rom name="u6" size="8192" offset="0x020000" /-->
+ <!--rom name="u5" size="131072" crc="" sha1="" offset="0x000000" status="nodump" /-->
+ <!--rom name="u6" size="8192" crc="" sha1="" offset="0x020000" status="nodump" /-->
</dataarea>
</part>
</software>
@@ -3323,7 +3323,7 @@ Beyond that last category are the roms waiting to be classified.
<feature name="battery" value="BATT CR2032" />
<feature name="cart_model" value="no shell" />
<dataarea name="rom" size="1048576">
- <rom name="pinball rom 0 6265h.u1" size="524288" crc="" sha1="" offset="0x000000" />
+ <rom name="pinball rom 0 6265h.u1" size="524288" crc="" sha1="" offset="0x000000" status="nodump" />
<rom name="pinball rom 1 a3c8h.u2" size="524288" crc="4bc93ff7" sha1="168ae8ab16bd9cf6a63e41ee948f29fe5f175316" offset="0x080000" />
</dataarea>
<dataarea name="nvram" size="8192">
@@ -3377,7 +3377,7 @@ Beyond that last category are the roms waiting to be classified.
<feature name="cart_model" value="no shell" />
<dataarea name="rom" size="524288">
<!- - sticker: sôkoban - ->
- <rom name="sfx super sokoban pack-in-video.u1" size="524288" crc="" sha1="" offset="0x000000" />
+ <rom name="sfx super sokoban pack-in-video.u1" size="524288" crc="" sha1="" offset="0x000000" status="nodump" />
</dataarea>
<dataarea name="nvram" size="8192">
</dataarea>
@@ -3573,7 +3573,7 @@ Beyond that last category are the roms waiting to be classified.
<feature name="battery" value="BATT CR2032" />
<feature name="cart_model" value="no shell" />
<dataarea name="rom" size="524288">
- <rom name="bandai ultra-man.u1" size="524288" crc="" sha1="" offset="0x000000" />
+ <rom name="bandai ultra-man.u1" size="524288" crc="" sha1="" offset="0x000000" status="nodump" />
</dataarea>
<dataarea name="nvram" size="8192">
</dataarea>
@@ -4239,8 +4239,8 @@ Beyond that last category are the roms waiting to be classified.
<rom name="powerslide sfx 12-4-94 rn 0010.u1" size="524288" crc="65ce3729" sha1="30115db2558060d9293684f3d5810d063a0c710e" offset="0x000000" />
</dataarea>
<dataarea name="nvram" size="73728">
- <!--rom name="u2" size="65536" offset="0x000000" /-->
- <!--rom name="u3" size="8192" offset="0x010000" /-->
+ <!--rom name="u2" size="65536" crc="" sha1="" offset="0x000000" status="nodump" /-->
+ <!--rom name="u3" size="8192" crc="" sha1="" offset="0x010000" status="nodump" /-->
</dataarea>
</part>
</software>
@@ -5447,8 +5447,8 @@ more investigation needed...
<feature name="slot" value="hirom" />
<dataarea name="rom" size="131072">
<rom name="binary" size="131072" crc="ee4fca82" sha1="839f9fbb0d84bd0d43fda3c92bb1abf3e4ec0615" offset="0x000000" status="baddump" />
- <!-- rom name="syndicat rom 0 ntsc.u1" size="524288" crc="" sha1="" offset="0x000000" /-->
- <!-- rom name="u2" size="524288" crc="" sha1="" offset="0x080000" /-->
+ <!-- rom name="syndicat rom 0 ntsc.u1" size="524288" crc="" sha1="" offset="0x000000" status="nodump" /-->
+ <!-- rom name="u2" size="524288" crc="" sha1="" offset="0x080000" status="nodump" /-->
</dataarea>
</part>
</software>
@@ -11402,7 +11402,7 @@ more investigation needed...
<feature name="cart_back_label" value="SNSP-ESP" />
<feature name="slot" value="hirom" />
<dataarea name="rom" size="4194304">
- <rom name="spal-adnd-0.u1" size="4194304" crc="" sha1="" offset="0x000000" />
+ <rom name="spal-adnd-0.u1" size="4194304" crc="" sha1="" offset="0x000000" status="nodump" />
</dataarea>
<dataarea name="nvram" size="2048">
</dataarea>
@@ -40128,8 +40128,8 @@ List of unclassified roms
<dataarea name="rom" size="3145728">
<!--dataarea name="rom" size="4194304"-->
<rom name="fire emblem - monshou no nazo (japan) (rev 1).sfc" size="3145728" crc="a427b7e6" sha1="b0b03831d9104e3c5df551d50ebc275a1692149e" offset="0x000000" />
- <!--rom name="u3" size="2097152" crc="" sha1="" offset="0x000000" /-->
- <!--rom name="u4" size="2097152" crc="" sha1="" offset="0x200000" /-->
+ <!--rom name="u3" size="2097152" crc="" sha1="" offset="0x000000" status="nodump" /-->
+ <!--rom name="u4" size="2097152" crc="" sha1="" offset="0x200000" status="nodump" /-->
</dataarea>
<dataarea name="nvram" size="8192">
<!--dataarea name="sram" size="32768"-->
@@ -53056,8 +53056,8 @@ to ensure nothing has been touched in the Retro Quest cart production in 2013/20
<feature name="cart_back_label" value="SNSP-UKV" />
<feature name="slot" value="hirom" />
<dataarea name="rom" size="4194304">
- <rom name="spal-r2-0 p0.u1" size="" crc="" sha1="" offset="0x000000" />
- <rom name="spal-r2-0 p1.u1" size="" crc="" sha1="" offset="0x200000" />
+ <rom name="spal-r2-0 p0.u1" size="" crc="" sha1="" offset="0x000000" status="nodump" />
+ <rom name="spal-r2-0 p1.u1" size="" crc="" sha1="" offset="0x200000" status="nodump" />
</dataarea>
<dataarea name="nvram" size="2048">
</dataarea>
@@ -58167,8 +58167,8 @@ to ensure nothing has been touched in the Retro Quest cart production in 2013/20
<feature name="slot" value="hirom" />
<dataarea name="rom" size="4194304">
<rom name="super fire pro wrestling x premium (japan).sfc" size="4194304" crc="82de1380" sha1="1d3b397ce08f88b6787df63d1914bdaeb2c3999c" offset="0x000000" />
- <!--rom name="u3" size="2097152" crc="" sha1="" offset="0x000000" /-->
- <!--rom name="u4" size="2097152" crc="" sha1="" offset="0x200000" /-->
+ <!--rom name="u3" size="2097152" crc="" sha1="" offset="0x000000" status="nodump" /-->
+ <!--rom name="u4" size="2097152" crc="" sha1="" offset="0x200000" status="nodump" /-->
</dataarea>
<dataarea name="nvram" size="32768">
</dataarea>
diff --git a/hash/specpls3_flop.xml b/hash/specpls3_flop.xml
index d500f11ae9d..1eef473cd0d 100644
--- a/hash/specpls3_flop.xml
+++ b/hash/specpls3_flop.xml
@@ -11,6 +11,7 @@ license:CC0
<!--
SPS / CAPS Releases
+ http://www.softpres.org/_media/files:datafiles.zip?id=download&cache=cache
Known missing IPF dumps:
3585 LED Storm: Lazer Enhanced Destruction
diff --git a/hash/spectrum_cass.xml b/hash/spectrum_cass.xml
index b3f88b24dbc..46e8bc8d74b 100644
--- a/hash/spectrum_cass.xml
+++ b/hash/spectrum_cass.xml
@@ -1195,7 +1195,7 @@ license:CC0
<!-- 128k and 48k versions were separate releases -->
<software name="arcyeso">
- <description>The Arc Of Yesod (128k release)</description>
+ <description>The Arc of Yesod (128k release)</description>
<year>1985</year>
<publisher>Thor Computer</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -1206,7 +1206,7 @@ license:CC0
</software>
<software name="arcyeso48" cloneof="arcyeso">
- <description>The Arc Of Yesod (48k release)</description>
+ <description>The Arc of Yesod (48k release)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass2" interface="spectrum_cass">
@@ -1827,7 +1827,7 @@ license:CC0
</software>
<software name="shipdoom">
- <description>Adventure C: The Ship Of Doom (set 1)</description>
+ <description>Adventure C: The Ship of Doom (set 1)</description>
<year>1982</year>
<publisher>Artic Computing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -1838,7 +1838,7 @@ license:CC0
</software>
<software name="shipdooma" cloneof="shipdoom">
- <description>Adventure C: The Ship Of Doom (set 2, Sinclair)</description>
+ <description>Adventure C: The Ship of Doom (set 2, Sinclair)</description>
<year>1982</year>
<publisher>Artic Computing / Sinclair</publisher>
<part name="cass" interface="spectrum_cass">
@@ -1904,7 +1904,7 @@ license:CC0
</software>
<software name="eyebain">
- <description>Adventure F: The Eye Of Bain (set 1)</description>
+ <description>Adventure F: The Eye of Bain (set 1)</description>
<year>1984</year>
<publisher>Artic Computing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -1915,7 +1915,7 @@ license:CC0
</software>
<software name="eyebaina" cloneof="eyebain">
- <description>Adventure F: The Eye Of Bain (set 2)</description>
+ <description>Adventure F: The Eye of Bain (set 2)</description>
<year>1984</year>
<publisher>Artic Computing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -3500,7 +3500,7 @@ license:CC0
</software>
<software name="bridfrnk">
- <description>Bride Of Frankenstein</description>
+ <description>Bride of Frankenstein</description>
<year>1987</year>
<publisher>39 Steps</publisher>
<part name="cass" interface="spectrum_cass">
@@ -4045,7 +4045,7 @@ license:CC0
</software>
<software name="btlbrtms">
- <description>Battle of Britain (1983) (set 1, Microgame Simulations)</description>
+ <description>Battle of Britain (Microgame Simulations)</description>
<year>1983</year>
<publisher>Microgame Simulations</publisher>
<part name="cass" interface="spectrum_cass">
@@ -4055,30 +4055,30 @@ license:CC0
</part>
</software>
- <software name="btlbrtmsa" cloneof="btlbrtms">
- <description>Battle of Britain (1983) (set 2, Maincomp)</description>
- <year>1983</year>
- <publisher>Maincomp</publisher>
+ <software name="btlbrtmsk" cloneof="btlbrtms">
+ <description>Battle of Britain (K'Soft)</description>
+ <year>1986</year>
+ <publisher>K'Soft</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="25924">
- <rom name="battle of britain (maincomp).tzx" size="25924" crc="cae4bbf4" sha1="d4237753d0404f40f723bf417de1050e97c2b419"/>
+ <dataarea name="cass" size="26143">
+ <rom name="battle of britain (k_soft).tzx" size="26143" crc="b32f5422" sha1="07936d7bb63583a8acdc0d2d0d86e9931021c1cc"/>
</dataarea>
</part>
</software>
- <software name="btlbrtmsk" cloneof="btlbrtms">
- <description>Battle of Britain (1983) (set 3, K'Soft)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="batlbrit">
+ <description>Battle of Britain (Maincomp)</description>
+ <year>1983</year>
+ <publisher>Maincomp</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="26143">
- <rom name="battle of britain (k_soft).tzx" size="26143" crc="b32f5422" sha1="07936d7bb63583a8acdc0d2d0d86e9931021c1cc"/>
+ <dataarea name="cass" size="25924">
+ <rom name="battle of britain (maincomp).tzx" size="25924" crc="cae4bbf4" sha1="d4237753d0404f40f723bf417de1050e97c2b419"/>
</dataarea>
</part>
</software>
<software name="btlbrit">
- <description>Battle of Britain (1986) (set 1, PSS)</description>
+ <description>Battle of Britain (PSS)</description>
<year>1986</year>
<publisher>PSS</publisher>
<part name="cass" interface="spectrum_cass">
@@ -4089,9 +4089,9 @@ license:CC0
</software>
<software name="btlbritc" cloneof="btlbrit">
- <description>Battle of Britain (1986) (set 2, Classic Conflicts)</description>
+ <description>Battle of Britain (Classic Conflicts)</description>
<year>1987</year>
- <publisher>PSS / Classic Confilcts</publisher>
+ <publisher>Classic Conflicts</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="47134">
<rom name="battle of britain - classic conflicts (pss).tzx" size="47134" crc="a1fd74e1" sha1="ba238f46319e9dbc153fc654fc2324e74c558c8a"/>
@@ -5800,7 +5800,7 @@ license:CC0
</software>
<software name="cavedoom">
- <description>The Caves Of Doom</description>
+ <description>The Caves of Doom</description>
<year>1985</year>
<publisher>Mastertronic</publisher>
<part name="cass" interface="spectrum_cass">
@@ -5811,7 +5811,7 @@ license:CC0
</software>
<software name="iaintgot"> <!-- released as an original game -->
- <description>I Aint Got Nobody (The Caves Of Doom hack)</description>
+ <description>I Aint Got Nobody (The Caves of Doom hack)</description>
<year>19??</year>
<publisher>Tynesoft</publisher>
<part name="cass" interface="spectrum_cass">
@@ -6975,7 +6975,7 @@ license:CC0
</software>
<software name="dizzy6">
- <description>Dizzy VI - Prince Of The Yolkfolk (set 1)</description>
+ <description>Dizzy VI - Prince of the Yolkfolk (set 1)</description>
<year>1991</year>
<publisher>Code Masters</publisher>
<part name="cass" interface="spectrum_cass">
@@ -6986,7 +6986,7 @@ license:CC0
</software>
<software name="dizzy6a" cloneof="dizzy6">
- <description>Dizzy VI - Prince Of The Yolkfolk (set 2)</description>
+ <description>Dizzy VI - Prince of the Yolkfolk (set 2)</description>
<year>1991</year>
<publisher>Code Masters</publisher>
<part name="cass" interface="spectrum_cass">
@@ -8773,9 +8773,9 @@ license:CC0
</software>
<software name="egghead4">
- <description>Egghead 4 - Egghead Entertains</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>Egghead 4: Egghead Entertains</description>
+ <year>2006</year>
+ <publisher>Cronosoft</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="47490">
<rom name="egghead 4 - egghead entertains.tzx" size="47490" crc="175e1750" sha1="4461b2846387dbddd1789c44e714dd010db9a471"/>
@@ -8784,9 +8784,9 @@ license:CC0
</software>
<software name="egghead5">
- <description>Egghead 5 - Egghead Round The Med</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>Egghead 5: Egghead Round The Med</description>
+ <year>2007</year>
+ <publisher>Cronosoft</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="64292">
<rom name="egghead 5 - egghead round the med.tzx" size="64292" crc="10bf5bf6" sha1="1c26ffad46fd89dccc6d7e8a1ed1a5736c81714f"/>
@@ -8795,9 +8795,9 @@ license:CC0
</software>
<software name="egghead3">
- <description>Egghead In Space</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>Egghead in Space</description>
+ <year>2006</year>
+ <publisher>Cronosoft</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="48260">
<rom name="egghead in space.tzx" size="48260" crc="d42a92a3" sha1="6dd8dcab4aee67f1f69373d3444f13986f2dca60"/>
@@ -10278,7 +10278,7 @@ license:CC0
<!-- NC128 -->
<software name="ghosthun">
<description>Ghost Hunters</description>
- <year>19??</year>
+ <year>1987</year>
<publisher>Code Masters</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="49225">
@@ -12412,7 +12412,7 @@ license:CC0
<!-- LOAD "" CODE -->
<software name="hallthng">
- <description>Halls Of The Things (set 1, clam case)</description>
+ <description>Halls of the Things (set 1, clam case)</description>
<year>1983</year>
<publisher>Crystal Computing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -12424,7 +12424,7 @@ license:CC0
<!-- LOAD "" CODE --> <!-- loader name is Fruit Cake? -->
<software name="hallthngd" cloneof="hallthng">
- <description>Halls Of The Things (set 2, Design Design)</description>
+ <description>Halls of the Things (set 2, Design Design)</description>
<year>1983</year>
<publisher>Crystal Computing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -12435,7 +12435,7 @@ license:CC0
</software>
<software name="hallthngf" cloneof="hallthng">
- <description>Halls Of The Things (set 3, Firebird)</description>
+ <description>Halls of the Things (set 3, Firebird)</description>
<year>1983</year>
<publisher>Crystal Computing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -12447,7 +12447,7 @@ license:CC0
<!-- LOAD "" CODE --> <!-- loader name is Fruit Cake? -->
<software name="hallthngh" cloneof="hallthng">
- <description>Halls Of The Things (set 4)</description>
+ <description>Halls of the Things (set 4)</description>
<year>1983</year>
<publisher>Crystal Computing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -12859,29 +12859,29 @@ license:CC0
</software>
<software name="horctowr">
- <description>Horace Goes To The Tower (The Mojon Twins) (set 1)</description>
+ <description>Horace Goes To The Tower (TZX tape image)</description>
<year>2011</year>
<publisher>The Mojon Twins</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="38823">
- <rom name="mojon-twins--horace-goes-to-the-tower.tap" size="38823" crc="37043cb1" sha1="fa9669ab501362e4eb01fd738c7e80a003ca8391"/>
+ <dataarea name="cass" size="38851">
+ <rom name="horace goes to the tower.tzx" size="38851" crc="d0e75870" sha1="1cb241c901d6cead23edc71757cd838be92820d3"/>
</dataarea>
</part>
</software>
<software name="horctowra" cloneof="horctowr">
- <description>Horace Goes To The Tower (The Mojon Twins) (set 2)</description>
+ <description>Horace Goes To The Tower (TAP tape image)</description>
<year>2011</year>
<publisher>The Mojon Twins</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="38851">
- <rom name="horace goes to the tower.tzx" size="38851" crc="d0e75870" sha1="1cb241c901d6cead23edc71757cd838be92820d3"/>
+ <dataarea name="cass" size="38823">
+ <rom name="mojon-twins--horace-goes-to-the-tower.tap" size="38823" crc="37043cb1" sha1="fa9669ab501362e4eb01fd738c7e80a003ca8391"/>
</dataarea>
</part>
</software>
<software name="hobvahka">
- <description>The Hobbit (Vah-ka's Cut) (set 1, English)</description>
+ <description>The Hobbit (Vah-ka's Cut) (English, TZX tape image)</description>
<year>2013</year>
<publisher>The Mojon Twins</publisher>
<part name="cass" interface="spectrum_cass">
@@ -12892,7 +12892,7 @@ license:CC0
</software>
<software name="hobvahkaa" cloneof="hobvahka">
- <description>The Hobbit (Vah-ka's Cut) (set 2, English)</description>
+ <description>The Hobbit (Vah-ka's Cut) (English, TAP tape image)</description>
<year>2013</year>
<publisher>The Mojon Twins</publisher>
<part name="cass" interface="spectrum_cass">
@@ -12903,7 +12903,7 @@ license:CC0
</software>
<software name="hobvahkas" cloneof="hobvahka">
- <description>El Hobbit (Vah-ka's Cut) (set 1, Spanish)</description>
+ <description>El Hobbit (Vah-ka's Cut) (Spanish, TZX tape image)</description>
<year>2013</year>
<publisher>The Mojon Twins</publisher>
<part name="cass" interface="spectrum_cass">
@@ -12914,7 +12914,7 @@ license:CC0
</software>
<software name="hobvahkasa" cloneof="hobvahka">
- <description>El Hobbit (Vah-ka's Cut) (set 2, Spanish)</description>
+ <description>El Hobbit (Vah-ka's Cut) (Spanish, TAP tape image)</description>
<year>2013</year>
<publisher>The Mojon Twins</publisher>
<part name="cass" interface="spectrum_cass">
@@ -14147,7 +14147,7 @@ license:CC0
</software>
<software name="jlyjane">
- <description>The Adventures Of Jane Jelly - The Treasure Of Zedin (set 1, Bumfun)</description>
+ <description>The Adventures of Jane Jelly - The Treasure of Zedin (set 1, Bumfun)</description>
<year>2017</year>
<publisher>Jaime Grilo / Bumfun Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -14158,7 +14158,7 @@ license:CC0
</software>
<software name="jlyjanea" cloneof="jlyjane">
- <description>The Adventures Of Jane Jelly - The Treasure Of Zedin (set 2, older)</description>
+ <description>The Adventures of Jane Jelly - The Treasure of Zedin (set 2, older)</description>
<year>2017</year>
<publisher>Jaime Grilo</publisher>
<part name="cass" interface="spectrum_cass">
@@ -14169,7 +14169,7 @@ license:CC0
</software>
<software name="jlyjaneb" cloneof="jlyjane">
- <description>The Adventures Of Jane Jelly - The Treasure Of Zedin (set 3, turbo loader, with trainer)</description>
+ <description>The Adventures of Jane Jelly - The Treasure of Zedin (set 3, turbo loader, with trainer)</description>
<year>2017</year>
<publisher>hack</publisher>
<part name="cass" interface="spectrum_cass">
@@ -14180,7 +14180,7 @@ license:CC0
</software>
<software name="jlyjanen">
- <description>The Adventures Of Jane Jelly - The Treasure Of Zedin - Nightmare Version (set 1, Bumfun)</description>
+ <description>The Adventures of Jane Jelly - The Treasure of Zedin - Nightmare Version (set 1, Bumfun)</description>
<year>2017</year>
<publisher>Jaime Grilo / Bumfun Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -14191,7 +14191,7 @@ license:CC0
</software>
<software name="jlyjanena" cloneof="jlyjanen">
- <description>The Adventures Of Jane Jelly - The Treasure Of Zedin - Nightmare Version (set 2, older)</description>
+ <description>The Adventures of Jane Jelly - The Treasure of Zedin - Nightmare Version (set 2, older)</description>
<year>2017</year>
<publisher>Jaime Grilo</publisher>
<part name="cass" interface="spectrum_cass">
@@ -14202,7 +14202,7 @@ license:CC0
</software>
<software name="jlyjanenb" cloneof="jlyjanen">
- <description>The Adventures Of Jane Jelly - The Treasure Of Zedin - Nightmare Version (set 3, turbo loader, with trainer)</description>
+ <description>The Adventures of Jane Jelly - The Treasure of Zedin - Nightmare Version (set 3, turbo loader, with trainer)</description>
<year>2017</year>
<publisher>hack</publisher>
<part name="cass" interface="spectrum_cass">
@@ -14213,7 +14213,7 @@ license:CC0
</software>
<software name="jlyjane2">
- <description>The Adventures Of Jane Jelly - The Treasure Of Hotmarmalade (set 1, Bumfun)</description>
+ <description>The Adventures of Jane Jelly - The Treasure of Hotmarmalade (set 1, Bumfun)</description>
<year>2017</year>
<publisher>Jaime Grilo / Bumfun Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -14229,7 +14229,7 @@ license:CC0
</software>
<software name="jlyjane2a" cloneof="jlyjane2">
- <description>The Adventures Of Jane Jelly - The Treasure Of Hotmarmalade (set 2)</description>
+ <description>The Adventures of Jane Jelly - The Treasure of Hotmarmalade (set 2)</description>
<year>2017</year>
<publisher>Jaime Grilo</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -14245,7 +14245,7 @@ license:CC0
</software>
<software name="jlyjane2b" cloneof="jlyjane2">
- <description>The Adventures Of Jane Jelly - The Treasure Of Hotmarmalade (set 3, turbo loader, with trainer)</description>
+ <description>The Adventures of Jane Jelly - The Treasure of Hotmarmalade (set 3, turbo loader, with trainer)</description>
<year>2017</year>
<publisher>hack</publisher>
<part name="cass" interface="spectrum_cass">
@@ -14257,7 +14257,7 @@ license:CC0
<software name="jlyjane3">
- <description>The Adventures Of Jane Jelly - The Egg Diamond (set 1)</description>
+ <description>The Adventures of Jane Jelly - The Egg Diamond (set 1)</description>
<year>2018</year>
<publisher>Jaime Grilo / Bumfun Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -14268,7 +14268,7 @@ license:CC0
</software>
<software name="jlyjane3a" cloneof="jlyjane3">
- <description>The Adventures Of Jane Jelly - The Egg Diamond (set 2, turbo loader, with trainer)</description>
+ <description>The Adventures of Jane Jelly - The Egg Diamond (set 2, turbo loader, with trainer)</description>
<year>2018</year>
<publisher>hack</publisher>
<part name="cass" interface="spectrum_cass">
@@ -15229,7 +15229,7 @@ license:CC0
<software name="lifeline">
<description>Lifeline</description>
<year>1984</year>
- <publisher>MC Lothlorien Ltd</publisher>
+ <publisher>MC Lothlorien</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="48550">
<rom name="lifeline.tzx" size="48550" crc="3c029e80" sha1="3b085885ccee6489daad4e2412208251e10467e5"/>
@@ -15280,7 +15280,7 @@ license:CC0
representing the data needed once proper emulation of the cassette circuits exists -->
<software name="lonewlf3">
- <description>Lone Wolf - The Mirror Of Death (set 1)</description>
+ <description>Lone Wolf - The Mirror of Death (set 1)</description>
<year>1991</year>
<publisher>Audiogenic Software Ltd</publisher>
@@ -15348,7 +15348,7 @@ license:CC0
</software>
<software name="lonewlf3a" cloneof="lonewlf3">
- <description>Lone Wolf - The Mirror Of Death (set 2)</description>
+ <description>Lone Wolf - The Mirror of Death (set 2)</description>
<year>1991</year>
<publisher>Audiogenic Software Ltd</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -15408,6 +15408,44 @@ license:CC0
</part>
</software>
+ <software name="attckatl" cloneof="lunaratt">
+ <description>Attack on Atlantis (Mind Games Espana)</description>
+ <year>1985</year>
+ <publisher>Mind Games Espana</publisher>
+ <part name="cass" interface="spectrum_cass">
+ <dataarea name="cass" size="18212">
+ <rom name="attack on atlantis (mind games espana).tzx" size="18212" crc="7e3ddb3a" sha1="a7f4701e9720d496a8711485e825cd8b4b7943a9"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="attckatla" cloneof="lunaratt">
+ <description>Attack on Atlantis (Century City)</description>
+ <year>1984</year>
+ <publisher>Century City Software</publisher>
+ <part name="cass" interface="spectrum_cass">
+ <dataarea name="cass" size="18242">
+ <rom name="attack on atlantis.tzx" size="18242" crc="f394f7c2" sha1="7057b7ff094c1edc1d3c0e0972a3974bb99cb195"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="electra9k" cloneof="lunaratt">
+ <description>Electra 9000</description>
+ <year>1987</year>
+ <publisher>Alternative Software</publisher>
+ <part name="cass1" interface="spectrum_cass">
+ <dataarea name="cass" size="9774">
+ <rom name="electra 9000 - side 1.tzx" size="9774" crc="b56e720f" sha1="1747480c87f12c6ba5717b9c8387497f7f4b9c3a"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="spectrum_cass">
+ <dataarea name="cass" size="25336">
+ <rom name="electra 9000 - side 2.tzx" size="25336" crc="cbf6d1e4" sha1="c3f395b3849c05e6d247bd276adadedbfdd7c403"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="lunland">
<description>Lunar Landing (Hipocrates)</description>
<year>198?</year>
@@ -16215,7 +16253,7 @@ license:CC0
<software name="mpsoccer">
<description>Microprose Soccer (Release 2 - 128k)</description>
<year>1989</year>
- <publisher>MicroProse Software Ltd</publisher>
+ <publisher>MicroProse Software</publisher>
<part name="cass1" interface="spectrum_cass">
<feature name="part_id" value="Side 1"/>
<dataarea name="cass" size="97769">
@@ -16233,7 +16271,7 @@ license:CC0
<software name="mpsoccer48" cloneof="mpsoccer">
<description>Microprose Soccer (Release 2 - 48k)</description>
<year>1989</year>
- <publisher>MicroProse Software Ltd</publisher>
+ <publisher>MicroProse Software</publisher>
<part name="cass1" interface="spectrum_cass">
<feature name="part_id" value="Side 1"/>
<dataarea name="cass" size="43704">
@@ -16251,7 +16289,7 @@ license:CC0
<software name="mpsoccerr1" cloneof="mpsoccer">
<description>Microprose Soccer (Release 1)</description>
<year>1989</year>
- <publisher>MicroProse Software Ltd</publisher>
+ <publisher>MicroProse Software</publisher>
<part name="cass1" interface="spectrum_cass">
<feature name="part_id" value="Side 1"/>
<dataarea name="cass" size="41626">
@@ -16795,7 +16833,7 @@ license:CC0
<software name="mmouse">
<description>Micro Mouse Goes De-Bugging (1983, MC Lothlorien Ltd)</description>
<year>1983</year>
- <publisher>MC Lothlorien Ltd</publisher>
+ <publisher>MC Lothlorien</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="15842">
<rom name="micro mouse goes de-bugging.tzx" size="15842" crc="d4a75914" sha1="982076471b0a6112388ae2e56e6deb4f769971ab"/>
@@ -18320,7 +18358,7 @@ license:CC0
<!-- 128k and 48k versions were separate releases -->
<software name="nodeyeso">
- <description>Nodes Of Yesod (128k release)</description>
+ <description>Nodes of Yesod (128k release)</description>
<year>1985</year>
<publisher>Odin Computer Graphics Ltd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -18331,7 +18369,7 @@ license:CC0
</software>
<software name="nodeyeso48" cloneof="nodeyeso">
- <description>Nodes Of Yesod (48k release)</description>
+ <description>Nodes of Yesod (48k release)</description>
<year>1985</year>
<publisher>Odin Computer Graphics Ltd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -18570,7 +18608,7 @@ license:CC0
############################################################################################################################## -->
<software name="olli">
- <description>Olli &amp; Lissa - The Ghost Of Shilmoore</description>
+ <description>Olli &amp; Lissa - The Ghost of Shilmoore</description>
<year>1986</year>
<publisher>Firebird Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -19777,7 +19815,7 @@ license:CC0
</software>
<software name="pod">
- <description>P.O.D. (Proof Of Destruction)</description>
+ <description>P.O.D. (Proof of Destruction)</description>
<year>1988</year>
<publisher>Mastertronic</publisher>
<part name="cass" interface="spectrum_cass">
@@ -21009,7 +21047,7 @@ license:CC0
</software>
<software name="pageandt">
- <description>Page And The Curse Of The Pharaoh</description>
+ <description>Page and the Curse of the Pharaoh</description>
<year>2015</year>
<publisher>T.D.F. micro-visions</publisher>
<part name="cass" interface="spectrum_cass">
@@ -23242,7 +23280,7 @@ license:CC0
</software>
<software name="stryker">
- <description>Stryker - In The Crypts Of Trogan</description>
+ <description>Stryker - In The Crypts of Trogan</description>
<year>19??</year>
<publisher>Code Masters</publisher>
<part name="cass" interface="spectrum_cass">
@@ -24593,7 +24631,7 @@ license:CC0
</software>
<software name="antiriad">
- <description>The Sacred Armour Of Antiriad</description>
+ <description>The Sacred Armour of Antiriad</description>
<year>1986</year>
<publisher>Palace Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -24609,7 +24647,7 @@ license:CC0
</software>
<software name="antiriade" cloneof="antiriad">
- <description>La Armadura Sagrada De Antiriad (Erbe - Serie Leyenda)</description>
+ <description>La Armadura Sagrada de Antiriad (Erbe - Serie Leyenda)</description>
<year>1986</year>
<publisher>Palace Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -24620,7 +24658,7 @@ license:CC0
</software>
<software name="antiriadh" cloneof="antiriad">
- <description>The Sacred Armour Of Antiriad (Hi-Tec)</description>
+ <description>The Sacred Armour of Antiriad (Hi-Tec)</description>
<year>1986</year>
<publisher>Palace Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -24631,7 +24669,7 @@ license:CC0
</software>
<software name="antiriads" cloneof="antiriad">
- <description>The Sacred Armour Of Antiriad (Silverbird)</description>
+ <description>The Sacred Armour of Antiriad (Silverbird)</description>
<year>1986</year>
<publisher>Palace Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -27639,7 +27677,7 @@ license:CC0
</software>
<software name="tlumos">
- <description>The Treasure Of Lumos (set 1, 128k, final version)</description>
+ <description>The Treasure of Lumos (set 1, 128k, final version)</description>
<year>2017</year>
<publisher>Jaime Grilo</publisher>
<part name="cass" interface="spectrum_cass">
@@ -27650,7 +27688,7 @@ license:CC0
</software>
<software name="tlumosa" cloneof="tlumos">
- <description>The Treasure Of Lumos (set 2, 48k, initial version)</description>
+ <description>The Treasure of Lumos (set 2, 48k, initial version)</description>
<year>2017</year>
<publisher>Jaime Grilo</publisher>
<part name="cass" interface="spectrum_cass">
@@ -27727,7 +27765,7 @@ license:CC0
</software>
<software name="talesofg">
- <description>Tales Of Grupp</description>
+ <description>Tales of Grupp</description>
<year>2015</year>
<publisher>Retrobytes Productions</publisher>
<part name="cass" interface="spectrum_cass">
@@ -27749,7 +27787,7 @@ license:CC0
</software>
<software name="tturtv"> <!-- full mod of JSW -->
- <description>Terry The Turtle Vektor</description>
+ <description>Terry the Turtle Vektor</description>
<year>2013</year>
<publisher>Purple Unicorn Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -27782,7 +27820,7 @@ license:CC0
</software>
<software name="ordrmaze">
- <description>The Order Of Mazes</description>
+ <description>The Order of Mazes</description>
<year>2015</year>
<publisher>Tom Dalby</publisher>
<part name="cass" interface="spectrum_cass">
@@ -28385,7 +28423,7 @@ license:CC0
</software>
<software name="werewolv">
- <description>Werewolves Of London</description>
+ <description>Werewolves of London</description>
<year>1989</year>
<publisher>Mastertronic</publisher>
<part name="cass" interface="spectrum_cass">
@@ -28396,7 +28434,7 @@ license:CC0
</software>
<software name="werewolvbf" cloneof="werewolv">
- <description>Werewolves Of London (bugfix)</description>
+ <description>Werewolves of London (bugfix)</description>
<year>1989</year>
<publisher>hack</publisher>
<part name="cass" interface="spectrum_cass">
@@ -29845,7 +29883,7 @@ license:CC0
</software>
<software name="bstelit1">
- <description>Best Of Elite Vol. 1</description>
+ <description>Best of Elite Vol. 1</description>
<year>1987</year>
<publisher>Hit-Pak (Elite)</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -29861,7 +29899,7 @@ license:CC0
</software>
<software name="bstelit2">
- <description>Best Of Elite Vol. 2</description>
+ <description>Best of Elite Vol. 2</description>
<year>1987</year>
<publisher>Hit-Pak (Elite)</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -30426,7 +30464,7 @@ license:CC0
<software name="fstfury">
- <description>Fists Of Fury (compilation)</description>
+ <description>Fists of Fury (compilation)</description>
<year>1991</year>
<publisher>Virgin Games</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -37132,7 +37170,7 @@ license:CC0
</software>
<software name="3dmazeof">
- <description>3D Maze Of Gold</description>
+ <description>3D Maze of Gold</description>
<year>1982</year>
<publisher>Gilsoft International</publisher>
<part name="cass" interface="spectrum_cass">
@@ -37324,7 +37362,7 @@ license:CC0
</software>
<software name="3dspawno">
- <description>3D Spawn Of Evil</description>
+ <description>3D Spawn of Evil</description>
<year>1983</year>
<publisher>DK'Tronics</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -37683,7 +37721,7 @@ license:CC0
</software>
<software name="4x4offr">
- <description>4x4 Off-Road Racing (set 1)</description>
+ <description>4x4 Off-Road Racing</description>
<year>1988</year>
<publisher>U.S. Gold</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -37699,9 +37737,9 @@ license:CC0
</software>
<software name="4x4offrk" cloneof="4x4offr">
- <description>4x4 Off-Road Racing (set 2, Kixx)</description>
- <year>1988</year>
- <publisher>U.S. Gold Ltd / Kixx</publisher>
+ <description>4x4 Off-Road Racing (Kixx)</description>
+ <year>1990</year>
+ <publisher>Kixx</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="51531">
<rom name="4x4 off-road racing (kixx) - side 1.tzx" size="51531" crc="1634cc0f" sha1="0850cb3e78a5c30b686e99ed85eac0f77362b016"/>
@@ -37731,7 +37769,7 @@ license:CC0
</software>
<software name="5treasur">
- <description>5 Treasures Of Ryzar</description>
+ <description>5 Treasures of Ryzar</description>
<year>1984</year>
<publisher>Space Age</publisher>
<part name="cass" interface="spectrum_cass">
@@ -37885,7 +37923,7 @@ license:CC0
</software>
<software name="tupperwr">
- <description>A Day In The Life Of A Tupperware Salesman</description>
+ <description>A Day in the Life of a Tupperware Salesman</description>
<year>1995</year>
<publisher>The Adventure Workshop</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -37901,7 +37939,7 @@ license:CC0
</software>
<software name="daylife">
- <description>A Day In The Life (set 1)</description>
+ <description>A Day in the Life (set 1)</description>
<year>1985</year>
<publisher>Micromega</publisher>
<part name="cass" interface="spectrum_cass">
@@ -37912,7 +37950,7 @@ license:CC0
</software>
<software name="daylifea" cloneof="daylife">
- <description>A Day In The Life (set 2, Dixons)</description>
+ <description>A Day in the Life (set 2, Dixons)</description>
<year>1985</year>
<publisher>Micromega / Dixons</publisher>
<part name="cass" interface="spectrum_cass">
@@ -37934,7 +37972,7 @@ license:CC0
</software>
<software name="afistful">
- <description>A Fistful Of Blood Capsules (set 2)</description>
+ <description>A Fistful of Blood Capsules (set 2)</description>
<year>1987</year>
<publisher>Zodiac</publisher>
<part name="cass" interface="spectrum_cass">
@@ -37945,7 +37983,7 @@ license:CC0
</software>
<software name="afistful_a" cloneof="afistful">
- <description>A Fistful Of Blood Capsules</description>
+ <description>A Fistful of Blood Capsules</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -37971,7 +38009,7 @@ license:CC0
</software>
<software name="afistful_e" cloneof="afistful">
- <description>A Fistful Of Necronomicons</description>
+ <description>A Fistful of Necronomicons</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38118,7 +38156,7 @@ license:CC0
</software>
<software name="amattero">
- <description>A Matter Of Evil (set 2)</description>
+ <description>A Matter of Evil (set 2)</description>
<year>1988</year>
<publisher>Creative Juices</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38129,7 +38167,7 @@ license:CC0
</software>
<software name="amattero_a" cloneof="amattero">
- <description>A Matter Of Evil</description>
+ <description>A Matter of Evil</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38174,7 +38212,7 @@ license:CC0
<software name="apicture">
- <description>A Picture Of Innocence (Central Solutions)</description>
+ <description>A Picture of Innocence (Central Solutions)</description>
<year>1986</year>
<publisher>Central Solutions</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38185,7 +38223,7 @@ license:CC0
</software>
<software name="apicture_a" cloneof="apicture">
- <description>A Picture Of Innocence (set 2)</description>
+ <description>A Picture of Innocence (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38196,7 +38234,7 @@ license:CC0
</software>
<software name="apicture_b" cloneof="apicture">
- <description>A Picture Of Innocence</description>
+ <description>A Picture of Innocence</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38207,7 +38245,7 @@ license:CC0
</software>
<software name="aquestio">
- <description>A Question Of Scruples - 128k</description>
+ <description>A Question of Scruples - 128k</description>
<year>1987</year>
<publisher>Leisure Genius</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38218,7 +38256,7 @@ license:CC0
</software>
<software name="aquestio_a" cloneof="aquestio">
- <description>A Question Of Scruples - 48k</description>
+ <description>A Question of Scruples - 48k</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -38234,7 +38272,7 @@ license:CC0
</software>
<software name="aquestio_c" cloneof="aquestio">
- <description>A Question Of Sport (EDOS)</description>
+ <description>A Question of Sport (EDOS)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38245,7 +38283,7 @@ license:CC0
</software>
<software name="aquestio_d" cloneof="aquestio">
- <description>A Question Of Sport (Encore)</description>
+ <description>A Question of Sport (Encore)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -38261,7 +38299,7 @@ license:CC0
</software>
<software name="aquestio_e" cloneof="aquestio">
- <description>A Question Of Sport</description>
+ <description>A Question of Sport</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -38277,7 +38315,7 @@ license:CC0
</software>
<software name="ashadowo">
- <description>A Shadow On Glass (set 2)</description>
+ <description>A Shadow on Glass (set 2)</description>
<year>1989</year>
<publisher>Psychaedelic Hedgehog</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38288,7 +38326,7 @@ license:CC0
</software>
<software name="ashadowo_a" cloneof="ashadowo">
- <description>A Shadow On Glass</description>
+ <description>A Shadow on Glass</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38315,7 +38353,7 @@ license:CC0
</software>
<software name="asoupcon">
- <description>A Soupcon Of Trouble - Revised Version</description>
+ <description>A Soupcon of Trouble - Revised Version</description>
<year>2002</year>
<publisher>Adventure Probe</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38326,7 +38364,7 @@ license:CC0
</software>
<software name="asoupcon_a" cloneof="asoupcon">
- <description>A Soupcon Of Trouble</description>
+ <description>A Soupcon of Trouble</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38337,7 +38375,7 @@ license:CC0
</software>
<software name="astrolli">
- <description>A Stroll In The Bleak Forest</description>
+ <description>A Stroll in the Bleak Forest</description>
<year>1989</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38436,7 +38474,7 @@ license:CC0
</software>
<software name="aviewtoa">
- <description>A View to a Chip (set 2)</description>
+ <description>A View to a Chip</description>
<year>1989</year>
<publisher>Futuresoft</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38583,7 +38621,7 @@ license:CC0
</software>
<software name="abbeyofc">
- <description>Abbey Of Crime - English Beta</description>
+ <description>Abbey of Crime - English Beta</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -38991,7 +39029,7 @@ license:CC0
</software>
<software name="aceoface">
- <description>Ace Of Aces (Ablex)</description>
+ <description>Ace of Aces (Ablex)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -39007,7 +39045,7 @@ license:CC0
</software>
<software name="aceoface_b" cloneof="aceoface">
- <description>Ace Of Aces (Kixx)</description>
+ <description>Ace of Aces (Kixx)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -39023,7 +39061,7 @@ license:CC0
</software>
<software name="aceoface_d" cloneof="aceoface">
- <description>Ace Of Aces (Erbe)</description>
+ <description>Ace of Aces (Erbe)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -39039,7 +39077,7 @@ license:CC0
</software>
<software name="aceoface_f" cloneof="aceoface">
- <description>Ace Of Aces</description>
+ <description>Ace of Aces</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -40918,7 +40956,7 @@ license:CC0
</software>
<software name="aneveryd">
- <description>An Everyday Tale Of A Seeker Of Gold</description>
+ <description>An Everyday Tale of a Seeker of Gold</description>
<year>1986</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -41369,7 +41407,7 @@ license:CC0
</software>
<software name="annalsof">
- <description>Annals Of Rome</description>
+ <description>Annals of Rome</description>
<year>1986</year>
<publisher>PSS</publisher>
<part name="cass" interface="spectrum_cass">
@@ -41380,7 +41418,7 @@ license:CC0
</software>
<software name="anotherb">
- <description>Another Brick On The Wall 2 - English version</description>
+ <description>Another Brick on the Wall 2 (English version)</description>
<year>2005</year>
<publisher>Compiler</publisher>
<part name="cass" interface="spectrum_cass">
@@ -41391,7 +41429,7 @@ license:CC0
</software>
<software name="anotherb_b" cloneof="anotherb">
- <description>Another Brick On The Wall 2 - Spanish version</description>
+ <description>Another Brick On The Wall 2 (Spanish version)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -42026,7 +42064,7 @@ license:CC0
<software name="arena">
<description>Arena (set 1)</description>
<year>1985</year>
- <publisher>MC Lothlorien Ltd</publisher>
+ <publisher>MC Lothlorien</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="39328">
<rom name="arena.tzx" size="39328" crc="8691edcf" sha1="bae9a18f5663b8abadfa364a0cc4640bfa54b72e"/>
@@ -42216,7 +42254,7 @@ license:CC0
<!-- Golden Baton series #2 -->
<software name="arwdeath">
- <description>Arrow Of Death Part I (set 1)</description>
+ <description>Arrow of Death Part I (set 1)</description>
<year>1983</year>
<publisher>Digital Fantasia</publisher>
<part name="cass" interface="spectrum_cass">
@@ -42227,7 +42265,7 @@ license:CC0
</software>
<software name="arwdeatha" cloneof="arwdeath">
- <description>Arrow Of Death Part I (set 2)</description>
+ <description>Arrow of Death Part I (set 2)</description>
<year>1983</year>
<publisher>Digital Fantasia</publisher>
<part name="cass" interface="spectrum_cass">
@@ -42238,7 +42276,7 @@ license:CC0
</software>
<software name="arwdeathb">
- <description>Arrow Of Death Part I (set 3, Channel 8)</description>
+ <description>Arrow of Death Part I (set 3, Channel 8)</description>
<year>1983</year>
<publisher>Digital Fantasia / Channel 8</publisher>
<part name="cass" interface="spectrum_cass">
@@ -42250,7 +42288,7 @@ license:CC0
<!-- Golden Baton series #3 -->
<software name="arwdeat2">
- <description>Arrow Of Death Part II (set 1)</description>
+ <description>Arrow of Death Part II (set 1)</description>
<year>1983</year>
<publisher>Digital Fantasia</publisher>
<part name="cass" interface="spectrum_cass">
@@ -42261,7 +42299,7 @@ license:CC0
</software>
<software name="arwdeat2a" cloneof="arwdeat2">
- <description>Arrow Of Death Part II (set 2)</description>
+ <description>Arrow of Death Part II (set 2)</description>
<year>1983</year>
<publisher>Digital Fantasia</publisher>
<part name="cass" interface="spectrum_cass">
@@ -42272,7 +42310,7 @@ license:CC0
</software>
<software name="arwdeat2b" cloneof="arwdeat2">
- <description>Arrow Of Death Part II (Channel 8)</description>
+ <description>Arrow of Death Part II (Channel 8)</description>
<year>1983</year>
<publisher>Digital Fantasia / Channel 8</publisher>
<part name="cass" interface="spectrum_cass">
@@ -42968,10 +43006,10 @@ license:CC0
</part>
</software>
- <software name="attackof_a" cloneof="attackof">
+ <software name="attcktom">
<description>Attack of the Killer Tomatoes</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1986</year>
+ <publisher>Global Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="38363">
<rom name="attack of the killer tomatoes.tzx" size="38363" crc="89496495" sha1="55e5e302d8c7745bba23ec5936cf7b34122a0f93"/>
@@ -42979,28 +43017,6 @@ license:CC0
</part>
</software>
- <software name="attackon">
- <description>Attack on Atlantis (Mind Games Espana)</description>
- <year>1985</year>
- <publisher>Mind Games Espana</publisher>
- <part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="18212">
- <rom name="attack on atlantis (mind games espana).tzx" size="18212" crc="7e3ddb3a" sha1="a7f4701e9720d496a8711485e825cd8b4b7943a9"/>
- </dataarea>
- </part>
- </software>
-
- <software name="attackon_a" cloneof="attackon">
- <description>Attack on Atlantis</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
- <part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="18242">
- <rom name="attack on atlantis.tzx" size="18242" crc="f394f7c2" sha1="7057b7ff094c1edc1d3c0e0972a3974bb99cb195"/>
- </dataarea>
- </part>
- </software>
-
<software name="attactic">
<description>Attactics</description>
<year>1983</year>
@@ -43057,20 +43073,9 @@ license:CC0
</software>
<software name="aufwiede">
- <description>Auf Wiedersehen Monty (Kixx)</description>
+ <description>Auf Wiedersehen Monty (128K)</description>
<year>1987</year>
- <publisher>Kixx</publisher>
- <part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="70148">
- <rom name="auf wiedersehen monty (kixx).tzx" size="70148" crc="b63de474" sha1="eb9b8981d78e70e44635d2e4b03c08441a8b6a57"/>
- </dataarea>
- </part>
- </software>
-
- <software name="aufwiede_a" cloneof="aufwiede">
- <description>Auf Wiedersehen Monty - 128k</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <publisher>Gremlin Graphics Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="70342">
<rom name="auf wiedersehen monty - 128k.tzx" size="70342" crc="d78472ba" sha1="4869990475eb2a0ccb19383e2cb0497075cfd5d9"/>
@@ -43078,10 +43083,10 @@ license:CC0
</part>
</software>
- <software name="aufwiede_b" cloneof="aufwiede">
- <description>Auf Wiedersehen Monty - 48k</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="aufwiedea" cloneof="aufwiede">
+ <description>Auf Wiedersehen Monty (48K)</description>
+ <year>1987</year>
+ <publisher>Gremlin Graphics Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="70040">
<rom name="auf wiedersehen monty - 48k.tzx" size="70040" crc="2f7f6ce6" sha1="76af793b14468198f122b8c341459172704de03e"/>
@@ -43089,10 +43094,10 @@ license:CC0
</part>
</software>
- <software name="aufwiede_d" cloneof="aufwiede">
+ <software name="aufwiedeb" cloneof="aufwiede">
<description>Aufwiedersehen Monty (Erbe)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1987</year>
+ <publisher>Erbe Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="70217">
<rom name="aufwiedersehen monty (erbe).tzx" size="70217" crc="8eaab5cf" sha1="513756e44a216ceb2b24d6fced48e80331c5c98c"/>
@@ -43100,10 +43105,21 @@ license:CC0
</part>
</software>
- <software name="aufwiede_c" cloneof="aufwiede">
+ <software name="aufwiedec" cloneof="aufwiede">
+ <description>Auf Wiedersehen Monty (Kixx)</description>
+ <year>1987</year>
+ <publisher>Kixx</publisher>
+ <part name="cass" interface="spectrum_cass">
+ <dataarea name="cass" size="70148">
+ <rom name="auf wiedersehen monty (kixx).tzx" size="70148" crc="b63de474" sha1="eb9b8981d78e70e44635d2e4b03c08441a8b6a57"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aufwipet">
<description>Auf Wiedersehen Pet</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1984</year>
+ <publisher>Tynesoft</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="37176">
<rom name="auf wiedersehen pet.tzx" size="37176" crc="754320ca" sha1="734c507f3223c0eb12343f95f8c8af74d52b52b2"/>
@@ -43128,23 +43144,23 @@ license:CC0
</software>
<software name="auntvelm">
- <description>Aunt Velma's Coming To Tea! (Zenobi)</description>
+ <description>Aunt Velma's Coming To Tea!</description>
<year>1991</year>
- <publisher>Zenobi Software</publisher>
+ <publisher>Delbert the Hamster Software</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="32203">
- <rom name="aunt velma_s coming to tea (zenobi).tzx" size="32203" crc="fbed7ce2" sha1="66436839dd1239f11f388af9098c374f8f5f681f"/>
+ <dataarea name="cass" size="25204">
+ <rom name="aunt velma_s coming to tea - alternate.tzx" size="25204" crc="5910e832" sha1="b05bf76b3308b8389ef9a64bab756222d09b2778"/>
</dataarea>
</part>
</software>
- <software name="auntvelm_a" cloneof="auntvelm">
- <description>Aunt Velma's Coming To Tea! (set 2)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="auntvelma" cloneof="auntvelm">
+ <description>Aunt Velma's Coming To Tea! (Zenobi)</description>
+ <year>1991</year>
+ <publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="25204">
- <rom name="aunt velma_s coming to tea - alternate.tzx" size="25204" crc="5910e832" sha1="b05bf76b3308b8389ef9a64bab756222d09b2778"/>
+ <dataarea name="cass" size="32203">
+ <rom name="aunt velma_s coming to tea (zenobi).tzx" size="32203" crc="fbed7ce2" sha1="66436839dd1239f11f388af9098c374f8f5f681f"/>
</dataarea>
</part>
</software>
@@ -43479,7 +43495,7 @@ license:CC0
</software>
<software name="avalon">
- <description>The Legend Of Avalon</description>
+ <description>The Legend of Avalon</description>
<year>1984</year>
<publisher>Hewson Consultants</publisher>
<part name="cass" interface="spectrum_cass">
@@ -43490,7 +43506,7 @@ license:CC0
</software>
<software name="avalonmc" cloneof="avalon">
- <description>The Legend Of Avalon (MCN)</description>
+ <description>The Legend of Avalon (MCN)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -43506,7 +43522,7 @@ license:CC0
</software>
<software name="avalonlsh" cloneof="avalon">
- <description>The Legend Of Avalon (loading screen hack)</description>
+ <description>The Legend of Avalon (loading screen hack)</description>
<year>19??</year>
<publisher>hack</publisher>
<part name="cass" interface="spectrum_cass">
@@ -43917,7 +43933,7 @@ license:CC0
</software>
<software name="theamule">
- <description>The Amulet Of Darath (Zenobi)</description>
+ <description>The Amulet of Darath (Zenobi)</description>
<year>1992</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -43928,7 +43944,7 @@ license:CC0
</software>
<software name="theamule_a" cloneof="theamule">
- <description>The Amulet Of Darath</description>
+ <description>The Amulet of Darath</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -44172,7 +44188,7 @@ license:CC0
</software>
<software name="theaxeof">
- <description>The Axe Of Kolt (Adventure Probe)</description>
+ <description>The Axe of Kolt (Adventure Probe)</description>
<year>1990</year>
<publisher>Adventure Probe</publisher>
<part name="cass" interface="spectrum_cass">
@@ -44183,7 +44199,7 @@ license:CC0
</software>
<software name="theaxeof_d" cloneof="theaxeof">
- <description>The Axe Of Kolt</description>
+ <description>The Axe of Kolt</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -44209,7 +44225,7 @@ license:CC0
</software>
<software name="theaxeof_c" cloneof="theaxeof">
- <description>The Axe Of Kolt (set 2)</description>
+ <description>The Axe of Kolt (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -44235,7 +44251,7 @@ license:CC0
</software>
<software name="theaxeof_a" cloneof="theaxeof">
- <description>The Axe Of Kolt - 128k (set 3)</description>
+ <description>The Axe of Kolt - 128k (set 3)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -45038,7 +45054,7 @@ license:CC0
</software>
<software name="battleof">
- <description>Battle Of Austerlitz</description>
+ <description>Battle of Austerlitz</description>
<year>1985</year>
<publisher>MC Lothlorien</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -45053,19 +45069,8 @@ license:CC0
</part>
</software>
- <software name="battleof_h" cloneof="battleof">
- <description>Battle of the Planets (Erbe)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
- <part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="50542">
- <rom name="battle of the planets (erbe).tzx" size="50542" crc="92eedd06" sha1="f5e9b7e28a8dac7bfaf0c977875083b232f024eb"/>
- </dataarea>
- </part>
- </software>
-
- <software name="battleof_i" cloneof="battleof">
- <description>Battle of the Planets (set 2)</description>
+ <software name="battlepl">
+ <description>Battle of the Planets (alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -45080,7 +45085,7 @@ license:CC0
</part>
</software>
- <software name="battleof_k" cloneof="battleof">
+ <software name="battlepla" cloneof="battlepl">
<description>Battle of the Planets</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -45096,10 +45101,21 @@ license:CC0
</part>
</software>
- <software name="battleof_m" cloneof="battleof">
- <description>Battle of the Toothpaste Tubes</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="battleplb" cloneof="battlepl">
+ <description>Battle of the Planets (Erbe)</description>
+ <year>1986</year>
+ <publisher>Erbe Software</publisher>
+ <part name="cass" interface="spectrum_cass">
+ <dataarea name="cass" size="50542">
+ <rom name="battle of the planets (erbe).tzx" size="50542" crc="92eedd06" sha1="f5e9b7e28a8dac7bfaf0c977875083b232f024eb"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="battlett">
+ <description>Battle of the Toothpaste Tubes (within compilation "Castle Colditz + Battle of the Toothpaste Tubes")</description>
+ <year>1983</year>
+ <publisher>K-Tel Productions</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="6201">
<rom name="battle of the toothpaste tubes.tzx" size="6201" crc="5364d0d7" sha1="5df8690ed667b8aaf68673a30229e2b162df5e31"/>
@@ -47213,7 +47229,7 @@ license:CC0
</software>
<software name="bogofbri">
- <description>Bog Of Brit (Zenobi)</description>
+ <description>Bog of Brit (Zenobi)</description>
<year>1990</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -47224,7 +47240,7 @@ license:CC0
</software>
<software name="bogofbri_a" cloneof="bogofbri">
- <description>Bog Of Brit (set 2)</description>
+ <description>Bog of Brit (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -47235,7 +47251,7 @@ license:CC0
</software>
<software name="bogofbri_b" cloneof="bogofbri">
- <description>Bog Of Brit</description>
+ <description>Bog of Brit</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -47322,32 +47338,32 @@ license:CC0
</part>
</software>
- <software name="bombjack_e" cloneof="bombjack">
- <description>Bomb Jack II (EDOS)</description>
+ <software name="bombjack_i" cloneof="bombjack">
+ <description>Bomb Jack</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="46170">
- <rom name="bomb jack ii (edos).tzx" size="46170" crc="656b5345" sha1="759b2acf5664ac70671d86b94117639a17e84fa0"/>
+ <dataarea name="cass" size="44167">
+ <rom name="bomb jack.tzx" size="44167" crc="0ef6ac32" sha1="d63473c0288c2ae0b9202df6bfeedd936233e826"/>
</dataarea>
</part>
</software>
- <software name="bombjack_f" cloneof="bombjack">
- <description>Bomb Jack II (Encore)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="bombjack2">
+ <description>Bomb Jack II</description>
+ <year>1987</year>
+ <publisher>Elite Systems</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="45779">
- <rom name="bomb jack ii (encore).tzx" size="45779" crc="4364b5b2" sha1="948a5d76711d5916b71b40559cfc876c7cf9cc1d"/>
+ <dataarea name="cass" size="45617">
+ <rom name="bomb jack ii.tzx" size="45617" crc="13aa9ea5" sha1="06f6401904cb716bf6e45e11341158bbeb2a903f"/>
</dataarea>
</part>
</software>
- <software name="bombjack_g" cloneof="bombjack">
- <description>Bomb Jack II - Pre Production</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="bombjack2a" cloneof="bombjack2">
+ <description>Bomb Jack II (pre-production)</description>
+ <year>1987</year>
+ <publisher>Elite Systems</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="45647">
<rom name="bomb jack ii - pre production.tzx" size="45647" crc="26bc1a52" sha1="1dcffb485494c48033b5f898ac3d6e6f6c355361"/>
@@ -47355,24 +47371,24 @@ license:CC0
</part>
</software>
- <software name="bombjack_h" cloneof="bombjack">
- <description>Bomb Jack II</description>
+ <software name="bombjack2b" cloneof="bombjack2">
+ <description>Bomb Jack II (EDOS)</description>
<year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <publisher>EDOS</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="45617">
- <rom name="bomb jack ii.tzx" size="45617" crc="13aa9ea5" sha1="06f6401904cb716bf6e45e11341158bbeb2a903f"/>
+ <dataarea name="cass" size="46170">
+ <rom name="bomb jack ii (edos).tzx" size="46170" crc="656b5345" sha1="759b2acf5664ac70671d86b94117639a17e84fa0"/>
</dataarea>
</part>
</software>
- <software name="bombjack_i" cloneof="bombjack">
- <description>Bomb Jack</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="bombjack2c" cloneof="bombjack2">
+ <description>Bomb Jack II (Encore)</description>
+ <year>1989</year>
+ <publisher>Encore</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="44167">
- <rom name="bomb jack.tzx" size="44167" crc="0ef6ac32" sha1="d63473c0288c2ae0b9202df6bfeedd936233e826"/>
+ <dataarea name="cass" size="45779">
+ <rom name="bomb jack ii (encore).tzx" size="45779" crc="4364b5b2" sha1="948a5d76711d5916b71b40559cfc876c7cf9cc1d"/>
</dataarea>
</part>
</software>
@@ -47525,7 +47541,7 @@ license:CC0
</software>
<software name="boredoft">
- <description>Bored Of The Rings (CRL)</description>
+ <description>Bored of the Rings (CRL)</description>
<year>1985</year>
<publisher>CRL Group</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -47541,7 +47557,7 @@ license:CC0
</software>
<software name="boredoft_b" cloneof="boredoft">
- <description>Bored Of The Rings (GI Games)</description>
+ <description>Bored of the Rings (GI Games)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -47557,7 +47573,7 @@ license:CC0
</software>
<software name="boredoft_d" cloneof="boredoft">
- <description>Bored Of The Rings (Silversoft)</description>
+ <description>Bored of the Rings (Silversoft)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -47573,7 +47589,7 @@ license:CC0
</software>
<software name="boredoft_f" cloneof="boredoft">
- <description>Bored Of The Rings (Zenobi)</description>
+ <description>Bored of the Rings (Zenobi)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -47589,7 +47605,7 @@ license:CC0
</software>
<software name="boredoft_h" cloneof="boredoft">
- <description>Bored Of The Rings - Release 1</description>
+ <description>Bored of the Rings - Release 1</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -47615,7 +47631,7 @@ license:CC0
</software>
<software name="boredoft_l" cloneof="boredoft">
- <description>Bored Of The Rings - Release 2</description>
+ <description>Bored of the Rings - Release 2</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -47631,7 +47647,7 @@ license:CC0
</software>
<software name="boredoft_n" cloneof="boredoft">
- <description>Bored Of The Rings - Release 3</description>
+ <description>Bored of the Rings - Release 3</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -48475,7 +48491,7 @@ license:CC0
</software>
<software name="budokans">
- <description>Budokan (Dro Soft)</description>
+ <description>Budokan: The Martial Spirit</description>
<year>1991</year>
<publisher>Dro Soft</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -49013,7 +49029,7 @@ license:CC0
</software>
<software name="byrighto">
- <description>By Right Of Birth</description>
+ <description>By Right of Birth</description>
<year>2002</year>
<publisher>Adventure Probe</publisher>
<part name="cass" interface="spectrum_cass">
@@ -49187,7 +49203,7 @@ license:CC0
</software>
<software name="thebattl">
- <description>The Battle Of Broken Bridge &amp; Icarus Igginbotham</description>
+ <description>The Battle of Broken Bridge &amp; Icarus Igginbotham</description>
<year>1984</year>
<publisher>5D</publisher>
<part name="cass" interface="spectrum_cass">
@@ -49198,7 +49214,7 @@ license:CC0
</software>
<software name="thebattl_a" cloneof="thebattl">
- <description>The Battle Of The Bulge</description>
+ <description>The Battle of the Bulge</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -49225,7 +49241,7 @@ license:CC0
</software>
<software name="thebeast_a" cloneof="thebeast">
- <description>The Beast Of Torrack Moor (set 2)</description>
+ <description>The Beast of Torrack Moor (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -49236,7 +49252,7 @@ license:CC0
</software>
<software name="thebeast_b" cloneof="thebeast">
- <description>The Beast Of Torrack Moor</description>
+ <description>The Beast of Torrack Moor</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -49247,7 +49263,7 @@ license:CC0
</software>
<software name="thebegin">
- <description>The Beginning Of The End</description>
+ <description>The Beginning of the End</description>
<year>1992</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -49280,7 +49296,7 @@ license:CC0
</software>
<software name="bestspdw">
- <description>The Best Of Speedway</description>
+ <description>The Best of Speedway</description>
<year>1993</year>
<publisher>Lambourne Games</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -49517,7 +49533,7 @@ license:CC0
</software>
<software name="bloodbog">
- <description>The Blood Of Bogmole</description>
+ <description>The Blood of Bogmole</description>
<year>1991</year>
<publisher>Compass</publisher>
<part name="cass" interface="spectrum_cass">
@@ -49528,7 +49544,7 @@ license:CC0
</software>
<software name="bloodboga" cloneof="bloodbog">
- <description>The Blood Of Bogmole (set 2)</description>
+ <description>The Blood of Bogmole (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -49539,7 +49555,7 @@ license:CC0
</software>
<software name="bloodbogmast" cloneof="bloodbog">
- <description>The Blood Of Bogmole (Mastering Tape)</description>
+ <description>The Blood of Bogmole (Mastering Tape)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -49550,7 +49566,7 @@ license:CC0
</software>
<software name="theboggi">
- <description>The Boggit (GI Games)</description>
+ <description>The Boggit (G.I. Games)</description>
<year>1986</year>
<publisher>G.I. Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -50758,7 +50774,7 @@ license:CC0
</software>
<software name="castleof">
- <description>Castle Of Confusion - Preview</description>
+ <description>Castle of Confusion - Preview</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -50769,7 +50785,7 @@ license:CC0
</software>
<software name="castleof_a" cloneof="castleof">
- <description>Castle Of Dreams</description>
+ <description>Castle of Dreams</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -50780,7 +50796,7 @@ license:CC0
</software>
<software name="castleof_b" cloneof="castleof">
- <description>Castle Of The Skull Lord (set 2)</description>
+ <description>Castle of the Skull Lord (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -50791,7 +50807,7 @@ license:CC0
</software>
<software name="castleof_c" cloneof="castleof">
- <description>Castle Of The Skull Lord - Amended Version</description>
+ <description>Castle of the Skull Lord - Amended Version</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -50802,7 +50818,7 @@ license:CC0
</software>
<software name="castleof_d" cloneof="castleof">
- <description>Castle Of The Skull Lord</description>
+ <description>Castle of the Skull Lord</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -50943,7 +50959,7 @@ license:CC0
</software>
<software name="castlesa">
- <description>Castles And Clowns - Clown</description>
+ <description>Castles and Clowns - Clown</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -50954,7 +50970,7 @@ license:CC0
</software>
<software name="castlesa_a" cloneof="castlesa">
- <description>Castles And Clowns - King Of The Castle</description>
+ <description>Castles and Clowns - King of the Castle</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -50976,7 +50992,7 @@ license:CC0
</software>
<software name="catacomb">
- <description>Catacombs Of Balachor</description>
+ <description>Catacombs of Balachor</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -51139,7 +51155,7 @@ license:CC0
</software>
<software name="cavernso">
- <description>Caverns Of Kontonia</description>
+ <description>Caverns of Kontonia</description>
<year>1986</year>
<publisher>Atlantis</publisher>
<part name="cass" interface="spectrum_cass">
@@ -51172,7 +51188,7 @@ license:CC0
</software>
<software name="cellofth">
- <description>Cell Of The Ridges</description>
+ <description>Cell of the Ridges</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -51183,7 +51199,7 @@ license:CC0
</software>
<software name="cellsand">
- <description>Cells And Serpents</description>
+ <description>Cells and Serpents</description>
<year>1983</year>
<publisher>ASP</publisher>
<part name="cass" interface="spectrum_cass">
@@ -51392,20 +51408,9 @@ license:CC0
</software>
<software name="chainrea">
- <description>Chain Reaction (Encore)</description>
- <year>1990</year>
- <publisher>Encore</publisher>
- <part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="52005">
- <rom name="chain reaction (encore).tzx" size="52005" crc="c710409a" sha1="c6ae5ab404152654cad639fb16cb3d91579432ba"/>
- </dataarea>
- </part>
- </software>
-
- <software name="chainrea_a" cloneof="chainrea">
<description>Chain Reaction</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1987</year>
+ <publisher>Durell Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="52005">
<rom name="chain reaction - 128k.tzx" size="52005" crc="0257b3b0" sha1="53cce0423e5d1fecf87b4bbd4d1925cc8a060d35"/>
@@ -51418,10 +51423,10 @@ license:CC0
</part>
</software>
- <software name="chainrea_c" cloneof="chainrea">
+ <software name="chainreaa" cloneof="chainrea">
<description>Chain Reaction (MCM)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1988</year>
+ <publisher>MCM Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="52019">
<rom name="chain reaction - side 1 (mcm).tzx" size="52019" crc="7ea3c7c7" sha1="a3bc51a6ff0a05ed282fb4fdf0087e07de94e289"/>
@@ -51434,10 +51439,21 @@ license:CC0
</part>
</software>
+ <software name="chainreab" cloneof="chainrea">
+ <description>Chain Reaction (Encore)</description>
+ <year>1990</year>
+ <publisher>Encore</publisher>
+ <part name="cass" interface="spectrum_cass">
+ <dataarea name="cass" size="52005">
+ <rom name="chain reaction (encore).tzx" size="52005" crc="c710409a" sha1="c6ae5ab404152654cad639fb16cb3d91579432ba"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="challeng">
- <description>Challenge (Temptation Software)</description>
+ <description>Challenge</description>
<year>1983</year>
- <publisher>Temptation</publisher>
+ <publisher>Temptation Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="29865">
<rom name="challenge (temptation software).tzx" size="29865" crc="2e927032" sha1="a4c71904472291e2f9acb79b7c18f6eae5f1dc6a"/>
@@ -51445,10 +51461,10 @@ license:CC0
</part>
</software>
- <software name="challeng_a" cloneof="challeng">
- <description>Challenge Of Iythus (set 2)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="chiythus">
+ <description>Challenge of Iythus (alt)</description>
+ <year>1988</year>
+ <publisher>Creative Juices</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="53501">
<rom name="challenge of iythus - side a - alternate.tzx" size="53501" crc="9b899e9b" sha1="b5bd75d59f4ddaa38a9da5e6fab1bb733c222db9"/>
@@ -51461,10 +51477,10 @@ license:CC0
</part>
</software>
- <software name="challeng_b" cloneof="challeng">
- <description>Challenge Of Iythus</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="chiythusa" cloneof="chiythus">
+ <description>Challenge of Iythus</description>
+ <year>1988</year>
+ <publisher>Creative Juices</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="53523">
<rom name="challenge of iythus - side a.tzx" size="53523" crc="db7dcd0e" sha1="6f10f5ba1dec9c847f65f154014093024e711749"/>
@@ -51477,40 +51493,40 @@ license:CC0
</part>
</software>
- <software name="challeng_e" cloneof="challeng">
- <description>Challenge Of The Gobots (Dro Soft)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="chgobots">
+ <description>Challenge of the Gobots</description>
+ <year>1987</year>
+ <publisher>Reaktor</publisher>
<part name="cass1" interface="spectrum_cass">
- <dataarea name="cass" size="54657">
- <rom name="challenge of the gobots - side 1 (dro soft).tzx" size="54657" crc="ab585776" sha1="6ffa5bc6fe4cb9ca011b7c246d1f61aa5363a577"/>
+ <dataarea name="cass" size="40040">
+ <rom name="challenge of the gobots - side 1.tzx" size="40040" crc="97f32e3f" sha1="b41383024f639e769bb2a881c61578485ca3cba2"/>
</dataarea>
</part>
<part name="cass2" interface="spectrum_cass">
- <dataarea name="cass" size="40113">
- <rom name="challenge of the gobots - side 2 (dro soft).tzx" size="40113" crc="710a1836" sha1="56d110eab433413cdc40611e1f962c56d8d46ccd"/>
+ <dataarea name="cass" size="54579">
+ <rom name="challenge of the gobots - side 2.tzx" size="54579" crc="35d87b49" sha1="7d3ce5a2b8abd54ad44333f8320823a92445dbe9"/>
</dataarea>
</part>
</software>
- <software name="challeng_f" cloneof="challeng">
- <description>Challenge Of The Gobots</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="chgobotsa" cloneof="chgobots">
+ <description>Challenge of the Gobots (Dro Soft)</description>
+ <year>1987</year>
+ <publisher>Dro Soft</publisher>
<part name="cass1" interface="spectrum_cass">
- <dataarea name="cass" size="40040">
- <rom name="challenge of the gobots - side 1.tzx" size="40040" crc="97f32e3f" sha1="b41383024f639e769bb2a881c61578485ca3cba2"/>
+ <dataarea name="cass" size="54657">
+ <rom name="challenge of the gobots - side 1 (dro soft).tzx" size="54657" crc="ab585776" sha1="6ffa5bc6fe4cb9ca011b7c246d1f61aa5363a577"/>
</dataarea>
</part>
<part name="cass2" interface="spectrum_cass">
- <dataarea name="cass" size="54579">
- <rom name="challenge of the gobots - side 2.tzx" size="54579" crc="35d87b49" sha1="7d3ce5a2b8abd54ad44333f8320823a92445dbe9"/>
+ <dataarea name="cass" size="40113">
+ <rom name="challenge of the gobots - side 2 (dro soft).tzx" size="40113" crc="710a1836" sha1="56d110eab433413cdc40611e1f962c56d8d46ccd"/>
</dataarea>
</part>
</software>
<software name="chambers">
- <description>Chambers Of Horrors</description>
+ <description>Chambers of Horrors</description>
<year>1984</year>
<publisher>Omega</publisher>
<part name="cass" interface="spectrum_cass">
@@ -51543,7 +51559,7 @@ license:CC0
</software>
<software name="cc26a">
- <description>Champions Of Cricket - 2 To 6 Version Mod</description>
+ <description>Champions of Cricket - 2 To 6 Version Mod</description>
<year>1991</year>
<publisher>Lambourne Games</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -51559,7 +51575,7 @@ license:CC0
</software>
<software name="cc262">
- <description>Champions Of Cricket - 2 To 6 Version (side 2 only)</description>
+ <description>Champions of Cricket - 2 To 6 Version (side 2 only)</description>
<year>1991</year>
<publisher>Lambourne Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -51570,7 +51586,7 @@ license:CC0
</software>
<software name="ccatg">
- <description>Champions Of Cricket - All Time Greats</description>
+ <description>Champions of Cricket - All Time Greats</description>
<year>1991</year>
<publisher>Lambourne Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -51581,7 +51597,7 @@ license:CC0
</software>
<software name="ccbls">
- <description>Champions Of Cricket - Body Line Series</description>
+ <description>Champions of Cricket - Body Line Series</description>
<year>1991</year>
<publisher>Lambourne Games</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -51597,7 +51613,7 @@ license:CC0
</software>
<software name="ccexp">
- <description>Champions Of Cricket - Expanded Version</description>
+ <description>Champions of Cricket - Expanded Version</description>
<year>1991</year>
<publisher>Lambourne Games</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -51613,7 +51629,7 @@ license:CC0
</software>
<software name="ccext">
- <description>Champions Of Cricket - Extended Version</description>
+ <description>Champions of Cricket - Extended Version</description>
<year>1991</year>
<publisher>Lambourne Games</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -51629,7 +51645,7 @@ license:CC0
</software>
<software name="cc1991">
- <description>Champions Of Cricket - Player Data Cassette 1991</description>
+ <description>Champions of Cricket - Player Data Cassette 1991</description>
<year>1991</year>
<publisher>Lambourne Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -51640,7 +51656,7 @@ license:CC0
</software>
<software name="cc1992">
- <description>Champions Of Cricket - Player Data Cassette 1992</description>
+ <description>Champions of Cricket - Player Data Cassette 1992</description>
<year>1992</year>
<publisher>Lambourne Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -51651,7 +51667,7 @@ license:CC0
</software>
<software name="cc1993">
- <description>Champions Of Cricket - Player Data Cassette 1993</description>
+ <description>Champions of Cricket - Player Data Cassette 1993</description>
<year>1993</year>
<publisher>Lambourne Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -51662,7 +51678,7 @@ license:CC0
</software>
<software name="cc1994">
- <description>Champions Of Cricket - Player Data Cassette 1994</description>
+ <description>Champions of Cricket - Player Data Cassette 1994</description>
<year>1994</year>
<publisher>Lambourne Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -51673,7 +51689,7 @@ license:CC0
</software>
<software name="ccspec">
- <description>Champions Of Cricket - Special</description>
+ <description>Champions of Cricket - Special</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -51699,10 +51715,10 @@ license:CC0
</part>
</software>
- <software name="champion_r" cloneof="champion">
+ <software name="ch3dsnook">
<description>Championship 3D Snooker</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1992</year>
+ <publisher>Zeppelin Games</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="28932">
<rom name="championship 3d snooker.tzx" size="28932" crc="87d0ec8a" sha1="c77af8e9a7028ee287cfbd57d5cd92dacb1eb79e"/>
@@ -51710,10 +51726,10 @@ license:CC0
</part>
</software>
- <software name="champion_t" cloneof="champion">
+ <software name="chpdarts">
<description>Championship Darts</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1983</year>
+ <publisher>Shadow Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="15381">
<rom name="championship darts.tzx" size="15381" crc="8b58eb02" sha1="ffa9a0732a82626ba961bca926b7cfb286785720"/>
@@ -51721,21 +51737,10 @@ license:CC0
</part>
</software>
- <software name="champion_u" cloneof="champion">
- <description>Championship Golf (Cult)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
- <part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="45359">
- <rom name="championship golf (cult).tzx" size="45359" crc="0b775634" sha1="18f079c97a631f2ecaa374d24fb5178ccd4d2ce8"/>
- </dataarea>
- </part>
- </software>
-
- <software name="champion_v" cloneof="champion">
- <description>Championship Golf (set 2)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="chpgolf">
+ <description>Championship Golf (alt)</description>
+ <year>1988</year>
+ <publisher>D&amp;H Games</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="45235">
<rom name="championship golf - alternate.tzx" size="45235" crc="88374399" sha1="a7a5b13681ec1459c03b31a611881053482d0d8e"/>
@@ -51743,10 +51748,10 @@ license:CC0
</part>
</software>
- <software name="champion_w" cloneof="champion">
+ <software name="chpgolfa" cloneof="chpgolf">
<description>Championship Golf</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1988</year>
+ <publisher>D&amp;H Games</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="45340">
<rom name="championship golf.tzx" size="45340" crc="a38eab36" sha1="3fad58c4dc80b45e2486e08570a0052d5aa09516"/>
@@ -51754,7 +51759,18 @@ license:CC0
</part>
</software>
- <software name="champion_ac" cloneof="champion">
+ <software name="chpgolfb" cloneof="chpgolf">
+ <description>Championship Golf (Cult)</description>
+ <year>1988</year>
+ <publisher>Cult Games</publisher>
+ <part name="cass" interface="spectrum_cass">
+ <dataarea name="cass" size="45359">
+ <rom name="championship golf (cult).tzx" size="45359" crc="0b775634" sha1="18f079c97a631f2ecaa374d24fb5178ccd4d2ce8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chsoccer">
<description>Championship Soccer</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -52686,7 +52702,7 @@ license:CC0
</software>
<software name="churchof">
- <description>Church Of Death (set 2)</description>
+ <description>Church of Death (set 2)</description>
<year>1992</year>
<publisher>Sinclair User</publisher>
<part name="cass" interface="spectrum_cass">
@@ -52697,7 +52713,7 @@ license:CC0
</software>
<software name="churchof_a" cloneof="churchof">
- <description>Church Of Death</description>
+ <description>Church of Death</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -52880,7 +52896,7 @@ license:CC0
</software>
<software name="cityofde">
- <description>City Of Death</description>
+ <description>City of Death</description>
<year>1985</year>
<publisher>Red Shift</publisher>
<part name="cass" interface="spectrum_cass">
@@ -53443,7 +53459,7 @@ license:CC0
</software>
<software name="clucheso">
- <description>Cluches Of The Balrog</description>
+ <description>Cluches of the Balrog</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -54520,7 +54536,7 @@ license:CC0
</software>
<software name="conquero">
- <description>Conquerors Of Space</description>
+ <description>Conquerors of Space</description>
<year>1984</year>
<publisher>Duncan Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -55046,7 +55062,7 @@ license:CC0
</software>
<software name="corridor">
- <description>Corridors Of Genon</description>
+ <description>Corridors of Genon</description>
<year>1983</year>
<publisher>New Generation</publisher>
<part name="cass" interface="spectrum_cass">
@@ -55538,7 +55554,7 @@ license:CC0
</software>
<software name="countrie">
- <description>Countries Of The World</description>
+ <description>Countries of the World</description>
<year>1982</year>
<publisher>Hewson Consultants</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -56786,9 +56802,9 @@ license:CC0
</software>
<software name="crystals">
- <description>Crystals Of Doom (set 2)</description>
+ <description>Crystals of Doom (alt)</description>
<year>1985</year>
- <publisher>Assassin Time</publisher>
+ <publisher>Time Assassin</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="46400">
<rom name="crystals of doom - alternate.tzx" size="46400" crc="7c40c11e" sha1="6237c85f84d4902d7279e786577e835a52addc61"/>
@@ -56797,7 +56813,7 @@ license:CC0
</software>
<software name="crystals_a" cloneof="crystals">
- <description>Crystals Of Doom</description>
+ <description>Crystals of Doom</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -56807,10 +56823,10 @@ license:CC0
</part>
</software>
- <software name="crystals_b" cloneof="crystals">
- <description>Crystals Of Kings</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="cryskings">
+ <description>Crystals of Kings</description>
+ <year>1993</year>
+ <publisher>Zenobi Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="54818">
<rom name="crystals of kings - part 1.tzx" size="54818" crc="d22a8756" sha1="d5c9c0bcf4c14351ff8bb15e1345067c31371c80"/>
@@ -57026,7 +57042,7 @@ license:CC0
</software>
<software name="curseoft">
- <description>Curse Of The Serpents Eye (set 2)</description>
+ <description>Curse of the Serpents Eye (set 2)</description>
<year>1993</year>
<publisher>Dream World Adventures</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57037,7 +57053,7 @@ license:CC0
</software>
<software name="curseoft_a" cloneof="curseoft">
- <description>Curse Of The Serpents Eye</description>
+ <description>Curse of the Serpents Eye</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57047,10 +57063,10 @@ license:CC0
</part>
</software>
- <software name="curseoft_b" cloneof="curseoft">
- <description>Curse Of The Seven Faces (Artic)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="cursesf">
+ <description>Curse of the Seven Faces</description>
+ <year>1985</year>
+ <publisher>Artic Computing</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="45577">
<rom name="curse of the seven faces (artic).tzx" size="45577" crc="c450abd2" sha1="9efd53843b3a9305876d23d999669e7e645fafde"/>
@@ -57058,10 +57074,10 @@ license:CC0
</part>
</software>
- <software name="curseoft_c" cloneof="curseoft">
- <description>Curse Of The Seven Faces</description>
+ <software name="cursesfa" cloneof="cursesf">
+ <description>Curse of the Seven Faces (Imperial)</description>
<year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <publisher>Imperial Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="47947">
<rom name="curse of the seven faces.tzx" size="47947" crc="a3c57ab8" sha1="bebb159fd0e97bb6d49fb8936f74ce6a69d09e0a"/>
@@ -57506,7 +57522,7 @@ license:CC0
</software>
<software name="thecalli">
- <description>The Calling Of The Demon (Adventure Workshop) - 128k</description>
+ <description>The Calling of the Demon (128K, Adventure Workshop)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57517,7 +57533,7 @@ license:CC0
</software>
<software name="thecalli_a" cloneof="thecalli">
- <description>The Calling Of The Demon (Adventure Workshop) - 48k</description>
+ <description>The Calling of the Demon (48K, Adventure Workshop)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57528,7 +57544,7 @@ license:CC0
</software>
<software name="thecalli_b" cloneof="thecalli">
- <description>The Calling Of The Demon - 128k</description>
+ <description>The Calling of the Demon (128K)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57539,7 +57555,7 @@ license:CC0
</software>
<software name="thecalli_c" cloneof="thecalli">
- <description>The Calling Of The Demon - 48k</description>
+ <description>The Calling of the Demon (48K)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57563,7 +57579,7 @@ license:CC0
<software name="beheadsm">
- <description>The Case Of The Beheaded Smuggler (set 1)</description>
+ <description>The Case of the Beheaded Smuggler (set 1)</description>
<year>1988</year>
<publisher>Mental Images</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57574,7 +57590,7 @@ license:CC0
</software>
<software name="beheadsmz" cloneof="beheadsm">
- <description>The Case Of The Beheaded Smuggler (set 2, Zenobi)</description>
+ <description>The Case of the Beheaded Smuggler (set 2, Zenobi)</description>
<year>1988</year>
<publisher>Mental Images / Zenobi</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -57590,7 +57606,7 @@ license:CC0
</software>
<software name="mxshymer">
- <description>The Case Of The Mixed-Up Shymer (set 1)</description>
+ <description>The Case of the Mixed-Up Shymer (set 1)</description>
<year>1987</year>
<publisher>Atlas Adventure Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57601,7 +57617,7 @@ license:CC0
</software>
<software name="mxshymera" cloneof="mxshymer">
- <description>The Case Of The Mixed-Up Shymer (set 2)</description>
+ <description>The Case of the Mixed-Up Shymer (set 2)</description>
<year>1987</year>
<publisher>Atlas Adventure Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57612,7 +57628,7 @@ license:CC0
</software>
<software name="mxshymerb" cloneof="mxshymer">
- <description>The Case Of The Mixed-Up Shymer (set 3, Adventure Probe)</description>
+ <description>The Case of the Mixed-Up Shymer (set 3, Adventure Probe)</description>
<year>1987</year>
<publisher>Atlas Adventure Software / Adventure Probe</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57623,7 +57639,7 @@ license:CC0
</software>
<software name="mural">
- <description>The Case Of The Obscene Mural (set 1)</description>
+ <description>The Case of the Obscene Mural (set 1)</description>
<year>1986</year>
<publisher>Encief Routines</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57634,7 +57650,7 @@ license:CC0
</software>
<software name="murala" cloneof="mural">
- <description>The Case Of The Obscene Mural (set 2)</description>
+ <description>The Case of the Obscene Mural (set 2)</description>
<year>1986</year>
<publisher>Encief Routines</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57645,7 +57661,7 @@ license:CC0
</software>
<software name="muralb" cloneof="mural">
- <description>The Case Of The Obscene Mural (set 3)</description>
+ <description>The Case of the Obscene Mural (set 3)</description>
<year>1986</year>
<publisher>Encief Routines</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57656,7 +57672,7 @@ license:CC0
</software>
<software name="muralc" cloneof="mural">
- <description>The Case Of The Obscene Mural (set 4)</description>
+ <description>The Case of the Obscene Mural (set 4)</description>
<year>1986</year>
<publisher>Encief Routines</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57667,7 +57683,7 @@ license:CC0
</software>
<software name="cstldoom">
- <description>The Castle Of Doom</description>
+ <description>The Castle of Doom</description>
<year>1989</year>
<publisher>Fantasy Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57689,7 +57705,7 @@ license:CC0
</software>
<software name="caveskul">
- <description>The Caves Of Skull</description>
+ <description>The Caves of Skull</description>
<year>1995</year>
<publisher>Dream World Adventures</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57854,7 +57870,7 @@ license:CC0
</software>
<software name="thecityo">
- <description>The City Of Ehdollah</description>
+ <description>The City of Ehdollah</description>
<year>1984</year>
<publisher>Goldstar</publisher>
<part name="cass" interface="spectrum_cass">
@@ -57876,9 +57892,9 @@ license:CC0
</software>
<software name="theclaws">
- <description>The Claws Of Despair - Text Only</description>
+ <description>The Claws of Despair (text only)</description>
<year>1986</year>
- <publisher>Players</publisher>
+ <publisher>Players Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="41737">
<rom name="the claws of despair - text only.tzx" size="41737" crc="efcc701a" sha1="7c8c93209976c5c5e718fabda2df3887e6839d3a"/>
@@ -57887,9 +57903,9 @@ license:CC0
</software>
<software name="theclaws_a" cloneof="theclaws">
- <description>The Claws Of Despair</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>The Claws of Despair</description>
+ <year>1986</year>
+ <publisher>Players Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="47689">
<rom name="the claws of despair.tzx" size="47689" crc="ce83047a" sha1="19c84b3c02f22c1823169771218458b86d3da572"/>
@@ -57974,7 +57990,7 @@ license:CC0
</software>
<software name="thecolou">
- <description>The Colour Of Magic (Alternative)</description>
+ <description>The Colour of Magic (Alternative)</description>
<year>1987</year>
<publisher>Alternative Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -57990,7 +58006,7 @@ license:CC0
</software>
<software name="thecolou_b" cloneof="thecolou">
- <description>The Colour Of Magic (set 2)</description>
+ <description>The Colour of Magic (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -58001,7 +58017,7 @@ license:CC0
</software>
<software name="thecolou_c" cloneof="thecolou">
- <description>The Colour Of Magic</description>
+ <description>The Colour of Magic</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -58092,7 +58108,7 @@ license:CC0
</software>
<software name="crwnlith">
- <description>The Crown Of Lithrune</description>
+ <description>The Crown of Lithrune</description>
<year>1984</year>
<publisher>Herron Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -58192,7 +58208,7 @@ license:CC0
</software>
<software name="cryschan">
- <description>The Crystal Of Chantie (set 1)</description>
+ <description>The Crystal of Chantie (set 1)</description>
<year>1987</year>
<publisher>Pelagon Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -58203,7 +58219,7 @@ license:CC0
</software>
<software name="cryschana" cloneof="cryschan">
- <description>The Crystal Of Chantie (set 2)</description>
+ <description>The Crystal of Chantie (set 2)</description>
<year>1987</year>
<publisher>Pelagon Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -58214,7 +58230,7 @@ license:CC0
</software>
<software name="cryschanb" cloneof="cryschan">
- <description>The Crystal Of Chantie (set 3)</description>
+ <description>The Crystal of Chantie (set 3)</description>
<year>1987</year>
<publisher>Pelagon Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -58225,7 +58241,7 @@ license:CC0
</software>
<software name="cryspwr">
- <description>The Crystal Of Power</description>
+ <description>The Crystal of Power</description>
<year>1989</year>
<publisher>Fantasy Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -58247,7 +58263,7 @@ license:CC0
</software>
<software name="ccalutha">
- <description>The Curse Of Calutha</description>
+ <description>The Curse of Calutha</description>
<year>1991</year>
<publisher>Zenobi Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -58263,7 +58279,7 @@ license:CC0
</software>
<software name="cnimue">
- <description>The Curse Of Nimue (set 1)</description>
+ <description>The Curse of Nimue (set 1)</description>
<year>1995</year>
<publisher>Zenobi Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -58279,7 +58295,7 @@ license:CC0
</software>
<software name="cnimuea" cloneof="cnimue">
- <description>The Curse Of Nimue (set 2)</description>
+ <description>The Curse of Nimue (set 2)</description>
<year>1995</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -58290,7 +58306,7 @@ license:CC0
</software>
<software name="cnimueb" cloneof="cnimue">
- <description>The Curse Of Nimue (set 3, Adventure Probe)</description>
+ <description>The Curse of Nimue (set 3, Adventure Probe)</description>
<year>1995</year>
<publisher>Zenobi Software / Adventure Probe</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -58306,7 +58322,7 @@ license:CC0
</software>
<software name="shaleth">
- <description>The Curse Of Shaleth (set 1)</description>
+ <description>The Curse of Shaleth (set 1)</description>
<year>1985</year>
<publisher>Central Solutions</publisher>
<part name="cass" interface="spectrum_cass">
@@ -58317,7 +58333,7 @@ license:CC0
</software>
<software name="shaletha" cloneof="shaleth">
- <description>The Curse Of Shaleth (set 2)</description>
+ <description>The Curse of Shaleth (set 2)</description>
<year>1985</year>
<publisher>Central Solutions</publisher>
<part name="cass" interface="spectrum_cass">
@@ -58328,7 +58344,7 @@ license:CC0
</software>
<software name="shalethb" cloneof="shaleth">
- <description>The Curse Of Shaleth (set 3)</description>
+ <description>The Curse of Shaleth (set 3)</description>
<year>1985</year>
<publisher>Central Solutions</publisher>
<part name="cass" interface="spectrum_cass">
@@ -58339,7 +58355,7 @@ license:CC0
</software>
<software name="sherwood">
- <description>The Curse Of Sherwood</description>
+ <description>The Curse of Sherwood</description>
<year>1987</year>
<publisher>Mastertronic</publisher>
<part name="cass" interface="spectrum_cass">
@@ -59173,7 +59189,7 @@ license:CC0
</software>
<software name="dayofthe">
- <description>Day Of The Match</description>
+ <description>Day of the Match</description>
<year>1983</year>
<publisher>Video</publisher>
<part name="cass" interface="spectrum_cass">
@@ -59195,7 +59211,7 @@ license:CC0
</software>
<software name="daysofth">
- <description>Days Of Thunder</description>
+ <description>Days of Thunder</description>
<year>1990</year>
<publisher>Mindscape International</publisher>
<part name="cass" interface="spectrum_cass">
@@ -59686,7 +59702,7 @@ license:CC0
</software>
<software name="deceptio">
- <description>Deception Of The Minds Eye</description>
+ <description>Deception of the Minds Eye</description>
<year>1993</year>
<publisher>Electric Storm Productions</publisher>
<part name="cass" interface="spectrum_cass">
@@ -60658,7 +60674,7 @@ license:CC0
</software>
<software name="devilsof">
- <description>Devils Of The Deep</description>
+ <description>Devils of the Deep</description>
<year>1983</year>
<publisher>Richard Shepherd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -61487,7 +61503,7 @@ license:CC0
</software>
<software name="discsofd">
- <description>Discs Of Death (Tynesoft)</description>
+ <description>Discs of Death (Tynesoft)</description>
<year>1985</year>
<publisher>Tynesoft</publisher>
<part name="cass" interface="spectrum_cass">
@@ -61498,7 +61514,7 @@ license:CC0
</software>
<software name="discsofd_a" cloneof="discsofd">
- <description>Discs Of Death</description>
+ <description>Discs of Death</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -61520,7 +61536,7 @@ license:CC0
</software>
<software name="diseases">
- <description>Diseases Of The Heart</description>
+ <description>Diseases of the Heart</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -61536,7 +61552,7 @@ license:CC0
</software>
<software name="disenado">
- <description>Disenador De Juegos (Investronica)</description>
+ <description>Disenador de Juegos (Investronica)</description>
<year>1983</year>
<publisher>Investronica</publisher>
<part name="cass" interface="spectrum_cass">
@@ -61547,7 +61563,7 @@ license:CC0
</software>
<software name="disenado_a" cloneof="disenado">
- <description>Disenador De Juegos (Microbyte)</description>
+ <description>Disenador de Juegos (Microbyte)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -62915,7 +62931,7 @@ license:CC0
</software>
<software name="dragonso">
- <description>Dragons Of Flame (Kixx)</description>
+ <description>Dragons of Flame (Kixx)</description>
<year>1990</year>
<publisher>Kixx</publisher>
<part name="cass" interface="spectrum_cass">
@@ -62926,7 +62942,7 @@ license:CC0
</software>
<software name="dragonso_a" cloneof="dragonso">
- <description>Dragons Of Flame</description>
+ <description>Dragons of Flame</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -63337,7 +63353,7 @@ license:CC0
</software>
<software name="dukesofh">
- <description>Dukes Of Hazzard</description>
+ <description>Dukes of Hazzard</description>
<year>1985</year>
<publisher>Elite Systems</publisher>
<part name="cass" interface="spectrum_cass">
@@ -63474,7 +63490,7 @@ license:CC0
</software>
<software name="dungeono">
- <description>Dungeon Of Death</description>
+ <description>Dungeon of Death</description>
<year>1989</year>
<publisher>Exclusive</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -63501,7 +63517,7 @@ license:CC0
</software>
<software name="dungeons_a" cloneof="dungeons">
- <description>Dungeons Of Doom</description>
+ <description>Dungeons of Doom</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -63911,7 +63927,7 @@ license:CC0
</software>
<software name="thedestr">
- <description>The Destruction Of The Galactic Empire (set 2)</description>
+ <description>The Destruction of the Galactic Empire (set 2)</description>
<year>1984</year>
<publisher>David Ashton, Grant Wilson</publisher>
<part name="cass" interface="spectrum_cass">
@@ -63922,7 +63938,7 @@ license:CC0
</software>
<software name="thedestr_a" cloneof="thedestr">
- <description>The Destruction Of The Galactic Empire</description>
+ <description>The Destruction of the Galactic Empire</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -64054,7 +64070,7 @@ license:CC0
</software>
<software name="thedomes">
- <description>The Domes Of Sha (set 2)</description>
+ <description>The Domes of Sha (set 2)</description>
<year>1988</year>
<publisher>River</publisher>
<part name="cass" interface="spectrum_cass">
@@ -64065,7 +64081,7 @@ license:CC0
</software>
<software name="thedomes_a" cloneof="thedomes">
- <description>The Domes Of Sha</description>
+ <description>The Domes of Sha</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -64153,7 +64169,7 @@ license:CC0
</software>
<software name="thedrago">
- <description>The Dragon Of Notacare (set 2)</description>
+ <description>The Dragon of Notacare (set 2)</description>
<year>1986</year>
<publisher>The Guild</publisher>
<part name="cass" interface="spectrum_cass">
@@ -64164,7 +64180,7 @@ license:CC0
</software>
<software name="thedrago_a" cloneof="thedrago">
- <description>The Dragon Of Notacare</description>
+ <description>The Dragon of Notacare</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -64332,7 +64348,7 @@ license:CC0
</software>
<software name="thedunge_k" cloneof="thedunge">
- <description>The Dungeon Of Torgar (Adventure Workshop)</description>
+ <description>The Dungeon of Torgar (Adventure Workshop)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -64343,7 +64359,7 @@ license:CC0
</software>
<software name="thedunge_l" cloneof="thedunge">
- <description>The Dungeon Of Torgar (set 2)</description>
+ <description>The Dungeon of Torgar (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -64354,7 +64370,7 @@ license:CC0
</software>
<software name="thedunge_m" cloneof="thedunge">
- <description>The Dungeon Of Torgar</description>
+ <description>The Dungeon of Torgar</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -64376,7 +64392,7 @@ license:CC0
</software>
<software name="thedunge_o" cloneof="thedunge">
- <description>The Dungeons Of Maldread</description>
+ <description>The Dungeons of Maldread</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -64795,23 +64811,23 @@ license:CC0
</software>
<software name="eddiekid">
- <description>Eddie Kidd Jump Challenge (Ricochet)</description>
+ <description>Eddie Kidd Jump Challenge</description>
<year>1984</year>
- <publisher>Ricochet</publisher>
+ <publisher>Martech Games</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="46800">
- <rom name="eddie kidd jump challenge (ricochet).tzx" size="46800" crc="7b6be208" sha1="920265b642b0e70629aa3a20166080c58ac4e00b"/>
+ <dataarea name="cass" size="32300">
+ <rom name="eddie kidd jump challenge.tzx" size="32300" crc="b240b845" sha1="bc4a1c7c0410526247f37c1a5f98867444d28c8d"/>
</dataarea>
</part>
</software>
- <software name="eddiekid_a" cloneof="eddiekid">
- <description>Eddie Kidd Jump Challenge</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="eddiekida" cloneof="eddiekid">
+ <description>Eddie Kidd Jump Challenge (Ricochet)</description>
+ <year>1984</year>
+ <publisher>Ricochet</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="32300">
- <rom name="eddie kidd jump challenge.tzx" size="32300" crc="b240b845" sha1="bc4a1c7c0410526247f37c1a5f98867444d28c8d"/>
+ <dataarea name="cass" size="46800">
+ <rom name="eddie kidd jump challenge (ricochet).tzx" size="46800" crc="7b6be208" sha1="920265b642b0e70629aa3a20166080c58ac4e00b"/>
</dataarea>
</part>
</software>
@@ -65007,7 +65023,7 @@ license:CC0
</software>
<software name="eldorado">
- <description>El Dorado (set 2)</description>
+ <description>El Dorado (alt)</description>
<year>1985</year>
<publisher>Atlantis</publisher>
<part name="cass" interface="spectrum_cass">
@@ -65019,8 +65035,8 @@ license:CC0
<software name="eldorado_a" cloneof="eldorado">
<description>El Dorado</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1985</year>
+ <publisher>Atlantis</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="42468">
<rom name="el dorado.tzx" size="42468" crc="c7807be0" sha1="3a49ae9909bc873ec02fe9a1f8f0dd6a47132125"/>
@@ -65176,22 +65192,6 @@ license:CC0
</part>
</software>
- <software name="electra9">
- <description>Electra 9000</description>
- <year>1987</year>
- <publisher>Alternative Software</publisher>
- <part name="cass1" interface="spectrum_cass">
- <dataarea name="cass" size="9774">
- <rom name="electra 9000 - side 1.tzx" size="9774" crc="b56e720f" sha1="1747480c87f12c6ba5717b9c8387497f7f4b9c3a"/>
- </dataarea>
- </part>
- <part name="cass2" interface="spectrum_cass">
- <dataarea name="cass" size="25336">
- <rom name="electra 9000 - side 2.tzx" size="25336" crc="cbf6d1e4" sha1="c3f395b3849c05e6d247bd276adadedbfdd7c403"/>
- </dataarea>
- </part>
- </software>
-
<software name="electro">
<description>Electro</description>
<year>1984</year>
@@ -65276,8 +65276,8 @@ license:CC0
<software name="eliminat_a" cloneof="eliminat">
<description>Eliminator (Players)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1988</year>
+ <publisher>Players Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="44902">
<rom name="eliminator (players).tzx" size="44902" crc="de8cb90b" sha1="28840dfb28badeaf5c6d622d869777ea34fdad43"/>
@@ -65285,10 +65285,10 @@ license:CC0
</part>
</software>
- <software name="eliminat_b" cloneof="eliminat">
+ <software name="elimntor">
<description>Eliminator</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1988</year>
+ <publisher>Alternative Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="30540">
<rom name="eliminator.tzx" size="30540" crc="b5d91d68" sha1="9c6ab2738f3a415eec2493dd6ad2fc7a9eff1706"/>
@@ -65307,8 +65307,8 @@ license:CC0
</part>
</software>
- <software name="elite128">
- <description>Elite - 128k</description>
+ <software name="elite">
+ <description>Elite (128K)</description>
<year>1985</year>
<publisher>Firebird Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -65318,10 +65318,10 @@ license:CC0
</part>
</software>
- <software name="elite48k">
- <description>Elite - 48k</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="elite48" cloneof="elite">
+ <description>Elite (48K)</description>
+ <year>1985</year>
+ <publisher>Firebird Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="65157">
<rom name="elite - 48k - side a.tzx" size="65157" crc="1a6c55d9" sha1="f56bb775dc9514109437529161778d51d68fd465"/>
@@ -65444,21 +65444,21 @@ license:CC0
</part>
</software>
- <software name="emiliobu">
- <description>Emilio Butragueno 2 (Erbe - Serie Leyenda)</description>
- <year>1989</year>
- <publisher>IBSA</publisher>
+ <software name="embutrag">
+ <description>Emilio Butragueno Futbol</description>
+ <year>1987</year>
+ <publisher>Topo Soft / Ocean</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="45613">
- <rom name="emilio butragueno 2 (erbe - serie leyenda).tzx" size="45613" crc="fc768e43" sha1="7c2c210c710aa3edb146496d1185a110aca46229"/>
+ <dataarea name="cass" size="49995">
+ <rom name="emilio butragueno futbol.tzx" size="49995" crc="321b4fbd" sha1="e98d6705057180a3225a43dfacec194f56bab030"/>
</dataarea>
</part>
</software>
- <software name="emiliobu_a" cloneof="emiliobu">
+ <software name="embutrg2">
<description>Emilio Butragueno Futbol 2</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1989</year>
+ <publisher>Erbe Software / Ocean</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="105774">
<rom name="emilio butragueno futbol 2 - tape 1 entrenamiento.tzx" size="105774" crc="84e7d300" sha1="e9bb723bbe3e376091474b67dd42566de3033dd3"/>
@@ -65471,13 +65471,13 @@ license:CC0
</part>
</software>
- <software name="emiliobu_c" cloneof="emiliobu">
- <description>Emilio Butragueno Futbol</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="embutrg2a" cloneof="embutrg2">
+ <description>Emilio Butragueno 2 (Erbe - Serie Leyenda)</description>
+ <year>1989</year>
+ <publisher>IBSA</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="49995">
- <rom name="emilio butragueno futbol.tzx" size="49995" crc="321b4fbd" sha1="e98d6705057180a3225a43dfacec194f56bab030"/>
+ <dataarea name="cass" size="45613">
+ <rom name="emilio butragueno 2 (erbe - serie leyenda).tzx" size="45613" crc="fc768e43" sha1="7c2c210c710aa3edb146496d1185a110aca46229"/>
</dataarea>
</part>
</software>
@@ -66297,7 +66297,7 @@ license:CC0
</software>
<software name="equation">
- <description>Equation Of A Line</description>
+ <description>Equation of a Line</description>
<year>1983</year>
<publisher>Scotsoft</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -66351,7 +66351,7 @@ license:CC0
</software>
<software name="eraofenc">
- <description>Era Of Enchantment</description>
+ <description>Era of Enchantment</description>
<year>1988</year>
<publisher>Sacred Scroll</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -66383,7 +66383,7 @@ license:CC0
</software>
<software name="erikthep">
- <description>Erik - The Phantom Of The Opera (199 Range)</description>
+ <description>Erik - The Phantom of the Opera (199 Range)</description>
<year>1987</year>
<publisher>Pirate Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -66394,7 +66394,7 @@ license:CC0
</software>
<software name="erikthep_a" cloneof="erikthep">
- <description>Erik - The Phantom Of The Opera (System 4)</description>
+ <description>Erik - The Phantom of the Opera (System 4)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -66405,7 +66405,7 @@ license:CC0
</software>
<software name="erikthep_b" cloneof="erikthep">
- <description>Erik - The Phantom Of The Opera</description>
+ <description>Erik - The Phantom of the Opera</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -66706,7 +66706,7 @@ license:CC0
</software>
<software name="escapefr_v" cloneof="escapefr">
- <description>Escape From The Planet Of The Robot Monsters (The Hit Squad)</description>
+ <description>Escape From The Planet of the Robot Monsters (The Hit Squad)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -66717,7 +66717,7 @@ license:CC0
</software>
<software name="escapefr_w" cloneof="escapefr">
- <description>Escape From The Planet Of The Robot Monsters (Erbe)</description>
+ <description>Escape From The Planet of the Robot Monsters (Erbe)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -66733,7 +66733,7 @@ license:CC0
</software>
<software name="escapefr_y" cloneof="escapefr">
- <description>Escape From The Shire</description>
+ <description>Escape from the Shire</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -66744,7 +66744,7 @@ license:CC0
</software>
<software name="escapefr_z" cloneof="escapefr">
- <description>Escape From Time</description>
+ <description>Escape from Time</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -66755,7 +66755,7 @@ license:CC0
</software>
<software name="escapein">
- <description>Escape Into Space</description>
+ <description>Escape into Space</description>
<year>1987</year>
<publisher>Kelsoft</publisher>
<part name="cass" interface="spectrum_cass">
@@ -66777,7 +66777,7 @@ license:CC0
</software>
<software name="escapeto">
- <description>Escape To Eskelos</description>
+ <description>Escape to Eskelos</description>
<year>1987</year>
<publisher>Brian Parks</publisher>
<part name="cass" interface="spectrum_cass">
@@ -67315,7 +67315,7 @@ license:CC0
</software>
<software name="evilreal">
- <description>Evil Realm Of Darkness</description>
+ <description>Evil Realm of Darkness</description>
<year>1985</year>
<publisher>Turtle</publisher>
<part name="cass" interface="spectrum_cass">
@@ -67364,7 +67364,7 @@ license:CC0
</software>
<software name="excalibu">
- <description>Excalibur - Sword Of Kings (set 2)</description>
+ <description>Excalibur - Sword of Kings (set 2)</description>
<year>1987</year>
<publisher>Alternative Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -67375,7 +67375,7 @@ license:CC0
</software>
<software name="excalibu_a" cloneof="excalibu">
- <description>Excalibur - Sword Of Kings</description>
+ <description>Excalibur - Sword of Kings</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -67613,7 +67613,7 @@ license:CC0
</software>
<software name="eyeofthe">
- <description>Eye Of The Star Warrior (set 2)</description>
+ <description>Eye of the Star Warrior (set 2)</description>
<year>1984</year>
<publisher>Sunshine Books</publisher>
<part name="cass" interface="spectrum_cass">
@@ -67624,7 +67624,7 @@ license:CC0
</software>
<software name="eyeofthe_a" cloneof="eyeofthe">
- <description>Eye Of The Star Warrior</description>
+ <description>Eye of the Star Warrior</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -67635,7 +67635,7 @@ license:CC0
</software>
<software name="eyeofvar">
- <description>Eye Of Vartan (set 3)</description>
+ <description>Eye of Vartan (set 3)</description>
<year>1985</year>
<publisher>Pocket Money</publisher>
<part name="cass" interface="spectrum_cass">
@@ -67646,7 +67646,7 @@ license:CC0
</software>
<software name="eyeofvar_a" cloneof="eyeofvar">
- <description>Eye Of Vartan (set 2)</description>
+ <description>Eye of Vartan (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -67657,7 +67657,7 @@ license:CC0
</software>
<software name="eyeofvar_b" cloneof="eyeofvar">
- <description>Eye Of Vartan</description>
+ <description>Eye of Vartan</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -68494,7 +68494,7 @@ license:CC0
</software>
<software name="fatherof">
- <description>Father Of Darkness (set 3)</description>
+ <description>Father of Darkness (set 3)</description>
<year>1984</year>
<publisher>Central Solutions</publisher>
<part name="cass" interface="spectrum_cass">
@@ -68505,7 +68505,7 @@ license:CC0
</software>
<software name="fatherof_a" cloneof="fatherof">
- <description>Father Of Darkness (set 2)</description>
+ <description>Father of Darkness (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -68516,7 +68516,7 @@ license:CC0
</software>
<software name="fatherof_b" cloneof="fatherof">
- <description>Father Of Darkness</description>
+ <description>Father of Darkness</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -70137,7 +70137,7 @@ license:CC0
</software>
<software name="fboty">
- <description>Footballer Of The Year (set 1)</description>
+ <description>Footballer of the Year (set 1)</description>
<year>1986</year>
<publisher>Gremlin Graphics Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -70148,7 +70148,7 @@ license:CC0
</software>
<software name="fbotya" cloneof="fboty">
- <description>Footballer Of The Year (set 2, Kixx)</description>
+ <description>Footballer of the Year (set 2, Kixx)</description>
<year>1986</year>
<publisher>Gremlin Graphics Software Ltd / Kixx</publisher>
<part name="cass" interface="spectrum_cass">
@@ -70159,7 +70159,7 @@ license:CC0
</software>
<software name="fboty2">
- <description>Footballer Of The Year 2 (set 1)</description>
+ <description>Footballer of the Year 2 (set 1)</description>
<year>1989</year>
<publisher>Gremlin Graphics Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -70170,7 +70170,7 @@ license:CC0
</software>
<software name="fboty2a" cloneof="fboty2">
- <description>Footballer Of The Year 2 (set 2, GBH)</description>
+ <description>Footballer of the Year 2 (set 2, GBH)</description>
<year>1989</year>
<publisher>Gremlin Graphics Software Ltd / GBH</publisher>
<part name="cass" interface="spectrum_cass">
@@ -70192,7 +70192,7 @@ license:CC0
</software>
<software name="forgoldo">
- <description>For Gold Or Glory (set 2)</description>
+ <description>For Gold or Glory (set 2)</description>
<year>1988</year>
<publisher>Alternative Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -70203,7 +70203,7 @@ license:CC0
</software>
<software name="forgoldo_a" cloneof="forgoldo">
- <description>For Gold Or Glory</description>
+ <description>For Gold or Glory</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -70350,7 +70350,7 @@ license:CC0
</software>
<software name="flongshd">
- <description>Forest Of Long Shadows (set 1)</description>
+ <description>Forest of Long Shadows (set 1)</description>
<year>1986</year>
<publisher>Sinclair User</publisher>
<part name="cass" interface="spectrum_cass">
@@ -70361,7 +70361,7 @@ license:CC0
</software>
<software name="flongshda" cloneof="flongshd">
- <description>Forest Of Long Shadows (set 2, alt character set)</description>
+ <description>Forest of Long Shadows (set 2, alt character set)</description>
<year>1986</year>
<publisher>Sinclair User</publisher>
<part name="cass" interface="spectrum_cass">
@@ -70570,7 +70570,7 @@ license:CC0
</software>
<software name="frtfear"> <!-- never released -->
- <description>Fortress Of Fear</description>
+ <description>Fortress of Fear</description>
<year>1986</year>
<publisher>Adventure Probe Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -70581,7 +70581,7 @@ license:CC0
</software>
<software name="frtkeler">
- <description>Fortress Of Keler</description>
+ <description>Fortress of Keler</description>
<year>1985</year>
<publisher>Hamster Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -70886,7 +70886,7 @@ license:CC0
</software>
<software name="freedomo">
- <description>Freedom Of Scotland</description>
+ <description>Freedom of Scotland</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -71148,7 +71148,7 @@ license:CC0
</software>
<software name="fromouto">
- <description>From Out Of A Dark Night Sky (set 3)</description>
+ <description>From Out of a Dark Night Sky (set 3)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -71159,7 +71159,7 @@ license:CC0
</software>
<software name="fromouto_a" cloneof="fromouto">
- <description>From Out Of A Dark Night Sky (set 2)</description>
+ <description>From Out of a Dark Night Sky (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -71170,7 +71170,7 @@ license:CC0
</software>
<software name="fromouto_b" cloneof="fromouto">
- <description>From Out Of A Dark Night Sky</description>
+ <description>From Out of a Dark Night Sky</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -72068,7 +72068,7 @@ license:CC0
</software>
<software name="thefallo">
- <description>The Fall Of Rome</description>
+ <description>The Fall of Rome</description>
<year>1984</year>
<publisher>ASP</publisher>
<part name="cass" interface="spectrum_cass">
@@ -72090,7 +72090,7 @@ license:CC0
</software>
<software name="thefasta">
- <description>The Fast And The Furious</description>
+ <description>The Fast and the Furious</description>
<year>1987</year>
<publisher>Go</publisher>
<part name="cass" interface="spectrum_cass">
@@ -72271,7 +72271,7 @@ license:CC0
</software>
<software name="thefisto">
- <description>The Fist Of Fire</description>
+ <description>The Fist of Fire</description>
<year>1995</year>
<publisher>The Adventure Workshop</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -72364,7 +72364,7 @@ license:CC0
</software>
<software name="frstdoom">
- <description>The Forest Of Doom</description>
+ <description>The Forest of Doom</description>
<year>1984</year>
<publisher>Puffin Books</publisher>
<part name="cass" interface="spectrum_cass">
@@ -73208,7 +73208,7 @@ license:CC0
</software>
<software name="gatesofg">
- <description>Gates Of Garralon (set 2)</description>
+ <description>Gates of Garralon (set 2)</description>
<year>1984</year>
<publisher>Steven Cox</publisher>
<part name="cass" interface="spectrum_cass">
@@ -73219,7 +73219,7 @@ license:CC0
</software>
<software name="gatesofg_a" cloneof="gatesofg">
- <description>Gates Of Garralon</description>
+ <description>Gates of Garralon</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -73370,7 +73370,7 @@ license:CC0
</software>
<software name="gmeldir">
- <description>Gauntlet Of Meldir</description>
+ <description>Gauntlet of Meldir</description>
<year>1990</year>
<publisher>Sheila Hunt</publisher>
<part name="cass" interface="spectrum_cass">
@@ -73741,7 +73741,7 @@ license:CC0
</software>
<software name="ghosttow">
- <description>Ghost Town (set 2)</description>
+ <description>Ghost Town (alt)</description>
<year>1983</year>
<publisher>Virgin Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -73753,8 +73753,8 @@ license:CC0
<software name="ghosttow_a" cloneof="ghosttow">
<description>Ghost Town</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1983</year>
+ <publisher>Virgin Games</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="44054">
<rom name="ghost town.tzx" size="44054" crc="d98d7413" sha1="224450d1f8f77bb148cabe25fa40ee827bf31f3e"/>
@@ -74457,7 +74457,7 @@ license:CC0
</software>
<software name="goldenfi">
- <description>Golden Figures Of Death (set 2)</description>
+ <description>Golden Figures of Death (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -74468,7 +74468,7 @@ license:CC0
</software>
<software name="goldenfi_a" cloneof="goldenfi">
- <description>Golden Figures Of Death</description>
+ <description>Golden Figures of Death</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -75404,9 +75404,9 @@ license:CC0
</software>
<software name="greenson_a" cloneof="greenson">
- <description>Green Sonja - +D Bugfix (The Guild)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>Green Sonja (The Guild, bug fix)</description>
+ <year>1991</year>
+ <publisher>The Guild</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="28006">
<rom name="green sonja - +d bugfix (the guild).tzx" size="28006" crc="180d0c59" sha1="fb70adf0188979a5e9ccf120c1818ca7f2a46b1f"/>
@@ -75415,9 +75415,9 @@ license:CC0
</software>
<software name="greenson_b" cloneof="greenson">
- <description>Green Sonja</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>Green Sonja (within compilation "Adventure 10 Pack")</description>
+ <year>1991</year>
+ <publisher>Psychaedelic Hedgehog Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="28084">
<rom name="green sonja.tzx" size="28084" crc="678d660d" sha1="fe1e1d40e5cd82174b8ecadbc010fd5f12ac6b03"/>
@@ -76007,9 +76007,9 @@ license:CC0
</software>
<software name="gunship">
- <description>Gunship (set 1, 128k)</description>
+ <description>Gunship (128k)</description>
<year>1987</year>
- <publisher>MicroProse Software Ltd</publisher>
+ <publisher>MicroProse Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="103138">
<rom name="gunship - 128k.tzx" size="103138" crc="946d070d" sha1="760e7725f4c451ac852b1a7ec0dff72e0c6abf33"/>
@@ -76017,10 +76017,10 @@ license:CC0
</part>
</software>
- <software name="gunship48" cloneof="gunship">
- <description>Gunship (set 2, 48k)</description>
+ <software name="gunshipa" cloneof="gunship">
+ <description>Gunship (48k)</description>
<year>1987</year>
- <publisher>MicroProse Software Ltd</publisher>
+ <publisher>MicroProse Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="67915">
<rom name="gunship - 48k - tape 1 - side 1.tzx" size="67915" crc="5d2c1116" sha1="3a7fed96441b7db77a96620d466edd8f8f553f44"/>
@@ -76043,10 +76043,10 @@ license:CC0
</part>
</software>
- <software name="gunship48a" cloneof="gunship">
- <description>Gunship (set 3, 48k, Erbe)</description>
- <year>1987</year>
- <publisher>MicroProse Software Ltd / Erbe</publisher>
+ <software name="gunshipb" cloneof="gunship">
+ <description>Gunship (48k, Erbe)</description>
+ <year>1990</year>
+ <publisher>Erbe Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="74989">
<rom name="gunship - 48k - tape 1 - side 1 (erbe).tzx" size="74989" crc="fb8d4882" sha1="f1e92796cb9f7f539591070b85167c54ccd72a6d"/>
@@ -76069,10 +76069,10 @@ license:CC0
</part>
</software>
- <software name="gunship48b" cloneof="gunship">
- <description>Gunship (set 4, 48k, Kixx)</description>
+ <software name="gunshipc" cloneof="gunship">
+ <description>Gunship (Kixx)</description>
<year>1987</year>
- <publisher>MicroProse Software Ltd / Kixx</publisher>
+ <publisher>Kixx</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="67865">
<rom name="gunship - side 1 (kixx).tzx" size="67865" crc="4f8e8594" sha1="a26340b42c059ada30e3c6fd01970998f215ef98"/>
@@ -76318,7 +76318,7 @@ license:CC0
</software>
<software name="thegerbi">
- <description>The Gerbil Riot Of '67 (Adventure Workshop)</description>
+ <description>The Gerbil Riot of '67 (Adventure Workshop)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -76329,7 +76329,7 @@ license:CC0
</software>
<software name="thegerbi_a" cloneof="thegerbi">
- <description>The Gerbil Riot Of '67</description>
+ <description>The Gerbil Riot of '67</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -76448,7 +76448,7 @@ license:CC0
</software>
<software name="thegodso">
- <description>The Gods Of War - 128k (Zenobi)</description>
+ <description>The Gods of War - 128k (Zenobi)</description>
<year>1987</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -76459,7 +76459,7 @@ license:CC0
</software>
<software name="thegodso_b" cloneof="thegodso">
- <description>The Gods Of War - 48k (Zenobi)</description>
+ <description>The Gods of War - 48k (Zenobi)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -76475,7 +76475,7 @@ license:CC0
</software>
<software name="thegodso_a" cloneof="thegodso">
- <description>The Gods Of War - 128k</description>
+ <description>The Gods of War - 128k</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -76486,7 +76486,7 @@ license:CC0
</software>
<software name="thegodso_d" cloneof="thegodso">
- <description>The Gods Of War - 48k - Release 1</description>
+ <description>The Gods of War - 48k - Release 1</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -76497,7 +76497,7 @@ license:CC0
</software>
<software name="thegodso_e" cloneof="thegodso">
- <description>The Gods Of War - 48k - Release 2</description>
+ <description>The Gods of War - 48k - Release 2</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -76508,7 +76508,7 @@ license:CC0
</software>
<software name="thegodso_f" cloneof="thegodso">
- <description>The Gods Of War - 48k - Release 3</description>
+ <description>The Gods of War - 48k - Release 3</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -76676,7 +76676,7 @@ license:CC0
</software>
<software name="gbhakhor">
- <description>The Golden Sword Of Bhakhor</description>
+ <description>The Golden Sword of Bhakhor</description>
<year>1991</year>
<publisher>Zenobi Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -76692,7 +76692,7 @@ license:CC0
</software>
<software name="gbhakhora" cloneof="gbhakhor">
- <description>The Golden Sword Of Bhakhor (set 2)</description>
+ <description>The Golden Sword of Bhakhor (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -76703,7 +76703,7 @@ license:CC0
</software>
<software name="gbhakhorb" cloneof="gbhakhor">
- <description>The Golden Sword Of Bhakhor (set 3)</description>
+ <description>The Golden Sword of Bhakhor (set 3)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -76851,7 +76851,7 @@ license:CC0
<software name="gfol">
- <description>The Great Fire Of London</description>
+ <description>The Great Fire of London</description>
<year>1985</year>
<publisher>Rabbit</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -76955,7 +76955,7 @@ license:CC0
</software>
<software name="thegrowi">
- <description>The Growing Pains Of Adrian Mole (Ricochet)</description>
+ <description>The Growing Pains of Adrian Mole (Ricochet)</description>
<year>1987</year>
<publisher>Ricochet</publisher>
<part name="cass" interface="spectrum_cass">
@@ -76966,7 +76966,7 @@ license:CC0
</software>
<software name="thegrowi_a" cloneof="thegrowi">
- <description>The Growing Pains Of Adrian Mole</description>
+ <description>The Growing Pains of Adrian Mole</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -78037,7 +78037,7 @@ license:CC0
</software>
<software name="hellfire">
- <description>Hellfire (set 1)</description>
+ <description>Hellfire</description>
<year>1985</year>
<publisher>Melbourne House</publisher>
<part name="cass" interface="spectrum_cass">
@@ -78048,7 +78048,7 @@ license:CC0
</software>
<software name="hellfirea" cloneof="hellfire">
- <description>Hellfire (set 2, ABC Soft)</description>
+ <description>Hellfire (ABC Soft)</description>
<year>1985</year>
<publisher>Melbourne House / ABC Soft</publisher>
<part name="cass" interface="spectrum_cass">
@@ -78098,7 +78098,7 @@ license:CC0
</software>
<software name="helveram">
- <description>Helvera - Mistress Of The Park (Adventure Probe)</description>
+ <description>Helvera - Mistress of the Park (Adventure Probe)</description>
<year>1993</year>
<publisher>Adventure Probe</publisher>
<part name="cass" interface="spectrum_cass">
@@ -78109,7 +78109,7 @@ license:CC0
</software>
<software name="helveram_a" cloneof="helveram">
- <description>Helvera - Mistress Of The Park</description>
+ <description>Helvera - Mistress of the Park</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -78120,7 +78120,7 @@ license:CC0
</software>
<software name="henriett">
- <description>Henrietta's Book Of Spells</description>
+ <description>Henrietta's Book of Spells</description>
<year>1990</year>
<publisher>Scetlander</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -78276,7 +78276,7 @@ license:CC0
</software>
<software name="hercslay">
- <description>Hercules Slayer Of The Damned (set 1)</description>
+ <description>Hercules Slayer of the Damned (set 1)</description>
<year>1988</year>
<publisher>Gremlin Graphics Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -78287,7 +78287,7 @@ license:CC0
</software>
<software name="hercslaya" cloneof="hercslay">
- <description>Hercules Slayer Of The Damned (set 2, Byte-Back)</description>
+ <description>Hercules Slayer of the Damned (set 2, Byte-Back)</description>
<year>1988</year>
<publisher>Gremlin Graphics Software Ltd / Byte-Back</publisher>
<part name="cass" interface="spectrum_cass">
@@ -78450,7 +78450,7 @@ license:CC0
</software>
<software name="herokarn">
- <description>Heroes Of Karn (set 1)</description>
+ <description>Heroes of Karn (set 1)</description>
<year>1984</year>
<publisher>Interceptor Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -78461,7 +78461,7 @@ license:CC0
</software>
<software name="herokarna" cloneof="herokarn">
- <description>Heroes Of Karn (set 2)</description>
+ <description>Heroes of Karn (set 2)</description>
<year>1984</year>
<publisher>Interceptor Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -78473,7 +78473,7 @@ license:CC0
<software name="herolnce">
- <description>Heroes Of The Lance (set 1)</description>
+ <description>Heroes of the Lance</description>
<year>1988</year>
<publisher>U.S. Gold</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -78489,9 +78489,9 @@ license:CC0
</software>
<software name="herolncea" cloneof="herolnce">
- <description>Heroes Of The Lance (set 2, Kixx)</description>
+ <description>Heroes of the Lance (Kixx)</description>
<year>1988</year>
- <publisher>U.S. Gold Ltd / Kixx</publisher>
+ <publisher>Kixx</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="93037">
<rom name="heroes of the lance - side a (kixx).tzx" size="93037" crc="15455103" sha1="991b1e4ed9b98de31b491956cd2f30915ebdc51b"/>
@@ -78671,9 +78671,9 @@ license:CC0
</software>
<software name="highlo">
- <description>HIGHLO</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>HighLo</description>
+ <year>1982</year>
+ <publisher>Megadodo Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="7749">
<rom name="highlo.tzx" size="7749" crc="24b00421" sha1="3c5413c5dc9c4caf02ec22d78fa716f52dd5d785"/>
@@ -79797,7 +79797,7 @@ license:CC0
</software>
<software name="houndsof">
- <description>Hounds Of Hell (128k)</description>
+ <description>Hounds of Hell (128k)</description>
<year>1991</year>
<publisher>The Adventure Workshop</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -79813,7 +79813,7 @@ license:CC0
</software>
<software name="houseofh">
- <description>House Of Horrors (set 2)</description>
+ <description>House of Horrors (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -79824,7 +79824,7 @@ license:CC0
</software>
<software name="houseofh_a" cloneof="houseofh">
- <description>House Of Horrors</description>
+ <description>House of Horrors</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -79835,7 +79835,7 @@ license:CC0
</software>
<software name="houseofo">
- <description>House Of Orion</description>
+ <description>House of Orion</description>
<year>1984</year>
<publisher>Dave Newton</publisher>
<part name="cass" interface="spectrum_cass">
@@ -79845,19 +79845,8 @@ license:CC0
</part>
</software>
- <software name="houseofs">
- <description>House Of Shadows</description>
- <year>1983</year>
- <publisher>Shadow</publisher>
- <part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="41082">
- <rom name="house of shadows.tzx" size="41082" crc="3fc6c552" sha1="799ae23293836ac734af23b4e7fa6c8d59e7d959"/>
- </dataarea>
- </part>
- </software>
-
<software name="houseded">
- <description>House Of The Dead</description>
+ <description>House of the Dead</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -79867,19 +79856,8 @@ license:CC0
</part>
</software>
- <software name="hotld">
- <description>House Of The Living Dead</description>
- <year>1983</year>
- <publisher>Phipps Associates</publisher>
- <part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="29967">
- <rom name="house of the living dead.tzx" size="29967" crc="6c85f6a3" sha1="7df519680056341798850bca8e9c0939bebe8795"/>
- </dataarea>
- </part>
- </software>
-
<software name="houseout_a" cloneof="houseout">
- <description>House Out Of Town</description>
+ <description>House Out of Town</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -79890,7 +79868,7 @@ license:CC0
</software>
<software name="houseout">
- <description>House Out Of Town (Adventure Workshop)</description>
+ <description>House Out of Town (Adventure Workshop)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -79901,7 +79879,7 @@ license:CC0
</software>
<software name="htbcbast">
- <description>How To Be A Complete Bastard (set 1)</description>
+ <description>How To Be a Complete Bastard (set 1)</description>
<year>1987</year>
<publisher>Virgin Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -79912,7 +79890,7 @@ license:CC0
</software>
<software name="htbcbasta" cloneof="htbcbast">
- <description>How To Be A Complete Bastard (set 2, Ricochet)</description>
+ <description>How To Be a Complete Bastard (set 2, Ricochet)</description>
<year>1987</year>
<publisher>Virgin Games Ltd / Ricochet</publisher>
<part name="cass" interface="spectrum_cass">
@@ -79923,7 +79901,7 @@ license:CC0
</software>
<software name="how2hero">
- <description>How To Be A Hero</description>
+ <description>How To Be a Hero</description>
<year>1987</year>
<publisher>Mastertronic Added Dimension</publisher>
<part name="cass" interface="spectrum_cass">
@@ -79934,7 +79912,7 @@ license:CC0
</software>
<software name="howzat">
- <description>Howzat (set 1)</description>
+ <description>Howzat</description>
<year>1984</year>
<publisher>Wyvern Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -79945,9 +79923,9 @@ license:CC0
</software>
<software name="howzata" cloneof="howzat">
- <description>Howzat (set 2, Alternative)</description>
+ <description>Howzat (Alternative)</description>
<year>1984</year>
- <publisher>Wyvern Software / Alternative</publisher>
+ <publisher>Alternative</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="33277">
<rom name="howzat (alternative).tzx" size="33277" crc="2fc9e906" sha1="3919107c312811a632a12bf02a1c551b555495e6"/>
@@ -79956,7 +79934,7 @@ license:CC0
</software>
<software name="hrh">
- <description>H.R.H. - Her Royal Highness (set 1)</description>
+ <description>H.R.H. - Her Royal Highness</description>
<year>1986</year>
<publisher>8th Day Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -79972,9 +79950,9 @@ license:CC0
</software>
<software name="hrha" cloneof="hrh">
- <description>H.R.H. - Her Royal Highness (set 2, GI Games)</description>
+ <description>H.R.H. - Her Royal Highness (GI Games)</description>
<year>1986</year>
- <publisher>8th Day Software / GI Games</publisher>
+ <publisher>G.I. Games</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="42880">
<rom name="hrh (gi games).tzx" size="42880" crc="dc1b742d" sha1="b73096b5074c4da00b5f3a91c2217ac7b3196107"/>
@@ -80034,7 +80012,7 @@ license:CC0
<software name="hummerho">
- <description>Hummer House Of Horror</description>
+ <description>Hummer House of Horror</description>
<year>1983</year>
<publisher>Lasersound</publisher>
<part name="cass" interface="spectrum_cass">
@@ -80385,7 +80363,7 @@ license:CC0
</software>
<software name="thehalls">
- <description>The Halls Of Doom - Development Tape</description>
+ <description>The Halls of Doom - Development Tape</description>
<year>1988</year>
<publisher>R.D. Foord</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -80401,7 +80379,7 @@ license:CC0
</software>
<software name="thehalls_b" cloneof="thehalls">
- <description>The Halls Of Doom</description>
+ <description>The Halls of Doom</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -80412,7 +80390,7 @@ license:CC0
</software>
<software name="thehamme">
- <description>The Hammer Of Grimmold</description>
+ <description>The Hammer of Grimmold</description>
<year>1987</year>
<publisher>River</publisher>
<part name="cass" interface="spectrum_cass">
@@ -80423,7 +80401,7 @@ license:CC0
</software>
<software name="thehappi">
- <description>The Happiest Days Of Your Life</description>
+ <description>The Happiest Days of Your Life</description>
<year>1986</year>
<publisher>Firebird Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -80693,21 +80671,32 @@ license:CC0
</part>
</software>
- <software name="thehouse_a" cloneof="thehouse">
- <description>The House Jack Built</description>
+ <software name="thehouse_m" cloneof="thehouse">
+ <description>The House</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
+ <dataarea name="cass" size="36807">
+ <rom name="the house.tzx" size="36807" crc="f06ca56b" sha1="e2d9cef3822b148f029b60120a95b26e06ddcfe9"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="housjckb">
+ <description>The House Jack Built</description>
+ <year>1984</year>
+ <publisher>Thor Computer Software</publisher>
+ <part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="48920">
<rom name="the house jack built.tzx" size="48920" crc="c276ebe7" sha1="df647b370109ac4a93e880c238281eaa72b4eb19"/>
</dataarea>
</part>
</software>
- <software name="thehouse_b" cloneof="thehouse">
- <description>The House Of Lockerby</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="houslock">
+ <description>The House of Lockerby</description>
+ <year>2000</year>
+ <publisher>Adventure Probe Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="78385">
<rom name="the house of lockerby.tzx" size="78385" crc="a6d9ad37" sha1="79f356cb6ad7784ddd093290d21e5988b1190f9e"/>
@@ -80715,10 +80704,21 @@ license:CC0
</part>
</software>
- <software name="thehouse_c" cloneof="thehouse">
- <description>The House Of Shadows</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="housshad">
+ <description>The House of Shadows</description>
+ <year>1983</year>
+ <publisher>Shadow Software</publisher>
+ <part name="cass" interface="spectrum_cass">
+ <dataarea name="cass" size="41082">
+ <rom name="house of shadows.tzx" size="41082" crc="3fc6c552" sha1="799ae23293836ac734af23b4e7fa6c8d59e7d959"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="housshada" cloneof="housshad">
+ <description>The House of Shadows (alt)</description>
+ <year>1983</year>
+ <publisher>Shadow Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="40940">
<rom name="the house of shadows.tzx" size="40940" crc="83dc8155" sha1="2c975474e3da9c121c79ba3965f3fe0c40e2c6d2"/>
@@ -80726,10 +80726,10 @@ license:CC0
</part>
</software>
- <software name="thehouse_d" cloneof="thehouse">
- <description>The House Of The Living Dead</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="hslvdead">
+ <description>The House of the Living Dead</description>
+ <year>1983</year>
+ <publisher>Phipps Associates</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="29778">
<rom name="the house of the living dead.tzx" size="29778" crc="679117e4" sha1="c81683fbda6061b891455f95886693a2e3dc053f"/>
@@ -80737,10 +80737,32 @@ license:CC0
</part>
</software>
- <software name="thehouse_e" cloneof="thehouse">
- <description>The House On Damned Hill (set 2)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="hslvdeada" cloneof ="hslvdead">
+ <description>The House of the Living Dead (alt)</description>
+ <year>1983</year>
+ <publisher>Phipps Associates</publisher>
+ <part name="cass" interface="spectrum_cass">
+ <dataarea name="cass" size="29967">
+ <rom name="house of the living dead.tzx" size="29967" crc="6c85f6a3" sha1="7df519680056341798850bca8e9c0939bebe8795"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="houshill">
+ <description>The House on Damned Hill</description>
+ <year>1984</year>
+ <publisher>Century City Software</publisher>
+ <part name="cass" interface="spectrum_cass">
+ <dataarea name="cass" size="55032">
+ <rom name="the house on damned hill.tzx" size="55032" crc="ce168aa6" sha1="74274c711cf8c6e14e1bef42d18e19dfbc05eb4d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="houshilla" cloneof="houshill">
+ <description>The House on Damned Hill (alt)</description>
+ <year>1984</year>
+ <publisher>Century City Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="54928">
<rom name="the house on damned hill - alternate.tzx" size="54928" crc="c02fc94b" sha1="f6c7b74e880df42483e1d0236562d92e97a3ec0f"/>
@@ -80748,10 +80770,10 @@ license:CC0
</part>
</software>
- <software name="thehouse_f" cloneof="thehouse">
- <description>The House On Damned Hill (Mind Games Espana)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="houshillb" cloneof="houshill">
+ <description>The House on Damned Hill (Mind Games Espana)</description>
+ <year>1985</year>
+ <publisher>Mind Games Espana</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="54951">
<rom name="the house on damned hill - side 1 (mind games espana).tzx" size="54951" crc="d6aeeb0f" sha1="dea498dbe0e7357e7a6dd6cc5c5d8f8caaf5f0b9"/>
@@ -80764,21 +80786,10 @@ license:CC0
</part>
</software>
- <software name="thehouse_h" cloneof="thehouse">
- <description>The House On Damned Hill</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
- <part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="55032">
- <rom name="the house on damned hill.tzx" size="55032" crc="ce168aa6" sha1="74274c711cf8c6e14e1bef42d18e19dfbc05eb4d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="thehouse_i" cloneof="thehouse">
- <description>The House On The Tor - A Series Quill</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="housetor">
+ <description>The House on the Tor (A Series Quill)</description>
+ <year>1990</year>
+ <publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="40991">
<rom name="the house on the tor - a series quill.tzx" size="40991" crc="5cf85c6f" sha1="acbf3ee610fb488ef8774121fdaa62a7b4f74592"/>
@@ -80786,10 +80797,10 @@ license:CC0
</part>
</software>
- <software name="thehouse_j" cloneof="thehouse">
- <description>The House On The Tor - C04 Version</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="housetora" cloneof="housetor">
+ <description>The House on the Tor (C04 version)</description>
+ <year>1990</year>
+ <publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="37150">
<rom name="the house on the tor - c04 version.tzx" size="37150" crc="27d89932" sha1="afb230f3c56605abd43870f20169cbc804556382"/>
@@ -80797,10 +80808,10 @@ license:CC0
</part>
</software>
- <software name="thehouse_k" cloneof="thehouse">
- <description>The House On The Tor - Part 1</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="housetorb" cloneof="housetor">
+ <description>The House on the Tor (part 1)</description>
+ <year>1990</year>
+ <publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="38251">
<rom name="the house on the tor - part 1.tzx" size="38251" crc="70ce7925" sha1="9bf86efe8a78fcb2ba5ecba0503ba8e17fea824d"/>
@@ -80808,10 +80819,10 @@ license:CC0
</part>
</software>
- <software name="thehouse_l" cloneof="thehouse">
- <description>The House On The Tor - Part 2</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="housetorc" cloneof="housetor">
+ <description>The House on the Tor (part 2)</description>
+ <year>1990</year>
+ <publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="38251">
<rom name="the house on the tor - part 2.tzx" size="38251" crc="6299e0ca" sha1="d38278ae940d0e0d1e48cf5873175ef67c99329c"/>
@@ -80819,17 +80830,6 @@ license:CC0
</part>
</software>
- <software name="thehouse_m" cloneof="thehouse">
- <description>The House</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
- <part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="36807">
- <rom name="the house.tzx" size="36807" crc="f06ca56b" sha1="e2d9cef3822b148f029b60120a95b26e06ddcfe9"/>
- </dataarea>
- </part>
- </software>
-
<software name="thehumpt">
<description>The Humpty Dumpty Mystery</description>
<year>1983</year>
@@ -80885,7 +80885,7 @@ license:CC0
</software>
<software name="iofthema">
- <description>I Of The Mask (Silverbird)</description>
+ <description>I of the Mask (Silverbird)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -80896,7 +80896,7 @@ license:CC0
</software>
<software name="iofthema_a" cloneof="iofthema">
- <description>I Of The Mask</description>
+ <description>I of the Mask</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -81322,7 +81322,7 @@ license:CC0
</software>
<software name="isoangel">
- <description>In Search Of Angels (set 1)</description>
+ <description>In Search of Angels (set 1)</description>
<year>1985</year>
<publisher>8th Day Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -81338,7 +81338,7 @@ license:CC0
</software>
<software name="isoangela" cloneof="isoangel">
- <description>In Search Of Angels (set 2)</description>
+ <description>In Search of Angels (set 2)</description>
<year>1985</year>
<publisher>8th Day Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -81354,7 +81354,7 @@ license:CC0
</software>
<software name="isoangelb" cloneof="isoangel">
- <description>In Search Of Angels (set 3)</description>
+ <description>In Search of Angels (set 3)</description>
<year>1985</year>
<publisher>8th Day Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -81365,7 +81365,7 @@ license:CC0
</software>
<software name="isoangelc" cloneof="isoangel">
- <description>In Search Of Angels (set 4, GI Games)</description>
+ <description>In Search of Angels (set 4, GI Games)</description>
<year>1985</year>
<publisher>8th Day Software / GI Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -81376,7 +81376,7 @@ license:CC0
</software>
<software name="isolostv">
- <description>In Search Of The Lost Valley</description>
+ <description>In Search of the Lost Valley</description>
<year>1988</year>
<publisher>Mega-Soft</publisher>
<part name="cass" interface="spectrum_cass">
@@ -81387,7 +81387,7 @@ license:CC0
</software>
<software name="isoorb">
- <description>In Search Of The Orb</description>
+ <description>In Search of the Orb</description>
<year>1983</year>
<publisher>CRL Group PLC</publisher>
<part name="cass" interface="spectrum_cass">
@@ -81398,7 +81398,7 @@ license:CC0
</software>
<software name="inthelof">
- <description>In The Loft</description>
+ <description>In the Loft</description>
<year>1986</year>
<publisher>Anthony P. Hamilton</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -81436,7 +81436,7 @@ license:CC0
</software>
<software name="indydoom">
- <description>Indiana Jones And The Temple Of Doom (set 1)</description>
+ <description>Indiana Jones And The Temple of Doom (set 1)</description>
<year>1987</year>
<publisher>U.S. Gold</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -81452,9 +81452,9 @@ license:CC0
</software>
<software name="indydooma" cloneof="indydoom">
- <description>Indiana Jones And The Temple Of Doom (Kixx)</description>
+ <description>Indiana Jones And The Temple of Doom (Kixx)</description>
<year>1987</year>
- <publisher>U.S. Gold Ltd / Kixx</publisher>
+ <publisher>Kixx</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="84799">
<rom name="indiana jones and the temple of doom (kixx) - side 1.tzx" size="84799" crc="705691d1" sha1="3ec90d8d33fd6613a0d5a21e3ee2f4192ebc0c43"/>
@@ -81468,9 +81468,9 @@ license:CC0
</software>
<software name="indydoomb" cloneof="indydoom">
- <description>Indiana Jones And The Temple Of Doom (Erbe)</description>
+ <description>Indiana Jones And The Temple of Doom (Erbe)</description>
<year>1987</year>
- <publisher>U.S. Gold Ltd / Erby</publisher>
+ <publisher>Erbe Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="78651">
<rom name="indiana jones and the temple of doom - side 1 (erbe).tzx" size="78651" crc="aa97473c" sha1="5d17f568f51f317be90247e746b4f1bd4108c90b"/>
@@ -81484,7 +81484,7 @@ license:CC0
</software>
<software name="indycrus">
- <description>Indiana Jones And The Last Crusade</description>
+ <description>Indiana Jones and the Last Crusade</description>
<year>1989</year>
<publisher>U.S. Gold</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -81500,9 +81500,9 @@ license:CC0
</software>
<software name="indycrusa" cloneof="indycrus">
- <description>Indiana Jones And The Last Crusade (Kixx)</description>
+ <description>Indiana Jones and the Last Crusade (Kixx)</description>
<year>1989</year>
- <publisher>U.S. Gold Ltd / Kixx</publisher>
+ <publisher>Kixx</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="47248">
<rom name="indiana jones and the last crusade (kixx) - side 1.tzx" size="47248" crc="d88b1810" sha1="7ec8e105c1ce7f8ea2d454c5c6d4618907e735c7"/>
@@ -81516,9 +81516,9 @@ license:CC0
</software>
<software name="indycrusb" cloneof="indycrus">
- <description>Indiana Jones Y La Ultima Cruzada (Erbe - Music)</description>
+ <description>Indiana Jones y la Ultima Cruzada (Erbe - Music)</description>
<year>1989</year>
- <publisher>U.S. Gold / Erbe</publisher>
+ <publisher>Erbe Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="41861">
<rom name="indiana jones y la ultima cruzada - side 1 (erbe - music).tzx" size="41861" crc="02ea978e" sha1="afc9902d198b8a2f981b60a01b47d3d2b629a3d7"/>
@@ -81532,9 +81532,9 @@ license:CC0
</software>
<software name="indycrusc" cloneof="indycrus">
- <description>Indiana Jones Y La Ultima Cruzada (Erbe - Serie 5 Estrellas)</description>
+ <description>Indiana Jones y la Ultima Cruzada (Erbe - Serie 5 Estrellas)</description>
<year>1989</year>
- <publisher>U.S. Gold / Erbe</publisher>
+ <publisher>Erbe Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="41844">
<rom name="indiana jones y la ultima cruzada - side 1 (erbe - serie 5 estrellas).tzx" size="41844" crc="2932f695" sha1="c76a78e6cb70055db6a413e22f9ce7260a5225c4"/>
@@ -81548,7 +81548,7 @@ license:CC0
</software>
<software name="indyfate">
- <description>Indiana Jones And The Fate Of Atlantis</description>
+ <description>Indiana Jones and the Fate of Atlantis</description>
<year>1992</year>
<publisher>U.S. Gold</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -82689,7 +82689,7 @@ license:CC0
</software>
<software name="ibodysn">
- <description>Invasion Of The Body Snatchas! (set 1)</description>
+ <description>Invasion of the Body Snatchas! (set 1)</description>
<year>1983</year>
<publisher>Crystal Computing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -82700,7 +82700,7 @@ license:CC0
</software>
<software name="ibodysna" cloneof="ibodysn">
- <description>Invasion Of The Body Snatchas! (set 2)</description>
+ <description>Invasion of the Body Snatchas! (set 2)</description>
<year>1983</year>
<publisher>Crystal Computing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -82711,7 +82711,7 @@ license:CC0
</software>
<software name="blowout" cloneof="ibodysn"> <!-- loading screens etc. unchanged, just box art -->
- <description>Invasion Of The Body Snatchas! (set 3, MCM, Blow Out)</description>
+ <description>Invasion of the Body Snatchas! (set 3, MCM, Blow Out)</description>
<year>1983</year>
<publisher>Crystal Computing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -82919,7 +82919,7 @@ license:CC0
</software>
<software name="islandof">
- <description>Island Of Chaos</description>
+ <description>Island of Chaos</description>
<year>1990</year>
<publisher>The Guild</publisher>
<part name="cass" interface="spectrum_cass">
@@ -83379,7 +83379,7 @@ license:CC0
</software>
<software name="isinbad">
- <description>The Islands Of Sinbad (set 1)</description>
+ <description>The Islands of Sinbad (set 1)</description>
<year>1987</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -83390,7 +83390,7 @@ license:CC0
</software>
<software name="isinbada" cloneof="isinbad">
- <description>The Islands Of Sinbad (set 2)</description>
+ <description>The Islands of Sinbad (set 2)</description>
<year>1987</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -83745,7 +83745,7 @@ license:CC0
</software>
<software name="jasonoft">
- <description>Jason Of The Argonauts (Adventure Workshop)</description>
+ <description>Jason of the Argonauts (Adventure Workshop)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -83756,7 +83756,7 @@ license:CC0
</software>
<software name="jasonoft_a" cloneof="jasonoft">
- <description>Jason Of The Argonauts</description>
+ <description>Jason of the Argonauts</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -84105,10 +84105,11 @@ license:CC0
</part>
</software>
- <software name="jetsetwi_n" cloneof="jetsetwi">
- <description>Jet Set Willy - Escape Of The Snails - English</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <!-- Mod from: Jet Set Willy -->
+ <software name="escsnail">
+ <description>Jet Set Willy - Escape of the Snails (English)</description>
+ <year>2006</year>
+ <publisher>Herve Ast</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="32904">
<rom name="jet set willy - escape of the snails - english.tzx" size="32904" crc="d52d5015" sha1="01aea874728cc600681753be37e6f04c0494bd01"/>
@@ -84116,10 +84117,10 @@ license:CC0
</part>
</software>
- <software name="jetsetwi_o" cloneof="jetsetwi">
- <description>Jet Set Willy - Escape Of The Snails - Francais</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="escsnaila" cloneof="escsnail">
+ <description>Jet Set Willy - Escape of the Snails (French)</description>
+ <year>2006</year>
+ <publisher>Herve Ast</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="32904">
<rom name="jet set willy - escape of the snails - francais.tzx" size="32904" crc="1e3818ca" sha1="6bebbf66f32b21c5de653af487725c3f7a7e37a0"/>
@@ -84282,7 +84283,7 @@ license:CC0
</software>
<software name="jetsetwi_ad" cloneof="jetsetwi">
- <description>Jet Set Willy - Lord Of The Rings - Easy</description>
+ <description>Jet Set Willy - Lord of the Rings - Easy</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -84293,7 +84294,7 @@ license:CC0
</software>
<software name="jetsetwi_ae" cloneof="jetsetwi">
- <description>Jet Set Willy - Lord Of The Rings - Hard</description>
+ <description>Jet Set Willy - Lord of the Rings - Hard</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -85181,7 +85182,7 @@ license:CC0
</software>
<software name="jewelofp">
- <description>Jewel Of Power</description>
+ <description>Jewel of Power</description>
<year>1985</year>
<publisher>Slogger</publisher>
<part name="cass" interface="spectrum_cass">
@@ -85192,7 +85193,7 @@ license:CC0
</software>
<software name="jewelofs">
- <description>Jewel Of Scotland</description>
+ <description>Jewel of Scotland</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -85208,7 +85209,7 @@ license:CC0
</software>
<software name="jewelsof">
- <description>Jewels Of Darkness</description>
+ <description>Jewels of Darkness</description>
<year>1986</year>
<publisher>Rainbird</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -85323,7 +85324,7 @@ license:CC0
</software>
<software name="jockywil">
- <description>Jocky Wilson's Compendium Of Darts</description>
+ <description>Jocky Wilson's Compendium of Darts</description>
<year>1991</year>
<publisher>Zeppelin Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -85621,7 +85622,7 @@ license:CC0
</software>
<software name="journeyt_a" cloneof="journeyt">
- <description>Journey To The Centre Of Eddie Smith's Head (set 2)</description>
+ <description>Journey To The Centre of Eddie Smith's Head (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -85632,7 +85633,7 @@ license:CC0
</software>
<software name="journeyt_b" cloneof="journeyt">
- <description>Journey To The Centre Of Eddie Smith's Head</description>
+ <description>Journey To The Centre of Eddie Smith's Head</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -85643,7 +85644,7 @@ license:CC0
</software>
<software name="journeyt_c" cloneof="journeyt">
- <description>Journey To The Centre Of The Earth</description>
+ <description>Journey To The Centre of the Earth</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -86101,7 +86102,7 @@ license:CC0
</software>
<software name="jewlbaby">
- <description>The Jewels Of Babylon (set 1)</description>
+ <description>The Jewels of Babylon (set 1)</description>
<year>1985</year>
<publisher>Interceptor Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -86112,7 +86113,7 @@ license:CC0
</software>
<software name="jewlbabya" cloneof="jewlbaby">
- <description>The Jewels Of Babylon (set 2)</description>
+ <description>The Jewels of Babylon (set 2)</description>
<year>1985</year>
<publisher>Interceptor Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -86123,7 +86124,7 @@ license:CC0
</software>
<software name="jewelhnr">
- <description>The Jewels Of Honour (set 1)</description>
+ <description>The Jewels of Honour (set 1)</description>
<year>1990</year>
<publisher>Fantasy Leagues</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -86139,7 +86140,7 @@ license:CC0
</software>
<software name="jewelhnra" cloneof="jewelhnr">
- <description>The Jewels Of Honour (set 2, Global)</description>
+ <description>The Jewels of Honour (set 2, Global)</description>
<year>1990</year>
<publisher>Fantasy Leagues / Global Games</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -86155,7 +86156,7 @@ license:CC0
</software>
<software name="jewelhnrb" cloneof="jewelhnr">
- <description>The Jewels Of Honour (set 3, Global)</description>
+ <description>The Jewels of Honour (set 3, Global)</description>
<year>1990</year>
<publisher>Fantasy Leagues / Global Games</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -86337,7 +86338,7 @@ license:CC0
</software>
<software name="karyssia">
- <description>Karyssia - Queen Of Diamonds (set 2)</description>
+ <description>Karyssia - Queen of Diamonds (set 2)</description>
<year>1987</year>
<publisher>Incentive</publisher>
<part name="cass" interface="spectrum_cass">
@@ -86348,7 +86349,7 @@ license:CC0
</software>
<software name="karyssia_a" cloneof="karyssia">
- <description>Karyssia - Queen Of Diamonds (set 1)</description>
+ <description>Karyssia - Queen of Diamonds (set 1)</description>
<year>1987</year>
<publisher>Incentive</publisher>
<part name="cass" interface="spectrum_cass">
@@ -86807,7 +86808,7 @@ license:CC0
</software>
<software name="kingofpo">
- <description>King Of Pong</description>
+ <description>King of Pong</description>
<year>2010</year>
<publisher>Kantxo Design - Team Siglo XXI</publisher>
<part name="cass" interface="spectrum_cass">
@@ -86862,7 +86863,7 @@ license:CC0
</software>
<software name="kingdomo">
- <description>Kingdom Of Krell</description>
+ <description>Kingdom of Krell</description>
<year>1987</year>
<publisher>Anco</publisher>
<part name="cass" interface="spectrum_cass">
@@ -86873,7 +86874,7 @@ license:CC0
</software>
<software name="klingsor">
- <description>Klingsor The Evil Magician</description>
+ <description>Klingsor the Evil Magician</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -88235,7 +88236,7 @@ license:CC0
</software>
<software name="landofmi">
- <description>Land Of Mire Mare v1.03 - QAOPM Keys</description>
+ <description>Land of Mire Mare v1.03 - QAOPM Keys</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -88246,7 +88247,7 @@ license:CC0
</software>
<software name="landofmi_a" cloneof="landofmi">
- <description>Land Of Mire Mare v1.03 - WASDM Keys</description>
+ <description>Land of Mire Mare v1.03 - WASDM Keys</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -88257,7 +88258,7 @@ license:CC0
</software>
<software name="landofmi_b" cloneof="landofmi">
- <description>Land Of Mire Mare v1.03</description>
+ <description>Land of Mire Mare v1.03</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -88268,7 +88269,7 @@ license:CC0
</software>
<software name="landofmi_c" cloneof="landofmi">
- <description>Land Of Mire Mare v1.05</description>
+ <description>Land of Mire Mare v1.05</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -88279,7 +88280,7 @@ license:CC0
</software>
<software name="landofmi_d" cloneof="landofmi">
- <description>Land Of Mire Mare v1.06 - Special Edition</description>
+ <description>Land of Mire Mare v1.06 - Special Edition</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -88290,7 +88291,7 @@ license:CC0
</software>
<software name="landofmi_e" cloneof="landofmi">
- <description>Land Of Mire Mare v1.06</description>
+ <description>Land of Mire Mare v1.06</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -88301,7 +88302,7 @@ license:CC0
</software>
<software name="landofsa">
- <description>Land Of Sagan</description>
+ <description>Land of Sagan</description>
<year>1983</year>
<publisher>Mikro-Gen</publisher>
<part name="cass" interface="spectrum_cass">
@@ -88323,7 +88324,7 @@ license:CC0
</software>
<software name="landfall">
- <description>Landfall On Rollus</description>
+ <description>Landfall on Rollus</description>
<year>1987</year>
<publisher>Clwyd Adventure</publisher>
<part name="cass" interface="spectrum_cass">
@@ -88345,7 +88346,7 @@ license:CC0
</software>
<software name="lapofthe">
- <description>Lap Of The Gods</description>
+ <description>Lap of the Gods</description>
<year>1986</year>
<publisher>Mastertronic</publisher>
<part name="cass" interface="spectrum_cass">
@@ -88356,7 +88357,7 @@ license:CC0
</software>
<software name="larrythe">
- <description>Larry The Lemming</description>
+ <description>Larry the Lemming</description>
<year>1992</year>
<publisher>Delbert the Hamster Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -88378,9 +88379,9 @@ license:CC0
</software>
<software name="lacasinomast" cloneof="lacasino">
- <description>Las Vegas Casino (Mastering Tape)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>Las Vegas Casino (master tape)</description>
+ <year>1989</year>
+ <publisher>Zeppelin Games</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="44167">
<rom name="las vegas casino master tape.tzx" size="44167" crc="f227218b" sha1="4cf0c7a937e237073a559d338692d983aa2d5d10"/>
@@ -88527,26 +88528,10 @@ license:CC0
</part>
</software>
- <software name="lasersqu_b" cloneof="lasersqu">
- <description>Laser Squad - Expansion Kit One</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
- <part name="cass1" interface="spectrum_cass">
- <dataarea name="cass" size="18958">
- <rom name="laser squad - expansion kit one - side 1.tzx" size="18958" crc="3a14fd2d" sha1="e9e7a93569cdf0ab84b58e964408b0aa015847df"/>
- </dataarea>
- </part>
- <part name="cass2" interface="spectrum_cass">
- <dataarea name="cass" size="18958">
- <rom name="laser squad - expansion kit one - side 2.tzx" size="18958" crc="5e50f9e7" sha1="725cbcd51cbd28e294face07fc5a2922e123a82e"/>
- </dataarea>
- </part>
- </software>
-
<software name="lasersqu_d" cloneof="lasersqu">
<description>Laser Squad</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1988</year>
+ <publisher>Blade Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="67525">
<rom name="laser squad - side 1.tzx" size="67525" crc="2281c448" sha1="a149a34322bb55b03151ec9d61f49bd342331173"/>
@@ -88569,6 +88554,22 @@ license:CC0
</part>
</software>
+ <software name="lasersqexp">
+ <description>Laser Squad - Expansion Kit One</description>
+ <year>1988</year>
+ <publisher>Blade Software</publisher>
+ <part name="cass1" interface="spectrum_cass">
+ <dataarea name="cass" size="18958">
+ <rom name="laser squad - expansion kit one - side 1.tzx" size="18958" crc="3a14fd2d" sha1="e9e7a93569cdf0ab84b58e964408b0aa015847df"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="spectrum_cass">
+ <dataarea name="cass" size="18958">
+ <rom name="laser squad - expansion kit one - side 2.tzx" size="18958" crc="5e50f9e7" sha1="725cbcd51cbd28e294face07fc5a2922e123a82e"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="laserwhe">
<description>Laser Wheel</description>
<year>1987</year>
@@ -89141,7 +89142,7 @@ license:CC0
</software>
<software name="lkage">
- <description>Legend Of Kage</description>
+ <description>Legend of Kage</description>
<year>1987</year>
<publisher>Imagine Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -89152,7 +89153,7 @@ license:CC0
</software>
<software name="lkagehs" cloneof="lkage">
- <description>Legend Of Kage (The Hit Squad)</description>
+ <description>Legend of Kage (The Hit Squad)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -89163,7 +89164,7 @@ license:CC0
</software>
<software name="amazonwm">
- <description>Legend Of The Amazon Women (set 1)</description>
+ <description>Legend of the Amazon Women (set 1)</description>
<year>1986</year>
<publisher>U.S. Gold</publisher>
<part name="cass" interface="spectrum_cass">
@@ -89174,7 +89175,7 @@ license:CC0
</software>
<software name="amazonwmm" cloneof="amazonwm">
- <description>Legend Of The Amazon Women (set 2, Mastertronic Plus)</description>
+ <description>Legend of the Amazon Women (set 2, Mastertronic Plus)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -89185,7 +89186,7 @@ license:CC0
</software>
<software name="amazonwmdr" cloneof="amazonwm">
- <description>Legend Of The Amazon Women (set 3, Dro Soft)</description>
+ <description>Legend of the Amazon Women (set 3, Dro Soft)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -89196,7 +89197,7 @@ license:CC0
</software>
<software name="leglostk">
- <description>Legend Of The Lost Kingdom</description>
+ <description>Legend of the Lost Kingdom</description>
<year>1987</year>
<publisher>Dan Brochner Nielsen</publisher>
<part name="cass" interface="spectrum_cass">
@@ -89218,7 +89219,7 @@ license:CC0
</software>
<software name="legionso">
- <description>Legions Of Death</description>
+ <description>Legions of Death</description>
<year>1987</year>
<publisher>MC Lothlorien</publisher>
<part name="cass" interface="spectrum_cass">
@@ -89294,7 +89295,7 @@ license:CC0
</software>
<software name="leopoldt">
- <description>Leopold The Minstrel</description>
+ <description>Leopold the Minstrel</description>
<year>1994</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -89778,7 +89779,7 @@ license:CC0
</software>
<software name="lifeofcr">
- <description>Life Of Crime</description>
+ <description>Life of Crime</description>
<year>1990</year>
<publisher>Global Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -89789,7 +89790,7 @@ license:CC0
</software>
<software name="lifeofha">
- <description>Life Of Harry</description>
+ <description>Life of Harry</description>
<year>1985</year>
<publisher>Cascade Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -90061,7 +90062,7 @@ license:CC0
</software>
<software name="lineoffi">
- <description>Line Of Fire (Erbe - Musical 1)</description>
+ <description>Line of Fire (Erbe - Musical 1)</description>
<year>1990</year>
<publisher>Musical 1</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -90077,7 +90078,7 @@ license:CC0
</software>
<software name="lineoffi_d" cloneof="lineoffi">
- <description>Line Of Fire</description>
+ <description>Line of Fire</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -90294,7 +90295,7 @@ license:CC0
</software>
<software name="lvston2">
- <description>Livingstone Supongo II - Small Cardboard Case</description>
+ <description>Livingstone Supongo II (small cardboard case)</description>
<year>1989</year>
<publisher>Opera Soft</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -90310,9 +90311,9 @@ license:CC0
</software>
<software name="lvston2a" cloneof="lvston2">
- <description>Livingstone Supongo II - Small Case</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>Livingstone Supongo II (small case)</description>
+ <year>1989</year>
+ <publisher>Opera Soft</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="98375">
<rom name="livingstone supongo ii - small case - side 1.tzx" size="98375" crc="be3111e5" sha1="31f045f75b46ea6ae51c1dd771a679552529e12f"/>
@@ -90846,7 +90847,7 @@ license:CC0
</software>
<software name="lordofth">
- <description>Lord Of The Dead</description>
+ <description>Lord of the Dead</description>
<year>2012</year>
<publisher>Steve Westwood</publisher>
<part name="cass" interface="spectrum_cass">
@@ -90857,7 +90858,7 @@ license:CC0
</software>
<software name="lotr">
- <description>Lord Of The Rings</description>
+ <description>Lord of the Rings</description>
<year>1986</year>
<publisher>Melbourne House</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -90883,7 +90884,7 @@ license:CC0
</software>
<software name="lordmagi">
- <description>Lords Of Magic (set 1)</description>
+ <description>Lords of Magic (set 1)</description>
<year>1990</year>
<publisher>The Guild</publisher>
<part name="cass" interface="spectrum_cass">
@@ -90894,7 +90895,7 @@ license:CC0
</software>
<software name="lordmagia" cloneof="lordmagi">
- <description>Lords Of Magic (set 2)</description>
+ <description>Lords of Magic (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -90905,7 +90906,7 @@ license:CC0
</software>
<software name="lordtime">
- <description>Lords Of Time (set 1)</description>
+ <description>Lords of Time (set 1)</description>
<year>1983</year>
<publisher>Level 9 Computing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -90916,7 +90917,7 @@ license:CC0
</software>
<software name="lordtimea" cloneof="lordtime">
- <description>Lords Of Time (set 2)</description>
+ <description>Lords of Time (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -91629,7 +91630,7 @@ license:CC0
<software name="letesera">
<description>L'Ete Sera Chaud</description>
<year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <publisher>Sprites</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="51123">
<rom name="l_ete sera chaud.tzx" size="51123" crc="003c8585" sha1="d0308fde4f09a00f5ed8ad42a4b028ba430283eb"/>
@@ -91676,7 +91677,7 @@ license:CC0
</software>
<software name="labourhc">
- <description>The Labours Of Hercules (set 1)</description>
+ <description>The Labours of Hercules (set 1)</description>
<year>1987</year>
<publisher>Terry Taylor</publisher>
<part name="cass" interface="spectrum_cass">
@@ -91687,7 +91688,7 @@ license:CC0
</software>
<software name="labourhca" cloneof="labourhc">
- <description>The Labours Of Hercules (set 2)</description>
+ <description>The Labours of Hercules (set 2)</description>
<year>1987</year>
<publisher>Terry Taylor</publisher>
<part name="cass" interface="spectrum_cass">
@@ -91698,7 +91699,7 @@ license:CC0
</software>
<software name="labourhcb" cloneof="labourhc">
- <description>The Labours Of Hercules (set 3, Zenobi)</description>
+ <description>The Labours of Hercules (set 3, Zenobi)</description>
<year>1987</year>
<publisher>Terry Taylor / Zenobi</publisher>
<part name="cass" interface="spectrum_cass">
@@ -91910,7 +91911,7 @@ license:CC0
</software>
<software name="thelegen">
- <description>The Legend Of Craldons Creek</description>
+ <description>The Legend of Craldons Creek</description>
<year>1987</year>
<publisher>Eric Stewart</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -91926,7 +91927,7 @@ license:CC0
</software>
<software name="thelegen_b" cloneof="thelegen">
- <description>The Legend Of Craldons Creek (v1.2)</description>
+ <description>The Legend of Craldons Creek (v1.2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -91942,7 +91943,7 @@ license:CC0
</software>
<software name="thelifea">
- <description>The Life And Adventures Of Crusoe</description>
+ <description>The Life and Adventures of Crusoe</description>
<year>1984</year>
<publisher>Automata UK</publisher>
<part name="cass" interface="spectrum_cass">
@@ -91953,7 +91954,7 @@ license:CC0
</software>
<software name="thelifeo">
- <description>The Life Of A Lone Electron</description>
+ <description>The Life of a Lone Electron</description>
<year>1992</year>
<publisher>Delbert the Hamster</publisher>
<part name="cass" interface="spectrum_cass">
@@ -92120,9 +92121,9 @@ license:CC0
</part>
</software>
- <software name="thelostc_b" cloneof="thelostc">
- <description>The Lost City (set 2)</description>
- <year>19??</year>
+ <software name="lostcityb">
+ <description>The Lost City</description>
+ <year>1989</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="21868">
@@ -92131,10 +92132,10 @@ license:CC0
</part>
</software>
- <software name="thelostc_c" cloneof="thelostc">
- <description>The Lost City</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="lostcity">
+ <description>The Lost City (within covertape "Sinclair User issue 93: megatape 23")</description>
+ <year>1989</year>
+ <publisher>Sinclair User</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="37208">
<rom name="the lost city.tzx" size="37208" crc="34902150" sha1="7c1de88aea95b74ba1dd166edb84e57df1e826b5"/>
@@ -92156,7 +92157,7 @@ license:CC0
<software name="thelostq">
<description>The Lost Quill</description>
<year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <publisher>Alfa Soft</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="12873">
<rom name="the lost quill.tzx" size="12873" crc="d13e9753" sha1="06aeedcfd26835c4b6e2dc0e5a4a1a2e8089993b"/>
@@ -92187,9 +92188,9 @@ license:CC0
</software>
<software name="ltananka">
- <description>The Lost Tomb Of Ananka</description>
+ <description>The Lost Tomb of Ananka</description>
<year>1993</year>
- <publisher>Compass</publisher>
+ <publisher>Compass Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="44753">
<rom name="the lost tomb of ananka.tzx" size="44753" crc="bbc23fe7" sha1="f3da7124a57b8f8b8e72d9a8d00cae733040b616"/>
@@ -92198,9 +92199,9 @@ license:CC0
</software>
<software name="ltanankaa" cloneof="ltananka">
- <description>The Lost Tomb Of Ananka (Adventure Workshop)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>The Lost Tomb of Ananka (Adventure Workshop)</description>
+ <year>1993</year>
+ <publisher>The Adventure Workshop</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="44753">
<rom name="the lost tomb of ananka (adventure workshop).tzx" size="44753" crc="16aefab7" sha1="c68e8f9933abc9aec133d71981613f03e48e488a"/>
@@ -92208,10 +92209,10 @@ license:CC0
</part>
</software>
- <software name="ltanankamast" cloneof="ltananka">
- <description>The Lost Tomb Of Ananka (Mastering Tape)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="ltanankab" cloneof="ltananka">
+ <description>The Lost Tomb of Ananka (master tape)</description>
+ <year>1993</year>
+ <publisher>Compass Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="44915">
<rom name="the lost tomb of ananka master tape.tzx" size="44915" crc="eb0ece33" sha1="3844be81623a46d19426dc9c803cf9787727acb0"/>
@@ -92219,10 +92220,10 @@ license:CC0
</part>
</software>
- <software name="thelostt_c" cloneof="thelostt">
- <description>The Lost Twilight (set 2)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="losttwi">
+ <description>The Lost Twilight (alt)</description>
+ <year>1992</year>
+ <publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="85697">
<rom name="the lost twilight - alternate.tzx" size="85697" crc="6e163618" sha1="8ecdb6fd62b87220f2faaef1083b1d55699da8a5"/>
@@ -92230,10 +92231,10 @@ license:CC0
</part>
</software>
- <software name="thelostt_d" cloneof="thelostt">
+ <software name="losttwia" cloneof="losttwi">
<description>The Lost Twilight</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1992</year>
+ <publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="85690">
<rom name="the lost twilight.tzx" size="85690" crc="c05e0b0b" sha1="bcb3b213feb3aaf8cb2612c6d88d67741d2978b8"/>
@@ -93729,7 +93730,7 @@ license:CC0
</software>
<software name="manicmin_aa" cloneof="manicmin">
- <description>Manic Miner 6 - The Buddha Of Suburbia</description>
+ <description>Manic Miner 6 - The Buddha of Suburbia</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -93740,7 +93741,7 @@ license:CC0
</software>
<software name="manicmin_aj" cloneof="manicmin">
- <description>Manic Miner Mythologies - Eugene - Lord Of The Bathroom</description>
+ <description>Manic Miner Mythologies - Eugene - Lord of the Bathroom</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -93806,7 +93807,7 @@ license:CC0
</software>
<software name="manorofd">
- <description>Manor Of Doom (Krypton Force)</description>
+ <description>Manor of Doom (Krypton Force)</description>
<year>1984</year>
<publisher>Krypton Force</publisher>
<part name="cass" interface="spectrum_cass">
@@ -93817,7 +93818,7 @@ license:CC0
</software>
<software name="manorofd_a" cloneof="manorofd">
- <description>Manor Of Doom (set 3)</description>
+ <description>Manor of Doom (set 3)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -93828,7 +93829,7 @@ license:CC0
</software>
<software name="manorofd_b" cloneof="manorofd">
- <description>Manor Of Doom (set 4)</description>
+ <description>Manor of Doom (set 4)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -93839,7 +93840,7 @@ license:CC0
</software>
<software name="manorofd_c" cloneof="manorofd">
- <description>Manor Of Doom (set 2)</description>
+ <description>Manor of Doom (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -93850,7 +93851,7 @@ license:CC0
</software>
<software name="manorofd_d" cloneof="manorofd">
- <description>Manor Of Doom</description>
+ <description>Manor of Doom</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -93861,7 +93862,7 @@ license:CC0
</software>
<software name="manorofm">
- <description>Manor Of Madness (set 2)</description>
+ <description>Manor of Madness (set 2)</description>
<year>1984</year>
<publisher>Celtic</publisher>
<part name="cass" interface="spectrum_cass">
@@ -93872,7 +93873,7 @@ license:CC0
</software>
<software name="manorofm_a" cloneof="manorofm">
- <description>Manor Of Madness</description>
+ <description>Manor of Madness</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -93937,7 +93938,7 @@ license:CC0
</software>
<software name="mapofthe">
- <description>Map Of The UK</description>
+ <description>Map of the UK</description>
<year>1983</year>
<publisher>Kuma Computers</publisher>
<part name="cass" interface="spectrum_cass">
@@ -94438,7 +94439,7 @@ license:CC0
</software>
<software name="masterof">
- <description>Master Of Magic</description>
+ <description>Master of Magic</description>
<year>1986</year>
<publisher>Mastertronic Added Dimension</publisher>
<part name="cass" interface="spectrum_cass">
@@ -94547,7 +94548,7 @@ license:CC0
</software>
<software name="masterso">
- <description>Masters Of The Universe (Erbe)</description>
+ <description>Masters of the Universe (Erbe)</description>
<year>1987</year>
<publisher>Erbe Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -94557,21 +94558,10 @@ license:CC0
</part>
</software>
- <software name="masterso_a" cloneof="masterso">
- <description>Masters Of The Universe (Kixx)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
- <part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="44701">
- <rom name="masters of the universe (kixx).tzx" size="44701" crc="ef5d1cfd" sha1="e81b1a930165ce4abb038b89724f8706393f85b2"/>
- </dataarea>
- </part>
- </software>
-
- <software name="masterso_b" cloneof="masterso">
- <description>Masters Of The Universe - Super Adventure</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="mastunisa">
+ <description>Masters of the Universe - Super Adventure</description>
+ <year>1987</year>
+ <publisher>U.S. Gold</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="52503">
<rom name="masters of the universe - super adventure.tzx" size="52503" crc="bb966b27" sha1="64604151f627acd678e195f3fb8f098a13c1920b"/>
@@ -94579,10 +94569,10 @@ license:CC0
</part>
</software>
- <software name="masterso_c" cloneof="masterso">
- <description>Masters Of The Universe - The Arcade Game</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="mastuniag">
+ <description>Masters of the Universe - The Arcade Game</description>
+ <year>1987</year>
+ <publisher>U.S. Gold</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="48610">
<rom name="masters of the universe - the arcade game.tzx" size="48610" crc="60e3cb02" sha1="238e4c33219e08b89dedf4630135477ade61efc3"/>
@@ -94590,24 +94580,35 @@ license:CC0
</part>
</software>
- <software name="masterso_d" cloneof="masterso">
- <description>Masters Of The Universe - The Movie (Kixx)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="mastunim">
+ <description>Masters of the Universe - The Movie</description>
+ <year>1987</year>
+ <publisher>Gremlin Graphics Software</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="44745">
- <rom name="masters of the universe - the movie (kixx).tzx" size="44745" crc="fa57e573" sha1="7c914f053e8ea6d2401b04490dc6637c0d9ceebf"/>
+ <dataarea name="cass" size="44701">
+ <rom name="masters of the universe - the movie.tzx" size="44701" crc="ef5d1cfd" sha1="e81b1a930165ce4abb038b89724f8706393f85b2"/>
</dataarea>
</part>
</software>
- <software name="masterso_e" cloneof="masterso">
- <description>Masters Of The Universe - The Movie</description>
+ <software name="mastunima" cloneof="mastunim">
+ <description>Masters of the Universe - The Movie (alt)</description>
<year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <publisher>Gremlin Graphics Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="44731">
- <rom name="masters of the universe - the movie.tzx" size="44731" crc="78278df7" sha1="90b0dc56a41649f8aa0335c37ef24bddc94e0cec"/>
+ <rom name="masters of the universe - the movie (alt).tzx" size="44731" crc="78278df7" sha1="90b0dc56a41649f8aa0335c37ef24bddc94e0cec"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mastunimb" cloneof="mastunim">
+ <description>Masters of the Universe - The Movie (Kixx)</description>
+ <year>1987</year>
+ <publisher>Kixx</publisher>
+ <part name="cass" interface="spectrum_cass">
+ <dataarea name="cass" size="44745">
+ <rom name="masters of the universe - the movie (kixx).tzx" size="44745" crc="fa57e573" sha1="7c914f053e8ea6d2401b04490dc6637c0d9ceebf"/>
</dataarea>
</part>
</software>
@@ -94690,7 +94691,7 @@ license:CC0
</software>
<software name="matchoft">
- <description>Match Of The Day</description>
+ <description>Match of the Day</description>
<year>1992</year>
<publisher>Zeppelin Premier</publisher>
<part name="cass" interface="spectrum_cass">
@@ -95884,7 +95885,7 @@ license:CC0
</software>
<software name="metagala">
- <description>Metagalactic Llamas Battle At The Edge Of Time</description>
+ <description>Metagalactic Llamas Battle at the Edge of Time</description>
<year>1984</year>
<publisher>Salamander</publisher>
<part name="cass" interface="spectrum_cass">
@@ -97148,7 +97149,7 @@ license:CC0
</software>
<software name="minesofm">
- <description>Mines Of Moriez</description>
+ <description>Mines of Moriez</description>
<year>1986</year>
<publisher>Hektic</publisher>
<part name="cass" interface="spectrum_cass">
@@ -97159,7 +97160,7 @@ license:CC0
</software>
<software name="minesofs">
- <description>Mines Of Saturn (set 2)</description>
+ <description>Mines of Saturn (set 2)</description>
<year>1982</year>
<publisher>Saturnsoft</publisher>
<part name="cass" interface="spectrum_cass">
@@ -97170,7 +97171,7 @@ license:CC0
</software>
<software name="minesofs_a" cloneof="minesofs">
- <description>Mines Of Saturn</description>
+ <description>Mines of Saturn</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -98068,7 +98069,7 @@ license:CC0
</software>
<software name="moonsoft">
- <description>Moons Of Tantalus - Program</description>
+ <description>Moons of Tantalus - Program</description>
<year>1984</year>
<publisher>Cornhill Services</publisher>
<part name="cass" interface="spectrum_cass">
@@ -98079,7 +98080,7 @@ license:CC0
</software>
<software name="moonsoft_a" cloneof="moonsoft">
- <description>Moons Of Tantalus - Story</description>
+ <description>Moons of Tantalus - Story</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -98090,7 +98091,7 @@ license:CC0
</software>
<software name="moonscap">
- <description>Moonscape - Escape From The Moon</description>
+ <description>Moonscape - Escape from the Moon</description>
<year>2008</year>
<publisher>Simon Allan</publisher>
<part name="cass" interface="spectrum_cass">
@@ -98101,7 +98102,7 @@ license:CC0
</software>
<software name="moonshar">
- <description>Moonshards Of Sacrimore</description>
+ <description>Moonshards of Sacrimore</description>
<year>1989</year>
<publisher>Global Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -98611,7 +98612,7 @@ license:CC0
</software>
<software name="mountket">
- <description>Mountains Of Ket</description>
+ <description>Mountains of Ket</description>
<year>1983</year>
<publisher>Incentive</publisher>
<part name="cass" interface="spectrum_cass">
@@ -98726,7 +98727,7 @@ license:CC0
</software>
<software name="wrldsqrs">
- <description>Mr Patrick Tovey's World Of Squares</description>
+ <description>Mr Patrick Tovey's World of Squares</description>
<year>1988</year>
<publisher>Carl Clayton</publisher>
<part name="cass" interface="spectrum_cass">
@@ -99162,7 +99163,7 @@ license:CC0
<software name="mummymum">
<description>Mummy Mummy</description>
<year>1984</year>
- <publisher>MC Lothlorien Ltd</publisher>
+ <publisher>MC Lothlorien</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="16504">
<rom name="mummy mummy.tzx" size="16504" crc="69e8e3c6" sha1="b7f3af15f975e532adc28e89644abef1443bb2cd"/>
@@ -100102,7 +100103,7 @@ license:CC0
</software>
<software name="mystsilv">
- <description>Mystery Of Silver Mountain</description>
+ <description>Mystery of Silver Mountain</description>
<year>1984</year>
<publisher>Usborne Publishing Ltd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -100113,7 +100114,7 @@ license:CC0
</software>
<software name="mystindu">
- <description>Mystery Of The Indus Valley (set 1)</description>
+ <description>Mystery of the Indus Valley (set 1)</description>
<year>1988</year>
<publisher>Alternative Software Ltd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -100124,7 +100125,7 @@ license:CC0
</software>
<software name="mystindua" cloneof="mystindu">
- <description>Mystery Of The Indus Valley (set 2)</description>
+ <description>Mystery of the Indus Valley (set 2)</description>
<year>1988</year>
<publisher>Alternative Software Ltd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -100136,7 +100137,7 @@ license:CC0
<software name="mystnile">
- <description>Mystery Of The Nile (set 1)</description>
+ <description>Mystery of the Nile (set 1)</description>
<year>1987</year>
<publisher>Firebird Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -100147,7 +100148,7 @@ license:CC0
</software>
<software name="mystnilea" cloneof="mystnile">
- <description>Mystery Of The Nile (set 2)</description>
+ <description>Mystery of the Nile (set 2)</description>
<year>1987</year>
<publisher>Firebird Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -100163,7 +100164,7 @@ license:CC0
</software>
<software name="mystnileb" cloneof="mystnile">
- <description>El Misterio Del Nilo (Erbe)</description>
+ <description>El Misterio del Nilo (Erbe)</description>
<year>1987</year>
<publisher>Zigurat Software / Erbe</publisher>
<part name="cass" interface="spectrum_cass">
@@ -100379,9 +100380,9 @@ license:CC0
</software>
<software name="mstsereb">
- <description>The Masters Of Serebal</description>
+ <description>The Masters of Serebal</description>
<year>1984</year>
- <publisher>MC Lothlorien Ltd</publisher>
+ <publisher>MC Lothlorien</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="47676">
<rom name="the masters of serebal.tzx" size="47676" crc="f12cf999" sha1="ac2a58ec0351501fcda941307e0d0bdf6207d564"/>
@@ -100578,7 +100579,7 @@ license:CC0
</software>
<software name="themines">
- <description>The Mines Of Lithiad (Zenobi) - Release 1</description>
+ <description>The Mines of Lithiad (Zenobi) - Release 1</description>
<year>1992</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -100589,7 +100590,7 @@ license:CC0
</software>
<software name="themines_a" cloneof="themines">
- <description>The Mines Of Lithiad (Zenobi) - Release 2</description>
+ <description>The Mines of Lithiad (Zenobi) - Release 2</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -100600,7 +100601,7 @@ license:CC0
</software>
<software name="themines_b" cloneof="themines">
- <description>The Mines Of Lithiad</description>
+ <description>The Mines of Lithiad</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -100744,7 +100745,7 @@ license:CC0
</software>
<software name="themyste">
- <description>The Mystery Of Arkham Manor (set 2)</description>
+ <description>The Mystery of Arkham Manor (set 2)</description>
<year>1987</year>
<publisher>Melbourne House</publisher>
<part name="cass" interface="spectrum_cass">
@@ -100755,7 +100756,7 @@ license:CC0
</software>
<software name="themyste_a" cloneof="themyste">
- <description>The Mystery Of Arkham Manor</description>
+ <description>The Mystery of Arkham Manor</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -100771,7 +100772,7 @@ license:CC0
</software>
<software name="napoleon">
- <description>Napoleon At War</description>
+ <description>Napoleon at War</description>
<year>1986</year>
<publisher>CCS</publisher>
<part name="cass" interface="spectrum_cass">
@@ -102260,7 +102261,7 @@ license:CC0
</software>
<software name="notthelo">
- <description>Not The Lord Of The Rings</description>
+ <description>Not the Lord of the Rings</description>
<year>1991</year>
<publisher>Psychaedelic Hedgehog</publisher>
<part name="cass" interface="spectrum_cass">
@@ -103696,7 +103697,7 @@ license:CC0
<software name="wombatm">
- <description>One Of Our Wombats Is Missing! (set 1, with Goblin Gazette Issue 2)</description>
+ <description>One of Our Wombats Is Missing! (set 1, with Goblin Gazette Issue 2)</description>
<year>1990</year>
<publisher>Zenobi Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -103712,7 +103713,7 @@ license:CC0
</software>
<software name="wombatma" cloneof="wombatm">
- <description>One Of Our Wombats Is Missing! (set 2)</description>
+ <description>One of Our Wombats Is Missing! (set 2)</description>
<year>1990</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -103982,7 +103983,7 @@ license:CC0
</software>
<software name="orbquest">
- <description>Orb Quest (set 2)</description>
+ <description>Orb Quest (alt)</description>
<year>1991</year>
<publisher>The Guild</publisher>
<part name="cass" interface="spectrum_cass">
@@ -103994,8 +103995,8 @@ license:CC0
<software name="orbquest_a" cloneof="orbquest">
<description>Orb Quest</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1991</year>
+ <publisher>The Guild</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="63963">
<rom name="orb quest.tzx" size="63963" crc="d06949ab" sha1="f7c048f564f228c0f23e5ed03a337adf2713efed"/>
@@ -104015,7 +104016,7 @@ license:CC0
</software>
<software name="orbitofd">
- <description>Orbit Of Doom</description>
+ <description>Orbit of Doom</description>
<year>1985</year>
<publisher>Dave Watson</publisher>
<part name="cass" interface="spectrum_cass">
@@ -104295,7 +104296,7 @@ license:CC0
</software>
<software name="ormchpns">
- <description>Orm And Cheep - Narrow Squeaks</description>
+ <description>Orm and Cheep - Narrow Squeaks</description>
<year>1985</year>
<publisher>Macmillan Software Ltd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -104306,7 +104307,7 @@ license:CC0
</software>
<software name="ormchpbp">
- <description>Orm And Cheep - The Birthday Party</description>
+ <description>Orm and Cheep - The Birthday Party</description>
<year>1985</year>
<publisher>Macmillan Software Ltd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -104330,7 +104331,7 @@ license:CC0
<software name="ortograf">
<description>Ortografia 1</description>
<year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <publisher>Polmer</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="22020">
<rom name="ortografia 1.tzx" size="22020" crc="0cb00216" sha1="4b6ae4f03971479fd1b463702436af00cd3cae77"/>
@@ -104427,7 +104428,7 @@ license:CC0
</software>
<software name="outforth">
- <description>Out For The Count</description>
+ <description>Out for the Count</description>
<year>1989</year>
<publisher>Dynamite Designs</publisher>
<part name="cass" interface="spectrum_cass">
@@ -104438,7 +104439,7 @@ license:CC0
</software>
<software name="outlime">
- <description>Out Of The Limelight</description>
+ <description>Out of the Limelight</description>
<year>1992</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -104449,7 +104450,7 @@ license:CC0
</software>
<software name="outshadw">
- <description>Out Of The Shadows</description>
+ <description>Out of the Shadows</description>
<year>1984</year>
<publisher>Mizar Computing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -104460,7 +104461,7 @@ license:CC0
</software>
<software name="outofthi">
- <description>Out Of This World</description>
+ <description>Out of this World</description>
<year>1987</year>
<publisher>Reaktor</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -104634,7 +104635,7 @@ license:CC0
<software name="ovrlords">
<description>Overlords</description>
<year>1985</year>
- <publisher>MC Lothlorien Ltd</publisher>
+ <publisher>MC Lothlorien</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="29336">
<rom name="overlords.tzx" size="29336" crc="917664fa" sha1="6b13c695d80447eb03204eaa47dd2059c7e4f120"/>
@@ -104880,7 +104881,7 @@ license:CC0
</software>
<software name="theodyss">
- <description>The Odyssey Of Hope</description>
+ <description>The Odyssey of Hope</description>
<year>1984</year>
<publisher>Martech Games</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -105008,7 +105009,7 @@ license:CC0
<software name="paddingt">
- <description>Paddington And The Disappearing Ink</description>
+ <description>Paddington and the Disappearing Ink</description>
<year>1983</year>
<publisher>Collins Soft</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -105743,7 +105744,7 @@ license:CC0
</software>
<software name="pawnsofw">
- <description>Pawns Of War (Zenobi) (set 2)</description>
+ <description>Pawns of War (Zenobi) (set 2)</description>
<year>1989</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -105754,7 +105755,7 @@ license:CC0
</software>
<software name="pawnsofw_a" cloneof="pawnsofw">
- <description>Pawns Of War (Zenobi)</description>
+ <description>Pawns of War (Zenobi)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -105765,7 +105766,7 @@ license:CC0
</software>
<software name="pawnsofw_b" cloneof="pawnsofw">
- <description>Pawns Of War (set 2)</description>
+ <description>Pawns of War (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -105776,7 +105777,7 @@ license:CC0
</software>
<software name="pawnsofw_c" cloneof="pawnsofw">
- <description>Pawns Of War</description>
+ <description>Pawns of War</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -106011,7 +106012,7 @@ license:CC0
</software>
<software name="pendanto">
- <description>Pendant Of Logryn</description>
+ <description>Pendant of Logryn</description>
<year>1989</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -106142,7 +106143,7 @@ license:CC0
</software>
<software name="perilsof">
- <description>Perils Of Bear George (MCI)</description>
+ <description>Perils of Bear George (MCI)</description>
<year>1984</year>
<publisher>MCI Iberica</publisher>
<part name="cass" interface="spectrum_cass">
@@ -106153,7 +106154,7 @@ license:CC0
</software>
<software name="perilsof_a" cloneof="perilsof">
- <description>Perils Of Bear George</description>
+ <description>Perils of Bear George</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -108862,7 +108863,7 @@ license:CC0
</software>
<software name="prideoft">
- <description>Pride Of The Federation (set 3)</description>
+ <description>Pride of the Federation (set 3)</description>
<year>1987</year>
<publisher>Excalibur</publisher>
<part name="cass" interface="spectrum_cass">
@@ -108873,7 +108874,7 @@ license:CC0
</software>
<software name="prideoft_a" cloneof="prideoft">
- <description>Pride Of The Federation (set 4)</description>
+ <description>Pride of the Federation (set 4)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -108884,7 +108885,7 @@ license:CC0
</software>
<software name="prideoft_b" cloneof="prideoft">
- <description>Pride Of The Federation (set 5)</description>
+ <description>Pride of the Federation (set 5)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -108895,7 +108896,7 @@ license:CC0
</software>
<software name="prideoft_c" cloneof="prideoft">
- <description>Pride Of The Federation (set 2)</description>
+ <description>Pride of the Federation (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -108906,7 +108907,7 @@ license:CC0
</software>
<software name="prideoft_d" cloneof="prideoft">
- <description>Pride Of The Federation</description>
+ <description>Pride of the Federation</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -109019,7 +109020,7 @@ license:CC0
</software>
<software name="prisoner">
- <description>Prisoner Of The Village</description>
+ <description>Prisoner of the Village</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -110281,7 +110282,7 @@ license:CC0
</software>
<software name="pyjama">
- <description>Pyjamarama (set 1, release 5)</description>
+ <description>Pyjamarama (release 5)</description>
<year>1984</year>
<publisher>Mikro-Gen Ltd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -110292,7 +110293,7 @@ license:CC0
</software>
<software name="pyjamaa" cloneof="pyjama">
- <description>Pyjamarama (set 2, release 4)</description>
+ <description>Pyjamarama (release 4)</description>
<year>1984</year>
<publisher>Mikro-Gen Ltd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -110303,7 +110304,7 @@ license:CC0
</software>
<software name="pyjamab" cloneof="pyjama">
- <description>Pyjamarama (set 3, release 3)</description>
+ <description>Pyjamarama (release 3)</description>
<year>1984</year>
<publisher>Mikro-Gen Ltd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -110314,7 +110315,7 @@ license:CC0
</software>
<software name="pyjamac" cloneof="pyjama">
- <description>Pyjamarama (set 4, release 2)</description>
+ <description>Pyjamarama (release 2)</description>
<year>1984</year>
<publisher>Mikro-Gen Ltd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -110325,7 +110326,7 @@ license:CC0
</software>
<software name="pyjamad" cloneof="pyjama">
- <description>Pyjamarama (set 5, release 1)</description>
+ <description>Pyjamarama (release 1)</description>
<year>1984</year>
<publisher>Mikro-Gen Ltd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -110336,7 +110337,7 @@ license:CC0
</software>
<software name="pyjamae" cloneof="pyjama">
- <description>Pyjamarama (set 6, trade copy)</description>
+ <description>Pyjamarama (trade copy)</description>
<year>1984</year>
<publisher>Mikro-Gen Ltd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -110347,9 +110348,9 @@ license:CC0
</software>
<software name="pyjamaf" cloneof="pyjama">
- <description>Pyjamarama (set 7, Italian cover)</description>
+ <description>Pyjamarama (Italy)</description>
<year>1984</year>
- <publisher>Mikro-Gen Ltd</publisher>
+ <publisher>Jackson Soft</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="39411">
<rom name="pyjamarama (italian).tzx" size="39411" crc="a0bdf65f" sha1="bbbb7efa1929c2bf5a8e890121fa66d115d9943a"/>
@@ -110369,7 +110370,7 @@ license:CC0
</software>
<software name="prameses">
- <description>Pyramid Of Rameses</description>
+ <description>Pyramid of Rameses</description>
<year>1983</year>
<publisher>Longman Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -110380,7 +110381,7 @@ license:CC0
</software>
<software name="rsphinx" cloneof="prameses">
- <description>Riddle Of The Sphinx</description>
+ <description>Riddle of the Sphinx</description>
<year>1983</year>
<publisher>Longman Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -110495,7 +110496,7 @@ license:CC0
</software>
<software name="pendantl">
- <description>The Pendant Of Logryn (set 1)</description>
+ <description>The Pendant of Logryn (set 1)</description>
<year>1989</year>
<publisher>Jamie Murphy</publisher>
<part name="cass" interface="spectrum_cass">
@@ -110506,7 +110507,7 @@ license:CC0
</software>
<software name="pendantla" cloneof="pendantl">
- <description>The Pendant Of Logryn (set 2)</description>
+ <description>The Pendant of Logryn (set 2)</description>
<year>1989</year>
<publisher>Jamie Murphy</publisher>
<part name="cass" interface="spectrum_cass">
@@ -110517,7 +110518,7 @@ license:CC0
</software>
<software name="pentacle">
- <description>Within The Pentacle</description>
+ <description>Within the Pentacle</description>
<year>19??</year>
<publisher>Anthony Byrne</publisher>
<part name="cass" interface="spectrum_cass">
@@ -110572,7 +110573,7 @@ license:CC0
</software>
<software name="theplagu">
- <description>The Plagues Of Egypt</description>
+ <description>The Plagues of Egypt</description>
<year>1990</year>
<publisher>Mike Young</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -110673,7 +110674,7 @@ license:CC0
</software>
<software name="theprice">
- <description>The Price Of Magik (set 2)</description>
+ <description>The Price of Magik (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -110689,7 +110690,7 @@ license:CC0
</software>
<software name="theprice_b" cloneof="theprice">
- <description>The Price Of Magik</description>
+ <description>The Price of Magik</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -110727,7 +110728,7 @@ license:CC0
</software>
<software name="ptyndal">
- <description>The Prince Of Tyndal (set 1)</description>
+ <description>The Prince of Tyndal (set 1)</description>
<year>1987</year>
<publisher>Tartan Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -110738,7 +110739,7 @@ license:CC0
</software>
<software name="ptyndala" cloneof="ptyndal">
- <description>The Prince Of Tyndal (set 2)</description>
+ <description>The Prince of Tyndal (set 2)</description>
<year>1987</year>
<publisher>Tartan Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -110749,7 +110750,7 @@ license:CC0
</software>
<software name="ptyndalb" cloneof="ptyndal">
- <description>The Prince Of Tyndal (set 3, YS Freebie)</description>
+ <description>The Prince of Tyndal (set 3, YS Freebie)</description>
<year>1987</year>
<publisher>Tartan Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -111524,7 +111525,7 @@ license:CC0
</software>
<software name="quizofeu">
- <description>Quiz Of Europe</description>
+ <description>Quiz of Europe</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -111638,7 +111639,7 @@ license:CC0
</software>
<software name="thequest_g" cloneof="thequest">
- <description>The Quest Of The Golden Orange Peel</description>
+ <description>The Quest of the Golden Orange Peel</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -112033,7 +112034,7 @@ license:CC0
</software>
<software name="raidmine">
- <description>Raider Of The Cursed Mine</description>
+ <description>Raider of the Cursed Mine</description>
<year>1983</year>
<publisher>Arcade Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -112044,7 +112045,7 @@ license:CC0
</software>
<software name="raidfark">
- <description>Raider Of The Forgotten Ark</description>
+ <description>Raider of the Forgotten Ark</description>
<year>1984</year>
<publisher>Spectrasoft</publisher>
<part name="cass" interface="spectrum_cass">
@@ -112066,7 +112067,7 @@ license:CC0
</software>
<software name="raidtomb">
- <description>Raiders Of The Lost Tomb</description>
+ <description>Raiders of the Lost Tomb</description>
<year>1996</year>
<publisher>The Adventure Workshop</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -112765,7 +112766,7 @@ license:CC0
</software>
<software name="raymondp">
- <description>Raymond Pringle's Quest For The Fabled Jar Of Pickled Cabbage</description>
+ <description>Raymond Pringle's Quest for the Fabled Jar of Pickled Cabbage</description>
<year>1991</year>
<publisher>Delbert the Hamster</publisher>
<part name="cass" interface="spectrum_cass">
@@ -112776,7 +112777,7 @@ license:CC0
</software>
<software name="razasden">
- <description>Razas De Noche (Erbe - Musical 1)</description>
+ <description>Razas de Noche (Erbe - Musical 1)</description>
<year>1990</year>
<publisher>Musical 1</publisher>
<part name="cass" interface="spectrum_cass">
@@ -112916,7 +112917,7 @@ license:CC0
</software>
<software name="realmofd">
- <description>Realm Of Darkness (Zenobi)</description>
+ <description>Realm of Darkness (Zenobi)</description>
<year>1987</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -112927,7 +112928,7 @@ license:CC0
</software>
<software name="realmofd_a" cloneof="realmofd">
- <description>Realm Of Darkness</description>
+ <description>Realm of Darkness</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -112938,7 +112939,7 @@ license:CC0
</software>
<software name="realmofi">
- <description>Realm Of Impossibility (Dro Soft)</description>
+ <description>Realm of Impossibility (Dro Soft)</description>
<year>1985</year>
<publisher>Dro Soft</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -112954,7 +112955,7 @@ license:CC0
</software>
<software name="realmofi_a" cloneof="realmofi">
- <description>Realm Of Impossibility</description>
+ <description>Realm of Impossibility</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -112970,7 +112971,7 @@ license:CC0
</software>
<software name="realmoft">
- <description>Realm Of The Undead (MC Lothlorien)</description>
+ <description>Realm of the Undead (MC Lothlorien)</description>
<year>1984</year>
<publisher>MC Lothlorien</publisher>
<part name="cass" interface="spectrum_cass">
@@ -112981,7 +112982,7 @@ license:CC0
</software>
<software name="realmoft_a" cloneof="realmoft">
- <description>Realm Of The Undead</description>
+ <description>Realm of the Undead</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -113577,7 +113578,7 @@ license:CC0
</software>
<software name="rwarrior">
- <description>Return Of The Warrior</description>
+ <description>Return of the Warrior</description>
<year>1984</year>
<publisher>Larsoft</publisher>
<part name="cass" interface="spectrum_cass">
@@ -113588,7 +113589,7 @@ license:CC0
</software>
<software name="reteartha" cloneof="retearth">
- <description>Return To Earth (set 2)</description>
+ <description>Return to Earth (set 2)</description>
<year>1982</year>
<publisher>Saturnsoft</publisher>
<part name="cass" interface="spectrum_cass">
@@ -113599,7 +113600,7 @@ license:CC0
</software>
<software name="retearth">
- <description>Return To Earth</description>
+ <description>Return to Earth</description>
<year>1982</year>
<publisher>Saturnsoft</publisher>
<part name="cass" interface="spectrum_cass">
@@ -113610,7 +113611,7 @@ license:CC0
</software>
<software name="reteden">
- <description>Return To Eden</description>
+ <description>Return to Eden</description>
<year>1984</year>
<publisher>Level 9 Computing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -113621,7 +113622,7 @@ license:CC0
</software>
<software name="retithabf" cloneof="retitha">
- <description>Return To Ithaca (bugfix)</description>
+ <description>Return to Ithaca (bugfix)</description>
<year>1985</year>
<publisher>Atlantis Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -113632,7 +113633,7 @@ license:CC0
</software>
<software name="retitha">
- <description>Return To Ithaca</description>
+ <description>Return to Ithaca</description>
<year>1985</year>
<publisher>Atlantis Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -113643,7 +113644,7 @@ license:CC0
</software>
<software name="retoz">
- <description>Return To Oz</description>
+ <description>Return to Oz</description>
<year>1986</year>
<publisher>U.S. Gold</publisher>
<part name="cass" interface="spectrum_cass">
@@ -113801,7 +113802,7 @@ license:CC0
</software>
<software name="revisedc">
- <description>Revised Champions Of Cricket - 2 To 6 Version Mark 5 -(side 2 only)</description>
+ <description>Revised Champions of Cricket - 2 To 6 Version Mark 5 -(side 2 only)</description>
<year>1994</year>
<publisher>Lambourne Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -113812,7 +113813,7 @@ license:CC0
</software>
<software name="revisedc_a" cloneof="revisedc">
- <description>Revised Champions Of Cricket 1993</description>
+ <description>Revised Champions of Cricket 1993</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -113828,7 +113829,7 @@ license:CC0
</software>
<software name="revisedc_c" cloneof="revisedc">
- <description>Revised Champions Of Cricket 1994</description>
+ <description>Revised Champions of Cricket 1994</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -113844,7 +113845,7 @@ license:CC0
</software>
<software name="revisedw">
- <description>Revised World Cup Cricket - Great Players Of The Sixties</description>
+ <description>Revised World Cup Cricket - Great Players of the Sixties</description>
<year>1994</year>
<publisher>Lambourne Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -114107,7 +114108,7 @@ license:CC0
</software>
<software name="ringmerl">
- <description>Rings Of Merlin (set 1)</description>
+ <description>Rings of Merlin (set 1)</description>
<year>1986</year>
<publisher>Central Solutions</publisher>
<part name="cass" interface="spectrum_cass">
@@ -114118,7 +114119,7 @@ license:CC0
</software>
<software name="ringmerla" cloneof="ringmerl">
- <description>Rings Of Merlin (set 2)</description>
+ <description>Rings of Merlin (set 2)</description>
<year>1986</year>
<publisher>Central Solutions</publisher>
<part name="cass" interface="spectrum_cass">
@@ -114424,7 +114425,7 @@ license:CC0
</software>
<software name="robinofs">
- <description>Robin Of Sherlock (CRL)</description>
+ <description>Robin of Sherlock (CRL)</description>
<year>1986</year>
<publisher>CRL Group</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -114440,7 +114441,7 @@ license:CC0
</software>
<software name="robinofs_a" cloneof="robinofs">
- <description>Robin Of Sherlock (GI Games)</description>
+ <description>Robin of Sherlock (GI Games)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -114456,7 +114457,7 @@ license:CC0
</software>
<software name="robinofs_b" cloneof="robinofs">
- <description>Robin Of Sherlock (Zenobi)</description>
+ <description>Robin of Sherlock (Zenobi)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -114472,7 +114473,7 @@ license:CC0
</software>
<software name="robinofs_c" cloneof="robinofs">
- <description>Robin Of Sherlock (set 2)</description>
+ <description>Robin of Sherlock (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -114488,7 +114489,7 @@ license:CC0
</software>
<software name="robinofs_d" cloneof="robinofs">
- <description>Robin Of Sherlock</description>
+ <description>Robin of Sherlock</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -114526,7 +114527,7 @@ license:CC0
</software>
<software name="robinoft">
- <description>Robin Of The Wood - 128k</description>
+ <description>Robin of the Wood (128K)</description>
<year>1985</year>
<publisher>Adventure International</publisher>
<part name="cass" interface="spectrum_cass">
@@ -114537,7 +114538,7 @@ license:CC0
</software>
<software name="robinoft_a" cloneof="robinoft">
- <description>Robin Of The Wood - 48k</description>
+ <description>Robin of the Wood (48K)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -115505,7 +115506,7 @@ license:CC0
</software>
<software name="royofthe">
- <description>Roy Of The Rovers</description>
+ <description>Roy of the Rovers</description>
<year>1988</year>
<publisher>Gremlin Graphics Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -115521,7 +115522,7 @@ license:CC0
</software>
<software name="royaladv">
- <description>Royal Adventure Of A Common Frog</description>
+ <description>Royal Adventure of a Common Frog</description>
<year>1985</year>
<publisher>Automata UK</publisher>
<part name="cass" interface="spectrum_cass">
@@ -115758,7 +115759,7 @@ license:CC0
</software>
<software name="ruleofth">
- <description>Rule Of The Road Tutor</description>
+ <description>Rule of the Road Tutor</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -115769,7 +115770,7 @@ license:CC0
</software>
<software name="rulett12">
- <description>Rulett - 128k</description>
+ <description>Rulett (128K)</description>
<year>2005</year>
<publisher>NyitraiSOFT</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116200,7 +116201,7 @@ license:CC0
</software>
<software name="theretur">
- <description>The Return Of The Holy Joystick (GI Games)</description>
+ <description>The Return of the Holy Joystick (G.I. Games)</description>
<year>1984</year>
<publisher>G.I. Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116211,7 +116212,7 @@ license:CC0
</software>
<software name="therifts">
- <description>The Rifts Of Time (set 3)</description>
+ <description>The Rifts of Time (set 3)</description>
<year>1984</year>
<publisher>Pocket Money</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116222,7 +116223,7 @@ license:CC0
</software>
<software name="therifts_a" cloneof="therifts">
- <description>The Rifts Of Time (set 2)</description>
+ <description>The Rifts of Time (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116233,7 +116234,7 @@ license:CC0
</software>
<software name="therifts_b" cloneof="therifts">
- <description>The Rifts Of Time</description>
+ <description>The Rifts of Time</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116244,7 +116245,7 @@ license:CC0
</software>
<software name="theringo">
- <description>The Ring Of Darkness</description>
+ <description>The Ring of Darkness</description>
<year>1983</year>
<publisher>Wintersoft</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -116260,7 +116261,7 @@ license:CC0
</software>
<software name="theringo_b" cloneof="theringo">
- <description>The Ring Of Dreams (set 2)</description>
+ <description>The Ring of Dreams (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116271,7 +116272,7 @@ license:CC0
</software>
<software name="theringo_c" cloneof="theringo">
- <description>The Ring Of Dreams</description>
+ <description>The Ring of Dreams</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116282,7 +116283,7 @@ license:CC0
</software>
<software name="theringo_d" cloneof="theringo">
- <description>The Ring Of Inger (set 3)</description>
+ <description>The Ring of Inger (set 3)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116293,7 +116294,7 @@ license:CC0
</software>
<software name="theringo_e" cloneof="theringo">
- <description>The Ring Of Inger (set 2)</description>
+ <description>The Ring of Inger (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116304,7 +116305,7 @@ license:CC0
</software>
<software name="theringo_f" cloneof="theringo">
- <description>The Ring Of Inger</description>
+ <description>The Ring of Inger</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116315,7 +116316,7 @@ license:CC0
</software>
<software name="therings">
- <description>The Rings Of Saturn</description>
+ <description>The Rings of Saturn</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116414,7 +116415,7 @@ license:CC0
</software>
<software name="therunes">
- <description>The Runes Of Zendos</description>
+ <description>The Runes of Zendos</description>
<year>1984</year>
<publisher>Dorcas</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116425,7 +116426,7 @@ license:CC0
</software>
<software name="therunes_a" cloneof="therunes">
- <description>The Runestone Of Zaobab</description>
+ <description>The Runestone of Zaobab</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116554,7 +116555,7 @@ license:CC0
</software>
<software name="sacredru">
- <description>Sacred Ruby Of The Toggalids (set 2)</description>
+ <description>Sacred Ruby of the Toggalids (set 2)</description>
<year>1984</year>
<publisher>Goldstar</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116565,7 +116566,7 @@ license:CC0
</software>
<software name="sacredru_a" cloneof="sacredru">
- <description>Sacred Ruby Of The Toggalids</description>
+ <description>Sacred Ruby of the Toggalids</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -116576,7 +116577,7 @@ license:CC0
</software>
<software name="sagaspri">
- <description>SAGA - Sprites And Graphic Animator</description>
+ <description>SAGA - Sprites and Graphic Animator</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -117366,7 +117367,7 @@ license:CC0
</software>
<software name="sceptreo">
- <description>Sceptre Of Bagdad</description>
+ <description>Sceptre of Bagdad</description>
<year>1987</year>
<publisher>Atlantis</publisher>
<part name="cass" interface="spectrum_cass">
@@ -117933,7 +117934,7 @@ license:CC0
</software>
<software name="sekaaofa">
- <description>Se-Kaa Of Assiah (Mastertronic)</description>
+ <description>Se-Kaa of Assiah (Mastertronic)</description>
<year>1984</year>
<publisher>Mastervision</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -117949,7 +117950,7 @@ license:CC0
</software>
<software name="sekaaofa_a" cloneof="sekaaofa">
- <description>Se-Kaa Of Assiah (Zenobi)</description>
+ <description>Se-Kaa of Assiah (Zenobi)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -117965,7 +117966,7 @@ license:CC0
</software>
<software name="sekaaofa_b" cloneof="sekaaofa">
- <description>Se-Kaa Of Assiah</description>
+ <description>Se-Kaa of Assiah</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -118003,7 +118004,7 @@ license:CC0
</software>
<software name="seaofzir">
- <description>Sea Of Zirun (set 2)</description>
+ <description>Sea of Zirun (set 2)</description>
<year>1985</year>
<publisher>Gilsoft International</publisher>
<part name="cass" interface="spectrum_cass">
@@ -118014,7 +118015,7 @@ license:CC0
</software>
<software name="seaofzir_a" cloneof="seaofzir">
- <description>Sea Of Zirun</description>
+ <description>Sea of Zirun</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -118085,7 +118086,7 @@ license:CC0
</software>
<software name="seasofbl">
- <description>Seas Of Blood (set 2)</description>
+ <description>Seas of Blood (set 2)</description>
<year>1985</year>
<publisher>Adventure International</publisher>
<part name="cass" interface="spectrum_cass">
@@ -118096,7 +118097,7 @@ license:CC0
</software>
<software name="seasofbl_a" cloneof="seasofbl">
- <description>Seas Of Blood</description>
+ <description>Seas of Blood</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -118503,7 +118504,7 @@ license:CC0
<software name="shadbeas">
- <description>Shadow Of The Beast (set 1)</description>
+ <description>Shadow of the Beast (set 1)</description>
<year>1990</year>
<publisher>Gremlin Graphics Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -118529,9 +118530,9 @@ license:CC0
</software>
<software name="shadbeasa" cloneof="shadbeas">
- <description>Shadow Of The Beast (set 2, GBH)</description>
+ <description>Shadow of the Beast (GBH)</description>
<year>1990</year>
- <publisher>Gremlin Graphics Software Ltd / GBH</publisher>
+ <publisher>GBH</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="31206">
<rom name="shadow of the beast - side 1 (gbh).tzx" size="31206" crc="b589eefa" sha1="1637904bc86ce649597c93c26326f96501d1f301"/>
@@ -118658,7 +118659,7 @@ license:CC0
</software>
<software name="shadowso">
- <description>Shadows Of Mordor (set 2)</description>
+ <description>Shadows of Mordor (set 2)</description>
<year>1987</year>
<publisher>Melbourne House</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -118674,7 +118675,7 @@ license:CC0
</software>
<software name="shadowso_b" cloneof="shadowso">
- <description>Shadows Of Mordor</description>
+ <description>Shadows of Mordor</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -118691,7 +118692,7 @@ license:CC0
<software name="shadpast">
- <description>Shadows Of The Past</description>
+ <description>Shadows of the Past</description>
<year>1990</year>
<publisher>Compass</publisher>
<part name="cass" interface="spectrum_cass">
@@ -118702,7 +118703,7 @@ license:CC0
</software>
<software name="shadpasta" cloneof="shadpast">
- <description>Shadows Of The Past (set 2)</description>
+ <description>Shadows of the Past (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -118713,7 +118714,7 @@ license:CC0
</software>
<software name="shadpastmast" cloneof="shadpast">
- <description>Shadows Of The Past (Mastering Tape)</description>
+ <description>Shadows of the Past (master tape)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -118724,7 +118725,7 @@ license:CC0
</software>
<software name="shakenbu">
- <description>Shaken But Not Stirred</description>
+ <description>Shaken but not Stirred</description>
<year>1983</year>
<publisher>Richard Shepherd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -118768,7 +118769,7 @@ license:CC0
</software>
<software name="shakespe_c" cloneof="shakespe">
- <description>Shakespeare - Merchant Of Venice</description>
+ <description>Shakespeare - Merchant of Venice</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -118779,7 +118780,7 @@ license:CC0
</software>
<software name="shakespe_d" cloneof="shakespe">
- <description>Shakespeare - Romeo And Juliet</description>
+ <description>Shakespeare - Romeo and Juliet</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -118857,7 +118858,7 @@ license:CC0
<software name="shardofi">
- <description>Shard Of Inovar (Zenobi)</description>
+ <description>Shard of Inovar (Zenobi)</description>
<year>1987</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -118868,7 +118869,7 @@ license:CC0
</software>
<software name="shardofi_a" cloneof="shardofi">
- <description>Shard Of Inovar</description>
+ <description>Shard of Inovar</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -119126,7 +119127,7 @@ license:CC0
<software name="shipofth">
- <description>Ship Of The Line - Release 1</description>
+ <description>Ship of the Line - Release 1</description>
<year>1982</year>
<publisher>Richard Shepherd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -119137,7 +119138,7 @@ license:CC0
</software>
<software name="shipofth_a" cloneof="shipofth">
- <description>Ship Of The Line - Release 2</description>
+ <description>Ship of the Line - Release 2</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -119448,7 +119449,7 @@ license:CC0
<software name="sservice">
- <description>Silent Service (set 1)</description>
+ <description>Silent Service</description>
<year>1987</year>
<publisher>MicroProse</publisher>
<part name="cass" interface="spectrum_cass">
@@ -119459,9 +119460,9 @@ license:CC0
</software>
<software name="sservicek" cloneof="sservice">
- <description>Silent Service (set 2, Kixx)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>Silent Service (Kixx)</description>
+ <year>1987</year>
+ <publisher>Kixx</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="48723">
<rom name="silent service (kixx).tzx" size="48723" crc="5819fdf8" sha1="c40c71b911222649d1f3d0e32312b6f187b3966d"/>
@@ -121999,7 +122000,7 @@ license:CC0
</software>
<software name="sonofbla">
- <description>Son Of Blagger (Dixons)</description>
+ <description>Son of Blagger (Dixons)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -122010,7 +122011,7 @@ license:CC0
</software>
<software name="sonofbla_a" cloneof="sonofbla">
- <description>Son Of Blagger</description>
+ <description>Son of Blagger</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -122092,7 +122093,7 @@ license:CC0
</software>
<software name="sorcerer_a" cloneof="sorcerer">
- <description>Sorcerer Of Claymorgue Castle (set 2)</description>
+ <description>Sorcerer of Claymorgue Castle (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -122103,7 +122104,7 @@ license:CC0
</software>
<software name="sorcerer_b" cloneof="sorcerer">
- <description>Sorcerer Of Claymorgue Castle</description>
+ <description>Sorcerer of Claymorgue Castle</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -122169,7 +122170,7 @@ license:CC0
</software>
<software name="soulofar">
- <description>Soul Of A Robot</description>
+ <description>Soul of a Robot</description>
<year>1985</year>
<publisher>Mastertronic</publisher>
<part name="cass" interface="spectrum_cass">
@@ -122180,7 +122181,7 @@ license:CC0
</software>
<software name="soulsofd">
- <description>Souls Of Darkon (Bug-Byte)</description>
+ <description>Souls of Darkon (Bug-Byte)</description>
<year>1985</year>
<publisher>Bug-Byte Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -122191,7 +122192,7 @@ license:CC0
</software>
<software name="soulsofd_a" cloneof="soulsofd">
- <description>Souls Of Darkon</description>
+ <description>Souls of Darkon</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -122963,7 +122964,7 @@ license:CC0
</software>
<software name="spawnofe">
- <description>Spawn Of Evil - Release 1</description>
+ <description>Spawn of Evil - Release 1</description>
<year>1983</year>
<publisher>DK'Tronics</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -122979,7 +122980,7 @@ license:CC0
</software>
<software name="spawnofe_b" cloneof="spawnofe">
- <description>Spawn Of Evil - Release 2</description>
+ <description>Spawn of Evil - Release 2</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -124801,7 +124802,7 @@ license:CC0
</software>
<software name="spellofc">
- <description>Spell Of Christmas Ice</description>
+ <description>Spell of Christmas Ice</description>
<year>1984</year>
<publisher>Star Dreams</publisher>
<part name="cass" interface="spectrum_cass">
@@ -124850,7 +124851,7 @@ license:CC0
</software>
<software name="sphereof">
- <description>Sphere Of Q'li</description>
+ <description>Sphere of Q'li</description>
<year>1996</year>
<publisher>The Adventure Workshop</publisher>
<part name="cass" interface="spectrum_cass">
@@ -125227,7 +125228,7 @@ license:CC0
</software>
<software name="sportofk">
- <description>Sport Of Kings</description>
+ <description>Sport of Kings</description>
<year>1986</year>
<publisher>Mastertronic Added Dimension</publisher>
<part name="cass" interface="spectrum_cass">
@@ -125532,7 +125533,7 @@ license:CC0
</software>
<software name="staffofz">
- <description>Staff Of Zaranol (set 2)</description>
+ <description>Staff of Zaranol (set 2)</description>
<year>1984</year>
<publisher>CCS</publisher>
<part name="cass" interface="spectrum_cass">
@@ -125543,7 +125544,7 @@ license:CC0
</software>
<software name="staffofz_a" cloneof="staffofz">
- <description>Staff Of Zaranol</description>
+ <description>Staff of Zaranol</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -128901,7 +128902,7 @@ license:CC0
</software>
<software name="smantmos">
- <description>Superman - The Man Of Steel (set 1)</description>
+ <description>Superman - The Man of Steel</description>
<year>1989</year>
<publisher>Tynesoft</publisher>
<part name="cass" interface="spectrum_cass">
@@ -128912,9 +128913,9 @@ license:CC0
</software>
<software name="smantmosa" cloneof="smantmos">
- <description>Superman - The Man of Steel (set 2, System 4)</description>
+ <description>Superman - The Man of Steel (System 4)</description>
<year>1989</year>
- <publisher>Tynesoft / System 4</publisher>
+ <publisher>System 4</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="154480">
<rom name="superman - the man of steel - side 1 (system 4).tzx" size="154480" crc="dc19a808" sha1="5a89285e7f1405ecb233072adbd88c3aa0e1c1f3"/>
@@ -129238,7 +129239,7 @@ license:CC0
</software>
<software name="swordoft">
- <description>Sword Of The Samurai</description>
+ <description>Sword of the Samurai</description>
<year>1992</year>
<publisher>Zeppelin Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129265,7 +129266,7 @@ license:CC0
</software>
<software name="swordfig">
- <description>Swordfight At Midnight</description>
+ <description>Swordfight at Midnight</description>
<year>1983</year>
<publisher>Sunshine Books</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129276,7 +129277,7 @@ license:CC0
</software>
<software name="swordsof">
- <description>Swords Of Bane</description>
+ <description>Swords of Bane</description>
<year>1986</year>
<publisher>CCS</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -129294,7 +129295,7 @@ license:CC0
<software name="synonimy">
<description>Synonimy i Antonimy</description>
<year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <publisher>Polmer</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="20330">
<rom name="synonimy i antonimy.tzx" size="20330" crc="36e7834c" sha1="5473f3c5955617c89ff974e9a39ae84b9f35ffe0"/>
@@ -129434,7 +129435,7 @@ license:CC0
</software>
<software name="thesabat">
- <description>The Sabat Of Milton Gordon (set 2)</description>
+ <description>The Sabat of Milton Gordon (set 2)</description>
<year>1990</year>
<publisher>The Adventure Club</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129445,7 +129446,7 @@ license:CC0
</software>
<software name="thesabat_a" cloneof="thesabat">
- <description>The Sabat Of Milton Gordon</description>
+ <description>The Sabat of Milton Gordon</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129457,7 +129458,7 @@ license:CC0
<software name="thesagao">
- <description>The Saga Of A Mad Barbarian (The Guild)</description>
+ <description>The Saga of a Mad Barbarian (The Guild)</description>
<year>1991</year>
<publisher>The Guild</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129468,7 +129469,7 @@ license:CC0
</software>
<software name="thesagao_a" cloneof="thesagao">
- <description>The Saga Of A Mad Barbarian - +D Bugfix (The Guild)</description>
+ <description>The Saga of a Mad Barbarian - +D Bugfix (The Guild)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129479,7 +129480,7 @@ license:CC0
</software>
<software name="thesagao_b" cloneof="thesagao">
- <description>The Saga Of A Mad Barbarian</description>
+ <description>The Saga of a Mad Barbarian</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129490,7 +129491,7 @@ license:CC0
</software>
<software name="thesagao_c" cloneof="thesagao">
- <description>The Saga Of Erik The Viking (set 2)</description>
+ <description>The Saga of Erik the Viking (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129501,7 +129502,7 @@ license:CC0
</software>
<software name="thesagao_d" cloneof="thesagao">
- <description>The Saga Of Erik The Viking</description>
+ <description>The Saga of Erik the Viking</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129539,7 +129540,7 @@ license:CC0
</software>
<software name="thescrol">
- <description>The Scrolls Of Thram</description>
+ <description>The Scrolls of Thram</description>
<year>1985</year>
<publisher>Lee Tonks</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129621,7 +129622,7 @@ license:CC0
</software>
<software name="sdadmole">
- <description>The Secret Diary Of Adrian Mole (set 1)</description>
+ <description>The Secret Diary of Adrian Mole</description>
<year>1985</year>
<publisher>Mosaic Publishing Ltd</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -129637,9 +129638,9 @@ license:CC0
</software>
<software name="sdadmolea" cloneof="sdadmole">
- <description>The Secret Diary Of Adrian Mole (set 2, Alternative)</description>
+ <description>The Secret Diary of Adrian Mole (Alternative)</description>
<year>1985</year>
- <publisher>Mosaic Publishing Ltd / Alternative</publisher>
+ <publisher>Alternative</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="85557">
<rom name="the secret diary of adrian mole (alternative).tzx" size="85557" crc="24ecc943" sha1="736ba4e5c7c0b5746ec92e7a792ce9ab67aa5a00"/>
@@ -129649,7 +129650,7 @@ license:CC0
<software name="secrtlev">
- <description>The Secret Of Levitation</description>
+ <description>The Secret of Levitation</description>
<year>1986</year>
<publisher>Americana Software Ltd</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129660,7 +129661,7 @@ license:CC0
</software>
<software name="secrtlh">
- <description>The Secret Of Little Hodcome (set 1)</description>
+ <description>The Secret of Little Hodcome (set 1)</description>
<year>1987</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129671,7 +129672,7 @@ license:CC0
</software>
<software name="secrtlha" cloneof="secrtlh">
- <description>The Secret Of Little Hodcome (set 2)</description>
+ <description>The Secret of Little Hodcome (set 2)</description>
<year>1987</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129682,7 +129683,7 @@ license:CC0
</software>
<software name="stbrides">
- <description>The Secret Of St. Brides (set 1)</description>
+ <description>The Secret of St. Brides (set 1)</description>
<year>1985</year>
<publisher>St. Bride's School</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129693,7 +129694,7 @@ license:CC0
</software>
<software name="stbridesa" cloneof="stbrides">
- <description>The Secret Of St. Brides (set 2)</description>
+ <description>The Secret of St. Brides (set 2)</description>
<year>1985</year>
<publisher>St. Bride's School</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129704,7 +129705,7 @@ license:CC0
</software>
<software name="stbridesb" cloneof="stbrides">
- <description>The Secret Of St. Brides (set 3)</description>
+ <description>The Secret of St. Brides (set 3)</description>
<year>1985</year>
<publisher>St. Bride's School</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129715,7 +129716,7 @@ license:CC0
</software>
<software name="stbridesc" cloneof="stbrides">
- <description>The Secret Of St. Brides (set 4)</description>
+ <description>The Secret of St. Brides (set 4)</description>
<year>1985</year>
<publisher>St. Bride's School</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129726,9 +129727,9 @@ license:CC0
</software>
<software name="stbridesd" cloneof="stbrides">
- <description>The Secret Of St. Brides (set 5, GI Games)</description>
+ <description>The Secret of St. Brides (set 5, G.I. Games)</description>
<year>1985</year>
- <publisher>St. Bride's School / GI Games</publisher>
+ <publisher>G.I. Games</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="43908">
<rom name="the secret of st. brides (gi games).tzx" size="43908" crc="42a3ead4" sha1="31cfc1388a309132fcc5bc13004b1daed1b0f356"/>
@@ -129792,7 +129793,7 @@ license:CC0
</software>
<software name="semidet">
- <description>The Semi-Detached At The End Of The Street (set 1)</description>
+ <description>The Semi-Detached at the End of the Street (set 1)</description>
<year>2000</year>
<publisher>S. Phipps</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129803,7 +129804,7 @@ license:CC0
</software>
<software name="semideta" cloneof="semidet">
- <description>The Semi-Detached At The End Of The Street (set 2)</description>
+ <description>The Semi-Detached at the End of the Street (set 2)</description>
<year>2000</year>
<publisher>S. Phipps</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129847,7 +129848,7 @@ license:CC0
</software>
<software name="theseven">
- <description>The Seven Parchments Of Kandos</description>
+ <description>The Seven Parchments of Kandos</description>
<year>1989</year>
<publisher>Sinclair User</publisher>
<part name="cass" interface="spectrum_cass">
@@ -129955,7 +129956,7 @@ license:CC0
</software>
<software name="thesongo">
- <description>The Song Of Taliesin</description>
+ <description>The Song of Taliesin</description>
<year>1994</year>
<publisher>Zenobi Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -130068,7 +130069,7 @@ license:CC0
</software>
<software name="thespect">
- <description>The Spectre Of Booballyhoo</description>
+ <description>The Spectre of Booballyhoo</description>
<year>1987</year>
<publisher>Infected</publisher>
<part name="cass" interface="spectrum_cass">
@@ -130079,7 +130080,7 @@ license:CC0
</software>
<software name="thespect_a" cloneof="thespect">
- <description>The Spectre Of Castle Coris (Adventure Probe)</description>
+ <description>The Spectre of Castle Coris (Adventure Probe)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -130095,7 +130096,7 @@ license:CC0
</software>
<software name="thespect_c" cloneof="thespect">
- <description>The Spectre Of Castle Coris (set 2)</description>
+ <description>The Spectre of Castle Coris (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -130111,7 +130112,7 @@ license:CC0
</software>
<software name="thespect_e" cloneof="thespect">
- <description>The Spectre Of Castle Coris</description>
+ <description>The Spectre of Castle Coris</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -130127,7 +130128,7 @@ license:CC0
</software>
<software name="thespect_g" cloneof="thespect">
- <description>The Spectre Of Larry Horsfield</description>
+ <description>The Spectre of Larry Horsfield</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -130186,7 +130187,7 @@ license:CC0
</software>
<software name="thesport">
- <description>The Sport Of Kings Challenge</description>
+ <description>The Sport of Kings Challenge</description>
<year>1985</year>
<publisher>Season Soft</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -130261,7 +130262,7 @@ license:CC0
</software>
<software name="thestaff">
- <description>The Staff Of Power (set 2)</description>
+ <description>The Staff of Power (set 2)</description>
<year>1991</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -130272,7 +130273,7 @@ license:CC0
</software>
<software name="thestaff_a" cloneof="thestaff">
- <description>The Staff Of Power v3</description>
+ <description>The Staff of Power v3</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -130283,7 +130284,7 @@ license:CC0
</software>
<software name="thestaff_b" cloneof="thestaff">
- <description>The Staff Of Power</description>
+ <description>The Staff of Power</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -130327,7 +130328,7 @@ license:CC0
</software>
<software name="thestory">
- <description>The Story Of Dave - Part II</description>
+ <description>The Story of Dave - Part II</description>
<year>1984</year>
<publisher>MNL</publisher>
<part name="cass" interface="spectrum_cass">
@@ -130338,7 +130339,7 @@ license:CC0
</software>
<software name="thestory_a" cloneof="thestory">
- <description>The Story Of Dave - Part III</description>
+ <description>The Story of Dave - Part III</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -130621,7 +130622,7 @@ license:CC0
</software>
<software name="talesoft">
- <description>Tales Of The Arabian Nights (set 2)</description>
+ <description>Tales of the Arabian Nights (set 2)</description>
<year>1985</year>
<publisher>Interceptor</publisher>
<part name="cass" interface="spectrum_cass">
@@ -130632,7 +130633,7 @@ license:CC0
</software>
<software name="talesoft_a" cloneof="talesoft">
- <description>Tales Of The Arabian Nights</description>
+ <description>Tales of the Arabian Nights</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -130665,7 +130666,7 @@ license:CC0
</software>
<software name="talisman_b" cloneof="talisman">
- <description>Talisman Of Lost Souls (set 2)</description>
+ <description>Talisman of Lost Souls (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -130676,7 +130677,7 @@ license:CC0
</software>
<software name="talisman_c" cloneof="talisman">
- <description>Talisman Of Lost Souls</description>
+ <description>Talisman of Lost Souls</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -131606,7 +131607,7 @@ license:CC0
</software>
<software name="toterror">
- <description>Temple Of Terror</description>
+ <description>Temple of Terror</description>
<year>1987</year>
<publisher>U.S. Gold</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -131622,7 +131623,7 @@ license:CC0
</software>
<software name="tempvran">
- <description>Temple Of Vran</description>
+ <description>Temple of Vran</description>
<year>1984</year>
<publisher>Incentive</publisher>
<part name="cass" interface="spectrum_cass">
@@ -131914,7 +131915,7 @@ license:CC0
</software>
<software name="totdeep">
- <description>Terror Of The Deep</description>
+ <description>Terror of the Deep</description>
<year>1987</year>
<publisher>Mirrorsoft</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -132275,7 +132276,7 @@ license:CC0
</software>
<software name="thetales">
- <description>The Tales Of Mathematica</description>
+ <description>The Tales of Mathematica</description>
<year>1990</year>
<publisher>Zenobi Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -132302,7 +132303,7 @@ license:CC0
</software>
<software name="thetears">
- <description>The Tears Of The Moon</description>
+ <description>The Tears of the Moon</description>
<year>1992</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -132313,7 +132314,7 @@ license:CC0
</software>
<software name="theterro">
- <description>The Terror Of Trantoss</description>
+ <description>The Terror of Trantoss</description>
<year>1986</year>
<publisher>Ariolasoft UK</publisher>
<part name="cass" interface="spectrum_cass">
@@ -132367,7 +132368,7 @@ license:CC0
</software>
<software name="thetheor">
- <description>The Theorem Of Pythagoras</description>
+ <description>The Theorem of Pythagoras</description>
<year>1984</year>
<publisher>Griffin</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -132482,7 +132483,7 @@ license:CC0
</software>
<software name="timeend">
- <description>The Time Of The End (set 1)</description>
+ <description>The Time of the End (set 1)</description>
<year>1986</year>
<publisher>Mandarin Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -132498,7 +132499,7 @@ license:CC0
</software>
<software name="timeendb" cloneof="timeend"> <!-- different revision, but only side 1 is here -->
- <description>The Time Of The End (set 2, side 1 only)</description>
+ <description>The Time of the End (set 2, side 1 only)</description>
<year>1986</year>
<publisher>Mandarin Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -132510,7 +132511,7 @@ license:CC0
</software>
<software name="timeenda" cloneof="timeend"> <!-- reworked version? original or hack? -->
- <description>The Time Of The End (set 3, amended)</description>
+ <description>The Time of the End (set 3, amended)</description>
<year>1986</year>
<publisher>Mandarin Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -132527,7 +132528,7 @@ license:CC0
</software>
<software name="thetombo">
- <description>The Tomb Of Dracula</description>
+ <description>The Tomb of Dracula</description>
<year>1983</year>
<publisher>Felix</publisher>
<part name="cass" interface="spectrum_cass">
@@ -132538,7 +132539,7 @@ license:CC0
</software>
<software name="thetower">
- <description>The Tower Of Despair (set 2)</description>
+ <description>The Tower of Despair (set 2)</description>
<year>1984</year>
<publisher>Games Workshop</publisher>
<part name="cass" interface="spectrum_cass">
@@ -132549,7 +132550,7 @@ license:CC0
</software>
<software name="thetower_a" cloneof="thetower">
- <description>The Tower Of Despair</description>
+ <description>The Tower of Despair</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -132647,7 +132648,7 @@ license:CC0
</software>
<software name="tresmeat">
- <description>The Treasure Of Meathos (set 1)</description>
+ <description>The Treasure of Meathos (set 1)</description>
<year>1985</year>
<publisher>J. Copland</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -132663,7 +132664,7 @@ license:CC0
</software>
<software name="tresmeata" cloneof="tresmeat">
- <description>The Treasure Of Meathos (set 2)</description>
+ <description>The Treasure of Meathos (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -132679,7 +132680,7 @@ license:CC0
</software>
<software name="tressant">
- <description>The Treasure Of The Santa Maria</description>
+ <description>The Treasure of the Santa Maria</description>
<year>1991</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -132712,7 +132713,7 @@ license:CC0
</software>
<software name="thetrial">
- <description>The Trials Of Kronos</description>
+ <description>The Trials of Kronos</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -132783,7 +132784,7 @@ license:CC0
</software>
<software name="thetwelv">
- <description>The Twelve Days Of Christmas</description>
+ <description>The Twelve Days of Christmas</description>
<year>1994</year>
<publisher>Zenobi Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -132804,7 +132805,7 @@ license:CC0
</software>
<software name="theatreo">
- <description>Theatre Of Death</description>
+ <description>Theatre of Death</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -132904,7 +132905,7 @@ license:CC0
</software>
<software name="theoryof">
- <description>Theory Of Music Level 1</description>
+ <description>Theory of Music Level 1</description>
<year>1987</year>
<publisher>Ted Kirk</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -132920,7 +132921,7 @@ license:CC0
</software>
<software name="theoryof_b" cloneof="theoryof">
- <description>Theory Of Music Questions And Exercises - 48k</description>
+ <description>Theory of Music Questions and Exercises - 48k</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -132936,7 +132937,7 @@ license:CC0
</software>
<software name="theoryof_c" cloneof="theoryof">
- <description>Theory Of Music Questions And Exercises - 128k</description>
+ <description>Theory of Music Questions and Exercises - 128k</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -133077,7 +133078,7 @@ license:CC0
</software>
<software name="wfireice">
- <description>They Say The World Will Die In Fire And Ice (set 1)</description>
+ <description>They Say The World Will Die in Fire and Ice (set 1)</description>
<year>1984</year>
<publisher>Electric Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -133088,7 +133089,7 @@ license:CC0
</software>
<software name="wfireicea" cloneof="wfireice">
- <description>They Say The World Will Die In Fire And Ice (set 2)</description>
+ <description>They Say The World Will Die in Fire and Ice (set 2)</description>
<year>1984</year>
<publisher>Electric Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -133099,9 +133100,9 @@ license:CC0
</software>
<software name="theystol">
- <description>They Stole A Million</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>They Stole a Million</description>
+ <year>1986</year>
+ <publisher>39 Steps</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="91725">
<rom name="they stole a million.tzx" size="91725" crc="729c0a60" sha1="c0acec7150271de520ca8e892eb7491e902e6ff5"/>
@@ -133335,7 +133336,7 @@ license:CC0
</software>
<software name="thrnbyzr">
- <description>Throne Of Byzrone</description>
+ <description>Throne of Byzrone</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -133346,7 +133347,7 @@ license:CC0
</software>
<software name="thrnfire">
- <description>Throne Of Fire (set 1)</description>
+ <description>Throne of Fire (set 1)</description>
<year>1987</year>
<publisher>Melbourne House</publisher>
<part name="cass" interface="spectrum_cass">
@@ -133357,7 +133358,7 @@ license:CC0
</software>
<software name="thrnfireer" cloneof="thrnfire">
- <description>Throne Of Fire (set 2, Erbe)</description>
+ <description>Throne of Fire (set 2, Erbe)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -133368,7 +133369,7 @@ license:CC0
</software>
<software name="thrnfirer" cloneof="thrnfire">
- <description>Throne Of Fire (set 3, review copy)</description>
+ <description>Throne of Fire (set 3, review copy)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -133379,7 +133380,7 @@ license:CC0
</software>
<software name="throught">
- <description>Through The Keyhole</description>
+ <description>Through the Keyhole</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -134124,7 +134125,7 @@ license:CC0
</software>
<software name="timesofl">
- <description>Times Of Lore</description>
+ <description>Times of Lore</description>
<year>1989</year>
<publisher>Origin Systems</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -134150,24 +134151,24 @@ license:CC0
</part>
</software>
- <software name="tintinon">
- <description>Tin Tin On The Moon (Byte-Back)</description>
+ <software name="tintinmn">
+ <description>Tintin on the Moon</description>
<year>1989</year>
- <publisher>Byte Back</publisher>
+ <publisher>Infogrames</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="40953">
- <rom name="tin tin on the moon (byte-back).tzx" size="40953" crc="28a2852f" sha1="5798906e5d2169fe3a524e8e4ad3699d87c635bc"/>
+ <dataarea name="cass" size="40901">
+ <rom name="tin tin on the moon.tzx" size="40901" crc="ac6351a0" sha1="b69fd1ab21e83a95ac22c5111a30bc3b73bb87ea"/>
</dataarea>
</part>
</software>
- <software name="tintinon_a" cloneof="tintinon">
- <description>Tin Tin On The Moon</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="tintinmna" cloneof="tintinmn">
+ <description>Tintin on the Moon (Byte Back)</description>
+ <year>1989</year>
+ <publisher>Byte Back</publisher>
<part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="40901">
- <rom name="tin tin on the moon.tzx" size="40901" crc="ac6351a0" sha1="b69fd1ab21e83a95ac22c5111a30bc3b73bb87ea"/>
+ <dataarea name="cass" size="40953">
+ <rom name="tin tin on the moon (byte-back).tzx" size="40953" crc="28a2852f" sha1="5798906e5d2169fe3a524e8e4ad3699d87c635bc"/>
</dataarea>
</part>
</software>
@@ -134499,7 +134500,7 @@ license:CC0
<software name="tombofak">
- <description>Tomb Of Akhenaten</description>
+ <description>Tomb of Akhenaten</description>
<year>1984</year>
<publisher>CCS</publisher>
<part name="cass" interface="spectrum_cass">
@@ -134510,7 +134511,7 @@ license:CC0
</software>
<software name="tombofdr">
- <description>Tomb Of Dracula</description>
+ <description>Tomb of Dracula</description>
<year>1983</year>
<publisher>Felix</publisher>
<part name="cass" interface="spectrum_cass">
@@ -134521,7 +134522,7 @@ license:CC0
</software>
<software name="tombofsy">
- <description>Tomb Of Syrinx</description>
+ <description>Tomb of Syrinx</description>
<year>1987</year>
<publisher>The Power House</publisher>
<part name="cass" interface="spectrum_cass">
@@ -134926,7 +134927,7 @@ license:CC0
</software>
<software name="towerofe">
- <description>Tower Of Evil (Alternative)</description>
+ <description>Tower of Evil (Alternative)</description>
<year>1984</year>
<publisher>Alternative Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -134937,7 +134938,7 @@ license:CC0
</software>
<software name="towerofe_a" cloneof="towerofe">
- <description>Tower Of Evil (Sparklers)</description>
+ <description>Tower of Evil (Sparklers)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -134948,7 +134949,7 @@ license:CC0
</software>
<software name="towerofe_b" cloneof="towerofe">
- <description>Tower Of Evil</description>
+ <description>Tower of Evil</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -134959,7 +134960,7 @@ license:CC0
</software>
<software name="towerofl">
- <description>Tower Of Light</description>
+ <description>Tower of Light</description>
<year>1989</year>
<publisher>Caris</publisher>
<part name="cass" interface="spectrum_cass">
@@ -136528,8 +136529,8 @@ license:CC0
<software name="turboesp_a" cloneof="turboesp">
<description>Turbo Esprit (Erbe)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1986</year>
+ <publisher>Erbe Software</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="48929">
<rom name="turbo esprit (erbe).tzx" size="48929" crc="2b5b6741" sha1="878c8b551719faa0e9f75fce3e77efd520d3fd4a"/>
@@ -136784,7 +136785,7 @@ license:CC0
</software>
<software name="twasatim">
- <description>Twas A Time Of Dread</description>
+ <description>Twas a Time of Dread</description>
<year>1992</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -136892,7 +136893,7 @@ license:CC0
</software>
<software name="twisterm">
- <description>Twister - Mother Of Charlotte (set 2) Encoding</description>
+ <description>Twister - Mother of Charlotte (set 2) Encoding</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -136903,7 +136904,7 @@ license:CC0
</software>
<software name="twisterm_a" cloneof="twisterm">
- <description>Twister - Mother Of Charlotte</description>
+ <description>Twister - Mother of Charlotte</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -137060,7 +137061,7 @@ license:CC0
</software>
<software name="tyrantof">
- <description>Tyrant Of Athens (set 2)</description>
+ <description>Tyrant of Athens (set 2)</description>
<year>1982</year>
<publisher>MC Lothlorien</publisher>
<part name="cass" interface="spectrum_cass">
@@ -137071,7 +137072,7 @@ license:CC0
</software>
<software name="tyrantof_a" cloneof="tyrantof">
- <description>Tyrant Of Athens</description>
+ <description>Tyrant of Athens</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -137224,23 +137225,23 @@ license:CC0
</software>
<software name="ugh">
- <description>Ugh!</description>
+ <description>Ugh! (bug fix)</description>
<year>1984</year>
<publisher>Softek International</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="48217">
- <rom name="ugh.tzx" size="48217" crc="b00ee756" sha1="6db26757d30caa9adbfd6135b640b8fe4b6b7f45"/>
+ <rom name="ugh - bugfix.tzx" size="48217" crc="e791de3c" sha1="6e44342210da5a7b3012f8988675c391ec0b8af6"/>
</dataarea>
</part>
</software>
- <software name="ughbugfi">
- <description>Ugh! - Bugfix</description>
+ <software name="ugha" cloneof="ugh">
+ <description>Ugh!</description>
<year>1984</year>
<publisher>Softek International</publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="48217">
- <rom name="ugh - bugfix.tzx" size="48217" crc="e791de3c" sha1="6e44342210da5a7b3012f8988675c391ec0b8af6"/>
+ <rom name="ugh.tzx" size="48217" crc="b00ee756" sha1="6db26757d30caa9adbfd6135b640b8fe4b6b7f45"/>
</dataarea>
</part>
</software>
@@ -137832,7 +137833,7 @@ license:CC0
</software>
<software name="theviola">
- <description>The Violator Of Voodoo</description>
+ <description>The Violator of Voodoo</description>
<year>1991</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -137968,7 +137969,7 @@ license:CC0
</software>
<software name="valleyof">
- <description>Valley Of The Dead</description>
+ <description>Valley of the Dead</description>
<year>1985</year>
<publisher>Pocket Money</publisher>
<part name="cass" interface="spectrum_cass">
@@ -137979,7 +137980,7 @@ license:CC0
</software>
<software name="valleyof_a" cloneof="valleyof">
- <description>Valley Of The Kings</description>
+ <description>Valley of the Kings</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -137990,7 +137991,7 @@ license:CC0
</software>
<software name="vampireh">
- <description>Vampire Hunter Willy - Bugfixed</description>
+ <description>Vampire Hunter Willy (bug fixed)</description>
<year>2011</year>
<publisher>Simon D. Lee</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139098,7 +139099,7 @@ license:CC0
</software>
<software name="vowelsof">
- <description>Vowels Of The Earth</description>
+ <description>Vowels of the Earth</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -139390,7 +139391,7 @@ license:CC0
</software>
<software name="thewarof">
- <description>The War Of The Worlds</description>
+ <description>The War of the Worlds</description>
<year>1984</year>
<publisher>CRL Group</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139401,7 +139402,7 @@ license:CC0
</software>
<software name="thewarlo">
- <description>The Warlock Of Firetop Mountain</description>
+ <description>The Warlock of Firetop Mountain</description>
<year>1984</year>
<publisher>Puffin Books</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139423,7 +139424,7 @@ license:CC0
</software>
<software name="thewayof">
- <description>The Way Of The Exploding Fist (Dro Soft)</description>
+ <description>The Way of the Exploding Fist (Dro Soft)</description>
<year>1988</year>
<publisher>Dro Soft</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139434,7 +139435,7 @@ license:CC0
</software>
<software name="thewayof_a" cloneof="thewayof">
- <description>The Way Of The Exploding Fist (Erbe)</description>
+ <description>The Way of the Exploding Fist (Erbe)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139445,7 +139446,7 @@ license:CC0
</software>
<software name="thewayof_b" cloneof="thewayof">
- <description>The Way Of The Exploding Fist (Ricochet)</description>
+ <description>The Way of the Exploding Fist (Ricochet)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139456,7 +139457,7 @@ license:CC0
</software>
<software name="thewayof_c" cloneof="thewayof">
- <description>The Way Of The Exploding Fist (set 2)</description>
+ <description>The Way of the Exploding Fist (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139467,7 +139468,7 @@ license:CC0
</software>
<software name="thewayof_d" cloneof="thewayof">
- <description>The Way Of The Exploding Fist</description>
+ <description>The Way of the Exploding Fist</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139478,7 +139479,7 @@ license:CC0
</software>
<software name="theweave">
- <description>The Weaver Of Her Dreams (GI Games)</description>
+ <description>The Weaver of Her Dreams (G.I. Games)</description>
<year>1988</year>
<publisher>G.I. Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139489,7 +139490,7 @@ license:CC0
</software>
<software name="theweave_a" cloneof="theweave">
- <description>The Weaver Of Her Dreams (set 2)</description>
+ <description>The Weaver of Her Dreams (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139500,7 +139501,7 @@ license:CC0
</software>
<software name="theweave_b" cloneof="theweave">
- <description>The Weaver Of Her Dreams</description>
+ <description>The Weaver of Her Dreams</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139511,7 +139512,7 @@ license:CC0
</software>
<software name="thewello">
- <description>The Well Of Zol</description>
+ <description>The Well of Zol</description>
<year>1994</year>
<publisher>Zenobi Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139532,10 +139533,10 @@ license:CC0
</part>
</software>
- <software name="thewhite_a" cloneof="thewhite">
- <description>The White Feather Cloak (GI Games)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="whitefc">
+ <description>The White Feather Cloak</description>
+ <year>1991</year>
+ <publisher>G.I. Games</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="43200">
<rom name="the white feather cloak - part 1 (gi games).tzx" size="43200" crc="77a22dbe" sha1="9ab603b5ce54c7f136fc8d37959bfc92bd6b4992"/>
@@ -139548,10 +139549,10 @@ license:CC0
</part>
</software>
- <software name="thewhite_b" cloneof="thewhite">
- <description>The White Feather Cloak</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="whitefca" cloneof="whitefc">
+ <description>The White Feather Cloak (Zenobi Software)</description>
+ <year>1992</year>
+ <publisher>Zenobi Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="44418">
<rom name="the white feather cloak - part 1.tzx" size="44418" crc="00bb4fa9" sha1="bb6e2736be6268a2a67b43c8a00122694c1ec4f9"/>
@@ -139752,7 +139753,7 @@ license:CC0
</software>
<software name="theworld">
- <description>The World Of Grand Prix Racing - 1950s All Time Greats</description>
+ <description>The World of Grand Prix Racing - 1950s All Time Greats</description>
<year>1993</year>
<publisher>Lambourne Games</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139763,7 +139764,7 @@ license:CC0
</software>
<software name="theworld_a" cloneof="theworld">
- <description>The World Of Grand Prix Racing - 1960s All Time Greats</description>
+ <description>The World of Grand Prix Racing - 1960s All Time Greats</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139774,7 +139775,7 @@ license:CC0
</software>
<software name="theworld_b" cloneof="theworld">
- <description>The World Of Grand Prix Racing - 1964-1967</description>
+ <description>The World of Grand Prix Racing - 1964-1967</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139785,7 +139786,7 @@ license:CC0
</software>
<software name="theworld_c" cloneof="theworld">
- <description>The World Of Grand Prix Racing - 1989-1991</description>
+ <description>The World of Grand Prix Racing - 1989-1991</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139796,7 +139797,7 @@ license:CC0
</software>
<software name="theworld_d" cloneof="theworld">
- <description>The World Of Grand Prix Racing - 1993</description>
+ <description>The World of Grand Prix Racing - 1993</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -139807,7 +139808,7 @@ license:CC0
</software>
<software name="theworld_e" cloneof="theworld">
- <description>The World Of Grand Prix Racing</description>
+ <description>The World of Grand Prix Racing</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -139823,7 +139824,7 @@ license:CC0
</software>
<software name="theworld_g" cloneof="theworld">
- <description>The World Of Grand Prix Racing 2</description>
+ <description>The World of Grand Prix Racing 2</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -139839,7 +139840,7 @@ license:CC0
</software>
<software name="thewormi">
- <description>The Worm In Paradise</description>
+ <description>The Worm in Paradise</description>
<year>1985</year>
<publisher>Level 9 Computing</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -139877,7 +139878,7 @@ license:CC0
</software>
<software name="thewrath">
- <description>The Wrath Of Magra</description>
+ <description>The Wrath of Magra</description>
<year>1984</year>
<publisher>Carnell</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -140129,7 +140130,7 @@ license:CC0
</software>
<software name="warofthe">
- <description>War Of The Roses</description>
+ <description>War of the Roses</description>
<year>1991</year>
<publisher>CCS</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -140310,7 +140311,7 @@ license:CC0
</software>
<software name="wayofthe">
- <description>Way Of The Tiger (Boots)</description>
+ <description>Way of the Tiger (Boots)</description>
<year>1986</year>
<publisher>Boots</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -140326,7 +140327,7 @@ license:CC0
</software>
<software name="wayofthe_a" cloneof="wayofthe">
- <description>Way Of The Tiger (Kixx)</description>
+ <description>Way of the Tiger (Kixx)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -140342,7 +140343,7 @@ license:CC0
</software>
<software name="wayofthe_d" cloneof="wayofthe">
- <description>Way Of The Tiger</description>
+ <description>Way of the Tiger</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -141139,7 +141140,7 @@ license:CC0
</software>
<software name="widthoft">
- <description>Width Of The World (set 2)</description>
+ <description>Width of the World (set 2)</description>
<year>1984</year>
<publisher>Mosaic Publishing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -141150,7 +141151,7 @@ license:CC0
</software>
<software name="widthoft_a" cloneof="widthoft">
- <description>Width Of The World</description>
+ <description>Width of the World</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -141604,7 +141605,7 @@ license:CC0
</software>
<software name="wizardof">
- <description>Wizard Of Akyrz (Channel 8)</description>
+ <description>Wizard of Akyrz (Channel 8)</description>
<year>1983</year>
<publisher>Channel 8</publisher>
<part name="cass" interface="spectrum_cass">
@@ -141615,7 +141616,7 @@ license:CC0
</software>
<software name="wizardof_a" cloneof="wizardof">
- <description>Wizard Of Akyrz (set 2)</description>
+ <description>Wizard of Akyrz (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -141626,7 +141627,7 @@ license:CC0
</software>
<software name="wizardof_b" cloneof="wizardof">
- <description>Wizard Of Akyrz</description>
+ <description>Wizard of Akyrz</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -141637,7 +141638,7 @@ license:CC0
</software>
<software name="wizardof_c" cloneof="wizardof">
- <description>Wizard Of Wor</description>
+ <description>Wizard of Wor</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -141840,7 +141841,7 @@ license:CC0
</software>
<software name="woodsofw">
- <description>Woods Of Winter</description>
+ <description>Woods of Winter</description>
<year>1984</year>
<publisher>CRL Group</publisher>
<part name="cass" interface="spectrum_cass">
@@ -142388,7 +142389,7 @@ license:CC0
</software>
<software name="worldcup_o" cloneof="worldcup">
- <description>World Cup Cricket &amp; Champions Of Cricket - Sides 2</description>
+ <description>World Cup Cricket &amp; Champions of Cricket - Sides 2</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -142535,7 +142536,7 @@ license:CC0
</software>
<software name="worldofs">
- <description>World Of Soccer</description>
+ <description>World of Soccer</description>
<year>1992</year>
<publisher>Challenge</publisher>
<part name="cass" interface="spectrum_cass">
@@ -142646,7 +142647,7 @@ license:CC0
</software>
<software name="worldsof">
- <description>Worlds Of Fantasy</description>
+ <description>Worlds of Fantasy</description>
<year>2012</year>
<publisher>Steve Westwood</publisher>
<part name="cass" interface="spectrum_cass">
@@ -142712,7 +142713,7 @@ license:CC0
</software>
<software name="wrathoft">
- <description>Wrath Of The Killer Pigs</description>
+ <description>Wrath of the Killer Pigs</description>
<year>1985</year>
<publisher>Krypton Force</publisher>
<part name="cass" interface="spectrum_cass">
@@ -143608,7 +143609,7 @@ license:CC0
</software>
<software name="yenght">
- <description>Yenght (set 1)</description>
+ <description>Yenght</description>
<year>1984</year>
<publisher>Dinamic Software</publisher>
<part name="cass" interface="spectrum_cass">
@@ -143619,9 +143620,9 @@ license:CC0
</software>
<software name="yenghta" cloneof="yenght">
- <description>Yenght (set 2)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>Yenght (medium case)</description>
+ <year>1984</year>
+ <publisher>Dinamic Software </publisher>
<part name="cass" interface="spectrum_cass">
<dataarea name="cass" size="46486">
<rom name="yenght (alt).tzx" size="46486" crc="cd9d40c9" sha1="06e8d8f02403039ba9af3c656cbc4ea39abe8186"/>
@@ -144152,7 +144153,7 @@ license:CC0
</software>
<software name="ziggarat">
- <description>Ziggarat Of Dread (Custom Cables International)</description>
+ <description>Ziggarat of Dread (Custom Cables International)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -144163,7 +144164,7 @@ license:CC0
</software>
<software name="ziggarat_a" cloneof="ziggarat">
- <description>Ziggarat Of Dread</description>
+ <description>Ziggarat of Dread</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -146020,10 +146021,10 @@ license:CC0
</part>
</software>
- <software name="10greatg_d" cloneof="10greatg">
+ <software name="10greatg3">
<description>10 Great Games 3</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1988</year>
+ <publisher>Gremlin Graphics Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="158667">
<rom name="10 great games 3 - tape 1 - side a.tzx" size="158667" crc="9ba73b9d" sha1="b3c5e1b31946758f2293ac1275563eff9f5b7f2d"/>
@@ -146047,9 +146048,9 @@ license:CC0
</software>
<software name="10grt2">
- <description>10 Great Games II (set 1)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>10 Great Games II (alt)</description>
+ <year>1988</year>
+ <publisher>Gremlin Graphics Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="171841">
<rom name="10 great games ii - alternate - tape 1 - side 1.tzx" size="171841" crc="0a6a0b52" sha1="06ca6b14d0fdb54ab076ebfca37ab73cc0ad92d1"/>
@@ -146073,9 +146074,9 @@ license:CC0
</software>
<software name="10grt2a" cloneof="10grt2">
- <description>10 Great Games II (set 2)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <description>10 Great Games II</description>
+ <year>1988</year>
+ <publisher>Gremlin Graphics Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="171841">
<rom name="10 great games ii - tape 1 - side 1.tzx" size="171841" crc="2567da0c" sha1="2bb4bc505a4954966eb6a2e3ed9a393e7a98f5e2"/>
@@ -146101,7 +146102,7 @@ license:CC0
<software name="10juegos">
<description>10 Juegos I</description>
<year>1984</year>
- <publisher>Microparadise</publisher>
+ <publisher>Microparadise Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="30689">
<rom name="10 juegos i - side 1.tzx" size="30689" crc="f2eb5ace" sha1="01b592cca9c1baab7acbf08f25ae0320209b2736"/>
@@ -146114,10 +146115,10 @@ license:CC0
</part>
</software>
- <software name="10juegos_b" cloneof="10juegos">
+ <software name="10juegos2">
<description>10 Juegos II</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1984</year>
+ <publisher>Microparadise Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="24261">
<rom name="10 juegos ii - side 1.tzx" size="24261" crc="30df591c" sha1="302381c49b2f8d6fc9d8311a70fdbb187bf3ef7a"/>
@@ -147328,7 +147329,7 @@ license:CC0
</software>
<software name="ahandful">
- <description>A Handful Of Hamsters</description>
+ <description>A Handful of Hamsters</description>
<year>1993</year>
<publisher>Zenobi Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -147354,7 +147355,7 @@ license:CC0
</software>
<software name="arightpi">
- <description>A Right Pile Of Crap</description>
+ <description>A Right Pile of Crap</description>
<year>1993</year>
<publisher>Zenobi Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -147843,7 +147844,7 @@ license:CC0
</software>
<software name="alienpla">
- <description>Alien Planet &amp; Lords Of Magic</description>
+ <description>Alien Planet &amp; Lords of Magic</description>
<year>1990</year>
<publisher>The Guild</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -148096,7 +148097,7 @@ license:CC0
</software>
<software name="arcadeha">
- <description>Arcade Hall Of Fame (Erbe)</description>
+ <description>Arcade Hall of Fame (Erbe)</description>
<year>1985</year>
<publisher>Erbe Software</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -148112,7 +148113,7 @@ license:CC0
</software>
<software name="arcadeha_a" cloneof="arcadeha">
- <description>Arcade Hall Of Fame</description>
+ <description>Arcade Hall of Fame</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -148402,7 +148403,7 @@ license:CC0
</software>
<software name="balrogsb_b" cloneof="balrogsb">
- <description>Balrog's Box Of Delights</description>
+ <description>Balrog's Box of Delights</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -148481,7 +148482,7 @@ license:CC0
</software>
<software name="bestofpc">
- <description>Best Of PCW - Software For The Spectrum</description>
+ <description>Best of PCW - Software for the Spectrum</description>
<year>1983</year>
<publisher>Century</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -148497,7 +148498,7 @@ license:CC0
</software>
<software name="bestofpo">
- <description>Best Of Popular Computing Vol.1</description>
+ <description>Best of Popular Computing Vol.1</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -148717,7 +148718,7 @@ license:CC0
</software>
<software name="bobtm">
- <description>Bog Of Brit &amp; The Menagerie</description>
+ <description>Bog of Brit &amp; The Menagerie</description>
<year>1990</year>
<publisher>Stormbringer</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -149154,7 +149155,7 @@ license:CC0
</software>
<software name="ccldbtt">
- <description>Castle Colditz &amp; Battle Of The Toothpaste Tubes</description>
+ <description>Castle Colditz &amp; Battle of the Toothpaste Tubes</description>
<year>1984</year>
<publisher>K-Tel Productions</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -149949,7 +149950,7 @@ license:CC0
</software>
<software name="delberts">
- <description>Delbert's Hamster-Wheel Of Fortune!</description>
+ <description>Delbert's Hamster-Wheel of Fortune!</description>
<year>1992</year>
<publisher>Delbert the Hamster</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -150214,7 +150215,7 @@ license:CC0
</software>
<software name="doomcell">
- <description>Doomsday &amp; Cell Of The Ridges</description>
+ <description>Doomsday &amp; Cell of the Ridges</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -150854,7 +150855,7 @@ license:CC0
</software>
<software name="eprom">
- <description>Escape From The Planet Of The Robot Monsters</description>
+ <description>Escape From The Planet of the Robot Monsters</description>
<year>1990</year>
<publisher>Domark</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -151041,7 +151042,7 @@ license:CC0
</software>
<software name="frlfok">
- <description>Firelance &amp; Fortress Of Keler</description>
+ <description>Firelance &amp; Fortress of Keler</description>
<year>1985</year>
<publisher>Hamster</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -151057,7 +151058,7 @@ license:CC0
</software>
<software name="firework">
- <description>Firework Music And Water Music</description>
+ <description>Firework Music and Water Music</description>
<year>1983</year>
<publisher>Software Cottage</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -151221,7 +151222,7 @@ license:CC0
</software>
<software name="flightso">
- <description>Flights Of Fantasy Vol. 1</description>
+ <description>Flights of Fantasy Vol. 1</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -151232,7 +151233,7 @@ license:CC0
</software>
<software name="flightso_a" cloneof="flightso">
- <description>Flights Of Fantasy Vol. 2</description>
+ <description>Flights of Fantasy Vol. 2</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -151669,7 +151670,7 @@ license:CC0
</software>
<software name="gamesofs">
- <description>Games Of Strategy I</description>
+ <description>Games of Strategy I</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -151685,7 +151686,7 @@ license:CC0
</software>
<software name="gamesofs_b" cloneof="gamesofs">
- <description>Games Of Strategy II</description>
+ <description>Games of Strategy II</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -152389,7 +152390,7 @@ license:CC0
</software>
<software name="gruemista" cloneof="gruemist">
- <description>Grue-Knapped &amp; Helvera - Mistress Of The Park (set 2)</description>
+ <description>Grue-Knapped &amp; Helvera - Mistress of the Park (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -152405,7 +152406,7 @@ license:CC0
</software>
<software name="gruemist">
- <description>Grue-Knapped &amp; Helvera - Mistress Of The Park (set 1)</description>
+ <description>Grue-Knapped &amp; Helvera - Mistress of the Park (set 1)</description>
<year>1991</year>
<publisher>FSF Adventures</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -153036,7 +153037,7 @@ license:CC0
</software>
<software name="ijlcijtd">
- <description>Indiana Jones And The Last Crusade &amp; Indiana Jones And The Temple Of Doom</description>
+ <description>Indiana Jones and the Last Crusade &amp; Indiana Jones and the Temple of Doom</description>
<year>1989</year>
<publisher>U.S. Gold</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -153567,7 +153568,7 @@ license:CC0
</software>
<software name="leaderbo">
- <description>Leaderboard - Famous Courses Of The World Volume 1</description>
+ <description>Leaderboard - Famous Courses of the World Volume 1</description>
<year>1987</year>
<publisher>U.S. Gold</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -154341,7 +154342,7 @@ license:CC0
</software>
<software name="msatrtemga" cloneof="msatrte">
- <description>Mines Of Saturn &amp; Return To Earth (Mikro-Gen) (set 2)</description>
+ <description>Mines of Saturn &amp; Return to Earth (Mikro-Gen) (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -154357,7 +154358,7 @@ license:CC0
</software>
<software name="msatrtemg" cloneof="msatrte">
- <description>Mines Of Saturn &amp; Return To Earth (Mikro-Gen) (set 1)</description>
+ <description>Mines of Saturn &amp; Return to Earth (Mikro-Gen) (set 1)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -154373,7 +154374,7 @@ license:CC0
</software>
<software name="msatrte">
- <description>Mines Of Saturn &amp; Return To Earth</description>
+ <description>Mines of Saturn &amp; Return to Earth</description>
<year>1982</year>
<publisher>Saturnsoft</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -154681,7 +154682,7 @@ license:CC0
</software>
<software name="murderfa">
- <description>Murder &amp; Father Of Darkness</description>
+ <description>Murder &amp; Father of Darkness</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -154958,7 +154959,7 @@ license:CC0
</software>
<software name="ootwv1">
- <description>Out Of This World Vol. 1</description>
+ <description>Out of This World Vol. 1</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -155280,7 +155281,7 @@ license:CC0
</software>
<software name="packofac">
- <description>Pack Of Aces (compilation)</description>
+ <description>Pack of Aces (compilation)</description>
<year>1987</year>
<publisher>Paxman Promotions</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -155296,7 +155297,7 @@ license:CC0
</software>
<software name="panicoen">
- <description>Panico En El Express (Monser)</description>
+ <description>Panico en el Express (Monser)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="spectrum_cass">
@@ -155701,7 +155702,7 @@ license:CC0
</software>
<software name="princeof">
- <description>Prince Of Tyndal &amp; Jekyll And Hyde Part 1</description>
+ <description>Prince of Tyndal &amp; Jekyll and Hyde Part 1</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -155877,7 +155878,7 @@ license:CC0
</software>
<software name="rlmdmm">
- <description>Realm Of Darkness &amp; Matchmaker</description>
+ <description>Realm of Darkness &amp; Matchmaker</description>
<year>1987</year>
<publisher>River</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -158708,7 +158709,7 @@ license:CC0
</software>
<software name="sfrpq1" cloneof="sfrpq">
- <description>Star Flaws &amp; Raymond Pringle's Quest For The Fabled Jar Of Pickled Cabbage - Release 1</description>
+ <description>Star Flaws &amp; Raymond Pringle's Quest for the Fabled Jar of Pickled Cabbage - Release 1</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -158724,7 +158725,7 @@ license:CC0
</software>
<software name="sfrpq">
- <description>Star Flaws &amp; Raymond Pringle's Quest For The Fabled Jar Of Pickled Cabbage - Release 2</description>
+ <description>Star Flaws &amp; Raymond Pringle's Quest for the Fabled Jar of Pickled Cabbage - Release 2</description>
<year>1991</year>
<publisher>Delbert the Hamster</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -159043,7 +159044,7 @@ license:CC0
</software>
<software name="strktbra">
- <description>Startrek &amp; Towers Of Brahma</description>
+ <description>Startrek &amp; Towers of Brahma</description>
<year>1982</year>
<publisher>Star Dreams</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -159606,7 +159607,7 @@ license:CC0
</software>
<software name="thebesto">
- <description>The Best Of 3D</description>
+ <description>The Best of 3D</description>
<year>1987</year>
<publisher>Vortex</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -159632,7 +159633,7 @@ license:CC0
</software>
<software name="thebesto_d" cloneof="thebesto">
- <description>The Best Of Beyond</description>
+ <description>The Best of Beyond</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -159648,7 +159649,7 @@ license:CC0
</software>
<software name="thebesto_f" cloneof="thebesto">
- <description>The Best Of Clive And Les</description>
+ <description>The Best of Clive And Les</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -159705,7 +159706,7 @@ license:CC0
</software>
<software name="bogshad">
- <description>The Blood Of Bogmole &amp; Shadows Of The Past</description>
+ <description>The Blood of Bogmole &amp; Shadows of the Past</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -159831,7 +159832,7 @@ license:CC0
</software>
<software name="crwnprosb" cloneof="crwnpros">
- <description>The Crown Of Ramhotep &amp; The Prospector (set 3)</description>
+ <description>The Crown of Ramhotep &amp; The Prospector (set 3)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -159847,7 +159848,7 @@ license:CC0
</software>
<software name="crwnprosa" cloneof="crwnpros">
- <description>The Crown Of Ramhotep &amp; The Prospector (set 2)</description>
+ <description>The Crown of Ramhotep &amp; The Prospector (set 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -159863,7 +159864,7 @@ license:CC0
</software>
<software name="crwnpros">
- <description>The Crown Of Ramhotep &amp; The Prospector (set 1)</description>
+ <description>The Crown of Ramhotep &amp; The Prospector (set 1)</description>
<year>1987</year>
<publisher>Tartan</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -159879,7 +159880,7 @@ license:CC0
</software>
<software name="cosdes">
- <description>The Curse Of Shaleth &amp; Desperado</description>
+ <description>The Curse of Shaleth &amp; Desperado</description>
<year>1986</year>
<publisher>Central Solutions</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -159911,7 +159912,7 @@ license:CC0
</software>
<software name="devhsop">
- <description>The Devil's Hand &amp; Shadows Of The Past</description>
+ <description>The Devil's Hand &amp; Shadows of the Past</description>
<year>1988</year>
<publisher>Compass</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -159927,7 +159928,7 @@ license:CC0
</software>
<software name="domslb">
- <description>The Domes Of Sha &amp; Letter Bomb</description>
+ <description>The Domes of Sha &amp; Letter Bomb</description>
<year>1988</year>
<publisher>River</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -160006,7 +160007,7 @@ license:CC0
</software>
<software name="fabtrbs">
- <description>The Fabled Treasure Of Koosar &amp; Birthday Surprise</description>
+ <description>The Fabled Treasure of Koosar &amp; Birthday Surprise</description>
<year>1992</year>
<publisher>The Guild</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -160085,7 +160086,7 @@ license:CC0
</software>
<software name="hammut">
- <description>The Hammer Of Grimmold &amp; Mutant</description>
+ <description>The Hammer of Grimmold &amp; Mutant</description>
<year>1987</year>
<publisher>River</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -160259,9 +160260,9 @@ license:CC0
</software>
<software name="thelostd">
- <description>The Lost Dragon &amp; Magic Treasure (set 2)</description>
+ <description>The Lost Dragon &amp; Magic Treasure (alt)</description>
<year>1991</year>
- <publisher>Tartan</publisher>
+ <publisher>Tartan Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="51224">
<rom name="the lost dragon _ magic treasure - alternate - side 1.tzx" size="51224" crc="e4e44ffe" sha1="67e5658977a2bb8a8c69436bae857b351145403d"/>
@@ -160276,8 +160277,8 @@ license:CC0
<software name="thelostd_b" cloneof="thelostd">
<description>The Lost Dragon &amp; Magic Treasure</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1991</year>
+ <publisher>Tartan Software</publisher>
<part name="cass1" interface="spectrum_cass">
<dataarea name="cass" size="45246">
<rom name="the lost dragon _ magic treasure - magic treasure.tzx" size="45246" crc="3e63ce2b" sha1="20aea7fe8736d3491d87c093b1a57d265741813a"/>
@@ -160487,7 +160488,7 @@ license:CC0
</software>
<software name="rzaoesc">
- <description>The Runestone Of Zaobab &amp; Escape From Magic</description>
+ <description>The Runestone of Zaobab &amp; Escape From Magic</description>
<year>1988</year>
<publisher>Eric Stewart</publisher>
<part name="cass1" interface="spectrum_cass">
@@ -160741,7 +160742,7 @@ license:CC0
</software>
<software name="thetimes">
- <description>The Times Book Of Computer Puzzles &amp; Games</description>
+ <description>The Times Book of Computer Puzzles &amp; Games</description>
<year>1984</year>
<publisher>Newtech Publishing</publisher>
<part name="cass" interface="spectrum_cass">
@@ -160778,7 +160779,7 @@ license:CC0
</software>
<software name="tombrock">
- <description>The Tomb Of Dracula &amp; It's Only Rock 'n' Roll</description>
+ <description>The Tomb of Dracula &amp; It's Only Rock 'n' Roll</description>
<year>1983</year>
<publisher>K-Tel Productions</publisher>
<part name="cass" interface="spectrum_cass">
diff --git a/hash/squale_cart.xml b/hash/squale_cart.xml
index 2a96195210f..f3c08628db6 100644
--- a/hash/squale_cart.xml
+++ b/hash/squale_cart.xml
@@ -3,6 +3,7 @@
<!--
license:CC0
-->
+
<softwarelist name="squale_cart" description="Squale cartridges">
<software name="sqintro">
@@ -12,7 +13,19 @@ license:CC0
<info name="developer" value="Jean-François DEL NERO / HxC2001" />
<part name="cart" interface="squale_cart">
<dataarea name="rom" size="65536">
- <rom name="TheSqualeIntro.bin" size="65536" crc="18d1c188" sha1="63a1e1910967b7e083e9d2d1232445a8fd66daf3" offset="0" />
+ <rom name="TheSqualeIntro.bin" size="65536" crc="18d1c188" sha1="63a1e1910967b7e083e9d2d1232445a8fd66daf3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sqtech">
+ <description>Squale Technical Demo</description>
+ <year>2019</year>
+ <publisher>&lt;homebrew&gt;</publisher>
+ <info name="developer" value="Jean-François DEL NERO / HxC2001" />
+ <part name="cart" interface="squale_cart">
+ <dataarea name="rom" size="32768">
+ <rom name="Squale_Technical_Demo.rom" size="32768" crc="d3f3115a" sha1="531e03d3f5626f76f9d501acbd96578f5928c77b" />
</dataarea>
</part>
</software>
diff --git a/hash/timex_cass.xml b/hash/timex_cass.xml
index 9409f180eae..cbd7e8e0114 100644
--- a/hash/timex_cass.xml
+++ b/hash/timex_cass.xml
@@ -16,7 +16,8 @@ license:CC0
Known software without a TZX or TAP dump:
- Geovideo 4 (198x)(Paulo Sergio Coelho) -> https://www.worldofspectrum.org/infoseekid.cgi?id=4000104
+ Geovideo 4 (198x)(Paulo Sergio Coelho) -> https://spectrumcomputing.co.uk/entry/4000104
+ Interface RS232 (Portugal) -> https://spectrumcomputing.co.uk/entry/25400
Current bad dumps:
Cozinheiro (198x)(TMX Portugal Ltda)
@@ -660,19 +661,6 @@ license:CC0
</part>
</software>
-<!--
- <software name="intrs232p" cloneof="intrs232">
- <description>Interface RS232 (Portugal)</description>
- <year>198?</year>
- <publisher>TMX Portugal Ltda</publisher>
- <part name="cass" interface="spectrum_cass">
- <dataarea name="cass" size="">
- <rom name="interface rs232 (198x)(tmx portugal ltda).tzx" size="" crc="" sha1=""/>
- </dataarea>
- </part>
- </software>
--->
-
<software name="invasore">
<description>Invasores Lunares</description>
<year>198?</year>
diff --git a/hash/tx0_ptp.xml b/hash/tx0_ptp.xml
new file mode 100644
index 00000000000..ad60cbb1650
--- /dev/null
+++ b/hash/tx0_ptp.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<!--
+license:CC0
+-->
+
+<softwarelist name="tx0_ptp" description="TX-0 Paper Tape Reader images">
+ <!-- The "NEWCODE" compatibility tag is used for programs written or reassembled after 1960, using the revised instruction code.
+ The encoding of "OLDCODE" programs is incompatible with the tx0_8kw system. These two categories may receive separate lists in the future.
+ -->
+
+ <software name="munching">
+ <description>Munching Squares</description>
+ <year>196?</year>
+ <publisher>MIT</publisher>
+ <info name="usage" value="Press read in switch, then restart after loader halts at 17777. Use TAC switches to vary display."/>
+ <sharedfeat name="compatibility" value="NEWCODE"/>
+ <part name="ptp" interface="tx0_ptp">
+ <dataarea name="ptap" size="327">
+ <rom name="bin_munchingSquares.bin" size="327" crc="54afd9a3" sha1="a7fc6d62ea1cef21f1563cb8b86a5e63198af0ae"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="punchy">
+ <description>Punchy</description>
+ <year>195?</year>
+ <publisher>MIT</publisher>
+ <info name="author" value="John T. Gilmore, Jr."/>
+ <info name="usage" value="Create file for punch device. Press read in switch, then restart after loader halts at 7777."/>
+ <!-- For detailed usage instructions, see memorandum M-5001-1. -->
+ <sharedfeat name="compatibility" value="OLDCODE"/>
+ <part name="ptp" interface="tx0_ptp">
+ <!-- Reconstructed from assembly listing dated "3 FEB" in handwriting, together with the standard tape input routine from M-5001-1.
+ This version is independent of UT-3, but does require that the aforementioned input routine remain in memory. -->
+ <feature name="blocks_used" value="6547-7610, 7741-7777"/>
+ <dataarea name="ptap" size="1821">
+ <rom name="punchy.bin" size="1821" crc="3a0ead7e" sha1="6fb6f072251712cab2e614d1a80a626b9a27f1f2"/>
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/vgmplay.xml b/hash/vgmplay.xml
index dae037473ee..dac5ae0b2e4 100644
--- a/hash/vgmplay.xml
+++ b/hash/vgmplay.xml
@@ -258172,6 +258172,3617 @@ license:CC0
</part>
</software>
+<!-- vgmrips.net update - July 25, 2021 - 16 New Entries -->
+
+ <software name="acrush_tg16">
+ <description>Alien Crush (TG-16)</description>
+ <year>1988</year>
+ <publisher>Naxat Soft</publisher>
+ <info name="cores" value="HuC6280"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 title.vgz" />
+ <dataarea name="quik" size="4609">
+ <rom name="01 title.vgz" size="4609" crc="1420b1aa" sha1="16fbd7838491118b60e759b0aa7e835a200bd242" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 lunar eclipse.vgz" />
+ <dataarea name="quik" size="5741">
+ <rom name="02 lunar eclipse.vgz" size="5741" crc="a2dcadc4" sha1="db89cb06fe058e2b5a827e327af0ba5d473fa3f3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 demon's undulate.vgz" />
+ <dataarea name="quik" size="15903">
+ <rom name="03 demon's undulate.vgz" size="15903" crc="e68ba978" sha1="aa3ca8dbe75fec99dca2514c4e327ef7cbfa93c2" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 bonus stage 1.vgz" />
+ <dataarea name="quik" size="6907">
+ <rom name="04 bonus stage 1.vgz" size="6907" crc="69e46769" sha1="bfab334e155388eab542bfcb31746abab530d357" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 bonus stage 1 clear.vgz" />
+ <dataarea name="quik" size="1752">
+ <rom name="05 bonus stage 1 clear.vgz" size="1752" crc="88eb4bed" sha1="4566ad18ad8ba234e4acb739293c3e4700bbfa68" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 bonus stage 2.vgz" />
+ <dataarea name="quik" size="5642">
+ <rom name="06 bonus stage 2.vgz" size="5642" crc="0530dbc6" sha1="21e67063e6afa1780ba1743f740078ba66ab64df" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 bonus stage 2 clear.vgz" />
+ <dataarea name="quik" size="1741">
+ <rom name="07 bonus stage 2 clear.vgz" size="1741" crc="ad191096" sha1="cbe17384aae416601febc837fedb0569185dd80d" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 bonus points.vgz" />
+ <dataarea name="quik" size="2186">
+ <rom name="08 bonus points.vgz" size="2186" crc="ba2de10b" sha1="cc372f61362d8ef360e33e56a50793bfb76a309a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 extra ball.vgz" />
+ <dataarea name="quik" size="1255">
+ <rom name="09 extra ball.vgz" size="1255" crc="4e54f931" sha1="2ced472c3112d5c40aa15351ff80f2f50020969a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 event 1.vgz" />
+ <dataarea name="quik" size="711">
+ <rom name="10 event 1.vgz" size="711" crc="b4bd57a9" sha1="800c4cf7f60a94284d914a47fbed4c73cc54bec3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 event 2.vgz" />
+ <dataarea name="quik" size="890">
+ <rom name="11 event 2.vgz" size="890" crc="86c80f5e" sha1="010332e961b0d544643ee7d6262f5e0ccd35f4f3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 event 3.vgz" />
+ <dataarea name="quik" size="2217">
+ <rom name="12 event 3.vgz" size="2217" crc="9ebeb6fd" sha1="6df21f309631edc456f9ec1348b875f250dfbd8a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 event 4.vgz" />
+ <dataarea name="quik" size="2377">
+ <rom name="13 event 4.vgz" size="2377" crc="39eac23c" sha1="0d6c78b273b5aa987018db6c087b01991dfad49b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 event 5.vgz" />
+ <dataarea name="quik" size="1259">
+ <rom name="14 event 5.vgz" size="1259" crc="f580a9a1" sha1="1c40e3c0d490a1ea6c93d64c98275987413c4339" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 game over.vgz" />
+ <dataarea name="quik" size="2287">
+ <rom name="15 game over.vgz" size="2287" crc="684c4da3" sha1="7fa66458176c4ce1ae7a2aefc746f59cb605987b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 the best five.vgz" />
+ <dataarea name="quik" size="2935">
+ <rom name="16 the best five.vgz" size="2935" crc="cabb59e5" sha1="7e5f9391e3969a361a701068992a72e67333d6fc" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 ending.vgz" />
+ <dataarea name="quik" size="5583">
+ <rom name="17 ending.vgz" size="5583" crc="b69be505" sha1="2c4f3a181b37179b70c5982dc8ebfc46fc8e65f2" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="panicbom">
+ <description>Bomberman Panic Bomber (SNK Neo Geo)</description>
+ <year>1995</year>
+ <publisher>SNK</publisher>
+ <info name="cores" value="YM2610"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 neo-geo opening theme.vgz" />
+ <dataarea name="quik" size="35854">
+ <rom name="01 neo-geo opening theme.vgz" size="35854" crc="2eb951d5" sha1="88393c6009e2e3bfc8d11094467dc0e3e6996108" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 title.vgz" />
+ <dataarea name="quik" size="151376">
+ <rom name="02 title.vgz" size="151376" crc="921873fb" sha1="62b7e53d8e948636862b6ca6dc696c96e43bdf64" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 how to play.vgz" />
+ <dataarea name="quik" size="147086">
+ <rom name="03 how to play.vgz" size="147086" crc="d4c1ad55" sha1="cec75ade1c4beb9cb3f8af96c29de83036aebf8c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 ranking.vgz" />
+ <dataarea name="quik" size="97248">
+ <rom name="04 ranking.vgz" size="97248" crc="f4fd6a11" sha1="486609eb4d0db1a4d3ddb4fefe20b96f029ce33b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 title mvs.vgz" />
+ <dataarea name="quik" size="161254">
+ <rom name="05 title mvs.vgz" size="161254" crc="cc2b5772" sha1="358cc5cb57e7bedbc8da13611aa8e6055be96fe8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 stage start.vgz" />
+ <dataarea name="quik" size="86757">
+ <rom name="06 stage start.vgz" size="86757" crc="da6d5270" sha1="b8660cd0fab9f2176d48ab9b8f3f9ba6a0d9b7b6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 ready.vgz" />
+ <dataarea name="quik" size="92419">
+ <rom name="07 ready.vgz" size="92419" crc="f0161c4c" sha1="a7c3a7dabe9c0b723ffa348537f7816ad4f28838" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 stage 1.vgz" />
+ <dataarea name="quik" size="159769">
+ <rom name="08 stage 1.vgz" size="159769" crc="5093922b" sha1="0da0defe7692f07593dfd99bd67138fed67eda1a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 stage 2.vgz" />
+ <dataarea name="quik" size="75454">
+ <rom name="09 stage 2.vgz" size="75454" crc="dc84a0af" sha1="3a16ee6235c3b0542dcf7e2e8de366406ef76fc6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 stage 3.vgz" />
+ <dataarea name="quik" size="156237">
+ <rom name="10 stage 3.vgz" size="156237" crc="777d5a39" sha1="9958154e10f7396d410081acd695f4e80d6f58f9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 stage 4.vgz" />
+ <dataarea name="quik" size="120270">
+ <rom name="11 stage 4.vgz" size="120270" crc="25de3ad3" sha1="157c912adb38b6ee9ec357c027c9fb7f85399769" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 stage 5.vgz" />
+ <dataarea name="quik" size="191218">
+ <rom name="12 stage 5.vgz" size="191218" crc="70f4f611" sha1="a788ffeab7a182bca4605a05ff211374d6b9b516" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 stage 6.vgz" />
+ <dataarea name="quik" size="121143">
+ <rom name="13 stage 6.vgz" size="121143" crc="d0e35fb0" sha1="9ab8158bd5be6da73a40ede56a06aa9fff8e2a68" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 stage 7.vgz" />
+ <dataarea name="quik" size="153394">
+ <rom name="14 stage 7.vgz" size="153394" crc="416e5b77" sha1="5af426367178803d02aca542965869fa01509e63" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 stage 8.vgz" />
+ <dataarea name="quik" size="130231">
+ <rom name="15 stage 8.vgz" size="130231" crc="b245353e" sha1="6bb04e467b1ac40925065f7da5a67f2cf0d88bbb" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 stage 9.vgz" />
+ <dataarea name="quik" size="149255">
+ <rom name="16 stage 9.vgz" size="149255" crc="01ba11e4" sha1="f8695b9f3cb2be90457f07a7b039dfccc5616ce5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 vs mode.vgz" />
+ <dataarea name="quik" size="131695">
+ <rom name="17 vs mode.vgz" size="131695" crc="6df4e663" sha1="6b3cd2c44c313cabd20352ec3297075d52d77528" offset="0" />
+ </dataarea>
+ </part>
+ <part name="018" interface="vgm_quik">
+ <feature name="part_id" value="18 win.vgz" />
+ <dataarea name="quik" size="92532">
+ <rom name="18 win.vgz" size="92532" crc="18191ef9" sha1="a25fc88e4ede668aad47ce9572c139be05b0d453" offset="0" />
+ </dataarea>
+ </part>
+ <part name="019" interface="vgm_quik">
+ <feature name="part_id" value="19 lose.vgz" />
+ <dataarea name="quik" size="113835">
+ <rom name="19 lose.vgz" size="113835" crc="cff5c003" sha1="acd47bf2597a6e56651b87230ea788e3e0ca381f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="020" interface="vgm_quik">
+ <feature name="part_id" value="20 stage clear.vgz" />
+ <dataarea name="quik" size="104438">
+ <rom name="20 stage clear.vgz" size="104438" crc="d62d9e31" sha1="7a34c3b28a3b0d850e104f1510f2e90f4e74478b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="021" interface="vgm_quik">
+ <feature name="part_id" value="21 here comes a new challenger.vgz" />
+ <dataarea name="quik" size="82013">
+ <rom name="21 here comes a new challenger.vgz" size="82013" crc="3a34d49e" sha1="efced0a02ce24d136f8830876a28aa9979974229" offset="0" />
+ </dataarea>
+ </part>
+ <part name="022" interface="vgm_quik">
+ <feature name="part_id" value="22 6-chain combo.vgz" />
+ <dataarea name="quik" size="114546">
+ <rom name="22 6-chain combo.vgz" size="114546" crc="a9760619" sha1="d03110454710c5e6ea7eed7f91fa1139a4446ff5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="023" interface="vgm_quik">
+ <feature name="part_id" value="23 danger.vgz" />
+ <dataarea name="quik" size="198232">
+ <rom name="23 danger.vgz" size="198232" crc="4fca38c7" sha1="a21c02eca8c1370e72cdec9574e2edb23ad69aa1" offset="0" />
+ </dataarea>
+ </part>
+ <part name="024" interface="vgm_quik">
+ <feature name="part_id" value="24 game over.vgz" />
+ <dataarea name="quik" size="100969">
+ <rom name="24 game over.vgz" size="100969" crc="c16a8202" sha1="40bf758329e4e6623e67bb15b5fe82aecb6057fd" offset="0" />
+ </dataarea>
+ </part>
+ <part name="025" interface="vgm_quik">
+ <feature name="part_id" value="25 high score.vgz" />
+ <dataarea name="quik" size="162401">
+ <rom name="25 high score.vgz" size="162401" crc="8e7d2f27" sha1="e07715e480d25ec50deca3c58ee82933a16d1dcf" offset="0" />
+ </dataarea>
+ </part>
+ <part name="026" interface="vgm_quik">
+ <feature name="part_id" value="26 ending.vgz" />
+ <dataarea name="quik" size="452928">
+ <rom name="26 ending.vgz" size="452928" crc="fbcdae41" sha1="df2a5bb26f4d8b17dcee4902c1da73d834a3732b" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bubblegm_pce">
+ <description>Bubblegum Crash - Knight Sabers 2034 (PC Engine)</description>
+ <year>1991</year>
+ <publisher>Naxat Soft</publisher>
+ <info name="cores" value="HuC6280"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 title.vgz" />
+ <dataarea name="quik" size="10226">
+ <rom name="01 title.vgz" size="10226" crc="788a57ba" sha1="fef8de6d4b760b8e51697205b3d6f316f6e21bfc" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 bank robbery.vgz" />
+ <dataarea name="quik" size="2261">
+ <rom name="02 bank robbery.vgz" size="2261" crc="c17977fa" sha1="6e2f018ea47aa162827b28128c7fc5fc82c4edb3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 investigation 1.vgz" />
+ <dataarea name="quik" size="8690">
+ <rom name="03 investigation 1.vgz" size="8690" crc="ceef3c00" sha1="b576f398f4ca0ab32c77b9881425db46b5c4a4aa" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 investigation 2.vgz" />
+ <dataarea name="quik" size="5940">
+ <rom name="04 investigation 2.vgz" size="5940" crc="1c6dfa30" sha1="8ed704b32155743e659315a8fc216b56f7a727d3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 power suit combat (leon).vgz" />
+ <dataarea name="quik" size="5117">
+ <rom name="05 power suit combat (leon).vgz" size="5117" crc="e6bedd91" sha1="9adf091af3f8b9fd96af65db490e8a958b280f45" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 bike chase.vgz" />
+ <dataarea name="quik" size="7189">
+ <rom name="06 bike chase.vgz" size="7189" crc="f80a771f" sha1="13631353067b96a245dc92ff5b88c3771f91588c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 maze chase.vgz" />
+ <dataarea name="quik" size="1925">
+ <rom name="07 maze chase.vgz" size="1925" crc="5f5d305d" sha1="2766e069717d2158e946bfbc0683a74e29e6529f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 illegal conflict.vgz" />
+ <dataarea name="quik" size="5198">
+ <rom name="08 illegal conflict.vgz" size="5198" crc="a0ffefd1" sha1="a57afbbf7308b36e556da1058bb4fce3d363956b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 lab stealth.vgz" />
+ <dataarea name="quik" size="4769">
+ <rom name="09 lab stealth.vgz" size="4769" crc="856661f7" sha1="ff775aaa7402b6f46ead7c5cf002b52dce125f5a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 power suit combat (knight sabers).vgz" />
+ <dataarea name="quik" size="5284">
+ <rom name="10 power suit combat (knight sabers).vgz" size="5284" crc="194889bc" sha1="87aa67de721bbbf866f376e898430bf9e6bb3607" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 power suit combat (vs. capt. land).vgz" />
+ <dataarea name="quik" size="3701">
+ <rom name="11 power suit combat (vs. capt. land).vgz" size="3701" crc="85499ae6" sha1="4112d77697faa1ede5c6f28dee83ec8189379e24" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 ending &amp; credits.vgz" />
+ <dataarea name="quik" size="7550">
+ <rom name="12 ending &amp; credits.vgz" size="7550" crc="eaca3c91" sha1="a5c01f2c3ade4d18fb1928aa05d6b31cdd22ad55" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 unused 1.vgz" />
+ <dataarea name="quik" size="1270">
+ <rom name="13 unused 1.vgz" size="1270" crc="f90e56f0" sha1="6ec35db175aaafce03b61453ad67a89cba2ff13e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 unused 2.vgz" />
+ <dataarea name="quik" size="730">
+ <rom name="14 unused 2.vgz" size="730" crc="0b7e8e6b" sha1="2d0a5a552ff9293815f364e3fe0b6ec563ea2177" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galaga88_pce">
+ <description>Galaga '88 (TG-16)</description>
+ <year>1988</year>
+ <publisher>NEC</publisher>
+ <info name="cores" value="HuC6280"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 opening theme.vgz" />
+ <dataarea name="quik" size="3672">
+ <rom name="01 opening theme.vgz" size="3672" crc="fbe80b3f" sha1="b5217dcc2d284171bd1db9c96f6183c59ea0d92b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 fighter captured.vgz" />
+ <dataarea name="quik" size="1317">
+ <rom name="02 fighter captured.vgz" size="1317" crc="d39ef132" sha1="2f57ff8aaa44d1398ca1d5c743814f4ddcacc266" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 scroll stage bgm.vgz" />
+ <dataarea name="quik" size="3114">
+ <rom name="03 scroll stage bgm.vgz" size="3114" crc="8fa5ebcb" sha1="d9cf5f2ad8cda596f3e1cd5ccac2429162cef696" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 galactic dancing (waltz).vgz" />
+ <dataarea name="quik" size="7497">
+ <rom name="04 galactic dancing (waltz).vgz" size="7497" crc="fb9cca59" sha1="3f2f014458d4634b53b3c7f770cc9735f6924371" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 galactic dancing (tango).vgz" />
+ <dataarea name="quik" size="11724">
+ <rom name="05 galactic dancing (tango).vgz" size="11724" crc="66f22823" sha1="a69b55d231d38107433052e54ce96a7fb602240a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 galactic dancing (big band jazz).vgz" />
+ <dataarea name="quik" size="13874">
+ <rom name="06 galactic dancing (big band jazz).vgz" size="13874" crc="1548b3cf" sha1="43545bf5522b763ad2fb367beaa76d5d1b22a705" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 galactic dancing (salsa).vgz" />
+ <dataarea name="quik" size="16251">
+ <rom name="07 galactic dancing (salsa).vgz" size="16251" crc="d4627880" sha1="761459c80764e7f7e6f0086a987c6c5ea799838b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 galactic dancing (march).vgz" />
+ <dataarea name="quik" size="12398">
+ <rom name="08 galactic dancing (march).vgz" size="12398" crc="a2329167" sha1="4d797c7fd3325a03dc07ec5b66538f7e00c4bddf" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 bonus stage clear (perfect).vgz" />
+ <dataarea name="quik" size="2448">
+ <rom name="09 bonus stage clear (perfect).vgz" size="2448" crc="327e20e7" sha1="905fd876a26fbc3f5039c0b2aa2c4c66d80ecf7c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 ending 1.vgz" />
+ <dataarea name="quik" size="8535">
+ <rom name="10 ending 1.vgz" size="8535" crc="e9822427" sha1="abd5e4612a3fd872868cd59ff7895ea6b4abb0a8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 ending 2.vgz" />
+ <dataarea name="quik" size="4268">
+ <rom name="11 ending 2.vgz" size="4268" crc="f5ed023e" sha1="5eff32dafa14293d669b6be66a3cc5443e7b8998" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 name entry.vgz" />
+ <dataarea name="quik" size="8683">
+ <rom name="12 name entry.vgz" size="8683" crc="c7c4fcf8" sha1="030ae3c403e2853b27075384496f4648795d2df3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 game over.vgz" />
+ <dataarea name="quik" size="7874">
+ <rom name="13 game over.vgz" size="7874" crc="3da3bdf0" sha1="a43497b8317d26cd28ade4e0c38a02c632e8b2d6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 test sound.vgz" />
+ <dataarea name="quik" size="376">
+ <rom name="14 test sound.vgz" size="376" crc="35976d18" sha1="a8445a87ecfd54a4f9d4ca6faab275297a916383" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="immeen_pc">
+ <description>I.M. Meen (IBM PC AT)</description>
+ <year>1995</year>
+ <publisher>Simon &amp; Schuster</publisher>
+ <info name="cores" value="YMF262"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 the tower.vgz" />
+ <dataarea name="quik" size="4690">
+ <rom name="01 the tower.vgz" size="4690" crc="c3acc3ba" sha1="1705c28187b0ea25f4a7a92418577506139047cc" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 the dungeon.vgz" />
+ <dataarea name="quik" size="12051">
+ <rom name="02 the dungeon.vgz" size="12051" crc="e92d15af" sha1="ee6033377efe5c69cd907a3e2b3a351eaef877ed" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 the sewer ~ the caves.vgz" />
+ <dataarea name="quik" size="11047">
+ <rom name="03 the sewer ~ the caves.vgz" size="11047" crc="2741ab7c" sha1="bdb7b44a30d09e0ae405228cf1c2a183dc7f70ba" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 the catacombs.vgz" />
+ <dataarea name="quik" size="7993">
+ <rom name="04 the catacombs.vgz" size="7993" crc="053f79be" sha1="0d9397dc62e3f4ac06bf5b4029d5316ac286c1ca" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 the hedgerow maze.vgz" />
+ <dataarea name="quik" size="15097">
+ <rom name="05 the hedgerow maze.vgz" size="15097" crc="48065225" sha1="633dd77ea7a791f71cfe4c803d4318125c3d864c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 the castle ~ the laboratory.vgz" />
+ <dataarea name="quik" size="6323">
+ <rom name="06 the castle ~ the laboratory.vgz" size="6323" crc="a766cad6" sha1="c4101bf335684741ffa3f49f151bfc5d2d57730f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 the library.vgz" />
+ <dataarea name="quik" size="5728">
+ <rom name="07 the library.vgz" size="5728" crc="a59d44e5" sha1="d42db385354c43080bd188a2b5e5985fc909fdf1" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 guardian attack.vgz" />
+ <dataarea name="quik" size="12460">
+ <rom name="08 guardian attack.vgz" size="12460" crc="5bf10719" sha1="83a26f9c77058717d923982634439ccabe9e3bcd" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 library guardian attack.vgz" />
+ <dataarea name="quik" size="13816">
+ <rom name="09 library guardian attack.vgz" size="13816" crc="5d2f8277" sha1="3b5ab3aced99e3bb4689c3ce3e2c8deda4844e6e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 normal scroll.vgz" />
+ <dataarea name="quik" size="3456">
+ <rom name="10 normal scroll.vgz" size="3456" crc="d1a9b8c8" sha1="0df8b9e53f0a39446bd12c35f3c6e9958820d3be" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 library scroll.vgz" />
+ <dataarea name="quik" size="4014">
+ <rom name="11 library scroll.vgz" size="4014" crc="6b333f87" sha1="b379db39f78badaf80c34ee176045d6f4c5f4252" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 finish.vgz" />
+ <dataarea name="quik" size="6804">
+ <rom name="12 finish.vgz" size="6804" crc="38f2f8b6" sha1="98e3ba5cf39270a64a3e9b30a511d5a238f27112" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 win.vgz" />
+ <dataarea name="quik" size="2935">
+ <rom name="13 win.vgz" size="2935" crc="229040e5" sha1="e2cef787f316141046f5f37ba30e7b460fb6399e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 lose.vgz" />
+ <dataarea name="quik" size="2414">
+ <rom name="14 lose.vgz" size="2414" crc="0b2b35fe" sha1="00b662edcc0b3868afaeb694bb1a2420ca0a5344" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pokehkk_pico">
+ <description>Pocket Monsters Advanced Generation - Hiragana Katakana Kakechatta! (Sega Pico)</description>
+ <year>2003</year>
+ <publisher>Sega Toys</publisher>
+ <info name="cores" value="SEGA VDP PSG"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 title screen.vgz" />
+ <dataarea name="quik" size="4470">
+ <rom name="01 title screen.vgz" size="4470" crc="fb2d4702" sha1="740ee8f87927bedecc0ee3b0b97fc32a9f8ab253" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 page 1 - team rocket.vgz" />
+ <dataarea name="quik" size="3571">
+ <rom name="02 page 1 - team rocket.vgz" size="3571" crc="a0f9aa98" sha1="58ab2422919f1505f284e1c9ea0dd3357c9abb1b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 page 2 - rafting.vgz" />
+ <dataarea name="quik" size="2951">
+ <rom name="03 page 2 - rafting.vgz" size="2951" crc="51eda1ff" sha1="1864b6f18086e8cf76736edff3a18e40bf155eb9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 page 3 - latios &amp; latias.vgz" />
+ <dataarea name="quik" size="3451">
+ <rom name="04 page 3 - latios &amp; latias.vgz" size="3451" crc="b29c5d17" sha1="7421f5ae456ea346093d43cf24683c6e1499c4d4" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 page 4 - mt. chimney.vgz" />
+ <dataarea name="quik" size="4249">
+ <rom name="05 page 4 - mt. chimney.vgz" size="4249" crc="1387fd59" sha1="23a66b203ba339d6e3045a033df93d9cf6435f07" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 page 5 - pokedex.vgz" />
+ <dataarea name="quik" size="3837">
+ <rom name="06 page 5 - pokedex.vgz" size="3837" crc="b32d8d2c" sha1="696be64a7d2e4d400504734e8e677aa7ec5d5f90" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 lesson.vgz" />
+ <dataarea name="quik" size="1857">
+ <rom name="07 lesson.vgz" size="1857" crc="f61e8ce2" sha1="94933f1695ded66b102a6ac1df7c8706bb94bad6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 drawing game ~ slot machine game.vgz" />
+ <dataarea name="quik" size="2684">
+ <rom name="08 drawing game ~ slot machine game.vgz" size="2684" crc="70c25b87" sha1="6a59bfe5dd457629ea8b5eec8ce2c7750713d426" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 coin scratch game ~ name game.vgz" />
+ <dataarea name="quik" size="4078">
+ <rom name="09 coin scratch game ~ name game.vgz" size="4078" crc="6c002345" sha1="0697f5df4a381c63886cd5260df14678f066fc91" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 rayquaza game ~ pikachu's thunderbolt.vgz" />
+ <dataarea name="quik" size="3487">
+ <rom name="10 rayquaza game ~ pikachu's thunderbolt.vgz" size="3487" crc="f248997b" sha1="33bbb3946e5cdddf466ab8799fd56b82c8e15e6e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 pikachu game ~ jirachi game.vgz" />
+ <dataarea name="quik" size="3906">
+ <rom name="11 pikachu game ~ jirachi game.vgz" size="3906" crc="cac34f66" sha1="ad4ff19035703e559b77a2ed832638b68dbbcfe7" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 pokemon catching.vgz" />
+ <dataarea name="quik" size="2111">
+ <rom name="12 pokemon catching.vgz" size="2111" crc="f396a019" sha1="3290969b66c184ad35fd0048574d4a6a1d87087f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 try again.vgz" />
+ <dataarea name="quik" size="2167">
+ <rom name="13 try again.vgz" size="2167" crc="1dcff166" sha1="0a2e306b02b2a822b16165864b556f4c5abb9478" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 you did it!.vgz" />
+ <dataarea name="quik" size="902">
+ <rom name="14 you did it.vgz" size="902" crc="3cc50cf9" sha1="77eb5234fb58d64e5bd90a10bd05496fd0133537" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 success.vgz" />
+ <dataarea name="quik" size="690">
+ <rom name="15 success.vgz" size="690" crc="ca2a8808" sha1="4b220365ddfa2ee5a0efb979403327ab909d0127" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 failure.vgz" />
+ <dataarea name="quik" size="765">
+ <rom name="16 failure.vgz" size="765" crc="56703112" sha1="30be4393074ebd1e64b772dea8d3668c561a1f06" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sf2ce_pce">
+ <description>Street Fighter II' - Champion Edition (PC Engine)</description>
+ <year>1993</year>
+ <publisher>NEC</publisher>
+ <info name="cores" value="HuC6280"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 title.vgz" />
+ <dataarea name="quik" size="63714">
+ <rom name="01 title.vgz" size="63714" crc="d9d97647" sha1="211abc0cc0a3fb06b89eebb4f9762a6173bb37fe" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 player select.vgz" />
+ <dataarea name="quik" size="46235">
+ <rom name="02 player select.vgz" size="46235" crc="60bde58c" sha1="afa0b13f3f10efb610603e3d4f5a2b09dc8f7b16" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 versus.vgz" />
+ <dataarea name="quik" size="10176">
+ <rom name="03 versus.vgz" size="10176" crc="0c98c9cc" sha1="d2a23f8c2e8e8d6eaba6a886112662a66430207a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 ryu.vgz" />
+ <dataarea name="quik" size="168079">
+ <rom name="04 ryu.vgz" size="168079" crc="fde988d8" sha1="ea92665fad48a70b816866deb64a3ab370a50f26" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 edmond honda.vgz" />
+ <dataarea name="quik" size="197849">
+ <rom name="05 edmond honda.vgz" size="197849" crc="c657b191" sha1="b1a6ad3478c5ed6c3f1a7e30cbe9eb4aa99e509e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 blanka.vgz" />
+ <dataarea name="quik" size="146309">
+ <rom name="06 blanka.vgz" size="146309" crc="8b9660f5" sha1="eb40626847df4a2df1732f3f18f39b6765338229" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 guile.vgz" />
+ <dataarea name="quik" size="166550">
+ <rom name="07 guile.vgz" size="166550" crc="ce2d410d" sha1="412a0b4ba6b6dc5868788a2fa221e91336067812" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 ken.vgz" />
+ <dataarea name="quik" size="142888">
+ <rom name="08 ken.vgz" size="142888" crc="586f8bfc" sha1="1f31c3c15cd9d7d7f694b43233f9e8d0cbedeaaf" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 chun-li.vgz" />
+ <dataarea name="quik" size="116710">
+ <rom name="09 chun-li.vgz" size="116710" crc="666ae4f3" sha1="4c5f7c2fd3d974e90ee5b4115eb38a33a33b308e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 zangief.vgz" />
+ <dataarea name="quik" size="98062">
+ <rom name="10 zangief.vgz" size="98062" crc="4f8e07fd" sha1="d8a46b45f8fc68c89ac9e05197f3875663bd7d2e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 dhalsim.vgz" />
+ <dataarea name="quik" size="87936">
+ <rom name="11 dhalsim.vgz" size="87936" crc="dcc00b43" sha1="00c8a6b279a9eda62f16a1b5e232d6be086bb114" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 mike bison.vgz" />
+ <dataarea name="quik" size="112022">
+ <rom name="12 mike bison.vgz" size="112022" crc="e655c276" sha1="603f5218a43641a70f499e249a3f0c1eaf832478" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 balrog.vgz" />
+ <dataarea name="quik" size="136177">
+ <rom name="13 balrog.vgz" size="136177" crc="859f24ad" sha1="d862a9314bb2777d4bae9dac4ba934c64f3950dd" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 sagat.vgz" />
+ <dataarea name="quik" size="88635">
+ <rom name="14 sagat.vgz" size="88635" crc="5d8c2698" sha1="e07ae321a1fa6f52aaceb2020646020b8fc984a3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 vega.vgz" />
+ <dataarea name="quik" size="175169">
+ <rom name="15 vega.vgz" size="175169" crc="1af38919" sha1="8998d4a266a8fd86883251257cd9067688c2bf9c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 you win!.vgz" />
+ <dataarea name="quik" size="15273">
+ <rom name="16 you win.vgz" size="15273" crc="310825d5" sha1="19cb4a20c04f1de9c9a3df9e2fdc0317bba3387e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 bonus stage.vgz" />
+ <dataarea name="quik" size="44040">
+ <rom name="17 bonus stage.vgz" size="44040" crc="a1b931d8" sha1="57bf2c7376e1c9e24e80ade5423ed0a1aff43636" offset="0" />
+ </dataarea>
+ </part>
+ <part name="018" interface="vgm_quik">
+ <feature name="part_id" value="18 continue.vgz" />
+ <dataarea name="quik" size="33210">
+ <rom name="18 continue.vgz" size="33210" crc="129ff48e" sha1="4496d399e46c88b4e48a7ed941d37f5d0ea79840" offset="0" />
+ </dataarea>
+ </part>
+ <part name="019" interface="vgm_quik">
+ <feature name="part_id" value="19 game over.vgz" />
+ <dataarea name="quik" size="7630">
+ <rom name="19 game over.vgz" size="7630" crc="f8ee8e9d" sha1="ac3c2e976f51caca8071002e27ac66a5e4555f32" offset="0" />
+ </dataarea>
+ </part>
+ <part name="020" interface="vgm_quik">
+ <feature name="part_id" value="20 ranking.vgz" />
+ <dataarea name="quik" size="6629">
+ <rom name="20 ranking.vgz" size="6629" crc="3fa091c0" sha1="fb4f5b267b4d923bf55d96f46f6bd81efcdf0096" offset="0" />
+ </dataarea>
+ </part>
+ <part name="021" interface="vgm_quik">
+ <feature name="part_id" value="21 here comes a new challenger.vgz" />
+ <dataarea name="quik" size="6089">
+ <rom name="21 here comes a new challenger.vgz" size="6089" crc="a98902df" sha1="3db2bcb4e38548ab0ddb9b148590b11b152e05e4" offset="0" />
+ </dataarea>
+ </part>
+ <part name="022" interface="vgm_quik">
+ <feature name="part_id" value="22 ryu ending.vgz" />
+ <dataarea name="quik" size="43725">
+ <rom name="22 ryu ending.vgz" size="43725" crc="289a50de" sha1="1913eb040017c371cd7fd5df97bad4279f486a78" offset="0" />
+ </dataarea>
+ </part>
+ <part name="023" interface="vgm_quik">
+ <feature name="part_id" value="23 honda ending.vgz" />
+ <dataarea name="quik" size="10343">
+ <rom name="23 honda ending.vgz" size="10343" crc="268a54f7" sha1="fb027afbc3d9e6571599c4a38dd5ecedf557d0d4" offset="0" />
+ </dataarea>
+ </part>
+ <part name="024" interface="vgm_quik">
+ <feature name="part_id" value="24 blanka ending.vgz" />
+ <dataarea name="quik" size="54164">
+ <rom name="24 blanka ending.vgz" size="54164" crc="6e032d8f" sha1="dc2f3c2c8018f697768c2ce533a07552d51081c4" offset="0" />
+ </dataarea>
+ </part>
+ <part name="025" interface="vgm_quik">
+ <feature name="part_id" value="25 guile ending.vgz" />
+ <dataarea name="quik" size="2949">
+ <rom name="25 guile ending.vgz" size="2949" crc="05d5bc13" sha1="9315c8b1da377b62d138e8c9e53615fe1ef940b0" offset="0" />
+ </dataarea>
+ </part>
+ <part name="026" interface="vgm_quik">
+ <feature name="part_id" value="26 ken ending 1.vgz" />
+ <dataarea name="quik" size="21566">
+ <rom name="26 ken ending 1.vgz" size="21566" crc="3727e918" sha1="5455d45f0b6188819441f5633d7b3595a2b3d9fd" offset="0" />
+ </dataarea>
+ </part>
+ <part name="027" interface="vgm_quik">
+ <feature name="part_id" value="27 ken ending 2.vgz" />
+ <dataarea name="quik" size="5927">
+ <rom name="27 ken ending 2.vgz" size="5927" crc="1d68afe5" sha1="4e868aae69349f086f97b1bab9a0c6d90da93454" offset="0" />
+ </dataarea>
+ </part>
+ <part name="028" interface="vgm_quik">
+ <feature name="part_id" value="28 chun-li ending 1.vgz" />
+ <dataarea name="quik" size="62342">
+ <rom name="28 chun-li ending 1.vgz" size="62342" crc="e89c67d2" sha1="defeeb3d79a3aa7153859ae46692fed79c47578a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="029" interface="vgm_quik">
+ <feature name="part_id" value="29 chun-li ending 2.vgz" />
+ <dataarea name="quik" size="4786">
+ <rom name="29 chun-li ending 2.vgz" size="4786" crc="3a17f44f" sha1="278ef568e100316dfb9b9210e22e91b5d77a34e7" offset="0" />
+ </dataarea>
+ </part>
+ <part name="030" interface="vgm_quik">
+ <feature name="part_id" value="30 zangief ending.vgz" />
+ <dataarea name="quik" size="38137">
+ <rom name="30 zangief ending.vgz" size="38137" crc="8c4db9e3" sha1="c9f32709969b88f08572f158750c38464efc2d07" offset="0" />
+ </dataarea>
+ </part>
+ <part name="031" interface="vgm_quik">
+ <feature name="part_id" value="31 dhalsim ending.vgz" />
+ <dataarea name="quik" size="74709">
+ <rom name="31 dhalsim ending.vgz" size="74709" crc="798c42c2" sha1="8781868ab0764504594482e770002b27c867c2b0" offset="0" />
+ </dataarea>
+ </part>
+ <part name="032" interface="vgm_quik">
+ <feature name="part_id" value="32 evil ending.vgz" />
+ <dataarea name="quik" size="54486">
+ <rom name="32 evil ending.vgz" size="54486" crc="fa9d797c" sha1="64124b61154a31f642fd60a66e3aae5f3f87e7a8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="033" interface="vgm_quik">
+ <feature name="part_id" value="33 credits.vgz" />
+ <dataarea name="quik" size="141134">
+ <rom name="33 credits.vgz" size="141134" crc="fc1580d7" sha1="aa0013eed63eac3946bb9f4315383b608dc5f1d4" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stripf2_pce">
+ <description>Strip Fighter II (PC Engine)</description>
+ <year>1993</year>
+ <publisher>Games Express</publisher>
+ <info name="cores" value="HuC6280"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 title.vgz" />
+ <dataarea name="quik" size="16357">
+ <rom name="01 title.vgz" size="16357" crc="7901ea20" sha1="a9c3964385e5e078bc76d3f426321554e1a3fa7d" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 player select.vgz" />
+ <dataarea name="quik" size="11896">
+ <rom name="02 player select.vgz" size="11896" crc="d7ce4b68" sha1="831b1b880435258cd48e55002a397dbbe8ec0a94" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 medusa stage (greece).vgz" />
+ <dataarea name="quik" size="14969">
+ <rom name="03 medusa stage (greece).vgz" size="14969" crc="849aa716" sha1="445f2b646560055acc516bca476b4ff7738dc177" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 martha stage (england).vgz" />
+ <dataarea name="quik" size="13496">
+ <rom name="04 martha stage (england).vgz" size="13496" crc="9c4a21e9" sha1="f969d1a8159890c17e99b6c74bf556a07c3a7c90" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 amanda stage (brazil).vgz" />
+ <dataarea name="quik" size="18850">
+ <rom name="05 amanda stage (brazil).vgz" size="18850" crc="fa0cdefb" sha1="86390248e95728614d19bf3702db3fa8d1efc4b0" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 bella stage (usa).vgz" />
+ <dataarea name="quik" size="10945">
+ <rom name="06 bella stage (usa).vgz" size="10945" crc="e98be356" sha1="58894819a85ea5d5fe91089231cabba4206f9120" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 yuki stage (japan).vgz" />
+ <dataarea name="quik" size="12271">
+ <rom name="07 yuki stage (japan).vgz" size="12271" crc="83c2956a" sha1="e786c70115bcb58f1cbb0c0b1b752647e3d9ab25" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 nina stage (italy).vgz" />
+ <dataarea name="quik" size="13403">
+ <rom name="08 nina stage (italy).vgz" size="13403" crc="a452b17e" sha1="c79db6b31f4e7ed5afbca4498afc54908dd1ac17" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 continue.vgz" />
+ <dataarea name="quik" size="6251">
+ <rom name="09 continue.vgz" size="6251" crc="4f162ff5" sha1="138642060c7982c987d6b798f0ef73e09a6c88bc" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suttehak_gb">
+ <description>Sutte Hakkun GB (Nintendo Game Boy)</description>
+ <year>1997</year>
+ <publisher>Nintendo</publisher>
+ <info name="cores" value="Game Boy DMG (LR35902)"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 title.vgz" />
+ <dataarea name="quik" size="20425">
+ <rom name="01 title.vgz" size="20425" crc="dfaf5cf4" sha1="1a0533347e4831c38eff852aee7a12fb032efd3f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 file select.vgz" />
+ <dataarea name="quik" size="5974">
+ <rom name="02 file select.vgz" size="5974" crc="3592ecb4" sha1="ebb024aeac13759b63923936850fead88c6f4ef1" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 cutscene 1.vgz" />
+ <dataarea name="quik" size="4753">
+ <rom name="03 cutscene 1.vgz" size="4753" crc="0ad8aa50" sha1="34bce50fc577cd49fded14088fc3fe5f820cf979" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 world map.vgz" />
+ <dataarea name="quik" size="8012">
+ <rom name="04 world map.vgz" size="8012" crc="0c5d76c2" sha1="ec8ce9dcb612d88d5d9dbc8559f8228af74492ba" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 stage 1.vgz" />
+ <dataarea name="quik" size="12145">
+ <rom name="05 stage 1.vgz" size="12145" crc="40407d51" sha1="4b906336a4e66fb1dcf2582cfe0be7fdb0752115" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 nice clear!.vgz" />
+ <dataarea name="quik" size="1384">
+ <rom name="06 nice clear.vgz" size="1384" crc="89bec27e" sha1="448f022d7b2698928b0d5587d3c9e8438cb4cf85" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 results (sfc nice clear!).vgz" />
+ <dataarea name="quik" size="4963">
+ <rom name="07 results (sfc nice clear).vgz" size="4963" crc="0c8e6ee7" sha1="615ae7d909df31eb07ecb1c27480eb2155c36b31" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 stage clear.vgz" />
+ <dataarea name="quik" size="1637">
+ <rom name="08 stage clear.vgz" size="1637" crc="dd93429a" sha1="7cafa7025f2296e6fdcd3837ddd2ec23478f905a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 stage 2.vgz" />
+ <dataarea name="quik" size="19445">
+ <rom name="09 stage 2.vgz" size="19445" crc="084bcc5e" sha1="dc4e438778fb90d24328c2a94c6b750f2f573ce9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 stage 3.vgz" />
+ <dataarea name="quik" size="20478">
+ <rom name="10 stage 3.vgz" size="20478" crc="9d7582a5" sha1="ca6297a9a8b2ab7036330fcd31df1d15f826cc3a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 stage 4.vgz" />
+ <dataarea name="quik" size="17329">
+ <rom name="11 stage 4.vgz" size="17329" crc="cb96975c" sha1="68db773c1ee06b98bb64f7cdf33c4c5526e0f78e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 stage 5 (sfc stage 6).vgz" />
+ <dataarea name="quik" size="19866">
+ <rom name="12 stage 5 (sfc stage 6).vgz" size="19866" crc="36cec34a" sha1="f622fe3cd07d8e30014ba565c18c8d86e91e170b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 stage 6 (sfc stage 8).vgz" />
+ <dataarea name="quik" size="22725">
+ <rom name="13 stage 6 (sfc stage 8).vgz" size="22725" crc="c14cab7a" sha1="eb6e01aea819c007ebaf6a09d4c96236d8f54b21" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 stage 7.vgz" />
+ <dataarea name="quik" size="23623">
+ <rom name="14 stage 7.vgz" size="23623" crc="e3dc9c48" sha1="e28cb6683c1900a9ffd44958ed9e2632e1bd5e4f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 stage 8 (sfc stage 5).vgz" />
+ <dataarea name="quik" size="19827">
+ <rom name="15 stage 8 (sfc stage 5).vgz" size="19827" crc="0b3c385e" sha1="6a059c04a82fe4fb6b09820688addfacc97c7fba" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 stage 9 (sfc stage 10).vgz" />
+ <dataarea name="quik" size="22721">
+ <rom name="16 stage 9 (sfc stage 10).vgz" size="22721" crc="5121aa20" sha1="1ea0f735e6a34a7fce954bf25bf331bab7a94f8f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 cutscene 2.vgz" />
+ <dataarea name="quik" size="6381">
+ <rom name="17 cutscene 2.vgz" size="6381" crc="a25dd256" sha1="330c90ff8f4513d38ad1959e97717f084d6ccfe1" offset="0" />
+ </dataarea>
+ </part>
+ <part name="018" interface="vgm_quik">
+ <feature name="part_id" value="18 stage 10 (sfc extra stage).vgz" />
+ <dataarea name="quik" size="20238">
+ <rom name="18 stage 10 (sfc extra stage).vgz" size="20238" crc="5b20eb3f" sha1="5727b36e3b999dd15575c510b3522e16728e20f3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="019" interface="vgm_quik">
+ <feature name="part_id" value="19 ranking.vgz" />
+ <dataarea name="quik" size="2386">
+ <rom name="19 ranking.vgz" size="2386" crc="5d936ea3" sha1="a3f5f2c5cfdf84099a59740030c4021eba8ec140" offset="0" />
+ </dataarea>
+ </part>
+ <part name="020" interface="vgm_quik">
+ <feature name="part_id" value="20 staff roll.vgz" />
+ <dataarea name="quik" size="21260">
+ <rom name="20 staff roll.vgz" size="21260" crc="e420efad" sha1="a69131904f8198575ff4d06e9d62fb4cf98dc78b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="021" interface="vgm_quik">
+ <feature name="part_id" value="21 2p menu (sfc happiness tower).vgz" />
+ <dataarea name="quik" size="8758">
+ <rom name="21 2p menu (sfc happiness tower).vgz" size="8758" crc="a5bf88a2" sha1="2aa06d9487191bd8bbb6f2d1b571033cc44d0e26" offset="0" />
+ </dataarea>
+ </part>
+ <part name="022" interface="vgm_quik">
+ <feature name="part_id" value="22 2p stage music 1 (sfc unused song 1).vgz" />
+ <dataarea name="quik" size="13816">
+ <rom name="22 2p stage music 1 (sfc unused song 1).vgz" size="13816" crc="5b6638e9" sha1="6aa0363d9aafb8ce2ae2592f6bd1a003c6fa4dcb" offset="0" />
+ </dataarea>
+ </part>
+ <part name="023" interface="vgm_quik">
+ <feature name="part_id" value="23 2p stage music 2.vgz" />
+ <dataarea name="quik" size="19953">
+ <rom name="23 2p stage music 2.vgz" size="19953" crc="97f17b7a" sha1="26390912d9fb2b4e282100d18b9d654fce8bbd6b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="024" interface="vgm_quik">
+ <feature name="part_id" value="24 2p stage music 3 (sfc practice stage).vgz" />
+ <dataarea name="quik" size="13277">
+ <rom name="24 2p stage music 3 (sfc practice stage).vgz" size="13277" crc="4139cefc" sha1="54e9b98a1d7584acef00a46c6620be42571f4f38" offset="0" />
+ </dataarea>
+ </part>
+ <part name="025" interface="vgm_quik">
+ <feature name="part_id" value="25 2p lose.vgz" />
+ <dataarea name="quik" size="2069">
+ <rom name="25 2p lose.vgz" size="2069" crc="e838c481" sha1="4c6dbc4c3d7298f206016542578db17bc5ca91b6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="026" interface="vgm_quik">
+ <feature name="part_id" value="26 2p win.vgz" />
+ <dataarea name="quik" size="2146">
+ <rom name="26 2p win.vgz" size="2146" crc="7b367512" sha1="9ea6a674bc21ca42e8767cf609b3097ca32f48f4" offset="0" />
+ </dataarea>
+ </part>
+ <part name="027" interface="vgm_quik">
+ <feature name="part_id" value="27 unused jingle 1.vgz" />
+ <dataarea name="quik" size="1683">
+ <rom name="27 unused jingle 1.vgz" size="1683" crc="cc13d585" sha1="75402d7479e79d2fef4bb56942e3c99c9441d740" offset="0" />
+ </dataarea>
+ </part>
+ <part name="028" interface="vgm_quik">
+ <feature name="part_id" value="28 unused jingle 2 .vgz" />
+ <dataarea name="quik" size="1342">
+ <rom name="28 unused jingle 2 .vgz" size="1342" crc="9e953517" sha1="08d9f899925a581e209a7b8435b26c1b07e160c4" offset="0" />
+ </dataarea>
+ </part>
+ <part name="029" interface="vgm_quik">
+ <feature name="part_id" value="29 unused jingle 3.vgz" />
+ <dataarea name="quik" size="1835">
+ <rom name="29 unused jingle 3.vgz" size="1835" crc="19a24d0e" sha1="c7e9a1ecb009195ae4c916328c8904f6620993f9" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="toiletk_pce">
+ <description>Toilet Kids (PC Engine)</description>
+ <year>1992</year>
+ <publisher>Media Rings</publisher>
+ <info name="cores" value="HuC6280"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 title.vgz" />
+ <dataarea name="quik" size="91681">
+ <rom name="01 title.vgz" size="91681" crc="70e46760" sha1="3e4906ae6eafb3c6b5d28a683cbce98908cfe585" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 stage 1.vgz" />
+ <dataarea name="quik" size="93202">
+ <rom name="02 stage 1.vgz" size="93202" crc="09b5f97c" sha1="ff8eae6a1c6c538a434f7b4cb288353e643936a6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 stage 2.vgz" />
+ <dataarea name="quik" size="86688">
+ <rom name="03 stage 2.vgz" size="86688" crc="b34cc77b" sha1="1dd2d74d377f8c5517299eece22a855fa1a149eb" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 stage 3.vgz" />
+ <dataarea name="quik" size="57327">
+ <rom name="04 stage 3.vgz" size="57327" crc="9b2f51bf" sha1="c1a1c12f5259fcb438657e6f2fd99820966d7c6d" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 stage 4.vgz" />
+ <dataarea name="quik" size="107235">
+ <rom name="05 stage 4.vgz" size="107235" crc="47cb60e3" sha1="de253090ebc0761747740897f17b5bf328eba502" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 mid-boss.vgz" />
+ <dataarea name="quik" size="42585">
+ <rom name="06 mid-boss.vgz" size="42585" crc="e362cc0a" sha1="e45b0e105f29897962a53902bceaccf7f82caff7" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 boss.vgz" />
+ <dataarea name="quik" size="67330">
+ <rom name="07 boss.vgz" size="67330" crc="097ae32c" sha1="89901460d401263a89ac04bc0dabfaf2d49391af" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 stage clear.vgz" />
+ <dataarea name="quik" size="10778">
+ <rom name="08 stage clear.vgz" size="10778" crc="26a66be5" sha1="102d8fd8f570a598e098cba00a313943198f1583" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 final boss 1.vgz" />
+ <dataarea name="quik" size="60119">
+ <rom name="09 final boss 1.vgz" size="60119" crc="9bb7b589" sha1="7bad089a3679caa5602795009bd5e4c939e08292" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 final boss 2.vgz" />
+ <dataarea name="quik" size="40178">
+ <rom name="10 final boss 2.vgz" size="40178" crc="6b0a1486" sha1="5074a9d59f10a5033d8ff80f9be9a37e0373270d" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 ending &amp; credits.vgz" />
+ <dataarea name="quik" size="72151">
+ <rom name="11 ending &amp; credits.vgz" size="72151" crc="bd69a0a1" sha1="1efd1e68e85b568a15c104bcd30f59386b4a3bbc" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 game over.vgz" />
+ <dataarea name="quik" size="9758">
+ <rom name="12 game over.vgz" size="9758" crc="aef74ed1" sha1="b53eee02e3d8337877d03aa8b4249a214c27e8d4" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 unused 1.vgz" />
+ <dataarea name="quik" size="9205">
+ <rom name="13 unused 1.vgz" size="9205" crc="57a27978" sha1="ae2e8747fb70c333ff3f711e8387d408e39093f7" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 unused 2.vgz" />
+ <dataarea name="quik" size="42525">
+ <rom name="14 unused 2.vgz" size="42525" crc="4677a54d" sha1="e62a739389351136187e5ac44a83dd485f0f85fb" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 unused 3.vgz" />
+ <dataarea name="quik" size="39480">
+ <rom name="15 unused 3.vgz" size="39480" crc="1d7b16d0" sha1="7139fcbfda8e31bf4a3255bc647bed27a21ba4cb" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="toyshopb_pce">
+ <description>Toy Shop Boys (PC Engine)</description>
+ <year>1990</year>
+ <publisher>Victor Musical Industries,</publisher>
+ <info name="cores" value="HuC6280"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 stage 1.vgz" />
+ <dataarea name="quik" size="8808">
+ <rom name="01 stage 1.vgz" size="8808" crc="4c45cab3" sha1="7950439791831b163859a6a1f5dd4d7e550757d6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 stage 2.vgz" />
+ <dataarea name="quik" size="8442">
+ <rom name="02 stage 2.vgz" size="8442" crc="c461d490" sha1="0595f5142ce3360c8e34b05fecb446d3b115410c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 stage 3.vgz" />
+ <dataarea name="quik" size="11536">
+ <rom name="03 stage 3.vgz" size="11536" crc="b36ac197" sha1="a697b328798a0c43fcbc4026a0003cf3041cefb5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 stage 4.vgz" />
+ <dataarea name="quik" size="11096">
+ <rom name="04 stage 4.vgz" size="11096" crc="8ff61c01" sha1="b4354f17fb2ec369d4d0c79abc411d046d591279" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 stage 5.vgz" />
+ <dataarea name="quik" size="4063">
+ <rom name="05 stage 5.vgz" size="4063" crc="338b5f84" sha1="306c7a54d5f6e2cb65f07320dd28eba02c0e8b68" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 stage 6.vgz" />
+ <dataarea name="quik" size="8503">
+ <rom name="06 stage 6.vgz" size="8503" crc="94e54b69" sha1="0b394625ce1745ede5c9898e519b9f85c15002d6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 boss 1.vgz" />
+ <dataarea name="quik" size="4334">
+ <rom name="07 boss 1.vgz" size="4334" crc="a817fec7" sha1="09b9b72272f911f94588a300a98499524bb55baf" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 boss 2.vgz" />
+ <dataarea name="quik" size="3002">
+ <rom name="08 boss 2.vgz" size="3002" crc="08f17914" sha1="94bd1fb41780b8bd53d99453d439f52334925272" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 final boss.vgz" />
+ <dataarea name="quik" size="4876">
+ <rom name="09 final boss.vgz" size="4876" crc="b3b7b512" sha1="78cbcf5d982e4c59d82ba31c463bc293f24a63e4" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 stage complete.vgz" />
+ <dataarea name="quik" size="3169">
+ <rom name="10 stage complete.vgz" size="3169" crc="564c095d" sha1="e7a6f8781126f5fbe680c54ac3be8189ff920250" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 game over.vgz" />
+ <dataarea name="quik" size="3304">
+ <rom name="11 game over.vgz" size="3304" crc="4047ffae" sha1="a9acd02072cdfb74d16aeb697f1530caa63d48d8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 credits.vgz" />
+ <dataarea name="quik" size="21263">
+ <rom name="12 credits.vgz" size="21263" crc="38c15d34" sha1="2e01d41b00b84ae3f001d6c909264d644d7b1fdd" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tricky_tg16">
+ <description>Tricky Kick (TG-16)</description>
+ <year>1991</year>
+ <publisher>IGS</publisher>
+ <info name="cores" value="HuC6280"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 oberon's forest.vgz" />
+ <dataarea name="quik" size="33318">
+ <rom name="01 oberon's forest.vgz" size="33318" crc="8ef1a5af" sha1="1a29f6a0b2b8cc7953a14d52fd29c8b244d2c722" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 mayumi's neighborhood.vgz" />
+ <dataarea name="quik" size="18044">
+ <rom name="02 mayumi's neighborhood.vgz" size="18044" crc="a3669fc2" sha1="a437ba82a4b7f6c7f1b4c5822b6e7e3b4b48664b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 gonzo's hunting.vgz" />
+ <dataarea name="quik" size="44610">
+ <rom name="03 gonzo's hunting.vgz" size="44610" crc="db96a4c5" sha1="43afc5d0eabe93e6057aa06922fc6cbba026980f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 taro's haunted mansion.vgz" />
+ <dataarea name="quik" size="9230">
+ <rom name="04 taro's haunted mansion.vgz" size="9230" crc="36e9c0bc" sha1="e36136c2447133eaa844316a78a6cd52418cdc06" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 suzuki's feudal war.vgz" />
+ <dataarea name="quik" size="44338">
+ <rom name="05 suzuki's feudal war.vgz" size="44338" crc="39a8e05f" sha1="08041e57dceff82d8401122ebc77f5a5680bf8c9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 udon's city.vgz" />
+ <dataarea name="quik" size="56906">
+ <rom name="06 udon's city.vgz" size="56906" crc="b8d2ba23" sha1="58921c864a068a7caa508c3ccd2681a82a339579" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 congratulations.vgz" />
+ <dataarea name="quik" size="5532">
+ <rom name="07 congratulations.vgz" size="5532" crc="59c78fbb" sha1="4ef5094fd87250aaf197b9e80d41bd81643f22d5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 give up.vgz" />
+ <dataarea name="quik" size="1564">
+ <rom name="08 give up.vgz" size="1564" crc="e323f941" sha1="63b13d5b216e8a5302b4502c3ad08894d3df056c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 ending.vgz" />
+ <dataarea name="quik" size="48133">
+ <rom name="09 ending.vgz" size="48133" crc="8c7dd827" sha1="3a649c6c57fbbc81a1c098b8ca17f1bf26789a57" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 credits.vgz" />
+ <dataarea name="quik" size="47942">
+ <rom name="10 credits.vgz" size="47942" crc="2a34734d" sha1="a107a65ea2a5f9a68e56c87b4fe6050b472e26dc" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vtetris_vb">
+ <description>V-Tetris (Nintendo Virtual Boy)</description>
+ <year>1995</year>
+ <publisher>Bullet-Proof Software</publisher>
+ <info name="cores" value="VSU-VUE"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 startup.vgz" />
+ <dataarea name="quik" size="1165">
+ <rom name="01 startup.vgz" size="1165" crc="1bc6cce0" sha1="f74bc294ef42695438874257c8bb188847c6662d" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 title screen.vgz" />
+ <dataarea name="quik" size="2394">
+ <rom name="02 title screen.vgz" size="2394" crc="6628b393" sha1="6dad26a2a2ccc0b09339017d6d09d746635de55c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 mode select.vgz" />
+ <dataarea name="quik" size="1421">
+ <rom name="03 mode select.vgz" size="1421" crc="d714c2f7" sha1="516f17f677a4a2ec515d36e916e660780d644e59" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 song a.vgz" />
+ <dataarea name="quik" size="8511">
+ <rom name="04 song a.vgz" size="8511" crc="ade242b7" sha1="812d36cea1874eacc6f5f8f04a9f737a9e98f05e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 song b.vgz" />
+ <dataarea name="quik" size="3561">
+ <rom name="05 song b.vgz" size="3561" crc="c1b33938" sha1="989439bfa8b7b04178a081e1a2c3859c592a7c08" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 song c.vgz" />
+ <dataarea name="quik" size="3832">
+ <rom name="06 song c.vgz" size="3832" crc="f2528873" sha1="822893c73f16b5d4835b9d662fb9363d5a5b92f9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 mode c - level 00-07.vgz" />
+ <dataarea name="quik" size="2113">
+ <rom name="07 mode c - level 00-07.vgz" size="2113" crc="1067f3e3" sha1="d882eda75761b685bc1e0ee856b30c39d84d9ae6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 mode c - level 08-13.vgz" />
+ <dataarea name="quik" size="2880">
+ <rom name="08 mode c - level 08-13.vgz" size="2880" crc="1269ec78" sha1="3c55dd96b4473534fcaff6d2bbc6e1fee7652217" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 mode c - level 14-19.vgz" />
+ <dataarea name="quik" size="4187">
+ <rom name="09 mode c - level 14-19.vgz" size="4187" crc="2c781513" sha1="c2f06ad01ac9a3c084337f563c08683647ad99d3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 input your name! 1 (leaderboard).vgz" />
+ <dataarea name="quik" size="1644">
+ <rom name="10 input your name 1 (leaderboard).vgz" size="1644" crc="ec1da972" sha1="61504ed62d650e0ae8e00fdb04bc1b9ac900dcf3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 input your name! 2 (#1 score).vgz" />
+ <dataarea name="quik" size="1955">
+ <rom name="11 input your name 2 (#1 score).vgz" size="1955" crc="1bfd7bd1" sha1="bda638d6c378d9ed9932e39521f75632dcc46747" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 round clear.vgz" />
+ <dataarea name="quik" size="1350">
+ <rom name="12 round clear.vgz" size="1350" crc="bba3b12e" sha1="098e2f08605d5b1f9ccc1389566dc8a20a4d1230" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 game clear.vgz" />
+ <dataarea name="quik" size="1461">
+ <rom name="13 game clear.vgz" size="1461" crc="d4e5e5ac" sha1="a6fb8f7f891b9bb5355c023c631f1617dc273ea6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 congratulation!! ~ ending.vgz" />
+ <dataarea name="quik" size="2054">
+ <rom name="14 congratulation ~ ending.vgz" size="2054" crc="b1818d32" sha1="fa88d2f7e7b3525f93693a0724d62c80566a5f60" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 credits.vgz" />
+ <dataarea name="quik" size="4140">
+ <rom name="15 credits.vgz" size="4140" crc="2c2d23ae" sha1="29c28670e07be9dc13be55a214121f81e67122ab" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 demo.vgz" />
+ <dataarea name="quik" size="3472">
+ <rom name="16 demo.vgz" size="3472" crc="a5931d9f" sha1="683a488a553155b24a3666f7a88250c38752d12f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 warning.vgz" />
+ <dataarea name="quik" size="1957">
+ <rom name="17 warning.vgz" size="1957" crc="2929b366" sha1="289710322a5f9788946c1d0827ade60fbf7b703d" offset="0" />
+ </dataarea>
+ </part>
+ <part name="018" interface="vgm_quik">
+ <feature name="part_id" value="18 unknown track.vgz" />
+ <dataarea name="quik" size="2456">
+ <rom name="18 unknown track.vgz" size="2456" crc="8005960d" sha1="99bea090067c1e4fe30ee0c8a5a3c5cf8a6c4229" offset="0" />
+ </dataarea>
+ </part>
+ <part name="019" interface="vgm_quik">
+ <feature name="part_id" value="19 unknown jingle.vgz" />
+ <dataarea name="quik" size="1295">
+ <rom name="19 unknown jingle.vgz" size="1295" crc="6a4c70ee" sha1="9309437aa8050e4bd3dd38ad0eeee01f32f3bd63" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="victoryr_tg16">
+ <description>Victory Run (TG-16)</description>
+ <year>1987</year>
+ <publisher>Hudson Soft</publisher>
+ <info name="cores" value="HuC6280"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 title.vgz" />
+ <dataarea name="quik" size="4750">
+ <rom name="01 title.vgz" size="4750" crc="b5e6369f" sha1="194e4215c10b1c9979060e10d606bdc6d9132ce9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 setup.vgz" />
+ <dataarea name="quik" size="7265">
+ <rom name="02 setup.vgz" size="7265" crc="18ede122" sha1="08d774c90374572e933957f0aa5169b855310467" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 ingame 1.vgz" />
+ <dataarea name="quik" size="6468">
+ <rom name="03 ingame 1.vgz" size="6468" crc="9ddad65b" sha1="9c3aa8e2854ff1178060026d45ff6fb781528eee" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 ingame 2.vgz" />
+ <dataarea name="quik" size="6691">
+ <rom name="04 ingame 2.vgz" size="6691" crc="28ea428a" sha1="39613f0387e02309351815dc5b10d2c6a24e9cb0" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 ingame 3.vgz" />
+ <dataarea name="quik" size="7304">
+ <rom name="05 ingame 3.vgz" size="7304" crc="313aab90" sha1="dde360a99c246dfc5ec21a59b855435430c4cfa7" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="waterwld_vb">
+ <description>Waterworld (Nintendo Virtual Boy)</description>
+ <year>1995</year>
+ <publisher>Ocean</publisher>
+ <info name="cores" value="VSU-VUE"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 title screen.vgz" />
+ <dataarea name="quik" size="77487">
+ <rom name="01 title screen.vgz" size="77487" crc="98db53ef" sha1="ff6d2bb380584c3288ca73cb1b8e5c071c9a8f34" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 level theme.vgz" />
+ <dataarea name="quik" size="15453">
+ <rom name="02 level theme.vgz" size="15453" crc="017c298b" sha1="d76a89960f039db41fc72ec33cb8e8745a38fc5f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 game over.vgz" />
+ <dataarea name="quik" size="2130">
+ <rom name="03 game over.vgz" size="2130" crc="e5bc98c2" sha1="4be427a299ed5b2b41c0ee0da5d97fedad4e2cee" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 unused song.vgz" />
+ <dataarea name="quik" size="23039">
+ <rom name="04 unused song.vgz" size="23039" crc="1ba8e52d" sha1="07d23cd0d5acc241b143cfc1233d126d233022eb" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wctennis_tg16">
+ <description>World Court Tennis (TG-16)</description>
+ <year>1988</year>
+ <publisher>Namco</publisher>
+ <info name="cores" value="HuC6280"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 mode select.vgz" />
+ <dataarea name="quik" size="3773">
+ <rom name="01 mode select.vgz" size="3773" crc="e923e41b" sha1="9b2f5c94f6b472b62f436901691c7a42dd094ed5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 match start.vgz" />
+ <dataarea name="quik" size="1210">
+ <rom name="02 match start.vgz" size="1210" crc="73cefbd5" sha1="6bfc840540b19966526a8e78ad5d3894fa2b8e91" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 quest - intro.vgz" />
+ <dataarea name="quik" size="3836">
+ <rom name="03 quest - intro.vgz" size="3836" crc="7d75bf17" sha1="8e57f0208270d45f7281c6ffbabdfc49836b8d95" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 quest - town.vgz" />
+ <dataarea name="quik" size="8252">
+ <rom name="04 quest - town.vgz" size="8252" crc="6ef0be9f" sha1="c4fcb3d21a20d69466e87e1f47ce5bc73d6ac622" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 quest - town (looped).vgz" />
+ <dataarea name="quik" size="8712">
+ <rom name="05 quest - town (looped).vgz" size="8712" crc="073fe6ed" sha1="b3ae0f2669068e6d290fe514c9a00fedb1bbbe4b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 quest - casual talk.vgz" />
+ <dataarea name="quik" size="2970">
+ <rom name="06 quest - casual talk.vgz" size="2970" crc="9e901899" sha1="265c6fa9abd41f62afdc6fe7b7d025b0651c5e59" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 quest - overworld.vgz" />
+ <dataarea name="quik" size="9436">
+ <rom name="07 quest - overworld.vgz" size="9436" crc="abcb6297" sha1="ea339a970d1ebb813ba80c18dc9ccdfb724cf01f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 quest - i challenge you.vgz" />
+ <dataarea name="quik" size="2018">
+ <rom name="08 quest - i challenge you.vgz" size="2018" crc="d80c692f" sha1="1f5a20ccf5460ca1fa1e6ee4dcb3ae6464890ca9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 quest - victory.vgz" />
+ <dataarea name="quik" size="1531">
+ <rom name="09 quest - victory.vgz" size="1531" crc="a6ed31cc" sha1="079db3b27a8e97742cf010cea743481438213a1a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 quest - inner tube.vgz" />
+ <dataarea name="quik" size="3118">
+ <rom name="10 quest - inner tube.vgz" size="3118" crc="7bcffc5f" sha1="f64926b23e7207984bb98ec7a40d8999dec49041" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 unused.vgz" />
+ <dataarea name="quik" size="3127">
+ <rom name="11 unused.vgz" size="3127" crc="7b03bd54" sha1="3767c67b2324d8498209aef99f8f3ac601e43abe" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+<!-- vgmrips.net update - August 24, 2021 - 15 New Entries -->
+
+ <software name="angelwar_msx2o">
+ <description>Angelic Warrior DEVA (MSX2, OPLL)</description>
+ <year>2020</year>
+ <publisher>Team DEVA</publisher>
+ <info name="cores" value="MSX-MUSIC (YM2413)"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 audio setup menu.vgz" />
+ <dataarea name="quik" size="21732">
+ <rom name="01 audio setup menu.vgz" size="21732" crc="04e8d903" sha1="017d22dccbac60fca40510b75dba1789f2156c59" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 title screen.vgz" />
+ <dataarea name="quik" size="9038">
+ <rom name="02 title screen.vgz" size="9038" crc="72eaacc9" sha1="ba192275368e25ffa6762152b050625452dee5fe" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 loading menu.vgz" />
+ <dataarea name="quik" size="2069">
+ <rom name="03 loading menu.vgz" size="2069" crc="8f295ab4" sha1="9da74360cbab1433d79e622454a4063c8ec38437" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 introduction demo i.vgz" />
+ <dataarea name="quik" size="8631">
+ <rom name="04 introduction demo i.vgz" size="8631" crc="53f64500" sha1="47145a049d23ba3794a7d89110796e9caf48c9c6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 introduction demo ii.vgz" />
+ <dataarea name="quik" size="49796">
+ <rom name="05 introduction demo ii.vgz" size="49796" crc="cde3b754" sha1="7b230b8bc245a42af675bc66d0ec08b1ef312ee6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 introduction demo iii.vgz" />
+ <dataarea name="quik" size="6151">
+ <rom name="06 introduction demo iii.vgz" size="6151" crc="bc9154f5" sha1="54c80f001964f787ef492ebadc57d39235bd5f93" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 area i -vr testing facility-.vgz" />
+ <dataarea name="quik" size="15812">
+ <rom name="07 area i -vr testing facility-.vgz" size="15812" crc="0502be69" sha1="dbe10d32bea3a479fb1ff4983c26bebbaeed17ac" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 boss theme.vgz" />
+ <dataarea name="quik" size="24027">
+ <rom name="08 boss theme.vgz" size="24027" crc="bbf8d151" sha1="b42009568b212db1349294f9b53998e6f9822c3b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 level clear.vgz" />
+ <dataarea name="quik" size="2864">
+ <rom name="09 level clear.vgz" size="2864" crc="71c086ff" sha1="96701c92d6d20dc92e7f57eefb87b63b20ae2424" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 area ii -sky aquaducts-.vgz" />
+ <dataarea name="quik" size="39134">
+ <rom name="10 area ii -sky aquaducts-.vgz" size="39134" crc="04c707a0" sha1="8a99e5c399d584521839184a98c8dfb5d0cbf4ad" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 area iii -geyser plains-.vgz" />
+ <dataarea name="quik" size="8135">
+ <rom name="11 area iii -geyser plains-.vgz" size="8135" crc="167babb6" sha1="752a8517fe02351f1b03391f9586fa3359d4f5dc" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 area iv -plasma factory-.vgz" />
+ <dataarea name="quik" size="20571">
+ <rom name="12 area iv -plasma factory-.vgz" size="20571" crc="845efaa6" sha1="59265cf6c0f3a04b2949b13932d1855254555cf4" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 area v -lost space station-.vgz" />
+ <dataarea name="quik" size="13638">
+ <rom name="13 area v -lost space station-.vgz" size="13638" crc="831aaeb3" sha1="38e30b184e59b794281aa1229d1a11bc8f9b6255" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 area vi -temple of subramanya-.vgz" />
+ <dataarea name="quik" size="9415">
+ <rom name="14 area vi -temple of subramanya-.vgz" size="9415" crc="b6937c47" sha1="a7aeea5ad4c6987f179fe1d6b04792026db76f9c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 area vii -construction site-.vgz" />
+ <dataarea name="quik" size="36639">
+ <rom name="15 area vii -construction site-.vgz" size="36639" crc="89f33d5b" sha1="691cb81f6db43efc421369a0bab19faa26fd5a21" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 area viii -death zone-.vgz" />
+ <dataarea name="quik" size="5788">
+ <rom name="16 area viii -death zone-.vgz" size="5788" crc="22cbd8c1" sha1="f23c318c2e0ae22e6c6b9f28145720721d4a002c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 mid demo i.vgz" />
+ <dataarea name="quik" size="11139">
+ <rom name="17 mid demo i.vgz" size="11139" crc="115ede58" sha1="2c016c1a4370b848cac008e82ba782abbb1287e5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="018" interface="vgm_quik">
+ <feature name="part_id" value="18 mid demo ii.vgz" />
+ <dataarea name="quik" size="24745">
+ <rom name="18 mid demo ii.vgz" size="24745" crc="e584b70a" sha1="a5f27af9b898d5d46e5981ddd71d900513d679ef" offset="0" />
+ </dataarea>
+ </part>
+ <part name="019" interface="vgm_quik">
+ <feature name="part_id" value="19 area ix -amaravati temple-.vgz" />
+ <dataarea name="quik" size="9243">
+ <rom name="19 area ix -amaravati temple-.vgz" size="9243" crc="6dbbe3ff" sha1="603d5f9520c7873a1461561a6c5773130644edd6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="020" interface="vgm_quik">
+ <feature name="part_id" value="20 area x -arctic mines-.vgz" />
+ <dataarea name="quik" size="14519">
+ <rom name="20 area x -arctic mines-.vgz" size="14519" crc="e263b1ad" sha1="c7464ef8143ea6612f0635fb5e358576066a01fa" offset="0" />
+ </dataarea>
+ </part>
+ <part name="021" interface="vgm_quik">
+ <feature name="part_id" value="21 end demo i.vgz" />
+ <dataarea name="quik" size="40486">
+ <rom name="21 end demo i.vgz" size="40486" crc="4a01d1c1" sha1="6989f5234baaaa13b33e3f40a781e8cf319d314a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="022" interface="vgm_quik">
+ <feature name="part_id" value="22 end demo ii.vgz" />
+ <dataarea name="quik" size="27252">
+ <rom name="22 end demo ii.vgz" size="27252" crc="7c104051" sha1="74652f6c3171aac5d9ceca4730c90b2a3eaf5d08" offset="0" />
+ </dataarea>
+ </part>
+ <part name="023" interface="vgm_quik">
+ <feature name="part_id" value="23 good shop theme.vgz" />
+ <dataarea name="quik" size="25999">
+ <rom name="23 good shop theme.vgz" size="25999" crc="15029c5b" sha1="8e9441619756527520e31205d954fda5c49f412a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="024" interface="vgm_quik">
+ <feature name="part_id" value="24 neutral shop theme.vgz" />
+ <dataarea name="quik" size="18386">
+ <rom name="24 neutral shop theme.vgz" size="18386" crc="9f23de78" sha1="8ea890f2f38f873c590c759b1b948df66035a223" offset="0" />
+ </dataarea>
+ </part>
+ <part name="025" interface="vgm_quik">
+ <feature name="part_id" value="25 bad shop theme.vgz" />
+ <dataarea name="quik" size="9833">
+ <rom name="25 bad shop theme.vgz" size="9833" crc="c0ebc9d8" sha1="f0c847ecb74ab3f72e6040ed58b1927cd5bf09ee" offset="0" />
+ </dataarea>
+ </part>
+ <part name="026" interface="vgm_quik">
+ <feature name="part_id" value="26 game over theme.vgz" />
+ <dataarea name="quik" size="6521">
+ <rom name="26 game over theme.vgz" size="6521" crc="81e9441f" sha1="f03454d7b088c66587a78f29875d42da38729592" offset="0" />
+ </dataarea>
+ </part>
+ <part name="027" interface="vgm_quik">
+ <feature name="part_id" value="27 unused -release trailer-.vgz" />
+ <dataarea name="quik" size="14089">
+ <rom name="27 unused -release trailer-.vgz" size="14089" crc="06f13421" sha1="f911af27cabd77defa320e1dc7ac90abee25939c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="028" interface="vgm_quik">
+ <feature name="part_id" value="28 unused -deva walking theme-.vgz" />
+ <dataarea name="quik" size="886">
+ <rom name="28 unused -deva walking theme-.vgz" size="886" crc="cdf6daa3" sha1="c57560b25616636b1a3b1185033f83bf6244ae51" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="angelwar_msx2m">
+ <description>Angelic Warrior DEVA (MSX2, OPLL+OPL1)</description>
+ <year>2020</year>
+ <publisher>Team DEVA</publisher>
+ <info name="cores" value="MSX-MUSIC (YM2413), MSX-AUDIO (Y8950)"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 audio setup menu.vgz" />
+ <dataarea name="quik" size="35396">
+ <rom name="01 audio setup menu.vgz" size="35396" crc="3a1aaec8" sha1="2e47b9a78eff94926a9e88ee62d7eb425aa5a7d6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 title screen.vgz" />
+ <dataarea name="quik" size="15329">
+ <rom name="02 title screen.vgz" size="15329" crc="0b0bdabe" sha1="4d65b41eda13f126ae42b6714c65795c26a2a67f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 loading menu.vgz" />
+ <dataarea name="quik" size="4503">
+ <rom name="03 loading menu.vgz" size="4503" crc="ac0e2a97" sha1="299a09fbbdeaf1c102cb5aa2e8c2f61e378df33d" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 introduction demo i.vgz" />
+ <dataarea name="quik" size="15631">
+ <rom name="04 introduction demo i.vgz" size="15631" crc="09bd4f30" sha1="c85a9cd028b036d337b58df5aedeaef30f2d55bc" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 introduction demo ii.vgz" />
+ <dataarea name="quik" size="78368">
+ <rom name="05 introduction demo ii.vgz" size="78368" crc="f8fb17bf" sha1="5407464995356161874d1b9f5d27f576f1fd2243" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 introduction demo iii.vgz" />
+ <dataarea name="quik" size="10759">
+ <rom name="06 introduction demo iii.vgz" size="10759" crc="4477cea7" sha1="0c3ed1d3dbaf5ddd3b8aaa75ee56aa25707fc1b9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 area i -vr testing facility-.vgz" />
+ <dataarea name="quik" size="26825">
+ <rom name="07 area i -vr testing facility-.vgz" size="26825" crc="f92c362d" sha1="91543aa9803cb2088cb5dbd295f19658fcd5a8f7" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 boss theme.vgz" />
+ <dataarea name="quik" size="39833">
+ <rom name="08 boss theme.vgz" size="39833" crc="d76257f6" sha1="fc5404019cdda78f1d161dee26290df642ff254a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 level clear.vgz" />
+ <dataarea name="quik" size="5842">
+ <rom name="09 level clear.vgz" size="5842" crc="a8f6f841" sha1="d8c08b7d2dee3d2331053c2bb908eb022a73a3e3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 area ii -sky aquaducts-.vgz" />
+ <dataarea name="quik" size="61005">
+ <rom name="10 area ii -sky aquaducts-.vgz" size="61005" crc="6021fd2a" sha1="76632a9b580c010be76cb7002a084793b442e6c8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 area iii -geyser plains-.vgz" />
+ <dataarea name="quik" size="13832">
+ <rom name="11 area iii -geyser plains-.vgz" size="13832" crc="4357f126" sha1="5d2c767c9c33430aaae03aed70a7f1bf785ce836" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 area iv -plasma factory-.vgz" />
+ <dataarea name="quik" size="35189">
+ <rom name="12 area iv -plasma factory-.vgz" size="35189" crc="0a8e8460" sha1="37bf2d86c7624b5a6e8201038d9a9ad125960741" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 area v -lost space station-.vgz" />
+ <dataarea name="quik" size="23876">
+ <rom name="13 area v -lost space station-.vgz" size="23876" crc="3d6ad4ca" sha1="1eca69995ad78a9d6184b9c74bbaafb3f00d85af" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 area vi -temple of subramanya-.vgz" />
+ <dataarea name="quik" size="16859">
+ <rom name="14 area vi -temple of subramanya-.vgz" size="16859" crc="1a1a1b7b" sha1="aaef0c0311725a13f40de06d0f6c1c28b37a3e64" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 area vii -construction site-.vgz" />
+ <dataarea name="quik" size="59639">
+ <rom name="15 area vii -construction site-.vgz" size="59639" crc="8ed01d4b" sha1="f378161de3f13daa1bc4857349621e3de2c8349a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 area viii -death zone-.vgz" />
+ <dataarea name="quik" size="10539">
+ <rom name="16 area viii -death zone-.vgz" size="10539" crc="36083cb4" sha1="ddf64a4fffda02e2145d2c4dfb2df123be2ca8a8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 mid demo i.vgz" />
+ <dataarea name="quik" size="18681">
+ <rom name="17 mid demo i.vgz" size="18681" crc="9e93c5cd" sha1="f18623df83d8108654db698b4768b335f9880d26" offset="0" />
+ </dataarea>
+ </part>
+ <part name="018" interface="vgm_quik">
+ <feature name="part_id" value="18 mid demo ii.vgz" />
+ <dataarea name="quik" size="42169">
+ <rom name="18 mid demo ii.vgz" size="42169" crc="c7b0121e" sha1="1293ae385f7562e8d0ed8818902bda82ed4b88d2" offset="0" />
+ </dataarea>
+ </part>
+ <part name="019" interface="vgm_quik">
+ <feature name="part_id" value="19 area ix -amaravati temple-.vgz" />
+ <dataarea name="quik" size="15972">
+ <rom name="19 area ix -amaravati temple-.vgz" size="15972" crc="b964954e" sha1="5c85244233bcee838fb6e7f75654a4eb46c32255" offset="0" />
+ </dataarea>
+ </part>
+ <part name="020" interface="vgm_quik">
+ <feature name="part_id" value="20 area x -arctic mines-.vgz" />
+ <dataarea name="quik" size="25452">
+ <rom name="20 area x -arctic mines-.vgz" size="25452" crc="eaf2401d" sha1="bf00bcba4193ba961f5ecad245c1be2f4cb55c39" offset="0" />
+ </dataarea>
+ </part>
+ <part name="021" interface="vgm_quik">
+ <feature name="part_id" value="21 end demo i.vgz" />
+ <dataarea name="quik" size="64836">
+ <rom name="21 end demo i.vgz" size="64836" crc="d481c96d" sha1="99794e251b4952e01b3b1324c85256eac3f0e647" offset="0" />
+ </dataarea>
+ </part>
+ <part name="022" interface="vgm_quik">
+ <feature name="part_id" value="22 end demo ii.vgz" />
+ <dataarea name="quik" size="42718">
+ <rom name="22 end demo ii.vgz" size="42718" crc="a2ff08a9" sha1="65e1da13b355a79f94df690174e4cecb267769be" offset="0" />
+ </dataarea>
+ </part>
+ <part name="023" interface="vgm_quik">
+ <feature name="part_id" value="23 good shop theme.vgz" />
+ <dataarea name="quik" size="39584">
+ <rom name="23 good shop theme.vgz" size="39584" crc="2c994979" sha1="1f8407a6cd08a08155995abb39971e3b2b69c8da" offset="0" />
+ </dataarea>
+ </part>
+ <part name="024" interface="vgm_quik">
+ <feature name="part_id" value="24 neutral shop theme.vgz" />
+ <dataarea name="quik" size="29291">
+ <rom name="24 neutral shop theme.vgz" size="29291" crc="d68e53d0" sha1="1f8eb80092e759377ef6892b58fc82f61c8997c7" offset="0" />
+ </dataarea>
+ </part>
+ <part name="025" interface="vgm_quik">
+ <feature name="part_id" value="25 bad shop theme.vgz" />
+ <dataarea name="quik" size="16168">
+ <rom name="25 bad shop theme.vgz" size="16168" crc="43d8f07e" sha1="ae5bdcc8fe6a808f521681a3cd29c180af817c4a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="026" interface="vgm_quik">
+ <feature name="part_id" value="26 game over theme.vgz" />
+ <dataarea name="quik" size="11662">
+ <rom name="26 game over theme.vgz" size="11662" crc="10c92418" sha1="9a63139edd944e265ed922a9552580b711d3a0ac" offset="0" />
+ </dataarea>
+ </part>
+ <part name="027" interface="vgm_quik">
+ <feature name="part_id" value="27 unused -release trailer-.vgz" />
+ <dataarea name="quik" size="22937">
+ <rom name="27 unused -release trailer-.vgz" size="22937" crc="f17e13f8" sha1="fa86ddc4fcbbcf85cc5b8d20f7fb98993f7e5cc2" offset="0" />
+ </dataarea>
+ </part>
+ <part name="028" interface="vgm_quik">
+ <feature name="part_id" value="28 unused -deva walking theme-.vgz" />
+ <dataarea name="quik" size="2108">
+ <rom name="28 unused -deva walking theme-.vgz" size="2108" crc="4311f660" sha1="0f33e63fcc5a6c848814b183c04eaab1443d7998" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hayaosi2">
+ <description>Hayaoshi Quiz Grand Champion Taikai (Jaleco Mega System 32)</description>
+ <year>1994</year>
+ <publisher>Jaleco</publisher>
+ <info name="cores" value="YMF271"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 opening, mode explaination, demo, results.vgz" />
+ <dataarea name="quik" size="151749">
+ <rom name="01 opening, mode explaination, demo, results.vgz" size="151749" crc="d080796e" sha1="45c3a7a8fec26b1b5956ea608c1d211757b7c622" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 credit.vgz" />
+ <dataarea name="quik" size="2324">
+ <rom name="02 credit.vgz" size="2324" crc="ef54ccdb" sha1="f8be7a9f9afdae727654c21ebfd7cace6549ee0d" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 fanfare.vgz" />
+ <dataarea name="quik" size="89321">
+ <rom name="03 fanfare.vgz" size="89321" crc="7ecf61bc" sha1="a96d14996fbf4df1788d568193a088dc4353230a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 select 1.vgz" />
+ <dataarea name="quik" size="100097">
+ <rom name="04 select 1.vgz" size="100097" crc="105db362" sha1="8911d6074702bfe4fc11ad307f851ffa00ca4bd7" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 select 2.vgz" />
+ <dataarea name="quik" size="95775">
+ <rom name="05 select 2.vgz" size="95775" crc="b6f516ea" sha1="f7651980f3c8dea8ef64ec48a854cf8bd8583423" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 genre select.vgz" />
+ <dataarea name="quik" size="154499">
+ <rom name="06 genre select.vgz" size="154499" crc="c1d3dcdc" sha1="07d7432766f09bc8bf0c89d754ebaa7713c7a2cb" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 main game.vgz" />
+ <dataarea name="quik" size="167933">
+ <rom name="07 main game.vgz" size="167933" crc="b550a2e4" sha1="657ab1faf8b56ee657dd2a0b305ad16bfa5cc607" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 v.s. quiz king.vgz" />
+ <dataarea name="quik" size="135522">
+ <rom name="08 v.s. quiz king.vgz" size="135522" crc="ce235bf3" sha1="03b575dc5855e434f1821cf68ff4b8e47e53b8ba" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 ending.vgz" />
+ <dataarea name="quik" size="206207">
+ <rom name="09 ending.vgz" size="206207" crc="25c55907" sha1="67ab9903845c1e45dd0ec13109f9e20eea59f567" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 high score.vgz" />
+ <dataarea name="quik" size="167288">
+ <rom name="10 high score.vgz" size="167288" crc="2b2a579b" sha1="714acf8f10164386b1c690cebc8b261528cdad2d" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 game over 1.vgz" />
+ <dataarea name="quik" size="72732">
+ <rom name="11 game over 1.vgz" size="72732" crc="a6d7d3a4" sha1="fe92832359616ab5109eb66bfe297e3be0e92e79" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 game over 2.vgz" />
+ <dataarea name="quik" size="92451">
+ <rom name="12 game over 2.vgz" size="92451" crc="7518bf76" sha1="3cb452b3397c1cb69f5c243a1e7507a205a522f3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 time attack 1.vgz" />
+ <dataarea name="quik" size="167376">
+ <rom name="13 time attack 1.vgz" size="167376" crc="ee735056" sha1="1c21300d2d6040b36a3d8c5d3282f59a9c8f8cc6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 time attack 2.vgz" />
+ <dataarea name="quik" size="170258">
+ <rom name="14 time attack 2.vgz" size="170258" crc="8bc03116" sha1="ac8903de65ddad583a0dda599801c1824a825381" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 time attack 3.vgz" />
+ <dataarea name="quik" size="215081">
+ <rom name="15 time attack 3.vgz" size="215081" crc="3b47ee40" sha1="73aa8e832f52ecd5891a25c2d8113aefd41bcf42" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 time attack 4.vgz" />
+ <dataarea name="quik" size="220918">
+ <rom name="16 time attack 4.vgz" size="220918" crc="aba866f2" sha1="4ba113725f89346b55a11215fe76e05e8b293d60" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hayaosi3">
+ <description>Hayaoshi Quiz Nettou Namahousou (Jaleco Mega System 32)</description>
+ <year>1994</year>
+ <publisher>Jaleco</publisher>
+ <info name="cores" value="YMF271"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 timpani roll.vgz" />
+ <dataarea name="quik" size="9417">
+ <rom name="01 timpani roll.vgz" size="9417" crc="dfc4a4b2" sha1="6ff617bd873f9297b764d757dc8bbd4916dfb87e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 opening.vgz" />
+ <dataarea name="quik" size="202911">
+ <rom name="02 opening.vgz" size="202911" crc="77e013b1" sha1="b4a1ae312af729a1e3bb0c1eafccfaef26fb4d34" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 credit.vgz" />
+ <dataarea name="quik" size="2282">
+ <rom name="03 credit.vgz" size="2282" crc="bd573bba" sha1="7ad273f998cd36f38358fdd34ba8d5addb5fb592" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 genre select.vgz" />
+ <dataarea name="quik" size="100086">
+ <rom name="04 genre select.vgz" size="100086" crc="d7c0db44" sha1="0b4a1f7ddb7d6df3e09033f6c143bdd16c54fd77" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 normal game.vgz" />
+ <dataarea name="quik" size="167927">
+ <rom name="05 normal game.vgz" size="167927" crc="575722cf" sha1="66487521a6c63cff59af7efe9dad0557a8d9f56c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 fanfare.vgz" />
+ <dataarea name="quik" size="89311">
+ <rom name="06 fanfare.vgz" size="89311" crc="c71de9d4" sha1="06e64ad86435c9ecaadfb8b135b2577fc774251b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 travel slot ~ congratulations!.vgz" />
+ <dataarea name="quik" size="129134">
+ <rom name="07 travel slot ~ congratulations.vgz" size="129134" crc="4b2be870" sha1="17f763721f90fee4fd8f9c9e16217d863b56d61b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 sorry, no bonus.vgz" />
+ <dataarea name="quik" size="61215">
+ <rom name="08 sorry, no bonus.vgz" size="61215" crc="ace07ecf" sha1="0713a8c34dd8c9e035a8fc562f26c27448ce14f9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 king win.vgz" />
+ <dataarea name="quik" size="78245">
+ <rom name="09 king win.vgz" size="78245" crc="ad74ca78" sha1="b46bc35492ac3a4e7a85311925607a478c578d55" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 king appearance.vgz" />
+ <dataarea name="quik" size="64584">
+ <rom name="10 king appearance.vgz" size="64584" crc="b3c63839" sha1="b2bf423921af0de4476a8f8bd8a2d5c61e0877dc" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 v.s. quiz king.vgz" />
+ <dataarea name="quik" size="246896">
+ <rom name="11 v.s. quiz king.vgz" size="246896" crc="a59a4a75" sha1="dcce51a1196ab7de7f42218f82584fcbb0b9b63f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 ending theme.vgz" />
+ <dataarea name="quik" size="168292">
+ <rom name="12 ending theme.vgz" size="168292" crc="c8bb19ed" sha1="9d7557b61c653535fb45070718dcde0d9d3f3786" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 name entry.vgz" />
+ <dataarea name="quik" size="154830">
+ <rom name="13 name entry.vgz" size="154830" crc="64d06536" sha1="06dc1594e5d461c5d594bb426d83c842eeafd0ed" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 game over 1.vgz" />
+ <dataarea name="quik" size="72685">
+ <rom name="14 game over 1.vgz" size="72685" crc="44655c4f" sha1="87a81897d1b3bafcdad4b837bec80a5b4017c3ce" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 game over 2.vgz" />
+ <dataarea name="quik" size="92444">
+ <rom name="15 game over 2.vgz" size="92444" crc="1dfcf554" sha1="c961613072e036f3986a2831b5c9de1a86afa21a" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hayaosi1">
+ <description>Hayaoshi Quiz Ouza Ketteisen - The King Of Quiz (Jaleco Mega System 1-B)</description>
+ <year>1993</year>
+ <publisher>Jaleco</publisher>
+ <info name="cores" value="YM2151, OKIM6295"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 title &amp; demo.vgz" />
+ <dataarea name="quik" size="61966">
+ <rom name="01 title &amp; demo.vgz" size="61966" crc="d6686858" sha1="fbdb1016b13109cadcd65bcb699248e77ab7f5e5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 credit.vgz" />
+ <dataarea name="quik" size="5284">
+ <rom name="02 credit.vgz" size="5284" crc="7395e09e" sha1="4db0d098d160d9fd400410e9f239b1992c5e8818" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 select.vgz" />
+ <dataarea name="quik" size="72072">
+ <rom name="03 select.vgz" size="72072" crc="bf2b614f" sha1="fda02202151249880dd86c7f3c91adf01ca29315" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 main game.vgz" />
+ <dataarea name="quik" size="104153">
+ <rom name="04 main game.vgz" size="104153" crc="23e02df3" sha1="81d8dbb862541d3d10631e64ca7b1a936093c923" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 wait for the next week.vgz" />
+ <dataarea name="quik" size="53595">
+ <rom name="05 wait for the next week.vgz" size="53595" crc="a7f3ebcf" sha1="6b600aeebdf2790117f4fc55ef25acf9b779ae2b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 congratulations!.vgz" />
+ <dataarea name="quik" size="61138">
+ <rom name="06 congratulations.vgz" size="61138" crc="a70d0d80" sha1="ae03ed1ffb07ea6245403492b5868a7d8c36c9e6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 that's too bad.vgz" />
+ <dataarea name="quik" size="52347">
+ <rom name="07 that's too bad.vgz" size="52347" crc="e9b59db2" sha1="6a42c6080f07ccaa84a5339194b0150465967a35" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 continue.vgz" />
+ <dataarea name="quik" size="44293">
+ <rom name="08 continue.vgz" size="44293" crc="3a158030" sha1="e7bc5e4c6927b66e2134088d2b9fd9c4519929bb" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 advance to the next week!.vgz" />
+ <dataarea name="quik" size="53007">
+ <rom name="09 advance to the next week.vgz" size="53007" crc="800f8f90" sha1="7776dccfee40e5461235f741ae8addb9e8e1488a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 ending.vgz" />
+ <dataarea name="quik" size="75160">
+ <rom name="10 ending.vgz" size="75160" crc="f426c65f" sha1="8d3ae3e7912c6c3864b6043877517f1aa8ea07a9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 game over.vgz" />
+ <dataarea name="quik" size="64835">
+ <rom name="11 game over.vgz" size="64835" crc="fc78f353" sha1="c6d0ce17fc8e29d9c04a36bb42a5e0da4d0679b0" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 bgm 07.vgz" />
+ <dataarea name="quik" size="50372">
+ <rom name="12 bgm 07.vgz" size="50372" crc="3c8f1216" sha1="7f3a2ee4d7d2353c713258bcc79622f43198fa61" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="herzog_msx2">
+ <description>Herzog (MSX2, PSG)</description>
+ <year>1988</year>
+ <publisher>Tecno Soft</publisher>
+ <info name="cores" value="AY-3-8910"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 originate the strategy by yourself (opening 1).vgz" />
+ <dataarea name="quik" size="820">
+ <rom name="01 originate the strategy by yourself (opening 1).vgz" size="820" crc="2cd5c836" sha1="db0f9ab9bb31f90595c2151e8c36f7a645c0e934" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 a streak of lighting through the time (opening 2).vgz" />
+ <dataarea name="quik" size="5521">
+ <rom name="02 a streak of lighting through the time (opening 2).vgz" size="5521" crc="0f153985" sha1="56dfb45bd5883afc7a5d305c15a7d118c2cc5df6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 the previous war (scenario map 1).vgz" />
+ <dataarea name="quik" size="828">
+ <rom name="03 the previous war (scenario map 1).vgz" size="828" crc="b7189dfa" sha1="0ed778165729429efda4db8339ae03ee2189152f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 the fighter called 'emergency' to base (scenario map 2).vgz" />
+ <dataarea name="quik" size="989">
+ <rom name="04 the fighter called 'emergency' to base (scenario map 2).vgz" size="989" crc="709cefc2" sha1="66ce635fba266e93d38ed25bfd1c3689240315c1" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 back to square one (stage 1 vaxan).vgz" />
+ <dataarea name="quik" size="4021">
+ <rom name="05 back to square one (stage 1 vaxan).vgz" size="4021" crc="6b18b597" sha1="e5d83612dbd1c7848518381ca11de92c4eedb834" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 sleight of hand (stage 2 colna).vgz" />
+ <dataarea name="quik" size="5621">
+ <rom name="06 sleight of hand (stage 2 colna).vgz" size="5621" crc="f4ddf4f7" sha1="dfc8a049b08ec8844887e8293d998b4d86a62cff" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 take it easy (stage 3 senty, stage 9 rumerje).vgz" />
+ <dataarea name="quik" size="7603">
+ <rom name="07 take it easy (stage 3 senty, stage 9 rumerje).vgz" size="7603" crc="58dcadda" sha1="04a85770202d6907dd34ec388582fbaa6010b224" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 sniper (stage 4 astec, stage 8 lupars).vgz" />
+ <dataarea name="quik" size="8501">
+ <rom name="08 sniper (stage 4 astec, stage 8 lupars).vgz" size="8501" crc="b6898f39" sha1="f30d1fbf52b4d9c7665c4b24d1f71f4993fbade1" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 the super fighter invigorated us (stage 5 cabern, stage 7 dolmo).vgz" />
+ <dataarea name="quik" size="2859">
+ <rom name="09 the super fighter invigorated us (stage 5 cabern, stage 7 dolmo).vgz" size="2859" crc="2e877901" sha1="192d52900380fe3fd24a02ff9cf268920a162287" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 it was concurrent with the accident (stage 6 meld).vgz" />
+ <dataarea name="quik" size="3556">
+ <rom name="10 it was concurrent with the accident (stage 6 meld).vgz" size="3556" crc="f5c63a6c" sha1="6db9b379f6746e431e42adfc92ebb15fc51067d6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 the dawn of a new age (ending).vgz" />
+ <dataarea name="quik" size="1818">
+ <rom name="11 the dawn of a new age (ending).vgz" size="1818" crc="556bd7ac" sha1="126fcfb800b7692c90a132cb6e4c050373202a3f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 funeral march for the metal knights (game over).vgz" />
+ <dataarea name="quik" size="1549">
+ <rom name="12 funeral march for the metal knights (game over).vgz" size="1549" crc="08e41a4b" sha1="6bf978922d7cc4663f203b2d0c20eaf215345453" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 a victorious bell is ringing.vgz" />
+ <dataarea name="quik" size="1733">
+ <rom name="13 a victorious bell is ringing.vgz" size="1733" crc="f03d4d0d" sha1="7a1a222cfadfb1392afc9ecdf25c79d52c8c5c33" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moondrvr_msx2o">
+ <description>MoonDriver Demo (MSX2+)</description>
+ <year>2015</year>
+ <publisher>Boukichi, naruto</publisher>
+ <info name="cores" value="Moonsound (YMF278B)"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 opl3 demo 001.vgz" />
+ <dataarea name="quik" size="23541">
+ <rom name="01 opl3 demo 001.vgz" size="23541" crc="f076a6a9" sha1="0dff44fd9c240c0f0b0812e235c6dd7dbf99cad4" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 opl3 demo 002.vgz" />
+ <dataarea name="quik" size="17117">
+ <rom name="02 opl3 demo 002.vgz" size="17117" crc="b9f8737b" sha1="49f4baa6f45556f514c79055c8da8a5e81aabd27" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 opl3 demo 003.vgz" />
+ <dataarea name="quik" size="12847">
+ <rom name="03 opl3 demo 003.vgz" size="12847" crc="3054684c" sha1="86c4001bd8ea839308a895898f4c08f872a9eaf3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 opl3 demo 004.vgz" />
+ <dataarea name="quik" size="12862">
+ <rom name="04 opl3 demo 004.vgz" size="12862" crc="2af85d15" sha1="bd42519390c85444bf87c64948e177179faf4738" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 encounter the unknown environment.vgz" />
+ <dataarea name="quik" size="89895">
+ <rom name="05 encounter the unknown environment.vgz" size="89895" crc="5dd8d368" sha1="87835aa7891d4ea997dce3e7b5a89cb1b09255ec" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 time's up!.vgz" />
+ <dataarea name="quik" size="150140">
+ <rom name="06 time's up.vgz" size="150140" crc="530712db" sha1="44a18b2ed0f7e12273522e8f9b9f943706cd3a23" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ooparts">
+ <description>Ooparts (Sega System C-2)</description>
+ <year>1992</year>
+ <publisher>Sega</publisher>
+ <info name="cores" value="YM3438, SEGA PSG"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 title.vgz" />
+ <dataarea name="quik" size="14087">
+ <rom name="01 title.vgz" size="14087" crc="a6e6ff01" sha1="f7df1cc1d6fb07de432e5707381555d7ab2e0f27" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 credit.vgz" />
+ <dataarea name="quik" size="657">
+ <rom name="02 credit.vgz" size="657" crc="72917b82" sha1="ce3d7644edb3ec9d1af26811678788c787765db0" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 stage select 1.vgz" />
+ <dataarea name="quik" size="13732">
+ <rom name="03 stage select 1.vgz" size="13732" crc="b732b9d1" sha1="078f5a6d2363fa8c22a6f50eff2d8c6190b0dfb0" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 moon stage 1.vgz" />
+ <dataarea name="quik" size="26396">
+ <rom name="04 moon stage 1.vgz" size="26396" crc="514e9c42" sha1="998a98d415e4105f8147df376dc21a523711eb59" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 stage clear.vgz" />
+ <dataarea name="quik" size="4239">
+ <rom name="05 stage clear.vgz" size="4239" crc="8066d8ab" sha1="80069ad3e841e90ed6aaeb7ac001c88928076faf" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 moon stage 2.vgz" />
+ <dataarea name="quik" size="22074">
+ <rom name="06 moon stage 2.vgz" size="22074" crc="2b57504e" sha1="ffae0a7bc87e59d83ecb1a9ac72ce68a0d661b0e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 world clear.vgz" />
+ <dataarea name="quik" size="4934">
+ <rom name="07 world clear.vgz" size="4934" crc="f27e5e2a" sha1="61070f8dd9c3a4c31fd39d75e7560fa91bac0404" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 stage select 2.vgz" />
+ <dataarea name="quik" size="283827">
+ <rom name="08 stage select 2.vgz" size="283827" crc="16ab7b9e" sha1="118b2a3f4b6df5c8ac58acda3f5994b71d6d2b87" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 mercury stage 1.vgz" />
+ <dataarea name="quik" size="32575">
+ <rom name="09 mercury stage 1.vgz" size="32575" crc="143a4d5f" sha1="6d420704a42c6cba314124af377bb078a2990bb6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 mercury stage 2.vgz" />
+ <dataarea name="quik" size="50934">
+ <rom name="10 mercury stage 2.vgz" size="50934" crc="04fcd1b6" sha1="6cdf674f4481ee119b8a9e3f087d54ea06a9f89a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 venus stage 1.vgz" />
+ <dataarea name="quik" size="28332">
+ <rom name="11 venus stage 1.vgz" size="28332" crc="6d017040" sha1="601eb0b5ba61d74cacf0b5aba7f67192e526c130" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 venus stage 2.vgz" />
+ <dataarea name="quik" size="68252">
+ <rom name="12 venus stage 2.vgz" size="68252" crc="73959504" sha1="6275cb17ff2b2462a9f36cc792ae3e4731afed05" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 mars stage 1.vgz" />
+ <dataarea name="quik" size="32796">
+ <rom name="13 mars stage 1.vgz" size="32796" crc="584a2aa8" sha1="bd0d26e279058836d85b7a17c598c7856594e625" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 mars stage 2.vgz" />
+ <dataarea name="quik" size="46087">
+ <rom name="14 mars stage 2.vgz" size="46087" crc="6141274d" sha1="03607a6b54ddda244182f3e964f4ad2a19a955f3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 saturn stage 1.vgz" />
+ <dataarea name="quik" size="40837">
+ <rom name="15 saturn stage 1.vgz" size="40837" crc="a8bec04e" sha1="69010249704febdb6cfde60819dd3d48cb867c06" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 saturn stage 2.vgz" />
+ <dataarea name="quik" size="78130">
+ <rom name="16 saturn stage 2.vgz" size="78130" crc="8eac4101" sha1="5ed7eb9049fb52bfca3b9cafa6927798601bef3b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 jupiter stage 1.vgz" />
+ <dataarea name="quik" size="51209">
+ <rom name="17 jupiter stage 1.vgz" size="51209" crc="84ca52ca" sha1="ddf22a0991e4c7487b7f88189855bb5a2b9af550" offset="0" />
+ </dataarea>
+ </part>
+ <part name="018" interface="vgm_quik">
+ <feature name="part_id" value="18 jupiter stage 2.vgz" />
+ <dataarea name="quik" size="27397">
+ <rom name="18 jupiter stage 2.vgz" size="27397" crc="867d281e" sha1="1114f44094302329cd39440c287da739a8a54437" offset="0" />
+ </dataarea>
+ </part>
+ <part name="019" interface="vgm_quik">
+ <feature name="part_id" value="19 prominence, boss.vgz" />
+ <dataarea name="quik" size="35244">
+ <rom name="19 prominence, boss.vgz" size="35244" crc="024ff074" sha1="9d4d1ba319a4a2dcefba7926629c4c3dad63e37d" offset="0" />
+ </dataarea>
+ </part>
+ <part name="020" interface="vgm_quik">
+ <feature name="part_id" value="20 final stage.vgz" />
+ <dataarea name="quik" size="81329">
+ <rom name="20 final stage.vgz" size="81329" crc="94ac5577" sha1="12d90d0c64332d67bb38a46260cd44c1ed0590e1" offset="0" />
+ </dataarea>
+ </part>
+ <part name="021" interface="vgm_quik">
+ <feature name="part_id" value="21 ending.vgz" />
+ <dataarea name="quik" size="60682">
+ <rom name="21 ending.vgz" size="60682" crc="eb935bde" sha1="8ed7535e9c4718f66db794651bdc464d3e9547be" offset="0" />
+ </dataarea>
+ </part>
+ <part name="022" interface="vgm_quik">
+ <feature name="part_id" value="22 ranking.vgz" />
+ <dataarea name="quik" size="6635">
+ <rom name="22 ranking.vgz" size="6635" crc="49f1e0f2" sha1="ded09eb954ae2614e9bd9bfb2729953505f7f3b5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="023" interface="vgm_quik">
+ <feature name="part_id" value="23 game over.vgz" />
+ <dataarea name="quik" size="2791">
+ <rom name="23 game over.vgz" size="2791" crc="0dabbb05" sha1="dd42344f732adcaf70c6f4fb13b142e69fe2e64b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="024" interface="vgm_quik">
+ <feature name="part_id" value="24 unknown bgm 1.vgz" />
+ <dataarea name="quik" size="20271">
+ <rom name="24 unknown bgm 1.vgz" size="20271" crc="80283aa7" sha1="9ad62a1d8d8f6a61b17dc32fe54cc9cc76ca2300" offset="0" />
+ </dataarea>
+ </part>
+ <part name="025" interface="vgm_quik">
+ <feature name="part_id" value="25 unknown bgm 2.vgz" />
+ <dataarea name="quik" size="48803">
+ <rom name="25 unknown bgm 2.vgz" size="48803" crc="bac54d1b" sha1="d5bae91928f69515de66be15b8a3be4349a4a4b8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="026" interface="vgm_quik">
+ <feature name="part_id" value="26 unknown bgm 3.vgz" />
+ <dataarea name="quik" size="183725">
+ <rom name="26 unknown bgm 3.vgz" size="183725" crc="4ac8e1de" sha1="3dddf6dd4d846bf916bdcf9006fbc37d616e52f5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="027" interface="vgm_quik">
+ <feature name="part_id" value="27 unknown bgm 4.vgz" />
+ <dataarea name="quik" size="45468">
+ <rom name="27 unknown bgm 4.vgz" size="45468" crc="2b8aea27" sha1="f04811e88e97e702fa22d9439aa5d835147efcc6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="028" interface="vgm_quik">
+ <feature name="part_id" value="28 unknown bgm 4 (alt).vgz" />
+ <dataarea name="quik" size="49058">
+ <rom name="28 unknown bgm 4 (alt).vgz" size="49058" crc="dea86df2" sha1="bd265c03402629545d0b2ee4cc7a822e1e5204eb" offset="0" />
+ </dataarea>
+ </part>
+ <part name="029" interface="vgm_quik">
+ <feature name="part_id" value="29 jingle 1.vgz" />
+ <dataarea name="quik" size="1167">
+ <rom name="29 jingle 1.vgz" size="1167" crc="a795995c" sha1="4eae216e50de7a077012f65f2e379a9961bf3b93" offset="0" />
+ </dataarea>
+ </part>
+ <part name="030" interface="vgm_quik">
+ <feature name="part_id" value="30 jingle 2.vgz" />
+ <dataarea name="quik" size="1333">
+ <rom name="30 jingle 2.vgz" size="1333" crc="3869b0f7" sha1="1a5225f13e21bcb0dc69162b04712af90e3fce98" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rodland">
+ <description>Rod Land (Jaleco Mega System 1)</description>
+ <year>1990</year>
+ <publisher>Jaleco Ltd.</publisher>
+ <info name="cores" value="YM2151, OKIM6295"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 demonstration.vgz" />
+ <dataarea name="quik" size="1802">
+ <rom name="01 demonstration.vgz" size="1802" crc="227fb7c7" sha1="4720895ffac9d14c6b6103fe0d050f1534bfe3b8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 coin.vgz" />
+ <dataarea name="quik" size="1334">
+ <rom name="02 coin.vgz" size="1334" crc="1c5a88fb" sha1="75d451e35fc1200924a80c889501764afad58232" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 chapter 1 - opening 1.vgz" />
+ <dataarea name="quik" size="45556">
+ <rom name="03 chapter 1 - opening 1.vgz" size="45556" crc="4d02ca87" sha1="875b1d8d9dd276475116d2297f05f91b5f40d6db" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 chapter 1 - opening 2.vgz" />
+ <dataarea name="quik" size="61714">
+ <rom name="04 chapter 1 - opening 2.vgz" size="61714" crc="c4eab21a" sha1="f0c32d688b3f7f9f4f70b0fd0063219494209c3e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 scene of the forest ~morning has come to the forest~.vgz" />
+ <dataarea name="quik" size="5027">
+ <rom name="05 scene of the forest ~morning has come to the forest~.vgz" size="5027" crc="8168c792" sha1="588afdd8b27b0abbceca0fa8646ceb6402c5f3a6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 chapter 1 - song 1 ~let's sing cheerfully~.vgz" />
+ <dataarea name="quik" size="48934">
+ <rom name="06 chapter 1 - song 1 ~let's sing cheerfully~.vgz" size="48934" crc="dbc5cdf5" sha1="42eb59fdd33a341395b9dce23b677af22f1381f0" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 chapter 1 - interval 1.vgz" />
+ <dataarea name="quik" size="2628">
+ <rom name="07 chapter 1 - interval 1.vgz" size="2628" crc="961fe969" sha1="5ad585565a501f1e664dce91c320b84703344732" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 chapter 1 - song 2 ~duet of birds~.vgz" />
+ <dataarea name="quik" size="4710">
+ <rom name="08 chapter 1 - song 2 ~duet of birds~.vgz" size="4710" crc="84f0a88c" sha1="50fe950287c44a50b73b1f037f076fa57582e2f1" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 extra game.vgz" />
+ <dataarea name="quik" size="2878">
+ <rom name="09 extra game.vgz" size="2878" crc="208feddf" sha1="135e3cd28e4c589f8d8be7eec54b329b09b0af21" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 when i'm encouraged.vgz" />
+ <dataarea name="quik" size="1365">
+ <rom name="10 when i'm encouraged.vgz" size="1365" crc="2050b74d" sha1="43917f08bb4fc3238bb57c485eb4a33acc278261" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 chapter 1 - song 3 ~dance on maple leaf~.vgz" />
+ <dataarea name="quik" size="5516">
+ <rom name="11 chapter 1 - song 3 ~dance on maple leaf~.vgz" size="5516" crc="9c61db20" sha1="6efb2a9a74586da1a6bbbc1ca2a9f2b033faa076" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 chapter 1 - interval 2.vgz" />
+ <dataarea name="quik" size="91794">
+ <rom name="12 chapter 1 - interval 2.vgz" size="91794" crc="fcd182ca" sha1="e645b74577b74a59a7ef01ee1271ec841f904c8e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 theme of boss 1.vgz" />
+ <dataarea name="quik" size="69719">
+ <rom name="13 theme of boss 1.vgz" size="69719" crc="db539608" sha1="945a5263fef932fdba480b6f78ff962f1c92aa8a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 chapter 1 - ending.vgz" />
+ <dataarea name="quik" size="2438">
+ <rom name="14 chapter 1 - ending.vgz" size="2438" crc="496dda42" sha1="7b4edc8da44dc408869286aa4e2d9182c42b1708" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 chapter 2 - song 1 ~what the auster encountered~.vgz" />
+ <dataarea name="quik" size="40097">
+ <rom name="15 chapter 2 - song 1 ~what the auster encountered~.vgz" size="40097" crc="555a9a4c" sha1="cd237edf4b7d5fee85b2c5b77f52770b9d4b5980" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 chapter 2 - interval (unused).vgz" />
+ <dataarea name="quik" size="2906">
+ <rom name="16 chapter 2 - interval (unused).vgz" size="2906" crc="c7029480" sha1="2abe8a03adf4fb13496e1a44b4cacc1601dab43f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 chapter 2 - song 2 ~waltz of the ants~.vgz" />
+ <dataarea name="quik" size="4248">
+ <rom name="17 chapter 2 - song 2 ~waltz of the ants~.vgz" size="4248" crc="bb48091e" sha1="f376963c413a6494302ff03f7426c8193da8c25c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="018" interface="vgm_quik">
+ <feature name="part_id" value="18 chapter 2 - interval.vgz" />
+ <dataarea name="quik" size="28407">
+ <rom name="18 chapter 2 - interval.vgz" size="28407" crc="dbcafd07" sha1="37e1c29c836b57675b0a1ffb1c575fa2310f53b7" offset="0" />
+ </dataarea>
+ </part>
+ <part name="019" interface="vgm_quik">
+ <feature name="part_id" value="19 chapter 2 - song 3 ~march~.vgz" />
+ <dataarea name="quik" size="54146">
+ <rom name="19 chapter 2 - song 3 ~march~.vgz" size="54146" crc="67d76b47" sha1="dde7ec86c740ae0a511546442ad59a69c5c3445c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="020" interface="vgm_quik">
+ <feature name="part_id" value="20 theme of boss 2.vgz" />
+ <dataarea name="quik" size="90072">
+ <rom name="20 theme of boss 2.vgz" size="90072" crc="3b160aa6" sha1="7c3fe17be1814b41c85006424092dc44dbdea0ad" offset="0" />
+ </dataarea>
+ </part>
+ <part name="021" interface="vgm_quik">
+ <feature name="part_id" value="21 chapter 2 - ending.vgz" />
+ <dataarea name="quik" size="110225">
+ <rom name="21 chapter 2 - ending.vgz" size="110225" crc="6baf42e1" sha1="fce1404b2f26133389c0482635847c49fbb430a3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="022" interface="vgm_quik">
+ <feature name="part_id" value="22 theme of boss 3.vgz" />
+ <dataarea name="quik" size="30823">
+ <rom name="22 theme of boss 3.vgz" size="30823" crc="b7d5b1df" sha1="f6990e0bc225ac90fc9e8e02e6b9d8410cab73e5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="023" interface="vgm_quik">
+ <feature name="part_id" value="23 staff roll ~harmonica of peace~.vgz" />
+ <dataarea name="quik" size="105353">
+ <rom name="23 staff roll ~harmonica of peace~.vgz" size="105353" crc="fbce0cbe" sha1="8f580388cd09204ed341501a97d1a820fdc8b2e6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="024" interface="vgm_quik">
+ <feature name="part_id" value="24 when i'm discouraged (unused).vgz" />
+ <dataarea name="quik" size="2800">
+ <rom name="24 when i'm discouraged (unused).vgz" size="2800" crc="9eef0db4" sha1="6db95e7a14271f505426615f9c56062b14008705" offset="0" />
+ </dataarea>
+ </part>
+ <part name="025" interface="vgm_quik">
+ <feature name="part_id" value="25 continue.vgz" />
+ <dataarea name="quik" size="15695">
+ <rom name="25 continue.vgz" size="15695" crc="c0a13119" sha1="9bee683c99de08ba58ab02e245935bcb9ee3979d" offset="0" />
+ </dataarea>
+ </part>
+ <part name="026" interface="vgm_quik">
+ <feature name="part_id" value="26 game over.vgz" />
+ <dataarea name="quik" size="1663">
+ <rom name="26 game over.vgz" size="1663" crc="d0950648" sha1="1e9470048fbea1756fe790471785985ac652d2c2" offset="0" />
+ </dataarea>
+ </part>
+ <part name="027" interface="vgm_quik">
+ <feature name="part_id" value="27 name entry ~memory of the old flautist~.vgz" />
+ <dataarea name="quik" size="3229">
+ <rom name="27 name entry ~memory of the old flautist~.vgz" size="3229" crc="eafa8a90" sha1="da44c4498dd2cb3856f238969c48b2aadec82f12" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="smurfnig_gbc">
+ <description>The Smurfs' Nightmare (Nintendo Game Boy Color)</description>
+ <year>1999</year>
+ <publisher>Infogrames</publisher>
+ <info name="cores" value="Game Boy DMG (LR35902)"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 main menu (the smurfs theme).vgz" />
+ <dataarea name="quik" size="14279">
+ <rom name="01 main menu (the smurfs theme).vgz" size="14279" crc="bc0b74b9" sha1="2d176a7f29351d98ed27344655a33a23700ae389" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 village walk (stage select).vgz" />
+ <dataarea name="quik" size="7220">
+ <rom name="02 village walk (stage select).vgz" size="7220" crc="a58e3154" sha1="d266de01fd0bfa8151434f1a2c48aedd1de7b1d8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 let's go! (stage start).vgz" />
+ <dataarea name="quik" size="854">
+ <rom name="03 let's go (stage start).vgz" size="854" crc="85c8bb17" sha1="7d24a9f9ac806bf22aa7c067487d5030ae46903b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 funny funny (the kitchen of danger).vgz" />
+ <dataarea name="quik" size="10551">
+ <rom name="04 funny funny (the kitchen of danger).vgz" size="10551" crc="6f7b03a5" sha1="7c3e02d61a59e9fd327d79df0cc4d9e6f0993b02" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 rabbit race.vgz" />
+ <dataarea name="quik" size="12253">
+ <rom name="05 rabbit race.vgz" size="12253" crc="c2549386" sha1="3944a601b5eaf6bc9b84ab8929ab70332471706c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 hidden around (the library of fear).vgz" />
+ <dataarea name="quik" size="8609">
+ <rom name="06 hidden around (the library of fear).vgz" size="8609" crc="e2e2e94e" sha1="66a302f9f24c42a288f94a168a357c8f93ec2187" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 aqua (the bottomless well).vgz" />
+ <dataarea name="quik" size="20188">
+ <rom name="07 aqua (the bottomless well).vgz" size="20188" crc="f278e9c8" sha1="f15668c89b93e7bb33530be1a1d882d1fe8c42ac" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 another world (the mysterious planet).vgz" />
+ <dataarea name="quik" size="20860">
+ <rom name="08 another world (the mysterious planet).vgz" size="20860" crc="c35c637a" sha1="f1c337a226d0d1006da36d824a80811acc7c1f52" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 the flood wave.vgz" />
+ <dataarea name="quik" size="5515">
+ <rom name="09 the flood wave.vgz" size="5515" crc="2c561d72" sha1="a97302b327fc386b2ecf32765edca7996cc0466f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 enchanted (the haunted manor).vgz" />
+ <dataarea name="quik" size="10168">
+ <rom name="10 enchanted (the haunted manor).vgz" size="10168" crc="baaac1b2" sha1="c8a2d6f54e6fbb8fc480e6c1b38200d5a35a0680" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 the workshop (the workbench gone mad).vgz" />
+ <dataarea name="quik" size="8263">
+ <rom name="11 the workshop (the workbench gone mad).vgz" size="8263" crc="36613924" sha1="b7093b9c404bbc4d53b4847c2f6667e8be3d3ae9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 run! (the mole's burrow).vgz" />
+ <dataarea name="quik" size="7192">
+ <rom name="12 run (the mole's burrow).vgz" size="7192" crc="467c2344" sha1="093160380d98102cbd0b571d78fdedf06bfd48fd" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 strange rhythm (the laboratory of fear).vgz" />
+ <dataarea name="quik" size="11529">
+ <rom name="13 strange rhythm (the laboratory of fear).vgz" size="11529" crc="96114ff1" sha1="2ea7d73f9b52a5a8990fef6826ca684c12cc7793" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 bonus time! (bonus stages).vgz" />
+ <dataarea name="quik" size="3167">
+ <rom name="14 bonus time (bonus stages).vgz" size="3167" crc="6e407cc0" sha1="c0a392bbbcb668edd2dded9144fc5a6957df6c72" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 all right! (stage clear).vgz" />
+ <dataarea name="quik" size="2007">
+ <rom name="15 all right (stage clear).vgz" size="2007" crc="5ac59aaf" sha1="a33b11c682e0f1f8eca41c48e51755a497885ab5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 too bad! (lose life).vgz" />
+ <dataarea name="quik" size="1162">
+ <rom name="16 too bad (lose life).vgz" size="1162" crc="7ad18165" sha1="5065bac8b62bb15a6a3f8b4a74d7d06b2f6acbf6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 game over.vgz" />
+ <dataarea name="quik" size="4819">
+ <rom name="17 game over.vgz" size="4819" crc="b8947606" sha1="cbd9fb8f8d531f218b735d2e09a34b5b833be631" offset="0" />
+ </dataarea>
+ </part>
+ <part name="018" interface="vgm_quik">
+ <feature name="part_id" value="18 freedom (ending ~ staff roll).vgz" />
+ <dataarea name="quik" size="15206">
+ <rom name="18 freedom (ending ~ staff roll).vgz" size="15206" crc="59271a71" sha1="7f2e342d3c881a3c026e4f21ec64e7e981cc9762" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="smurfs_gb">
+ <description>The Smurfs (Nintendo Game Boy)</description>
+ <year>1994</year>
+ <publisher>Infogrames</publisher>
+ <info name="cores" value="Game Boy DMG (LR35902)"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 intro (part 1) ~ game over.vgz" />
+ <dataarea name="quik" size="9233">
+ <rom name="01 intro (part 1) ~ game over.vgz" size="9233" crc="2b0574ed" sha1="658ee2e88b3c31399b829a051b0819ad4e1f1ce3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 intro (part 2) ~ victory.vgz" />
+ <dataarea name="quik" size="4767">
+ <rom name="02 intro (part 2) ~ victory.vgz" size="4767" crc="9d0faf8c" sha1="13bd33fdecb98891d1e456d3cc4c761596dcf16f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 title screen.vgz" />
+ <dataarea name="quik" size="21784">
+ <rom name="03 title screen.vgz" size="21784" crc="7be36f7d" sha1="303f2287b0838dc2c7497dc105b90ded37e5f1a3" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 act start.vgz" />
+ <dataarea name="quik" size="735">
+ <rom name="04 act start.vgz" size="735" crc="5b06bdd6" sha1="d23fd977b8f9aa85fdcf12b8e688836f8fde54c7" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 the forest ~ the cliff.vgz" />
+ <dataarea name="quik" size="22429">
+ <rom name="05 the forest ~ the cliff.vgz" size="22429" crc="cf80f2c3" sha1="44490bf72f1e6535aaec7bd2685cf053dacabb50" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 the river smurf.vgz" />
+ <dataarea name="quik" size="11053">
+ <rom name="06 the river smurf.vgz" size="11053" crc="c5829bf0" sha1="c9980cfd760cfab5857f11b41543ae8e052650ec" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 the bridge.vgz" />
+ <dataarea name="quik" size="11816">
+ <rom name="07 the bridge.vgz" size="11816" crc="a00d5dc4" sha1="712920c7decf6383e1cd2f9537de199aaf4ac13e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 the sarsaparilla fields.vgz" />
+ <dataarea name="quik" size="9802">
+ <rom name="08 the sarsaparilla fields.vgz" size="9802" crc="2f56ee30" sha1="aa0d234f4cd3f6117ab23bdc0011cf38fe1233de" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 the mountains.vgz" />
+ <dataarea name="quik" size="15047">
+ <rom name="09 the mountains.vgz" size="15047" crc="d2530aaa" sha1="554c84e71b19769a757c59e77a6fdbeb7d4ee2c5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 the flight on a stork.vgz" />
+ <dataarea name="quik" size="6173">
+ <rom name="10 the flight on a stork.vgz" size="6173" crc="8aae2add" sha1="a53ff2518939c31dcf1732c9a154881c50015f24" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 the old gold mine.vgz" />
+ <dataarea name="quik" size="9468">
+ <rom name="11 the old gold mine.vgz" size="9468" crc="0f174067" sha1="71d2fc87e6ebb38fa25168942d9ff516e1a85cfe" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 inside the volcano.vgz" />
+ <dataarea name="quik" size="25471">
+ <rom name="12 inside the volcano.vgz" size="25471" crc="41aaf58b" sha1="0dc86671ee19b659d939b95ea2fd5ddc84255f42" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 the sledge race.vgz" />
+ <dataarea name="quik" size="6072">
+ <rom name="13 the sledge race.vgz" size="6072" crc="5eea9f24" sha1="d9eb933fc687021c108cdebc732553ce02349ffb" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 the swamps ~ gargamel's manor house.vgz" />
+ <dataarea name="quik" size="27739">
+ <rom name="14 the swamps ~ gargamel's manor house.vgz" size="27739" crc="8093134f" sha1="7474d7aff7bec0618124748680e4eafccb1a7bda" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 bonus stages.vgz" />
+ <dataarea name="quik" size="4383">
+ <rom name="15 bonus stages.vgz" size="4383" crc="27de8c17" sha1="f6cb3812bc846e805e69b2faa7d0e67a5298a2fe" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 boss battle.vgz" />
+ <dataarea name="quik" size="2531">
+ <rom name="16 boss battle.vgz" size="2531" crc="b22a6805" sha1="d4845605af24601545db7efc225355827c038377" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 gargamel.vgz" />
+ <dataarea name="quik" size="16671">
+ <rom name="17 gargamel.vgz" size="16671" crc="efe95559" sha1="ac37cd8f95d5d739aee642440026ef34892777b5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="018" interface="vgm_quik">
+ <feature name="part_id" value="18 death.vgz" />
+ <dataarea name="quik" size="1164">
+ <rom name="18 death.vgz" size="1164" crc="015a2fc1" sha1="c7eccea58a084a2e17ce7125841fc9d03d3e0cee" offset="0" />
+ </dataarea>
+ </part>
+ <part name="019" interface="vgm_quik">
+ <feature name="part_id" value="19 ending ~ staff roll.vgz" />
+ <dataarea name="quik" size="5765">
+ <rom name="19 ending ~ staff roll.vgz" size="5765" crc="04d1ff69" sha1="02b70d2c62f5cde614310e6a824b3ed5e9bc78fc" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="turrican_st">
+ <description>Turrican (Atari ST)</description>
+ <year>1990</year>
+ <publisher>Rainbow Arts</publisher>
+ <info name="cores" value="YM2149"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 welcome.vgz" />
+ <dataarea name="quik" size="56528">
+ <rom name="01 welcome.vgz" size="56528" crc="dfa640ea" sha1="9e97ed618570c6a04743c1c3c01d6b7ea9ae09ff" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 shoot or die.vgz" />
+ <dataarea name="quik" size="4251694">
+ <rom name="02 shoot or die.vgz" size="4251694" crc="128bf3cc" sha1="891a47ad9470bf4bc79f6b209a591f7515171e1f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 loader.vgz" />
+ <dataarea name="quik" size="4666">
+ <rom name="03 loader.vgz" size="4666" crc="4116ab6f" sha1="a08384e50af680577a9225455865f9acd7959ba7" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 mountain madness.vgz" />
+ <dataarea name="quik" size="15254">
+ <rom name="04 mountain madness.vgz" size="15254" crc="cc7a0735" sha1="8d3e1a22c899c4c610e0a67f37a5340a90667a97" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 level complete 1.vgz" />
+ <dataarea name="quik" size="713">
+ <rom name="05 level complete 1.vgz" size="713" crc="4b29919e" sha1="ad803fb0f3994418d92b5829c90afbbe639f38d8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 thunder plains.vgz" />
+ <dataarea name="quik" size="38806">
+ <rom name="06 thunder plains.vgz" size="38806" crc="4cbcac3c" sha1="f829d9606bfd9789caa95cd853deed59ec0fd53a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 fistful of steel.vgz" />
+ <dataarea name="quik" size="9290">
+ <rom name="07 fistful of steel.vgz" size="9290" crc="b202f387" sha1="a947ff3fae756b89f4a6ff6d6243c58b26e43d05" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 outpost.vgz" />
+ <dataarea name="quik" size="33193">
+ <rom name="08 outpost.vgz" size="33193" crc="0b08c544" sha1="96393cfc5bef81333b4505973681f3a461e1c6a6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 enemy mine.vgz" />
+ <dataarea name="quik" size="12495">
+ <rom name="09 enemy mine.vgz" size="12495" crc="8d5525d3" sha1="92b89b3b308eae31e99eb983c0a40e232948f0e4" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 piranha.vgz" />
+ <dataarea name="quik" size="1671">
+ <rom name="10 piranha.vgz" size="1671" crc="bc9cd46d" sha1="7e4125e42aad2560970739b160ce443634b139b6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 level complete 2.vgz" />
+ <dataarea name="quik" size="771">
+ <rom name="11 level complete 2.vgz" size="771" crc="a4bdf3f0" sha1="b31047e375e0aa8838b72b57b2304ee3974924c1" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 techno dungeon.vgz" />
+ <dataarea name="quik" size="18258">
+ <rom name="12 techno dungeon.vgz" size="18258" crc="094a4012" sha1="5c30ef5a8386b33d727577b93bb5a0179da9e84c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 jet pack attack.vgz" />
+ <dataarea name="quik" size="13868">
+ <rom name="13 jet pack attack.vgz" size="13868" crc="8dc4656f" sha1="e89645721c9da2c4d2bcd91828699a39c5761aff" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 level complete 3.vgz" />
+ <dataarea name="quik" size="1142">
+ <rom name="14 level complete 3.vgz" size="1142" crc="d9871dbf" sha1="157c9106858077e61c6a37ad3fd1b614f6d7952a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 base invader.vgz" />
+ <dataarea name="quik" size="30067">
+ <rom name="15 base invader.vgz" size="30067" crc="8608e8a2" sha1="05c9dec6b8de5742c6e6d15a112f74cda84e0a38" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 flightmare.vgz" />
+ <dataarea name="quik" size="24515">
+ <rom name="16 flightmare.vgz" size="24515" crc="c67d2b8c" sha1="58b1ca1e9a3356fc21e388fffee070ba502bff34" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 tower of morgul.vgz" />
+ <dataarea name="quik" size="32758">
+ <rom name="17 tower of morgul.vgz" size="32758" crc="bc451479" sha1="a45891d4b182f1d52a43a51f6e8a0aead94ae1d0" offset="0" />
+ </dataarea>
+ </part>
+ <part name="018" interface="vgm_quik">
+ <feature name="part_id" value="18 level complete 5.vgz" />
+ <dataarea name="quik" size="788">
+ <rom name="18 level complete 5.vgz" size="788" crc="dfb2a425" sha1="9efb311f05ded8df894b726e4498735f7d2d5c99" offset="0" />
+ </dataarea>
+ </part>
+ <part name="019" interface="vgm_quik">
+ <feature name="part_id" value="19 pathfinder.vgz" />
+ <dataarea name="quik" size="23263">
+ <rom name="19 pathfinder.vgz" size="23263" crc="720993bf" sha1="f2f3715c0b88507821dc5c06f03b7e6df3a1f80d" offset="0" />
+ </dataarea>
+ </part>
+ <part name="020" interface="vgm_quik">
+ <feature name="part_id" value="20 faces of terror.vgz" />
+ <dataarea name="quik" size="8915">
+ <rom name="20 faces of terror.vgz" size="8915" crc="380df81f" sha1="8b7da0671c98a5ad21e773d0d4e2d51fb7367cbb" offset="0" />
+ </dataarea>
+ </part>
+ <part name="021" interface="vgm_quik">
+ <feature name="part_id" value="21 victory.vgz" />
+ <dataarea name="quik" size="5988812">
+ <rom name="21 victory.vgz" size="5988812" crc="47209fb6" sha1="2041465451ad29dbaf061324c33831c060fb8a59" offset="0" />
+ </dataarea>
+ </part>
+ <part name="022" interface="vgm_quik">
+ <feature name="part_id" value="22 hall of fame.vgz" />
+ <dataarea name="quik" size="1757670">
+ <rom name="22 hall of fame.vgz" size="1757670" crc="bd35ef3c" sha1="6942a8aa0ad1436c00a17185ed7840127b815376" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="turricn2_st">
+ <description>Turrican II - The Final Fight (Atari ST)</description>
+ <year>1991</year>
+ <publisher>Rainbow Arts</publisher>
+ <info name="cores" value="YM2149"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 the final fight.vgz" />
+ <dataarea name="quik" size="7803025">
+ <rom name="01 the final fight.vgz" size="7803025" crc="989df9ee" sha1="c7f38a78b1b8424280c2ca6fb8cfa8769b711dba" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 loader.vgz" />
+ <dataarea name="quik" size="15520">
+ <rom name="02 loader.vgz" size="15520" crc="5790a8d9" sha1="dd594b40915fad446c2e22861377538cc901699f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 the desert rocks.vgz" />
+ <dataarea name="quik" size="46128">
+ <rom name="03 the desert rocks.vgz" size="46128" crc="a2e64854" sha1="3c0eca05159f15ee039b6e7ecc949cf02eff587b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 hi gi joe!.vgz" />
+ <dataarea name="quik" size="10248">
+ <rom name="04 hi gi joe.vgz" size="10248" crc="6a2bef75" sha1="bc738ed0503897e3aade5521608a37a0a7e0e4e8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 traps.vgz" />
+ <dataarea name="quik" size="58418">
+ <rom name="05 traps.vgz" size="58418" crc="6753d09b" sha1="b4c3b115b761ca076e3836090f3aedf54d63abae" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 space patrol.vgz" />
+ <dataarea name="quik" size="14431">
+ <rom name="06 space patrol.vgz" size="14431" crc="7f024fc6" sha1="b727ceba44ea950eb5cd08d1b8f66f1404fcdb2a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 warhead.vgz" />
+ <dataarea name="quik" size="6003">
+ <rom name="07 warhead.vgz" size="6003" crc="a34ab40a" sha1="83541ae83f9da4cd76c30369e008d505210c8cb4" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 level complete 1 a.vgz" />
+ <dataarea name="quik" size="1342">
+ <rom name="08 level complete 1 a.vgz" size="1342" crc="bd208ebf" sha1="6cb2c241798a39237f5d5627fc5c7b3974773125" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 level complete 1 b.vgz" />
+ <dataarea name="quik" size="1393">
+ <rom name="09 level complete 1 b.vgz" size="1393" crc="5ab17160" sha1="06038c068e8e4945e319aef88750852b7e710583" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 secret dungeons.vgz" />
+ <dataarea name="quik" size="32895">
+ <rom name="10 secret dungeons.vgz" size="32895" crc="cf5c5def" sha1="410173d83970071a5251e3f997f51de4e66e31d0" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 the great bath.vgz" />
+ <dataarea name="quik" size="26027">
+ <rom name="11 the great bath.vgz" size="26027" crc="ca04aa70" sha1="80b0a7a328d0945b28133d9dc00ef0d052816593" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 check the gripper.vgz" />
+ <dataarea name="quik" size="7403">
+ <rom name="12 check the gripper.vgz" size="7403" crc="cbac72ad" sha1="e04130ac349b51d433ee9aec74813b3d6e843c49" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 metal stars.vgz" />
+ <dataarea name="quik" size="14297">
+ <rom name="13 metal stars.vgz" size="14297" crc="1c1b16ca" sha1="13098b2939801336c786f1ff993b0d7f9bfa3195" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 quickdrive to hell.vgz" />
+ <dataarea name="quik" size="3317">
+ <rom name="14 quickdrive to hell.vgz" size="3317" crc="040e9284" sha1="930d511c830d5b6b8ebdf3ee823b02832dfa87c8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 rock n roll balance.vgz" />
+ <dataarea name="quik" size="2896">
+ <rom name="15 rock n roll balance.vgz" size="2896" crc="6e56a3da" sha1="3b18d318ad4b0305d67658271dfa8729d9dc7b50" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 level complete 2 a.vgz" />
+ <dataarea name="quik" size="1350">
+ <rom name="16 level complete 2 a.vgz" size="1350" crc="9759b65e" sha1="9a75685367fe7bce8699db3b4baba342aa8d9c57" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 level complete 2 b.vgz" />
+ <dataarea name="quik" size="1513">
+ <rom name="17 level complete 2 b.vgz" size="1513" crc="c7c12aca" sha1="ba45c6522d19630da80dbfa561f4cc28b932fa40" offset="0" />
+ </dataarea>
+ </part>
+ <part name="018" interface="vgm_quik">
+ <feature name="part_id" value="18 concerto for laser and enemies.vgz" />
+ <dataarea name="quik" size="25849">
+ <rom name="18 concerto for laser and enemies.vgz" size="25849" crc="89fe450e" sha1="ce438f2ce4e66858bfa768e6de4ef7b11350d72b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="019" interface="vgm_quik">
+ <feature name="part_id" value="19 take a look.vgz" />
+ <dataarea name="quik" size="8692">
+ <rom name="19 take a look.vgz" size="8692" crc="2c02dbed" sha1="d3ac285746a234bb34c79cd1d0fed8f4b8622eff" offset="0" />
+ </dataarea>
+ </part>
+ <part name="020" interface="vgm_quik">
+ <feature name="part_id" value="20 unidirectional fight.vgz" />
+ <dataarea name="quik" size="19403">
+ <rom name="20 unidirectional fight.vgz" size="19403" crc="f25dbbdc" sha1="2b1fb714b15b12fb7e5d51abae29c100cf88c0f6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="021" interface="vgm_quik">
+ <feature name="part_id" value="21 go for the gunhed.vgz" />
+ <dataarea name="quik" size="5240">
+ <rom name="21 go for the gunhed.vgz" size="5240" crc="0ed02521" sha1="c4991e7e39507eb74d023952737a775f13768df9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="022" interface="vgm_quik">
+ <feature name="part_id" value="22 powerslide.vgz" />
+ <dataarea name="quik" size="8017">
+ <rom name="22 powerslide.vgz" size="8017" crc="5c5458f9" sha1="6fcf99aa7c91ea50b4f67024061745b57953e375" offset="0" />
+ </dataarea>
+ </part>
+ <part name="023" interface="vgm_quik">
+ <feature name="part_id" value="23 hypercycle drive.vgz" />
+ <dataarea name="quik" size="8798">
+ <rom name="23 hypercycle drive.vgz" size="8798" crc="e4b80c47" sha1="86f8f7dcd64e2d08a755e3f3bf43f47a92c09921" offset="0" />
+ </dataarea>
+ </part>
+ <part name="024" interface="vgm_quik">
+ <feature name="part_id" value="24 level complete 3 a.vgz" />
+ <dataarea name="quik" size="1286">
+ <rom name="24 level complete 3 a.vgz" size="1286" crc="83778808" sha1="63ec2638b7043fbfdddf32fb40a644017c4e1ccf" offset="0" />
+ </dataarea>
+ </part>
+ <part name="025" interface="vgm_quik">
+ <feature name="part_id" value="25 level complete 3 b.vgz" />
+ <dataarea name="quik" size="1313">
+ <rom name="25 level complete 3 b.vgz" size="1313" crc="71579a54" sha1="b62df26383a7bf56292801c271fe5270cead03e4" offset="0" />
+ </dataarea>
+ </part>
+ <part name="026" interface="vgm_quik">
+ <feature name="part_id" value="26 the wall.vgz" />
+ <dataarea name="quik" size="57056">
+ <rom name="26 the wall.vgz" size="57056" crc="bbc6e917" sha1="6039a2f8c4d354afe1df79deb056774f9fefb8f2" offset="0" />
+ </dataarea>
+ </part>
+ <part name="027" interface="vgm_quik">
+ <feature name="part_id" value="27 dragonfight.vgz" />
+ <dataarea name="quik" size="9743">
+ <rom name="27 dragonfight.vgz" size="9743" crc="bdf23ef1" sha1="eea42d8c2f64474a2c168837e4335a07d684ee04" offset="0" />
+ </dataarea>
+ </part>
+ <part name="028" interface="vgm_quik">
+ <feature name="part_id" value="28 mr. walker and his factory.vgz" />
+ <dataarea name="quik" size="56997">
+ <rom name="28 mr. walker and his factory.vgz" size="56997" crc="309f16a7" sha1="106863a9c596dec44ab43a93bc2d55581e78e797" offset="0" />
+ </dataarea>
+ </part>
+ <part name="029" interface="vgm_quik">
+ <feature name="part_id" value="29 level complete 4 a.vgz" />
+ <dataarea name="quik" size="889">
+ <rom name="29 level complete 4 a.vgz" size="889" crc="da6ba02f" sha1="02d60fe91dd41698b06447c0f694619ee87c6dc7" offset="0" />
+ </dataarea>
+ </part>
+ <part name="030" interface="vgm_quik">
+ <feature name="part_id" value="30 level complete 4 b.vgz" />
+ <dataarea name="quik" size="894">
+ <rom name="30 level complete 4 b.vgz" size="894" crc="38842e7b" sha1="f7f6bf22106faeff79db30fec368aa91b0051cda" offset="0" />
+ </dataarea>
+ </part>
+ <part name="031" interface="vgm_quik">
+ <feature name="part_id" value="31 danger ahead.vgz" />
+ <dataarea name="quik" size="10144">
+ <rom name="31 danger ahead.vgz" size="10144" crc="d423ec55" sha1="5c86d35f1bee4989a75429fbe2c340a2b8d72789" offset="0" />
+ </dataarea>
+ </part>
+ <part name="032" interface="vgm_quik">
+ <feature name="part_id" value="32 the final challenge.vgz" />
+ <dataarea name="quik" size="154652">
+ <rom name="32 the final challenge.vgz" size="154652" crc="e1cd07ed" sha1="d9e042a964a2772f594401d2968201dcc0e859d9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="033" interface="vgm_quik">
+ <feature name="part_id" value="33 go for the nuke!.vgz" />
+ <dataarea name="quik" size="25837">
+ <rom name="33 go for the nuke.vgz" size="25837" crc="94860950" sha1="f7b7d7135fceaf30dda359545b62302124f61306" offset="0" />
+ </dataarea>
+ </part>
+ <part name="034" interface="vgm_quik">
+ <feature name="part_id" value="34 yeeaah, done it!.vgz" />
+ <dataarea name="quik" size="2838">
+ <rom name="34 yeeaah, done it.vgz" size="2838" crc="1a7ed1cf" sha1="8235bab2b7db42a52e0dcdf0d41c3bda395c88a5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="035" interface="vgm_quik">
+ <feature name="part_id" value="35 level complete 5 a.vgz" />
+ <dataarea name="quik" size="871">
+ <rom name="35 level complete 5 a.vgz" size="871" crc="0beca5b9" sha1="9f83337a86dfc089c1bf1a453f066f71ce7c53d0" offset="0" />
+ </dataarea>
+ </part>
+ <part name="036" interface="vgm_quik">
+ <feature name="part_id" value="36 level complete 5 b.vgz" />
+ <dataarea name="quik" size="875">
+ <rom name="36 level complete 5 b.vgz" size="875" crc="6ca0c09c" sha1="4c7c63695510ebf4641d32d1006cb9d05cd7bfdf" offset="0" />
+ </dataarea>
+ </part>
+ <part name="037" interface="vgm_quik">
+ <feature name="part_id" value="37 freedom.vgz" />
+ <dataarea name="quik" size="4031727">
+ <rom name="37 freedom.vgz" size="4031727" crc="8ade22fb" sha1="d2344b7c79e38a87275e2b716a64a4bb1fc1a554" offset="0" />
+ </dataarea>
+ </part>
+ <part name="038" interface="vgm_quik">
+ <feature name="part_id" value="38 the hero.vgz" />
+ <dataarea name="quik" size="3004669">
+ <rom name="38 the hero.vgz" size="3004669" crc="024bb2c6" sha1="ed5aa3fa3e4aac120f2be46f9b8178273e331ba6" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="valna_88">
+ <description>Valna (NEC PC-8801)</description>
+ <year>1989</year>
+ <publisher>System Sacom</publisher>
+ <info name="cores" value="YM2608"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 opening.vgz" />
+ <dataarea name="quik" size="3280">
+ <rom name="01 opening.vgz" size="3280" crc="5cb74d72" sha1="4a372321ecd5b94c308e8aeb3361ae76934188da" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 town 1.vgz" />
+ <dataarea name="quik" size="10906">
+ <rom name="02 town 1.vgz" size="10906" crc="39d98b93" sha1="bc259afa0872a76df64c2833efbe47ec7ade9d9c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 shop.vgz" />
+ <dataarea name="quik" size="5801">
+ <rom name="03 shop.vgz" size="5801" crc="0526bf52" sha1="87d561a92dc0d59fd4d89a466bda99f6af654b27" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 battle event.vgz" />
+ <dataarea name="quik" size="7915">
+ <rom name="04 battle event.vgz" size="7915" crc="9d6e380c" sha1="7a52edab78ef59dd28e5f05d89d9c6cd62659626" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 got an item.vgz" />
+ <dataarea name="quik" size="2137">
+ <rom name="05 got an item.vgz" size="2137" crc="a9a1952a" sha1="139ee8849724833c6811719f520b9cb328bb788f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 meadow.vgz" />
+ <dataarea name="quik" size="6336">
+ <rom name="06 meadow.vgz" size="6336" crc="4671bb61" sha1="4e4c76758ee77c8864dce36dae49b527f211c11a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 volcano cave.vgz" />
+ <dataarea name="quik" size="10635">
+ <rom name="07 volcano cave.vgz" size="10635" crc="650dabbf" sha1="51e012d355b1efc412c6c4d3c90b8ffc7e67a61b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 galaner's cave.vgz" />
+ <dataarea name="quik" size="7347">
+ <rom name="08 galaner's cave.vgz" size="7347" crc="1839ef56" sha1="219f116c7ec6bba055a56da19ca79c459fc44744" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 boss battle.vgz" />
+ <dataarea name="quik" size="5224">
+ <rom name="09 boss battle.vgz" size="5224" crc="c57fcb7f" sha1="8e5942545eb9bb7a3c90fb241b4636b0b2c11063" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 mountainous area.vgz" />
+ <dataarea name="quik" size="5398">
+ <rom name="10 mountainous area.vgz" size="5398" crc="2e8a5096" sha1="7cdba3c46e5b4f9451e1786cdf3b20343b7f0e80" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 town 2.vgz" />
+ <dataarea name="quik" size="7511">
+ <rom name="11 town 2.vgz" size="7511" crc="88bfb71f" sha1="fb3f2414bc23a1ca1bcc44e6be6bd8c4e0dcd38f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 tradegy.vgz" />
+ <dataarea name="quik" size="2203">
+ <rom name="12 tradegy.vgz" size="2203" crc="f77ad319" sha1="e129aaa4fb2754edd698628b752d903339cd516e" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 coal mine.vgz" />
+ <dataarea name="quik" size="8984">
+ <rom name="13 coal mine.vgz" size="8984" crc="b28e84a0" sha1="8168e045ac090b8360e8ef372fd18a832d660b04" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 resistance hideout.vgz" />
+ <dataarea name="quik" size="4241">
+ <rom name="14 resistance hideout.vgz" size="4241" crc="b6b5e413" sha1="f8a319f1bf9a3cc8fc92e06b47a3110a50cb44f5" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 branzark castle.vgz" />
+ <dataarea name="quik" size="7403">
+ <rom name="15 branzark castle.vgz" size="7403" crc="af4c6211" sha1="eaaad12db2b288d7eadf6c726d105da0f8380b24" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 deep inside branzark castle.vgz" />
+ <dataarea name="quik" size="10234">
+ <rom name="16 deep inside branzark castle.vgz" size="10234" crc="6887909d" sha1="deaec6cd01a4f36ba0817ce983933638d19c7ad9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 the fairy flute.vgz" />
+ <dataarea name="quik" size="1426">
+ <rom name="17 the fairy flute.vgz" size="1426" crc="f4aecbf0" sha1="8018707cbdac64e4dfe8ba2fe507c29332052003" offset="0" />
+ </dataarea>
+ </part>
+ <part name="018" interface="vgm_quik">
+ <feature name="part_id" value="18 euphiny's tower.vgz" />
+ <dataarea name="quik" size="12400">
+ <rom name="18 euphiny's tower.vgz" size="12400" crc="021a55a8" sha1="e00435845b549c2579778ec34b99977965663c4f" offset="0" />
+ </dataarea>
+ </part>
+ <part name="019" interface="vgm_quik">
+ <feature name="part_id" value="19 the island of the ancestors.vgz" />
+ <dataarea name="quik" size="6305">
+ <rom name="19 the island of the ancestors.vgz" size="6305" crc="7b08c016" sha1="1c7690d880fbee7fd11fadb5be76c6add861ff5b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="020" interface="vgm_quik">
+ <feature name="part_id" value="20 deep in the island of the ancestors.vgz" />
+ <dataarea name="quik" size="11698">
+ <rom name="20 deep in the island of the ancestors.vgz" size="11698" crc="723a2cb2" sha1="b4abddfb6bea98ac9fb9fa6d54d1d29f7cc12adf" offset="0" />
+ </dataarea>
+ </part>
+ <part name="021" interface="vgm_quik">
+ <feature name="part_id" value="21 the devil.vgz" />
+ <dataarea name="quik" size="17082">
+ <rom name="21 the devil.vgz" size="17082" crc="8d60dcf3" sha1="e8b5ce1b9766dad86ee28d859bb8671bf6273d39" offset="0" />
+ </dataarea>
+ </part>
+ <part name="022" interface="vgm_quik">
+ <feature name="part_id" value="22 ending.vgz" />
+ <dataarea name="quik" size="7154">
+ <rom name="22 ending.vgz" size="7154" crc="bfa23cf7" sha1="5bd61ae93d1e3a8b8e46cce1bb9e4a7c66eb61a1" offset="0" />
+ </dataarea>
+ </part>
+ <part name="023" interface="vgm_quik">
+ <feature name="part_id" value="23 staff roll.vgz" />
+ <dataarea name="quik" size="15641">
+ <rom name="23 staff roll.vgz" size="15641" crc="1a73ac0c" sha1="bf628e0245380d39c41a32b501c3e57abc209cb9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="024" interface="vgm_quik">
+ <feature name="part_id" value="24 game over.vgz" />
+ <dataarea name="quik" size="2949">
+ <rom name="24 game over.vgz" size="2949" crc="5da0c3d1" sha1="1d1231bb8f85be0772f78ce79148063d599f2cd9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="025" interface="vgm_quik">
+ <feature name="part_id" value="25 unused song.vgz" />
+ <dataarea name="quik" size="4433">
+ <rom name="25 unused song.vgz" size="4433" crc="849dcff3" sha1="6685aaf7d51daa0779e9d614fc21ef6fa79180b2" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zanac_nes">
+ <description>Zanac A.I. (NES)</description>
+ <year>1986</year>
+ <publisher>FCI (U) / Pony Canyon (J)</publisher>
+ <info name="cores" value="NES APU (N2A03)"/>
+ <part name="001" interface="vgm_quik">
+ <feature name="part_id" value="01 title.vgz" />
+ <dataarea name="quik" size="1666">
+ <rom name="01 title.vgz" size="1666" crc="676c6bbb" sha1="95d0c2476097a5abfd078510ad0d80516ac92c94" offset="0" />
+ </dataarea>
+ </part>
+ <part name="002" interface="vgm_quik">
+ <feature name="part_id" value="02 area 1.vgz" />
+ <dataarea name="quik" size="2110">
+ <rom name="02 area 1.vgz" size="2110" crc="4fc06dc7" sha1="4ed441a593c52c00def633333a6721059dc287bb" offset="0" />
+ </dataarea>
+ </part>
+ <part name="003" interface="vgm_quik">
+ <feature name="part_id" value="03 area mid-boss destroyed.vgz" />
+ <dataarea name="quik" size="794">
+ <rom name="03 area mid-boss destroyed.vgz" size="794" crc="a6a11a88" sha1="9f84de19a44cf36ca94796b45f4e2c8ec7d44b5a" offset="0" />
+ </dataarea>
+ </part>
+ <part name="004" interface="vgm_quik">
+ <feature name="part_id" value="04 area boss.vgz" />
+ <dataarea name="quik" size="759">
+ <rom name="04 area boss.vgz" size="759" crc="715eda4d" sha1="658e217c1f924756de3b4d239542e20040203688" offset="0" />
+ </dataarea>
+ </part>
+ <part name="005" interface="vgm_quik">
+ <feature name="part_id" value="05 area boss destroyed.vgz" />
+ <dataarea name="quik" size="535">
+ <rom name="05 area boss destroyed.vgz" size="535" crc="bc1b179b" sha1="2711583f0b2824fca0f78573065299fd96f9ef0b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="006" interface="vgm_quik">
+ <feature name="part_id" value="06 area clear.vgz" />
+ <dataarea name="quik" size="748">
+ <rom name="06 area clear.vgz" size="748" crc="0162aa4a" sha1="f1a714b470bbd324fa4a265e31776eb22c149283" offset="0" />
+ </dataarea>
+ </part>
+ <part name="007" interface="vgm_quik">
+ <feature name="part_id" value="07 area 2, 4.vgz" />
+ <dataarea name="quik" size="2613">
+ <rom name="07 area 2, 4.vgz" size="2613" crc="22a40eb2" sha1="ccda7974ce46267fa634607ac71812813057fb2c" offset="0" />
+ </dataarea>
+ </part>
+ <part name="008" interface="vgm_quik">
+ <feature name="part_id" value="08 area 3.vgz" />
+ <dataarea name="quik" size="1666">
+ <rom name="08 area 3.vgz" size="1666" crc="01a706ff" sha1="35d7262efefef8d7fa1d7ddccc82dc2401e63c1b" offset="0" />
+ </dataarea>
+ </part>
+ <part name="009" interface="vgm_quik">
+ <feature name="part_id" value="09 area 5, 7, 11.vgz" />
+ <dataarea name="quik" size="1595">
+ <rom name="09 area 5, 7, 11.vgz" size="1595" crc="8f3abbf3" sha1="62a6be6061aca4bfafe0987722ae4a7ad29a2eb9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="010" interface="vgm_quik">
+ <feature name="part_id" value="10 area 6, 9.vgz" />
+ <dataarea name="quik" size="699">
+ <rom name="10 area 6, 9.vgz" size="699" crc="15671183" sha1="ae87dccd43567f6cfe3a33e9fd2b8a9e7c282cec" offset="0" />
+ </dataarea>
+ </part>
+ <part name="011" interface="vgm_quik">
+ <feature name="part_id" value="11 area 8, 10.vgz" />
+ <dataarea name="quik" size="1440">
+ <rom name="11 area 8, 10.vgz" size="1440" crc="1cd3c77d" sha1="a33779f47c88380888bed1f448abb7e3b6577341" offset="0" />
+ </dataarea>
+ </part>
+ <part name="012" interface="vgm_quik">
+ <feature name="part_id" value="12 area 12.vgz" />
+ <dataarea name="quik" size="1195">
+ <rom name="12 area 12.vgz" size="1195" crc="588a23db" sha1="dabc1d3f0e4f9df4d40ec351817f63027e999992" offset="0" />
+ </dataarea>
+ </part>
+ <part name="013" interface="vgm_quik">
+ <feature name="part_id" value="13 final boss.vgz" />
+ <dataarea name="quik" size="2530">
+ <rom name="13 final boss.vgz" size="2530" crc="0e84eec2" sha1="b187c2bafaed95ecfb7f10376ee0eaf644c3acc6" offset="0" />
+ </dataarea>
+ </part>
+ <part name="014" interface="vgm_quik">
+ <feature name="part_id" value="14 staff roll.vgz" />
+ <dataarea name="quik" size="1839">
+ <rom name="14 staff roll.vgz" size="1839" crc="db169723" sha1="e228212bb480c536c7d457c0670e5a012e305be8" offset="0" />
+ </dataarea>
+ </part>
+ <part name="015" interface="vgm_quik">
+ <feature name="part_id" value="15 game over.vgz" />
+ <dataarea name="quik" size="735">
+ <rom name="15 game over.vgz" size="735" crc="ff2ba994" sha1="57687a7266bc951abbb6d10a0c65c631427908fa" offset="0" />
+ </dataarea>
+ </part>
+ <part name="016" interface="vgm_quik">
+ <feature name="part_id" value="16 compile jingle.vgz" />
+ <dataarea name="quik" size="461">
+ <rom name="16 compile jingle.vgz" size="461" crc="726ce6dc" sha1="6ec5384752e72ace55fa106332678c496eef6d12" offset="0" />
+ </dataarea>
+ </part>
+ <part name="017" interface="vgm_quik">
+ <feature name="part_id" value="17 hi-score reached.vgz" />
+ <dataarea name="quik" size="490">
+ <rom name="17 hi-score reached.vgz" size="490" crc="d906c315" sha1="ebecf4d83383e49426f427c6454ea7deb0ced6f9" offset="0" />
+ </dataarea>
+ </part>
+ <part name="018" interface="vgm_quik">
+ <feature name="part_id" value="18 final boss (without intro).vgz" />
+ <dataarea name="quik" size="2389">
+ <rom name="18 final boss (without intro).vgz" size="2389" crc="87406f9c" sha1="c4fe2f6dfad0973fad377d3c224c8da7f8d2d184" offset="0" />
+ </dataarea>
+ </part>
+ <part name="019" interface="vgm_quik">
+ <feature name="part_id" value="19 alternate area 10.vgz" />
+ <dataarea name="quik" size="1195">
+ <rom name="19 alternate area 10.vgz" size="1195" crc="b5aaab98" sha1="7bc424b492582ad0be236908b576eae338bd5b22" offset="0" />
+ </dataarea>
+ </part>
+ <part name="020" interface="vgm_quik">
+ <feature name="part_id" value="20 alternate game over.vgz" />
+ <dataarea name="quik" size="750">
+ <rom name="20 alternate game over.vgz" size="750" crc="fe8028e2" sha1="2e2dd15a185be4a87d43c485521f9c2e6cea1776" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<!-- Project 2612 VGM Archives located at http://project2612.org/list.php
Also https://archive.org/details/Project2612CompleteArchive20180623681Sets.7z -->
diff --git a/hash/vsmile_cart.xml b/hash/vsmile_cart.xml
index 4cb15a7c652..5483abe2f93 100644
--- a/hash/vsmile_cart.xml
+++ b/hash/vsmile_cart.xml
@@ -55,7 +55,7 @@ Addons (w/ yellow Smartridges)
| | 80-067057(SP) | V.Smile Estudio de Arte (pink) |
| | 80-067058(CN) | 智乐学习通小画室 |
+========+===================+============================================================================+
-| | 80-091320(US) | V.Smile Jamming Gym Class |
+| XX | 80-091320(US) | V.Smile Jammin' Gym Class (52-91320(US) on back label) |
| | 80-091322(NL) | V.Smile Muziek en Leer Mat |
| | 80-091323(UK) | V.Smile Dance'n'Learn |
| XX | 80-091324(GE) | V.Smile Tanz Mit Center (cart labeled as "Lern- und Tanzmatte") |
@@ -295,7 +295,6 @@ Regular game cartridges
| XX | 80-092251(IT) | Cenerentola - I desideri magici di Cenerentola (rev. 1) |
| XX | 80-084602(NL) | Assepoester - De wonderwereld van Assepoester (2010) |
| XX | 80-092242(NL) | Assepoester - De wonderwereld van Assepoester (2005, 52-092242(NL) on back label) |
-| XX | 80-092242(NL) | Assepoester - De wonderwereld van Assepoester (2005, alt) |
| XX | 80-092242-123(NL) | Assepoester - De wonderwereld van Assepoester (rev. 123, 2007) |
| XX | 80-092243(UK) | Cinderella - Cinderella's Magic Wishes |
| | 80-092243-103(UK) | Cinderella - Cinderella's Magic Wishes (rev. 103, 2007) |
@@ -580,7 +579,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
+========+===================+================================================================================================+
| Dumped | Serial | Name |
+========+===================+================================================================================================+
-| | 80-089000(US) | Spider-Man &amp; Friends - Where is Hulk? |
+| XX | 80-089000(US) | Spider-Man & Friends - Where is Hulk? |
+========+===================+================================================================================================+
| XX | 80-089020(US) | Toy Story 2 |
+========+===================+================================================================================================+
@@ -1507,21 +1506,6 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cinderlanla" cloneof="cinderla">
- <description>Walt Disney's Assepoester - De wonderwereld van Assepoester (Netherlands, alt, 2005)</description>
- <year>2005</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092242(NL)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="slot" value="vsmile_rom" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" />
- <dataarea name="rom" size="8388608">
- <rom name="92242 - Assepoester - De wonderwereld van Assepoester (NL) (2005).bin" size="8388608" crc="1153e6fa" sha1="f06990cd698fc41b5705dc3ffbd8751f9a6d4654" />
- </dataarea>
- </part>
- </software>
-
<software name="cinderlanl" cloneof="cinderla">
<description>Walt Disney's Assepoester - De wonderwereld van Assepoester (Netherlands, 2005)</description>
<year>2005</year>
@@ -1534,7 +1518,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
<feature name="cart_type" value="lilac" />
<feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
<dataarea name="rom" size="8388608">
- <rom name="50-092242 - Assepoester - De wonderwereld van Assepoester (NL).bin" size="8388608" crc="7c63221f" sha1="227e1d3b63714e6bf8d0fc0897bab9ffc1721ff5" />
+ <rom name="92242 - Assepoester - De wonderwereld van Assepoester (NL) (2005).bin" size="8388608" crc="1153e6fa" sha1="f06990cd698fc41b5705dc3ffbd8751f9a6d4654" />
</dataarea>
</part>
</software>
@@ -1611,7 +1595,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
<feature name="cart_type" value="lilac" />
<feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
<dataarea name="rom" size="8388608">
- <rom name="80-092247 - Disney Princess - La Cenicienta - Los suenos magicos de Cenicienta (SP).bin" size="8388608" crc="7c63221f" sha1="227e1d3b63714e6bf8d0fc0897bab9ffc1721ff5" />
+ <rom name="80-092247 - Disney Princess - La Cenicienta - Los suenos magicos de Cenicienta (SP).bin" size="8388608" crc="dbb7b765" sha1="442609ef00cb96b21c854239eb3f815722f644e3" />
</dataarea>
</part>
</software>
@@ -2096,7 +2080,22 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="jamgymge" supported="yes"> <!-- Will be clone of "jamgym" once found and dumped. -->
+ <software name="jamgym" supported="yes">
+ <description>V.Smile Jammin' Gym Class (USA)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-091320(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="slot" value="vsmile_rom" />
+ <feature name="cart_type" value="yellow" />
+ <feature name="u1" value="" />
+ <dataarea name="rom" size="8388608">
+ <rom name="V.Smile Jammin' Gym Class 91320(US).bin" size="8388608" crc="6d8683b0" sha1="d125996a9d27532f71a99501e136f7e5cc3b59e2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jamgymge" cloneof="jamgym" supported="yes">
<description>V.Smile Tanz Mit Center (Germany)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2113,7 +2112,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="jamgymfr" cloneof="jamgymge" supported="yes"> <!-- Will be clone of "jamgym" once found and dumped. -->
+ <software name="jamgymfr" cloneof="jamgym" supported="yes">
<description>V.Smile Défi Gym (France)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2128,7 +2127,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="jamgymsp" cloneof="jamgymge" supported="yes">
+ <software name="jamgymsp" cloneof="jamgym" supported="yes">
<description>Gimnasio Interactivo V.Smile (Spain)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2452,7 +2451,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="mannyfr">
+ <software name="mannyfr" cloneof="mannyge">
<description>Disney Manny et ses outils (France)</description>
<year>2009</year>
<publisher>VTech</publisher>
@@ -4675,7 +4674,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
<description>V.Smile Smart Keyboard (USA)</description>
<year>200?</year>
<publisher>VTech</publisher>
- <info name="serial" value="80-091444(GE)" />
+ <info name="serial" value="80-091440(US)" />
<sharedfeat name="ctrl1_default" value="smartkb_us" />
<part name="cart" interface="vsmile_cart">
<feature name="slot" value="vsmile_rom" />
@@ -5045,6 +5044,20 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
+ <software name="spidermansb" supported="no">
+ <description>Marvel Spider-Man &amp; Friends - Where is Hulk (Smartbook) (USA)</description>
+ <year>2007</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-089000(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="slot" value="vsmile_rom" />
+ <feature name="cart_type" value="red" />
+ <dataarea name="rom" size="8388608">
+ <rom name="Spider-Man and Friends - Where is Hulk 089000(US).bin" size="8388608" crc="5294d9ac" sha1="2b64cd58aab4474747b2bea0d75d180f9765ec4e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="toystry2sb" supported="no">
<description>Disney/Pixar Toy Story 2 (Smartbook) (USA)</description>
<year>2007</year>
diff --git a/hash/vsmileb_cart.xml b/hash/vsmileb_cart.xml
index 19aede8e62f..3a3a13b4a88 100644
--- a/hash/vsmileb_cart.xml
+++ b/hash/vsmileb_cart.xml
@@ -27,8 +27,8 @@ VTech V.Smile Baby cartridges
+========+===================+============================================================================+
| Dumped | Serial | Name |
+========+===================+============================================================================+
-| | 80-099000(US) | Learn and Discover Home (white background on title) (pack-in) |
-| | 80-099000(US) | Learn and Discover Home (green background on title) (standalone) |
+| NA | 80-099000(US) | Learn and Discover Home (white background on title) (pack-in) (no-ROM cartridge)
+| NA | 80-099000(US) | Learn and Discover Home (green background on title) (standalone) (no-ROM cartridge)
| XX | 80-099002(NL) | Dierenhuis |
| | 80-099003(UK) | Learn and Discover Home (white background on title) (pack-in) |
| XX | 80-099004(GE) | Meine kleinen Tierfreunde (Explore and Learn Home on label) |
@@ -43,12 +43,12 @@ VTech V.Smile Baby cartridges
| NA | 80-099027(SP) | Aventuras en el Bosque de los Cien Acres (no-ROM cartridge) |
| XX | 80-099034(SE) | Nalle Puhs Äventyr i Sjumilaskogen |
+========+===================+============================================================================+
-| | 80-099040(US) | Baby Einstein - World of Discoveries |
-| | 80-099040(US) | Baby Einstein - World of Discoveries (no # on front label) |
+| XX | 80-099040(US) | Baby Einstein - World of Discoveries |
+| XX | 80-099040(US) | Baby Einstein - World of Discoveries (no # on front label) |
| | 80-099043(UK) | Baby Einstein - World of Discoveries |
| XX | 80-099045(FR) | Baby Einstein - Un monde de découvertes |
+========+===================+============================================================================+
-| | 80-099060(US) | A Day On The Farm |
+| XX | 80-099060(US) | A Day On The Farm |
| | 80-099063(UK) | A Day On The Farm |
| XX | 80-099064(GE) | Mein erster Bauernhof |
| XX | 80-099065(FR) | Un jour à la ferme |
@@ -56,19 +56,19 @@ VTech V.Smile Baby cartridges
+========+===================+============================================================================+
| | 80-099080(US) | <Unknown> |
+========+===================+============================================================================+
-| | 80-099100(US) | Noah's Ark Animal Adventure |
+| XX | 80-099100(US) | Noah's Ark Animal Adventure |
| | 80-099102(NL) | De ark van Noach |
| | 80-099103(UK) | Noah's Ark Animal Adventure |
| XX | 80-099105(FR) | L'arche de Noé - L'aventure des animaux |
+========+===================+============================================================================+
-| | 80-099120(US) | Barney - Let's Go to a Party |
+| XX | 80-099120(US) | Barney - Let's Go to a Party |
+========+===================+============================================================================+
-| | 80-099140(US) | Teletubbies |
+| XX | 80-099140(US) | Teletubbies |
| | 80-099142(NL) | Teletubbies |
| | 80-099143(UK) | Teletubbies |
| XX | 80-099145(FR) | Teletubbies |
+========+===================+============================================================================+
-| | 80-099160(US) | Discovery with Baby Mickey and Friends |
+| XX | 80-099160(US) | Discovery with Baby Mickey and Friends |
| | 80-099163(UK) | Discovery with Baby Mickey and Friends |
| XX | 80-099165(UK) | Les découvertes de Mickey et ses amis |
+========+===================+============================================================================+
@@ -76,19 +76,44 @@ VTech V.Smile Baby cartridges
| | 80-099183(UK) | Bailey Goes To Town (included Bailey Plush Bear Controller) |
| | 80-099185(FR) | En Ville avec l'ourson Patoune (included Patoune Plush Bear Controller) (no-ROM cart exists, unknown if a regular cart was sold too)
+========+===================+============================================================================+
-| | 80-099200(US) | Mother Goose |
+| XX | 80-099200(US) | Mother Goose |
+========+===================+============================================================================+
-| | 80-099220(US) | Care Bears Play Day |
+| XX | 80-099220(US) | Care Bears Play Day |
+========+===================+============================================================================+
-| | 80-099240(US) | Backyardigans: Big Backyard Adventures |
+| XX | 80-099240(US) | Backyardigans: Big Backyard Adventures |
+========+===================+============================================================================+
-->
<softwarelist name="vsmileb_cart" description="VTech V.Smile Baby cartridges">
+ <software name="babyeins" supported="no">
+ <description>Baby Einstein - World of Discoveries (USA)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099040(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="u4" value="U4" />
+ <dataarea name="rom" size="8388608">
+ <rom name="Baby Einstein (U) 099040 (Baby).bin" size="8388608" crc="9510fdba" sha1="ab7790b26b17fe000b9cef716e9c2aaa95b570f6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="babyeinsa" cloneof="babyeins" supported="no">
+ <description>Baby Einstein - World of Discoveries (USA, alt)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099040(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="u4" value="U4" />
+ <dataarea name="rom" size="8388608">
+ <rom name="Baby Einstein (U) (Baby).bin" size="8388608" crc="d8f964e4" sha1="b3bb1be91e51b9d19f2d03aeff7d8c3d05f38d74" />
+ </dataarea>
+ </part>
+ </software>
- <software name="babyeninfr" supported="no">
+ <software name="babyeinsfr" cloneof="babyeins" supported="no">
<description>Baby Einstein - Un monde de découvertes (France)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -101,7 +126,59 @@ VTech V.Smile Baby cartridges
</part>
</software>
- <software name="dayfarmge" supported="no">
+ <software name="backyardi" supported="no">
+ <description>Nickelodeon The Backyardigans - Big Backyard Adventure (USA)</description>
+ <year>2008</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099240(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="u4" value="U4" />
+ <dataarea name="rom" size="8388608">
+ <rom name="The Backyardigans (U) 099240 (Baby).bin" size="8388608" crc="2a1d80a4" sha1="aeab9a3458f2740a959a05e0ffe8103ecfcee3bf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="barney" supported="no">
+ <description>Barney - Let's Go to a Party (USA)</description>
+ <year>2007</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099120(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="u4" value="U4" />
+ <dataarea name="rom" size="8388608">
+ <rom name="Barney (U) 099120 (Baby).bin" size="8388608" crc="77867487" sha1="5c7be12b4767f2679e1148d0ffd4b7232f4f7563" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="carebear" supported="no">
+ <description>Care Bears - Play Day (USA)</description>
+ <year>2008</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099220(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="u4" value="U4" />
+ <dataarea name="rom" size="8388608">
+ <rom name="Care Bears (U) 099220 (Baby).bin" size="8388608" crc="4a791d18" sha1="39d70dbeccd6ddf4fcbe3cee5c0630ea9059c3ac" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dayfarm" supported="no">
+ <description>A Day on the Farm (USA)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099060(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="u4" value="U4" />
+ <dataarea name="rom" size="8388608">
+ <rom name="A Day on the Farm (U) (Baby).bin" size="8388608" crc="7f93ea7b" sha1="a130881e45c6a6a6158f64c2e7fb51d55fb2a15f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dayfarmge" cloneof="dayfarm" supported="no">
<description>Mein erster Bauernhof (Germany)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -116,7 +193,7 @@ VTech V.Smile Baby cartridges
</part>
</software>
- <software name="dayfarmfr" cloneof="dayfarmge" supported="no">
+ <software name="dayfarmfr" cloneof="dayfarm" supported="no">
<description>Un jour à la ferme (France)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -129,7 +206,7 @@ VTech V.Smile Baby cartridges
</part>
</software>
- <software name="dayfarmsp" cloneof="dayfarmge" supported="no">
+ <software name="dayfarmsp" cloneof="dayfarm" supported="no">
<description>Un Día en la Granja (Spain)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -144,7 +221,20 @@ VTech V.Smile Baby cartridges
</part>
</software>
- <software name="dbabymifr" supported="no">
+ <software name="dbabymi" supported="no">
+ <description>Discovery with Baby Mickey &amp; Friends (USA)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099160(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="u4" value="U4" />
+ <dataarea name="rom" size="8388608">
+ <rom name="Disney Baby - Discovery with Baby Mickey and Friends (U) (Baby).bin" size="8388608" crc="8b694c2c" sha1="7d3ac29cda9728545bd040af182cb78f9a7b7c02" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dbabymifr" cloneof="dbabymi" supported="no">
<description>Les découvertes de Mickey et ses amis (France)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -201,7 +291,33 @@ VTech V.Smile Baby cartridges
</part>
</software>
- <software name="noaharkfr" supported="no">
+ <software name="mothergoo" supported="no">
+ <description>Mother Goose (USA)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099200(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="u4" value="U4" />
+ <dataarea name="rom" size="8388608">
+ <rom name="Mother Goose (U) 099200 (Baby).bin" size="8388608" crc="1ef9e246" sha1="2093034c442c5bd7ace376eb9aa4e9c8378c75a4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="noahark" supported="no">
+ <description>Noah's Ark - Animal Adventures (USA)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099100(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="u4" value="U4" />
+ <dataarea name="rom" size="8388608">
+ <rom name="Noah's Ark Animal Adventures (U) 99100 (Baby).bin" size="8388608" crc="039d0465" sha1="826fd675f300fb14293344f6f180abc38b794e40" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="noaharkfr" cloneof="noahark" supported="no">
<description>L'arche de Noé - L'aventure des animaux (France)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -221,7 +337,7 @@ VTech V.Smile Baby cartridges
<info name="serial" value="80-099020(US)" />
<part name="cart" interface="vsmile_cart">
<dataarea name="rom" size="8388608">
- <rom name="099020.bin" size="8388608" crc="a3ac4cd4" sha1="3562c632e0a1e70cb9e382ebb823449757afed67" status="baddump" />
+ <rom name="Disney Baby - Pooh's Hundred Acre Wood Adventure (U) 099020 (Baby).bin" size="8388608" crc="31e6ccc5" sha1="2379b95910b171aa984d41b3a11d295639e5c8da" />
</dataarea>
</part>
</software>
@@ -241,9 +357,21 @@ VTech V.Smile Baby cartridges
</part>
</software>
- <software name="teletubfr" supported="no">
- <description>Teletubbies (France)</description>
- <year>1996</year>
+ <software name="teletub" supported="no">
+ <description>Teletubbies - Time for Teletubbies (USA)</description>
+ <year>2007</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099140(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <dataarea name="rom" size="8388608">
+ <rom name="Teletubbies - Time for Teletubbies (U) 099140 (Baby).bin" size="8388608" crc="f4950adb" sha1="92b1d5ca2c6c249872a17a3820082eb24aa0ebe3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="teletubfr" cloneof="teletub" supported="no">
+ <description>Teletubbies - C'est l'heure des Teletubbies (France)</description>
+ <year>2007?</year>
<publisher>VTech</publisher>
<info name="serial" value="80-099145(FR)" />
<part name="cart" interface="vsmile_cart">
diff --git a/hash/wicat.xml b/hash/wicat.xml
index 2fbf706408a..f9ec491eb8d 100644
--- a/hash/wicat.xml
+++ b/hash/wicat.xml
@@ -33,7 +33,7 @@ license:CC0
</part>
</software>
- <software name="unix">
+ <software name="unix10">
<description>WICAT Unix System 156 (Ver. 1.0)</description>
<year>198?</year>
<publisher>UniSoft Corp.</publisher>
@@ -78,5 +78,178 @@ license:CC0
</dataarea>
</part>
</software>
+
+ <software name="unix20">
+ <description>WICAT Unix (Ver. 2.0)</description>
+ <year>198?</year>
+ <publisher>UniSoft Corp.</publisher>
+ <!-- boot disk? -->
+ <part name="boot" interface="floppy_5_25">
+ <dataarea name="flop" size="581732">
+ <rom name="cmi15bt.imd" size="581732" crc="a6cb08e8" sha1="5e0602b1f9ecb3fde1d5fb6c39c08f0aabc6b9af"/>
+ </dataarea>
+ </part>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="585846">
+ <rom name="1.imd" size="585846" crc="e70d7e0e" sha1="a8951cd277972814b03778910e33765c37a2dad3"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <dataarea name="flop" size="540809">
+ <rom name="2.imd" size="540809" crc="378927d4" sha1="9600aa66408f826d0ff79f584e413f873669d5ae"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <dataarea name="flop" size="551039">
+ <rom name="3.imd" size="551039" crc="5e8cbce6" sha1="f2a07d0811c8dc57192b9cc38e40048826602209"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <dataarea name="flop" size="555131">
+ <rom name="4.imd" size="555131" crc="586cb44f" sha1="cd10602e9957e7a223e07c1f5c0cb2bc5dbe6869"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <dataarea name="flop" size="545924">
+ <rom name="5.imd" size="545924" crc="97b89552" sha1="88ccd039544d3f7d13bcdcf630d12ad944263385"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <dataarea name="flop" size="542855">
+ <rom name="6.imd" size="542855" crc="479c8172" sha1="45fef1bc5bd8010ca2140e9bbdd8ba920f45f696"/>
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <dataarea name="flop" size="534671">
+ <rom name="7.imd" size="534671" crc="a1c67ba5" sha1="adc9cdc8c73cd8a6fd80ae2a3acb75afe9c84227"/>
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <dataarea name="flop" size="545924">
+ <rom name="8.imd" size="545924" crc="9219e9d3" sha1="cd82c88d45d85eab4e99d024723d9ba9e5c32687"/>
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <dataarea name="flop" size="557177">
+ <rom name="9.imd" size="557177" crc="b184c5c9" sha1="9b886c537551faa2cb21f8c7b9a54261fda5fba8"/>
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <dataarea name="flop" size="553086">
+ <rom name="10.imd" size="553086" crc="ac10277d" sha1="71607cba07dc7d608a9c1ce2fa3ad908b765732a"/>
+ </dataarea>
+ </part>
+ <part name="flop11" interface="floppy_5_25">
+ <dataarea name="flop" size="516258">
+ <rom name="11.imd" size="516258" crc="e5f02ba6" sha1="476362a94b9e008201137dcbb142964b2679cffb"/>
+ </dataarea>
+ </part>
+ <part name="flop12" interface="floppy_5_25">
+ <dataarea name="flop" size="511143">
+ <rom name="12.imd" size="511143" crc="0177499a" sha1="58e4778220dc71816ed738548576c41c93827f1a"/>
+ </dataarea>
+ </part>
+ <part name="flop13" interface="floppy_5_25">
+ <dataarea name="flop" size="246186">
+ <rom name="13.imd" size="246186" crc="addbeb4a" sha1="e11791dbbe79d3b108bc35afc1e73c7859a617cb"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="unix220">
+ <description>WICAT Unix (Ver. 2.2.0)</description>
+ <year>198?</year>
+ <publisher>UniSoft Corp.</publisher>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="589935">
+ <rom name="1.imd" size="589935" crc="33876315" sha1="c343ebfdda97c950d1b2301dc468f0593d528d93"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <dataarea name="flop" size="557182">
+ <rom name="2.imd" size="557182" crc="d5102dd7" sha1="eb9107930d0d4f9cb33e8f6b9e03b868f6382049"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <dataarea name="flop" size="553090">
+ <rom name="3.imd" size="553090" crc="1c439b72" sha1="b1e40c0c3efbe886315608f3bfbfff1b724e9a32"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <dataarea name="flop" size="542860">
+ <rom name="4.imd" size="542860" crc="4f1896fd" sha1="8c30bdbc0ef01ec9e12bb2bc56a4199571bb64d9"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <dataarea name="flop" size="533653">
+ <rom name="5.imd" size="533653" crc="b925f59f" sha1="c0c7a5864686fb7c1d9ba54ef816e4e9f5633492"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <dataarea name="flop" size="530584">
+ <rom name="6.imd" size="530584" crc="dcf3d15b" sha1="2288d62202553ad193a440457cad313a95b09eb5"/>
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <dataarea name="flop" size="547975">
+ <rom name="7.imd" size="547975" crc="c3bb9588" sha1="803937d06bb9ec151f3acc127165b318a5b7a247"/>
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <dataarea name="flop" size="557181">
+ <rom name="8.imd" size="557181" crc="cc9e2def" sha1="5727e5d441e9a82a1edf78bb2e9c974331c0be75"/>
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <dataarea name="flop" size="546952">
+ <rom name="9.imd" size="546952" crc="e9a90af8" sha1="602453cfca3cea695ae5f1b90bdfb7ef9e55e058"/>
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <dataarea name="flop" size="554114">
+ <rom name="10.imd" size="554114" crc="554fe252" sha1="c78cda458afe28c46ed827b08cd1d31166396c11"/>
+ </dataarea>
+ </part>
+ <part name="flop11" interface="floppy_5_25">
+ <dataarea name="flop" size="409871">
+ <rom name="11.imd" size="409871" crc="6773fe89" sha1="46b32411c8118f7808374715f43033762695ba1a"/>
+ </dataarea>
+ </part>
+ <part name="flop12" interface="floppy_5_25">
+ <dataarea name="flop" size="478412">
+ <rom name="12.imd" size="478412" crc="1d729a5d" sha1="569ea825b2745ed87c497cf843ab2c9f6f7a0b25"/>
+ </dataarea>
+ </part>
+ <part name="flop13" interface="floppy_5_25">
+ <dataarea name="flop" size="528539">
+ <rom name="13.imd" size="528539" crc="7cbdf4c1" sha1="14d19de0afb3ff37a323e12f9614a804b8e2a427"/>
+ </dataarea>
+ </part>
+ <part name="flop14" interface="floppy_5_25">
+ <dataarea name="flop" size="508078">
+ <rom name="14.imd" size="508078" crc="651f755a" sha1="53a588f8c3d9f62dcb24efdbc144e8460ed3ca43"/>
+ </dataarea>
+ </part>
+ <part name="flop15" interface="floppy_5_25">
+ <dataarea name="flop" size="541767">
+ <rom name="15.imd" size="541767" crc="e9d1ae39" sha1="5aed5e67265bc1083763ae6d15a4c817914bd17a"/>
+ </dataarea>
+ </part>
+ <part name="flop16" interface="floppy_5_25">
+ <dataarea name="flop" size="463067">
+ <rom name="16.imd" size="463067" crc="5d226f01" sha1="745c0a64280e0800c59ed82735f83acb4aa90eda"/>
+ </dataarea>
+ </part>
+ <part name="flop17" interface="floppy_5_25">
+ <dataarea name="flop" size="470228">
+ <rom name="17.imd" size="470228" crc="51608dc8" sha1="ae1c33bb3817ae392e7fd3f71dc7667b07d3cbdf"/>
+ </dataarea>
+ </part>
+ <part name="flop18" interface="floppy_5_25">
+ <dataarea name="flop" size="216524">
+ <rom name="18.imd" size="216524" crc="a507a971" sha1="4a0c70adc2bbd1d3d57bf1c3d93503d1a162d1c3"/>
+ </dataarea>
+ </part>
+ </software>
</softwarelist>
diff --git a/makefile b/makefile
index ff06e1b3726..bc5147e6b01 100644
--- a/makefile
+++ b/makefile
@@ -1755,14 +1755,14 @@ endif
ifeq (posix,$(SHELLTYPE))
$(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS)
- @echo '#define BARE_BUILD_VERSION "0.234"' > $@
+ @echo '#define BARE_BUILD_VERSION "0.235"' > $@
@echo 'extern const char bare_build_version[];' >> $@
@echo 'extern const char build_version[];' >> $@
@echo 'const char bare_build_version[] = BARE_BUILD_VERSION;' >> $@
@echo 'const char build_version[] = BARE_BUILD_VERSION " ($(NEW_GIT_VERSION))";' >> $@
else
$(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS)
- @echo #define BARE_BUILD_VERSION "0.234" > $@
+ @echo #define BARE_BUILD_VERSION "0.235" > $@
@echo extern const char bare_build_version[]; >> $@
@echo extern const char build_version[]; >> $@
@echo const char bare_build_version[] = BARE_BUILD_VERSION; >> $@
@@ -1814,7 +1814,9 @@ ifeq (posix,$(SHELLTYPE))
$(SILENT) find src -name \*.mm -exec ./srcclean {} \; >&2
$(SILENT) find hash -name \*.hsi -exec ./srcclean {} \; >&2
$(SILENT) find hash -name \*.xml -exec ./srcclean {} \; >&2
+ $(SILENT) find bgfx -name \*.json -exec ./srcclean {} \; >&2
$(SILENT) find plugins -name \*.lua -exec ./srcclean {} \; >&2
+ $(SILENT) find plugins -name \*.json -exec ./srcclean {} \; >&2
$(SILENT) find scripts -name \*.lua -exec ./srcclean {} \; >&2
else
$(shell for /r src %%i in (*.c) do srcclean %%i >&2 )
@@ -1829,7 +1831,9 @@ else
$(shell for /r src %%i in (*.mm) do srcclean %%i >&2 )
$(shell for /r hash %%i in (*.hsi) do srcclean %%i >&2 )
$(shell for /r hash %%i in (*.xml) do srcclean %%i >&2 )
+ $(shell for /r bgfx %%i in (*.json) do srcclean %%i >&2 )
$(shell for /r plugins %%i in (*.lua) do srcclean %%i >&2 )
+ $(shell for /r plugins %%i in (*.json) do srcclean %%i >&2 )
$(shell for /r scripts %%i in (*.lua) do srcclean %%i >&2 )
endif
diff --git a/scripts/genie.lua b/scripts/genie.lua
index a1eafaf5c6d..173b0eee78e 100644
--- a/scripts/genie.lua
+++ b/scripts/genie.lua
@@ -627,7 +627,7 @@ configuration { "Debug" }
defines {
"MAME_DEBUG",
"MAME_PROFILER",
- "BGFX_CONFIG_DEBUG=1",
+-- "BGFX_CONFIG_DEBUG=1",
}
configuration { }
diff --git a/scripts/minimaws/lib/dbaccess.py b/scripts/minimaws/lib/dbaccess.py
index 7ca5ebf243d..c22b7c318fa 100644
--- a/scripts/minimaws/lib/dbaccess.py
+++ b/scripts/minimaws/lib/dbaccess.py
@@ -587,13 +587,13 @@ class QueryCursor(object):
if pattern is not None:
return self.dbcurs.execute(
'SELECT shortname, description ' \
- 'FROM machine WHERE isdevice = 0 AND shortname GLOB ? ' \
+ 'FROM machine WHERE shortname GLOB ? ' \
'ORDER BY shortname ASC',
(pattern, ))
else:
return self.dbcurs.execute(
'SELECT shortname, description ' \
- 'FROM machine WHERE isdevice = 0 ' \
+ 'FROM machine ' \
'ORDER BY shortname ASC')
def listsource(self, pattern):
@@ -601,14 +601,14 @@ class QueryCursor(object):
return self.dbcurs.execute(
'SELECT machine.shortname, sourcefile.filename ' \
'FROM machine JOIN sourcefile ON machine.sourcefile = sourcefile.id ' \
- 'WHERE machine.isdevice = 0 AND machine.shortname GLOB ? ' \
+ 'WHERE machine.shortname GLOB ? ' \
'ORDER BY machine.shortname ASC',
(pattern, ))
else:
return self.dbcurs.execute(
'SELECT machine.shortname, sourcefile.filename ' \
'FROM machine JOIN sourcefile ON machine.sourcefile = sourcefile.id ' \
- 'WHERE machine.isdevice = 0 ORDER BY machine.shortname ASC')
+ 'ORDER BY machine.shortname ASC')
def listclones(self, pattern):
if pattern is not None:
@@ -668,7 +668,7 @@ class QueryCursor(object):
def get_machine_details(self, machine):
return self.dbcurs.execute(
'SELECT machine.id AS id, machine.description AS description, machine.isdevice AS isdevice, machine.runnable AS runnable, sourcefile.filename AS sourcefile, system.year AS year, system.manufacturer AS manufacturer, cloneof.parent AS cloneof, romof.parent AS romof ' \
- 'FROM machine JOIN sourcefile ON machine.sourcefile = sourcefile.id LEFT JOIN system ON machine.id = system.id LEFT JOIN cloneof ON system.id = cloneof.id LEFT JOIN romof ON system.id = romof.id ' \
+ 'FROM machine JOIN sourcefile ON machine.sourcefile = sourcefile.id LEFT JOIN system ON machine.id = system.id LEFT JOIN cloneof ON machine.id = cloneof.id LEFT JOIN romof ON machine.id = romof.id ' \
'WHERE machine.shortname = ?',
(machine, ))
@@ -707,7 +707,7 @@ class QueryCursor(object):
def get_sourcefile_machines(self, id):
return self.dbcurs.execute(
'SELECT machine.shortname AS shortname, machine.description AS description, machine.isdevice AS isdevice, machine.runnable AS runnable, sourcefile.filename AS sourcefile, system.year AS year, system.manufacturer AS manufacturer, cloneof.parent AS cloneof, romof.parent AS romof ' \
- 'FROM machine JOIN sourcefile ON machine.sourcefile = sourcefile.id LEFT JOIN system ON machine.id = system.id LEFT JOIN cloneof ON system.id = cloneof.id LEFT JOIN romof ON system.id = romof.id ' \
+ 'FROM machine JOIN sourcefile ON machine.sourcefile = sourcefile.id LEFT JOIN system ON machine.id = system.id LEFT JOIN cloneof ON machine.id = cloneof.id LEFT JOIN romof ON machine.id = romof.id ' \
'WHERE machine.sourcefile = ?',
(id, ))
diff --git a/scripts/minimaws/lib/wsgiserve.py b/scripts/minimaws/lib/wsgiserve.py
index f1ddc5df220..0a5cda4f762 100644
--- a/scripts/minimaws/lib/wsgiserve.py
+++ b/scripts/minimaws/lib/wsgiserve.py
@@ -275,7 +275,7 @@ class MachineHandler(QueryPageHandler):
(self.machine_href(machine_info['romof']), htmlescape(parent[1]), htmlescape(machine_info['romof']))).encode('utf-8')
else:
yield (
- ' <tr><th>Parent machine:</th><td><a href="%s">%s</a></td></tr>\n' %
+ ' <tr><th>Parent ROM set:</th><td><a href="%s">%s</a></td></tr>\n' %
(self.machine_href(machine_info['romof']), htmlescape(machine_info['romof']))).encode('utf-8')
unemulated = []
imperfect = []
diff --git a/scripts/src/3rdparty.lua b/scripts/src/3rdparty.lua
index 78d73248623..8d43705345a 100644
--- a/scripts/src/3rdparty.lua
+++ b/scripts/src/3rdparty.lua
@@ -1390,6 +1390,7 @@ end
"-Wno-unknown-attributes",
"-Wno-missing-braces",
"-Wno-int-to-pointer-cast",
+ "-Wno-ignored-attributes", -- many instances in ImGui
}
end
end
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index 08ea4a8ff5d..f0349738813 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -1104,6 +1104,8 @@ if (BUSES["ELECTRON"]~=null) then
MAME_DIR .. "src/devices/bus/electron/fbjoy.h",
MAME_DIR .. "src/devices/bus/electron/fbprint.cpp",
MAME_DIR .. "src/devices/bus/electron/fbprint.h",
+ MAME_DIR .. "src/devices/bus/electron/mc68k.cpp",
+ MAME_DIR .. "src/devices/bus/electron/mc68k.h",
MAME_DIR .. "src/devices/bus/electron/mode7.cpp",
MAME_DIR .. "src/devices/bus/electron/mode7.h",
MAME_DIR .. "src/devices/bus/electron/plus1.cpp",
@@ -2433,6 +2435,8 @@ if (BUSES["A2BUS"]~=null) then
MAME_DIR .. "src/devices/bus/a2bus/a2sam.h",
MAME_DIR .. "src/devices/bus/a2bus/a2scsi.cpp",
MAME_DIR .. "src/devices/bus/a2bus/a2scsi.h",
+ MAME_DIR .. "src/devices/bus/a2bus/a2sd.cpp",
+ MAME_DIR .. "src/devices/bus/a2bus/a2sd.h",
MAME_DIR .. "src/devices/bus/a2bus/a2softcard.cpp",
MAME_DIR .. "src/devices/bus/a2bus/a2softcard.h",
MAME_DIR .. "src/devices/bus/a2bus/a2ssc.cpp",
@@ -2810,8 +2814,6 @@ if (BUSES["NES"]~=null) then
MAME_DIR .. "src/devices/bus/nes/henggedianzi.h",
MAME_DIR .. "src/devices/bus/nes/hes.cpp",
MAME_DIR .. "src/devices/bus/nes/hes.h",
- MAME_DIR .. "src/devices/bus/nes/hosenkan.cpp",
- MAME_DIR .. "src/devices/bus/nes/hosenkan.h",
MAME_DIR .. "src/devices/bus/nes/irem.cpp",
MAME_DIR .. "src/devices/bus/nes/irem.h",
MAME_DIR .. "src/devices/bus/nes/jaleco.cpp",
@@ -4364,6 +4366,8 @@ if (BUSES["CBUS"]~=null) then
files {
MAME_DIR .. "src/devices/bus/cbus/pc9801_26.cpp",
MAME_DIR .. "src/devices/bus/cbus/pc9801_26.h",
+ MAME_DIR .. "src/devices/bus/cbus/pc9801_55.cpp",
+ MAME_DIR .. "src/devices/bus/cbus/pc9801_55.h",
MAME_DIR .. "src/devices/bus/cbus/pc9801_86.cpp",
MAME_DIR .. "src/devices/bus/cbus/pc9801_86.h",
MAME_DIR .. "src/devices/bus/cbus/pc9801_118.cpp",
diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua
index a8969301246..0252aef5bc6 100644
--- a/scripts/src/cpu.lua
+++ b/scripts/src/cpu.lua
@@ -3252,6 +3252,16 @@ if opt_tool(CPUS, "DSP56000") then
end
--------------------------------------------------
+-- DEC VAX, disassembler only
+--@src/devices/cpu/vax/vax.h,CPUS["VAX"] = true
+--------------------------------------------------
+
+if opt_tool(CPUS, "VAX") then
+ table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/vax/vaxdasm.cpp")
+ table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/vax/vaxdasm.h")
+end
+
+--------------------------------------------------
-- DEC VT50/VT52
--@src/devices/cpu/vt50/vt50.h,CPUS["VT50"] = true
--------------------------------------------------
diff --git a/scripts/src/formats.lua b/scripts/src/formats.lua
index 5afef69d522..7e80512175b 100644
--- a/scripts/src/formats.lua
+++ b/scripts/src/formats.lua
@@ -33,8 +33,6 @@ project "formats"
MAME_DIR .. "src/lib/formats/all.cpp",
MAME_DIR .. "src/lib/formats/all.h",
- MAME_DIR .. "src/lib/formats/ioprocs.cpp",
- MAME_DIR .. "src/lib/formats/ioprocs.h",
MAME_DIR .. "src/lib/formats/imageutl.cpp",
MAME_DIR .. "src/lib/formats/imageutl.h",
@@ -71,6 +69,8 @@ project "formats"
MAME_DIR .. "src/lib/formats/dfi_dsk.cpp",
MAME_DIR .. "src/lib/formats/dfi_dsk.h",
MAME_DIR .. "src/lib/formats/fdi_dsk.cpp",
+ MAME_DIR .. "src/lib/formats/rpk.cpp",
+ MAME_DIR .. "src/lib/formats/rpk.h",
MAME_DIR .. "src/lib/formats/fsmgr.h",
MAME_DIR .. "src/lib/formats/fsmgr.cpp",
diff --git a/scripts/src/lib.lua b/scripts/src/lib.lua
index c943656ca14..fd8c5be2c27 100644
--- a/scripts/src/lib.lua
+++ b/scripts/src/lib.lua
@@ -61,6 +61,7 @@ project "utils"
MAME_DIR .. "src/lib/util/delegate.h",
MAME_DIR .. "src/lib/util/disasmintf.cpp",
MAME_DIR .. "src/lib/util/disasmintf.h",
+ MAME_DIR .. "src/lib/util/endianness.h",
MAME_DIR .. "src/lib/util/flac.cpp",
MAME_DIR .. "src/lib/util/flac.h",
MAME_DIR .. "src/lib/util/harddisk.cpp",
@@ -71,6 +72,12 @@ project "utils"
MAME_DIR .. "src/lib/util/hashing.h",
MAME_DIR .. "src/lib/util/huffman.cpp",
MAME_DIR .. "src/lib/util/huffman.h",
+ MAME_DIR .. "src/lib/util/ioprocs.cpp",
+ MAME_DIR .. "src/lib/util/ioprocs.h",
+ MAME_DIR .. "src/lib/util/ioprocsfill.h",
+ MAME_DIR .. "src/lib/util/ioprocsfilter.cpp",
+ MAME_DIR .. "src/lib/util/ioprocsfilter.h",
+ MAME_DIR .. "src/lib/util/ioprocsvec.h",
MAME_DIR .. "src/lib/util/jedparse.cpp",
MAME_DIR .. "src/lib/util/jedparse.h",
MAME_DIR .. "src/lib/util/md5.cpp",
@@ -85,6 +92,8 @@ project "utils"
MAME_DIR .. "src/lib/util/options.h",
MAME_DIR .. "src/lib/util/palette.cpp",
MAME_DIR .. "src/lib/util/palette.h",
+ MAME_DIR .. "src/lib/util/path.cpp",
+ MAME_DIR .. "src/lib/util/path.h",
MAME_DIR .. "src/lib/util/path_to_regex.cpp",
MAME_DIR .. "src/lib/util/path_to_regex.hpp",
MAME_DIR .. "src/lib/util/plaparse.cpp",
@@ -104,6 +113,7 @@ project "utils"
MAME_DIR .. "src/lib/util/unzip.cpp",
MAME_DIR .. "src/lib/util/unzip.h",
MAME_DIR .. "src/lib/util/un7z.cpp",
+ MAME_DIR .. "src/lib/util/utilfwd.h",
MAME_DIR .. "src/lib/util/vbiparse.cpp",
MAME_DIR .. "src/lib/util/vbiparse.h",
MAME_DIR .. "src/lib/util/vecstream.cpp",
diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua
index 264664d259f..30f5c86408f 100644
--- a/scripts/src/machine.lua
+++ b/scripts/src/machine.lua
@@ -3450,6 +3450,18 @@ end
---------------------------------------------------
--
+--@src/devices/machine/upd4991a.h,MACHINES["UPD4991A"] = true
+---------------------------------------------------
+
+if (MACHINES["UPD4991A"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/machine/upd4991a.cpp",
+ MAME_DIR .. "src/devices/machine/upd4991a.h",
+ }
+end
+
+---------------------------------------------------
+--
--@src/devices/machine/upd4992.h,MACHINES["UPD4992"] = true
---------------------------------------------------
@@ -4173,6 +4185,17 @@ end
---------------------------------------------------
--
+--@src/devices/machine/spi_sdcard.h,MACHINES["SPISDCARD"] = true
+---------------------------------------------------
+if (MACHINES["SPISDCARD"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/machine/spi_sdcard.cpp",
+ MAME_DIR .. "src/devices/machine/spi_sdcard.h",
+ }
+end
+
+---------------------------------------------------
+--
--@src/devices/machine/appldriv.h,MACHINES["APPLE_DRIVE"] = true
---------------------------------------------------
if (MACHINES["APPLE_DRIVE"]~=null) then
diff --git a/scripts/src/osd/mac.lua b/scripts/src/osd/mac.lua
index 2cc3e53c926..8a57b4ab4a3 100644
--- a/scripts/src/osd/mac.lua
+++ b/scripts/src/osd/mac.lua
@@ -166,7 +166,6 @@ project ("ocore_" .. _OPTIONS["osd"])
MAME_DIR .. "src/osd/modules/lib/osdlib_macosx.cpp",
MAME_DIR .. "src/osd/modules/lib/osdlib.h",
MAME_DIR .. "src/osd/modules/file/posixdir.cpp",
- MAME_DIR .. "src/osd/modules/file/posixdomain.cpp",
MAME_DIR .. "src/osd/modules/file/posixfile.cpp",
MAME_DIR .. "src/osd/modules/file/posixfile.h",
MAME_DIR .. "src/osd/modules/file/posixptty.cpp",
diff --git a/scripts/src/osd/sdl.lua b/scripts/src/osd/sdl.lua
index 37dfb221067..31dafbbeb20 100644
--- a/scripts/src/osd/sdl.lua
+++ b/scripts/src/osd/sdl.lua
@@ -482,7 +482,6 @@ project ("ocore_" .. _OPTIONS["osd"])
if BASE_TARGETOS=="unix" then
files {
MAME_DIR .. "src/osd/modules/file/posixdir.cpp",
- MAME_DIR .. "src/osd/modules/file/posixdomain.cpp",
MAME_DIR .. "src/osd/modules/file/posixfile.cpp",
MAME_DIR .. "src/osd/modules/file/posixfile.h",
MAME_DIR .. "src/osd/modules/file/posixptty.cpp",
diff --git a/scripts/src/osd/windows.lua b/scripts/src/osd/windows.lua
index cefe6234cf3..2f77844d17a 100644
--- a/scripts/src/osd/windows.lua
+++ b/scripts/src/osd/windows.lua
@@ -119,6 +119,12 @@ project ("osd_" .. _OPTIONS["osd"])
MAME_DIR .. "src/osd/windows",
}
+ if _OPTIONS["gcc"]~=nil and string.find(_OPTIONS["gcc"], "clang") then
+ buildoptions_cpp {
+ "-Wno-ignored-attributes",-- many instances in ImGui
+ }
+ end
+
files {
MAME_DIR .. "src/osd/modules/render/d3d/d3dhlsl.cpp",
MAME_DIR .. "src/osd/modules/render/d3d/d3dcomm.h",
diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua
index 4cb3bc80ae7..09284ac9036 100644
--- a/scripts/target/mame/arcade.lua
+++ b/scripts/target/mame/arcade.lua
@@ -651,6 +651,7 @@ MACHINES["SMC91C9X"] = true
MACHINES["SEGA_SCU"] = true
MACHINES["SMPC"] = true
--MACHINES["SPG2XX"] = true
+--MACHINES["SPISDCARD"] = true
MACHINES["STVCD"] = true
--MACHINES["SUN4C_MMU"] = true
MACHINES["SWTPC8212"] = true
@@ -676,6 +677,7 @@ MACHINES["TSB12LV01A"] = true
--MACHINES["TTL7474"] = true
--MACHINES["UCB1200"] = true
MACHINES["UPD1990A"] = true
+--MACHINES["UPD4991A"] = true
MACHINES["UPD4992"] = true
MACHINES["UPD4701"] = true
MACHINES["UPD7001"] = true
@@ -1634,10 +1636,6 @@ files {
MAME_DIR .. "src/mame/audio/nl_warrior.cpp",
MAME_DIR .. "src/mame/audio/nl_warrior.h",
MAME_DIR .. "src/mame/drivers/cchasm.cpp",
- MAME_DIR .. "src/mame/includes/cchasm.h",
- MAME_DIR .. "src/mame/machine/cchasm.cpp",
- MAME_DIR .. "src/mame/audio/cchasm.cpp",
- MAME_DIR .. "src/mame/video/cchasm.cpp",
MAME_DIR .. "src/mame/drivers/dlair.cpp",
MAME_DIR .. "src/mame/drivers/dlair2.cpp",
MAME_DIR .. "src/mame/drivers/embargo.cpp",
@@ -1776,8 +1774,6 @@ files {
MAME_DIR .. "src/mame/includes/firetrap.h",
MAME_DIR .. "src/mame/video/firetrap.cpp",
MAME_DIR .. "src/mame/drivers/funkyjet.cpp",
- MAME_DIR .. "src/mame/includes/funkyjet.h",
- MAME_DIR .. "src/mame/video/funkyjet.cpp",
MAME_DIR .. "src/mame/drivers/karnov.cpp",
MAME_DIR .. "src/mame/includes/karnov.h",
MAME_DIR .. "src/mame/video/karnov.cpp",
@@ -1972,10 +1968,8 @@ files {
MAME_DIR .. "src/mame/audio/circus.cpp",
MAME_DIR .. "src/mame/video/circus.cpp",
MAME_DIR .. "src/mame/drivers/exidy.cpp",
- MAME_DIR .. "src/mame/includes/exidy.h",
MAME_DIR .. "src/mame/audio/exidy.cpp",
MAME_DIR .. "src/mame/audio/exidy.h",
- MAME_DIR .. "src/mame/video/exidy.cpp",
MAME_DIR .. "src/mame/drivers/exidy440.cpp",
MAME_DIR .. "src/mame/includes/exidy440.h",
MAME_DIR .. "src/mame/audio/exidy440.cpp",
@@ -2249,6 +2243,7 @@ files {
MAME_DIR .. "src/mame/drivers/redalert.cpp",
MAME_DIR .. "src/mame/includes/redalert.h",
MAME_DIR .. "src/mame/audio/redalert.cpp",
+ MAME_DIR .. "src/mame/audio/redalert.h",
MAME_DIR .. "src/mame/video/redalert.cpp",
MAME_DIR .. "src/mame/drivers/shisen.cpp",
MAME_DIR .. "src/mame/includes/shisen.h",
@@ -3833,8 +3828,6 @@ files {
MAME_DIR .. "src/mame/video/pin64.cpp",
MAME_DIR .. "src/mame/video/pin64.h",
MAME_DIR .. "src/mame/drivers/hanaawas.cpp",
- MAME_DIR .. "src/mame/includes/hanaawas.h",
- MAME_DIR .. "src/mame/video/hanaawas.cpp",
MAME_DIR .. "src/mame/drivers/jclub2.cpp",
MAME_DIR .. "src/mame/drivers/macs.cpp",
MAME_DIR .. "src/mame/drivers/seta.cpp",
@@ -5061,6 +5054,7 @@ files {
MAME_DIR .. "src/mame/includes/oneshot.h",
MAME_DIR .. "src/mame/video/oneshot.cpp",
MAME_DIR .. "src/mame/drivers/onetwo.cpp",
+ MAME_DIR .. "src/mame/drivers/opercoin.cpp",
MAME_DIR .. "src/mame/drivers/othello.cpp",
MAME_DIR .. "src/mame/drivers/pachifev.cpp",
MAME_DIR .. "src/mame/drivers/pasha2.cpp",
@@ -5141,8 +5135,6 @@ files {
MAME_DIR .. "src/mame/drivers/tapatune.cpp",
MAME_DIR .. "src/mame/drivers/tattack.cpp",
MAME_DIR .. "src/mame/drivers/taxidriv.cpp",
- MAME_DIR .. "src/mame/includes/taxidriv.h",
- MAME_DIR .. "src/mame/video/taxidriv.cpp",
MAME_DIR .. "src/mame/drivers/teamjocs.cpp",
MAME_DIR .. "src/mame/drivers/tecnodar.cpp",
MAME_DIR .. "src/mame/drivers/thayers.cpp",
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 345ca85fc79..bc09c366f15 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -692,6 +692,7 @@ MACHINES["SEGA_SCU"] = true
MACHINES["SMPC"] = true
MACHINES["SPG2XX"] = true
MACHINES["SPG290"] = true
+MACHINES["SPISDCARD"] = true
MACHINES["STVCD"] = true
MACHINES["SUN4C_MMU"] = true
MACHINES["SWTPC8212"] = true
@@ -729,6 +730,7 @@ MACHINES["TTL7474"] = true
MACHINES["TUBE"] = true
MACHINES["UCB1200"] = true
MACHINES["UPD1990A"] = true
+MACHINES["UPD4991A"] = true
--MACHINES["UPD4992"] = true
MACHINES["UPD4701"] = true
MACHINES["UPD7001"] = true
@@ -3123,6 +3125,12 @@ files {
MAME_DIR .. "src/mame/machine/pc9801_cd.h",
MAME_DIR .. "src/mame/machine/pc9801_memsw.cpp",
MAME_DIR .. "src/mame/machine/pc9801_memsw.h",
+ MAME_DIR .. "src/mame/drivers/pc98ha.cpp",
+ MAME_DIR .. "src/mame/includes/pc98ha.h",
+ MAME_DIR .. "src/mame/drivers/pc9801_epson.cpp",
+ MAME_DIR .. "src/mame/includes/pc9801_epson.h",
+ MAME_DIR .. "src/mame/drivers/pc9821.cpp",
+ MAME_DIR .. "src/mame/includes/pc9821.h",
MAME_DIR .. "src/mame/drivers/tk80bs.cpp",
}
@@ -4426,6 +4434,8 @@ files {
MAME_DIR .. "src/mame/drivers/ymmu50.cpp",
MAME_DIR .. "src/mame/drivers/ymmu80.cpp",
MAME_DIR .. "src/mame/drivers/ymmu100.cpp",
+ MAME_DIR .. "src/mame/drivers/ympsr16.cpp",
+ MAME_DIR .. "src/mame/drivers/ympsr40.cpp",
MAME_DIR .. "src/mame/drivers/ympsr60.cpp",
MAME_DIR .. "src/mame/drivers/ympsr340.cpp",
MAME_DIR .. "src/mame/drivers/ymsy35.cpp",
@@ -4563,6 +4573,7 @@ files {
MAME_DIR .. "src/mame/drivers/gem_rp.cpp",
MAME_DIR .. "src/mame/drivers/gigatron.cpp",
MAME_DIR .. "src/mame/drivers/gimix.cpp",
+ MAME_DIR .. "src/mame/drivers/gm1000.cpp",
MAME_DIR .. "src/mame/drivers/gnat10.cpp",
MAME_DIR .. "src/mame/drivers/goupil.cpp",
MAME_DIR .. "src/mame/drivers/grfd2301.cpp",
diff --git a/src/devices/bus/a2bus/a2diskiing.h b/src/devices/bus/a2bus/a2diskiing.h
index 94025b0854f..a3b07e78063 100644
--- a/src/devices/bus/a2bus/a2diskiing.h
+++ b/src/devices/bus/a2bus/a2diskiing.h
@@ -14,9 +14,13 @@
#pragma once
#include "a2bus.h"
+#include "a2diskii.h"
+
+#include "machine/wozfdc.h"
#include "imagedev/floppy.h"
+
#include "formats/flopimg.h"
-#include "machine/wozfdc.h"
+
//**************************************************************************
// TYPE DEFINITIONS
@@ -54,6 +58,8 @@ class a2bus_diskiing_device: public diskiing_device
{
public:
a2bus_diskiing_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ static auto parent_rom_device_type() { return &A2BUS_DISKII; }
};
class a2bus_diskiing13_device: public diskiing_device
diff --git a/src/devices/bus/a2bus/a2sd.cpp b/src/devices/bus/a2bus/a2sd.cpp
new file mode 100644
index 00000000000..7a5208e473f
--- /dev/null
+++ b/src/devices/bus/a2bus/a2sd.cpp
@@ -0,0 +1,280 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+/*********************************************************************
+
+ a2sd.cpp
+
+ Implementation of the AppleIISD card by Florian Reitz
+ https://github.com/freitz85/AppleIISd
+
+ AppleIISD has a Xilinx FPGA which implements a minimally hardware
+ assisted SPI interface, and the SD card is thus driven in SPI
+ mode rather than SD.
+
+ The SPI controller is fixed to SPI Mode 3 only.
+ (shift on falling CLK edges, shift-then-latch).
+
+ Firmware is contained in an Atmel 28C64B parallel EEPROM, which
+ has a Flash-style command set.
+
+*********************************************************************/
+
+#include "emu.h"
+#include "a2sd.h"
+
+#define LOG_GENERAL (1U << 0)
+#define LOG_SPI (1U << 1)
+
+//#define VERBOSE (LOG_COMMAND)
+#define LOG_OUTPUT_FUNC osd_printf_info
+
+#include "logmacro.h"
+
+/***************************************************************************
+ PARAMETERS
+***************************************************************************/
+
+static constexpr u8 C0N1_ECE = 0x04; // external clock: toggles between 500 kHz internal clock and 1/2 of the 7M A2 bus clock
+static constexpr u8 C0N1_FRX = 0x10; // fast recieve: when enabled, both reads and writes of the SPI data register start a shift cycle
+[[maybe_unused]] static constexpr u8 C0N1_BSY = 0x20;
+static constexpr u8 C0N1_TC = 0x80; // SPI transfer complete
+
+static constexpr u8 C0N3_CD = 0x40; // card detect
+static constexpr u8 C0N3_BIT_SS = 7;
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(A2BUS_A2SD, a2bus_a2sd_device, "a2sd", "Apple II SD Card")
+
+ROM_START( a2sd )
+ ROM_REGION(0x2000, "flash", ROMREGION_ERASE00)
+ ROM_LOAD( "appleiisd.bin", 0x000000, 0x000800, CRC(e82eea8a) SHA1(7e0acef01e622eeed6f8e87893d07c701bbef016) )
+ROM_END
+
+/***************************************************************************
+ FUNCTION PROTOTYPES
+***************************************************************************/
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+void a2bus_a2sd_device::device_add_mconfig(machine_config &config)
+{
+ AT28C64B(config, m_flash, 0);
+
+ SPI_SDCARD(config, m_sdcard, 0);
+ m_sdcard->spi_miso_callback().set(FUNC(a2bus_a2sd_device::spi_miso_w));
+}
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const tiny_rom_entry *a2bus_a2sd_device::device_rom_region() const
+{
+ return ROM_NAME( a2sd );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+a2bus_a2sd_device::a2bus_a2sd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, type, tag, owner, clock),
+ device_a2bus_card_interface(mconfig, *this),
+ m_flash(*this, "flash"),
+ m_sdcard(*this, "sdcard"),
+ m_datain(0), m_in_latch(0), m_out_latch(0), m_c0n1(0), m_c0n3(0x80), m_in_bit(0), m_shift_count(0)
+{
+}
+
+a2bus_a2sd_device::a2bus_a2sd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ a2bus_a2sd_device(mconfig, A2BUS_A2SD, tag, owner, clock)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void a2bus_a2sd_device::device_start()
+{
+ m_shift_timer = timer_alloc(0);
+
+ save_item(NAME(m_datain));
+ save_item(NAME(m_in_latch));
+ save_item(NAME(m_out_latch));
+ save_item(NAME(m_c0n1));
+ save_item(NAME(m_c0n3));
+ save_item(NAME(m_in_bit));
+ save_item(NAME(m_shift_count));
+}
+
+void a2bus_a2sd_device::device_reset()
+{
+ m_shift_timer->adjust(attotime::never);
+ m_shift_count = 0;
+ m_sdcard->spi_clock_w(CLEAR_LINE);
+}
+
+void a2bus_a2sd_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ LOGMASKED(LOG_SPI, ">>>>>>> SHIFT %d (%c)\n", m_shift_count, (m_shift_count & 1) ? 'L' : 'S');
+ if (!(m_shift_count & 1))
+ {
+ if (m_shift_count < 16)
+ {
+ m_out_latch <<= 1;
+ }
+ m_in_latch <<= 1;
+ m_sdcard->spi_mosi_w(BIT(m_out_latch, 7));
+ m_sdcard->spi_clock_w(CLEAR_LINE);
+ }
+ else
+ {
+ m_in_latch &= ~0x01;
+ m_in_latch |= m_in_bit;
+ m_sdcard->spi_clock_w(ASSERT_LINE);
+
+ if (m_shift_count == 1)
+ {
+ m_datain = m_in_latch;
+ LOGMASKED(LOG_SPI, "SPI: got %02x (in latch %02x)\n", m_datain, m_in_latch);
+ }
+ }
+
+ m_shift_count--;
+ if (m_shift_count == 0)
+ {
+ m_shift_timer->adjust(attotime::never);
+ m_c0n1 |= C0N1_TC; // set TC
+ }
+}
+
+/*-------------------------------------------------
+ read_c0nx - called for reads from this card's c0nx space
+-------------------------------------------------*/
+
+u8 a2bus_a2sd_device::read_c0nx(u8 offset)
+{
+ switch (offset)
+ {
+ case 0:
+ m_c0n1 &= ~C0N1_TC; // clear TC
+ // if FRX is set, both reads and writes trigger a shift cycle
+ if (m_c0n1 & C0N1_FRX)
+ {
+ m_c0n1 &= ~C0N1_TC; // clear TC
+ m_shift_count = 16;
+ m_out_latch = 0xff;
+
+ if (m_c0n1 & C0N1_ECE)
+ {
+ m_shift_timer->adjust(attotime::from_hz(14.318181_MHz_XTAL / 4), 0, attotime::from_hz(14.318181_MHz_XTAL / 4));
+ }
+ else
+ {
+ m_shift_timer->adjust(attotime::from_hz(500_kHz_XTAL), 0, attotime::from_hz(500_kHz_XTAL));
+ }
+ }
+ return m_datain;
+
+ case 1:
+ return m_c0n1;
+
+ case 2:
+ return 0;
+
+ case 3:
+ m_c0n3 &= ~C0N3_CD;
+ m_c0n3 |= m_sdcard->get_card_present() ? 0 : C0N3_CD; // bit is set if no card is present
+ return m_c0n3;
+ }
+ return 0xff;
+}
+
+
+/*-------------------------------------------------
+ write_c0nx - called for writes to this card's c0nx space
+-------------------------------------------------*/
+
+void a2bus_a2sd_device::write_c0nx(u8 offset, u8 data)
+{
+ switch (offset)
+ {
+ case 0:
+ if (m_shift_count)
+ {
+ return;
+ }
+ LOGMASKED(LOG_SPI, "SPI sending %02x\n", data);
+ m_out_latch = data;
+ m_sdcard->spi_mosi_w(BIT(m_out_latch, 7));
+ m_c0n1 &= ~C0N1_TC; // clear TC
+ m_shift_count = 16;
+ // if ECE is set, clock is 3.58 MHz from the A2 bus, otherwise internally generated 500 kHz
+ if (m_c0n1 & C0N1_ECE)
+ {
+ m_shift_timer->adjust(attotime::from_hz(14.318181_MHz_XTAL / 4), 0, attotime::from_hz(14.318181_MHz_XTAL/4));
+ }
+ else
+ {
+ m_shift_timer->adjust(attotime::from_hz(500_kHz_XTAL), 0, attotime::from_hz(500_kHz_XTAL));
+ }
+ break;
+
+ case 1:
+ m_c0n1 &= 0xea;
+ m_c0n1 |= (data & 0x15);
+ break;
+
+ case 2:
+ break;
+
+ case 3:
+ m_c0n3 &= 0x9f;
+ m_c0n3 |= (data & 0x91);
+
+ m_sdcard->spi_ss_w(BIT(data, C0N3_BIT_SS));
+ LOGMASKED(LOG_GENERAL, "/SS is %x\n", BIT(data, C0N3_BIT_SS));
+ break;
+
+ default:
+ logerror("a2sd: write %02x to c0n%x (%s)\n", data, offset, machine().describe_context().c_str());
+ break;
+ }
+}
+
+/*-------------------------------------------------
+ read_cnxx - called for reads from this card's cnxx space
+-------------------------------------------------*/
+
+u8 a2bus_a2sd_device::read_cnxx(u8 offset)
+{
+ // slot image at 0
+ return m_flash->read(offset);
+}
+
+void a2bus_a2sd_device::write_cnxx(u8 offset, u8 data)
+{
+ m_flash->write(offset, data);
+}
+
+/*-------------------------------------------------
+ read_c800 - called for reads from this card's c800 space
+-------------------------------------------------*/
+
+u8 a2bus_a2sd_device::read_c800(u16 offset)
+{
+ return m_flash->read(offset + 0x100);
+}
+
+/*-------------------------------------------------
+ write_c800 - called for writes to this card's c800 space
+-------------------------------------------------*/
+void a2bus_a2sd_device::write_c800(u16 offset, u8 data)
+{
+ m_flash->write(offset + 0x100, data);
+}
diff --git a/src/devices/bus/a2bus/a2sd.h b/src/devices/bus/a2bus/a2sd.h
new file mode 100644
index 00000000000..c4d8b4c8f02
--- /dev/null
+++ b/src/devices/bus/a2bus/a2sd.h
@@ -0,0 +1,67 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+/*********************************************************************
+
+ a2sd.h
+
+ Implementation of the AppleIISD card
+
+*********************************************************************/
+
+#ifndef MAME_BUS_A2BUS_A2SD_H
+#define MAME_BUS_A2BUS_A2SD_H
+
+#pragma once
+
+#include "a2bus.h"
+#include "machine/at28c64b.h"
+#include "machine/spi_sdcard.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class a2bus_a2sd_device:
+ public device_t,
+ public device_a2bus_card_interface
+{
+public:
+ // construction/destruction
+ a2bus_a2sd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ a2bus_a2sd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ // overrides of standard a2bus slot functions
+ virtual u8 read_c0nx(u8 offset) override;
+ virtual void write_c0nx(u8 offset, u8 data) override;
+ virtual u8 read_cnxx(u8 offset) override;
+ virtual void write_cnxx(u8 offset, u8 data) override;
+ virtual u8 read_c800(uint16_t offset) override;
+ virtual void write_c800(uint16_t offset, u8 data) override;
+
+ // SPI 4-wire interface
+ WRITE_LINE_MEMBER(spi_miso_w) { m_in_bit = state; }
+
+private:
+ required_device<at28c64b_device> m_flash;
+ required_device<spi_sdcard_device> m_sdcard;
+
+ u8 m_datain, m_in_latch, m_out_latch;
+ u8 m_c0n1, m_c0n3;
+ int m_in_bit;
+
+ int m_shift_count;
+ emu_timer *m_shift_timer;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(A2BUS_A2SD, a2bus_a2sd_device)
+
+#endif // MAME_BUS_A2BUS_A2SD_H
diff --git a/src/devices/bus/a2bus/grappler.h b/src/devices/bus/a2bus/grappler.h
index 0d98a7867e1..f16a4edc28d 100644
--- a/src/devices/bus/a2bus/grappler.h
+++ b/src/devices/bus/a2bus/grappler.h
@@ -58,6 +58,12 @@
#include "cpu/mcs48/mcs48.h"
+DECLARE_DEVICE_TYPE(A2BUS_GRAPPLER, a2bus_grappler_device)
+DECLARE_DEVICE_TYPE(A2BUS_GRAPPLERPLUS, a2bus_grapplerplus_device)
+DECLARE_DEVICE_TYPE(A2BUS_BUFGRAPPLERPLUS, a2bus_buf_grapplerplus_device)
+DECLARE_DEVICE_TYPE(A2BUS_BUFGRAPPLERPLUSA, a2bus_buf_grapplerplus_reva_device)
+
+
class a2bus_grappler_device_base : public device_t, public device_a2bus_card_interface
{
public:
@@ -282,15 +288,11 @@ class a2bus_buf_grapplerplus_reva_device : public a2bus_buf_grapplerplus_device
public:
a2bus_buf_grapplerplus_reva_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
+ static auto parent_rom_device_type() { return &A2BUS_BUFGRAPPLERPLUS; }
+
protected:
// device_t implementation
virtual void device_add_mconfig(machine_config &config) override;
};
-
-DECLARE_DEVICE_TYPE(A2BUS_GRAPPLER, a2bus_grappler_device)
-DECLARE_DEVICE_TYPE(A2BUS_GRAPPLERPLUS, a2bus_grapplerplus_device)
-DECLARE_DEVICE_TYPE(A2BUS_BUFGRAPPLERPLUS, a2bus_buf_grapplerplus_device)
-DECLARE_DEVICE_TYPE(A2BUS_BUFGRAPPLERPLUSA, a2bus_buf_grapplerplus_reva_device)
-
#endif // MAME_BUS_A2BUS_GRAPPLERPLUS_H
diff --git a/src/devices/bus/a2bus/q68.h b/src/devices/bus/a2bus/q68.h
index c52c9567bc9..34664a284f0 100644
--- a/src/devices/bus/a2bus/q68.h
+++ b/src/devices/bus/a2bus/q68.h
@@ -15,6 +15,15 @@
#include "a2bus.h"
+
+//**************************************************************************
+// DEVICE TYPE DECLARATION
+//**************************************************************************
+
+DECLARE_DEVICE_TYPE(A2BUS_Q68, a2bus_q68_device)
+DECLARE_DEVICE_TYPE(A2BUS_Q68PLUS, a2bus_q68plus_device)
+
+
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -61,6 +70,8 @@ class a2bus_q68plus_device : public a2bus_68k_device
public:
a2bus_q68plus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ static auto parent_rom_device_type() { return &A2BUS_Q68; }
+
protected:
virtual void device_add_mconfig(machine_config &config) override;
@@ -68,9 +79,4 @@ private:
void m68008_mem(address_map &map);
};
-
-// device type definition
-DECLARE_DEVICE_TYPE(A2BUS_Q68, a2bus_q68_device)
-DECLARE_DEVICE_TYPE(A2BUS_Q68PLUS, a2bus_q68plus_device)
-
#endif // MAME_BUS_A2BUS_Q68_H
diff --git a/src/devices/bus/a7800/a78_slot.cpp b/src/devices/bus/a7800/a78_slot.cpp
index 4a7392fc3f6..d55412058d1 100644
--- a/src/devices/bus/a7800/a78_slot.cpp
+++ b/src/devices/bus/a7800/a78_slot.cpp
@@ -491,7 +491,7 @@ image_verify_result a78_cart_slot_device::verify_header(char *header)
if (strncmp(magic, header + 1, 9))
{
logerror("Not a valid A7800 image\n");
- seterror(IMAGE_ERROR_UNSPECIFIED, "File is not a valid A7800 image");
+ seterror(image_error::INVALIDIMAGE, "File is not a valid A7800 image");
return image_verify_result::FAIL;
}
diff --git a/src/devices/bus/acorn/system/8k.cpp b/src/devices/bus/acorn/system/8k.cpp
index ecbd69c930f..b2e1c7bb3d2 100644
--- a/src/devices/bus/acorn/system/8k.cpp
+++ b/src/devices/bus/acorn/system/8k.cpp
@@ -144,7 +144,7 @@ image_init_result acorn_8k_device::load_rom(device_image_interface &image, gener
// socket accepts 2K and 4K ROM only
if (size != 0x0800 && size != 0x1000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only 2K/4K is supported");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid size: Only 2K/4K is supported");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/amiga/keyboard/a1200.cpp b/src/devices/bus/amiga/keyboard/a1200.cpp
index e9107fbe5be..4877903d73a 100644
--- a/src/devices/bus/amiga/keyboard/a1200.cpp
+++ b/src/devices/bus/amiga/keyboard/a1200.cpp
@@ -57,7 +57,7 @@
// GLOBAL VARIABLES
//**************************************************************************
-DEFINE_DEVICE_TYPE_NS(A1200_KBD, bus::amiga::keyboard, a1200_kbd_device, "a1200kbd_rb", "Amiga 1200 Keyboard Rev B")
+DEFINE_DEVICE_TYPE(A1200_KBD, bus::amiga::keyboard::a1200_kbd_device, "a1200kbd_rb", "Amiga 1200 Keyboard Rev B")
diff --git a/src/devices/bus/amiga/keyboard/a2000.cpp b/src/devices/bus/amiga/keyboard/a2000.cpp
index b9728ca7f26..59aac50b652 100644
--- a/src/devices/bus/amiga/keyboard/a2000.cpp
+++ b/src/devices/bus/amiga/keyboard/a2000.cpp
@@ -70,21 +70,147 @@
#define LOGSCAN(...) LOGMASKED(LOG_SCAN, __VA_ARGS__)
+namespace {
+
//**************************************************************************
-// GLOBAL VARIABLES
+// ROM DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE_NS(A2000_KBD_G80_US, bus::amiga::keyboard, a2000_kbd_g80_us_device, "a2000kbd_g80_us", "Amiga 2000 Keyboard (Cherry - U.S./Canada)")
-DEFINE_DEVICE_TYPE_NS(A2000_KBD_G80_DE, bus::amiga::keyboard, a2000_kbd_g80_de_device, "a2000kbd_g80_de", "Amiga 2000 Keyboard (Cherry - Germany/Austria)")
-DEFINE_DEVICE_TYPE_NS(A2000_KBD_G80_SE, bus::amiga::keyboard, a2000_kbd_g80_se_device, "a2000kbd_g80_se", "Amiga 2000 Keyboard (Cherry - Sweden/Finland)")
-DEFINE_DEVICE_TYPE_NS(A2000_KBD_G80_DK, bus::amiga::keyboard, a2000_kbd_g80_dk_device, "a2000kbd_g80_dk", "Amiga 2000 Keyboard (Cherry - Denmark)")
-DEFINE_DEVICE_TYPE_NS(A2000_KBD_G80_GB, bus::amiga::keyboard, a2000_kbd_g80_gb_device, "a2000kbd_g80_gb", "Amiga 2000 Keyboard (Cherry - UK)")
+ROM_START(a2000kbd)
+ ROM_REGION(0x0800, "mcu", 0)
+ ROM_LOAD("467.u4", 0x0000, 0x0800, CRC(fb92a773) SHA1(e787dc05de227f30a47ac5b9ee7a355c2e9e693b))
+ROM_END
+//**************************************************************************
+// KEYBOARD BASE CLASSES
+//**************************************************************************
-namespace bus::amiga::keyboard {
+class a2000_kbd_g80_device : public device_t, public device_amiga_keyboard_interface
+{
+public:
+ // from host
+ virtual DECLARE_WRITE_LINE_MEMBER(kdat_w) override
+ {
+ if (bool(state) != m_host_kdat)
+ {
+ LOGCOMM("host DATA %u -> %u\n", m_host_kdat ? 1 : 0, state ? 1 : 0);
+ m_host_kdat = bool(state);
+ if (m_mcu_kdat)
+ m_mcu->set_input_line(MCS48_INPUT_IRQ, state ? CLEAR_LINE : ASSERT_LINE);
+ }
+ }
-namespace {
+protected:
+ // construction/destruction
+ a2000_kbd_g80_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_amiga_keyboard_interface(mconfig, *this)
+ , m_rows(*this, "ROW%u", 0U)
+ , m_mcu(*this, "u1")
+ , m_led_kbd_caps(*this, "led_kbd_caps")
+ {
+ }
+
+ // MCU I/O
+ u8 mcu_bus_r(offs_t offset)
+ {
+ // when jumpered for external ROM, offset latched by U2 is 0x60 + (row << 1)
+ uint8_t result(0U);
+ for (unsigned i = 0U; m_rows.size() > i; ++i)
+ {
+ if (BIT(m_row_drive, i))
+ result |= uint8_t(m_rows[i]->read());
+ }
+ LOGSCAN("read bus: offset = %02X, row drive = %04X\n, result = %02X", offset, m_row_drive, result);
+ return result;
+ }
+
+ void mcu_p1_w(u8 data)
+ {
+ m_row_drive = (m_row_drive & 0x1f00U) | uint16_t(data);
+ }
+
+ void mcu_p2_w(u8 data)
+ {
+ m_row_drive = (m_row_drive & 0x00ffU) | (uint16_t(data & 0x1fU) << 8);
+
+ m_led_kbd_caps = BIT(~data, 5);
+
+ if (bool(BIT(data, 6) != m_mcu_kdat))
+ {
+ m_mcu_kdat = BIT(data, 6);
+ LOGCOMM("keyboard DATA %u -> %u\n", m_mcu_kdat ? 0U : 1U, m_mcu_kdat ? 1U : 0U);
+ m_host->kdat_w(m_mcu_kdat ? 1 : 0);
+ if (m_host_kdat)
+ m_mcu->set_input_line(MCS48_INPUT_IRQ, m_mcu_kdat ? CLEAR_LINE : ASSERT_LINE);
+ }
+
+ if (bool(BIT(data, 7) != m_mcu_kclk))
+ {
+ m_mcu_kclk = BIT(data, 7);
+ LOGCOMM("keyboard CLOCK %u -> %u\n", m_mcu_kclk ? 0U : 1U, m_mcu_kclk ? 1U : 0U);
+ m_host->kclk_w(m_mcu_kclk ? 1 : 0);
+ }
+ }
+
+ virtual const tiny_rom_entry *device_rom_region() const override
+ {
+ return ROM_NAME(a2000kbd);
+ }
+
+ virtual void device_add_mconfig(machine_config &config) override
+ {
+ auto &mcu(I8039(config, "u1", 6_MHz_XTAL));
+ mcu.set_addrmap(AS_PROGRAM, &a2000_kbd_g80_device::program_map);
+ mcu.set_addrmap(AS_IO, &a2000_kbd_g80_device::ext_map);
+ mcu.p1_out_cb().set(FUNC(a2000_kbd_g80_device::mcu_p1_w));
+ mcu.p2_out_cb().set(FUNC(a2000_kbd_g80_device::mcu_p2_w));
+ mcu.bus_in_cb().set(FUNC(a2000_kbd_g80_device::mcu_bus_r));
+ mcu.t0_in_cb().set_constant(1);
+ mcu.t1_in_cb().set([this] () { return m_mcu_kclk ? 1 : 0; });
+ }
+
+ virtual void device_start() override
+ {
+ m_led_kbd_caps.resolve();
+
+ save_item(NAME(m_row_drive));
+ save_item(NAME(m_host_kdat));
+ save_item(NAME(m_mcu_kdat));
+ save_item(NAME(m_mcu_kclk));
+
+ m_row_drive = 0U;
+ m_host_kdat = true;
+ m_mcu_kdat = true;
+ m_mcu_kclk = true;
+ }
+
+ void program_map(address_map &map)
+ {
+ map.global_mask(0x07ff);
+ map(0x0000, 0x07ff).rom().region("mcu", 0);
+ }
+
+ void ext_map(address_map &map)
+ {
+ map.global_mask(0x00ff);
+ map(0x0000, 0x00ff).r(FUNC(a2000_kbd_g80_device::mcu_bus_r));
+ }
+
+private:
+ required_ioport_array<13> m_rows;
+ required_device<cpu_device> m_mcu;
+ output_finder<> m_led_kbd_caps;
+
+ uint16_t m_row_drive = 0U;
+ bool m_host_kdat = true, m_mcu_kdat = true, m_mcu_kclk = true;
+};
+
+
+//**************************************************************************
+// COMMON PORT DEFINITIONS
+//**************************************************************************
INPUT_PORTS_START(a2000_common_keyboard)
PORT_START("ROW0")
@@ -169,6 +295,11 @@ INPUT_PORTS_START(a2000_common_keyboard)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
INPUT_PORTS_END
+
+//**************************************************************************
+// SPECIFIC KEYBOARD PORT DEFINITIONS
+//**************************************************************************
+
INPUT_PORTS_START(a2000_us_keyboard)
PORT_INCLUDE(a2000_common_keyboard)
@@ -476,197 +607,107 @@ INPUT_PORTS_START(a2000_gb_keyboard)
INPUT_PORTS_END
-ROM_START(a2000kbd)
- ROM_REGION(0x0800, "mcu", 0)
- ROM_LOAD("467.u4", 0x0000, 0x0800, CRC(fb92a773) SHA1(e787dc05de227f30a47ac5b9ee7a355c2e9e693b))
-ROM_END
-
-} // anonymous namespace
-
-
-
//**************************************************************************
-// LIVE DEVICE
+// SPECIFIC KEYBOARD CLASSES
//**************************************************************************
-// ======================> a2000_kbd_g80_device
-
-a2000_kbd_g80_device::a2000_kbd_g80_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, type, tag, owner, clock)
- , device_amiga_keyboard_interface(mconfig, *this)
- , m_rows(*this, "ROW%u", 0U)
- , m_mcu(*this, "u1")
- , m_led_kbd_caps(*this, "led_kbd_caps")
- , m_row_drive(0U)
- , m_host_kdat(true)
- , m_mcu_kdat(true)
- , m_mcu_kclk(true)
-{
-}
-
-WRITE_LINE_MEMBER(a2000_kbd_g80_device::kdat_w)
+class a2000_kbd_g80_us_device : public a2000_kbd_g80_device
{
- if (bool(state) != m_host_kdat)
+public:
+ a2000_kbd_g80_us_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_US, tag, owner, clock)
{
- LOGCOMM("host DATA %u -> %u\n", m_host_kdat ? 1 : 0, state ? 1 : 0);
- m_host_kdat = bool(state);
- if (m_mcu_kdat)
- m_mcu->set_input_line(MCS48_INPUT_IRQ, state ? CLEAR_LINE : ASSERT_LINE);
}
-}
-u8 a2000_kbd_g80_device::mcu_bus_r(offs_t offset)
-{
- // when jumpered for external ROM, offset latched by U2 is 0x60 + (row << 1)
- uint8_t result(0U);
- for (unsigned i = 0U; m_rows.size() > i; ++i)
+protected:
+ virtual ioport_constructor device_input_ports() const override
{
- if (BIT(m_row_drive, i))
- result |= uint8_t(m_rows[i]->read());
+ return INPUT_PORTS_NAME(a2000_us_keyboard);
}
- LOGSCAN("read bus: offset = %02X, row drive = %04X\n, result = %02X", offset, m_row_drive, result);
- return result;
-}
+};
-void a2000_kbd_g80_device::mcu_p1_w(u8 data)
-{
- m_row_drive = (m_row_drive & 0x1f00U) | uint16_t(data);
-}
-void a2000_kbd_g80_device::mcu_p2_w(u8 data)
+class a2000_kbd_g80_de_device : public a2000_kbd_g80_device
{
- m_row_drive = (m_row_drive & 0x00ffU) | (uint16_t(data & 0x1fU) << 8);
-
- m_led_kbd_caps = BIT(~data, 5);
-
- if (bool(BIT(data, 6) != m_mcu_kdat))
+public:
+ a2000_kbd_g80_de_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_DE, tag, owner, clock)
{
- m_mcu_kdat = BIT(data, 6);
- LOGCOMM("keyboard DATA %u -> %u\n", m_mcu_kdat ? 0U : 1U, m_mcu_kdat ? 1U : 0U);
- m_host->kdat_w(m_mcu_kdat ? 1 : 0);
- if (m_host_kdat)
- m_mcu->set_input_line(MCS48_INPUT_IRQ, m_mcu_kdat ? CLEAR_LINE : ASSERT_LINE);
}
- if (bool(BIT(data, 7) != m_mcu_kclk))
+ static auto parent_rom_device_type() { return &A2000_KBD_G80_US; }
+
+protected:
+ virtual ioport_constructor device_input_ports() const override
{
- m_mcu_kclk = BIT(data, 7);
- LOGCOMM("keyboard CLOCK %u -> %u\n", m_mcu_kclk ? 0U : 1U, m_mcu_kclk ? 1U : 0U);
- m_host->kclk_w(m_mcu_kclk ? 1 : 0);
+ return INPUT_PORTS_NAME(a2000_de_keyboard);
}
-}
-
-tiny_rom_entry const *a2000_kbd_g80_device::device_rom_region() const
-{
- return ROM_NAME(a2000kbd);
-}
-
-void a2000_kbd_g80_device::device_add_mconfig(machine_config &config)
-{
- auto &mcu(I8039(config, "u1", 6_MHz_XTAL));
- mcu.set_addrmap(AS_PROGRAM, &a2000_kbd_g80_device::program_map);
- mcu.set_addrmap(AS_IO, &a2000_kbd_g80_device::ext_map);
- mcu.p1_out_cb().set(FUNC(a2000_kbd_g80_device::mcu_p1_w));
- mcu.p2_out_cb().set(FUNC(a2000_kbd_g80_device::mcu_p2_w));
- mcu.bus_in_cb().set(FUNC(a2000_kbd_g80_device::mcu_bus_r));
- mcu.t0_in_cb().set_constant(1);
- mcu.t1_in_cb().set([this] () { return m_mcu_kclk ? 1 : 0; });
-}
-
-void a2000_kbd_g80_device::device_start()
-{
- m_led_kbd_caps.resolve();
-
- save_item(NAME(m_row_drive));
- save_item(NAME(m_host_kdat));
- save_item(NAME(m_mcu_kdat));
- save_item(NAME(m_mcu_kclk));
-
- m_row_drive = 0U;
- m_host_kdat = true;
- m_mcu_kdat = true;
- m_mcu_kclk = true;
-}
-
-void a2000_kbd_g80_device::device_reset()
-{
-}
-
-void a2000_kbd_g80_device::program_map(address_map &map)
-{
- map.global_mask(0x07ff);
- map(0x0000, 0x07ff).rom().region("mcu", 0);
-}
-
-void a2000_kbd_g80_device::ext_map(address_map &map)
-{
- map.global_mask(0x00ff);
- map(0x0000, 0x00ff).r(FUNC(a2000_kbd_g80_device::mcu_bus_r));
-}
-
+};
-// ======================> a2000_kbd_g80_us_device
-a2000_kbd_g80_us_device::a2000_kbd_g80_us_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
- : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_US, tag, owner, clock)
+class a2000_kbd_g80_se_device : public a2000_kbd_g80_device
{
-}
-
-ioport_constructor a2000_kbd_g80_us_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(a2000_us_keyboard);
-}
+public:
+ a2000_kbd_g80_se_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_SE, tag, owner, clock)
+ {
+ }
+ static auto parent_rom_device_type() { return &A2000_KBD_G80_US; }
-// ======================> a2000_kbd_g80_de_device
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(a2000_se_keyboard);
+ }
+};
-a2000_kbd_g80_de_device::a2000_kbd_g80_de_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
- : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_DE, tag, owner, clock)
-{
-}
-ioport_constructor a2000_kbd_g80_de_device::device_input_ports() const
+class a2000_kbd_g80_dk_device : public a2000_kbd_g80_device
{
- return INPUT_PORTS_NAME(a2000_de_keyboard);
-}
+public:
+ a2000_kbd_g80_dk_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_DK, tag, owner, clock)
+ {
+ }
+ static auto parent_rom_device_type() { return &A2000_KBD_G80_US; }
-// ======================> a2000_kbd_g80_se_device
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(a2000_dk_keyboard);
+ }
+};
-a2000_kbd_g80_se_device::a2000_kbd_g80_se_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
- : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_SE, tag, owner, clock)
-{
-}
-ioport_constructor a2000_kbd_g80_se_device::device_input_ports() const
+class a2000_kbd_g80_gb_device : public a2000_kbd_g80_device
{
- return INPUT_PORTS_NAME(a2000_se_keyboard);
-}
-
-
-// ======================> a2000_kbd_g80_dk_device
+public:
+ a2000_kbd_g80_gb_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_GB, tag, owner, clock)
+ {
+ }
-a2000_kbd_g80_dk_device::a2000_kbd_g80_dk_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
- : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_DK, tag, owner, clock)
-{
-}
+ static auto parent_rom_device_type() { return &A2000_KBD_G80_US; }
-ioport_constructor a2000_kbd_g80_dk_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(a2000_dk_keyboard);
-}
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(a2000_gb_keyboard);
+ }
+};
+} // anonymous namespace
-// ======================> a2000_kbd_g80_gb_device
-a2000_kbd_g80_gb_device::a2000_kbd_g80_gb_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
- : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_GB, tag, owner, clock)
-{
-}
-ioport_constructor a2000_kbd_g80_gb_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(a2000_gb_keyboard);
-}
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
-} // namespace bus::amiga::keyboard
+DEFINE_DEVICE_TYPE_PRIVATE(A2000_KBD_G80_US, device_amiga_keyboard_interface, a2000_kbd_g80_us_device, "a2000kbd_g80_us", "Amiga 2000 Keyboard (Cherry - U.S./Canada)")
+DEFINE_DEVICE_TYPE_PRIVATE(A2000_KBD_G80_DE, device_amiga_keyboard_interface, a2000_kbd_g80_de_device, "a2000kbd_g80_de", "Amiga 2000 Keyboard (Cherry - Germany/Austria)")
+DEFINE_DEVICE_TYPE_PRIVATE(A2000_KBD_G80_SE, device_amiga_keyboard_interface, a2000_kbd_g80_se_device, "a2000kbd_g80_se", "Amiga 2000 Keyboard (Cherry - Sweden/Finland)")
+DEFINE_DEVICE_TYPE_PRIVATE(A2000_KBD_G80_DK, device_amiga_keyboard_interface, a2000_kbd_g80_dk_device, "a2000kbd_g80_dk", "Amiga 2000 Keyboard (Cherry - Denmark)")
+DEFINE_DEVICE_TYPE_PRIVATE(A2000_KBD_G80_GB, device_amiga_keyboard_interface, a2000_kbd_g80_gb_device, "a2000kbd_g80_gb", "Amiga 2000 Keyboard (Cherry - UK)")
diff --git a/src/devices/bus/amiga/keyboard/a2000.h b/src/devices/bus/amiga/keyboard/a2000.h
index 7a710f6ad37..fa698853159 100644
--- a/src/devices/bus/amiga/keyboard/a2000.h
+++ b/src/devices/bus/amiga/keyboard/a2000.h
@@ -13,114 +13,14 @@
#include "keyboard.h"
-
-namespace bus::amiga::keyboard {
-
-//**************************************************************************
-// TYPE DECLARATIONS
-//**************************************************************************
-
-// ======================> a2000_kbd_g80_device
-
-class a2000_kbd_g80_device : public device_t, public device_amiga_keyboard_interface
-{
-public:
- // from host
- virtual DECLARE_WRITE_LINE_MEMBER(kdat_w) override;
-
-protected:
- // construction/destruction
- a2000_kbd_g80_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock);
-
- // MCU I/O
- u8 mcu_bus_r(offs_t offset);
- void mcu_p1_w(u8 data);
- void mcu_p2_w(u8 data);
-
- virtual const tiny_rom_entry *device_rom_region() const override;
- virtual void device_add_mconfig(machine_config &config) override;
-
- virtual void device_start() override;
- virtual void device_reset() override;
-
- void program_map(address_map &map);
- void ext_map(address_map &map);
-
-private:
- required_ioport_array<13> m_rows;
- required_device<cpu_device> m_mcu;
- output_finder<> m_led_kbd_caps;
-
- uint16_t m_row_drive;
- bool m_host_kdat, m_mcu_kdat, m_mcu_kclk;
-};
-
-// ======================> a2000_kbd_g80_us_device
-
-class a2000_kbd_g80_us_device : public a2000_kbd_g80_device
-{
-public:
- a2000_kbd_g80_us_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-// ======================> a2000_kbd_g80_de_device
-
-class a2000_kbd_g80_de_device : public a2000_kbd_g80_device
-{
-public:
- a2000_kbd_g80_de_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-// ======================> a2000_kbd_g80_se_device
-
-class a2000_kbd_g80_se_device : public a2000_kbd_g80_device
-{
-public:
- a2000_kbd_g80_se_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-// ======================> a2000_kbd_g80_dk_device
-
-class a2000_kbd_g80_dk_device : public a2000_kbd_g80_device
-{
-public:
- a2000_kbd_g80_dk_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-// ======================> a2000_kbd_g80_gb_device
-
-class a2000_kbd_g80_gb_device : public a2000_kbd_g80_device
-{
-public:
- a2000_kbd_g80_gb_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-} // namespace bus::amiga::keyboard
-
-
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
-DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_US, bus::amiga::keyboard, a2000_kbd_g80_us_device)
-DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_DE, bus::amiga::keyboard, a2000_kbd_g80_de_device)
-DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_SE, bus::amiga::keyboard, a2000_kbd_g80_se_device)
-DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_DK, bus::amiga::keyboard, a2000_kbd_g80_dk_device)
-DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_GB, bus::amiga::keyboard, a2000_kbd_g80_gb_device)
+DECLARE_DEVICE_TYPE(A2000_KBD_G80_US, device_amiga_keyboard_interface)
+DECLARE_DEVICE_TYPE(A2000_KBD_G80_DE, device_amiga_keyboard_interface)
+DECLARE_DEVICE_TYPE(A2000_KBD_G80_SE, device_amiga_keyboard_interface)
+DECLARE_DEVICE_TYPE(A2000_KBD_G80_DK, device_amiga_keyboard_interface)
+DECLARE_DEVICE_TYPE(A2000_KBD_G80_GB, device_amiga_keyboard_interface)
#endif // MAME_BUS_AMIGA_KEYBOARD_A2000_H
diff --git a/src/devices/bus/amiga/keyboard/mitsumi.cpp b/src/devices/bus/amiga/keyboard/mitsumi.cpp
index 1e0218ab5e0..a84c3f3743f 100644
--- a/src/devices/bus/amiga/keyboard/mitsumi.cpp
+++ b/src/devices/bus/amiga/keyboard/mitsumi.cpp
@@ -665,6 +665,8 @@ public:
: a500_keyboard_base(mconfig, A500_KBD_US, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_us); }
};
@@ -676,6 +678,8 @@ public:
: a500_keyboard_base(mconfig, A500_KBD_DE, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_de); }
};
@@ -687,6 +691,8 @@ public:
: a500_keyboard_base(mconfig, A500_KBD_FR, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_fr); }
};
@@ -698,6 +704,8 @@ public:
: a500_keyboard_base(mconfig, A500_KBD_IT, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_it); }
};
@@ -709,6 +717,8 @@ public:
: a500_keyboard_base(mconfig, A500_KBD_SE, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_se); }
};
@@ -720,6 +730,8 @@ public:
: a500_keyboard_base(mconfig, A500_KBD_ES, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_es); }
};
@@ -731,6 +743,8 @@ public:
: a500_keyboard_base(mconfig, A500_KBD_DK, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_dk); }
};
@@ -742,6 +756,8 @@ public:
: a500_keyboard_base(mconfig, A500_KBD_CH, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_ch); }
};
@@ -753,6 +769,8 @@ public:
: a500_keyboard_base(mconfig, A500_KBD_NO, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_no); }
};
@@ -764,6 +782,8 @@ public:
: a500_keyboard_base(mconfig, A500_KBD_GB, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_gb); }
};
@@ -780,6 +800,8 @@ public:
: a600_keyboard_base(mconfig, A600_KBD_US, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(compact_us); }
};
@@ -791,6 +813,8 @@ public:
: a600_keyboard_base(mconfig, A600_KBD_DE, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(compact_de); }
};
@@ -802,6 +826,8 @@ public:
: a600_keyboard_base(mconfig, A600_KBD_FR, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(compact_fr); }
};
@@ -813,6 +839,8 @@ public:
: a600_keyboard_base(mconfig, A600_KBD_IT, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(compact_it); }
};
@@ -824,6 +852,8 @@ public:
: a600_keyboard_base(mconfig, A600_KBD_SE, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(compact_se); }
};
@@ -835,6 +865,8 @@ public:
: a600_keyboard_base(mconfig, A600_KBD_ES, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(compact_es); }
};
@@ -846,6 +878,8 @@ public:
: a600_keyboard_base(mconfig, A600_KBD_DK, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(compact_dk); }
};
@@ -857,6 +891,8 @@ public:
: a600_keyboard_base(mconfig, A600_KBD_CH, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(compact_ch); }
};
@@ -868,6 +904,8 @@ public:
: a600_keyboard_base(mconfig, A600_KBD_NO, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(compact_no); }
};
@@ -879,6 +917,8 @@ public:
: a600_keyboard_base(mconfig, A600_KBD_GB, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(compact_gb); }
};
@@ -906,6 +946,8 @@ public:
: a1000_keyboard_base(mconfig, A1000_KBD_DE, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A1000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(a1000_de); }
};
@@ -917,6 +959,8 @@ public:
: a1000_keyboard_base(mconfig, A1000_KBD_FR, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A1000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(a1000_fr); }
};
@@ -928,6 +972,8 @@ public:
: a1000_keyboard_base(mconfig, A1000_KBD_IT, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A1000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(a1000_it); }
};
@@ -939,6 +985,8 @@ public:
: a1000_keyboard_base(mconfig, A1000_KBD_SE, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A1000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(a1000_se); }
};
@@ -950,6 +998,8 @@ public:
: a1000_keyboard_base(mconfig, A1000_KBD_DK, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A1000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(a1000_dk); }
};
@@ -961,6 +1011,8 @@ public:
: a1000_keyboard_base(mconfig, A1000_KBD_GB, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A1000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(a1000_gb); }
};
@@ -988,6 +1040,8 @@ public:
: mitsumi_watchdog_keyboard_base(mconfig, A2000_KBD_DE, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_de); }
};
@@ -999,6 +1053,8 @@ public:
: mitsumi_watchdog_keyboard_base(mconfig, A2000_KBD_FR, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_fr); }
};
@@ -1010,6 +1066,8 @@ public:
: mitsumi_watchdog_keyboard_base(mconfig, A2000_KBD_IT, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_it); }
};
@@ -1021,6 +1079,8 @@ public:
: mitsumi_watchdog_keyboard_base(mconfig, A2000_KBD_SE, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_se); }
};
@@ -1032,6 +1092,8 @@ public:
: mitsumi_watchdog_keyboard_base(mconfig, A2000_KBD_ES, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_es); }
};
@@ -1043,6 +1105,8 @@ public:
: mitsumi_watchdog_keyboard_base(mconfig, A2000_KBD_DK, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_dk); }
};
@@ -1054,6 +1118,8 @@ public:
: mitsumi_watchdog_keyboard_base(mconfig, A2000_KBD_CH, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_ch); }
};
@@ -1065,6 +1131,8 @@ public:
: mitsumi_watchdog_keyboard_base(mconfig, A2000_KBD_NO, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_no); }
};
@@ -1076,6 +1144,8 @@ public:
: mitsumi_watchdog_keyboard_base(mconfig, A2000_KBD_GB, tag, owner, clock)
{ }
+ static auto parent_rom_device_type() { return &A2000_KBD_US; }
+
protected:
virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fullsize_gb); }
};
diff --git a/src/devices/bus/amiga/zorro/a2052.cpp b/src/devices/bus/amiga/zorro/a2052.cpp
index 69b5f324d18..379a75270c5 100644
--- a/src/devices/bus/amiga/zorro/a2052.cpp
+++ b/src/devices/bus/amiga/zorro/a2052.cpp
@@ -19,7 +19,7 @@
// DEVICE DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE_NS(ZORRO_A2052, bus::amiga::zorro, a2052_device, "zorro_a2052", "CBM A2052 Fast Memory")
+DEFINE_DEVICE_TYPE(ZORRO_A2052, bus::amiga::zorro::a2052_device, "zorro_a2052", "CBM A2052 Fast Memory")
namespace bus::amiga::zorro {
diff --git a/src/devices/bus/amiga/zorro/a2058.cpp b/src/devices/bus/amiga/zorro/a2058.cpp
index 34a587454d8..26d5f393222 100644
--- a/src/devices/bus/amiga/zorro/a2058.cpp
+++ b/src/devices/bus/amiga/zorro/a2058.cpp
@@ -19,7 +19,7 @@
// DEVICE DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE_NS(ZORRO_A2058, bus::amiga::zorro, a2058_device, "zorro_a2058", "CBM A2058 Fast Memory")
+DEFINE_DEVICE_TYPE(ZORRO_A2058, bus::amiga::zorro::a2058_device, "zorro_a2058", "CBM A2058 Fast Memory")
namespace bus::amiga::zorro {
diff --git a/src/devices/bus/amiga/zorro/a2065.cpp b/src/devices/bus/amiga/zorro/a2065.cpp
index b99eb51ebfb..a76b289bb7f 100644
--- a/src/devices/bus/amiga/zorro/a2065.cpp
+++ b/src/devices/bus/amiga/zorro/a2065.cpp
@@ -24,7 +24,7 @@
// DEVICE DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE_NS(ZORRO_A2065, bus::amiga::zorro, a2065_device, "zorro_a2065", "CBM A2065 Ethernet Card")
+DEFINE_DEVICE_TYPE(ZORRO_A2065, bus::amiga::zorro::a2065_device, "zorro_a2065", "CBM A2065 Ethernet Card")
namespace bus::amiga::zorro {
diff --git a/src/devices/bus/amiga/zorro/a2232.cpp b/src/devices/bus/amiga/zorro/a2232.cpp
index 938b60ffb63..b9d6726bc7e 100644
--- a/src/devices/bus/amiga/zorro/a2232.cpp
+++ b/src/devices/bus/amiga/zorro/a2232.cpp
@@ -21,7 +21,7 @@
// DEVICE DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE_NS(ZORRO_A2232, bus::amiga::zorro, a2232_device, "zorro_a2232", "CBM A2232 Serial Card")
+DEFINE_DEVICE_TYPE(ZORRO_A2232, bus::amiga::zorro::a2232_device, "zorro_a2232", "CBM A2232 Serial Card")
namespace bus::amiga::zorro {
diff --git a/src/devices/bus/amiga/zorro/a590.cpp b/src/devices/bus/amiga/zorro/a590.cpp
index a956e845b90..3fe72c69a42 100644
--- a/src/devices/bus/amiga/zorro/a590.cpp
+++ b/src/devices/bus/amiga/zorro/a590.cpp
@@ -18,8 +18,8 @@
// DEVICE DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE_NS(ZORRO_A590, bus::amiga::zorro, a590_device, "zorro_a590", "CBM A590 HD Controller")
-DEFINE_DEVICE_TYPE_NS(ZORRO_A2091, bus::amiga::zorro, a2091_device, "zorro_a2091", "CBM A2091 HD Controller")
+DEFINE_DEVICE_TYPE(ZORRO_A590, bus::amiga::zorro::a590_device, "zorro_a590", "CBM A590 HD Controller")
+DEFINE_DEVICE_TYPE(ZORRO_A2091, bus::amiga::zorro::a2091_device, "zorro_a2091", "CBM A2091 HD Controller")
namespace bus::amiga::zorro {
diff --git a/src/devices/bus/amiga/zorro/action_replay.cpp b/src/devices/bus/amiga/zorro/action_replay.cpp
index 6fe65413709..9466305049d 100644
--- a/src/devices/bus/amiga/zorro/action_replay.cpp
+++ b/src/devices/bus/amiga/zorro/action_replay.cpp
@@ -22,9 +22,9 @@
// DEVICE DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE_NS(ZORRO_ACTION_REPLAY_MK1, bus::amiga::zorro, action_replay_mk1_device, "zorro_ar1", "Datel Action Replay MK-I")
-DEFINE_DEVICE_TYPE_NS(ZORRO_ACTION_REPLAY_MK2, bus::amiga::zorro, action_replay_mk2_device, "zorro_ar2", "Datel Action Replay MK-II")
-DEFINE_DEVICE_TYPE_NS(ZORRO_ACTION_REPLAY_MK3, bus::amiga::zorro, action_replay_mk3_device, "zorro_ar3", "Datel Action Replay MK-III")
+DEFINE_DEVICE_TYPE(ZORRO_ACTION_REPLAY_MK1, bus::amiga::zorro::action_replay_mk1_device, "zorro_ar1", "Datel Action Replay MK-I")
+DEFINE_DEVICE_TYPE(ZORRO_ACTION_REPLAY_MK2, bus::amiga::zorro::action_replay_mk2_device, "zorro_ar2", "Datel Action Replay MK-II")
+DEFINE_DEVICE_TYPE(ZORRO_ACTION_REPLAY_MK3, bus::amiga::zorro::action_replay_mk3_device, "zorro_ar3", "Datel Action Replay MK-III")
namespace bus::amiga::zorro {
diff --git a/src/devices/bus/amiga/zorro/buddha.cpp b/src/devices/bus/amiga/zorro/buddha.cpp
index 08e7df229ec..16a27d07ff2 100644
--- a/src/devices/bus/amiga/zorro/buddha.cpp
+++ b/src/devices/bus/amiga/zorro/buddha.cpp
@@ -33,7 +33,7 @@
// DEVICE DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE_NS(ZORRO_BUDDHA, bus::amiga::zorro, buddha_device, "zorro_buddha", "Buddha IDE controller")
+DEFINE_DEVICE_TYPE(ZORRO_BUDDHA, bus::amiga::zorro::buddha_device, "zorro_buddha", "Buddha IDE controller")
namespace bus::amiga::zorro {
diff --git a/src/devices/bus/apf/slot.cpp b/src/devices/bus/apf/slot.cpp
index 0d44530a8b6..c43738fae2a 100644
--- a/src/devices/bus/apf/slot.cpp
+++ b/src/devices/bus/apf/slot.cpp
@@ -152,7 +152,7 @@ image_init_result apf_cart_slot_device::call_load()
if (size > 0x3800)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Image extends beyond the expected size for an APF cart");
+ seterror(image_error::INVALIDIMAGE, "Image extends beyond the expected size for an APF cart");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/apricot/video/mono.cpp b/src/devices/bus/apricot/video/mono.cpp
index 7254962193c..424df94cea8 100644
--- a/src/devices/bus/apricot/video/mono.cpp
+++ b/src/devices/bus/apricot/video/mono.cpp
@@ -4,8 +4,8 @@
ACT Apricot XEN Monochrome Display Option
- TODO:
- - Support monitor selection
+ TODO:
+ - Support monitor selection
***************************************************************************/
@@ -203,7 +203,7 @@ void apricot_mono_display_device::portb_w(uint8_t data)
// -------0 crtc reset
m_portb = data;
-
+
if (BIT(m_portb, 0) == 0)
m_crtc->reset();
}
@@ -217,7 +217,7 @@ void apricot_mono_display_device::portx_w(uint8_t data)
// -------0 mode (compatible or xen)
m_portx = data;
-
+
// forward mode to host
m_slot->apvid_w(BIT(m_portx, 0));
}
diff --git a/src/devices/bus/apricot/video/video.cpp b/src/devices/bus/apricot/video/video.cpp
index fbb33ba83bf..13e91b04a58 100644
--- a/src/devices/bus/apricot/video/video.cpp
+++ b/src/devices/bus/apricot/video/video.cpp
@@ -86,7 +86,7 @@ bool apricot_video_slot_device::io_w(offs_t offset, uint16_t data, uint16_t mem_
{
if (m_card)
return m_card->io_w(offset, data, mem_mask);
-
+
return false;
}
diff --git a/src/devices/bus/aquarius/slot.cpp b/src/devices/bus/aquarius/slot.cpp
index 825e03f39d5..88be36900f4 100644
--- a/src/devices/bus/aquarius/slot.cpp
+++ b/src/devices/bus/aquarius/slot.cpp
@@ -91,7 +91,7 @@ image_init_result aquarius_cartridge_slot_device::call_load()
if (size % 0x1000)
{
- seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid ROM size");
+ seterror(image_error::INVALIDIMAGE, "Invalid ROM size");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/ata/idehd.cpp b/src/devices/bus/ata/idehd.cpp
index 15a079963de..dd1a8f932ec 100644
--- a/src/devices/bus/ata/idehd.cpp
+++ b/src/devices/bus/ata/idehd.cpp
@@ -838,7 +838,7 @@ void ide_hdd_device::device_reset()
// build the features page
uint32_t metalength;
- if (m_handle && m_handle->read_metadata (HARD_DISK_IDENT_METADATA_TAG, 0, &m_buffer[0], 512, metalength) == CHDERR_NONE)
+ if (m_handle && !m_handle->read_metadata(HARD_DISK_IDENT_METADATA_TAG, 0, &m_buffer[0], 512, metalength))
{
for( int w = 0; w < 256; w++ )
{
diff --git a/src/devices/bus/bbc/1mhzbus/datacentre.cpp b/src/devices/bus/bbc/1mhzbus/datacentre.cpp
index 05ba11a3bab..f21d5af1d54 100644
--- a/src/devices/bus/bbc/1mhzbus/datacentre.cpp
+++ b/src/devices/bus/bbc/1mhzbus/datacentre.cpp
@@ -328,7 +328,7 @@ QUICKLOAD_LOAD_MEMBER(bbc_datacentre_device::quickload_cb)
}
else
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid filetype, must be SSD, DSD, or IMG");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid filetype, must be SSD, DSD, or IMG");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/bbc/rom/slot.cpp b/src/devices/bus/bbc/rom/slot.cpp
index 8a315e12234..65acb920bca 100644
--- a/src/devices/bus/bbc/rom/slot.cpp
+++ b/src/devices/bus/bbc/rom/slot.cpp
@@ -122,7 +122,7 @@ image_init_result bbc_romslot_device::call_load()
if (size % 0x2000)
{
- seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid ROM size");
+ seterror(image_error::INVALIDIMAGE, "Invalid ROM size");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/c64/exp.cpp b/src/devices/bus/c64/exp.cpp
index e4cc42f61d8..cf20f18fe45 100644
--- a/src/devices/bus/c64/exp.cpp
+++ b/src/devices/bus/c64/exp.cpp
@@ -191,7 +191,7 @@ image_init_result c64_expansion_slot_device::call_load()
if ((m_card->m_roml_size & (m_card->m_roml_size - 1)) || (m_card->m_romh_size & (m_card->m_romh_size - 1)))
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "ROM size must be power of 2");
+ seterror(image_error::INVALIDIMAGE, "ROM size must be power of 2");
return image_init_result::FAIL;
}
}
diff --git a/src/devices/bus/cbus/mpu_pc98.cpp b/src/devices/bus/cbus/mpu_pc98.cpp
index 2230e966fda..2ba192d4b0d 100644
--- a/src/devices/bus/cbus/mpu_pc98.cpp
+++ b/src/devices/bus/cbus/mpu_pc98.cpp
@@ -38,7 +38,7 @@ WRITE_LINE_MEMBER( mpu_pc98_device::mpu_irq_out )
// GLOBAL VARIABLES
//**************************************************************************
-DEFINE_DEVICE_TYPE(MPU_PC98, mpu_pc98_device, "mpu_pc98", "Roland MPU-401 MIDI Interface (CBUS)")
+DEFINE_DEVICE_TYPE(MPU_PC98, mpu_pc98_device, "mpu_pc98", "Roland MPU-401 MIDI Interface (C-bus)")
//-------------------------------------------------
// device_add_mconfig - add device configuration
diff --git a/src/devices/bus/cbus/pc9801_118.cpp b/src/devices/bus/cbus/pc9801_118.cpp
index 7f45cdf5d5e..403a23b4658 100644
--- a/src/devices/bus/cbus/pc9801_118.cpp
+++ b/src/devices/bus/cbus/pc9801_118.cpp
@@ -1,16 +1,24 @@
// license:BSD-3-Clause
// copyright-holders:Angelo Salese
-/***************************************************************************
+/**************************************************************************************************
- NEC PC-9801-118 sound card
+ NEC PC-9801-118 sound card "CanBe Sound 2"
- YMF297 + some extra ports
+ YMF297 + some extra ports, apparently derived from -86.
+ Introduced around the same time as Windows 95 release, it has various compatibility issues
+ under DOS (especially when PnP is enabled).
+ Doesn't have a sound ROM, it also cannot be installed with an environment also sporting a -86.
TODO:
- - preliminary, presumably needs CS-4232 too, it's an extended clone of the already emulated AD1848 used on the Windows Sound System
+ - Fix sound chip type (YMF297-F);
+ - Add CS-4232 support, it's an extended clone of the already emulated AD1848 used on the
+ Windows Sound System;
+ - Understand what the obfuscated NEC "ANCHOR" and "MAZE" chips really are;
+ - PnP interface (missing BIOS);
- verify sound irq;
+ - test if driver can be installed under Windows 95;
-***************************************************************************/
+**************************************************************************************************/
#include "emu.h"
#include "bus/cbus/pc9801_118.h"
@@ -27,11 +35,11 @@
//**************************************************************************
// device type definition
-DEFINE_DEVICE_TYPE(PC9801_118, pc9801_118_device, "pc9801_118", "pc9801_118")
+DEFINE_DEVICE_TYPE(PC9801_118, pc9801_118_device, "pc9801_118", "NEC PC-9801-118")
WRITE_LINE_MEMBER(pc9801_118_device::sound_irq)
{
- /* TODO: seems to die very often */
+ // TODO: sometimes misfired irq causes sound or even host hang
m_bus->int_w<5>(state);
}
@@ -41,9 +49,15 @@ WRITE_LINE_MEMBER(pc9801_118_device::sound_irq)
void pc9801_118_device::device_add_mconfig(machine_config &config)
{
+ // TODO: "ANCHOR" & "MAZE" custom NEC chips
+ // sourced by 5D clock
+
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- YM2608(config, m_opn3, XTAL_5B * 2 / 5); // actually YMF297-F, unknown clock / divider, more likely uses 5D clock
+
+ // actually YMF297-F (YMF288 + OPL3 compatible FM sources), unknown clock / divider
+ // 5B is near both CS-4232 and this
+ YM2608(config, m_opn3, XTAL_5B * 2 / 5);
m_opn3->irq_handler().set(FUNC(pc9801_118_device::sound_irq));
m_opn3->port_a_read_callback().set(FUNC(pc9801_118_device::opn_porta_r));
//m_opn3->port_b_read_callback().set(FUNC(pc8801_state::opn_portb_r));
@@ -61,10 +75,48 @@ void pc9801_118_device::device_add_mconfig(machine_config &config)
static INPUT_PORTS_START( pc9801_118 )
PORT_INCLUDE( pc9801_joy_port )
- PORT_START("OPN3_DSW")
- PORT_CONFNAME( 0x01, 0x00, "PC-9801-118: Port Base" )
- PORT_CONFSETTING( 0x00, "0x088" )
- PORT_CONFSETTING( 0x01, "0x188" )
+ // 12 line Jumper settings @ 8F
+ // documented at https://sammargh.github.io/pc98/ext_card_doc/9801-118.txt
+ // TODO: understand how SW can read these
+ PORT_START("OPN3_JP_8F")
+ PORT_CONFNAME( 0x001, 0x000, "PC-9801-118: Enable Plug and Play" ) // [1]
+ PORT_CONFSETTING( 0x000, DEF_STR( No ) )
+ PORT_CONFSETTING( 0x001, DEF_STR( Yes ) )
+ // "group" is basically a obnoxious machine ID
+ // details are in the aforementioned link, in a nutshell should be:
+ // Group 1: later CanBe (Cb onward)
+ // Group 2: early CanBe (Ce, Ce2, Cs2), 9821 MATE A
+ // Group 4: several ValueStar models
+ // Group 5: 9821 MATE B, Notebooks, 9801 BX, some H98 models
+ // Group 3: anything not covered above (link also mentions BX4 here?)
+ // In practice this should really be tested on field ...
+ PORT_CONFNAME( 0x406, 0x000, "PC-9801-118: PCM Group select") // [2, 3, 11]
+ PORT_CONFSETTING( 0x000, "Groups 2, 3, 4, 5" ) // uses -118 PCM
+ PORT_CONFSETTING( 0x404, "Group 3" ) // uses PCM host
+ PORT_CONFSETTING( 0x002, "Group 1" ) // ?
+ // all other settings "prohibited"
+ PORT_CONFNAME( 0x008, 0x008, "PC-9801-118: unknown [4]" ) // [4] "prohibited", always ON
+ PORT_CONFSETTING( 0x000, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x008, DEF_STR( On ) )
+ PORT_CONFNAME( 0x030, 0x000, "PC-9801-118: FM Interrupt setting" ) // [5,6]
+ PORT_CONFSETTING( 0x000, "INT5 (IRQ12)" )
+ PORT_CONFSETTING( 0x010, "INT6 (IRQ13)" )
+ PORT_CONFSETTING( 0x020, "INT41 (IRQ10)" )
+ PORT_CONFSETTING( 0x030, "INT0 (IRQ3)")
+ PORT_CONFNAME( 0x040, 0x000, "PC-9801-118: DMA channel" ) // [7]
+ PORT_CONFSETTING( 0x000, "1" )
+ PORT_CONFSETTING( 0x040, "2" )
+ PORT_CONFNAME( 0x180, 0x000, "PC-9801-118: PCM Interrupt setting" ) // [8,9]
+ PORT_CONFSETTING( 0x000, "INT5 (IRQ12)" )
+ PORT_CONFSETTING( 0x080, "INT1 (IRQ5)" )
+ PORT_CONFSETTING( 0x100, "INT41 (IRQ10)" )
+ PORT_CONFSETTING( 0x180, "INT0 (IRQ3)" )
+ PORT_CONFNAME( 0x200, 0x000, "PC-9801-118: enable MIDI Interrupt" ) // [10]
+ PORT_CONFSETTING( 0x000, DEF_STR( No ) )
+ PORT_CONFSETTING( 0x200, DEF_STR( Yes ) ) // auto for PnP, INT41 for non-PnP
+ PORT_CONFNAME( 0x800, 0x000, "PC-9801-118: unknown [12]" ) // [12] "prohibited", always OFF
+ PORT_CONFSETTING( 0x000, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x800, DEF_STR( On ) )
INPUT_PORTS_END
ioport_constructor pc9801_118_device::device_input_ports() const
@@ -72,8 +124,14 @@ ioport_constructor pc9801_118_device::device_input_ports() const
return INPUT_PORTS_NAME( pc9801_118 );
}
-// RAM
ROM_START( pc9801_118 )
+ ROM_REGION( 0x20000, "pnp_bios", ROMREGION_ERASE00 )
+ // NB: either socket is exclusively populated, earlier models populates 1E while later populates 2E.
+ // Most likely contains same data or slight revision bump.
+ // μPD27c1024 socket
+ ROM_LOAD( "118 e316.1e", 0x00000, 0x20000, NO_DUMP )
+ // LH531024N socket at .2e (unreadable label)
+
ROM_REGION( 0x100000, "opn3", ROMREGION_ERASE00 )
ROM_END
@@ -111,11 +169,24 @@ void pc9801_118_device::device_validity_check(validity_checker &valid) const
// device_start - device-specific startup
//-------------------------------------------------
+u16 pc9801_118_device::read_io_base()
+{
+ // hardwired on this board
+ return 0x0188;
+}
void pc9801_118_device::device_start()
{
+ m_io_base = read_io_base();
m_bus->install_io(0xa460, 0xa463, read8sm_delegate(*this, FUNC(pc9801_118_device::id_r)), write8sm_delegate(*this, FUNC(pc9801_118_device::ext_w)));
+ m_bus->install_io(
+ m_io_base,
+ m_io_base + 7,
+ read8sm_delegate(*this, FUNC(pc9801_118_device::opn3_r)),
+ write8sm_delegate(*this, FUNC(pc9801_118_device::opn3_w))
+ );
+
save_item(NAME(m_ext_reg));
}
@@ -126,10 +197,8 @@ void pc9801_118_device::device_start()
void pc9801_118_device::device_reset()
{
- uint16_t port_base = (ioport("OPN3_DSW")->read() & 1) << 8;
- m_bus->io_space().unmap_readwrite(0x0088, 0x008b, 0x100);
- m_bus->install_io(port_base + 0x0088, port_base + 0x008f, read8sm_delegate(*this, FUNC(pc9801_118_device::opn3_r)), write8sm_delegate(*this, FUNC(pc9801_118_device::opn3_w)));
- m_ext_reg = 1; // TODO: enabled or disabled?
+ // TODO: is this enabled or disabled at boot?
+ m_ext_reg = 1;
}
@@ -140,7 +209,7 @@ void pc9801_118_device::device_reset()
uint8_t pc9801_118_device::opn3_r(offs_t offset)
{
- if(((offset & 5) == 0) || m_ext_reg)
+ if(((offset & 5) == 0) || m_ext_reg )
return m_opn3->read(offset >> 1);
else // odd
{
@@ -152,7 +221,7 @@ uint8_t pc9801_118_device::opn3_r(offs_t offset)
void pc9801_118_device::opn3_w(offs_t offset, uint8_t data)
{
- if(((offset & 5) == 0) || m_ext_reg)
+ if( ((offset & 5) == 0) || m_ext_reg )
m_opn3->write(offset >> 1,data);
//else // odd
// printf("PC9801-118: Write to undefined port [%02x] %02x\n",offset+0x188,data);
@@ -162,11 +231,13 @@ uint8_t pc9801_118_device::id_r(offs_t offset)
{
if(offset == 0)
{
- printf("OPN3 EXT read ID [%02x]\n",offset);
+ logerror("OPN3 EXT read ID [%02x]\n",offset);
+ // TODO: confirm ID
+ // by assumption we make this same as later CanBe releases, may or may not be right
return 0x80 | (m_ext_reg & 1);
}
- printf("OPN3 EXT read unk [%02x]\n",offset);
+ logerror("OPN3 EXT read unk [%02x]\n", offset);
return 0xff;
}
@@ -175,11 +246,10 @@ void pc9801_118_device::ext_w(offs_t offset, uint8_t data)
if(offset == 0)
{
m_ext_reg = data & 1;
- /* TODO: apparently writing a 1 doubles the available channels (and presumably enables CS-4231 too) */
- if(data)
- printf("PC-9801-118: extended register %02x write\n",data);
+ if(data & 2)
+ logerror("%s: extended register %02x write\n", machine().describe_context(), data);
return;
}
- printf("OPN3 EXT write unk %02x -> [%02x]\n",data,offset);
+ logerror("%s: EXT write unk %02x -> [%02x]\n", machine().describe_context(), data, offset);
}
diff --git a/src/devices/bus/cbus/pc9801_118.h b/src/devices/bus/cbus/pc9801_118.h
index 0984a9c880c..94ac3bfe24c 100644
--- a/src/devices/bus/cbus/pc9801_118.h
+++ b/src/devices/bus/cbus/pc9801_118.h
@@ -28,6 +28,8 @@ public:
// construction/destruction
pc9801_118_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ static constexpr feature_type imperfect_features() { return feature::SOUND; }
+
uint8_t opn3_r(offs_t offset);
void opn3_w(offs_t offset, uint8_t data);
uint8_t id_r(offs_t offset);
@@ -42,6 +44,7 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual u16 read_io_base() override;
private:
required_device<pc9801_slot_device> m_bus;
diff --git a/src/devices/bus/cbus/pc9801_26.cpp b/src/devices/bus/cbus/pc9801_26.cpp
index e9b9498c6ac..8f8b15740bd 100644
--- a/src/devices/bus/cbus/pc9801_26.cpp
+++ b/src/devices/bus/cbus/pc9801_26.cpp
@@ -1,6 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Angelo Salese
-/***************************************************************************
+/**************************************************************************************************
NEC PC-9801-26 sound card
@@ -8,8 +8,10 @@
TODO:
- verify sound irq;
+ - understand if dips can be read by SW;
+ - configurable irq level needs a binding flush in C-bus handling;
-***************************************************************************/
+**************************************************************************************************/
#include "emu.h"
#include "bus/cbus/pc9801_26.h"
@@ -23,11 +25,11 @@
//**************************************************************************
// device type definition
-DEFINE_DEVICE_TYPE(PC9801_26, pc9801_26_device, "pc9801_26", "pc9801_26")
+DEFINE_DEVICE_TYPE(PC9801_26, pc9801_26_device, "pc9801_26", "NEC PC-9801-26")
WRITE_LINE_MEMBER(pc9801_26_device::sound_irq)
{
- /* TODO: seems to die very often */
+ // TODO: sometimes misfired irq causes sound or even host hang
m_bus->int_w<5>(state);
}
@@ -77,10 +79,27 @@ const tiny_rom_entry *pc9801_26_device::device_rom_region() const
static INPUT_PORTS_START( pc9801_26 )
PORT_INCLUDE( pc9801_joy_port )
- PORT_START("OPN_DSW")
+ // On-board jumpers
+ // TODO: any way to actually read these from HW?
+ PORT_START("OPN_JP6A1_JP6A3")
+ PORT_CONFNAME( 0x03, 0x02, "PC-9801-26: Interrupt level")
+ PORT_CONFSETTING( 0x00, "IRQ 0" ) // 2-3, 2-3
+ PORT_CONFSETTING( 0x01, "IRQ 4" ) // 2-3, 1-2
+ PORT_CONFSETTING( 0x02, "IRQ 5" ) // 1-2, 1-2
+ PORT_CONFSETTING( 0x03, "IRQ 6" ) // 1-2, 2-3
+
+ PORT_START("OPN_JP6A2")
+ PORT_CONFNAME( 0x07, 0x01, "PC-9801-26: Sound ROM address")
+ PORT_CONFSETTING( 0x00, "0xc8000" ) // 1-10
+ PORT_CONFSETTING( 0x01, "0xcc000" ) // 2-9
+ PORT_CONFSETTING( 0x02, "0xd0000" ) // 3-8
+ PORT_CONFSETTING( 0x03, "0xd4000" ) // 4-7
+ PORT_CONFSETTING( 0x04, "Disable ROM") // 5-6
+
+ PORT_START("OPN_JP6A4")
PORT_CONFNAME( 0x01, 0x01, "PC-9801-26: Port Base" )
- PORT_CONFSETTING( 0x00, "0x088" )
- PORT_CONFSETTING( 0x01, "0x188" )
+ PORT_CONFSETTING( 0x00, "0x088" ) // 1-4
+ PORT_CONFSETTING( 0x01, "0x188" ) // 2-3
INPUT_PORTS_END
ioport_constructor pc9801_26_device::device_input_ports() const
@@ -97,9 +116,9 @@ ioport_constructor pc9801_26_device::device_input_ports() const
//-------------------------------------------------
pc9801_26_device::pc9801_26_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : pc9801_snd_device(mconfig, PC9801_26, tag, owner, clock),
- m_bus(*this, DEVICE_SELF_OWNER),
- m_opn(*this, "opn")
+ : pc9801_snd_device(mconfig, PC9801_26, tag, owner, clock)
+ , m_bus(*this, DEVICE_SELF_OWNER)
+ , m_opn(*this, "opn")
{
}
@@ -117,10 +136,15 @@ void pc9801_26_device::device_validity_check(validity_checker &valid) const
// device_start - device-specific startup
//-------------------------------------------------
+u16 pc9801_26_device::read_io_base()
+{
+ return ((ioport("OPN_JP6A4")->read() & 1) << 8) + 0x0088;
+}
void pc9801_26_device::device_start()
{
- m_bus->program_space().install_rom(0xcc000,0xcffff,memregion(this->subtag("sound_bios").c_str())->base());
+ m_rom_base = 0;
+ m_io_base = 0;
}
@@ -130,10 +154,48 @@ void pc9801_26_device::device_start()
void pc9801_26_device::device_reset()
{
- uint16_t port_base = (ioport("OPN_DSW")->read() & 1) << 8;
+ // install the ROM to the physical program space
+ u8 rom_setting = ioport("OPN_JP6A2")->read() & 7;
+ static const u32 rom_addresses[8] = { 0xc8000, 0xcc000, 0xd0000, 0xd4000, 0, 0, 0, 0 };
+ u32 current_rom = rom_addresses[rom_setting & 7];
+ memory_region *rom_region = memregion(this->subtag("sound_bios").c_str());
+ const u32 rom_size = rom_region->bytes() - 1;
- m_bus->io_space().unmap_readwrite(0x0088, 0x008b, 0x100);
- m_bus->install_io(port_base + 0x0088, port_base + 0x008b, read8sm_delegate(*this, FUNC(pc9801_26_device::opn_r)), write8sm_delegate(*this, FUNC(pc9801_26_device::opn_w)));
+ if (m_rom_base == 0)
+ m_rom_base = current_rom;
+
+ if (m_rom_base != 0)
+ {
+ logerror("%s: uninstall ROM at %08x-%08x\n", machine().describe_context(), m_rom_base, m_rom_base + rom_size);
+ m_bus->program_space().unmap_readwrite(m_rom_base, m_rom_base + rom_size);
+ }
+ if (current_rom != 0)
+ {
+ logerror("%s: install ROM at %08x-%08x\n", machine().describe_context(), current_rom, current_rom + rom_size);
+ m_bus->program_space().unmap_readwrite(current_rom, current_rom + rom_size);
+ m_bus->program_space().install_rom(
+ current_rom,
+ current_rom + rom_size,
+ rom_region->base()
+ );
+ }
+ m_rom_base = current_rom;
+
+ // install I/O ports
+ u16 current_io = read_io_base();
+ m_bus->flush_install_io(
+ this->tag(),
+ m_io_base,
+ current_io,
+ 3,
+ read8sm_delegate(*this, FUNC(pc9801_26_device::opn_r)),
+ write8sm_delegate(*this, FUNC(pc9801_26_device::opn_w))
+ );
+ m_io_base = current_io;
+
+ // install IRQ line
+// static const u8 irq_levels[4] = {0, 4, 5, 6};
+// m_irq_level = irq_levels[ioport("OPN_JP6A1_JP6A3")->read() & 3];
}
diff --git a/src/devices/bus/cbus/pc9801_26.h b/src/devices/bus/cbus/pc9801_26.h
index 84eeaab31d4..80cd57a20cd 100644
--- a/src/devices/bus/cbus/pc9801_26.h
+++ b/src/devices/bus/cbus/pc9801_26.h
@@ -2,7 +2,7 @@
// copyright-holders:Angelo Salese
/***************************************************************************
-Template for skeleton device
+ NEC PC-9801-26 sound card
***************************************************************************/
@@ -39,12 +39,14 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual u16 read_io_base() override;
private:
required_device<pc9801_slot_device> m_bus;
required_device<ym2203_device> m_opn;
DECLARE_WRITE_LINE_MEMBER(sound_irq);
+ u32 m_rom_base;
};
diff --git a/src/devices/bus/cbus/pc9801_55.cpp b/src/devices/bus/cbus/pc9801_55.cpp
new file mode 100644
index 00000000000..879ad2f1a66
--- /dev/null
+++ b/src/devices/bus/cbus/pc9801_55.cpp
@@ -0,0 +1,253 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/**************************************************************************************************
+
+ NEC PC-9801-55/-55U/-55L
+
+ SCSI interface, running on WD33C93A
+
+ TODO:
+ - Is PC-9801-55 also running on this except with WD33C93 instead?
+ Will see once we obtain a dump of that;
+ - DIP is never taken (definitely lies at vector 0x2c -> PC=0xdc01e);
+ - DRQ
+ - All roms seems to be misdumped (too generous sizes), is it intentional?
+
+**************************************************************************************************/
+
+#include "emu.h"
+#include "bus/cbus/pc9801_55.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+// device type definition
+DEFINE_DEVICE_TYPE(PC9801_55U, pc9801_55u_device, "pc9801_55u", "NEC PC-9801-55U")
+DEFINE_DEVICE_TYPE(PC9801_55L, pc9801_55l_device, "pc9801_55l", "NEC PC-9801-55L")
+
+ROM_START( pc9801_55u )
+ ROM_REGION16_LE( 0x10000, "scsi_bios", ROMREGION_ERASEFF )
+ // JNC2B_00.BIN BADADDR ---xxxxxxxxxxxx
+ // JNC3B_00.BIN BADADDR ---xxxxxxxxxxxx
+ ROM_LOAD16_BYTE( "jnc2b_00.bin", 0x000000, 0x008000, CRC(ddace1b7) SHA1(614569be28a90bd385cf8abc193e629e568125b7) )
+ ROM_LOAD16_BYTE( "jnc3b_00.bin", 0x000001, 0x008000, CRC(b8a8a49e) SHA1(7781dab492df889148e070a7da7ead207e18ed04) )
+ROM_END
+
+const tiny_rom_entry *pc9801_55u_device::device_rom_region() const
+{
+ return ROM_NAME( pc9801_55u );
+}
+
+ROM_START( pc9801_55l )
+ ROM_REGION16_LE( 0x10000, "scsi_bios", ROMREGION_ERASEFF )
+ // ETA1B_00.BIN BADADDR ---xxxxxxxxxxxx
+ // ETA3B_00.BIN BADADDR ---xxxxxxxxxxxx
+ ROM_LOAD16_BYTE( "eta1b_00.bin", 0x000000, 0x008000, CRC(300ff6c1) SHA1(6cdee535b77535fe6c4dda4427aeb803fcdea0b8) )
+ ROM_LOAD16_BYTE( "eta3b_00.bin", 0x000001, 0x008000, CRC(44477512) SHA1(182bb45ba0da7a4f9113e268e04ffca8403cf164) )
+ROM_END
+
+const tiny_rom_entry *pc9801_55l_device::device_rom_region() const
+{
+ return ROM_NAME( pc9801_55l );
+}
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER(pc9801_55_device::scsi_irq_w)
+{
+ // TODO: should be INT3, but BIOS configures as INT0 somewhere (unhandled dip reading?)
+ m_bus->int_w<0>(state);
+}
+
+void pc9801_55_device::device_add_mconfig(machine_config &config)
+{
+ NSCSI_BUS(config, m_scsi_bus);
+ // TODO: currently returning default_scsi_devices, checkout if true for PC-98
+ NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:1", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:2", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:3", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:4", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:5", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:6", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:7").option_set("wdc", WD33C93A).machine_config(
+ [this](device_t *device)
+ {
+ wd33c9x_base_device &adapter = downcast<wd33c9x_base_device &>(*device);
+
+ // TODO: unknown clock
+ adapter.set_clock(10'000'000);
+ adapter.irq_cb().set(*this, FUNC(pc9801_55_device::scsi_irq_w));
+ // TODO: DRQ on C-bus
+ //adapter.drq_cb().set(*this, FUNC(pc9801_55_device::scsi_drq));
+ }
+ );
+}
+
+static INPUT_PORTS_START( pc9801_55 )
+ PORT_START("SCSI_DSW1")
+ PORT_DIPNAME( 0x07, 0x07, "PC-9801-55: SCSI board ID") PORT_DIPLOCATION("SCSI_SW1:!1,!2,!3")
+ PORT_DIPSETTING( 0x00, "0" )
+ PORT_DIPSETTING( 0x01, "1" )
+ PORT_DIPSETTING( 0x02, "2" )
+ PORT_DIPSETTING( 0x03, "3" )
+ PORT_DIPSETTING( 0x04, "4" )
+ PORT_DIPSETTING( 0x05, "5" )
+ PORT_DIPSETTING( 0x06, "6" )
+ PORT_DIPSETTING( 0x07, "7" )
+ PORT_DIPNAME( 0x38, 0x18, "PC-9801-55: Interrupt level") PORT_DIPLOCATION("SCSI_SW1:!4,!5,!6")
+ PORT_DIPSETTING( 0x00, "INT0" )
+ PORT_DIPSETTING( 0x08, "INT1" )
+ PORT_DIPSETTING( 0x10, "INT2" )
+ PORT_DIPSETTING( 0x18, "INT3" )
+ PORT_DIPSETTING( 0x20, "INT5" )
+ PORT_DIPSETTING( 0x28, "INT6" )
+ PORT_DIPSETTING( 0x30, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x38, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0xc0, 0x00, "PC-9801-55: DMA channel") PORT_DIPLOCATION("SCSI_SW1:!7,!8")
+ PORT_DIPSETTING( 0x00, "0" )
+ PORT_DIPSETTING( 0x40, "1 (prohibited)" )
+ PORT_DIPSETTING( 0x80, "2" )
+ PORT_DIPSETTING( 0xc0, "3" )
+
+ PORT_START("SCSI_DSW2")
+ // TODO: understand all valid possible settings of this
+ PORT_DIPNAME( 0x7f, 0x66, "PC-9801-55: machine ID and ROM base address") PORT_DIPLOCATION("SCSI_SW2:!1,!2,!3,!4,!5,!6,!7")
+ PORT_DIPSETTING( 0x66, "i386, 0xdc000-0xddfff")
+ // ...
+ PORT_DIPNAME( 0x80, 0x80, "PC-9801-55: ROM accessibility at Power-On") PORT_DIPLOCATION("SCSI_SW2:!8")
+ PORT_DIPSETTING( 0x80, DEF_STR( Yes ))
+ PORT_DIPSETTING( 0x00, DEF_STR( No ))
+
+ PORT_START("SCSI_JP")
+ // SW3 and SW4 Jumper settings
+ PORT_CONFNAME( 0x03, 0x00, "PC-9801-55: I/O base address")
+ PORT_CONFSETTING( 0x00, "0xcc0") // 01-02 01 02
+ PORT_CONFSETTING( 0x01, "0xcd0")
+ PORT_CONFSETTING( 0x02, "0xce0")
+ PORT_CONFSETTING( 0x03, "0xcf0")
+INPUT_PORTS_END
+
+ioport_constructor pc9801_55_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( pc9801_55 );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// pc9801_55u_device - constructor
+//-------------------------------------------------
+
+pc9801_55_device::pc9801_55_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , m_bus(*this, DEVICE_SELF_OWNER)
+ , m_scsi_bus(*this, "scsi")
+ , m_wdc(*this, "scsi:7:wdc")
+{
+}
+
+pc9801_55u_device::pc9801_55u_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : pc9801_55_device(mconfig, PC9801_55U, tag, owner, clock)
+{
+
+}
+
+pc9801_55l_device::pc9801_55l_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : pc9801_55_device(mconfig, PC9801_55L, tag, owner, clock)
+{
+
+}
+
+
+//-------------------------------------------------
+// device_validity_check - perform validity checks
+// on this device
+//-------------------------------------------------
+
+void pc9801_55_device::device_validity_check(validity_checker &valid) const
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void pc9801_55_device::device_start()
+{
+ m_bus->program_space().install_rom(
+ 0xdc000,
+ 0xddfff,
+ memregion(this->subtag("scsi_bios").c_str())->base()
+ );
+
+ // TODO: docs hints that this has mirrors at 0xcd*, 0xce*, 0xcf*
+ m_bus->install_io(
+ 0xcc0,
+ 0xcc5,
+ read8sm_delegate(*this, FUNC(pc9801_55_device::comms_r)),
+ write8sm_delegate(*this, FUNC(pc9801_55_device::comms_w))
+ );
+
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void pc9801_55_device::device_reset()
+{
+
+}
+
+
+//**************************************************************************
+// READ/WRITE HANDLERS
+//**************************************************************************
+
+u8 pc9801_55_device::comms_r(offs_t offset)
+{
+ if((offset & 1) == 0)
+ {
+ offs_t addr = offset >> 1;
+ if (addr & 2)
+ {
+ logerror("%s: Read to status port [%02x]\n", machine().describe_context(), offset + 0xcc0);
+
+ return 0;
+ }
+
+ return m_wdc->indir_r(addr);
+ }
+ // odd
+
+ logerror("%s: Read to undefined port [%02x]\n", machine().describe_context(), offset + 0xcc0);
+
+ return 0xff;
+}
+
+void pc9801_55_device::comms_w(offs_t offset, u8 data)
+{
+ if((offset & 1) == 0)
+ {
+ offs_t addr = offset >> 1;
+ if (addr & 2)
+ {
+ logerror("%s: Write to command port [%02x] %02x\n", machine().describe_context(), offset + 0xcc0, data);
+
+ return;
+ }
+
+ m_wdc->indir_w(addr, data);
+ return;
+ }
+
+ // odd
+ logerror("%s: Write to undefined port [%02x] %02x\n", machine().describe_context(), offset + 0xcc0, data);
+}
diff --git a/src/devices/bus/cbus/pc9801_55.h b/src/devices/bus/cbus/pc9801_55.h
new file mode 100644
index 00000000000..b74c754c2b8
--- /dev/null
+++ b/src/devices/bus/cbus/pc9801_55.h
@@ -0,0 +1,80 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/***************************************************************************
+
+ NEC PC-9801-55/-55U/-55L
+
+***************************************************************************/
+
+#ifndef MAME_BUS_CBUS_PC9801_55_H
+#define MAME_BUS_CBUS_PC9801_55_H
+
+#pragma once
+
+#include "bus/cbus/pc9801_cbus.h"
+#include "bus/nscsi/devices.h"
+#include "machine/nscsi_bus.h"
+#include "machine/wd33c9x.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> pc9801_118_device
+
+class pc9801_55_device : public device_t
+{
+public:
+ // construction/destruction
+ //pc9801_55_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ pc9801_55_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ static constexpr feature_type unemulated_features() { return feature::DISK; }
+
+ DECLARE_WRITE_LINE_MEMBER(scsi_irq_w);
+
+protected:
+ // device-level overrides
+ virtual void device_validity_check(validity_checker &valid) const override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ // optional information overrides
+// virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual ioport_constructor device_input_ports() const override;
+
+private:
+ required_device<pc9801_slot_device> m_bus;
+ required_device<nscsi_bus_device> m_scsi_bus;
+ required_device<wd33c9x_base_device> m_wdc;
+
+ u8 comms_r(offs_t offset);
+ void comms_w(offs_t offset, u8 data);
+};
+
+class pc9801_55u_device : public pc9801_55_device
+{
+public:
+ pc9801_55u_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+private:
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+};
+
+class pc9801_55l_device : public pc9801_55_device
+{
+public:
+ pc9801_55l_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+private:
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+};
+
+// device type definition
+//DECLARE_DEVICE_TYPE(PC9801_55, pc9801_55_device)
+DECLARE_DEVICE_TYPE(PC9801_55U, pc9801_55u_device)
+DECLARE_DEVICE_TYPE(PC9801_55L, pc9801_55l_device)
+
+#endif // MAME_BUS_CBUS_PC9801_55_H
diff --git a/src/devices/bus/cbus/pc9801_86.cpp b/src/devices/bus/cbus/pc9801_86.cpp
index 230d9eb445f..267b1a2c55b 100644
--- a/src/devices/bus/cbus/pc9801_86.cpp
+++ b/src/devices/bus/cbus/pc9801_86.cpp
@@ -1,25 +1,35 @@
// license:BSD-3-Clause
// copyright-holders:Angelo Salese
-/***************************************************************************
+/**************************************************************************************************
NEC PC-9801-86 sound card
NEC PC-9801-SpeakBoard sound card
+ Mad Factory Otomi-chan Kai sound card
Similar to PC-9801-26, this one has YM2608 instead of YM2203 and an
additional DAC port
+
SpeakBoard sound card seems to be derived design from -86, with an additional
OPNA mapped at 0x58*
+ Otomi-chan Kai is a doujinshi sound card based off SpeakBoard design.
+ It uses YM3438 OPL2C mapped at 0x78*, and anything that uses the nax.exe sound driver
+ expects this to be installed as default (cfr. datsumj).
+ To fallback to a regular -26/-86 board user needs to add parameter switches "-2" or "-3"
+ respectively, cfr. "nax -?" for additional details.
+
TODO:
- - Test all pcm modes
- - Make volume work
- - Recording
+ - Test all pcm modes;
+ - Make volume work;
+ - Recording;
- SpeakBoard: no idea about software that uses this, also board shows a single YM2608B?
- "-86 only supports ADPCM instead of PCM, while SpeakBoard has OPNA + 256 Kbit RAM"
- Sounds like a sound core flaw since OPNA requires a rom region in any case;
+ "-86 only supports ADPCM instead of PCM, while SpeakBoard has OPNA + 256 Kbit RAM";
+ - Otomi-chan Kai: find a manual (マニュアル), it's mentioned with nax usage.
+ Very low-res scan of the PCB sports a 4-bit dip-sw bank at very least;
+ - Otomi-chan Kai: unknown ID port readback;
- verify sound irq;
-***************************************************************************/
+**************************************************************************************************/
#include "emu.h"
#include "bus/cbus/pc9801_86.h"
@@ -32,15 +42,22 @@
//**************************************************************************
// device type definition
-DEFINE_DEVICE_TYPE(PC9801_86, pc9801_86_device, "pc9801_86", "pc9801_86")
+DEFINE_DEVICE_TYPE(PC9801_86, pc9801_86_device, "pc9801_86", "NEC PC-9801-86")
WRITE_LINE_MEMBER(pc9801_86_device::sound_irq)
{
m_fmirq = state ? true : false;
- /* TODO: seems to die very often */
+ // TODO: sometimes misfired irq causes sound or even host hang
m_bus->int_w<5>(state || (m_pcmirq ? ASSERT_LINE : CLEAR_LINE));
}
+// only for derived designs?
+void pc9801_86_device::opna_map(address_map &map)
+{
+ // TODO: confirm it really is ROMless
+ // TODO: confirm size
+ map(0x000000, 0x1fffff).ram();
+}
//-------------------------------------------------
// device_add_mconfig - add device configuration
@@ -60,6 +77,8 @@ void pc9801_86_device::pc9801_86_config(machine_config &config)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
YM2608(config, m_opna, 7.987_MHz_XTAL); // actually YM2608B
+ // shouldn't have one
+// m_opna->set_addrmap(0, &pc9801_86_device::opna_map);
m_opna->irq_handler().set(FUNC(pc9801_86_device::sound_irq));
m_opna->port_a_read_callback().set(FUNC(pc9801_86_device::opn_porta_r));
//m_opna->port_b_read_callback().set(FUNC(pc8801_state::opn_portb_r));
@@ -79,6 +98,16 @@ void pc9801_86_device::device_add_mconfig(machine_config &config)
pc9801_86_config(config);
}
+// helper for derived devices to account for the different master OPNA sound mixing
+void pc9801_86_device::opna_reset_routes_config(machine_config &config)
+{
+ m_opna->reset_routes();
+ m_opna->add_route(0, "lspeaker", 0.50);
+ m_opna->add_route(0, "rspeaker", 0.50);
+ m_opna->add_route(1, "lspeaker", 0.50);
+ m_opna->add_route(2, "rspeaker", 0.50);
+}
+
// to load a different bios for slots:
// -cbusX pc9801_86,bios=N
ROM_START( pc9801_86 )
@@ -87,13 +116,12 @@ ROM_START( pc9801_86 )
// we currently mark bios names based off where they originally belonged to, lacking of a better info
// supposedly these are -86 roms according to eikanwa2 sound card detection,
// loading a -26 rom in a -86 environment causes an hang there.
+ // TODO: several later machines (i.e. CanBe) really has an internal -86 with sound BIOS data coming directly from the machine ROM
+ // it also sports different ID mapping at $a460
ROM_SYSTEM_BIOS( 0, "86rx", "nec86rx" )
ROMX_LOAD( "sound_rx.rom", 0x0000, 0x4000, BAD_DUMP CRC(fe9f57f2) SHA1(d5dbc4fea3b8367024d363f5351baecd6adcd8ef), ROM_BIOS(0) )
- ROM_SYSTEM_BIOS( 1, "86mu", "nec86mu" )
+ ROM_SYSTEM_BIOS( 1, "86mu", "epson86mu" )
ROMX_LOAD( "sound_486mu.rom", 0x0000, 0x4000, BAD_DUMP CRC(6cdfa793) SHA1(4b8250f9b9db66548b79f961d61010558d6d6e1c), ROM_BIOS(1) )
-
- // RAM
- ROM_REGION( 0x100000, "opna", ROMREGION_ERASE00 )
ROM_END
const tiny_rom_entry *pc9801_86_device::device_rom_region() const
@@ -109,10 +137,32 @@ const tiny_rom_entry *pc9801_86_device::device_rom_region() const
static INPUT_PORTS_START( pc9801_86 )
PORT_INCLUDE( pc9801_joy_port )
+ // Single 8-bit DSW bank
+ // TODO: how HW really reads these?
PORT_START("OPNA_DSW")
- PORT_CONFNAME( 0x01, 0x01, "PC-9801-86: Port Base" )
- PORT_CONFSETTING( 0x00, "0x088" )
- PORT_CONFSETTING( 0x01, "0x188" )
+ PORT_DIPNAME( 0x01, 0x00, "PC-9801-86: Port Base" ) PORT_DIPLOCATION("OPNA_SW:!1")
+ PORT_DIPSETTING( 0x00, "0x188" )
+ PORT_DIPSETTING( 0x01, "0x288" )
+ PORT_DIPNAME( 0x02, 0x00, "PC-9801-86: Enable sound ROM") PORT_DIPLOCATION("OPNA_SW:!2")
+ PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) // hardwired at 0xcc000
+ PORT_DIPSETTING( 0x02, DEF_STR( No ) )
+ PORT_DIPNAME( 0x0c, 0x00, "PC-9801-86: Interrupt level") PORT_DIPLOCATION("OPNA_SW:!3,!4")
+ PORT_DIPSETTING( 0x0c, "IRQ 0" )
+ PORT_DIPSETTING( 0x08, "IRQ 4" )
+ PORT_DIPSETTING( 0x00, "IRQ 5" )
+ PORT_DIPSETTING( 0x04, "IRQ 6" )
+ PORT_DIPNAME( 0x10, 0x00, "PC-9801-86: Interrupt enable") PORT_DIPLOCATION("OPNA_SW:!5")
+ PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( No ) )
+ PORT_DIPNAME( 0xe0, 0x80, "PC-9801-86: ID number") PORT_DIPLOCATION("OPNA_SW:!6,!7,!8")
+ PORT_DIPSETTING( 0x00, "0" )
+ PORT_DIPSETTING( 0x20, "1" )
+ PORT_DIPSETTING( 0x40, "2" )
+ PORT_DIPSETTING( 0x60, "3" )
+ PORT_DIPSETTING( 0x80, "4" )
+ PORT_DIPSETTING( 0xa0, "5" )
+ PORT_DIPSETTING( 0xc0, "6" )
+ PORT_DIPSETTING( 0xe0, "7" )
INPUT_PORTS_END
ioport_constructor pc9801_86_device::device_input_ports() const
@@ -129,12 +179,12 @@ ioport_constructor pc9801_86_device::device_input_ports() const
//-------------------------------------------------
pc9801_86_device::pc9801_86_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
- : pc9801_snd_device(mconfig, type, tag, owner, clock),
- m_bus(*this, DEVICE_SELF_OWNER),
- m_opna(*this, "opna"),
- m_ldac(*this, "ldac"),
- m_rdac(*this, "rdac"),
- m_queue(QUEUE_SIZE)
+ : pc9801_snd_device(mconfig, type, tag, owner, clock)
+ , m_bus(*this, DEVICE_SELF_OWNER)
+ , m_opna(*this, "opna")
+ , m_ldac(*this, "ldac")
+ , m_rdac(*this, "rdac")
+ , m_queue(QUEUE_SIZE)
{
}
@@ -154,6 +204,11 @@ void pc9801_86_device::device_validity_check(validity_checker &valid) const
{
}
+u16 pc9801_86_device::read_io_base()
+{
+ return ((ioport("OPNA_DSW")->read() & 1) << 8) + 0x188;
+}
+
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
@@ -161,12 +216,19 @@ void pc9801_86_device::device_validity_check(validity_checker &valid) const
void pc9801_86_device::device_start()
{
- m_bus->program_space().install_rom(0xcc000,0xcffff,memregion(this->subtag("sound_bios").c_str())->base());
+ // TODO: uninstall option from dip
+ m_bus->program_space().install_rom(
+ 0xcc000,
+ 0xcffff,
+ memregion(this->subtag("sound_bios").c_str())->base()
+ );
m_bus->install_io(0xa460, 0xa463, read8smo_delegate(*this, FUNC(pc9801_86_device::id_r)), write8smo_delegate(*this, FUNC(pc9801_86_device::mask_w)));
m_bus->install_io(0xa464, 0xa46f, read8sm_delegate(*this, FUNC(pc9801_86_device::pcm_r)), write8sm_delegate(*this, FUNC(pc9801_86_device::pcm_w)));
m_bus->install_io(0xa66c, 0xa66f, read8sm_delegate(*this, [this](offs_t o){ return o == 2 ? m_pcm_mute : 0xff; }, "pc9801_86_mute_r"),
write8sm_delegate(*this, [this](offs_t o, u8 d){ if(o == 2) m_pcm_mute = d; }, "pc9801_86_mute_w"));
+ m_io_base = 0;
+
m_dac_timer = timer_alloc();
save_item(NAME(m_count));
save_item(NAME(m_queue));
@@ -180,9 +242,16 @@ void pc9801_86_device::device_start()
void pc9801_86_device::device_reset()
{
- uint16_t port_base = (ioport("OPNA_DSW")->read() & 1) << 8;
- m_bus->io_space().unmap_readwrite(0x0088, 0x008f, 0x100);
- m_bus->install_io(port_base + 0x0088, port_base + 0x008f, read8sm_delegate(*this, FUNC(pc9801_86_device::opna_r)), write8sm_delegate(*this, FUNC(pc9801_86_device::opna_w)));
+ u16 current_io = read_io_base();
+ m_bus->flush_install_io(
+ this->tag(),
+ m_io_base,
+ current_io,
+ 7,
+ read8sm_delegate(*this, FUNC(pc9801_86_device::opna_r)),
+ write8sm_delegate(*this, FUNC(pc9801_86_device::opna_w))
+ );
+ m_io_base = current_io;
m_mask = 0;
m_head = m_tail = m_count = 0;
@@ -200,36 +269,40 @@ void pc9801_86_device::device_reset()
//**************************************************************************
-uint8_t pc9801_86_device::opna_r(offs_t offset)
+u8 pc9801_86_device::opna_r(offs_t offset)
{
if((offset & 1) == 0)
return m_opna->read(offset >> 1);
else // odd
{
- logerror("PC9801-86: Read to undefined port [%02x]\n",offset+0x188);
+ logerror("%s: Read to undefined port [%02x]\n", machine().describe_context(), offset + m_io_base);
return 0xff;
}
}
-void pc9801_86_device::opna_w(offs_t offset, uint8_t data)
+void pc9801_86_device::opna_w(offs_t offset, u8 data)
{
if((offset & 1) == 0)
m_opna->write(offset >> 1,data);
else // odd
- logerror("PC9801-86: Write to undefined port [%02x] %02x\n",offset+0x188,data);
+ logerror("%s: Write to undefined port [%02x] %02x\n", machine().describe_context(), offset + m_io_base, data);
}
-uint8_t pc9801_86_device::id_r()
+u8 pc9801_86_device::id_r()
{
- return 0x40 | m_mask;
+ // either a -86 or 9821 MATE A uses this id (built-in)
+ const u8 id_port = ((ioport("OPNA_DSW")->read() & 1) << 4) | 0x40;
+ return id_port | m_mask;
}
-void pc9801_86_device::mask_w(uint8_t data)
+void pc9801_86_device::mask_w(u8 data)
{
m_mask = data & 1;
+ // TODO: bit 1 totally cuts off OPNA output
+ logerror("%s: OPNA mask setting %02x\n", machine().describe_context(), data);
}
-uint8_t pc9801_86_device::pcm_r(offs_t offset)
+u8 pc9801_86_device::pcm_r(offs_t offset)
{
if((offset & 1) == 0)
{
@@ -251,7 +324,7 @@ uint8_t pc9801_86_device::pcm_r(offs_t offset)
return 0xff;
}
-void pc9801_86_device::pcm_w(offs_t offset, uint8_t data)
+void pc9801_86_device::pcm_w(offs_t offset, u8 data)
{
const u32 rate = (25.4_MHz_XTAL).value() / 16;
const int divs[8] = {36, 48, 72, 96, 144, 192, 288, 384};
@@ -301,9 +374,9 @@ int pc9801_86_device::queue_count()
return m_count;
}
-uint8_t pc9801_86_device::queue_pop()
+u8 pc9801_86_device::queue_pop()
{
- uint8_t ret = m_queue[m_tail++];
+ u8 ret = m_queue[m_tail++];
m_tail %= QUEUE_SIZE;
m_count = (m_count - 1) % QUEUE_SIZE; // dangel resets the fifo after filling it completely so maybe it expects an underflow
return ret;
@@ -356,7 +429,9 @@ void pc9801_86_device::device_timer(timer_instance const &timer)
}
//**************************************************************************
+//
// SpeakBoard device section
+//
//**************************************************************************
DEFINE_DEVICE_TYPE(PC9801_SPEAKBOARD, pc9801_speakboard_device, "pc9801_spb", "NEC PC9801 SpeakBoard")
@@ -365,11 +440,6 @@ ROM_START( pc9801_spb )
ROM_REGION( 0x4000, "sound_bios", ROMREGION_ERASEFF )
ROM_LOAD16_BYTE( "spb lh5764 ic21_pink.bin", 0x0001, 0x2000, CRC(5bcefa1f) SHA1(ae88e45d411bf5de1cb42689b12b6fca0146c586) )
ROM_LOAD16_BYTE( "spb lh5764 ic22_green.bin", 0x0000, 0x2000, CRC(a7925ced) SHA1(3def9ee386ab6c31436888261bded042cd64a0eb) )
-
- // RAM
- ROM_REGION( 0x100000, "opna", ROMREGION_ERASE00 )
-
- ROM_REGION( 0x100000, "opna_slave", ROMREGION_ERASE00 )
ROM_END
const tiny_rom_entry *pc9801_speakboard_device::device_rom_region() const
@@ -377,32 +447,21 @@ const tiny_rom_entry *pc9801_speakboard_device::device_rom_region() const
return ROM_NAME( pc9801_spb );
}
-
-//**************************************************************************
-// LIVE DEVICE
-//**************************************************************************
-
-//-------------------------------------------------
-// pc9801_speakboard_device - constructor
-//-------------------------------------------------
-
pc9801_speakboard_device::pc9801_speakboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : pc9801_86_device(mconfig, PC9801_SPEAKBOARD, tag, owner, clock),
- m_opna_slave(*this, "opna_slave")
+ : pc9801_86_device(mconfig, PC9801_SPEAKBOARD, tag, owner, clock)
+ , m_opna_slave(*this, "opna_slave")
{
}
void pc9801_speakboard_device::device_add_mconfig(machine_config &config)
{
pc9801_86_config(config);
-
- m_opna->reset_routes();
- m_opna->add_route(0, "lspeaker", 0.50);
- m_opna->add_route(0, "rspeaker", 0.50);
- m_opna->add_route(1, "lspeaker", 0.50);
- m_opna->add_route(2, "rspeaker", 0.50);
+ opna_reset_routes_config(config);
+ // TODO: confirm RAM mapping configuration (shared? not present on either chip? misc?)
+ m_opna->set_addrmap(0, &pc9801_speakboard_device::opna_map);
YM2608(config, m_opna_slave, 7.987_MHz_XTAL);
+ m_opna_slave->set_addrmap(0, &pc9801_speakboard_device::opna_map);
m_opna_slave->add_route(0, "lspeaker", 0.50);
m_opna_slave->add_route(0, "rspeaker", 0.50);
m_opna_slave->add_route(1, "lspeaker", 0.50);
@@ -421,22 +480,96 @@ void pc9801_speakboard_device::device_reset()
pc9801_86_device::device_reset();
}
-uint8_t pc9801_speakboard_device::opna_slave_r(offs_t offset)
+u8 pc9801_speakboard_device::opna_slave_r(offs_t offset)
{
if((offset & 1) == 0)
return m_opna_slave->read(offset >> 1);
else // odd
{
- logerror("PC9801-SPB: Read to undefined port [%02x]\n",offset+0x588);
+ logerror("%s: Read to undefined port [%02x]\n", machine().describe_context(), offset + 0x588);
return 0xff;
}
}
-void pc9801_speakboard_device::opna_slave_w(offs_t offset, uint8_t data)
+void pc9801_speakboard_device::opna_slave_w(offs_t offset, u8 data)
{
if((offset & 1) == 0)
m_opna_slave->write(offset >> 1,data);
else // odd
- logerror("PC9801-SPB: Write to undefined port [%02x] %02x\n",offset+0x588,data);
+ logerror("%s: Write to undefined port [%02x] %02x\n", machine().describe_context(), offset + 0x588, data);
}
+//**************************************************************************
+//
+// Otomi-chan Kai device section
+//
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(OTOMICHAN_KAI, otomichan_kai_device, "pc98_otomichan_kai", "MAD Factory Otomi-chan Kai") // 音美(おとみ)ちゃん改
+
+otomichan_kai_device::otomichan_kai_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : pc9801_86_device(mconfig, OTOMICHAN_KAI, tag, owner, clock)
+ , m_opn2c(*this, "opn2c")
+{
+}
+
+ROM_START( pc98_otomichan_kai )
+ ROM_REGION( 0x4000, "sound_bios", ROMREGION_ERASEFF )
+ // TODO: "compatible" with SpeakBoard, does it even uses a ROM altogether? low-res PCB pic doesn't help at all.
+ ROM_LOAD16_BYTE( "spb lh5764 ic21_pink.bin", 0x0001, 0x2000, BAD_DUMP CRC(5bcefa1f) SHA1(ae88e45d411bf5de1cb42689b12b6fca0146c586) )
+ ROM_LOAD16_BYTE( "spb lh5764 ic22_green.bin", 0x0000, 0x2000, BAD_DUMP CRC(a7925ced) SHA1(3def9ee386ab6c31436888261bded042cd64a0eb) )
+ROM_END
+
+const tiny_rom_entry *otomichan_kai_device::device_rom_region() const
+{
+ return ROM_NAME( pc98_otomichan_kai );
+}
+
+void otomichan_kai_device::device_add_mconfig(machine_config &config)
+{
+ pc9801_86_config(config);
+ opna_reset_routes_config(config);
+ // TODO: confirm if this has OPNA RAM
+ m_opna->set_addrmap(0, &otomichan_kai_device::opna_map);
+
+ YM3438(config, m_opn2c, 7.987_MHz_XTAL);
+ m_opn2c->add_route(0, "lspeaker", 0.50);
+ m_opn2c->add_route(1, "rspeaker", 0.50);
+}
+
+u8 otomichan_kai_device::id_r()
+{
+ // no ID, unconfirmed if it has mask
+ return 0xf0 | m_mask;
+}
+
+void otomichan_kai_device::device_start()
+{
+ pc9801_86_device::device_start();
+
+ m_bus->install_io(0x0788, 0x078f, read8sm_delegate(*this, FUNC(otomichan_kai_device::opn2c_r)), write8sm_delegate(*this, FUNC(otomichan_kai_device::opn2c_w)));
+}
+
+void otomichan_kai_device::device_reset()
+{
+ pc9801_86_device::device_reset();
+}
+
+u8 otomichan_kai_device::opn2c_r(offs_t offset)
+{
+ if((offset & 1) == 0)
+ return m_opn2c->read(offset >> 1);
+ else // odd
+ {
+ logerror("%s: Read to undefined port [%02x]\n", machine().describe_context(), offset + 0x788);
+ return 0xff;
+ }
+}
+
+void otomichan_kai_device::opn2c_w(offs_t offset, u8 data)
+{
+ if((offset & 1) == 0)
+ m_opn2c->write(offset >> 1, data);
+ else // odd
+ logerror("%s: Write to undefined port [%02x] %02x\n", machine().describe_context(), offset + 0x788, data);
+}
diff --git a/src/devices/bus/cbus/pc9801_86.h b/src/devices/bus/cbus/pc9801_86.h
index a752121a8ac..fc19f908344 100644
--- a/src/devices/bus/cbus/pc9801_86.h
+++ b/src/devices/bus/cbus/pc9801_86.h
@@ -29,13 +29,6 @@ public:
pc9801_86_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
pc9801_86_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
- uint8_t opna_r(offs_t offset);
- void opna_w(offs_t offset, uint8_t data);
- uint8_t id_r();
- void mask_w(uint8_t data);
- uint8_t pcm_r(offs_t offset);
- void pcm_w(offs_t offset, uint8_t data);
-
DECLARE_WRITE_LINE_MEMBER(sound_irq);
protected:
@@ -45,25 +38,37 @@ protected:
virtual void device_reset() override;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
+ void opna_reset_routes_config(machine_config &config);
virtual ioport_constructor device_input_ports() const override;
virtual const tiny_rom_entry *device_rom_region() const override;
virtual void device_timer(timer_instance const &timer) override;
void pc9801_86_config(machine_config &config);
+ virtual u16 read_io_base() override;
required_device<pc9801_slot_device> m_bus;
required_device<ym2608_device> m_opna;
+ void opna_map(address_map &map);
+
+ u8 opna_r(offs_t offset);
+ void opna_w(offs_t offset, u8 data);
+ virtual u8 id_r();
+ void mask_w(u8 data);
+ u8 pcm_r(offs_t offset);
+ void pcm_w(offs_t offset, u8 data);
+
+ u8 m_mask;
+
private:
int queue_count();
- uint8_t queue_pop();
-
+ u8 queue_pop();
- uint8_t m_mask, m_pcm_mode, m_vol[7], m_pcm_ctrl, m_pcm_mute;
+ u8 m_pcm_mode, m_vol[7], m_pcm_ctrl, m_pcm_mute;
uint16_t m_head, m_tail, m_count, m_irq_rate;
bool m_pcmirq, m_fmirq, m_pcm_clk, m_init;
required_device<dac_word_interface> m_ldac;
required_device<dac_word_interface> m_rdac;
- std::vector<uint8_t> m_queue;
+ std::vector<u8> m_queue;
emu_timer *m_dac_timer;
};
@@ -73,8 +78,10 @@ public:
// construction/destruction
pc9801_speakboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- uint8_t opna_slave_r(offs_t offset);
- void opna_slave_w(offs_t offset, uint8_t data);
+ static constexpr feature_type imperfect_features() { return feature::SOUND; }
+
+ u8 opna_slave_r(offs_t offset);
+ void opna_slave_w(offs_t offset, u8 data);
protected:
virtual void device_add_mconfig(machine_config &config) override;
@@ -86,13 +93,33 @@ private:
required_device<ym2608_device> m_opna_slave;
};
+class otomichan_kai_device : public pc9801_86_device
+{
+public:
+ // construction/destruction
+ otomichan_kai_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-// device type definition
-DECLARE_DEVICE_TYPE(PC9801_86, pc9801_86_device)
-DECLARE_DEVICE_TYPE(PC9801_SPEAKBOARD, pc9801_speakboard_device)
+ static constexpr feature_type imperfect_features() { return feature::SOUND; }
+ u8 opn2c_r(offs_t offset);
+ void opn2c_w(offs_t offset, u8 data);
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+private:
+ required_device<ym3438_device> m_opn2c;
+
+ virtual u8 id_r() override;
+};
+// device type definition
+DECLARE_DEVICE_TYPE(PC9801_86, pc9801_86_device)
+DECLARE_DEVICE_TYPE(PC9801_SPEAKBOARD, pc9801_speakboard_device)
+DECLARE_DEVICE_TYPE(OTOMICHAN_KAI, otomichan_kai_device)
#endif // MAME_BUS_CBUS_PC9801_86_H
diff --git a/src/devices/bus/cbus/pc9801_amd98.cpp b/src/devices/bus/cbus/pc9801_amd98.cpp
index a6eeb015c4c..5b4d66bbdff 100644
--- a/src/devices/bus/cbus/pc9801_amd98.cpp
+++ b/src/devices/bus/cbus/pc9801_amd98.cpp
@@ -1,6 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Angelo Salese
-/***************************************************************************
+/**************************************************************************************************
System Sacom AMD-98 (AmuseMent boarD)
@@ -13,7 +13,7 @@
- PIT control;
- PCM section;
-=============================================================================
+===================================================================================================
- Known games with AMD-98 support
Brown's Run (System Sacom)
@@ -25,7 +25,7 @@
Relics (Bothtec)
Thexder (Game Arts)
-***************************************************************************/
+**************************************************************************************************/
#include "emu.h"
#include "bus/cbus/pc9801_amd98.h"
@@ -37,7 +37,7 @@
//**************************************************************************
// device type definition
-DEFINE_DEVICE_TYPE(PC9801_AMD98, pc9801_amd98_device, "pc9801_amd98", "pc9801_amd98")
+DEFINE_DEVICE_TYPE(PC9801_AMD98, pc9801_amd98_device, "pc9801_amd98", "System Sacom AMD-98")
//-------------------------------------------------
// device_add_mconfig - add device configuration
@@ -101,11 +101,11 @@ ioport_constructor pc9801_amd98_device::device_input_ports() const
//-------------------------------------------------
pc9801_amd98_device::pc9801_amd98_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, PC9801_AMD98, tag, owner, clock),
- m_bus(*this, DEVICE_SELF_OWNER),
- m_ay1(*this, "ay1"),
- m_ay2(*this, "ay2"),
- m_ay3(*this, "ay3")
+ : device_t(mconfig, PC9801_AMD98, tag, owner, clock)
+ , m_bus(*this, DEVICE_SELF_OWNER)
+ , m_ay1(*this, "ay1")
+ , m_ay2(*this, "ay2")
+ , m_ay3(*this, "ay3")
{
}
diff --git a/src/devices/bus/cbus/pc9801_amd98.h b/src/devices/bus/cbus/pc9801_amd98.h
index fa031edbe1b..f26246c768b 100644
--- a/src/devices/bus/cbus/pc9801_amd98.h
+++ b/src/devices/bus/cbus/pc9801_amd98.h
@@ -2,7 +2,7 @@
// copyright-holders:Angelo Salese
/***************************************************************************
- NEC PC-9801-118
+ System Sacom AMD-98 (AmuseMent boarD)
***************************************************************************/
@@ -14,12 +14,11 @@
#include "bus/cbus/pc9801_cbus.h"
#include "sound/ay8910.h"
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
-// ======================> pc9801_118_device
+// ======================> pc9801_amd98_device
class pc9801_amd98_device : public device_t
{
@@ -54,12 +53,7 @@ private:
};
-
// device type definition
DECLARE_DEVICE_TYPE(PC9801_AMD98, pc9801_amd98_device)
-
-
-
-
-#endif // MAME_BUS_CBUS_PC9801_118_H
+#endif // MAME_BUS_CBUS_PC9801_AMD98_H
diff --git a/src/devices/bus/cbus/pc9801_cbus.cpp b/src/devices/bus/cbus/pc9801_cbus.cpp
index 649676d31f1..9077d8cc4ea 100644
--- a/src/devices/bus/cbus/pc9801_cbus.cpp
+++ b/src/devices/bus/cbus/pc9801_cbus.cpp
@@ -1,15 +1,23 @@
// license:BSD-3-Clause
// copyright-holders:Angelo Salese
-/**********************************************************************
+/**************************************************************************************************
C-bus slot interface for PC-98xx family
a.k.a. NEC version of the ISA bus.
+ C-bus -> Card Bus
TODO:
- stub interface, checkout what actually belongs here.
+ Speculation is that C-bus has ROM / RAM slots always in the 0xc0000-0xdffff region,
+ and some opacity can be added if true.
+ - move pc9801_cbus_devices declaration from pc9801 driver in here;
+ - 8-bit I/O smearing should be handled here;
+ - INT# should be handled here too;
+ - Best way to inform user when it tries to install incompatible boards?
+ - Support for PCI bridging on later machines (cfr. pc9801cx3);
-**********************************************************************/
+**************************************************************************************************/
#include "emu.h"
#include "pc9801_cbus.h"
@@ -123,3 +131,35 @@ template void pc9801_slot_device::install_io<read8_delegate, write8_delegate
template void pc9801_slot_device::install_io<read8s_delegate, write8s_delegate >(offs_t start, offs_t end, read8s_delegate rhandler, write8s_delegate whandler);
template void pc9801_slot_device::install_io<read8sm_delegate, write8sm_delegate >(offs_t start, offs_t end, read8sm_delegate rhandler, write8sm_delegate whandler);
template void pc9801_slot_device::install_io<read8smo_delegate, write8smo_delegate>(offs_t start, offs_t end, read8smo_delegate rhandler, write8smo_delegate whandler);
+
+// boilerplate code for boards that has configurable I/O with either Jumpers or Dip-Switches
+// NB: client must have a mechanism to remember what port has been used before and after calling this,
+// in order to avoid "last instantiated wins" issues with overlapping board full configs.
+void pc9801_slot_device::flush_install_io(const char *client_tag, u16 old_io, u16 new_io, u16 size, read8sm_delegate rhandler, write8sm_delegate whandler)
+{
+ // initialize if client have this unmapped (such as first boot)
+ // device_start fns cannot read input ports ...
+ if (old_io == 0)
+ old_io = new_io;
+
+ logerror("%s: %s uninstall I/O at %04x-%04x\n",
+ this->tag(),
+ client_tag,
+ old_io,
+ old_io + size
+ );
+ this->io_space().unmap_readwrite(old_io, old_io + size);
+
+ logerror("%s: %s install I/O at %04x-%04x\n",
+ this->tag(),
+ client_tag,
+ new_io,
+ new_io + size
+ );
+ this->install_io(
+ new_io,
+ new_io + size,
+ rhandler,
+ whandler
+ );
+}
diff --git a/src/devices/bus/cbus/pc9801_cbus.h b/src/devices/bus/cbus/pc9801_cbus.h
index 728aca3e692..ab7085dfa86 100644
--- a/src/devices/bus/cbus/pc9801_cbus.h
+++ b/src/devices/bus/cbus/pc9801_cbus.h
@@ -113,6 +113,8 @@ public:
template<int I> void int_w(bool state) { m_int_callback[I](state); }
template<typename R, typename W> void install_io(offs_t start, offs_t end, R rhandler, W whandler);
+ void flush_install_io(const char *client_tag, u16 old_io, u16 new_io, u16 size, read8sm_delegate rhandler, write8sm_delegate whandler);
+
protected:
// device-level overrides
virtual void device_start() override;
diff --git a/src/devices/bus/cbus/pc9801_snd.cpp b/src/devices/bus/cbus/pc9801_snd.cpp
index 6a611d77e78..3a33cfe6757 100644
--- a/src/devices/bus/cbus/pc9801_snd.cpp
+++ b/src/devices/bus/cbus/pc9801_snd.cpp
@@ -3,21 +3,19 @@
/***************************************************************************
NEC PC-9801
- common functions for CBUS sound boards -26, -86, -118
+ common functions for C-bus sound boards -26, -86, -118
***************************************************************************/
#include "emu.h"
#include "pc9801_snd.h"
-//DEFINE_DEVICE_TYPE(PC9801_SND, pc9801_snd_device, "pc9801_snd", "PC9801 CBUS Sound")
-
pc9801_snd_device::pc9801_snd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, type, tag, owner, clock)
{
}
-uint8_t pc9801_snd_device::opn_porta_r()
+u8 pc9801_snd_device::opn_porta_r()
{
if(m_joy_sel & 0x80)
return ioport(m_joy_sel & 0x40 ? "PA2" : "PA1")->read();
@@ -25,7 +23,7 @@ uint8_t pc9801_snd_device::opn_porta_r()
return 0xff;
}
-void pc9801_snd_device::opn_portb_w(uint8_t data) { m_joy_sel = data; }
+void pc9801_snd_device::opn_portb_w(u8 data) { m_joy_sel = data; }
INPUT_PORTS_START(pc9801_joy_port)
PORT_START("PA1")
diff --git a/src/devices/bus/cbus/pc9801_snd.h b/src/devices/bus/cbus/pc9801_snd.h
index c7408c09383..0c9c694a4e3 100644
--- a/src/devices/bus/cbus/pc9801_snd.h
+++ b/src/devices/bus/cbus/pc9801_snd.h
@@ -18,11 +18,13 @@ public:
pc9801_snd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
protected:
- uint8_t opn_porta_r();
- void opn_portb_w(uint8_t data);
+ u8 opn_porta_r();
+ void opn_portb_w(u8 data);
+ u16 m_io_base;
+ virtual u16 read_io_base() = 0;
private:
- uint8_t m_joy_sel;
+ u8 m_joy_sel;
};
//DECLARE_DEVICE_TYPE(PC9801_SND, pc9801_snd_device)
diff --git a/src/devices/bus/cgenie/expansion/floppy.cpp b/src/devices/bus/cgenie/expansion/floppy.cpp
index b6f0a9c30ac..ee914179d10 100644
--- a/src/devices/bus/cgenie/expansion/floppy.cpp
+++ b/src/devices/bus/cgenie/expansion/floppy.cpp
@@ -181,7 +181,7 @@ DEVICE_IMAGE_LOAD_MEMBER( cgenie_fdc_device::socket_load )
if (size > 0x1000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported ROM size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported ROM size");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/coco/coco_dwsock.cpp b/src/devices/bus/coco/coco_dwsock.cpp
index b970458c91c..20bce7d55d8 100644
--- a/src/devices/bus/coco/coco_dwsock.cpp
+++ b/src/devices/bus/coco/coco_dwsock.cpp
@@ -82,18 +82,14 @@ beckerport_device::~beckerport_device()
void beckerport_device::device_start()
{
- char chAddress[64];
-
- /* format address string for opening the port */
- snprintf(chAddress, sizeof(chAddress), "socket.%s:%d", m_hostname, m_dwtcpport);
-
- osd_printf_verbose("Connecting to Drivewire server on %s:%d... ", m_hostname, m_dwtcpport);
+ osd_printf_verbose("%s: Connecting to Drivewire server on %s:%d... ", tag(), m_hostname, m_dwtcpport);
u64 filesize; // unused
- osd_file::error filerr = osd_file::open(chAddress, 0, m_pSocket, filesize);
- if (filerr != osd_file::error::NONE)
+ /* format address string for opening the port */
+ std::error_condition filerr = osd_file::open(util::string_format("socket.%s:%d", m_hostname, m_dwtcpport), 0, m_pSocket, filesize);
+ if (filerr)
{
- osd_printf_verbose("Error: osd_open returned error %i!\n", (int) filerr);
+ osd_printf_verbose("Error: osd_open returned error %s:%d %s!\n", filerr.category().name(), filerr.value(), filerr.message());
return;
}
@@ -108,7 +104,7 @@ void beckerport_device::device_stop()
{
if (m_pSocket)
{
- printf("Closing connection to Drivewire server\n");
+ printf("%s: Closing connection to Drivewire server\n", tag());
m_pSocket.reset();
}
}
@@ -139,24 +135,25 @@ u8 beckerport_device::read(offs_t offset)
case DWS_STATUS:
if (!m_rx_pending)
{
- /* Try to read from dws */
- osd_file::error filerr = m_pSocket->read(m_buf, 0, sizeof(m_buf), m_rx_pending);
- if (filerr != osd_file::error::NONE && filerr != osd_file::error::FAILURE) // osd_file::error::FAILURE means no data available, so don't throw error message
- fprintf(stderr, "coco_dwsock.c: beckerport_device::read() socket read operation failed with osd_file::error %i\n", int(filerr));
+ // Try to read from dws
+ std::error_condition filerr = m_pSocket->read(m_buf, 0, sizeof(m_buf), m_rx_pending);
+ if (filerr && (std::errc::operation_would_block != filerr))
+ osd_printf_error("%s: coco_dwsock.c: beckerport_device::read() socket read operation failed with error %s:%d %s\n", tag(), filerr.category().name(), filerr.value(), filerr.message());
else
m_head = 0;
}
- //printf("beckerport_device: status read. %i bytes remaining.\n", m_rx_pending);
+ //logerror("beckerport_device: status read. %i bytes remaining.\n", m_rx_pending);
data = (m_rx_pending > 0) ? 2 : 0;
break;
case DWS_DATA:
- if (!m_rx_pending) {
- fprintf(stderr, "coco_dwsock.c: beckerport_device::read() buffer underrun\n");
+ if (!m_rx_pending)
+ {
+ osd_printf_error("%s: coco_dwsock.c: beckerport_device::read() buffer underrun\n", tag());
break;
}
data = m_buf[m_head++];
m_rx_pending--;
- //printf("beckerport_device: data read 1 byte (0x%02x). %i bytes remaining.\n", data&0xff, m_rx_pending);
+ //logerror("beckerport_device: data read 1 byte (0x%02x). %i bytes remaining.\n", data&0xff, m_rx_pending);
break;
default:
fprintf(stderr, "%s: read from bad offset %d\n", __FILE__, offset);
@@ -172,7 +169,7 @@ u8 beckerport_device::read(offs_t offset)
void beckerport_device::write(offs_t offset, u8 data)
{
char d = char(data);
- osd_file::error filerr;
+ std::error_condition filerr;
u32 written;
if (!m_pSocket)
@@ -181,13 +178,13 @@ void beckerport_device::write(offs_t offset, u8 data)
switch (offset)
{
case DWS_STATUS:
- //printf("beckerport_write: error: write (0x%02x) to status register\n", d);
+ //logerror("beckerport_write: error: write (0x%02x) to status register\n", d);
break;
case DWS_DATA:
filerr = m_pSocket->write(&d, 0, 1, written);
- if (filerr != osd_file::error::NONE)
- fprintf(stderr, "coco_dwsock.c: beckerport_device::write() socket write operation failed with osd_file::error %i\n", int(filerr));
- //printf("beckerport_write: data write one byte (0x%02x)\n", d & 0xff);
+ if (filerr)
+ osd_printf_error("%s: coco_dwsock.c: beckerport_device::write() socket write operation failed with error %s:%d %s\n", tag(), filerr.category().name(), filerr.value(), filerr.message());
+ //logerror("beckerport_write: data write one byte (0x%02x)\n", d & 0xff);
break;
default:
fprintf(stderr, "%s: write to bad offset %d\n", __FILE__, offset);
diff --git a/src/devices/bus/coco/cococart.cpp b/src/devices/bus/coco/cococart.cpp
index e4568cfff48..ee772c03dae 100644
--- a/src/devices/bus/coco/cococart.cpp
+++ b/src/devices/bus/coco/cococart.cpp
@@ -714,11 +714,11 @@ void coco_cart_add_basic_devices(device_slot_interface &device)
device.option_add("gmc", COCO_PAK_GMC);
device.option_add("max", COCO_PAK_MAX);
device.option_add("midi", COCO_MIDI);
- device.option_add("msx2", DRAGON_MSX2);
device.option_add("orch90", COCO_ORCH90);
device.option_add("ram", COCO_PAK_RAM);
device.option_add("rs232", COCO_RS232);
device.option_add("ssc", COCO_SSC);
+ device.option_add("ssfm", DRAGON_MSX2);
device.option_add("stecomp", COCO_STEREO_COMPOSER);
device.option_add("sym12", COCO_SYM12);
device.option_add("wpk", COCO_WPK);
@@ -770,13 +770,13 @@ void dragon_cart_add_basic_devices(device_slot_interface &device)
device.option_add("jcbspch", DRAGON_JCBSPCH);
device.option_add("max", COCO_PAK_MAX);
device.option_add("midi", DRAGON_MIDI);
- device.option_add("msx2", DRAGON_MSX2);
device.option_add("orch90", COCO_ORCH90);
device.option_add("pak", COCO_PAK);
device.option_add("serial", DRAGON_SERIAL);
device.option_add("ram", COCO_PAK_RAM);
device.option_add("sprites", DRAGON_SPRITES);
device.option_add("ssc", COCO_SSC);
+ device.option_add("ssfm", DRAGON_MSX2);
device.option_add("stecomp", COCO_STEREO_COMPOSER);
device.option_add("sym12", COCO_SYM12);
device.option_add("wpk2p", COCO_WPK2P);
diff --git a/src/devices/bus/coco/dragon_msx2.cpp b/src/devices/bus/coco/dragon_msx2.cpp
index 9460b6955f3..a8da5565991 100644
--- a/src/devices/bus/coco/dragon_msx2.cpp
+++ b/src/devices/bus/coco/dragon_msx2.cpp
@@ -3,7 +3,7 @@
// thanks-to:John Whitworth
/***************************************************************************
- Dragon MSX 2+ by DragonPlus Electronics
+ SuperSprite FM+ by DragonPlus Electronics (formerly Dragon MSX 2+)
***************************************************************************/
@@ -18,7 +18,7 @@
// GLOBAL VARIABLES
//**************************************************************************
-DEFINE_DEVICE_TYPE(DRAGON_MSX2, dragon_msx2_device, "dragon_msx2", "Dragon MSX 2+")
+DEFINE_DEVICE_TYPE(DRAGON_MSX2, dragon_msx2_device, "dragon_msx2", "6x09 SuperSprite FM+")
//-------------------------------------------------
diff --git a/src/devices/bus/crvision/slot.cpp b/src/devices/bus/crvision/slot.cpp
index ecab87796e4..ce1e2a5ea1e 100644
--- a/src/devices/bus/crvision/slot.cpp
+++ b/src/devices/bus/crvision/slot.cpp
@@ -145,7 +145,7 @@ image_init_result crvision_cart_slot_device::call_load()
if (size > 0x4800)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Image extends beyond the expected size for an APF cart");
+ seterror(image_error::INVALIDIMAGE, "Image extends beyond the expected size for an APF cart");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/electron/cart/ap5.cpp b/src/devices/bus/electron/cart/ap5.cpp
index cc4c951a154..90c4188d7b1 100644
--- a/src/devices/bus/electron/cart/ap5.cpp
+++ b/src/devices/bus/electron/cart/ap5.cpp
@@ -161,7 +161,7 @@ image_init_result electron_ap5_device::load_rom(device_image_interface &image, g
// socket accepts 8K and 16K ROM only
if (size != 0x2000 && size != 0x4000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only 8K/16K is supported");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid size: Only 8K/16K is supported");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/electron/cart/romp144.cpp b/src/devices/bus/electron/cart/romp144.cpp
index de947454fd8..8bdeab7cc34 100644
--- a/src/devices/bus/electron/cart/romp144.cpp
+++ b/src/devices/bus/electron/cart/romp144.cpp
@@ -147,7 +147,7 @@ image_init_result electron_romp144_device::load_rom(device_image_interface &imag
// socket accepts 8K and 16K ROM only
if (size != 0x2000 && size != 0x4000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only 8K/16K is supported");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid size: Only 8K/16K is supported");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/electron/cart/slot.cpp b/src/devices/bus/electron/cart/slot.cpp
index 489cb567c4d..342cd3ae4f8 100644
--- a/src/devices/bus/electron/cart/slot.cpp
+++ b/src/devices/bus/electron/cart/slot.cpp
@@ -132,7 +132,7 @@ image_init_result electron_cartslot_device::call_load()
if (size % 0x2000)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
@@ -152,7 +152,7 @@ image_init_result electron_cartslot_device::call_load()
if ((upsize % 0x2000 && upsize != 0) || (losize % 0x2000 && losize != 0) || (romsize % 0x2000 && romsize != 0))
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/electron/exp.cpp b/src/devices/bus/electron/exp.cpp
index f7c14b71c05..304306b09a0 100644
--- a/src/devices/bus/electron/exp.cpp
+++ b/src/devices/bus/electron/exp.cpp
@@ -101,6 +101,7 @@ void electron_expansion_slot_device::expbus_w(offs_t offset, uint8_t data)
// slot devices
#include "fbjoy.h"
#include "fbprint.h"
+#include "mc68k.h"
#include "mode7.h"
//#include "lebox.h"
#include "plus1.h"
@@ -120,6 +121,7 @@ void electron_expansion_devices(device_slot_interface &device)
device.option_add("ap6", ELECTRON_AP6);
device.option_add("fbjoy", ELECTRON_FBJOY);
device.option_add("fbprint", ELECTRON_FBPRINT);
+ device.option_add("mc68k", ELECTRON_MC68K);
device.option_add("mode7", ELECTRON_MODE7);
//device.option_add("lebox", ELECTRON_LEBOX);
device.option_add("plus1", ELECTRON_PLUS1);
diff --git a/src/devices/bus/electron/mc68k.cpp b/src/devices/bus/electron/mc68k.cpp
new file mode 100644
index 00000000000..b0d591f0985
--- /dev/null
+++ b/src/devices/bus/electron/mc68k.cpp
@@ -0,0 +1,243 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Electron 68000 Expansion
+
+ This is a homebrew 68000 second processor for the Electron from around 1990.
+
+ Commands:
+ *FX29 - sends a short stub to the 68000 which tells it to:
+ (a) start the 68000 OS in ROM now.
+ (b) start the 68000 OS on every reset from now on, until the next
+ CTRL+BREAK or power cycle.
+ *FX28 - tells sideways bank 12 to make itself the current language ROM on the
+ 6502, and the language entry point tells the 68000 to start the BASIC
+ interpreter in ROM, but the 68000 OS has to be currently running.
+
+ BREAK will restart the current language ROM, so will restart 68000 BASIC.
+ CTRL+BREAK will go back to 6502 BASIC as the language ROM.
+
+ Usage notes:
+ - to enter 68000 BASIC do *FX29, then *FX28, then BREAK.
+ - to start the word processor, do CALL&407000 from the 68000 BASIC prompt.
+ - to use the assembler, type your assembly code in as a BASIC program, with
+ instruction mnemonics in lower case. Set D% to where in RAM you want the
+ object code stored and P% to 2, then CALL&401C8C.
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "mc68k.h"
+#include "machine/6522via.h"
+#include "machine/6850acia.h"
+#include "machine/clock.h"
+#include "machine/input_merger.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(ELECTRON_MC68K, electron_mc68k_device, "electron_mc68k", "Electron 68000 Expansion")
+
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( mem_map )
+//-------------------------------------------------
+
+void electron_mc68k_device::mem_map(address_map &map)
+{
+ map(0x000000, 0x00ffff).ram();
+ map(0x400000, 0x40ffff).rom().region("main_rom", 0);
+ map(0x800000, 0x800fff).rom().region("boot_rom", 0);
+ map(0xff8000, 0xff801f).rw("via", FUNC(via6522_device::read), FUNC(via6522_device::write)).umask16(0xff00);
+ map(0xff8020, 0xff803f).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write)).umask16(0xff00);
+ map(0xff8040, 0xff805f).rw("acia", FUNC(acia6850_device::read), FUNC(acia6850_device::write)).umask16(0xff00);
+}
+
+//-------------------------------------------------
+// ROM( mc68k )
+//-------------------------------------------------
+
+ROM_START( mc68k )
+ ROM_REGION(0x8000, "exp_rom", 0)
+ ROM_LOAD("elk68k_lower.bin", 0x0000, 0x4000, CRC(6e18f9fb) SHA1(31d228e4b6be18c51dd6a0c42c9e6e1e507decc6))
+ ROM_LOAD("elk68k_upper.bin", 0x4000, 0x4000, CRC(0c960571) SHA1(cf3a060fee7ac23128d9e4657790d218681e6e61))
+
+ ROM_REGION16_BE(0x1000, "boot_rom", ROMREGION_ERASE00)
+ ROM_LOAD("68kboot.bin", 0x0000, 0x0100, CRC(5855ef60) SHA1(76165ee0f34a24fd2a908987fd5f05e23ea75677))
+
+ ROM_REGION16_BE(0x10000, "main_rom", ROMREGION_ERASE00)
+ ROM_LOAD("68kmain.bin", 0x0000, 0x10000, CRC(4d7a9e4f) SHA1(90afb5910995511ae943ad62ea2967eff85e8ef7))
+ROM_END
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void electron_mc68k_device::device_add_mconfig(machine_config &config)
+{
+ M68000(config, m_maincpu, 10_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &electron_mc68k_device::mem_map);
+ m_maincpu->disable_interrupt_mixer();
+
+ INPUT_MERGER_ANY_HIGH(config, "irq_ipl0").output_handler().set_inputline(m_maincpu, M68K_IRQ_IPL0);
+ INPUT_MERGER_ANY_HIGH(config, "irq_ipl1").output_handler().set_inputline(m_maincpu, M68K_IRQ_IPL1);
+ INPUT_MERGER_ANY_HIGH(config, "irq_exp").output_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w));
+
+ RAM(config, m_ram).set_default_size("256K").set_extra_options("64K,128K,192K");
+
+ PIA6821(config, m_pia[0], 0);
+ m_pia[0]->writepb_handler().set(m_pia[1], FUNC(pia6821_device::set_a_input));
+ m_pia[0]->ca2_handler().set(m_pia[1], FUNC(pia6821_device::cb1_w));
+ m_pia[0]->cb2_handler().set(m_pia[1], FUNC(pia6821_device::ca1_w));
+ m_pia[0]->irqa_handler().set("irq_ipl0", FUNC(input_merger_device::in_w<0>));
+ m_pia[0]->irqb_handler().set("irq_ipl0", FUNC(input_merger_device::in_w<1>));
+
+ PIA6821(config, m_pia[1], 0);
+ m_pia[1]->writepb_handler().set(m_pia[0], FUNC(pia6821_device::set_a_input));
+ m_pia[1]->ca2_handler().set(m_pia[0], FUNC(pia6821_device::cb1_w));
+ m_pia[1]->cb2_handler().set(m_pia[0], FUNC(pia6821_device::ca1_w));
+ m_pia[1]->irqa_handler().set("irq_exp", FUNC(input_merger_device::in_w<0>));
+ m_pia[1]->irqb_handler().set("irq_exp", FUNC(input_merger_device::in_w<1>));
+
+ via6522_device &via(MOS6522(config, "via", 10_MHz_XTAL / 10));
+ via.irq_handler().set("irq_ipl1", FUNC(input_merger_device::in_w<0>));
+
+ acia6850_device &acia(ACIA6850(config, "acia", 0));
+ acia.irq_handler().set("irq_ipl1", FUNC(input_merger_device::in_w<1>));
+
+ clock_device &acia_clock(CLOCK(config, "acia_clock", 3.6864_MHz_XTAL / 12));
+ acia_clock.signal_handler().set("acia", FUNC(acia6850_device::write_txc));
+ acia_clock.signal_handler().append("acia", FUNC(acia6850_device::write_rxc));
+}
+
+const tiny_rom_entry *electron_mc68k_device::device_rom_region() const
+{
+ return ROM_NAME( mc68k );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// electron_mc68k_device - constructor
+//-------------------------------------------------
+
+electron_mc68k_device::electron_mc68k_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, ELECTRON_MC68K, tag, owner, clock)
+ , device_electron_expansion_interface(mconfig, *this)
+ , m_maincpu(*this, "maincpu")
+ , m_ram(*this, RAM_TAG)
+ , m_pia(*this, "pia%u", 0U)
+ , m_boot_rom(*this, "boot_rom")
+ , m_exp_rom(*this, "exp_rom")
+ , m_romsel(0)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void electron_mc68k_device::device_start()
+{
+ save_item(NAME(m_romsel));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void electron_mc68k_device::device_reset()
+{
+ address_space &program = m_maincpu->space(AS_PROGRAM);
+
+ // address map during booting
+ program.install_rom(0x0000, 0x0fff, m_boot_rom->base());
+
+ m_rom_shadow_tap = program.install_read_tap(0x800000, 0xffffff, "rom_shadow_r", [this](offs_t offset, u16 &data, u16 mem_mask)
+ {
+ if (!machine().side_effects_disabled())
+ {
+ // delete this tap
+ m_rom_shadow_tap->remove();
+
+ // address map after booting
+ m_maincpu->space(AS_PROGRAM).install_ram(0x000000, m_ram->mask(), m_ram->pointer());
+ }
+
+ // return the original data
+ return data;
+ });
+}
+
+//-------------------------------------------------
+// expbus_r - expansion data read
+//-------------------------------------------------
+
+u8 electron_mc68k_device::expbus_r(offs_t offset)
+{
+ u8 data = 0xff;
+
+ switch (offset >> 12)
+ {
+ case 0x8: case 0x9: case 0xa: case 0xb:
+ switch (m_romsel)
+ {
+ case 12:
+ data = m_exp_rom->base()[0x0000 | (offset & 0x3fff)];
+ break;
+ case 13:
+ data = m_exp_rom->base()[0x4000 | (offset & 0x3fff)];
+ break;
+ }
+ break;
+
+ case 0xf:
+ switch (offset >> 8)
+ {
+ case 0xfd:
+ switch (offset & 0xf8)
+ {
+ case 0x80:
+ data = m_pia[1]->read_alt(offset);
+ break;
+ }
+ break;
+ }
+ }
+
+ return data;
+}
+
+//-------------------------------------------------
+// expbus_w - expansion data write
+//-------------------------------------------------
+
+void electron_mc68k_device::expbus_w(offs_t offset, u8 data)
+{
+ switch (offset >> 8)
+ {
+ case 0xfd:
+ switch (offset & 0xf8)
+ {
+ case 0x80:
+ m_pia[1]->write_alt(offset, data);
+ break;
+ }
+ break;
+
+ case 0xfe:
+ if (offset == 0xfe05)
+ {
+ m_romsel = data & 0x0f;
+ }
+ break;
+ }
+}
diff --git a/src/devices/bus/electron/mc68k.h b/src/devices/bus/electron/mc68k.h
new file mode 100644
index 00000000000..a95223a3f93
--- /dev/null
+++ b/src/devices/bus/electron/mc68k.h
@@ -0,0 +1,63 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Electron 68000 Expansion
+
+**********************************************************************/
+
+#ifndef MAME_BUS_ELECTRON_MC68K_M
+#define MAME_BUS_ELECTRON_MC68K_M
+
+#pragma once
+
+#include "exp.h"
+#include "cpu/m68000/m68000.h"
+#include "machine/6821pia.h"
+#include "machine/ram.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class electron_mc68k_device:
+ public device_t,
+ public device_electron_expansion_interface
+{
+public:
+ // construction/destruction
+ electron_mc68k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual u8 expbus_r(offs_t offset) override;
+ virtual void expbus_w(offs_t offset, u8 data) override;
+
+private:
+ required_device<m68000_base_device> m_maincpu;
+ required_device<ram_device> m_ram;
+ required_device_array<pia6821_device, 2> m_pia;
+ required_memory_region m_boot_rom;
+ required_memory_region m_exp_rom;
+
+ memory_passthrough_handler *m_rom_shadow_tap;
+
+ void mem_map(address_map &map);
+
+ u8 m_romsel;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(ELECTRON_MC68K, electron_mc68k_device)
+
+
+#endif // MAME_BUS_ELECTRON_MC68K_M
diff --git a/src/devices/bus/electron/plus1.cpp b/src/devices/bus/electron/plus1.cpp
index 5bf61578b2b..4b2c3ba9dad 100644
--- a/src/devices/bus/electron/plus1.cpp
+++ b/src/devices/bus/electron/plus1.cpp
@@ -522,7 +522,7 @@ image_init_result electron_ap6_device::load_rom(device_image_interface &image, g
// socket accepts 8K and 16K ROM only
if (size != 0x2000 && size != 0x4000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only 8K/16K is supported");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid size: Only 8K/16K is supported");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/electron/plus2.cpp b/src/devices/bus/electron/plus2.cpp
index d379f053047..82e75bd6030 100644
--- a/src/devices/bus/electron/plus2.cpp
+++ b/src/devices/bus/electron/plus2.cpp
@@ -231,7 +231,7 @@ image_init_result electron_plus2_device::load_rom(device_image_interface &image,
// socket accepts 8K and 16K ROM only
if (size != 0x2000 && size != 0x4000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only 8K/16K is supported");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid size: Only 8K/16K is supported");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/electron/rombox.cpp b/src/devices/bus/electron/rombox.cpp
index 920419c2d66..47040271e7f 100644
--- a/src/devices/bus/electron/rombox.cpp
+++ b/src/devices/bus/electron/rombox.cpp
@@ -185,7 +185,7 @@ image_init_result electron_rombox_device::load_rom(device_image_interface &image
// socket accepts 8K and 16K ROM only
if (size != 0x2000 && size != 0x4000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only 8K/16K is supported");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid size: Only 8K/16K is supported");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/electron/romboxp.cpp b/src/devices/bus/electron/romboxp.cpp
index e6cfd472989..59d83bc4121 100644
--- a/src/devices/bus/electron/romboxp.cpp
+++ b/src/devices/bus/electron/romboxp.cpp
@@ -328,7 +328,7 @@ image_init_result electron_romboxp_device::load_rom(device_image_interface &imag
// socket accepts 8K and 16K ROM only
if (size != 0x2000 && size != 0x4000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only 8K/16K is supported");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid size: Only 8K/16K is supported");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/electron/sidewndr.cpp b/src/devices/bus/electron/sidewndr.cpp
index e66ac800f3c..a2ab8011b09 100644
--- a/src/devices/bus/electron/sidewndr.cpp
+++ b/src/devices/bus/electron/sidewndr.cpp
@@ -174,7 +174,7 @@ image_init_result electron_sidewndr_device::load_rom(device_image_interface &ima
// socket accepts 8K and 16K ROM only
if (size != 0x2000 && size != 0x4000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only 8K/16K is supported");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid size: Only 8K/16K is supported");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/gamate/slot.cpp b/src/devices/bus/gamate/slot.cpp
index 625e4103482..3f98a30927d 100644
--- a/src/devices/bus/gamate/slot.cpp
+++ b/src/devices/bus/gamate/slot.cpp
@@ -134,7 +134,7 @@ image_init_result gamate_cart_slot_device::call_load()
if (len > 0x80000)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/gameboy/gb_slot.cpp b/src/devices/bus/gameboy/gb_slot.cpp
index a408b9d15ff..79708f95314 100644
--- a/src/devices/bus/gameboy/gb_slot.cpp
+++ b/src/devices/bus/gameboy/gb_slot.cpp
@@ -267,7 +267,7 @@ image_init_result gb_cart_slot_device_base::call_load()
/* Verify that the file contains 16kb blocks */
if ((len == 0) || ((len % 0x4000) != 0))
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid rom file size\n");
+ seterror(image_error::INVALIDIMAGE, "Invalid ROM file size\n");
return image_init_result::FAIL;
}
}
diff --git a/src/devices/bus/gba/gba_slot.cpp b/src/devices/bus/gba/gba_slot.cpp
index 06ec379cf77..ac036718e2d 100644
--- a/src/devices/bus/gba/gba_slot.cpp
+++ b/src/devices/bus/gba/gba_slot.cpp
@@ -625,7 +625,7 @@ image_init_result gba_cart_slot_device::call_load()
uint32_t size = loaded_through_softlist() ? get_software_region_length("rom") : length();
if (size > 0x4000000)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Attempted loading a cart larger than 64MB");
+ seterror(image_error::INVALIDIMAGE, "Attempted loading a cart larger than 64MB");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/hexbus/hexbus.cpp b/src/devices/bus/hexbus/hexbus.cpp
index b9dcfd29ef8..40189262457 100644
--- a/src/devices/bus/hexbus/hexbus.cpp
+++ b/src/devices/bus/hexbus/hexbus.cpp
@@ -158,7 +158,7 @@
#include "logmacro.h"
// Hexbus instance
-DEFINE_DEVICE_TYPE_NS(HEXBUS, bus::hexbus, hexbus_device, "hexbus", "Hexbus connector")
+DEFINE_DEVICE_TYPE(HEXBUS, bus::hexbus::hexbus_device, "hexbus", "Hexbus connector")
namespace bus::hexbus {
diff --git a/src/devices/bus/hexbus/hx5102.cpp b/src/devices/bus/hexbus/hx5102.cpp
index 69bfaf3dfaf..740b5f93f4c 100644
--- a/src/devices/bus/hexbus/hx5102.cpp
+++ b/src/devices/bus/hexbus/hx5102.cpp
@@ -107,7 +107,7 @@
#define MOTOR_TIMER 1
#define UNDEF -1
-DEFINE_DEVICE_TYPE_NS(HX5102, bus::hexbus, hx5102_device, "ti_hx5102", "TI Hexbus Floppy Drive")
+DEFINE_DEVICE_TYPE(HX5102, bus::hexbus::hx5102_device, "ti_hx5102", "TI Hexbus Floppy Drive")
namespace bus::hexbus {
diff --git a/src/devices/bus/hexbus/tp0370.cpp b/src/devices/bus/hexbus/tp0370.cpp
index 739d7c4a685..e4d1ac50863 100644
--- a/src/devices/bus/hexbus/tp0370.cpp
+++ b/src/devices/bus/hexbus/tp0370.cpp
@@ -128,7 +128,7 @@ enum
#include "logmacro.h"
// Hexbus instance
-DEFINE_DEVICE_TYPE_NS(IBC, bus::hexbus, ibc_device, "ibc", "Intelligent Peripheral Bus Controller")
+DEFINE_DEVICE_TYPE(IBC, bus::hexbus::ibc_device, "hexbus_ibc", "Intelligent Peripheral Bus Controller")
namespace bus::hexbus {
diff --git a/src/devices/bus/hp_dio/hp98265a.cpp b/src/devices/bus/hp_dio/hp98265a.cpp
index 97f6b9bc945..b215a4c1152 100644
--- a/src/devices/bus/hp_dio/hp98265a.cpp
+++ b/src/devices/bus/hp_dio/hp98265a.cpp
@@ -17,7 +17,7 @@
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(HPDIO_98265A, bus::hp_dio, dio16_98265a_device, "hp98265a", "HP98265A SCSI S16 Interface")
+DEFINE_DEVICE_TYPE(HPDIO_98265A, bus::hp_dio::dio16_98265a_device, "hp98265a", "HP98265A SCSI S16 Interface")
namespace bus::hp_dio {
diff --git a/src/devices/bus/hp_dio/hp98543.cpp b/src/devices/bus/hp_dio/hp98543.cpp
index 6df0757f04f..a2bfb82f5ee 100644
--- a/src/devices/bus/hp_dio/hp98543.cpp
+++ b/src/devices/bus/hp_dio/hp98543.cpp
@@ -21,7 +21,7 @@ ROM_START(hp98543)
ROM_LOAD("1818-3907.bin", 0x000000, 0x002000, CRC(5e2bf02a) SHA1(9ba9391cf39624ef8027ce42c84e100344b2a2b8))
ROM_END
-DEFINE_DEVICE_TYPE_NS(HPDIO_98543, bus::hp_dio, dio16_98543_device, "dio98543", "HP98543 medium-res color DIO video card")
+DEFINE_DEVICE_TYPE(HPDIO_98543, bus::hp_dio::dio16_98543_device, "dio98543", "HP98543 medium-res color DIO video card")
namespace bus::hp_dio {
diff --git a/src/devices/bus/hp_dio/hp98544.cpp b/src/devices/bus/hp_dio/hp98544.cpp
index 040e36637aa..420dc93919f 100644
--- a/src/devices/bus/hp_dio/hp98544.cpp
+++ b/src/devices/bus/hp_dio/hp98544.cpp
@@ -19,7 +19,7 @@
// GLOBAL VARIABLES
//**************************************************************************
-DEFINE_DEVICE_TYPE_NS(HPDIO_98544, bus::hp_dio, dio16_98544_device, "dio98544", "HP98544 high-res monochrome DIO video card")
+DEFINE_DEVICE_TYPE(HPDIO_98544, bus::hp_dio::dio16_98544_device, "dio98544", "HP98544 high-res monochrome DIO video card")
namespace bus::hp_dio {
diff --git a/src/devices/bus/hp_dio/hp98550.cpp b/src/devices/bus/hp_dio/hp98550.cpp
index b4a9af05a73..54b89418680 100644
--- a/src/devices/bus/hp_dio/hp98550.cpp
+++ b/src/devices/bus/hp_dio/hp98550.cpp
@@ -23,7 +23,7 @@ ROM_START(hp98550)
ROM_LOAD("98550a.bin", 0x000000, 0x008000, CRC(9d639233) SHA1(d6b23a34850f24525ca5fb36de3deb91196d2dc5))
ROM_END
-DEFINE_DEVICE_TYPE_NS(HPDIO_98550, bus::hp_dio, dio32_98550_device, "dio98550", "HP98550A high-res color DIO video card")
+DEFINE_DEVICE_TYPE(HPDIO_98550, bus::hp_dio::dio32_98550_device, "dio98550", "HP98550A high-res color DIO video card")
namespace bus::hp_dio {
diff --git a/src/devices/bus/hp_dio/hp98603a.cpp b/src/devices/bus/hp_dio/hp98603a.cpp
index 791366d7639..37458c43c36 100644
--- a/src/devices/bus/hp_dio/hp98603a.cpp
+++ b/src/devices/bus/hp_dio/hp98603a.cpp
@@ -9,7 +9,7 @@
#include "emu.h"
#include "hp98603a.h"
-DEFINE_DEVICE_TYPE_NS(HPDIO_98603A, bus::hp_dio, dio16_98603a_device, "dio98603a", "HP98603A BASIC 4.0 ROM card")
+DEFINE_DEVICE_TYPE(HPDIO_98603A, bus::hp_dio::dio16_98603a_device, "dio98603a", "HP98603A BASIC 4.0 ROM card")
#define HP98603A_ROM_REGION "98603a_rom"
diff --git a/src/devices/bus/hp_dio/hp98603b.cpp b/src/devices/bus/hp_dio/hp98603b.cpp
index e9ab716f30f..6210b3b0178 100644
--- a/src/devices/bus/hp_dio/hp98603b.cpp
+++ b/src/devices/bus/hp_dio/hp98603b.cpp
@@ -9,7 +9,7 @@
#include "emu.h"
#include "hp98603b.h"
-DEFINE_DEVICE_TYPE_NS(HPDIO_98603B, bus::hp_dio, dio16_98603b_device, "dio98603b", "HP98603 BASIC ROM card")
+DEFINE_DEVICE_TYPE(HPDIO_98603B, bus::hp_dio::dio16_98603b_device, "dio98603b", "HP98603 BASIC ROM card")
#define HP98603B_ROM_REGION "98603b_rom"
diff --git a/src/devices/bus/hp_dio/hp98620.cpp b/src/devices/bus/hp_dio/hp98620.cpp
index 6a58ef2af78..88a8491fae8 100644
--- a/src/devices/bus/hp_dio/hp98620.cpp
+++ b/src/devices/bus/hp_dio/hp98620.cpp
@@ -13,7 +13,7 @@
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(HPDIO_98620, bus::hp_dio, dio16_98620_device, "hp98620", "HP98620 DMA Controller")
+DEFINE_DEVICE_TYPE(HPDIO_98620, bus::hp_dio::dio16_98620_device, "hp98620", "HP98620 DMA Controller")
namespace bus::hp_dio {
diff --git a/src/devices/bus/hp_dio/hp98643.cpp b/src/devices/bus/hp_dio/hp98643.cpp
index bba7cefebb5..f665303097a 100644
--- a/src/devices/bus/hp_dio/hp98643.cpp
+++ b/src/devices/bus/hp_dio/hp98643.cpp
@@ -13,7 +13,7 @@
//#define VERBOSE 1
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(HPDIO_98643, bus::hp_dio, dio16_98643_device, "dio98643", "HP98643A LANIC Ethernet card")
+DEFINE_DEVICE_TYPE(HPDIO_98643, bus::hp_dio::dio16_98643_device, "dio98643", "HP98643A LANIC Ethernet card")
namespace bus::hp_dio {
diff --git a/src/devices/bus/hp_dio/hp98644.cpp b/src/devices/bus/hp_dio/hp98644.cpp
index 2896076d01f..d74b8c02fea 100644
--- a/src/devices/bus/hp_dio/hp98644.cpp
+++ b/src/devices/bus/hp_dio/hp98644.cpp
@@ -15,7 +15,7 @@
// GLOBAL VARIABLES
//**************************************************************************
-DEFINE_DEVICE_TYPE_NS(HPDIO_98644, bus::hp_dio, dio16_98644_device, "dio98644", "HP98644A Asynchronous Serial Interface")
+DEFINE_DEVICE_TYPE(HPDIO_98644, bus::hp_dio::dio16_98644_device, "dio98644", "HP98644A Asynchronous Serial Interface")
namespace bus::hp_dio {
diff --git a/src/devices/bus/hp_dio/hp_dio.cpp b/src/devices/bus/hp_dio/hp_dio.cpp
index 75102828b01..647b28f83c9 100644
--- a/src/devices/bus/hp_dio/hp_dio.cpp
+++ b/src/devices/bus/hp_dio/hp_dio.cpp
@@ -23,10 +23,10 @@
// GLOBAL VARIABLES
//**************************************************************************
-DEFINE_DEVICE_TYPE_NS(DIO16_SLOT, bus::hp_dio, dio16_slot_device, "dio16_slot", "16-bit DIO slot")
-DEFINE_DEVICE_TYPE_NS(DIO32_SLOT, bus::hp_dio, dio32_slot_device, "dio32_slot", "32-bit DIO-II slot")
-DEFINE_DEVICE_TYPE_NS(DIO16, bus::hp_dio, dio16_device, "dio16", "16-bit DIO bus")
-DEFINE_DEVICE_TYPE_NS(DIO32, bus::hp_dio, dio32_device, "dio32", "32-bit DIO-II bus")
+DEFINE_DEVICE_TYPE(DIO16_SLOT, bus::hp_dio::dio16_slot_device, "dio16_slot", "16-bit DIO slot")
+DEFINE_DEVICE_TYPE(DIO32_SLOT, bus::hp_dio::dio32_slot_device, "dio32_slot", "32-bit DIO-II slot")
+DEFINE_DEVICE_TYPE(DIO16, bus::hp_dio::dio16_device, "dio16", "16-bit DIO bus")
+DEFINE_DEVICE_TYPE(DIO32, bus::hp_dio::dio32_device, "dio32", "32-bit DIO-II bus")
namespace bus::hp_dio {
diff --git a/src/devices/bus/hp_dio/human_interface.cpp b/src/devices/bus/hp_dio/human_interface.cpp
index b084ac47e24..a0957977f10 100644
--- a/src/devices/bus/hp_dio/human_interface.cpp
+++ b/src/devices/bus/hp_dio/human_interface.cpp
@@ -19,7 +19,7 @@
//#define VERBOSE 1
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(HPDIO_HUMAN_INTERFACE, bus::hp_dio, human_interface_device, "human_interface", "HP human interface card")
+DEFINE_DEVICE_TYPE(HPDIO_HUMAN_INTERFACE, bus::hp_dio::human_interface_device, "human_interface", "HP human interface card")
namespace bus::hp_dio {
diff --git a/src/devices/bus/hp_hil/hlekbd.cpp b/src/devices/bus/hp_hil/hlekbd.cpp
index 2a07bc083df..62278a45a7f 100644
--- a/src/devices/bus/hp_hil/hlekbd.cpp
+++ b/src/devices/bus/hp_hil/hlekbd.cpp
@@ -11,8 +11,8 @@
DEVICE TYPE GLOBALS
***************************************************************************/
-DEFINE_DEVICE_TYPE_NS(HP_IPC_HLE_KEYBOARD, bus::hp_hil, hle_hp_ipc_device, "hp_ipc_hle_kbd", "HP Integral Keyboard (HLE)")
-DEFINE_DEVICE_TYPE_NS(HP_ITF_HLE_KEYBOARD, bus::hp_hil, hle_hp_itf_device, "hp_itf_hle_kbd", "HP ITF Keyboard")
+DEFINE_DEVICE_TYPE(HP_IPC_HLE_KEYBOARD, bus::hp_hil::hle_hp_ipc_device, "hp_ipc_hle_kbd", "HP Integral Keyboard (HLE)")
+DEFINE_DEVICE_TYPE(HP_ITF_HLE_KEYBOARD, bus::hp_hil::hle_hp_itf_device, "hp_itf_hle_kbd", "HP ITF Keyboard")
namespace bus::hp_hil {
diff --git a/src/devices/bus/hp_hil/hlemouse.cpp b/src/devices/bus/hp_hil/hlemouse.cpp
index 76a1cbf7ef5..215912b5cc6 100644
--- a/src/devices/bus/hp_hil/hlemouse.cpp
+++ b/src/devices/bus/hp_hil/hlemouse.cpp
@@ -10,7 +10,7 @@
DEVICE TYPE GLOBALS
***************************************************************************/
-DEFINE_DEVICE_TYPE_NS(HP_46060B_MOUSE, bus::hp_hil, hle_hp_46060b_device, "hp_46060b", "HP 46060B Mouse")
+DEFINE_DEVICE_TYPE(HP_46060B_MOUSE, bus::hp_hil::hle_hp_46060b_device, "hp_46060b", "HP 46060B Mouse")
namespace bus::hp_hil {
diff --git a/src/devices/bus/intellec4/insdatastor.cpp b/src/devices/bus/intellec4/insdatastor.cpp
index 30a7554d1ab..55086054dcb 100644
--- a/src/devices/bus/intellec4/insdatastor.cpp
+++ b/src/devices/bus/intellec4/insdatastor.cpp
@@ -5,7 +5,7 @@
#include "insdatastor.h"
-DEFINE_DEVICE_TYPE_NS(INTELLEC4_INST_DATA_STORAGE, bus::intellec4, imm4_22_device, "intlc4_imm4_22", "Intel imm4-22 Instruction/Data Storage Module")
+DEFINE_DEVICE_TYPE(INTELLEC4_INST_DATA_STORAGE, bus::intellec4::imm4_22_device, "intlc4_imm4_22", "Intel imm4-22 Instruction/Data Storage Module")
namespace bus::intellec4 {
diff --git a/src/devices/bus/intellec4/intellec4.cpp b/src/devices/bus/intellec4/intellec4.cpp
index c70c25b31c3..66807166782 100644
--- a/src/devices/bus/intellec4/intellec4.cpp
+++ b/src/devices/bus/intellec4/intellec4.cpp
@@ -7,8 +7,8 @@
#include <algorithm>
-DEFINE_DEVICE_TYPE_NS(INTELLEC4_UNIV_SLOT, bus::intellec4, univ_slot_device, "intlc4univslot", "INTELLEC 4 Universal Slot")
-DEFINE_DEVICE_TYPE_NS(INTELLEC4_UNIV_BUS, bus::intellec4, univ_bus_device, "intlc4univbus", "INTELLEC 4 Universal Bus")
+DEFINE_DEVICE_TYPE(INTELLEC4_UNIV_SLOT, bus::intellec4::univ_slot_device, "intlc4univslot", "INTELLEC 4 Universal Slot")
+DEFINE_DEVICE_TYPE(INTELLEC4_UNIV_BUS, bus::intellec4::univ_bus_device, "intlc4univbus", "INTELLEC 4 Universal Bus")
namespace bus::intellec4 {
diff --git a/src/devices/bus/intellec4/prommemory.cpp b/src/devices/bus/intellec4/prommemory.cpp
index 7ce7dd962fd..e297006f241 100644
--- a/src/devices/bus/intellec4/prommemory.cpp
+++ b/src/devices/bus/intellec4/prommemory.cpp
@@ -5,7 +5,7 @@
#include "prommemory.h"
-DEFINE_DEVICE_TYPE_NS(INTELLEC4_PROM_MEMORY, bus::intellec4, imm6_26_device, "intlc4_imm6_26", "Intel imm6-26 PROM Memory Module")
+DEFINE_DEVICE_TYPE(INTELLEC4_PROM_MEMORY, bus::intellec4::imm6_26_device, "intlc4_imm6_26", "Intel imm6-26 PROM Memory Module")
namespace bus::intellec4 {
diff --git a/src/devices/bus/intellec4/tapereader.cpp b/src/devices/bus/intellec4/tapereader.cpp
index a1e4458d4f8..0cdfa34f6f6 100644
--- a/src/devices/bus/intellec4/tapereader.cpp
+++ b/src/devices/bus/intellec4/tapereader.cpp
@@ -5,7 +5,7 @@
#include "tapereader.h"
-DEFINE_DEVICE_TYPE_NS(INTELLEC4_TAPE_READER, bus::intellec4, imm4_90_device, "intlc4_imm4_90", "Intel imm4-90 High-Speed Paper Tape Reader")
+DEFINE_DEVICE_TYPE(INTELLEC4_TAPE_READER, bus::intellec4::imm4_90_device, "intlc4_imm4_90", "Intel imm4-90 High-Speed Paper Tape Reader")
namespace bus::intellec4 {
diff --git a/src/devices/bus/interpro/keyboard/hle.cpp b/src/devices/bus/interpro/keyboard/hle.cpp
index 02555685d5e..95d42092f61 100644
--- a/src/devices/bus/interpro/keyboard/hle.cpp
+++ b/src/devices/bus/interpro/keyboard/hle.cpp
@@ -120,7 +120,7 @@
#define VERBOSE 0
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(INTERPRO_HLE_EN_US_KEYBOARD, bus::interpro::keyboard, hle_en_us_device, "kbd_hle_en_us", "InterPro Keyboard (HLE, US English)")
+DEFINE_DEVICE_TYPE(INTERPRO_HLE_EN_US_KEYBOARD, bus::interpro::keyboard::hle_en_us_device, "kbd_hle_en_us", "InterPro Keyboard (HLE, US English)")
namespace bus::interpro::keyboard {
diff --git a/src/devices/bus/interpro/keyboard/lle.cpp b/src/devices/bus/interpro/keyboard/lle.cpp
index 7151f1e0fc0..1556a3f4779 100644
--- a/src/devices/bus/interpro/keyboard/lle.cpp
+++ b/src/devices/bus/interpro/keyboard/lle.cpp
@@ -155,7 +155,7 @@
#define VERBOSE (0)
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(INTERPRO_LLE_EN_US_KEYBOARD, bus::interpro::keyboard, lle_en_us_device, "kbd_lle_en_us", "InterPro Keyboard (LLE, US English)")
+DEFINE_DEVICE_TYPE(INTERPRO_LLE_EN_US_KEYBOARD, bus::interpro::keyboard::lle_en_us_device, "kbd_lle_en_us", "InterPro Keyboard (LLE, US English)")
namespace bus::interpro::keyboard {
diff --git a/src/devices/bus/isa/sc499.cpp b/src/devices/bus/isa/sc499.cpp
index e5de810966a..a49d52a5d2a 100644
--- a/src/devices/bus/isa/sc499.cpp
+++ b/src/devices/bus/isa/sc499.cpp
@@ -16,7 +16,7 @@
#include "emu.h"
#include "sc499.h"
-#include "formats/ioprocs.h"
+
#define VERBOSE 0
@@ -1312,18 +1312,17 @@ void sc499_ctape_image_device::write_block(int block_num, uint8_t *ptr)
image_init_result sc499_ctape_image_device::call_load()
{
- uint32_t size;
- io_generic io;
- io.file = (device_image_interface *)this;
- io.procs = &image_ioprocs;
- io.filler = 0xff;
-
- size = io_generic_size(&io);
- m_ctape_data.resize(size);
-
- io_generic_read(&io, &m_ctape_data[0], 0, size);
-
- return image_init_result::PASS;
+ try
+ {
+ auto const size = length();
+ m_ctape_data.resize(size);
+ if (!fseek(0, SEEK_SET) && (fread(m_ctape_data.data(), size) == size))
+ return image_init_result::PASS;
+ }
+ catch (...)
+ {
+ }
+ return image_init_result::FAIL;
}
void sc499_ctape_image_device::call_unload()
diff --git a/src/devices/bus/m5/slot.cpp b/src/devices/bus/m5/slot.cpp
index a1b9d551b23..a75599bb807 100644
--- a/src/devices/bus/m5/slot.cpp
+++ b/src/devices/bus/m5/slot.cpp
@@ -166,7 +166,7 @@ image_init_result m5_cart_slot_device::call_load()
if (size > 0x5000 && m_type == M5_STD)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Image extends beyond the expected size for an M5 cart");
+ seterror(image_error::INVALIDIMAGE, "Image extends beyond the expected size for an M5 cart");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/mackbd/keyboard.cpp b/src/devices/bus/mackbd/keyboard.cpp
index a0dfc405061..3f215a2c39a 100644
--- a/src/devices/bus/mackbd/keyboard.cpp
+++ b/src/devices/bus/mackbd/keyboard.cpp
@@ -750,6 +750,8 @@ public:
{
}
+ static auto parent_rom_device_type() { return &MACKBD_M0110; }
+
protected:
virtual ioport_constructor device_input_ports() const override
{
@@ -765,6 +767,8 @@ public:
{
}
+ static auto parent_rom_device_type() { return &MACKBD_M0110; }
+
protected:
virtual ioport_constructor device_input_ports() const override
{
@@ -780,6 +784,8 @@ public:
{
}
+ static auto parent_rom_device_type() { return &MACKBD_M0110; }
+
protected:
virtual ioport_constructor device_input_ports() const override
{
@@ -847,6 +853,8 @@ public:
{
}
+ static auto parent_rom_device_type() { return &MACKBD_M0110; }
+
protected:
virtual ioport_constructor device_input_ports() const override
{
@@ -862,6 +870,8 @@ public:
{
}
+ static auto parent_rom_device_type() { return &MACKBD_M0110; }
+
protected:
virtual void device_add_mconfig(machine_config &config) override
{
diff --git a/src/devices/bus/mackbd/pluskbd.cpp b/src/devices/bus/mackbd/pluskbd.cpp
index 93a7eb3b98e..9c037123146 100644
--- a/src/devices/bus/mackbd/pluskbd.cpp
+++ b/src/devices/bus/mackbd/pluskbd.cpp
@@ -478,6 +478,8 @@ public:
{
}
+ static auto parent_rom_device_type() { return &MACKBD_M0110A; }
+
protected:
virtual ioport_constructor device_input_ports() const override
{
@@ -493,6 +495,8 @@ public:
{
}
+ static auto parent_rom_device_type() { return &MACKBD_M0110A; }
+
protected:
virtual ioport_constructor device_input_ports() const override
{
diff --git a/src/devices/bus/mc10/mc10_cart.cpp b/src/devices/bus/mc10/mc10_cart.cpp
index e8addd9939a..088b3ca8c81 100644
--- a/src/devices/bus/mc10/mc10_cart.cpp
+++ b/src/devices/bus/mc10/mc10_cart.cpp
@@ -96,14 +96,14 @@ image_init_result mc10cart_slot_device::call_load()
memory_region *romregion(loaded_through_softlist() ? memregion("rom") : nullptr);
if (loaded_through_softlist() && !romregion)
{
- seterror(IMAGE_ERROR_INVALIDIMAGE, "Software list item has no 'rom' data area");
+ seterror(image_error::INVALIDIMAGE, "Software list item has no 'rom' data area");
return image_init_result::FAIL;
}
u32 const len(loaded_through_softlist() ? romregion->bytes() : length());
if (len > m_cart->max_rom_length())
{
- seterror(IMAGE_ERROR_UNSUPPORTED, "Unsupported cartridge size");
+ seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
@@ -114,7 +114,7 @@ image_init_result mc10cart_slot_device::call_load()
u32 const cnt(fread(romregion->base(), len));
if (cnt != len)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Error reading cartridge file");
+ seterror(image_error::UNSPECIFIED, "Error reading cartridge file");
return image_init_result::FAIL;
}
}
diff --git a/src/devices/bus/msx_slot/cartridge.cpp b/src/devices/bus/msx_slot/cartridge.cpp
index 87b89f93c78..30c9f0a2b00 100644
--- a/src/devices/bus/msx_slot/cartridge.cpp
+++ b/src/devices/bus/msx_slot/cartridge.cpp
@@ -165,7 +165,7 @@ image_init_result msx_slot_cartridge_device::call_load()
if (fread(m_cartridge->get_rom_base(), length) != length)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Unable to fully read file");
+ seterror(image_error::UNSPECIFIED, "Unable to fully read file");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/nes/ave.cpp b/src/devices/bus/nes/ave.cpp
index 2e93ea17501..836cdaed9df 100644
--- a/src/devices/bus/nes/ave.cpp
+++ b/src/devices/bus/nes/ave.cpp
@@ -48,8 +48,8 @@ nes_nina006_device::nes_nina006_device(const machine_config &mconfig, const char
{
}
-nes_maxi15_device::nes_maxi15_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_nrom_device(mconfig, NES_MAXI15, tag, owner, clock), m_reg(0), m_bank(0)
+nes_maxi15_device::nes_maxi15_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, NES_MAXI15, tag, owner, clock)
{
}
@@ -80,29 +80,24 @@ void nes_nina006_device::pcb_reset()
chr8(0, m_chr_source);
}
-
void nes_maxi15_device::device_start()
{
common_start();
- save_item(NAME(m_bank));
save_item(NAME(m_reg));
}
void nes_maxi15_device::pcb_reset()
{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
prg32(0);
- chr8(0, m_chr_source);
+ chr8(0, CHRROM);
set_nt_mirroring(PPU_MIRROR_VERT);
- m_reg = 0;
- m_bank = 0;
+ m_reg[0] = m_reg[1] = 0;
}
-
/*-------------------------------------------------
mapper specific handlers
-------------------------------------------------*/
@@ -118,7 +113,7 @@ void nes_maxi15_device::pcb_reset()
then readable back in WRAM (WRAM is tested by
Impossible Mission II at start)
- In MESS: Supported.
+ In MAME: Supported.
-------------------------------------------------*/
@@ -151,7 +146,7 @@ void nes_nina001_device::write_m(offs_t offset, uint8_t data)
iNES: mapper 79
- In MESS: Supported.
+ In MAME: Supported.
-------------------------------------------------*/
@@ -174,41 +169,30 @@ void nes_nina006_device::write_l(offs_t offset, uint8_t data)
iNES: mapper 234
- In MESS: Partially Supported.
+ In MAME: Supported.
-------------------------------------------------*/
-void nes_maxi15_device::update_banks()
-{
- if (m_bank & 0x40)
- {
- prg32((m_bank & 0x0e) | (m_reg & 1));
- chr8(((m_bank & 0x0e) << 2) | ((m_reg >> 4) & 7), m_chr_source);
- }
- else
- {
- prg32(m_bank & 0x0f);
- chr8(((m_bank & 0x0f) << 2) | ((m_reg >> 4) & 3), m_chr_source);
- }
-}
-
-uint8_t nes_maxi15_device::read_h(offs_t offset)
+u8 nes_maxi15_device::read_h(offs_t offset)
{
LOG_MMC(("Maxi 15 read_h, offset: %04x\n", offset));
- if (offset >= 0x7f80 && offset < 0x7fa0)
- {
- m_bank = hi_access_rom(offset);
- set_nt_mirroring(BIT(m_bank, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
- update_banks();
- return m_bank;
- }
- if (offset >= 0x7fe8 && offset < 0x7ff8)
+ u8 temp = hi_access_rom(offset);
+
+ if ((offset >= 0x7f80 && offset < 0x7fa0) || (offset >= 0x7fe8 && offset < 0x7ff8))
{
- m_reg = hi_access_rom(offset);
- update_banks();
- return m_reg;
+ int reg = BIT(offset, 6);
+ if (reg || !(m_reg[0] & 0x3f)) // inner banks always modifiable, outer banks locked once set
+ {
+ m_reg[reg] = temp;
+
+ u8 mode = !BIT(m_reg[0], 6);
+ u8 outer = m_reg[0] & (0x0e | mode);
+ prg32(outer | (m_reg[1] & !mode));
+ chr8(outer << 2 | ((m_reg[1] >> 4) & (7 >> mode)), CHRROM);
+ set_nt_mirroring(BIT(m_reg[0], 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
+ }
}
- return hi_access_rom(offset);
+ return temp;
}
diff --git a/src/devices/bus/nes/ave.h b/src/devices/bus/nes/ave.h
index b40d2ed6d9d..14a1203678d 100644
--- a/src/devices/bus/nes/ave.h
+++ b/src/devices/bus/nes/ave.h
@@ -50,9 +50,9 @@ class nes_maxi15_device : public nes_nrom_device
{
public:
// construction/destruction
- nes_maxi15_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_maxi15_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual uint8_t read_h(offs_t offset) override;
+ virtual u8 read_h(offs_t offset) override;
virtual void pcb_reset() override;
@@ -61,9 +61,7 @@ protected:
virtual void device_start() override;
private:
- void update_banks();
-
- uint8_t m_reg, m_bank;
+ u8 m_reg[2];
};
diff --git a/src/devices/bus/nes/bootleg.cpp b/src/devices/bus/nes/bootleg.cpp
index 1b17e77a280..754c077c2bc 100644
--- a/src/devices/bus/nes/bootleg.cpp
+++ b/src/devices/bus/nes/bootleg.cpp
@@ -50,6 +50,7 @@ DEFINE_DEVICE_TYPE(NES_BTL_DNINJA, nes_btl_dn_device, "nes_btl_dn", "N
DEFINE_DEVICE_TYPE(NES_SMB2J, nes_smb2j_device, "nes_smb2j", "NES Cart Super Mario Bros. 2 Jpn PCB")
DEFINE_DEVICE_TYPE(NES_SMB2JA, nes_smb2ja_device, "nes_smb2ja", "NES Cart Super Mario Bros. 2 Jpn (Alt) PCB")
DEFINE_DEVICE_TYPE(NES_SMB2JB, nes_smb2jb_device, "nes_smb2jb", "NES Cart Super Mario Bros. 2 Jpn (Alt 2) PCB")
+DEFINE_DEVICE_TYPE(NES_N32_4IN1, nes_n32_4in1_device, "nes_n32_4in1", "NES Cart N-32 4 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_0353, nes_0353_device, "nes_0353", "NES Cart 0353 PCB")
DEFINE_DEVICE_TYPE(NES_09034A, nes_09034a_device, "nes_09034a", "NES Cart 09-034A PCB")
DEFINE_DEVICE_TYPE(NES_BATMANFS, nes_batmanfs_device, "nes_batmanfs", "NES Cart Batman Pirate PCB")
@@ -62,6 +63,7 @@ DEFINE_DEVICE_TYPE(NES_LH10, nes_lh10_device, "nes_lh10", "N
DEFINE_DEVICE_TYPE(NES_LH28_LH54, nes_lh28_lh54_device, "nes_lh28_lh54", "NES Cart LH28/LH54 Pirate PCBs")
DEFINE_DEVICE_TYPE(NES_LH31, nes_lh31_device, "nes_lh31", "NES Cart LH31 Pirate PCB")
DEFINE_DEVICE_TYPE(NES_LH32, nes_lh32_device, "nes_lh32", "NES Cart LH32 Pirate PCB")
+DEFINE_DEVICE_TYPE(NES_LH42, nes_lh42_device, "nes_lh42", "NES Cart LH42 Pirate PCB")
DEFINE_DEVICE_TYPE(NES_LH51, nes_lh51_device, "nes_lh51", "NES Cart LH51 Pirate PCB")
DEFINE_DEVICE_TYPE(NES_LH53, nes_lh53_device, "nes_lh53", "NES Cart LH53 Pirate PCB")
DEFINE_DEVICE_TYPE(NES_2708, nes_2708_device, "nes_2708", "NES Cart BTL-2708 Pirate PCB")
@@ -107,18 +109,28 @@ nes_btl_dn_device::nes_btl_dn_device(const machine_config &mconfig, const char *
{
}
-nes_smb2j_device::nes_smb2j_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+nes_smb2j_device::nes_smb2j_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_nrom_device(mconfig, NES_SMB2J, tag, owner, clock), m_irq_count(0), m_irq_enable(0), irq_timer(nullptr)
{
}
-nes_smb2ja_device::nes_smb2ja_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+nes_smb2ja_device::nes_smb2ja_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_nrom_device(mconfig, NES_SMB2JA, tag, owner, clock), m_irq_count(0), m_irq_enable(0), irq_timer(nullptr)
{
}
-nes_smb2jb_device::nes_smb2jb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_nrom_device(mconfig, NES_SMB2JB, tag, owner, clock), m_irq_count(0), m_irq_enable(0), irq_timer(nullptr)
+nes_smb2jb_device::nes_smb2jb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, type, tag, owner, clock), m_irq_count(0), m_irq_enable(0), m_reg(0), m_bank67(type == NES_SMB2JB ? 0x0f : 0x07), irq_timer(nullptr)
+{
+}
+
+nes_smb2jb_device::nes_smb2jb_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_smb2jb_device(mconfig, NES_SMB2JB, tag, owner, clock)
+{
+}
+
+nes_n32_4in1_device::nes_n32_4in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_smb2jb_device(mconfig, NES_N32_4IN1, tag, owner, clock)
{
}
@@ -177,6 +189,11 @@ nes_lh32_device::nes_lh32_device(const machine_config &mconfig, const char *tag,
{
}
+nes_lh42_device::nes_lh42_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, NES_LH42, tag, owner, clock), m_latch(0)
+{
+}
+
nes_lg25_device::nes_lg25_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_nrom_device(mconfig, NES_LG25, tag, owner, clock), m_latch(0)
{
@@ -381,12 +398,11 @@ void nes_smb2j_device::device_start()
void nes_smb2j_device::pcb_reset()
{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- chr8(0, m_chr_source);
prg8_89(1);
prg8_ab(0);
- prg8_cd(0);
+ prg8_cd(4); // switchable bank
prg8_ef(9);
+ chr8(0, CHRROM);
m_irq_enable = 0;
m_irq_count = 0;
@@ -404,12 +420,11 @@ void nes_smb2ja_device::device_start()
void nes_smb2ja_device::pcb_reset()
{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- prg8_89(0xfc);
- prg8_ab(0xfd);
- prg8_cd(0xfe);
- prg8_ef(0xff);
- chr8(0, m_chr_source);
+ prg8_89(4);
+ prg8_ab(5);
+ prg8_cd(0); // switchable bank
+ prg8_ef(7);
+ chr8(0, CHRROM);
m_irq_enable = 0;
m_irq_count = 0;
@@ -423,19 +438,29 @@ void nes_smb2jb_device::device_start()
save_item(NAME(m_irq_enable));
save_item(NAME(m_irq_count));
+ save_item(NAME(m_reg));
}
void nes_smb2jb_device::pcb_reset()
{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
prg8_89(0x08);
prg8_ab(0x09);
- prg8_cd(0);
+ prg8_cd(0); // switchable bank
prg8_ef(0x0b);
- chr8(0, m_chr_source);
+ chr8(0, CHRRAM);
m_irq_enable = 0;
m_irq_count = 0;
+ m_reg = 0;
+}
+
+void nes_n32_4in1_device::pcb_reset()
+{
+ // Powers up in menu, but soft reset does not touch banks (so each game returns to its own title). Is this correct?
+
+ m_irq_enable = 0;
+ m_irq_count = 0;
+ m_reg = 0;
}
void nes_0353_device::device_start()
@@ -535,6 +560,21 @@ void nes_lh32_device::pcb_reset()
m_latch = 0xf;
}
+void nes_lh42_device::device_start()
+{
+ common_start();
+ save_item(NAME(m_latch));
+}
+
+void nes_lh42_device::pcb_reset()
+{
+ prg16_89ab(0);
+ prg16_cdef(m_prg_chunks - 1); // Last 16K is fixed
+ chr8(0, CHRRAM);
+
+ m_latch = 0;
+}
+
void nes_lg25_device::device_start()
{
common_start();
@@ -570,11 +610,6 @@ void nes_lh10_device::pcb_reset()
std::fill(std::begin(m_reg), std::end(m_reg), 0x00);
}
-void nes_lh51_device::device_start()
-{
- common_start();
-}
-
void nes_lh51_device::pcb_reset()
{
prg32((m_prg_chunks >> 1) - 1); // first 8K is switchable, the rest fixed
@@ -1161,7 +1196,7 @@ void nes_lh31_device::write_h(offs_t offset, u8 data) // submapper 2
Bootleg Board SMB2J
- Games: Super Mario Bros. 2 Pirate (LF36)
+ Games: Super Mario Bros. 2 Pirates (TONY-I, YS-612)
iNES: mapper 43
@@ -1175,54 +1210,59 @@ void nes_smb2j_device::device_timer(timer_instance const &timer)
{
if (m_irq_enable)
{
- if (m_irq_count == 0xfff)
- {
- hold_irq_line();
- m_irq_enable = 0;
- m_irq_count = 0;
- }
- else
- m_irq_count++;
+ m_irq_count = (m_irq_count + 1) & 0xfff;
+ if (!m_irq_count)
+ set_irq_line(ASSERT_LINE);
}
}
}
-void nes_smb2j_device::write_l(offs_t offset, uint8_t data)
+void nes_smb2j_device::update_irq(u8 data)
{
- LOG_MMC(("smb2j write_l, offset: %04x, data: %02x\n", offset, data));
- offset += 0x100;
-
- if (offset == 0x122) // $4122
- m_irq_enable = data & 3; // maybe also m_irq_count = 0?!?
+ m_irq_enable = BIT(data, 0);
+ if (!m_irq_enable)
+ {
+ set_irq_line(CLEAR_LINE);
+ m_irq_count = 0;
+ }
}
-void nes_smb2j_device::write_h(offs_t offset, uint8_t data)
+void nes_smb2j_device::write_45(offs_t offset, u8 data)
{
- LOG_MMC(("smb2j write_h, offset: %04x, data: %02x\n", offset, data));
+ static const u8 bank[8] = {4, 3, 4, 4, 4, 7, 5, 6};
- if (offset == 0x122) // $8122 too?
- m_irq_enable = data & 3;
+ switch (offset & 0x71ff)
+ {
+ case 0x4022:
+ prg8_cd(bank[data & 0x07]);
+ break;
+ case 0x4122:
+ nes_smb2j_device::update_irq(data);
+ break;
+ }
}
-void nes_smb2j_device::write_ex(offs_t offset, uint8_t data)
+void nes_smb2j_device::write_ex(offs_t offset, u8 data)
{
LOG_MMC(("smb2j write_ex, offset: %04x, data: %02x\n", offset, data));
+ nes_smb2j_device::write_45(offset + 0x4020, data);
+}
- if (offset == 2)
- {
- int temp;
+void nes_smb2j_device::write_l(offs_t offset, u8 data)
+{
+ LOG_MMC(("smb2j write_l, offset: %04x, data: %02x\n", offset, data));
+ nes_smb2j_device::write_45(offset + 0x4100, data);
+}
- // According to hardware tests
- if (data & 1)
- temp = 3;
- else
- temp = 4 + ((data & 7) >> 1);
+void nes_smb2j_device::write_h(offs_t offset, u8 data)
+{
+ LOG_MMC(("smb2j write_h, offset: %04x, data: %02x\n", offset, data));
- prg8_cd(temp);
- }
+ if (offset == 0x122) // $8122 is also IRQ for YS-612, mask unknown
+ nes_smb2j_device::update_irq(data);
}
-uint8_t nes_smb2j_device::read_l(offs_t offset)
+u8 nes_smb2j_device::read_l(offs_t offset)
{
LOG_MMC(("smb2j read_l, offset: %04x\n", offset));
offset += 0x100;
@@ -1233,7 +1273,7 @@ uint8_t nes_smb2j_device::read_l(offs_t offset)
return get_open_bus(); // open bus
}
-uint8_t nes_smb2j_device::read_m(offs_t offset)
+u8 nes_smb2j_device::read_m(offs_t offset)
{
LOG_MMC(("smb2j read_m, offset: %04x\n", offset));
return m_prg[0x4000 + offset];
@@ -1241,9 +1281,9 @@ uint8_t nes_smb2j_device::read_m(offs_t offset)
/*-------------------------------------------------
- BTL-SMB2A
+ BTL-SMB2JA
- Games: Super Mario Bros. 2 Pirate (Jpn version of SMB2)
+ Games: Super Mario Bros. 2 Pirates (LF36, Hey Sung, 1990 SMB4)
iNES: mapper 40
@@ -1257,19 +1297,16 @@ void nes_smb2ja_device::device_timer(timer_instance const &timer)
{
if (m_irq_enable)
{
- if (m_irq_count == 0xfff)
- {
- hold_irq_line();
- m_irq_enable = 0;
- m_irq_count = 0;
- }
- else
- m_irq_count++;
+ m_irq_count = (m_irq_count + 1) & 0x1fff; // 13-bit counter
+ if (BIT(m_irq_count, 12))
+ set_irq_line(ASSERT_LINE);
+ else if (!m_irq_count)
+ set_irq_line(CLEAR_LINE); // CD4020 acknowledges on overflow
}
}
}
-void nes_smb2ja_device::write_h(offs_t offset, uint8_t data)
+void nes_smb2ja_device::write_h(offs_t offset, u8 data)
{
LOG_MMC(("smb2ja write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1278,6 +1315,7 @@ void nes_smb2ja_device::write_h(offs_t offset, uint8_t data)
case 0x0000:
m_irq_enable = 0;
m_irq_count = 0;
+ set_irq_line(CLEAR_LINE);
break;
case 0x2000:
m_irq_enable = 1;
@@ -1288,23 +1326,23 @@ void nes_smb2ja_device::write_h(offs_t offset, uint8_t data)
}
}
-uint8_t nes_smb2ja_device::read_m(offs_t offset)
+u8 nes_smb2ja_device::read_m(offs_t offset)
{
LOG_MMC(("smb2ja read_m, offset: %04x\n", offset));
- return m_prg[(0xfe * 0x2000 + (offset & 0x1fff)) & (m_prg_size - 1)];
+ return m_prg[0x06 * 0x2000 + offset]; // fixed 8K bank
}
/*-------------------------------------------------
- BTL-SMB2B
+ BTL-SMB2JB (PCB 761214)
- Games: Super Mario Bros. 2 Pirate (Jpn version of SMB2)
+ Games: Super Mario Bros. 2 Pirate (N-32)
This was marked as Alt. Levels. is it true?
iNES: mapper 50
- In MAME: Partially supported.
+ In MAME: Supported.
-------------------------------------------------*/
@@ -1314,54 +1352,96 @@ void nes_smb2jb_device::device_timer(timer_instance const &timer)
{
if (m_irq_enable)
{
- if (m_irq_count == 0xfff)
- {
- hold_irq_line();
- m_irq_enable = 0;
- m_irq_count = 0;
- }
- else
- m_irq_count++;
+ if (BIT(++m_irq_count, 12))
+ set_irq_line(ASSERT_LINE);
}
}
}
-void nes_smb2jb_device::write_l(offs_t offset, uint8_t data)
+void nes_smb2jb_device::write_45(offs_t offset, u8 data)
{
- uint8_t prg;
- LOG_MMC(("smb2jb write_l, offset: %04x, data: %02x\n", offset, data));
- offset += 0x100;
-
- switch (offset & 0x1e0)
+ switch (offset & 0x4120)
{
- case 0x020:
- case 0x0a0:
- prg = (data & 0x08) | ((data & 0x06) >> 1) | ((data & 0x01) << 2);
- prg8_cd(prg);
+ case 0x4020:
+ m_reg = bitswap<4>(data, 3, 0, 2, 1);
+ prg8_cd(m_reg);
break;
- case 0x120:
- case 0x1a0:
- m_irq_enable = data & 0x01;
+ case 0x4120:
+ m_irq_enable = BIT(data, 0);
+ if (!m_irq_enable)
+ {
+ set_irq_line(CLEAR_LINE);
+ m_irq_count = 0;
+ }
break;
}
}
-uint8_t nes_smb2jb_device::read_m(offs_t offset)
+void nes_smb2jb_device::write_ex(offs_t offset, u8 data)
+{
+ LOG_MMC(("smb2jb write_ex, offset: %04x, data: %02x\n", offset, data));
+ write_45(offset + 0x4020, data);
+}
+
+void nes_smb2jb_device::write_l(offs_t offset, u8 data)
+{
+ LOG_MMC(("smb2jb write_l, offset: %04x, data: %02x\n", offset, data));
+ write_45(offset + 0x4100, data);
+}
+
+u8 nes_smb2jb_device::read_m(offs_t offset)
{
LOG_MMC(("smb2jb read_m, offset: %04x\n", offset));
- return m_prg[((0x0f * 0x2000) + (offset & 0x1fff)) & (m_prg_size - 1)];
+ return m_prg[m_bank67 * 0x2000 + offset];
}
-/* This goes to 0x4020-0x403f & 0x40a0-0x40bf */
-void nes_smb2jb_device::write_ex(offs_t offset, uint8_t data)
+/*-------------------------------------------------
+
+ BMC-N32-4IN1
+
+ Unknown Bootleg Multigame Board
+ Games: 4 in 1
+
+ This multicart contains the mapper 50 version of SMB2.
+ There are changes to bank locations compared to that
+ game, but otherwise we rely on the existing SMB2JB
+ emulation (unless other differences are discovered?)
+
+ NES 2.0: mapper 416
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_n32_4in1_device::write_h(offs_t offset, u8 data)
{
- uint8_t prg;
- LOG_MMC(("smb2jb write_ex, offset: %04x, data: %02x\n", offset, data));
+ LOG_MMC(("n32_4in1 write_h, offset: %04x, data: %02x\n", offset, data));
- if ((offset < 0x20) || (offset >= 0x80 && offset < 0xa0))
+ if (offset < 0x2000)
{
- prg = (data & 0x08) | ((data & 0x06) >> 1) | ((data & 0x01) << 2);
- prg8_cd(prg);
+ if (BIT(data, 3)) // NROM games
+ {
+ u8 bank = bitswap<3>(data, 3, 7, 5);
+ u8 mode = BIT(data, 7);
+ if (data & 0xc0)
+ {
+ prg16_89ab(bank & ~mode);
+ prg16_cdef(bank | mode);
+ }
+ else
+ for (int i = 0; i < 4; i++)
+ prg8_x(i, bank << 1);
+ }
+ else // SMB2 only
+ {
+ prg8_89(0);
+ prg8_ab(1);
+ prg8_cd(m_reg);
+ prg8_ef(3);
+ }
+
+ chr8((data >> 1) & 0x03, CHRROM);
+ set_nt_mirroring(BIT(data, 2) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
}
}
@@ -1685,6 +1765,42 @@ void nes_lh32_device::write_h(offs_t offset, uint8_t data)
/*-------------------------------------------------
+ UNL-LH42
+
+ Games: Highway Star (Whirlwind Manu bootleg)
+
+ NES 2.0: mapper 418
+
+ In MAME: Preliminary supported.
+
+ TODO: Investigate garbage tiles on bottom half of
+ course map screens. This should be car dashboard?
+
+ -------------------------------------------------*/
+
+void nes_lh42_device::write_h(offs_t offset, u8 data)
+{
+ LOG_MMC(("lh42 write_h, offset: %04x, data: %02x\n", offset, data));
+
+ if (BIT(offset, 0))
+ {
+ switch (m_latch)
+ {
+ case 1:
+ set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
+ break;
+ case 2:
+ case 3:
+ prg8_x(m_latch & 1, data & 0x0f);
+ break;
+ }
+ }
+ else
+ m_latch = data & 0x03;
+}
+
+/*-------------------------------------------------
+
UNL-LG25
Games: Moero TwinBee Cinnamon Hakase o Sukue! (FDS conversion)
diff --git a/src/devices/bus/nes/bootleg.h b/src/devices/bus/nes/bootleg.h
index 6c656118071..1e01337ba45 100644
--- a/src/devices/bus/nes/bootleg.h
+++ b/src/devices/bus/nes/bootleg.h
@@ -168,13 +168,13 @@ class nes_smb2j_device : public nes_nrom_device
{
public:
// construction/destruction
- nes_smb2j_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_smb2j_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual uint8_t read_l(offs_t offset) override;
- virtual uint8_t read_m(offs_t offset) override;
- virtual void write_ex(offs_t offset, uint8_t data) override;
- virtual void write_l(offs_t offset, uint8_t data) override;
- virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual u8 read_l(offs_t offset) override;
+ virtual u8 read_m(offs_t offset) override;
+ virtual void write_ex(offs_t offset, u8 data) override;
+ virtual void write_l(offs_t offset, u8 data) override;
+ virtual void write_h(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
@@ -184,7 +184,9 @@ protected:
virtual void device_timer(timer_instance const &timer) override;
private:
- uint16_t m_irq_count;
+ void update_irq(u8 data);
+ void write_45(offs_t offset, u8 data);
+ u16 m_irq_count;
int m_irq_enable;
static const device_timer_id TIMER_IRQ = 0;
@@ -198,9 +200,10 @@ class nes_smb2ja_device : public nes_nrom_device
{
public:
// construction/destruction
- nes_smb2ja_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual uint8_t read_m(offs_t offset) override;
- virtual void write_h(offs_t offset, uint8_t data) override;
+ nes_smb2ja_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual u8 read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
@@ -210,7 +213,7 @@ protected:
virtual void device_timer(timer_instance const &timer) override;
private:
- uint16_t m_irq_count;
+ u16 m_irq_count;
int m_irq_enable;
static const device_timer_id TIMER_IRQ = 0;
@@ -224,27 +227,48 @@ class nes_smb2jb_device : public nes_nrom_device
{
public:
// construction/destruction
- nes_smb2jb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual uint8_t read_m(offs_t offset) override;
- virtual void write_l(offs_t offset, uint8_t data) override;
- virtual void write_ex(offs_t offset, uint8_t data) override;
+ nes_smb2jb_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual u8 read_m(offs_t offset) override;
+ virtual void write_l(offs_t offset, u8 data) override;
+ virtual void write_ex(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
protected:
+ nes_smb2jb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
// device-level overrides
virtual void device_start() override;
virtual void device_timer(timer_instance const &timer) override;
-private:
- uint16_t m_irq_count;
+ u16 m_irq_count;
int m_irq_enable;
+ u8 m_reg;
+
+private:
+ void write_45(offs_t offset, u8 data);
+ u8 m_bank67;
static const device_timer_id TIMER_IRQ = 0;
emu_timer *irq_timer;
};
+// ======================> nes_n32_4in1_device
+
+class nes_n32_4in1_device : public nes_smb2jb_device
+{
+public:
+ // construction/destruction
+ nes_n32_4in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_h(offs_t offset, u8 data) override;
+
+ virtual void pcb_reset() override;
+};
+
+
// ======================> nes_0353_device
class nes_0353_device : public nes_nrom_device
@@ -458,6 +482,27 @@ private:
};
+// ======================> nes_lh42_device
+
+class nes_lh42_device : public nes_nrom_device
+{
+public:
+ // construction/destruction
+ nes_lh42_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_h(offs_t offset, u8 data) override;
+
+ virtual void pcb_reset() override;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+private:
+ u8 m_latch;
+};
+
+
// ======================> nes_lg25_device
class nes_lg25_device : public nes_nrom_device
@@ -515,10 +560,6 @@ public:
virtual void write_h(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
-
-protected:
- // device-level overrides
- virtual void device_start() override;
};
@@ -707,6 +748,7 @@ DECLARE_DEVICE_TYPE(NES_BTL_DNINJA, nes_btl_dn_device)
DECLARE_DEVICE_TYPE(NES_SMB2J, nes_smb2j_device)
DECLARE_DEVICE_TYPE(NES_SMB2JA, nes_smb2ja_device)
DECLARE_DEVICE_TYPE(NES_SMB2JB, nes_smb2jb_device)
+DECLARE_DEVICE_TYPE(NES_N32_4IN1, nes_n32_4in1_device)
DECLARE_DEVICE_TYPE(NES_0353, nes_0353_device)
DECLARE_DEVICE_TYPE(NES_09034A, nes_09034a_device)
DECLARE_DEVICE_TYPE(NES_BATMANFS, nes_batmanfs_device)
@@ -719,6 +761,7 @@ DECLARE_DEVICE_TYPE(NES_LH10, nes_lh10_device)
DECLARE_DEVICE_TYPE(NES_LH28_LH54, nes_lh28_lh54_device)
DECLARE_DEVICE_TYPE(NES_LH31, nes_lh31_device)
DECLARE_DEVICE_TYPE(NES_LH32, nes_lh32_device)
+DECLARE_DEVICE_TYPE(NES_LH42, nes_lh42_device)
DECLARE_DEVICE_TYPE(NES_LH51, nes_lh51_device)
DECLARE_DEVICE_TYPE(NES_LH53, nes_lh53_device)
DECLARE_DEVICE_TYPE(NES_2708, nes_2708_device)
diff --git a/src/devices/bus/nes/hosenkan.cpp b/src/devices/bus/nes/hosenkan.cpp
deleted file mode 100644
index ae7749b7e9a..00000000000
--- a/src/devices/bus/nes/hosenkan.cpp
+++ /dev/null
@@ -1,159 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Fabio Priuli
-/***********************************************************************************************************
-
-
- NES/Famicom cartridge emulation for Hosenkan PCBs
-
-
- ***********************************************************************************************************/
-
-
-#include "emu.h"
-#include "hosenkan.h"
-
-#include "video/ppu2c0x.h" // this has to be included so that IRQ functions can access ppu2c0x_device::BOTTOM_VISIBLE_SCANLINE
-#include "screen.h"
-
-
-#ifdef NES_PCB_DEBUG
-#define VERBOSE 1
-#else
-#define VERBOSE 0
-#endif
-
-#define LOG_MMC(x) do { if (VERBOSE) logerror x; } while (0)
-
-
-//-------------------------------------------------
-// constructor
-//-------------------------------------------------
-
-DEFINE_DEVICE_TYPE(NES_HOSENKAN, nes_hosenkan_device, "nes_hosenkan", "NES Cart HOSENKAN PCB")
-
-
-nes_hosenkan_device::nes_hosenkan_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_nrom_device(mconfig, NES_HOSENKAN, tag, owner, clock)
- , m_irq_count(0)
- , m_irq_count_latch(0)
- , m_irq_clear(0)
- , m_irq_enable(0)
- , m_latch(0)
-{
-}
-
-
-
-
-void nes_hosenkan_device::device_start()
-{
- common_start();
- save_item(NAME(m_irq_enable));
- save_item(NAME(m_irq_count));
- save_item(NAME(m_irq_count_latch));
- save_item(NAME(m_irq_clear));
- save_item(NAME(m_latch));
-}
-
-void nes_hosenkan_device::pcb_reset()
-{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- prg32((m_prg_chunks - 1) >> 1);
- chr8(0, m_chr_source);
-
- m_latch = 0;
- m_irq_enable = 0;
- m_irq_count = m_irq_count_latch = 0;
- m_irq_clear = 0;
-}
-
-
-
-/*-------------------------------------------------
- mapper specific handlers
- -------------------------------------------------*/
-
-/*-------------------------------------------------
-
- Bootleg Board by Hosenkan
-
- Games: Pocahontas, Super Donkey Kong
-
- iNES: mapper 182
-
- In MESS: Supported.
-
- -------------------------------------------------*/
-
-// same as MMC3!
-void nes_hosenkan_device::hblank_irq( int scanline, int vblank, int blanked )
-{
- if (scanline < ppu2c0x_device::BOTTOM_VISIBLE_SCANLINE)
- {
- int prior_count = m_irq_count;
- if ((m_irq_count == 0) || m_irq_clear)
- m_irq_count = m_irq_count_latch;
- else
- m_irq_count--;
-
- if (m_irq_enable && !blanked && (m_irq_count == 0) && (prior_count || m_irq_clear))
- {
- LOG_MMC(("irq fired, scanline: %d\n", scanline));
- hold_irq_line();
- }
- }
- m_irq_clear = 0;
-}
-
-void nes_hosenkan_device::write_h(offs_t offset, uint8_t data)
-{
- LOG_MMC(("hosenkan write_h, offset: %04x, data: %02x\n", offset, data));
-
- switch (offset & 0x7003)
- {
- case 0x0001:
- set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
- break;
- case 0x2000:
- m_latch = data;
- break;
- case 0x4000:
- switch (m_latch)
- {
- case 0:
- chr2_0(data >> 1, CHRROM);
- break;
- case 1:
- chr1_5(data, CHRROM);
- break;
- case 2:
- chr2_2(data >> 1, CHRROM);
- break;
- case 3:
- chr1_7(data, CHRROM);
- break;
- case 4:
- prg8_89(data);
- break;
- case 5:
- prg8_ab(data);
- break;
- case 6:
- chr1_4(data, CHRROM);
- break;
- case 7:
- chr1_6(data, CHRROM);
- break;
- }
- break;
- case 0x6003:
- if (data)
- {
- m_irq_count = data;
- m_irq_enable = 1;
- }
- else
- m_irq_enable = 0;
- break;
- }
-}
diff --git a/src/devices/bus/nes/hosenkan.h b/src/devices/bus/nes/hosenkan.h
deleted file mode 100644
index 163aef76edc..00000000000
--- a/src/devices/bus/nes/hosenkan.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Fabio Priuli
-#ifndef MAME_BUS_NES_HOSENKAN_H
-#define MAME_BUS_NES_HOSENKAN_H
-
-#pragma once
-
-#include "nxrom.h"
-
-
-// ======================> nes_hosenkan_device
-
-class nes_hosenkan_device : public nes_nrom_device
-{
-public:
- // construction/destruction
- nes_hosenkan_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- virtual void write_h(offs_t offset, uint8_t data) override;
-
- virtual void hblank_irq(int scanline, int vblank, int blanked) override;
- virtual void pcb_reset() override;
-
-protected:
- // device-level overrides
- virtual void device_start() override;
-
-private:
- uint16_t m_irq_count, m_irq_count_latch;
- uint8_t m_irq_clear;
- int m_irq_enable;
-
- uint8_t m_latch;
-};
-
-// device type definition
-DECLARE_DEVICE_TYPE(NES_HOSENKAN, nes_hosenkan_device)
-
-#endif // MAME_BUS_NES_HOSENKAN_H
diff --git a/src/devices/bus/nes/kaiser.cpp b/src/devices/bus/nes/kaiser.cpp
index 51f136fc976..5fde4810a2d 100644
--- a/src/devices/bus/nes/kaiser.cpp
+++ b/src/devices/bus/nes/kaiser.cpp
@@ -78,17 +78,17 @@ nes_ks7022_device::nes_ks7022_device(const machine_config &mconfig, const char *
{
}
-nes_ks7032_device::nes_ks7032_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
- : nes_nrom_device(mconfig, type, tag, owner, clock), m_latch(0), m_irq_count(0), m_irq_enable(0), irq_timer(nullptr)
+nes_ks7032_device::nes_ks7032_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, type, tag, owner, clock), m_latch(0), m_irq_count(0), m_irq_count_latch(0), m_irq_enable(0), irq_timer(nullptr)
{
}
-nes_ks7032_device::nes_ks7032_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+nes_ks7032_device::nes_ks7032_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_ks7032_device(mconfig, NES_KS7032, tag, owner, clock)
{
}
-nes_ks202_device::nes_ks202_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+nes_ks202_device::nes_ks202_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_ks7032_device(mconfig, NES_KS202, tag, owner, clock)
{
}
@@ -207,21 +207,22 @@ void nes_ks7032_device::device_start()
save_item(NAME(m_latch));
save_item(NAME(m_irq_enable));
save_item(NAME(m_irq_count));
+ save_item(NAME(m_irq_count_latch));
save_item(NAME(m_reg));
}
void nes_ks7032_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- prg16_89ab(0);
- prg16_cdef(m_prg_chunks - 1);
chr8(0, m_chr_source);
m_latch = 0;
m_irq_enable = 0;
m_irq_count = 0;
- memset(m_reg, 0, sizeof(m_reg));
+ m_irq_count_latch = 0;
+ std::fill(std::begin(m_reg), std::end(m_reg), 0x00);
prg_update();
+ prg8_ef((m_prg_chunks << 1) - 1);
}
void nes_ks7016_device::device_start()
@@ -479,15 +480,15 @@ uint8_t nes_ks7022_device::read_h(offs_t offset)
Kaiser Board KS7032
- Games: A few FDS conversions like Bubble Bobble
- or SMB2
+ Games: FDS conversions of Bubble Bobble, SMB2,
+ and Exciting Soccer
- TODO: available dumps do not seem to use WRAM...
- yet m_reg[4] should switch WRAM bank... investigate!
+ These boards have a KS202 ASIC that provide both
+ banking and a cycle-based IRQ similar to the VRC3.
iNES: mapper 142
- In MAME: Supported?
+ In MAME: Supported.
-------------------------------------------------*/
@@ -497,14 +498,12 @@ void nes_ks7032_device::device_timer(timer_instance const &timer)
{
if (m_irq_enable)
{
- if (m_irq_count == 0xffff)
+ if (++m_irq_count == 0)
{
+ set_irq_line(ASSERT_LINE);
m_irq_enable = 0;
- m_irq_count = 0;
- hold_irq_line();
+ m_irq_count = m_irq_count_latch;
}
- else
- m_irq_count++;
}
}
}
@@ -516,84 +515,100 @@ void nes_ks7032_device::prg_update()
prg8_cd(m_reg[3]);
}
-void nes_ks7032_device::ks7032_write(offs_t offset, uint8_t data)
+void nes_ks7032_device::write_h(offs_t offset, u8 data)
{
LOG_MMC(("ks7032_write, offset: %04x, data: %02x\n", offset, data));
switch (offset & 0x7000)
{
case 0x0000:
- m_irq_count = (m_irq_count & 0xfff0) | (data & 0x0f);
- break;
case 0x1000:
- m_irq_count = (m_irq_count & 0xff0f) | ((data & 0x0f) << 4);
- break;
case 0x2000:
- m_irq_count = (m_irq_count & 0xf0ff) | ((data & 0x0f) << 8);
- break;
case 0x3000:
- m_irq_count = (m_irq_count & 0x0fff) | ((data & 0x0f) << 12);
+ {
+ int shift = (offset >> 10);
+ m_irq_count_latch &= ~(0x000f << shift);
+ m_irq_count_latch |= (data & 0x0f) << shift;
break;
+ }
case 0x4000:
- m_irq_enable = 1;
+ m_irq_enable = BIT(data, 1);
+ if (m_irq_enable)
+ m_irq_count = m_irq_count_latch;
+ set_irq_line(CLEAR_LINE);
+ break;
+ case 0x5000:
+ set_irq_line(CLEAR_LINE);
break;
case 0x6000:
m_latch = data & 0x07;
break;
case 0x7000:
- m_reg[m_latch] = data;
+ m_reg[m_latch] = (m_reg[m_latch] & 0xf0) | (data & 0x0f);
prg_update();
break;
}
}
-uint8_t nes_ks7032_device::read_m(offs_t offset)
+u8 nes_ks7032_device::read_m(offs_t offset)
{
LOG_MMC(("ks7032 read_m, offset: %04x\n", offset));
- return m_prg[((m_reg[4] * 0x2000) + (offset & 0x1fff)) & (m_prg_size - 1)];
+ return m_prg[(m_reg[4] * 0x2000 + offset) & (m_prg_size - 1)];
}
/*-------------------------------------------------
- Kaiser Board KS202
+ Kaiser SMB3 Board with KS202
Games: Super Mario Bros. 3 (Pirate, Alt)
+ A chip, PAL16L8ANC, provides the extra bits overlaid
+ at 0xf000-0xffff. Writes go to both it and the KS202.
+
iNES: mapper 56
- In MAME: Supported?
+ In MAME: Supported.
+
+ TODO: This device needs renaming of some sort. KS202
+ is a chip found on some Kaiser PCBs that actually
+ provides the functionality implemented above in the
+ KS7032 PCB. It's not clear what SMB3's PCB is.
-------------------------------------------------*/
-void nes_ks202_device::write_h(offs_t offset, uint8_t data)
+void nes_ks202_device::write_h(offs_t offset, u8 data)
{
LOG_MMC(("ks202 write_h, offset: %04x, data: %02x\n", offset, data));
- switch (offset & 0x7000)
+ if (offset >= 0x7000)
{
- case 0x7000:
- m_reg[m_latch] = data;
- prg_update();
- switch (offset & 0xc00)
- {
- case 0x800:
- set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
- break;
- case 0xc00:
- chr1_x(offset & 0x07, data, CHRROM);
- break;
- }
- break;
- default:
- ks7032_write(offset, data);
- break;
+ switch (offset & 0xc00)
+ {
+ case 0x000:
+ if ((offset & 3) == 3)
+ prg8_ef((data & 0x10) | 0x0f);
+ else
+ {
+ int reg = (offset & 3) + 1;
+ m_reg[reg] = (m_reg[reg] & 0x0f) | (data & 0x10);
+ }
+ break;
+ case 0x800:
+ set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
+ break;
+ case 0xc00:
+ chr1_x(offset & 0x07, data & 0x7f, CHRROM);
+ break;
+ }
}
+
+ nes_ks7032_device::write_h(offset, data);
}
-uint8_t nes_ks202_device::read_m(offs_t offset)
+u8 nes_ks202_device::read_m(offs_t offset)
{
LOG_MMC(("ks202 read_m, offset: %04x\n", offset));
- return m_prgram[offset & 0x1fff];
+ return m_prgram[offset];
}
/*-------------------------------------------------
@@ -805,7 +820,7 @@ void nes_ks7012_device::write_h(offs_t offset, uint8_t data)
Kaiser Board KS7013B
- Games: Highway Star FDS Conversion
+ Games: Highway Star bootleg
NES 2.0: mapper 312
diff --git a/src/devices/bus/nes/kaiser.h b/src/devices/bus/nes/kaiser.h
index 701b272649b..4e0acf6b7a2 100644
--- a/src/devices/bus/nes/kaiser.h
+++ b/src/devices/bus/nes/kaiser.h
@@ -73,27 +73,28 @@ class nes_ks7032_device : public nes_nrom_device
{
public:
// construction/destruction
- nes_ks7032_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_ks7032_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual uint8_t read_m(offs_t offset) override;
- void ks7032_write(offs_t offset, uint8_t data);
- virtual void write_h(offs_t offset, uint8_t data) override { ks7032_write(offset, data); }
+ virtual u8 read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
protected:
- nes_ks7032_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ // construction/destruction
+ nes_ks7032_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
// device-level overrides
virtual void device_start() override;
virtual void device_timer(timer_instance const &timer) override;
- void prg_update();
+ u8 m_reg[8];
- uint8_t m_latch;
- uint8_t m_reg[8];
+private:
+ void prg_update();
+ u8 m_latch;
- uint16_t m_irq_count;
+ u16 m_irq_count, m_irq_count_latch;
int m_irq_enable;
static const device_timer_id TIMER_IRQ = 0;
@@ -107,11 +108,10 @@ class nes_ks202_device : public nes_ks7032_device
{
public:
// construction/destruction
- nes_ks202_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_ks202_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- // device-level overrides
- virtual uint8_t read_m(offs_t offset) override;
- virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual u8 read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, u8 data) override;
};
@@ -129,6 +129,7 @@ public:
virtual void pcb_reset() override;
protected:
+ // construction/destruction
nes_ks7016_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 mask);
// device-level overrides
diff --git a/src/devices/bus/nes/mmc3_clones.cpp b/src/devices/bus/nes/mmc3_clones.cpp
index 58f06d9309b..0a0ef9f933c 100644
--- a/src/devices/bus/nes/mmc3_clones.cpp
+++ b/src/devices/bus/nes/mmc3_clones.cpp
@@ -35,6 +35,7 @@ DEFINE_DEVICE_TYPE(NES_MALISB, nes_malisb_device, "nes_malisb",
DEFINE_DEVICE_TYPE(NES_FAMILY4646, nes_family4646_device, "nes_family4646", "NES Cart BMC-FAMILY04646 PCB")
DEFINE_DEVICE_TYPE(NES_PIKAY2K, nes_pikay2k_device, "nes_pikay2k", "NES Cart PIKACHU Y2K PCB")
DEFINE_DEVICE_TYPE(NES_8237, nes_8237_device, "nes_8237", "NES Cart UNL-8237 PCB")
+DEFINE_DEVICE_TYPE(NES_8237A, nes_8237a_device, "nes_8237a", "NES Cart UNL-8237A PCB")
DEFINE_DEVICE_TYPE(NES_SG_LIONK, nes_sglionk_device, "nes_sglionk", "NES Cart SuperGame Lion King PCB")
DEFINE_DEVICE_TYPE(NES_SG_BOOG, nes_sgboog_device, "nes_sgbooger", "NES Cart SuperGame BoogerMan PCB")
DEFINE_DEVICE_TYPE(NES_KASING, nes_kasing_device, "nes_kasing", "NES Cart Kasing PCB")
@@ -50,10 +51,16 @@ DEFINE_DEVICE_TYPE(NES_SA9602B, nes_sa9602b_device, "nes_sa9602b",
DEFINE_DEVICE_TYPE(NES_SACHEN_SHERO, nes_sachen_shero_device, "nes_shero", "NES Cart Street Hero PCB")
//DEFINE_DEVICE_TYPE(NES_A9746, nes_a9746_device, "nes_bmc_a9746", "NES Cart A-9746 PCB")
+DEFINE_DEVICE_TYPE(NES_A88S1, nes_a88s1_device, "nes_a88s1", "NES Cart BMC A88S-1 PCB")
DEFINE_DEVICE_TYPE(NES_FCGJ8IN1, nes_fcgj8in1_device, "nes_fcgj8in1", "NES Cart BMC FC Genjin 8 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_FK23C, nes_fk23c_device, "nes_fk23c", "NES Cart FK23C PCB")
DEFINE_DEVICE_TYPE(NES_FK23CA, nes_fk23ca_device, "nes_fk23ca", "NES Cart FK23CA PCB")
+DEFINE_DEVICE_TYPE(NES_NT639, nes_nt639_device, "nes_nt639", "NES Cart NT-639 PCB")
+DEFINE_DEVICE_TYPE(NES_RESETTXROM0, nes_resettxrom0_device, "nes_resettxrom0", "NES Cart BMC RESET-TXROM 128K/128K PCB")
+DEFINE_DEVICE_TYPE(NES_RESETTXROM1, nes_resettxrom1_device, "nes_resettxrom1", "NES Cart BMC RESET-TXROM 256K/128K PCB")
+DEFINE_DEVICE_TYPE(NES_RESETTXROM2, nes_resettxrom2_device, "nes_resettxrom2", "NES Cart BMC RESET-TXROM 128K/256K PCB")
DEFINE_DEVICE_TYPE(NES_S24IN1SC03, nes_s24in1sc03_device, "nes_s24in1c03", "NES Cart Super 24 in 1 SC-03 PCB")
+DEFINE_DEVICE_TYPE(NES_TECHLINE9IN1, nes_tech9in1_device, "nes_tech9in1", "NES Cart Techline 9 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_8IN1, nes_bmc_8in1_device, "nes_bmc_8in1", "NES Cart BMC GRM070 8 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_15IN1, nes_bmc_15in1_device, "nes_bmc_15in1", "NES Cart BMC 15 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_SBIG7, nes_bmc_sbig7_device, "nes_bmc_sbig7", "NES Cart BMC Super BIG 7 in 1 PCB")
@@ -61,11 +68,12 @@ DEFINE_DEVICE_TYPE(NES_BMC_HIK8, nes_bmc_hik8_device, "nes_bmc_hik8",
DEFINE_DEVICE_TYPE(NES_BMC_HIK4, nes_bmc_hik4_device, "nes_bmc_hik4", "NES Cart BMC HIK 4 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_MARIO7IN1, nes_bmc_mario7in1_device, "nes_bmc_mario7in1", "NES Cart BMC Mario 7 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_F15, nes_bmc_f15_device, "nes_bmc_f15", "NES Cart BMC F-15 PCB")
+DEFINE_DEVICE_TYPE(NES_BMC_GN45, nes_bmc_gn45_device, "nes_bmc_gn45", "NES Cart BMC GN-45 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_GOLD7IN1, nes_bmc_gold7in1_device, "nes_bmc_gold7in1", "NES Cart BMC Golden 7 in 1 PCB")
-DEFINE_DEVICE_TYPE(NES_BMC_GC6IN1, nes_bmc_gc6in1_device, "nes_bmc_gc6in1", "NES Cart BMC Golden Card 6 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_K3006, nes_bmc_k3006_device, "nes_bmc_k3006", "NES Cart BMC K-3006 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_411120C, nes_bmc_411120c_device, "nes_bmc_411120c", "NES Cart BMC 411120C PCB")
DEFINE_DEVICE_TYPE(NES_BMC_830118C, nes_bmc_830118c_device, "nes_bmc_830118c", "NES Cart BMC 830118C PCB")
+DEFINE_DEVICE_TYPE(NES_BMC_830832C, nes_bmc_830832c_device, "nes_bmc_830832c", "NES Cart BMC 830832C PCB")
DEFINE_DEVICE_TYPE(NES_BMC_841101C, nes_bmc_841101c_device, "nes_bmc_841101c", "NES Cart BMC 841101C PCB")
DEFINE_DEVICE_TYPE(NES_PJOY84, nes_pjoy84_device, "nes_pjoy84", "NES Cart Powerjoy 84 PCB")
DEFINE_DEVICE_TYPE(NES_COOLBOY, nes_coolboy_device, "nes_coolboy", "NES Cart CoolBoy PCB")
@@ -101,23 +109,43 @@ nes_pikay2k_device::nes_pikay2k_device(const machine_config &mconfig, const char
{
}
-nes_8237_device::nes_8237_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_txrom_device(mconfig, NES_8237, tag, owner, clock), m_cd_enable(0)
+nes_8237_device::nes_8237_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : nes_txrom_device(mconfig, type, tag, owner, clock), m_board(type == NES_8237A)
{
}
-nes_sglionk_device::nes_sglionk_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_txrom_device(mconfig, NES_SG_LIONK, tag, owner, clock), m_reg(0), m_reg_enabled(0)
+nes_8237_device::nes_8237_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_8237_device(mconfig, NES_8237, tag, owner, clock)
{
}
-nes_sgboog_device::nes_sgboog_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_txrom_device(mconfig, NES_SG_BOOG, tag, owner, clock), m_mode(0)
+nes_8237a_device::nes_8237a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_8237_device(mconfig, NES_8237A, tag, owner, clock)
{
}
-nes_kasing_device::nes_kasing_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_txrom_device(mconfig, NES_KASING, tag, owner, clock), m_reg(0)
+nes_kasing_device::nes_kasing_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : nes_txrom_device(mconfig, type, tag, owner, clock), m_mmc3_mode(true)
+{
+}
+
+nes_kasing_device::nes_kasing_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_kasing_device(mconfig, NES_KASING, tag, owner, clock)
+{
+}
+
+nes_sglionk_device::nes_sglionk_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : nes_kasing_device(mconfig, type, tag, owner, clock), m_board(type == NES_SG_BOOG)
+{
+}
+
+nes_sglionk_device::nes_sglionk_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_sglionk_device(mconfig, NES_SG_LIONK, tag, owner, clock)
+{
+}
+
+nes_sgboog_device::nes_sgboog_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_sglionk_device(mconfig, NES_SG_BOOG, tag, owner, clock)
{
}
@@ -176,6 +204,11 @@ nes_sachen_shero_device::nes_sachen_shero_device(const machine_config &mconfig,
//{
//}
+nes_a88s1_device::nes_a88s1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_txrom_device(mconfig, NES_A88S1, tag, owner, clock)
+{
+}
+
nes_fcgj8in1_device::nes_fcgj8in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_txrom_device(mconfig, NES_FCGJ8IN1, tag, owner, clock)
{
@@ -196,11 +229,41 @@ nes_fk23ca_device::nes_fk23ca_device(const machine_config &mconfig, const char *
{
}
+nes_nt639_device::nes_nt639_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_txrom_device(mconfig, NES_NT639, tag, owner, clock)
+{
+}
+
+nes_resettxrom0_device::nes_resettxrom0_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int prg_shift, int chr_shift)
+ : nes_txrom_device(mconfig, type, tag, owner, clock), m_count(-1), m_prg_shift(prg_shift), m_chr_shift(chr_shift)
+{
+}
+
+nes_resettxrom0_device::nes_resettxrom0_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_resettxrom0_device(mconfig, NES_RESETTXROM0, tag, owner, clock, 4, 7)
+{
+}
+
+nes_resettxrom1_device::nes_resettxrom1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_resettxrom0_device(mconfig, NES_RESETTXROM1, tag, owner, clock, 5, 7)
+{
+}
+
+nes_resettxrom2_device::nes_resettxrom2_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_resettxrom0_device(mconfig, NES_RESETTXROM2, tag, owner, clock, 4, 8)
+{
+}
+
nes_s24in1sc03_device::nes_s24in1sc03_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: nes_txrom_device(mconfig, NES_S24IN1SC03, tag, owner, clock)
{
}
+nes_tech9in1_device::nes_tech9in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_txrom_device(mconfig, NES_TECHLINE9IN1, tag, owner, clock)
+{
+}
+
nes_bmc_8in1_device::nes_bmc_8in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_txrom_device(mconfig, NES_BMC_8IN1, tag, owner, clock)
{
@@ -236,13 +299,13 @@ nes_bmc_f15_device::nes_bmc_f15_device(const machine_config &mconfig, const char
{
}
-nes_bmc_gold7in1_device::nes_bmc_gold7in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_txrom_device(mconfig, NES_BMC_GOLD7IN1, tag, owner, clock), m_reg_written(0)
+nes_bmc_gn45_device::nes_bmc_gn45_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_txrom_device(mconfig, NES_BMC_GN45, tag, owner, clock), m_lock(false)
{
}
-nes_bmc_gc6in1_device::nes_bmc_gc6in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_txrom_device(mconfig, NES_BMC_GC6IN1, tag, owner, clock)
+nes_bmc_gold7in1_device::nes_bmc_gold7in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : nes_txrom_device(mconfig, NES_BMC_GOLD7IN1, tag, owner, clock), m_reg_written(0)
{
}
@@ -261,6 +324,11 @@ nes_bmc_830118c_device::nes_bmc_830118c_device(const machine_config &mconfig, co
{
}
+nes_bmc_830832c_device::nes_bmc_830832c_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_txrom_device(mconfig, NES_BMC_830832C, tag, owner, clock)
+{
+}
+
nes_bmc_841101c_device::nes_bmc_841101c_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_txrom_device(mconfig, NES_BMC_841101C, tag, owner, clock)
{
@@ -303,70 +371,33 @@ void nes_8237_device::device_start()
{
mmc3_start();
save_item(NAME(m_reg));
- save_item(NAME(m_cd_enable));
}
void nes_8237_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ mmc3_common_initialize(0x1f, 0xff, 0);
m_reg[0] = 0;
- m_reg[1] = 0;
+ m_reg[1] = 0x0f;
m_reg[2] = 0;
- m_cd_enable = 0;
- mmc3_common_initialize(0xff, 0xff, 0);
-}
-
-void nes_sglionk_device::device_start()
-{
- mmc3_start();
- save_item(NAME(m_reg));
- save_item(NAME(m_reg_enabled));
-}
-
-void nes_sglionk_device::pcb_reset()
-{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
-
- m_reg = m_reg_enabled = 0;
- mmc3_common_initialize(0xff, 0xff, 0);
-}
-
-void nes_sgboog_device::device_start()
-{
- mmc3_start();
- save_item(NAME(m_reg));
- save_item(NAME(m_mode));
-}
-
-void nes_sgboog_device::pcb_reset()
-{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
-
- m_mode = 0x04;
- m_reg[0] = 0x00;
- m_reg[1] = 0xff;
- m_reg[2] = 0;
- mmc3_common_initialize(0x1f, 0xff, 0);
- set_prg(m_prg_base, m_prg_mask);
- set_chr(m_chr_source, m_chr_base, m_chr_mask);
+ update_banks();
}
void nes_kasing_device::device_start()
{
mmc3_start();
- save_item(NAME(m_reg));
+ save_item(NAME(m_mmc3_mode));
}
void nes_kasing_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- m_reg = 0;
+ m_mmc3_mode = true;
mmc3_common_initialize(0xff, 0xff, 0);
}
-
void nes_kay_device::device_start()
{
mmc3_start();
@@ -469,6 +500,23 @@ void nes_sachen_shero_device::pcb_reset()
mmc3_common_initialize(0xff, 0x1ff, 0);
}
+void nes_a88s1_device::device_start()
+{
+ mmc3_start();
+ save_item(NAME(m_reg));
+
+ // power-on values for registers; they don't seem to change with soft reset
+ m_reg[0] = 0x80;
+ m_reg[1] = 0x82;
+}
+
+void nes_a88s1_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ mmc3_common_initialize(0x1f, 0xff, 0);
+ update_banks();
+}
+
void nes_fcgj8in1_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
@@ -508,6 +556,31 @@ void nes_fk23ca_device::pcb_reset()
fk23c_set_chr();
}
+void nes_nt639_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ mmc3_common_initialize(0x0f, 0xff, 0);
+}
+
+// These reset-based PCBs are emulated here with no additional handlers
+void nes_resettxrom0_device::device_start()
+{
+ mmc3_start();
+ save_item(NAME(m_count));
+}
+
+void nes_resettxrom0_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ mmc3_common_initialize((1 << m_prg_shift) - 1, (1 << m_chr_shift) - 1, 0);
+
+ m_count = (m_count + 1) & 3;
+ m_prg_base = m_count << m_prg_shift;
+ m_chr_base = m_count << m_chr_shift;
+ set_prg(m_prg_base, m_prg_mask);
+ set_chr(m_chr_source, m_chr_base, m_chr_mask);
+}
+
void nes_s24in1sc03_device::device_start()
{
mmc3_start();
@@ -524,6 +597,20 @@ void nes_s24in1sc03_device::pcb_reset()
mmc3_common_initialize(0xff, 0xff, 0);
}
+void nes_tech9in1_device::device_start()
+{
+ mmc3_start();
+ save_item(NAME(m_reg));
+}
+
+void nes_tech9in1_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+
+ m_reg[0] = m_reg[1] = m_reg[2] = 0;
+ mmc3_common_initialize(0x1f, 0xff, 0);
+}
+
void nes_bmc_8in1_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
@@ -590,37 +677,32 @@ void nes_bmc_f15_device::pcb_reset()
prg16_cdef(0);
}
-void nes_bmc_gold7in1_device::device_start()
+void nes_bmc_gn45_device::device_start()
{
mmc3_start();
- save_item(NAME(m_reg_written));
+ save_item(NAME(m_lock));
}
-void nes_bmc_gold7in1_device::pcb_reset()
+void nes_bmc_gn45_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- m_reg_written = 0;
- mmc3_common_initialize(0x1f, 0xff, 0);
+ m_lock = false;
+ mmc3_common_initialize(0x0f, 0x7f, 0);
}
-void nes_bmc_gc6in1_device::device_start()
+void nes_bmc_gold7in1_device::device_start()
{
mmc3_start();
- save_item(NAME(m_reg));
+ save_item(NAME(m_reg_written));
}
-void nes_bmc_gc6in1_device::pcb_reset()
+void nes_bmc_gold7in1_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- m_reg[0] = 0x00;
- m_reg[1] = 0xff;
- m_reg[2] = 0x03;
- m_reg[3] = 0;
- mmc3_common_initialize(0xff, 0xff, 0);
- set_prg(m_prg_base, m_prg_mask);
- set_chr(m_chr_source, m_chr_base, m_chr_mask);
+ m_reg_written = 0;
+ mmc3_common_initialize(0x1f, 0xff, 0);
}
void nes_bmc_k3006_device::pcb_reset()
@@ -659,6 +741,12 @@ void nes_bmc_830118c_device::pcb_reset()
mmc3_common_initialize(0x7f, 0x7f, 0);
}
+void nes_bmc_830832c_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ mmc3_common_initialize(0x1f, 0xff, 0);
+}
+
void nes_bmc_841101c_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
@@ -865,363 +953,185 @@ uint8_t nes_pikay2k_device::read_m(offs_t offset)
/*-------------------------------------------------
- Board UNL-8237
+ Board UNL-8237, UNL-8237A
- Games: Pocahontas 2
+ Games: Pocahontas 2, MK3, various multicarts
- MMC3 clone
+ MMC3 clone with register and address scrambling and
+ a few extra banking modes by writing 0x5000-0x5fff.
- In MESS: Supported
+ iNES: mapper 215
- -------------------------------------------------*/
+ In MAME: Preliminary supported.
-void nes_8237_device::prg_cb(int start, int bank)
-{
- if (!(m_reg[0] & 0x80))
- prg8_x(start, bank);
-}
+ TODO: Lion King crashes after the first level in mc_9king.
+ Also in mc_9king Lion King, Somari and Aladdin all reset
+ to Aladdin instead of the menu.
-void nes_8237_device::chr_cb(int start, int bank, int source)
-{
- bank |= ((m_reg[1] << 6) & 0x100);
- chr1_x(start, bank, source);
-}
+ -------------------------------------------------*/
-void nes_8237_device::write_l(offs_t offset, uint8_t data)
+void nes_8237_device::update_banks()
{
- LOG_MMC(("unl_8237 write_l, offset: %04x, data: %02x\n", offset, data));
- offset += 0x100;
+ int a17 = BIT(m_reg[0], 6);
+ m_chr_base = m_board ? (m_reg[1] & 0x0e) << 7 : (m_reg[1] & 0x0c) << 6;
+ m_chr_base |= (BIT(m_reg[1], 5) & a17) << 7;
+ m_chr_mask = 0xff >> a17;
+ set_chr(m_chr_source, m_chr_base, m_chr_mask);
- if (offset == 0x1000)
- {
- m_reg[0] = data;
- if (m_reg[0] & 0x80)
- {
- if (m_reg[0] & 0x20)
- prg32((m_reg[0] & 0x0f) >> 1);
- else
- {
- prg16_89ab(m_reg[0] & 0x1f);
- prg16_cdef(m_reg[0] & 0x1f);
- }
- }
- else
- set_prg(m_prg_base, m_prg_mask);
- }
+ m_prg_base = m_board ? bitswap<3>(m_reg[1], 3, 1, 0) : m_reg[1] & 0x03;
+ m_prg_base = m_prg_base << 5 | (m_reg[1] & (a17 << 4));
+ m_prg_mask = 0x1f >> a17;
- if (offset == 0x1001)
+ if (BIT(m_reg[0], 7))
{
- m_reg[1] = data;
- set_chr(m_chr_source, m_chr_base, m_chr_mask);
+ u8 bank = m_prg_base >> 1 | (m_reg[0] & (m_prg_mask >> 1));
+ u8 mode = BIT(m_reg[0], 5);
+ prg16_89ab(bank & ~mode);
+ prg16_cdef(bank | mode);
}
+ set_prg(m_prg_base, m_prg_mask);
+}
- if (offset == 0x1007)
- {
- m_reg[2] = data & 0x07; // this selects different permutations for addresses and regs (to be implemented)
- }
+void nes_8237_device::prg_cb(int start, int bank)
+{
+ if (!BIT(m_reg[0], 7))
+ nes_txrom_device::prg_cb(start, bank);
}
-void nes_8237_device::write_h(offs_t offset, uint8_t data)
+void nes_8237_device::write_l(offs_t offset, u8 data)
{
- static const uint8_t conv_table[8] = {0, 2, 6, 1, 7, 3, 4, 5};
- LOG_MMC(("unl_8237 write_h, offset: %04x, data: %02x\n", offset, data));
+ LOG_MMC(("unl_8237 write_l, offset: %04x, data: %02x\n", offset, data));
+ offset += 0x100;
- switch (offset & 0x7000)
+ switch (offset & 0x1007)
{
- case 0x0000:
case 0x1000:
- set_nt_mirroring((data | (data >> 7)) & 0x01 ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
- break;
-
- case 0x2000:
- case 0x3000:
- m_cd_enable = 1;
- data = (data & 0xc0) | conv_table[data & 0x07];
- txrom_write(0x0000, data);
+ case 0x1001:
+ m_reg[offset & 1] = data;
+ update_banks();
break;
-
- case 0x4000:
- case 0x5000:
- if (m_cd_enable)
- {
- m_cd_enable = 0;
- txrom_write(0x0001, data);
- }
- break;
-
- case 0x6000:
- break;
-
- case 0x7000:
- txrom_write(0x6001, data);
- txrom_write(0x4000, data);
- txrom_write(0x4001, data);
+ case 0x1007:
+ m_reg[2] = data & 0x07;
break;
}
}
-/*-------------------------------------------------
-
- Bootleg Board by Super Game
-
- Games: The Lion King
-
- MMC3 clone.
-
- iNES: mapper 114
-
- In MESS: Supported.
-
- -------------------------------------------------*/
-
-void nes_sglionk_device::write_m(offs_t offset, uint8_t data)
+void nes_8237_device::write_h(offs_t offset, u8 data)
{
- LOG_MMC(("sglionk write_m, offset: %04x, data: %02x\n", offset, data));
-
- m_reg = data;
+ LOG_MMC(("unl_8237 write_h, offset: %04x, data: %02x\n", offset, data));
- if (m_reg & 0x80)
+ static constexpr u8 reg_table[8][8] =
{
- prg16_89ab(data & 0x1f);
- prg16_cdef(data & 0x1f);
- }
- else
- set_prg(m_prg_base, m_prg_mask);
-
-}
-
-void nes_sglionk_device::write_h(offs_t offset, uint8_t data)
-{
- static const uint8_t conv_table[8] = {0, 3, 1, 5, 6, 7, 2, 4};
- LOG_MMC(("sglionk write_h, offset: %04x, data: %02x\n", offset, data));
+ {0, 1, 2, 3, 4, 5, 6, 7},
+ {0, 2, 6, 1, 7, 3, 4, 5},
+ {0, 5, 4, 1, 7, 2, 6, 3},
+ {0, 6, 3, 7, 5, 2, 4, 1},
+ {0, 2, 5, 3, 6, 1, 7, 4},
+ {0, 1, 2, 3, 4, 5, 6, 7},
+ {0, 1, 2, 3, 4, 5, 6, 7},
+ {0, 1, 2, 3, 4, 5, 6, 7}
+ };
- if (offset < 0x6000)
+ static constexpr u16 addr_table[8][8] =
{
- switch (offset & 0x6000)
- {
- case 0x0000:
- set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
- break;
- case 0x2000:
- m_reg_enabled = 1;
- data = (data & 0xc0) | conv_table[data & 0x07];
- txrom_write(0x0000, data);
- break;
- case 0x4000:
- if (m_reg_enabled && (m_reg & 0x80) == 0)
- {
- m_reg_enabled = 0;
- txrom_write(0x0001, data);
- }
- break;
- }
- }
- else
- {
- switch (offset & 0x03)
- {
- case 0x02:
- txrom_write(0x6000, data);
- break;
- case 0x03:
- txrom_write(0x6001, data);
- txrom_write(0x4000, data);
- txrom_write(0x4001, data);
- break;
- }
- }
+ {0x8000, 0x8001, 0xa000, 0xa001, 0xc000, 0xc001, 0xe000, 0xe001},
+ {0xa001, 0xa000, 0x8000, 0xc000, 0x8001, 0xc001, 0xe000, 0xe001},
+ {0x8000, 0x8001, 0xa000, 0xa001, 0xc000, 0xc001, 0xe000, 0xe001},
+ {0xc001, 0x8000, 0x8001, 0xa000, 0xa001, 0xe001, 0xe000, 0xc000},
+ {0xa001, 0x8001, 0x8000, 0xc000, 0xa000, 0xc001, 0xe000, 0xe001},
+ {0x8000, 0x8001, 0xa000, 0xa001, 0xc000, 0xc001, 0xe000, 0xe001},
+ {0x8000, 0x8001, 0xa000, 0xa001, 0xc000, 0xc001, 0xe000, 0xe001},
+ {0x8000, 0x8001, 0xa000, 0xa001, 0xc000, 0xc001, 0xe000, 0xe001},
+ };
+
+ u16 addr = addr_table[m_reg[2]][bitswap<3>(offset, 14, 13, 0)];
+ if (addr == 0x8000)
+ data = (data & 0xc0) | reg_table[m_reg[2]][data & 0x07];
+ txrom_write(addr & 0x6001, data);
}
/*-------------------------------------------------
- Bootleg Board by Super Game
+ Bootleg Board by Kasing
- Games: Boogerman, Mortal Kombat III
+ Games: AV Jiu Ji Mahjong, Bao Qing Tian, Thunderbolt 2,
+ Shisen Mahjong 2, Garou Densetsu Special
- MMC3 clone. Also, it probably needs a hack to support both
- variants (Boogerman & MK3).
+ MMC3 clone with extra banking modes at 0x6000-0x7fff.
- iNES: mapper 215
+ iNES: mapper 115
- In MESS: Preliminary support.
+ In MAME: Supported.
-------------------------------------------------*/
-void nes_sgboog_device::prg_cb(int start, int bank)
-{
- if (!(m_reg[0] & 0x80)) // if this is != 0 we should never even arrive here
- {
- if (m_reg[1] & 0x08)
- bank = (bank & 0x1f) | 0x20;
- else
- bank = (bank & 0x0f) | (m_reg[1] & 0x10);
-
- prg8_x(start, bank);
- }
-}
-
-void nes_sgboog_device::chr_cb(int start, int bank, int source)
-{
- if ((m_reg[1] & 0x04))
- bank |= 0x100;
- else
- bank = (bank & 0x7f) | ((m_reg[1] & 0x10) << 3);
-
- chr1_x(start, bank, source);
-}
-
-void nes_sgboog_device::set_prg(int prg_base, int prg_mask)
-{
- if (m_reg[0] & 0x80)
- {
- prg16_89ab((m_reg[0] & 0xf0) | (m_reg[1] & 0x10));
- prg16_cdef((m_reg[0] & 0xf0) | (m_reg[1] & 0x10));
- }
- else
- {
- // here standard MMC3 bankswitch
- uint8_t prg_flip = (m_latch & 0x40) ? 2 : 0;
-
- prg_cb(0, prg_base | (m_mmc_prg_bank[0 ^ prg_flip] & prg_mask));
- prg_cb(1, prg_base | (m_mmc_prg_bank[1] & prg_mask));
- prg_cb(2, prg_base | (m_mmc_prg_bank[2 ^ prg_flip] & prg_mask));
- prg_cb(3, prg_base | (m_mmc_prg_bank[3] & prg_mask));
- }
-}
-
-void nes_sgboog_device::write_l(offs_t offset, uint8_t data)
+void nes_kasing_device::prg_cb(int start, int bank)
{
- LOG_MMC(("sgboog write_l, offset: %04x, data: %02x\n", offset, data));
- offset += 0x100;
-
- if (offset == 0x1000)
- {
- m_reg[0] = data;
- set_prg(m_prg_base, m_prg_mask);
- }
- else if (offset == 0x1001)
- {
- m_reg[1] = data;
- set_chr(m_chr_source, m_chr_base, m_chr_mask);
- }
- else if (offset == 0x1007)
- {
- m_latch = 0;
- m_mode = data;
- set_prg(m_prg_base, m_prg_mask);
- set_chr(m_chr_source, m_chr_base, m_chr_mask);
- }
+ if (m_mmc3_mode)
+ nes_txrom_device::prg_cb(start, bank);
}
-void nes_sgboog_device::write_m(offs_t offset, uint8_t data)
+void nes_kasing_device::write_m(offs_t offset, u8 data)
{
- LOG_MMC(("sgboog write_m, offset: %04x, data: %02x\n", offset, data));
+ LOG_MMC(("kasing write_m, offset: %04x, data: %02x\n", offset, data));
- if (offset == 0x0000)
- {
- m_reg[0] = data;
- set_prg(m_prg_base, m_prg_mask);
- }
- else if (offset == 0x0001)
+ if (BIT(offset, 0))
{
- m_reg[1] = data;
- set_chr(m_chr_source, m_chr_base, m_chr_mask);
- }
- else if (offset == 0x0007)
- {
- m_latch = 0;
- m_mode = data;
- set_prg(m_prg_base, m_prg_mask);
+ m_chr_base = BIT(data, 0) << 8;
set_chr(m_chr_source, m_chr_base, m_chr_mask);
}
-}
-
-void nes_sgboog_device::write_h(offs_t offset, uint8_t data)
-{
- static const uint8_t conv_table[8] = {0,2,5,3,6,1,7,4};
- LOG_MMC(("sgboog write_h, offset: %04x, data: %02x\n", offset, data));
-
- if (m_mode)
+ else
{
- switch (offset & 0x6001)
+ m_mmc3_mode = !BIT(data, 7);
+ if (m_mmc3_mode)
+ set_prg(m_prg_base, m_prg_mask);
+ else
{
- case 0x0000:
- break;
-
- case 0x0001:
- if (m_reg[2] && ((m_reg[0] & 0x80) == 0 || (m_latch & 0x07) < 6)) // if we use the prg16 banks and cmd=6,7 DON'T enter!
- {
- m_reg[2] = 0;
- txrom_write(0x0001, data);
- }
- break;
-
- case 0x2000:
- data = (data & 0xc0) | conv_table[data & 0x07];
- m_reg[2] = 1;
- txrom_write(0x0000, data);
- break;
-
- case 0x4000:
- set_nt_mirroring(((data >> 7) | data) & 0x01 ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
- break;
-
- case 0x4001:
- txrom_write(0x6001, data);
- break;
-
- case 0x6001:
- txrom_write(0x4000, data);
- txrom_write(0x4001, data);
- break;
-
- default:
- txrom_write(offset, data);
- break;
+ u8 bank = data & 0x0f;
+ u8 mode = BIT(data, 5);
+ prg16_89ab(bank & ~mode);
+ prg16_cdef(bank | mode);
}
}
- else
- txrom_write(offset, data);
}
/*-------------------------------------------------
- Bootleg Board by Kasing
+ Bootleg Boards by Super Game and Hosenkan
- Games: AV Jiu Ji Mahjong, Bao Qing Tian, Thunderbolt 2,
- Shisen Mahjong 2
+ Games: The Lion King, Aladdin, Boogerman, Pocohon,
+ Super Donkey Kong
- MMC3 clone
+ MMC3 clone with register and address scrambling and
+ a few extra banking modes by writing 0x6000-0x7fff.
+ This is the same as mapper 115 with scrambling.
- iNES: mapper 115
+ iNES: mapper 114 (and 182)
- In MESS: Supported
+ In MAME: Supported.
-------------------------------------------------*/
-void nes_kasing_device::prg_cb(int start, int bank)
+void nes_sglionk_device::write_h(offs_t offset, u8 data)
{
- if (BIT(m_reg, 7))
- prg32(m_reg >> 1);
- else
- prg8_x(start, bank);
-}
+ LOG_MMC(("sglionk write_h, offset: %04x, data: %02x\n", offset, data));
-void nes_kasing_device::write_m(offs_t offset, uint8_t data)
-{
- LOG_MMC(("kasing write_m, offset: %04x, data: %02x\n", offset, data));
+ static constexpr u8 reg_table[2][8] =
+ {
+ {0, 3, 1, 5, 6, 7, 2, 4},
+ {0, 2, 5, 3, 6, 1, 7, 4}
+ };
- switch (offset & 0x01)
+ static constexpr u16 addr_table[2][8] =
{
- case 0x00:
- m_reg = data;
- set_prg(m_prg_base, m_prg_mask);
- break;
- case 0x01:
- m_chr_base = (data & 0x01) ? 0x100 : 0x000;
- set_chr(m_chr_source, m_chr_base, m_chr_mask);
- break;
- }
+ {0xa001, 0xa000, 0x8000, 0xc000, 0x8001, 0xc001, 0xe000, 0xe001},
+ {0xa001, 0x8001, 0x8000, 0xc001, 0xa000, 0xc000, 0xe000, 0xe001}
+ };
+
+ u16 addr = addr_table[m_board][bitswap<3>(offset, 14, 13, 0)];
+ if (addr == 0x8000)
+ data = (data & 0xc0) | reg_table[m_board][data & 0x07];
+ txrom_write(addr & 0x6001, data);
}
/*-------------------------------------------------
@@ -1480,7 +1390,7 @@ void nes_txc_tw_device::write_l(offs_t offset, uint8_t data)
prg32((data >> 4) | data);
}
-/* writes to 0x8000-0xffff are like MMC3 but no PRG bankswitch (beacuse it is handled by low writes) */
+// writes to 0x8000-0xffff are like MMC3 but no PRG bankswitch (beacuse it is handled by low writes)
void nes_txc_tw_device::prg_cb(int start, int bank)
{
return;
@@ -1507,7 +1417,7 @@ void nes_kof97_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("kof97 write_h, offset: %04x, data: %02x\n", offset, data));
- /* Addresses 0x9000, 0xa000, 0xd000 & 0xf000 behaves differently than MMC3 */
+ // Addresses 0x9000, 0xa000, 0xd000 & 0xf000 behaves differently than MMC3
if (offset == 0x1000)
txrom_write(0x0001, kof97_unscramble(data));
else if (offset == 0x2000)
@@ -1516,7 +1426,7 @@ void nes_kof97_device::write_h(offs_t offset, uint8_t data)
txrom_write(0x4001, kof97_unscramble(data));
else if (offset == 0x7000)
txrom_write(0x6001, kof97_unscramble(data));
- /* Other addresses behaves like MMC3, up to unscrambling data */
+ // Other addresses behaves like MMC3, up to unscrambling data
else
txrom_write(offset, kof97_unscramble(data));
}
@@ -1752,7 +1662,7 @@ uint8_t nes_gouder_device::read_l(offs_t offset)
return 0x00;
}
-/* writes to 0x8000-0xffff are like MMC3 but no PRG bankswitch (beacuse it is handled by low writes) */
+// writes to 0x8000-0xffff are like MMC3 but no PRG bankswitch (beacuse it is handled by low writes)
void nes_gouder_device::prg_cb(int start, int bank)
{
return;
@@ -2012,6 +1922,35 @@ void nes_fk23c_device::write_h(offs_t offset, uint8_t data)
/*-------------------------------------------------
+ BMC-NT-639
+
+ Unknown Bootleg Multigame Board
+ Games: 2 in 1 Mortal Kombat VI/VII
+
+ NES 2.0: mapper 291
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_nt639_device::write_m(offs_t offset, u8 data)
+{
+ LOG_MMC(("nt639 write_m, offset: %04x, data: %02x\n", offset, data));
+
+ if (BIT(data, 5))
+ prg32(bitswap<3>(data, 6, 2, 1));
+ else
+ {
+ m_prg_base = (data & 0x40) >> 2;
+ set_prg(m_prg_base, m_prg_mask);
+ }
+
+ m_chr_base = (data & 0x40) << 2;
+ set_chr(m_chr_source, m_chr_base, m_chr_mask);
+}
+
+/*-------------------------------------------------
+
Board BMC-SUPER24IN1SC03
Games: Super 24-in-1
@@ -2065,6 +2004,54 @@ void nes_s24in1sc03_device::write_l(offs_t offset, uint8_t data)
/*-------------------------------------------------
+ BMC-TECHLINE9IN1
+
+ Unknown Bootleg Multigame Board
+ Games: 9 in 1
+
+ NES 2.0: mapper 351
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_tech9in1_device::update_banks()
+{
+ if (BIT(m_reg[2], 7)) // NROM mode
+ {
+ u8 bank = m_reg[1] >> 2;
+ u8 mode = !BIT(m_reg[2], 6);
+ prg16_89ab(bank & ~mode);
+ prg16_cdef(bank | mode);
+ }
+ else // MMC3 mode
+ {
+ m_prg_base = (m_reg[1] & 0xfc) >> 1;
+ m_prg_mask = 0x1f >> BIT(m_reg[2], 5);
+ set_prg(m_prg_base, m_prg_mask);
+ }
+
+ m_chr_base = (m_reg[0] & 0xfc) << 1;
+ m_chr_mask = BIT(m_reg[2], 7) ? 0x1f : 0xff >> BIT(m_reg[2], 5);
+ set_chr(m_chr_source, m_chr_base, m_chr_mask);
+}
+
+void nes_tech9in1_device::write_l(offs_t offset, u8 data)
+{
+ LOG_MMC(("tech9in1 write_l, offset: %04x, data: %02x\n", offset, data));
+ offset += 0x100;
+
+ switch (offset & 0x1003) // writes $5000-$5002, mask is a best guess
+ {
+ case 0x1000: case 0x1001: case 0x1002:
+ m_reg[offset & 3] = data;
+ update_banks();
+ break;
+ }
+}
+
+/*-------------------------------------------------
+
BMC-NEWSTAR-GRM070-8IN1
Unknown Bootleg Multigame Board
@@ -2144,7 +2131,7 @@ void nes_bmc_sbig7_device::write_h(offs_t offset, uint8_t data)
switch (offset & 0x6001)
{
- case 0x2001: /* $a001 - Select 128K ROM/VROM base (0..5) or last 256K ROM/VRAM base (6) */
+ case 0x2001: // $a001 - Select 128K ROM/VROM base (0..5) or last 256K ROM/VRAM base (6)
page = (data & 0x07);
if (page > 6)
page = 6;
@@ -2290,6 +2277,70 @@ void nes_bmc_mario7in1_device::write_m(offs_t offset, uint8_t data)
/*-------------------------------------------------
+ BMC-A88S-1
+
+ Games: 1997 Super 7 in 1, 6 in 1 (JY-201 to JY-206)
+
+ MMC3 clone with banking for multigame menu.
+
+ NES 2.0: mapper 411
+
+ In MAME: Preliminary supported.
+
+ TODO: Investigate...
+ - Hokuto no Ken has broken sound on each cart it's on.
+ - Bird Fighter boss fights have corrupt graphics.
+ - whether not being able to reset from within certain
+ games is correct. Examples are Samurai (title scroll
+ only) and Bomber Man (in game only) on JY-202, or
+ SD Gunman in JY-204.
+
+ -------------------------------------------------*/
+
+void nes_a88s1_device::update_banks()
+{
+ u8 outer = bitswap<2>(m_reg[1], 6, 3);
+ u8 size_128k = !BIT(m_reg[1], 1);
+
+ if (BIT(m_reg[0], 6)) // NROM mode
+ {
+ u8 bank = outer << 3 | bitswap<3>(m_reg[0], 2, 3, 0);
+ u8 mode = BIT(m_reg[0], 1);
+ prg16_89ab(bank & ~mode);
+ prg16_cdef(bank | mode);
+ }
+ else // MMC3 mode
+ {
+ m_prg_base = (outer & (0xfe | size_128k)) << 4;
+ m_prg_mask = 0x1f >> size_128k;
+ set_prg(m_prg_base, m_prg_mask);
+ }
+
+ m_chr_base = (m_reg[0] & 0x10) << 4 | (BIT(m_reg[1], 2) & size_128k) << 7;
+ m_chr_mask = 0xff >> size_128k;
+ set_chr(m_chr_source, m_chr_base, m_chr_mask);
+}
+
+void nes_a88s1_device::prg_cb(int start, int bank)
+{
+ if (!BIT(m_reg[0], 6))
+ nes_txrom_device::prg_cb(start, bank);
+}
+
+void nes_a88s1_device::write_l(offs_t offset, u8 data)
+{
+ LOG_MMC(("a88s1 write_l, offset: %04x, data: %02x\n", offset, data));
+
+ offset += 0x100;
+ if (offset >= 0x1000)
+ {
+ m_reg[offset & 1] = data;
+ update_banks();
+ }
+}
+
+/*-------------------------------------------------
+
BMC-F-15
Unknown Multigame Bootleg Board
@@ -2350,6 +2401,37 @@ void nes_fcgj8in1_device::write_m(offs_t offset, u8 data)
/*-------------------------------------------------
+ BMC-GN-45
+
+ Games: 4 in 1 (K-3131GS and K-3131SS)
+
+ MMC3 clone with banking for multigame menu.
+
+ NES 2.0: mapper 366
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_bmc_gn45_device::write_m(offs_t offset, u8 data)
+{
+ LOG_MMC(("bmc_gn45 write_m, offset: %04x, data: %02x\n", offset, data));
+
+ nes_txrom_device::write_m(offset, data); // write to overlapping WRAM
+
+ if (!m_lock)
+ {
+ m_prg_base = offset & 0x70;
+ set_prg(m_prg_base, m_prg_mask);
+ m_chr_base = m_prg_base << 3;
+ set_chr(m_chr_source, m_chr_base, m_chr_mask);
+
+ m_lock = BIT(offset, 7);
+ }
+}
+
+/*-------------------------------------------------
+
BMC-GOLD-7IN1
Known Boards: Unknown Multigame Bootleg Board
@@ -2389,131 +2471,6 @@ void nes_bmc_gold7in1_device::write_m(offs_t offset, uint8_t data)
/*-------------------------------------------------
- BMC-GOLDENCARD-6IN1
-
- Known Boards: Unknown Bootleg Multigame Board
- Games: Golden Card 6 in 1
-
- MMC3 clone
-
- iNES: mapper 217
-
- In MESS: Supported.
-
- -------------------------------------------------*/
-
-void nes_bmc_gc6in1_device::prg_cb(int start, int bank)
-{
- if (m_reg[1] & 0x08)
- bank &= 0x1f;
- else
- {
- bank &= 0x0f;
- bank |= m_reg[1] & 0x10;
- }
-
- prg8_x(start, bank | ((m_reg[1] & 0x03) << 5));
-}
-
-void nes_bmc_gc6in1_device::chr_cb(int start, int bank, int source)
-{
- if (!(m_reg[1] & 0x08))
- bank = ((m_reg[1] & 0x10) << 3) | (bank & 0x7f);
-
-
- bank |= ((m_reg[1] << 6) & 0x100);
- chr1_x(start, ((m_reg[1] & 0x03) << 8) | bank, source);
-}
-
-void nes_bmc_gc6in1_device::write_l(offs_t offset, uint8_t data)
-{
- uint8_t bank;
- LOG_MMC(("bmc_gc6in1 write_l, offset: %04x, data: %02x\n", offset, data));
- offset += 0x100;
-
- if (offset == 0x1000)
- {
- m_reg[0] = data;
- if (data & 0x80)
- {
- bank = (data & 0x0f) | ((m_reg[1] & 0x03) << 4);
- prg16_89ab(bank);
- prg16_cdef(bank);
- }
- else
- set_prg(m_prg_base, m_prg_mask);
- }
- else if (offset == 0x1001)
- {
- m_reg[1] = data;
- set_prg(m_prg_base, m_prg_mask);
- }
- else if (offset == 0x1007)
- {
- m_reg[2] = data;
- }
-}
-
-void nes_bmc_gc6in1_device::write_h(offs_t offset, uint8_t data)
-{
- uint8_t cmd;
- static const uint8_t conv_table[8] = {0, 6, 3, 7, 5, 2, 4, 1};
- LOG_MMC(("bmc_gc6in1 write_h, offset: %04x, data: %02x\n", offset, data));
-
- if (!m_reg[2])
- {
- // in this case we act like MMC3, only with alt prg/chr handlers
- txrom_write(offset, data);
- }
- else
- {
- switch (offset & 0x6001)
- {
- case 0x0000:
- txrom_write(0x4000, data);
- break;
-
- case 0x0001:
- data = (data & 0xc0) | conv_table[data & 0x07];
- m_reg[3] = 1;
- txrom_write(0x0000, data);
- break;
-
- case 0x2000:
- cmd = m_latch & 0x07;
- if (m_reg[3])
- {
- m_reg[3] = 0;
- switch (cmd)
- {
- case 0: case 1: // these do not need to be separated: we take care of them in set_chr!
- case 2: case 3: case 4: case 5:
- m_mmc_vrom_bank[cmd] = data;
- set_chr(m_chr_source, m_chr_base, m_chr_mask);
- break;
- case 6:
- case 7:
- m_mmc_prg_bank[cmd - 6] = data;
- set_prg(m_prg_base, m_prg_mask);
- break;
- }
- }
- break;
-
-
- case 0x2001:
- set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
- break;
-
- default:
- txrom_write(offset, data);
- break;
- }
- }
-}
-
-/*-------------------------------------------------
-
BMC-K-3006
Games: 21 in 1
@@ -2637,6 +2594,35 @@ void nes_bmc_830118c_device::write_m(offs_t offset, uint8_t data)
/*-------------------------------------------------
+ BMC-830832C
+
+ Games: 1994 Super HiK 3 in 1 (JY-007)
+
+ MMC3 clone with banking for multigame menu.
+
+ NES 2.0: mapper 364
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_bmc_830832c_device::write_m(offs_t offset, u8 data)
+{
+ LOG_MMC(("bmc_830832c write_m, offset: %04x, data: %02x\n", offset, data));
+ if (offset & 0x1000) // game only writes 0x7000, this mask is a guess
+ {
+ m_prg_base = (data & 0x40) >> 1;
+ m_prg_mask = 0x1f >> BIT(data, 5);
+ set_prg(m_prg_base, m_prg_mask);
+
+ m_chr_base = (data & 0x10) << 4;
+ m_chr_mask = 0xff >> BIT(data, 5);
+ set_chr(m_chr_source, m_chr_base, m_chr_mask);
+ }
+}
+
+/*-------------------------------------------------
+
BMC-841101C
Games: 4 in 1 (OK-411, JY-009, JY-018, JY-019, JY-020)
diff --git a/src/devices/bus/nes/mmc3_clones.h b/src/devices/bus/nes/mmc3_clones.h
index c44b529dc88..c01770cfd80 100644
--- a/src/devices/bus/nes/mmc3_clones.h
+++ b/src/devices/bus/nes/mmc3_clones.h
@@ -106,92 +106,89 @@ class nes_8237_device : public nes_txrom_device
{
public:
// construction/destruction
- nes_8237_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_8237_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- // device-level overrides
- virtual void device_start() override;
- virtual void write_l(offs_t offset, uint8_t data) override;
- virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual void write_l(offs_t offset, u8 data) override;
+ virtual void write_h(offs_t offset, u8 data) override;
virtual void prg_cb(int start, int bank) override;
- virtual void chr_cb(int start, int bank, int source) override;
virtual void pcb_reset() override;
+protected:
+ // construction/destruction
+ nes_8237_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+
private:
- uint8_t m_reg[3];
- int m_cd_enable;
+ void update_banks();
+ u8 m_reg[3];
+ int m_board;
};
-// ======================> nes_sglionk_device
+// ======================> nes_8237a_device
-class nes_sglionk_device : public nes_txrom_device
+class nes_8237a_device : public nes_8237_device
{
public:
// construction/destruction
- nes_sglionk_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- virtual void write_m(offs_t offset, uint8_t data) override;
- virtual void write_h(offs_t offset, uint8_t data) override;
-
- virtual void pcb_reset() override;
-
-protected:
- // device-level overrides
- virtual void device_start() override;
-
-private:
- uint8_t m_reg;
- int m_reg_enabled;
+ nes_8237a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
-// ======================> nes_sgboog_device
+// ======================> nes_kasing_device
-class nes_sgboog_device : public nes_txrom_device
+class nes_kasing_device : public nes_txrom_device
{
public:
// construction/destruction
- nes_sgboog_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_kasing_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual void write_l(offs_t offset, uint8_t data) override;
- virtual void write_m(offs_t offset, uint8_t data) override;
- virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual void write_m(offs_t offset, u8 data) override;
virtual void prg_cb(int start, int bank) override;
- virtual void chr_cb(int start, int bank, int source) override;
virtual void pcb_reset() override;
protected:
+ // construction/destruction
+ nes_kasing_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
// device-level overrides
virtual void device_start() override;
private:
- virtual void set_prg(int prg_base, int prg_mask) override;
- uint8_t m_reg[3];
- uint8_t m_mode;
+ bool m_mmc3_mode;
};
-// ======================> nes_kasing_device
+// ======================> nes_sglionk_device
-class nes_kasing_device : public nes_txrom_device
+class nes_sglionk_device : public nes_kasing_device
{
public:
// construction/destruction
- nes_kasing_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_sglionk_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual void write_m(offs_t offset, uint8_t data) override;
- virtual void prg_cb(int start, int bank) override;
-
- virtual void pcb_reset() override;
+ virtual void write_h(offs_t offset, u8 data) override;
protected:
- // device-level overrides
- virtual void device_start() override;
+ // construction/destruction
+ nes_sglionk_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
private:
- uint8_t m_reg;
+ int m_board;
+};
+
+
+// ======================> nes_sgboog_device
+
+class nes_sgboog_device : public nes_sglionk_device
+{
+public:
+ // construction/destruction
+ nes_sgboog_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
@@ -433,6 +430,29 @@ private:
#endif
+// ======================> nes_a88s1_device
+
+class nes_a88s1_device : public nes_txrom_device
+{
+public:
+ // construction/destruction
+ nes_a88s1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_l(offs_t offset, u8 data) override;
+ virtual void prg_cb(int start, int bank) override;
+
+ virtual void pcb_reset() override;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+private:
+ void update_banks();
+ u8 m_reg[2];
+};
+
+
// ======================> nes_fcgj8in1_device
class nes_fcgj8in1_device : public nes_txrom_device
@@ -487,6 +507,63 @@ public:
};
+// ======================> nes_nt639_device
+
+class nes_nt639_device : public nes_txrom_device
+{
+public:
+ // construction/destruction
+ nes_nt639_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_m(offs_t offset, u8 data) override;
+
+ virtual void pcb_reset() override;
+};
+
+
+// ======================> nes_resettxrom0_device
+
+class nes_resettxrom0_device : public nes_txrom_device
+{
+public:
+ // construction/destruction
+ nes_resettxrom0_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void pcb_reset() override;
+
+protected:
+ // construction/destruction
+ nes_resettxrom0_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int prg_shift, int chr_shift);
+
+ // device-level overrides
+ virtual void device_start() override;
+
+private:
+ int m_count;
+ int m_prg_shift, m_chr_shift;
+};
+
+
+// ======================> nes_resettxrom1_device
+
+class nes_resettxrom1_device : public nes_resettxrom0_device
+{
+public:
+ // construction/destruction
+ nes_resettxrom1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+
+// ======================> nes_resettxrom2_device
+
+class nes_resettxrom2_device : public nes_resettxrom0_device
+{
+public:
+ // construction/destruction
+ nes_resettxrom2_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+
// ======================> nes_s24in1sc03_device
class nes_s24in1sc03_device : public nes_txrom_device
@@ -510,6 +587,28 @@ private:
};
+// ======================> nes_tech9in1_device
+
+class nes_tech9in1_device : public nes_txrom_device
+{
+public:
+ // construction/destruction
+ nes_tech9in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_l(offs_t offset, u8 data) override;
+
+ virtual void pcb_reset() override;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+private:
+ void update_banks();
+ u8 m_reg[3];
+};
+
+
// ======================> nes_bmc_8in1_device
class nes_bmc_8in1_device : public nes_txrom_device
@@ -627,15 +726,15 @@ public:
};
-// ======================> nes_bmc_gold7in1_device
+// ======================> nes_bmc_gn45_device
-class nes_bmc_gold7in1_device : public nes_txrom_device
+class nes_bmc_gn45_device : public nes_txrom_device
{
public:
// construction/destruction
- nes_bmc_gold7in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_bmc_gn45_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_m(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
@@ -644,22 +743,19 @@ protected:
virtual void device_start() override;
private:
- uint8_t m_reg_written;
+ bool m_lock;
};
-// ======================> nes_bmc_gc6in1_device
+// ======================> nes_bmc_gold7in1_device
-class nes_bmc_gc6in1_device : public nes_txrom_device
+class nes_bmc_gold7in1_device : public nes_txrom_device
{
public:
// construction/destruction
- nes_bmc_gc6in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_bmc_gold7in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual void write_l(offs_t offset, uint8_t data) override;
- virtual void write_h(offs_t offset, uint8_t data) override;
- virtual void prg_cb(int start, int bank) override;
- virtual void chr_cb(int start, int bank, int source) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -668,7 +764,7 @@ protected:
virtual void device_start() override;
private:
- uint8_t m_reg[4];
+ uint8_t m_reg_written;
};
@@ -731,6 +827,20 @@ private:
};
+// ======================> nes_bmc_830832c_device
+
+class nes_bmc_830832c_device : public nes_txrom_device
+{
+public:
+ // construction/destruction
+ nes_bmc_830832c_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_m(offs_t offset, u8 data) override;
+
+ virtual void pcb_reset() override;
+};
+
+
// ======================> nes_bmc_841101c_device
class nes_bmc_841101c_device : public nes_txrom_device
@@ -794,6 +904,7 @@ DECLARE_DEVICE_TYPE(NES_MALISB, nes_malisb_device)
DECLARE_DEVICE_TYPE(NES_FAMILY4646, nes_family4646_device)
DECLARE_DEVICE_TYPE(NES_PIKAY2K, nes_pikay2k_device)
DECLARE_DEVICE_TYPE(NES_8237, nes_8237_device)
+DECLARE_DEVICE_TYPE(NES_8237A, nes_8237a_device)
DECLARE_DEVICE_TYPE(NES_SG_LIONK, nes_sglionk_device)
DECLARE_DEVICE_TYPE(NES_SG_BOOG, nes_sgboog_device)
DECLARE_DEVICE_TYPE(NES_KASING, nes_kasing_device)
@@ -811,10 +922,16 @@ DECLARE_DEVICE_TYPE(NES_SACHEN_SHERO, nes_sachen_shero_device)
DECLARE_DEVICE_TYPE(NES_A9746, nes_a9746_device)
#endif
+DECLARE_DEVICE_TYPE(NES_A88S1, nes_a88s1_device)
DECLARE_DEVICE_TYPE(NES_FCGJ8IN1, nes_fcgj8in1_device)
DECLARE_DEVICE_TYPE(NES_FK23C, nes_fk23c_device)
DECLARE_DEVICE_TYPE(NES_FK23CA, nes_fk23ca_device)
+DECLARE_DEVICE_TYPE(NES_NT639, nes_nt639_device)
+DECLARE_DEVICE_TYPE(NES_RESETTXROM0, nes_resettxrom0_device)
+DECLARE_DEVICE_TYPE(NES_RESETTXROM1, nes_resettxrom1_device)
+DECLARE_DEVICE_TYPE(NES_RESETTXROM2, nes_resettxrom2_device)
DECLARE_DEVICE_TYPE(NES_S24IN1SC03, nes_s24in1sc03_device)
+DECLARE_DEVICE_TYPE(NES_TECHLINE9IN1, nes_tech9in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_8IN1, nes_bmc_8in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_15IN1, nes_bmc_15in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_SBIG7, nes_bmc_sbig7_device)
@@ -822,11 +939,12 @@ DECLARE_DEVICE_TYPE(NES_BMC_HIK8, nes_bmc_hik8_device)
DECLARE_DEVICE_TYPE(NES_BMC_HIK4, nes_bmc_hik4_device)
DECLARE_DEVICE_TYPE(NES_BMC_MARIO7IN1, nes_bmc_mario7in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_F15, nes_bmc_f15_device)
+DECLARE_DEVICE_TYPE(NES_BMC_GN45, nes_bmc_gn45_device)
DECLARE_DEVICE_TYPE(NES_BMC_GOLD7IN1, nes_bmc_gold7in1_device)
-DECLARE_DEVICE_TYPE(NES_BMC_GC6IN1, nes_bmc_gc6in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_K3006, nes_bmc_k3006_device)
DECLARE_DEVICE_TYPE(NES_BMC_411120C, nes_bmc_411120c_device)
DECLARE_DEVICE_TYPE(NES_BMC_830118C, nes_bmc_830118c_device)
+DECLARE_DEVICE_TYPE(NES_BMC_830832C, nes_bmc_830832c_device)
DECLARE_DEVICE_TYPE(NES_BMC_841101C, nes_bmc_841101c_device)
DECLARE_DEVICE_TYPE(NES_PJOY84, nes_pjoy84_device)
DECLARE_DEVICE_TYPE(NES_COOLBOY, nes_coolboy_device)
diff --git a/src/devices/bus/nes/multigame.cpp b/src/devices/bus/nes/multigame.cpp
index 8ce1f8dfd58..decded4f6c7 100644
--- a/src/devices/bus/nes/multigame.cpp
+++ b/src/devices/bus/nes/multigame.cpp
@@ -46,12 +46,14 @@ DEFINE_DEVICE_TYPE(NES_BMC_60311C, nes_bmc_60311c_device, "nes_bmc_60311
DEFINE_DEVICE_TYPE(NES_BMC_80013B, nes_bmc_80013b_device, "nes_bmc_80013b", "NES Cart BMC 80013-B PCB")
DEFINE_DEVICE_TYPE(NES_BMC_810544C, nes_bmc_810544c_device, "nes_bmc_810544c", "NES Cart BMC 810544-C-A1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_830425C, nes_bmc_830425c_device, "nes_bmc_830425c", "NES Cart BMC 830425C-4391T PCB")
+DEFINE_DEVICE_TYPE(NES_BMC_850437C, nes_bmc_850437c_device, "nes_bmc_850437c", "NES Cart BMC 850437C PCB")
DEFINE_DEVICE_TYPE(NES_NTD03, nes_ntd03_device, "nes_ntd03", "NES Cart NTD-03 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_CTC09, nes_bmc_ctc09_device, "nes_bmc_ctc09", "NES Cart BMC CTC-09 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_GB63, nes_bmc_gb63_device, "nes_bmc_gb63", "NES Cart BMC Ghostbusters 63 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_GKA, nes_bmc_gka_device, "nes_bmc_gka", "NES Cart BMC GK-A PCB")
DEFINE_DEVICE_TYPE(NES_BMC_GKB, nes_bmc_gkb_device, "nes_bmc_gkb", "NES Cart BMC GK-B PCB")
DEFINE_DEVICE_TYPE(NES_BMC_GKCXIN1, nes_bmc_gkcxin1_device, "nes_bmc_gkcxin1", "NES Cart BMC GKCXIN1 PCB")
+DEFINE_DEVICE_TYPE(NES_BMC_K1029, nes_bmc_k1029_device, "nes_bmc_k1029", "NES Cart BMC K-1029 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_K3036, nes_bmc_k3036_device, "nes_bmc_k3036", "NES Cart BMC K-3036 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_K3046, nes_bmc_k3046_device, "nes_bmc_k3046", "NES Cart BMC K-3046 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_SA005A, nes_bmc_sa005a_device, "nes_bmc_sa005a", "NES Cart BMC SA005-A PCB")
@@ -76,7 +78,6 @@ DEFINE_DEVICE_TYPE(NES_BMC_64IN1, nes_bmc_64in1_device, "nes_bmc_64in1
DEFINE_DEVICE_TYPE(NES_BMC_70IN1, nes_bmc_70in1_device, "nes_bmc_70in1", "NES Cart BMC 70 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_72IN1, nes_bmc_72in1_device, "nes_bmc_72in1", "NES Cart BMC 72 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_76IN1, nes_bmc_76in1_device, "nes_bmc_76in1", "NES Cart BMC 76 in 1 PCB")
-DEFINE_DEVICE_TYPE(NES_BMC_110IN1, nes_bmc_110in1_device, "nes_bmc_110in1", "NES Cart BMC 110 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_150IN1, nes_bmc_150in1_device, "nes_bmc_150in1", "NES Cart BMC 150 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_190IN1, nes_bmc_190in1_device, "nes_bmc_190in1", "NES Cart BMC 190 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_500IN1, nes_bmc_500in1_device, "nes_bmc_500in1", "NES Cart BMC 500 in 1 PCB")
@@ -144,11 +145,6 @@ nes_kn42_device::nes_kn42_device(const machine_config &mconfig, const char *tag,
{
}
-nes_n625092_device::nes_n625092_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_nrom_device(mconfig, NES_N625092, tag, owner, clock), m_latch1(0), m_latch2(0)
-{
-}
-
nes_a65as_device::nes_a65as_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: nes_nrom_device(mconfig, NES_A65AS, tag, owner, clock)
{
@@ -209,6 +205,11 @@ nes_bmc_830425c_device::nes_bmc_830425c_device(const machine_config &mconfig, co
{
}
+nes_bmc_850437c_device::nes_bmc_850437c_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, NES_BMC_850437C, tag, owner, clock)
+{
+}
+
nes_ntd03_device::nes_ntd03_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: nes_nrom_device(mconfig, NES_NTD03, tag, owner, clock)
{
@@ -301,8 +302,8 @@ nes_bmc_ball11_device::nes_bmc_ball11_device(const machine_config &mconfig, cons
{
}
-nes_bmc_22games_device::nes_bmc_22games_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_nrom_device(mconfig, NES_BMC_22GAMES, tag, owner, clock)
+nes_bmc_22games_device::nes_bmc_22games_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, NES_BMC_22GAMES, tag, owner, clock), m_latch(0), m_reset(0)
{
}
@@ -351,7 +352,7 @@ nes_bmc_70in1_device::nes_bmc_70in1_device(const machine_config &mconfig, const
{
}
-nes_bmc_72in1_device::nes_bmc_72in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+nes_bmc_72in1_device::nes_bmc_72in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_nrom_device(mconfig, NES_BMC_72IN1, tag, owner, clock)
{
}
@@ -361,11 +362,6 @@ nes_bmc_76in1_device::nes_bmc_76in1_device(const machine_config &mconfig, const
{
}
-nes_bmc_110in1_device::nes_bmc_110in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_nrom_device(mconfig, NES_BMC_110IN1, tag, owner, clock)
-{
-}
-
nes_bmc_150in1_device::nes_bmc_150in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: nes_nrom_device(mconfig, NES_BMC_150IN1, tag, owner, clock)
{
@@ -417,7 +413,7 @@ nes_bmc_lc160_device::nes_bmc_lc160_device(const machine_config &mconfig, const
}
nes_vram_protect_device::nes_vram_protect_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
- : nes_nrom_device(mconfig, type, tag, owner, clock), m_vram_protect(false)
+ : nes_nrom_device(mconfig, type, tag, owner, clock), m_vram_protect(false)
{
}
@@ -426,6 +422,16 @@ nes_bmc_60311c_device::nes_bmc_60311c_device(const machine_config &mconfig, cons
{
}
+nes_bmc_k1029_device::nes_bmc_k1029_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_vram_protect_device(mconfig, NES_BMC_K1029, tag, owner, clock)
+{
+}
+
+nes_n625092_device::nes_n625092_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_vram_protect_device(mconfig, NES_N625092, tag, owner, clock)
+{
+}
+
nes_bmc_th22913_device::nes_bmc_th22913_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_vram_protect_device(mconfig, NES_BMC_TH22913, tag, owner, clock)
{
@@ -524,24 +530,6 @@ void nes_kn42_device::pcb_reset()
chr8(0, CHRRAM);
}
-void nes_n625092_device::device_start()
-{
- common_start();
- save_item(NAME(m_latch1));
- save_item(NAME(m_latch2));
-}
-
-void nes_n625092_device::pcb_reset()
-{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- prg16_89ab(0);
- prg16_cdef(0);
- chr8(0, m_chr_source);
-
- m_latch1 = 0;
- m_latch2 = 0;
-}
-
void nes_a65as_device::device_start()
{
common_start();
@@ -680,6 +668,21 @@ void nes_bmc_830425c_device::pcb_reset()
m_latch = 0;
}
+void nes_bmc_850437c_device::device_start()
+{
+ common_start();
+ save_item(NAME(m_reg));
+}
+
+void nes_bmc_850437c_device::pcb_reset()
+{
+ prg16_89ab(0);
+ prg16_cdef(7);
+ chr8(0, CHRRAM);
+
+ m_reg[0] = m_reg[1] = 0;
+}
+
void nes_ntd03_device::device_start()
{
common_start();
@@ -851,14 +854,25 @@ void nes_bmc_ball11_device::pcb_reset()
void nes_bmc_22games_device::device_start()
{
common_start();
+ save_item(NAME(m_latch));
+ save_item(NAME(m_reset));
}
void nes_bmc_22games_device::pcb_reset()
{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- prg16_89ab(0);
- prg16_cdef(7);
- chr8(0, m_chr_source);
+ if (m_reset)
+ {
+ prg32(4);
+ m_latch = 1;
+ }
+ else
+ {
+ prg16_89ab(0);
+ prg16_cdef(7);
+ set_nt_mirroring(PPU_MIRROR_VERT);
+ m_reset = 1;
+ }
+ chr8(0, CHRRAM);
}
void nes_bmc_64y2k_device::device_start()
@@ -981,13 +995,7 @@ void nes_bmc_70in1_device::pcb_reset()
void nes_bmc_72in1_device::device_start()
{
common_start();
-}
-
-void nes_bmc_72in1_device::pcb_reset()
-{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- prg32(0);
- chr8(0, m_chr_source);
+ save_item(NAME(m_extra_ram));
}
void nes_bmc_76in1_device::device_start()
@@ -1004,20 +1012,6 @@ void nes_bmc_76in1_device::pcb_reset()
m_reg[0] = m_reg[1] = 0;
}
-void nes_bmc_110in1_device::device_start()
-{
- common_start();
-}
-
-void nes_bmc_110in1_device::pcb_reset()
-{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- prg16_89ab(0);
- prg16_cdef(1);
- chr8(0, m_chr_source);
- set_nt_mirroring(PPU_MIRROR_VERT);
-}
-
void nes_bmc_150in1_device::device_start()
{
common_start();
@@ -1149,6 +1143,7 @@ void nes_vram_protect_device::device_start()
void nes_vram_protect_device::pcb_reset()
{
+ prg32(0);
chr8(0, CHRRAM);
m_vram_protect = false;
}
@@ -1167,6 +1162,21 @@ void nes_bmc_60311c_device::pcb_reset()
update_banks();
}
+void nes_n625092_device::device_start()
+{
+ nes_vram_protect_device::device_start();
+ save_item(NAME(m_latch));
+}
+
+void nes_n625092_device::pcb_reset()
+{
+ nes_vram_protect_device::pcb_reset();
+ prg16_89ab(0);
+ prg16_cdef(0);
+
+ m_latch[0] = m_latch[1] = 0;
+}
+
void nes_bmc_th22913_device::pcb_reset()
{
nes_vram_protect_device::pcb_reset();
@@ -1405,56 +1415,6 @@ void nes_kn42_device::write_h(offs_t offset, u8 data)
/*-------------------------------------------------
- Bootleg Board N625092
-
- Games: 400 in 1, 700 in 1, 1000 in 1
-
- iNES: mapper 221
-
- In MESS: Supported.
-
- -------------------------------------------------*/
-
-void nes_n625092_device::set_prg(uint8_t reg1, uint8_t reg2)
-{
- uint8_t helper1, helper2;
-
- helper1 = !(reg1 & 0x01) ? reg2 : (reg1 & 0x80) ? reg2 : (reg2 & 0x06) | 0x00;
- helper2 = !(reg1 & 0x01) ? reg2 : (reg1 & 0x80) ? 0x07 : (reg2 & 0x06) | 0x01;
-
- prg16_89ab(helper1 | ((reg1 & 0x70) >> 1));
- prg16_cdef(helper2 | ((reg1 & 0x70) >> 1));
-}
-
-void nes_n625092_device::write_h(offs_t offset, uint8_t data)
-{
- LOG_MMC(("n625092 write_h, offset: %04x, data: %02x\n", offset, data));
-
- if (offset < 0x4000)
- {
- set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
- offset = (offset >> 1) & 0xff;
-
- if (m_latch1 != offset)
- {
- m_latch1 = offset;
- set_prg(m_latch1, m_latch2);
- }
- }
- else
- {
- offset &= 0x07;
-
- if (m_latch2 != offset)
- {
- m_latch2 = offset;
- set_prg(m_latch1, m_latch2);
- }
- }
-}
-
-/*-------------------------------------------------
-
Board BMC-A65AS
Games: 3-in-1 (N068)
@@ -1707,7 +1667,7 @@ void nes_bmc_810544c_device::write_h(offs_t offset, u8 data)
/*-------------------------------------------------
- BMC-820425C-4391T
+ BMC-830425C-4391T
Games: Super HiK 6-in-1 (A-030)
@@ -1732,6 +1692,31 @@ void nes_bmc_830425c_device::write_h(offs_t offset, u8 data)
/*-------------------------------------------------
+ BMC-850437C
+
+ Games: Super 8-in-1 (JY-050 rev0, JY-085, JY-086)
+
+ NES 2.0: mapper 396
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_bmc_850437c_device::write_h(offs_t offset, u8 data)
+{
+ LOG_MMC(("bmc_850437c write_h, offset: %04x, data: %02x\n", offset, data));
+
+ m_reg[(offset & 0x6000) == 0x2000] = data; // outer banking is always at 0xa000, mask is a guess
+
+ u8 bank = (m_reg[1] & 0x07) << 3 | (m_reg[0] & 0x07);
+ prg16_89ab(bank);
+ prg16_cdef(bank | 0x07);
+
+ set_nt_mirroring(BIT(m_reg[1], 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
+}
+
+/*-------------------------------------------------
+
BMC-NTD-03
-------------------------------------------------*/
@@ -2278,37 +2263,33 @@ void nes_bmc_ball11_device::write_h(offs_t offset, u8 data)
BMC-22GAMES
Unknown Bootleg Multigame Board
- Games: 22 in 1
+ Games: Contra/22 in 1 combo
iNES: mapper 230
- In MESS: Partially Supported. It would need a reset
- to work (not possible yet)
+ In MAME: Supported.
+
+ TODO: Determine whether reset works as written or
+ whether it toggles between Contra and the game menu.
+ Reset to Contra from the menu or other games often
+ fails due to RAM contents it seems.
-------------------------------------------------*/
-void nes_bmc_22games_device::write_h(offs_t offset, uint8_t data)
+void nes_bmc_22games_device::write_h(offs_t offset, u8 data)
{
LOG_MMC(("bmc_22games write_h, offset: %04x, data: %02x\n", offset, data));
- if (1) // this should flip at reset
- {
- prg16_89ab(data & 0x07);
- }
- else
+ if (m_latch)
{
- if (data & 0x20)
- {
- prg16_89ab((data & 0x1f) + 8);
- prg16_cdef((data & 0x1f) + 8);
- }
- else
- {
- prg16_89ab((data & 0x1f) + 8);
- prg16_cdef((data & 0x1f) + 9);
- }
+ u8 bank = (data & 0x1f) + 8;
+ u8 mode = !BIT(data, 5);
+ prg16_89ab(bank & ~mode);
+ prg16_cdef(bank | mode);
set_nt_mirroring(BIT(data, 6) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
}
+ else
+ prg16_89ab(data & 0x07);
}
/*-------------------------------------------------
@@ -2609,38 +2590,49 @@ uint8_t nes_bmc_70in1_device::read_h(offs_t offset)
/*-------------------------------------------------
- BMC-72IN1
+ BMC-72IN1, BMC-110IN1
Unknown Bootleg Multigame Board
Games: 72 in 1, 115 in 1 and other multigame carts
- iNES: mapper 225
+ iNES: mappers 225, 255
- In MESS: Supported.
+ In MAME: Supported.
-------------------------------------------------*/
-void nes_bmc_72in1_device::write_h(offs_t offset, uint8_t data)
+u8 nes_bmc_72in1_device::read_l(offs_t offset)
{
- int hi_bank = offset & 0x40;
- int size_16 = offset & 0x1000;
- int bank = (offset & 0xf80) >> 7;
+ LOG_MMC(("bmc_72in1 read_l, offset: %04x\n", offset));
+
+ offset += 0x100;
+ if (offset >= 0x1800) // 4 nibbles of RAM mirrored above 0x5800
+ return m_extra_ram[offset & 0x03];
+
+ return get_open_bus();
+}
+void nes_bmc_72in1_device::write_l(offs_t offset, u8 data)
+{
+ LOG_MMC(("bmc_72in1 write_l, offset: %04x, data: %02x\n", offset, data));
+
+ offset += 0x100;
+ if (offset >= 0x1800) // 4 nibbles of RAM mirrored above 0x5800
+ m_extra_ram[offset & 0x03] = data & 0x0f;
+}
+
+void nes_bmc_72in1_device::write_h(offs_t offset, u8 data)
+{
LOG_MMC(("bmc_72in1 write_h, offset: %04x, data: %02x\n", offset, data));
- chr8(offset, CHRROM);
- set_nt_mirroring((offset & 0x2000) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
- if (size_16)
- {
- bank <<= 1;
- if (hi_bank)
- bank ++;
+ u8 high = (offset >> 8) & 0x40;
+ u8 bank = high | ((offset >> 6) & 0x3f);
+ u8 mode = !BIT(offset, 12);
+ prg16_89ab(bank & ~mode);
+ prg16_cdef(bank | mode);
- prg16_89ab(bank);
- prg16_cdef(bank);
- }
- else
- prg32(bank);
+ chr8(high | (offset & 0x3f), CHRROM);
+ set_nt_mirroring(BIT(offset, 13) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
}
/*-------------------------------------------------
@@ -2671,33 +2663,6 @@ void nes_bmc_76in1_device::write_h(offs_t offset, u8 data)
/*-------------------------------------------------
- BMC-110IN1
-
- Known Boards: Unknown Bootleg Board
- Games: 110 in 1
-
- iNES: mapper 255
-
- In MESS: Preliminary support.
-
- -------------------------------------------------*/
-
-void nes_bmc_110in1_device::write_h(offs_t offset, uint8_t data)
-{
- uint8_t helper1 = (offset >> 12) ? 0 : 1;
- uint8_t helper2 = ((offset >> 8) & 0x40) | ((offset >> 6) & 0x3f);
-
- LOG_MMC(("bmc_110in1 write_h, offset: %04x, data: %02x\n", offset, data));
-
- set_nt_mirroring((offset & 0x2000) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
- prg16_89ab(helper1 & ~helper2);
- prg16_cdef(helper1 | helper2);
- chr8(((offset >> 8) & 0x40) | (offset & 0x3f), CHRROM);
-}
-
-
-/*-------------------------------------------------
-
BMC-150IN1
Unknown Bootleg Multigame Board
@@ -3074,8 +3039,8 @@ void nes_bmc_60311c_device::update_banks()
prg16_cdef(m_reg[1] | BIT(m_reg[0], 0));
}
- m_vram_protect = BIT(m_reg[0], 2);
set_nt_mirroring(BIT(m_reg[0], 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
+ m_vram_protect = BIT(m_reg[0], 2);
}
void nes_bmc_60311c_device::write_m(offs_t offset, u8 data)
@@ -3094,6 +3059,89 @@ void nes_bmc_60311c_device::write_h(offs_t offset, u8 data)
/*-------------------------------------------------
+ BMC-K-1029
+
+ Games: 100 in 1 Contra Function 16, 168 in 1
+
+ iNES: mapper 15
+
+ In MAME: Supported.
+
+ TODO: Contra games in 100-in-1 endlessly loop the
+ second level played regardless of starting level.
+ BTANB? Bad dump? FCEUX exhibits the same behavior.
+
+ -------------------------------------------------*/
+
+void nes_bmc_k1029_device::write_h(offs_t offset, u8 data)
+{
+ LOG_MMC(("bmc_k1029 write_h, offset: %04x, data: %02x\n", offset, data));
+
+ u8 bank = data & 0x3f;
+ switch (offset & 3)
+ {
+ case 0:
+ prg32(bank >> 1);
+ break;
+ case 1:
+ prg16_89ab(bank);
+ prg16_cdef(bank | 0x07);
+ break;
+ case 2:
+ bank = bank << 1 | BIT(data, 7);
+ prg8_89(bank);
+ prg8_ab(bank);
+ prg8_cd(bank);
+ prg8_ef(bank);
+ break;
+ case 3:
+ prg16_89ab(bank);
+ prg16_cdef(bank);
+ break;
+ }
+
+ set_nt_mirroring(BIT(data, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
+ m_vram_protect = BIT(offset, 0) == BIT(offset, 1);
+}
+
+/*-------------------------------------------------
+
+ Bootleg Board N625092
+
+ Games: 320 in 1, 400 in 1, 700 in 1, 800 in 1,
+ 1000 in 1, 2000 in 1, 5000000 in 1
+
+ iNES: mapper 221
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_n625092_device::write_h(offs_t offset, u8 data)
+{
+ LOG_MMC(("n625092 write_h, offset: %04x, data: %02x\n", offset, data));
+
+ m_latch[BIT(offset, 14)] = offset;
+
+ u8 bank = (m_latch[0] & 0x200) >> 3 | (m_latch[0] & 0xe0) >> 2 | (m_latch[1] & 0x07); // NesDev shows the high bit here, but is it correct? So far no cart is large enough to use this.
+ u8 mode = BIT(m_latch[0], 1);
+ if (mode && BIT(m_latch[0], 8)) // UNROM mode
+ {
+ prg16_89ab(bank);
+ prg16_cdef(bank | 7);
+ }
+ else // NROM mode
+ {
+ prg16_89ab(bank & ~mode);
+ prg16_cdef(bank | mode);
+ }
+
+ set_nt_mirroring(BIT(m_latch[0], 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
+ m_vram_protect = BIT(m_latch[1], 3);
+}
+
+/*-------------------------------------------------
+
BMC-TH2291-3, BMC-CH-011
Games: Powerful 250 in 1, Powerful 255 in 1
diff --git a/src/devices/bus/nes/multigame.h b/src/devices/bus/nes/multigame.h
index 134bbc9a962..83ff5fbf5ef 100644
--- a/src/devices/bus/nes/multigame.h
+++ b/src/devices/bus/nes/multigame.h
@@ -137,28 +137,6 @@ private:
};
-// ======================> nes_n625092_device
-
-class nes_n625092_device : public nes_nrom_device
-{
-public:
- // construction/destruction
- nes_n625092_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- virtual void write_h(offs_t offset, uint8_t data) override;
-
- virtual void pcb_reset() override;
-
-protected:
- // device-level overrides
- virtual void device_start() override;
-
-private:
- void set_prg(uint8_t reg1, uint8_t reg2);
- uint8_t m_latch1, m_latch2;
-};
-
-
// ======================> nes_a65as_device
class nes_a65as_device : public nes_nrom_device
@@ -364,6 +342,27 @@ private:
};
+// ======================> nes_bmc_850437c_device
+
+class nes_bmc_850437c_device : public nes_nrom_device
+{
+public:
+ // construction/destruction
+ nes_bmc_850437c_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_h(offs_t offset, u8 data) override;
+
+ virtual void pcb_reset() override;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+private:
+ u8 m_reg[2];
+};
+
+
// ======================> nes_ntd03_device
class nes_ntd03_device : public nes_nrom_device
@@ -675,15 +674,18 @@ class nes_bmc_22games_device : public nes_nrom_device
{
public:
// construction/destruction
- nes_bmc_22games_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_bmc_22games_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
protected:
// device-level overrides
virtual void device_start() override;
+
+private:
+ int m_latch, m_reset;
};
@@ -863,15 +865,20 @@ class nes_bmc_72in1_device : public nes_nrom_device
{
public:
// construction/destruction
- nes_bmc_72in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_bmc_72in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual u8 read_l(offs_t offset) override;
+ virtual void write_l(offs_t offset, u8 data) override;
+ virtual void write_h(offs_t offset, u8 data) override;
- virtual void pcb_reset() override;
+// virtual void pcb_reset() override;
protected:
// device-level overrides
virtual void device_start() override;
+
+private:
+ u8 m_extra_ram[4];
};
@@ -896,24 +903,6 @@ private:
};
-// ======================> nes_bmc_110in1_device
-
-class nes_bmc_110in1_device : public nes_nrom_device
-{
-public:
- // construction/destruction
- nes_bmc_110in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- virtual void write_h(offs_t offset, uint8_t data) override;
-
- virtual void pcb_reset() override;
-
-protected:
- // device-level overrides
- virtual void device_start() override;
-};
-
-
// ======================> nes_bmc_150in1_device
class nes_bmc_150in1_device : public nes_nrom_device
@@ -1143,6 +1132,39 @@ private:
};
+// ======================> nes_bmc_k1029_device
+
+class nes_bmc_k1029_device : public nes_vram_protect_device
+{
+public:
+ // construction/destruction
+ nes_bmc_k1029_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_h(offs_t offset, u8 data) override;
+};
+
+
+// ======================> nes_n625092_device
+
+class nes_n625092_device : public nes_vram_protect_device
+{
+public:
+ // construction/destruction
+ nes_n625092_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_h(offs_t offset, u8 data) override;
+
+ virtual void pcb_reset() override;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+private:
+ u16 m_latch[2];
+};
+
+
// ======================> nes_bmc_th22913_device
class nes_bmc_th22913_device : public nes_vram_protect_device
@@ -1176,12 +1198,14 @@ DECLARE_DEVICE_TYPE(NES_BMC_60311C, nes_bmc_60311c_device)
DECLARE_DEVICE_TYPE(NES_BMC_80013B, nes_bmc_80013b_device)
DECLARE_DEVICE_TYPE(NES_BMC_810544C, nes_bmc_810544c_device)
DECLARE_DEVICE_TYPE(NES_BMC_830425C, nes_bmc_830425c_device)
+DECLARE_DEVICE_TYPE(NES_BMC_850437C, nes_bmc_850437c_device)
DECLARE_DEVICE_TYPE(NES_NTD03, nes_ntd03_device)
DECLARE_DEVICE_TYPE(NES_BMC_CTC09, nes_bmc_ctc09_device)
DECLARE_DEVICE_TYPE(NES_BMC_GB63, nes_bmc_gb63_device)
DECLARE_DEVICE_TYPE(NES_BMC_GKA, nes_bmc_gka_device)
DECLARE_DEVICE_TYPE(NES_BMC_GKB, nes_bmc_gkb_device)
DECLARE_DEVICE_TYPE(NES_BMC_GKCXIN1, nes_bmc_gkcxin1_device)
+DECLARE_DEVICE_TYPE(NES_BMC_K1029, nes_bmc_k1029_device)
DECLARE_DEVICE_TYPE(NES_BMC_K3036, nes_bmc_k3036_device)
DECLARE_DEVICE_TYPE(NES_BMC_K3046, nes_bmc_k3046_device)
DECLARE_DEVICE_TYPE(NES_BMC_SA005A, nes_bmc_sa005a_device)
@@ -1206,7 +1230,6 @@ DECLARE_DEVICE_TYPE(NES_BMC_64IN1, nes_bmc_64in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_70IN1, nes_bmc_70in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_72IN1, nes_bmc_72in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_76IN1, nes_bmc_76in1_device)
-DECLARE_DEVICE_TYPE(NES_BMC_110IN1, nes_bmc_110in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_150IN1, nes_bmc_150in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_190IN1, nes_bmc_190in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_500IN1, nes_bmc_500in1_device)
diff --git a/src/devices/bus/nes/nes_carts.cpp b/src/devices/bus/nes/nes_carts.cpp
index 52985640cc7..bd64a114fa3 100644
--- a/src/devices/bus/nes/nes_carts.cpp
+++ b/src/devices/bus/nes/nes_carts.cpp
@@ -41,7 +41,6 @@
#include "ggenie.h"
#include "hes.h"
#include "henggedianzi.h"
-#include "hosenkan.h"
#include "jy.h"
#include "kaiser.h"
#include "legacy.h"
@@ -250,12 +249,11 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("hengg_xhzs", NES_HENGG_XHZS);
device.option_add_internal("hengg_shjy3", NES_HENGG_SHJY3); // mapper 253
device.option_add_internal("hes", NES_HES);
- device.option_add_internal("hosenkan", NES_HOSENKAN);
device.option_add_internal("ks106c", NES_KS106C); // mapper 352
device.option_add_internal("ks202", NES_KS202); // mapper 56
device.option_add_internal("ks7010", NES_KS7010); // used in Akumajo Dracula (FDS Conversion)
device.option_add_internal("ks7012", NES_KS7012); // used in Zanac (FDS Conversion)
- device.option_add_internal("ks7013b", NES_KS7013B); // used in Highway Star (FDS Conversion)
+ device.option_add_internal("ks7013b", NES_KS7013B); // used in Highway Star Kaiser bootleg
device.option_add_internal("ks7016", NES_KS7016); // used in Exciting Basket (FDS Conversion)
device.option_add_internal("ks7016b", NES_KS7016B); // used in Meikyu Jiin Dababa alt (FDS Conversion)
device.option_add_internal("ks7017", NES_KS7017);
@@ -320,6 +318,7 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("unl_lh28_lh54", NES_LH28_LH54); // used in Falsion, Meikyuu Jiin Dababa FDS conversions
device.option_add_internal("unl_lh31", NES_LH31); // used in Bubble Bobble alt FDS conversion
device.option_add_internal("unl_lh32", NES_LH32); // used by Monty no Doki Doki Daidassou FDS conversion
+ device.option_add_internal("unl_lh42", NES_LH42); // used by Highway Star Whirlwind Manu bootleg
device.option_add_internal("unl_lh51", NES_LH51); // used in Ai Senshi Nicol alt FDS conversion
device.option_add_internal("unl_lh53", NES_LH53); // used in Nazo no Murasamejou (FDS Conversion);
device.option_add_internal("unl_ac08", NES_AC08); // used by Green Beret FDS conversion
@@ -336,7 +335,7 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("family4646", NES_FAMILY4646);
device.option_add_internal("pikay2k", NES_PIKAY2K); // mapper 254
device.option_add_internal("8237", NES_8237);
- device.option_add_internal("8237a", NES_NROM); // UNSUPPORTED
+ device.option_add_internal("8237a", NES_8237A);
device.option_add_internal("sg_lionk", NES_SG_LIONK);
device.option_add_internal("sg_boog", NES_SG_BOOG);
device.option_add_internal("kasing", NES_KASING);
@@ -372,12 +371,15 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("bmc_80013b", NES_BMC_80013B);
device.option_add_internal("bmc_810544c", NES_BMC_810544C);
device.option_add_internal("bmc_830425c", NES_BMC_830425C);
+ device.option_add_internal("bmc_850437c", NES_BMC_850437C);
+ device.option_add_internal("n32_4in1", NES_N32_4IN1);
device.option_add_internal("ntd03", NES_NTD03);
device.option_add_internal("bmc_ctc09", NES_BMC_CTC09);
device.option_add_internal("bmc_gb63", NES_BMC_GB63);
device.option_add_internal("bmc_gka", NES_BMC_GKA);
device.option_add_internal("bmc_gkb", NES_BMC_GKB);
device.option_add_internal("bmc_gkcxin1", NES_BMC_GKCXIN1);
+ device.option_add_internal("bmc_k1029", NES_BMC_K1029);
device.option_add_internal("bmc_k3006", NES_BMC_K3006);
device.option_add_internal("bmc_k3036", NES_BMC_K3036);
device.option_add_internal("bmc_k3046", NES_BMC_K3046);
@@ -404,7 +406,6 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("bmc_72in1", NES_BMC_72IN1);
device.option_add_internal("bmc_76in1", NES_BMC_76IN1);
device.option_add_internal("bmc_s42in1", NES_BMC_76IN1);
- device.option_add_internal("bmc_110in1", NES_BMC_110IN1);
device.option_add_internal("bmc_150in1", NES_BMC_150IN1);
device.option_add_internal("bmc_190in1", NES_BMC_190IN1);
device.option_add_internal("bmc_500in1", NES_BMC_500IN1);
@@ -418,10 +419,16 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("bmc_reset42", NES_BMC_42IN1RESET); // mapper 226? or 233?
device.option_add_internal("bmc_lc160", NES_BMC_LC160);
// misc multigame cart MMC3 clone boards
+ device.option_add_internal("a88s1", NES_A88S1);
device.option_add_internal("fcgj8in1", NES_FCGJ8IN1);
device.option_add_internal("fk23c", NES_FK23C);
device.option_add_internal("fk23ca", NES_FK23CA);
+ device.option_add_internal("nt639", NES_NT639);
+ device.option_add_internal("resettxrom0", NES_RESETTXROM0);
+ device.option_add_internal("resettxrom1", NES_RESETTXROM1);
+ device.option_add_internal("resettxrom2", NES_RESETTXROM2);
device.option_add_internal("s24in1c03", NES_S24IN1SC03);
+ device.option_add_internal("tech9in1", NES_TECHLINE9IN1);
device.option_add_internal("bmc_8in1", NES_BMC_8IN1);
device.option_add_internal("bmc_15in1", NES_BMC_15IN1);
device.option_add_internal("bmc_sbig7in1", NES_BMC_SBIG7);
@@ -429,10 +436,11 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("bmc_hik4in1", NES_BMC_HIK4);
device.option_add_internal("bmc_mario7in1", NES_BMC_MARIO7IN1);
device.option_add_internal("bmc_f15", NES_BMC_F15);
+ device.option_add_internal("bmc_gn45", NES_BMC_GN45);
device.option_add_internal("bmc_gold7in1", NES_BMC_GOLD7IN1);
- device.option_add_internal("bmc_gc6in1", NES_BMC_GC6IN1);
device.option_add_internal("bmc_411120c", NES_BMC_411120C);
device.option_add_internal("bmc_830118c", NES_BMC_830118C);
+ device.option_add_internal("bmc_830832c", NES_BMC_830832C);
device.option_add_internal("bmc_841101c", NES_BMC_841101C);
device.option_add_internal("pjoy84", NES_PJOY84);
device.option_add_internal("nocash_nochr", NES_NOCHR);
diff --git a/src/devices/bus/nes/nes_ines.hxx b/src/devices/bus/nes/nes_ines.hxx
index 796fd63dd44..42553811ae6 100644
--- a/src/devices/bus/nes/nes_ines.hxx
+++ b/src/devices/bus/nes/nes_ines.hxx
@@ -47,7 +47,7 @@ static const nes_mmc mmc_list[] =
{ 12, REXSOFT_DBZ5 },
{ 13, STD_CPROM },
{ 14, REXSOFT_SL1632 },
- { 15, WAIXING_WXZS2 },
+ { 15, BMC_K1029 },
{ 16, BANDAI_LZ93EX2 }, // with 24c02
{ 17, FFE8_BOARD },
{ 18, JALECO_SS88006 },
@@ -215,7 +215,7 @@ static const nes_mmc mmc_list[] =
{ 179, HENGG_XHZS },
{ 180, UXROM_CC },
// 181 Unused
- { 182, HOSENKAN_BOARD },
+ { 182, SUPERGAME_LIONKING }, // duplicate of mapper 114
{ 183, BTL_SHUIGUAN },
{ 184, SUNSOFT_1 },
{ 185, STD_CNROM },
@@ -248,7 +248,7 @@ static const nes_mmc mmc_list[] =
{ 212, BMC_SUPERHIK_300IN1 },
{ 213, BMC_NOVEL2 },
{ 214, BMC_SUPERGUN_20IN1 },
- { 215, SUPERGAME_BOOGERMAN },
+ { 215, UNL_8237 }, // and UNL_8237A
{ 216, RCM_GS2015 },
{ 217, BMC_500IN1 },
{ 218, NOCASH_NOCHR },
@@ -288,7 +288,7 @@ static const nes_mmc mmc_list[] =
{ 252, WAIXING_SGZ },
// 253 Super 8-in-1 99 King Fighter?? - Unsupported
{ 254, BTL_PIKACHUY2K },
- { 255, BMC_110IN1 },
+ { 255, BMC_72IN1 },
// NES 2.0
// 256 OneBus Famiclones
@@ -318,7 +318,7 @@ static const nes_mmc mmc_list[] =
// 280 Unused
// 281 seems to be mc_sh4b and many other JY multicarts not in nes.xml?
// 282 more JY multicarts not in nes.xml?
- // 283 RCM_GS2004 and RCM_GS2013 (why are these RCM?), these are in nes.xml
+ { 283, RCM_GS2004 }, // and RCM_GS2013
// 284 UNL_DRIPGAME, not in nes.xml
{ 285, BMC_A65AS },
{ 286, BMC_BENSHIENG },
@@ -326,7 +326,7 @@ static const nes_mmc mmc_list[] =
{ 288, BMC_GKCXIN1 },
{ 289, BMC_60311C },
{ 290, BMC_NTD_03 },
- // 291 Kasheng 2-in-1 multicarts not yet in nes.xml?
+ { 291, BMC_NT639 },
// { 292, UNL_DRAGONFIGHTER }, in nes.xml, not emulated yet
// 293 NewStar multicarts, do we have these in nes.xml?
// 294 variant of mapper 134?
@@ -347,8 +347,8 @@ static const nes_mmc mmc_list[] =
{ 309, UNL_LH51 }, // Ai Senshi Nicol alt FDS conversion
// 310 variant of mapper 125?
// 311 Unused (previously assigned in error to a bad SMB2 pirate dump)
- { 312, KAISER_KS7013B }, // Highway Star FDS conversion
- // { 313, BMC_RESETTXROM }, various multicarts, not in nes.xml?
+ { 312, KAISER_KS7013B }, // Highway Star Kaiser bootleg
+ { 313, BMC_RESETTXROM0 },
{ 314, BMC_64IN1NR },
// 315 820732C and 830134C multicarts, not in nes.xml?
// 316 Unused
@@ -386,7 +386,7 @@ static const nes_mmc mmc_list[] =
{ 348, BMC_830118C },
{ 349, BMC_G146 },
// { 350, BMC_891227 }, not in nes.xml
- // 351 JY/Techline 9-in-1
+ { 351, BMC_TECHLINE9IN1 },
{ 352, KAISER_KS106C }, // 4-in-1
// 353 Super Mario Family multicart
// 354 250-in-1 multicart with FDS Bubble Bobble
@@ -399,9 +399,9 @@ static const nes_mmc mmc_list[] =
{ 361, BMC_841101C },
// 362 JY-005 multicart
// 363 variant of mapper 358?
- // 364 JY-007, is this ttoons6 in nes.xml?
+ { 364, BMC_830832C },
// 365 is this asderp95 in nes.xml?
- // 366 K-3131GS and K-3131SS 4-in-1 carts
+ { 366, BMC_GN45 },
// 367 7-in-1 cart that is a close variant of mapper 205
{ 368, BTL_YUNG08 }, // SMB2 FDS conversion
// 369 Super Mario Bros Party multicart
@@ -431,7 +431,7 @@ static const nes_mmc mmc_list[] =
// 393 820720C multicart
// 394 Realtec HSK007 multicart
// 395 Realtec 8210 multicarts
- // 396 various JY multicarts
+ { 396, BMC_850437C },
// 397 JY-082 multicart, not in nes.xml?
// 398 JY-048 multicart, not in nes.xml?
// 399 homebrew game Star Versus
@@ -446,14 +446,14 @@ static const nes_mmc mmc_list[] =
// 408 Konami PnP
// 409 (Sealie) homebrew game A Winner is You, 64MB music cart, easy to support if dump is available
// 410 Unused or JY?
- // 411 various JY multicarts
+ { 411, BMC_A88S1 },
// 412 INTV 10-in-1 PnP 2nd edition
// 413 homebrew game Super Russian Roulette
// 414 9999999-in-1 multicart
{ 415, BTL_0353 }, // Lucky (Roger) Rabbit FDS conversion
- // 416 4-in-1 that includes mapper 50 SMB2j pirate
+ { 416, BMC_N32_4IN1 },
{ 417, BTL_BATMANFS }, // "Fine Studio" Batman bootleg
- // { 418, UNL_LH42 } // Highway Star alt FDS conversion
+ { 418, UNL_LH42 }, // Highway Star Whirlwind Manu bootleg
// 419 VT03 PnPs
// 420 Kasheng A971210 board
// 421 JY SC871115C board
@@ -513,7 +513,7 @@ static const nes_mmc mmc_list[] =
// 550 JY-015 multicart
// 551 variant of mapper 178, likely shenghuo, jingkzx, xiaokecq, zgfyun in nes.xml
// 552 TAITO_X1_017, this is a correction of mapper 82. We should drop 82 and only support the accurate dumps of 552?
- // { 553, SACHEN_3013 }, // Dong Dong Nao 1
+ { 553, SACHEN_3013 }, // Dong Dong Nao 1
{ 554, KAISER_KS7010 }, // Akumajo Dracula FDS conversion
// 555 retroUSB re-release of 1991 Nintendo Campus Challenge
// 556 JY-215 multicart
@@ -896,6 +896,25 @@ void nes_cart_slot_device::call_load_ines()
m_pcb_id = UNL_DH08;
break;
+ case UNL_8237:
+ if (submapper == 1)
+ m_pcb_id = UNL_8237A;
+ break;
+
+ case RCM_GS2004:
+ if (prg_size >= 0x50000)
+ m_pcb_id = RCM_GS2013;
+ break;
+
+ case BMC_RESETTXROM0:
+ if (submapper == 1)
+ m_pcb_id = BMC_RESETTXROM1;
+ else if (submapper == 2)
+ m_pcb_id = BMC_RESETTXROM2;
+ else if (submapper > 2)
+ logerror("Unimplemented NES 2.0 submapper: %d\n", submapper);
+ break;
+
case HES_BOARD:
if (crc_hack)
m_cart->set_pcb_ctrl_mirror(true); // Mapper 113 is used for 2 diff boards
@@ -1207,6 +1226,7 @@ const char * nes_cart_slot_device::get_default_card_ines(get_default_card_softwa
if (crc_hack)
pcb_id = BTL_AISENSHINICOL; // Mapper 42 is used for 2 diff boards
break;
+
case UNL_LH28_LH54: // Mapper 108 is used for 4 diff boards
if (ROM[5])
pcb_id = (ROM[5] == 2) ? UNL_LE05 : UNL_LH31;
@@ -1214,6 +1234,22 @@ const char * nes_cart_slot_device::get_default_card_ines(get_default_card_softwa
pcb_id = UNL_DH08;
break;
+ case UNL_8237: // Mapper 215 is used for 2 diff boards
+ if (submapper == 1)
+ pcb_id = UNL_8237A;
+ break;
+
+ case RCM_GS2004: // Mapper 283 is used for 2 diff boards
+ if (ROM[4] >= 20)
+ pcb_id = RCM_GS2013;
+ break;
+
+ case BMC_RESETTXROM0: // Mapper 313 is used for 3 diff boards
+ if (submapper == 1)
+ pcb_id = BMC_RESETTXROM1;
+ if (submapper == 2)
+ pcb_id = BMC_RESETTXROM2;
+ break;
}
return nes_get_slot(pcb_id);
diff --git a/src/devices/bus/nes/nes_pcb.hxx b/src/devices/bus/nes/nes_pcb.hxx
index 8ec381a72ad..2ec5f5153fd 100644
--- a/src/devices/bus/nes/nes_pcb.hxx
+++ b/src/devices/bus/nes/nes_pcb.hxx
@@ -162,12 +162,11 @@ static const nes_pcb pcb_list[] =
{ "hengg_xhzs", HENGG_XHZS },
{ "hengg_shjy3", HENGG_SHJY3 }, // mapper 253
{ "hes", HES_BOARD },
- { "hosenkan", HOSENKAN_BOARD },
{ "ks106c", KAISER_KS106C }, // mapper 352
{ "ks202", KAISER_KS202 }, // mapper 56
{ "ks7010", KAISER_KS7010 }, // used in Akumajo Dracula (FDS Conversion)
{ "ks7012", KAISER_KS7012 }, // used in Zanac (FDS Conversion)
- { "ks7013b", KAISER_KS7013B }, // used in Highway Star (FDS Conversion)
+ { "ks7013b", KAISER_KS7013B }, // used in Highway Star Kaiser bootleg
{ "ks7016", KAISER_KS7016 }, // used in Exciting Basketball (FDS Conversion)
{ "ks7016b", KAISER_KS7016B }, // used in Meikyuu Jiin Dababa alt (FDS Conversion)
{ "ks7017", KAISER_KS7017 },
@@ -226,6 +225,7 @@ static const nes_pcb pcb_list[] =
{ "family4646", BMC_FAMILY_4646 },
{ "pikay2k", BTL_PIKACHUY2K }, // mapper 254
{ "8237", UNL_8237 },
+ { "8237a", UNL_8237A },
{ "sg_lionk", SUPERGAME_LIONKING },
{ "sg_boog", SUPERGAME_BOOGERMAN },
{ "kasing", KASING_BOARD },
@@ -257,12 +257,15 @@ static const nes_pcb pcb_list[] =
{ "bmc_80013b", BMC_80013B },
{ "bmc_810544c", BMC_810544C },
{ "bmc_830425c", BMC_830425C },
+ { "bmc_850437c", BMC_850437C },
+ { "n32_4in1", BMC_N32_4IN1 },
{ "ntd03", BMC_NTD_03 },
{ "bmc_ctc09", BMC_CTC09 },
{ "bmc_gb63", BMC_G63IN1 },
{ "bmc_gka", BMC_GKA },
{ "bmc_gkb", BMC_GKB },
{ "bmc_gkcxin1", BMC_GKCXIN1 },
+ { "bmc_k1029", BMC_K1029 },
{ "bmc_k3006", BMC_K3006 },
{ "bmc_k3036", BMC_K3036 },
{ "bmc_k3046", BMC_K3046 },
@@ -285,7 +288,6 @@ static const nes_pcb pcb_list[] =
{ "bmc_72in1", BMC_72IN1 },
{ "bmc_76in1", BMC_76IN1 },
{ "bmc_s42in1", BMC_76IN1 },
- { "bmc_110in1", BMC_110IN1 },
{ "bmc_150in1", BMC_150IN1 },
{ "bmc_190in1", BMC_190IN1 },
{ "bmc_500in1", BMC_500IN1 },
@@ -295,10 +297,16 @@ static const nes_pcb pcb_list[] =
{ "bmc_8157", BMC_8157 },
{ "bmc_g146", BMC_G146 },
{ "bmc_11160", BMC_11160 },
+ { "a88s1", BMC_A88S1 },
{ "fcgj8in1", BMC_FCGENJIN_8IN1 },
{ "fk23c", BMC_FK23C },
{ "fk23ca", BMC_FK23CA },
+ { "nt639", BMC_NT639 },
+ { "resettxrom0", BMC_RESETTXROM0 },
+ { "resettxrom1", BMC_RESETTXROM1 },
+ { "resettxrom2", BMC_RESETTXROM2 },
{ "s24in1c03", BMC_S24IN1SC03 },
+ { "tech9in1", BMC_TECHLINE9IN1 },
{ "bmc_8in1", BMC_8IN1 },
{ "bmc_15in1", BMC_15IN1 },
{ "bmc_sbig7in1", BMC_SUPERBIG_7IN1 },
@@ -306,10 +314,11 @@ static const nes_pcb pcb_list[] =
{ "bmc_hik4in1", BMC_SUPERHIK_4IN1 },
{ "bmc_mario7in1", BMC_MARIOPARTY_7IN1 },
{ "bmc_f15", BMC_F15 },
+ { "bmc_gn45", BMC_GN45 },
{ "bmc_gold7in1", BMC_GOLD_7IN1 },
- { "bmc_gc6in1", BMC_GOLDENCARD_6IN1 },
{ "bmc_411120c", BMC_411120C },
{ "bmc_830118c", BMC_830118C },
+ { "bmc_830832c", BMC_830832C },
{ "bmc_841101c", BMC_841101C },
{ "pjoy84", BMC_PJOY84 },
{ "bmc_gold150", BMC_GOLD150 },
@@ -334,6 +343,7 @@ static const nes_pcb pcb_list[] =
{ "unl_lh28_lh54", UNL_LH28_LH54 },
{ "unl_lh31", UNL_LH31 },
{ "unl_lh32", UNL_LH32 },
+ { "unl_lh42", UNL_LH42 },
{ "unl_lh51", UNL_LH51 },
{ "unl_lh53", UNL_LH53 },
{ "unl_ac08", UNL_AC08 },
@@ -354,7 +364,6 @@ static const nes_pcb pcb_list[] =
{ "ffe3", FFE3_BOARD },
{ "ffe4", FFE4_BOARD },
{ "ffe8", FFE8_BOARD },
- { "8237a", UNSUPPORTED_BOARD },
{ "unl_dance", UNSUPPORTED_BOARD },
{ "bmc_hik_kof", UNSUPPORTED_BOARD },
{ "onebus", UNSUPPORTED_BOARD },
diff --git a/src/devices/bus/nes/nes_slot.cpp b/src/devices/bus/nes/nes_slot.cpp
index 812aa738399..f75694bd041 100644
--- a/src/devices/bus/nes/nes_slot.cpp
+++ b/src/devices/bus/nes/nes_slot.cpp
@@ -887,7 +887,7 @@ image_init_result nes_cart_slot_device::call_load()
else
{
logerror("%s is NOT a file in either iNES or UNIF format.\n", filename());
- seterror(IMAGE_ERROR_UNSPECIFIED, "File is neither iNES or UNIF format");
+ seterror(image_error::INVALIDIMAGE, "File is neither iNES or UNIF format");
return image_init_result::FAIL;
}
}
diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h
index d33b24e78a1..52d9c7cc6cd 100644
--- a/src/devices/bus/nes/nes_slot.h
+++ b/src/devices/bus/nes/nes_slot.h
@@ -86,25 +86,27 @@ enum
TXC_22211, TXC_DUMARACING, TXC_MJBLOCK,
TXC_COMMANDOS, TXC_TW, TXC_STRIKEW,
// Multigame Carts
- BMC_64IN1NR, BMC_190IN1, BMC_A65AS, BMC_F15,
+ BMC_64IN1NR, BMC_190IN1, BMC_A65AS, BMC_A88S1, BMC_F15, BMC_GN45,
BMC_HIK8IN1, BMC_NOVEL1, BMC_NOVEL2, BMC_S24IN1SC03, BMC_T262,
BMC_WS, BMC_SUPERBIG_7IN1, BMC_SUPERHIK_4IN1, BMC_BALLGAMES_11IN1,
BMC_MARIOPARTY_7IN1, BMC_GOLD_7IN1, BMC_SUPER_700IN1, BMC_FAMILY_4646,
BMC_36IN1, BMC_21IN1, BMC_150IN1, BMC_35IN1, BMC_64IN1,
BMC_8IN1, BMC_15IN1, BMC_SUPERHIK_300IN1, BMC_SUPERGUN_20IN1,
- BMC_GOLDENCARD_6IN1, BMC_72IN1, BMC_SUPER_42IN1, BMC_76IN1,
- BMC_31IN1, BMC_22GAMES, BMC_20IN1, BMC_110IN1,
+ BMC_72IN1, BMC_SUPER_42IN1, BMC_76IN1,
+ BMC_31IN1, BMC_22GAMES, BMC_20IN1,
BMC_70IN1, BMC_500IN1, BMC_800IN1, BMC_1200IN1,
BMC_GKA, BMC_GKB, BMC_GKCXIN1, BMC_VT5201, BMC_BENSHIENG,
- BMC_60311C, BMC_80013B, BMC_810544C, BMC_830425C,
- BMC_NTD_03, BMC_G63IN1, BMC_FCGENJIN_8IN1, BMC_FK23C, BMC_FK23CA,
+ BMC_60311C, BMC_80013B, BMC_810544C, BMC_830425C, BMC_850437C,
+ BMC_N32_4IN1, BMC_NT639, BMC_NTD_03, BMC_G63IN1,
+ BMC_FCGENJIN_8IN1, BMC_FK23C, BMC_FK23CA,
BMC_PJOY84, BMC_TH22913, BMC_11160, BMC_G146,
- BMC_2751, BMC_8157, BMC_830118C, BMC_841101C,
+ BMC_2751, BMC_8157, BMC_830118C, BMC_830832C, BMC_841101C,
BMC_411120C, BMC_GOLD150, BMC_GOLD260, BMC_SUPER22,
- BMC_12IN1, BMC_4IN1RESET, BMC_42IN1RESET, BMC_LITTLECOM160,
- BMC_CTC09, BMC_K3006, BMC_K3036, BMC_K3046, BMC_SA005A, BMC_TJ03,
+ BMC_12IN1, BMC_4IN1RESET, BMC_42IN1RESET, BMC_LITTLECOM160, BMC_CTC09,
+ BMC_K1029, BMC_K3006, BMC_K3036, BMC_K3046, BMC_SA005A, BMC_TJ03,
+ BMC_RESETTXROM0, BMC_RESETTXROM1, BMC_RESETTXROM2, BMC_TECHLINE9IN1,
// Unlicensed
- UNL_8237, UNL_CC21, UNL_AX5705, UNL_KN42, UNL_KOF97,
+ UNL_8237, UNL_8237A, UNL_CC21, UNL_AX5705, UNL_KN42, UNL_KOF97,
UNL_N625092, UNL_SC127, UNL_SMB2J, UNL_T230, UNL_MMALEE,
UNL_UXROM, UNL_MK2, UNL_XIAOZY, UNL_KOF96, UNL_FS6,
UNL_SF3, UNL_RACERMATE, UNL_EDU2K,
@@ -114,16 +116,16 @@ enum
// Bootleg boards
BTL_0353, BTL_09034A, BTL_AISENSHINICOL, BTL_BATMANFS,
BTL_CONTRAJ, BTL_DRAGONNINJA, BTL_MARIOBABY, BTL_PALTHENA,
- BTL_PIKACHUY2K, BTL_SBROS11, BTL_SMB2JA, BTL_SMB2JB,
+ BTL_PIKACHUY2K, BTL_SBROS11, BTL_SMB2JA, BTL_SMB2JB,
BTL_SMB3, BTL_SHUIGUAN, BTL_TOBIDASE, BTL_YUNG08,
// Kaiser
KAISER_KS106C, KAISER_KS202, KAISER_KS7010, KAISER_KS7012,
- KAISER_KS7013B, KAISER_KS7016, KAISER_KS7016B, KAISER_KS7017,
- KAISER_KS7021A, KAISER_KS7022, KAISER_KS7030, KAISER_KS7031,
- KAISER_KS7032, KAISER_KS7037, KAISER_KS7057, KAISER_KS7058,
+ KAISER_KS7013B, KAISER_KS7016, KAISER_KS7016B, KAISER_KS7017,
+ KAISER_KS7021A, KAISER_KS7022, KAISER_KS7030, KAISER_KS7031,
+ KAISER_KS7032, KAISER_KS7037, KAISER_KS7057, KAISER_KS7058,
// Whirlwind Manu
UNL_DH08, UNL_LE05, UNL_LG25, UNL_LH10, UNL_LH28_LH54,
- UNL_LH31, UNL_LH32, UNL_LH51, UNL_LH53,
+ UNL_LH31, UNL_LH32, UNL_LH42, UNL_LH51, UNL_LH53,
// Misc: these are needed to convert mappers to boards, I will sort them later
OPENCORP_DAOU306, HES_BOARD, SVISION16_BOARD, RUMBLESTATION_BOARD, JYCOMPANY_A, JYCOMPANY_B, JYCOMPANY_C,
MAGICSERIES_MD, KASING_BOARD, FUTUREMEDIA_BOARD, FUKUTAKE_BOARD, SOMARI_SL12,
@@ -135,7 +137,7 @@ enum
WAIXING_TYPE_I, WAIXING_TYPE_J, WAIXING_FS304,
WAIXING_SGZLZ, WAIXING_SGZ, WAIXING_WXZS, WAIXING_SECURITY, WAIXING_SH2,
WAIXING_DQ8, WAIXING_FFV, WAIXING_WXZS2, SUPERGAME_LIONKING, SUPERGAME_BOOGERMAN,
- KAY_BOARD, HOSENKAN_BOARD, NITRA_TDA, GOUDER_37017, NANJING_BOARD, ZEMINA_BOARD,
+ KAY_BOARD, NITRA_TDA, GOUDER_37017, NANJING_BOARD, ZEMINA_BOARD,
NOCASH_NOCHR, // homebrew PCB design which uses NTRAM for CHRRAM
UNL_ACTION53, // homebrew PCB for homebrew multicarts
UNL_CUFROM, UNL_UNROM512, UNL_2A03PURITANS, // homebrew PCBs
diff --git a/src/devices/bus/nes/rcm.cpp b/src/devices/bus/nes/rcm.cpp
index fdd07830381..f3adba8a49d 100644
--- a/src/devices/bus/nes/rcm.cpp
+++ b/src/devices/bus/nes/rcm.cpp
@@ -8,14 +8,14 @@
Here we emulate the following PCBs
+ * RCM GS2004 [mapper 283]
+ * RCM GS2013 [mapper 283 also]
* RCM GS2015 [mapper 216]
- * RCM GS2004
- * RCM GS2013
* RCM Tetris Family 9in1 [mapper 61]
- * RCM 3D Block
+ * RCM 3D Block [mapper 355]
TODO:
- - investigate why 3D Block does not work
+ - implement PIC16C54 protection for 3D Block
***********************************************************************************************************/
@@ -38,9 +38,9 @@
// constructor
//-------------------------------------------------
-DEFINE_DEVICE_TYPE(NES_GS2015, nes_gs2015_device, "nes_g2015", "NES Cart RCM GS-2015 PCB")
-DEFINE_DEVICE_TYPE(NES_GS2004, nes_gs2004_device, "nes_g2004", "NES Cart RCM GS-2004 PCB")
-DEFINE_DEVICE_TYPE(NES_GS2013, nes_gs2013_device, "nes_g2013", "NES Cart RCM GS-2013 PCB")
+DEFINE_DEVICE_TYPE(NES_GS2004, nes_gs2004_device, "nes_gs2004", "NES Cart RCM GS-2004 PCB")
+DEFINE_DEVICE_TYPE(NES_GS2013, nes_gs2013_device, "nes_gs2013", "NES Cart RCM GS-2013 PCB")
+DEFINE_DEVICE_TYPE(NES_GS2015, nes_gs2015_device, "nes_gs2015", "NES Cart RCM GS-2015 PCB")
DEFINE_DEVICE_TYPE(NES_TF9IN1, nes_tf9_device, "nes_tetrisfam", "NES Cart RCM Tetris Family 9 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_3DBLOCK, nes_3dblock_device, "nes_3dblock", "NES Cart RCM 3D Block PCB")
@@ -50,17 +50,22 @@ nes_gs2015_device::nes_gs2015_device(const machine_config &mconfig, const char *
{
}
-nes_gs2004_device::nes_gs2004_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_nrom_device(mconfig, NES_GS2004, tag, owner, clock)
+nes_gs2004_device::nes_gs2004_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int bank)
+ : nes_nrom_device(mconfig, type, tag, owner, clock), m_base(bank * 0x2000)
{
}
-nes_gs2013_device::nes_gs2013_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_nrom_device(mconfig, NES_GS2013, tag, owner, clock)
+nes_gs2004_device::nes_gs2004_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_gs2004_device(mconfig, NES_GS2004, tag, owner, clock, 0x20)
{
}
-nes_tf9_device::nes_tf9_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+nes_gs2013_device::nes_gs2013_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_gs2004_device(mconfig, NES_GS2013, tag, owner, clock, 0x1f)
+{
+}
+
+nes_tf9_device::nes_tf9_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_nrom_device(mconfig, NES_TF9IN1, tag, owner, clock)
{
}
@@ -85,42 +90,6 @@ void nes_gs2015_device::pcb_reset()
chr8(0, m_chr_source);
}
-void nes_gs2004_device::device_start()
-{
- common_start();
-}
-
-void nes_gs2004_device::pcb_reset()
-{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- prg32(0xff);
- chr8(0, m_chr_source);
-}
-
-void nes_gs2013_device::device_start()
-{
- common_start();
-}
-
-void nes_gs2013_device::pcb_reset()
-{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- prg32(0xff);
- chr8(0, m_chr_source);
-}
-
-void nes_tf9_device::device_start()
-{
- common_start();
-}
-
-void nes_tf9_device::pcb_reset()
-{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- prg32(0);
- chr8(0, m_chr_source);
-}
-
void nes_3dblock_device::device_start()
{
common_start();
@@ -157,7 +126,8 @@ void nes_3dblock_device::pcb_reset()
iNES: mapper 216
- In MESS: Supported.
+ In MAME: Partially supported. Bonza games have some
+ sort of card inputs for gambling purposes.
-------------------------------------------------*/
@@ -177,41 +147,26 @@ uint8_t nes_gs2015_device::read_m(offs_t offset)
/*-------------------------------------------------
- Board BMC-GS2004
+ Boards BMC-GS2004, BMC-GS2013
+
+ Games: Tetris Family 6-in-1, 5-in-1, 12-in-1
- Games: Tetris Family 6-in-1
+ NES 2.0: mapper 283
- In MESS: Preliminary Support. It also misses WRAM handling
- (we need reads from 0x6000-0x7fff)
+ In MAME: Supported.
-------------------------------------------------*/
-void nes_gs2004_device::write_h(offs_t offset, uint8_t data)
+u8 nes_gs2004_device::read_m(offs_t offset)
{
- LOG_MMC(("gs2004 write_h, offset: %04x, data: %02x\n", offset, data));
-
- prg32(data);
+ LOG_MMC(("gs2004 read_m, offset: %04x\n", offset));
+ return m_prg[m_base + offset]; // fixed base differs per device
}
-/*-------------------------------------------------
-
- Board BMC-GS2013
-
- Games: Tetris Family 12-in-1
-
- In MESS: Preliminary Support. It also misses WRAM handling
- (we need reads from 0x6000-0x7fff)
-
- -------------------------------------------------*/
-
-void nes_gs2013_device::write_h(offs_t offset, uint8_t data)
+void nes_gs2004_device::write_h(offs_t offset, u8 data)
{
- LOG_MMC(("gs2013 write_h, offset: %04x, data: %02x\n", offset, data));
-
- if (data & 0x08)
- prg32(data & 0x09);
- else
- prg32(data & 0x07);
+ LOG_MMC(("gs2004 write_h, offset: %04x, data: %02x\n", offset, data));
+ prg32(data);
}
/*-------------------------------------------------
@@ -220,35 +175,22 @@ void nes_gs2013_device::write_h(offs_t offset, uint8_t data)
Games: Tetris Family 9 in 1, 20 in 1
- Simple Mapper: prg/chr/nt are swapped depending on the offset
- of writes in 0x8000-0xffff. offset&0x80 set NT mirroring,
- when (offset&0x30) is 0,3 prg32 is set; when it is 1,2
- two 16k prg banks are set. See below for the values used in
- these banks.
-
iNES: mapper 61
- In MESS: Supported.
+ In MAME: Supported.
-------------------------------------------------*/
-void nes_tf9_device::write_h(offs_t offset, uint8_t data)
+void nes_tf9_device::write_h(offs_t offset, u8 data)
{
LOG_MMC(("tetrisfam write_h, offset: %04x, data: %02x\n", offset, data));
- switch (offset & 0x30)
- {
- case 0x00:
- case 0x30:
- prg32(offset & 0x0f);
- break;
- case 0x10:
- case 0x20:
- prg16_89ab(((offset & 0x0f) << 1) | ((offset & 0x20) >> 4));
- prg16_cdef(((offset & 0x0f) << 1) | ((offset & 0x20) >> 4));
- break;
- }
- set_nt_mirroring(BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
+ u8 bank = (offset & 0x0f) << 1 | BIT(offset, 5);
+ u8 mode = !BIT(offset, 4);
+ prg16_89ab(bank & ~mode);
+ prg16_cdef(bank | mode);
+
+ set_nt_mirroring(BIT(offset, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
}
/*-------------------------------------------------
@@ -257,7 +199,7 @@ void nes_tf9_device::write_h(offs_t offset, uint8_t data)
Games: 3-D Block Hwang Shinwei version
- iNES:
+ NES 2.0: mapper 355
In MESS: Very Preliminary Support. What is the purpose
of the writes to $4800-$4900-$4a00? These writes
diff --git a/src/devices/bus/nes/rcm.h b/src/devices/bus/nes/rcm.h
index 005869fe09c..0581d299f20 100644
--- a/src/devices/bus/nes/rcm.h
+++ b/src/devices/bus/nes/rcm.h
@@ -34,33 +34,27 @@ class nes_gs2004_device : public nes_nrom_device
{
public:
// construction/destruction
- nes_gs2004_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_gs2004_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual void write_h(offs_t offset, uint8_t data) override;
-
- virtual void pcb_reset() override;
+ virtual u8 read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, u8 data) override;
protected:
- // device-level overrides
- virtual void device_start() override;
+ // construction/destruction
+ nes_gs2004_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int bank);
+
+private:
+ u32 m_base;
};
// ======================> nes_gs2013_device
-class nes_gs2013_device : public nes_nrom_device
+class nes_gs2013_device : public nes_gs2004_device
{
public:
// construction/destruction
- nes_gs2013_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- virtual void write_h(offs_t offset, uint8_t data) override;
-
- virtual void pcb_reset() override;
-
-protected:
- // device-level overrides
- virtual void device_start() override;
+ nes_gs2013_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
@@ -70,15 +64,9 @@ class nes_tf9_device : public nes_nrom_device
{
public:
// construction/destruction
- nes_tf9_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- virtual void write_h(offs_t offset, uint8_t data) override;
-
- virtual void pcb_reset() override;
+ nes_tf9_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
-protected:
- // device-level overrides
- virtual void device_start() override;
+ virtual void write_h(offs_t offset, u8 data) override;
};
@@ -106,9 +94,9 @@ private:
// device type definition
-DECLARE_DEVICE_TYPE(NES_GS2015, nes_gs2015_device)
DECLARE_DEVICE_TYPE(NES_GS2004, nes_gs2004_device)
DECLARE_DEVICE_TYPE(NES_GS2013, nes_gs2013_device)
+DECLARE_DEVICE_TYPE(NES_GS2015, nes_gs2015_device)
DECLARE_DEVICE_TYPE(NES_TF9IN1, nes_tf9_device)
DECLARE_DEVICE_TYPE(NES_3DBLOCK, nes_3dblock_device)
diff --git a/src/devices/bus/nes/sachen.cpp b/src/devices/bus/nes/sachen.cpp
index f30dd2529b2..816ca04ffd1 100644
--- a/src/devices/bus/nes/sachen.cpp
+++ b/src/devices/bus/nes/sachen.cpp
@@ -503,7 +503,7 @@ uint8_t nes_sachen_tcu02_device::read_l(offs_t offset)
u8 nes_sachen_3013_device::read_h(offs_t offset)
{
- return (offset < 0x4000) ? 0x3a : hi_access_rom(offset);
+ return (offset < 0x4000) ? 0x3a : hi_access_rom(offset);
}
/*-------------------------------------------------
diff --git a/src/devices/bus/nes/sunsoft.cpp b/src/devices/bus/nes/sunsoft.cpp
index 39f42a98f78..474948765b5 100644
--- a/src/devices/bus/nes/sunsoft.cpp
+++ b/src/devices/bus/nes/sunsoft.cpp
@@ -16,7 +16,7 @@
* Sunsoft-5B [mapper 69]
TODO:
- - check 1-line glitches due to IRQ in Sunsoft-3
+ - 1-line glitches in Fantasy Zone II (Sunsoft-3) seem to be PPU timing related. The cycle-based IRQ timer below "should" be ok.
***********************************************************************************************************/
@@ -136,6 +136,7 @@ void nes_sunsoft_3_device::pcb_reset()
prg16_89ab(0);
prg16_cdef(m_prg_chunks - 1);
chr8(0, m_chr_source);
+
m_irq_toggle = 0;
m_irq_count = 0;
m_irq_enable = 0;
@@ -256,8 +257,7 @@ void nes_sunsoft_2_device::write_h(offs_t offset, uint8_t data)
Sunsoft-3 board emulation
- The two games using this board have incompatible mirroring
- wiring, making necessary two distinct mappers & pcb_id
+ Games: Fantasy Zone II, Mito Koumon II - Sekai Manyuki
iNES: mapper 67
@@ -268,16 +268,10 @@ void nes_sunsoft_3_device::device_timer(timer_instance const &timer)
{
if (timer.id() == TIMER_IRQ)
{
- if (m_irq_enable)
+ if (m_irq_enable && --m_irq_count == 0xffff)
{
- if (!m_irq_count)
- {
- set_irq_line(ASSERT_LINE);
- m_irq_count = 0xffff;
- m_irq_enable = 0;
- }
- else
- m_irq_count--;
+ set_irq_line(ASSERT_LINE);
+ m_irq_enable = 0;
}
}
}
@@ -289,18 +283,11 @@ void nes_sunsoft_3_device::write_h(offs_t offset, uint8_t data)
switch (offset & 0x7800)
{
case 0x0800:
- chr2_0(data, CHRROM);
- break;
case 0x1800:
- chr2_2(data, CHRROM);
- break;
case 0x2800:
- chr2_4(data, CHRROM);
- break;
case 0x3800:
- chr2_6(data, CHRROM);
+ chr2_x((offset >> 11) & 0x06, data & 0x3f, CHRROM);
break;
- case 0x4000:
case 0x4800:
m_irq_toggle ^= 1;
if (m_irq_toggle)
@@ -311,7 +298,6 @@ void nes_sunsoft_3_device::write_h(offs_t offset, uint8_t data)
case 0x5800:
m_irq_enable = BIT(data, 4);
m_irq_toggle = 0;
- set_irq_line(CLEAR_LINE);
break;
case 0x6800:
switch (data & 3)
@@ -323,10 +309,10 @@ void nes_sunsoft_3_device::write_h(offs_t offset, uint8_t data)
}
break;
case 0x7800:
- prg16_89ab(data);
+ prg16_89ab(data & 0x0f);
break;
default:
- LOG_MMC(("Sunsoft 3 write_h uncaught write, offset: %04x, data: %02x\n", offset, data));
+ set_irq_line(CLEAR_LINE);
break;
}
}
diff --git a/src/devices/bus/nes/sunsoft.h b/src/devices/bus/nes/sunsoft.h
index 2ed5d47d166..30399d332c2 100644
--- a/src/devices/bus/nes/sunsoft.h
+++ b/src/devices/bus/nes/sunsoft.h
@@ -61,6 +61,7 @@ protected:
// device-level overrides
virtual void device_start() override;
virtual void device_timer(timer_instance const &timer) override;
+
private:
uint16_t m_irq_count;
int m_irq_enable, m_irq_toggle;
@@ -96,6 +97,7 @@ protected:
int m_reg, m_latch1, m_latch2, m_wram_enable;
};
+
// ======================> nes_sunsoft_fme7_device
class nes_sunsoft_fme7_device : public nes_nrom_device
diff --git a/src/devices/bus/nes/waixing.cpp b/src/devices/bus/nes/waixing.cpp
index 2aba7b3f412..2020c4ddc80 100644
--- a/src/devices/bus/nes/waixing.cpp
+++ b/src/devices/bus/nes/waixing.cpp
@@ -1208,9 +1208,12 @@ void nes_waixing_dq8_device::write_h(offs_t offset, uint8_t data)
Games: Wai Xing Zhan Shi 2 (aka Phantasy Star 2),
Bao Xiao Tien Guo, Bio Hazard, Pokemon Gold, Subor (R)
- iNES: mapper 15
-
- In MESS: Supported
+ FIXME: This used to be mapper 15. NesDev research says the
+ only two games found on board K-1029 (now in multigame.cpp)
+ are the two Contra multicarts. All other Waixing games
+ appear to be ROM hacks to work with mapper 15. Games on
+ this device need to be reassigned to correct device and/or
+ replaced with original dumps that match the original boards.
-------------------------------------------------*/
diff --git a/src/devices/bus/nubus/nubus_image.cpp b/src/devices/bus/nubus/nubus_image.cpp
index 8c94882cd4f..f017b9cc5a1 100644
--- a/src/devices/bus/nubus/nubus_image.cpp
+++ b/src/devices/bus/nubus/nubus_image.cpp
@@ -68,7 +68,7 @@ public:
// device type definition
-DEFINE_DEVICE_TYPE_NS(MESSIMG_DISK, nubus_image_device, messimg_disk_image_device, "messimg_disk_image", "Mac image")
+DEFINE_DEVICE_TYPE(MESSIMG_DISK, nubus_image_device::messimg_disk_image_device, "messimg_disk_image", "Mac image")
nubus_image_device::messimg_disk_image_device::messimg_disk_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, MESSIMG_DISK, tag, owner, clock),
@@ -295,8 +295,9 @@ void nubus_image_device::file_cmd_w(uint32_t data)
std::string fullpath(filectx.curdir);
fullpath += PATH_SEPARATOR;
fullpath.append(std::begin(filectx.filename), std::find(std::begin(filectx.filename), std::end(filectx.filename), '\0'));
- if (osd_file::open(fullpath, OPEN_FLAG_READ, filectx.fd, filectx.filelen) != osd_file::error::NONE)
- osd_printf_error("Error opening %s\n", fullpath);
+ std::error_condition const filerr = osd_file::open(fullpath, OPEN_FLAG_READ, filectx.fd, filectx.filelen);
+ if (filerr)
+ osd_printf_error("%s: Error opening %s (%s:%d %s)\n", tag(), fullpath, filerr.category().name(), filerr.value(), filerr.message());
filectx.bytecount = 0;
}
break;
@@ -306,8 +307,9 @@ void nubus_image_device::file_cmd_w(uint32_t data)
fullpath += PATH_SEPARATOR;
fullpath.append(std::begin(filectx.filename), std::find(std::begin(filectx.filename), std::end(filectx.filename), '\0'));
uint64_t filesize; // unused, but it's an output from the open call
- if (osd_file::open(fullpath, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, filectx.fd, filesize) != osd_file::error::NONE)
- osd_printf_error("Error opening %s\n", fullpath);
+ std::error_condition const filerr = osd_file::open(fullpath, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, filectx.fd, filesize);
+ if (filerr)
+ osd_printf_error("%s: Error opening %s (%s:%d %s)\n", tag(), fullpath, filerr.category().name(), filerr.value(), filerr.message());
filectx.bytecount = 0;
}
break;
diff --git a/src/devices/bus/plus4/exp.cpp b/src/devices/bus/plus4/exp.cpp
index fb0387908ef..487de7ea3c2 100644
--- a/src/devices/bus/plus4/exp.cpp
+++ b/src/devices/bus/plus4/exp.cpp
@@ -118,7 +118,7 @@ image_init_result plus4_expansion_slot_device::call_load()
if ((m_card->m_c1l_size & (m_card->m_c1l_size - 1)) || (m_card->m_c1h_size & (m_card->m_c1h_size - 1)) || (m_card->m_c2l_size & (m_card->m_c2l_size - 1)) || (m_card->m_c2h_size & (m_card->m_c2h_size - 1)))
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "ROM size must be power of 2");
+ seterror(image_error::INVALIDIMAGE, "ROM size must be power of 2");
return image_init_result::FAIL;
}
}
diff --git a/src/devices/bus/rs232/hlemouse.cpp b/src/devices/bus/rs232/hlemouse.cpp
index 954e83b2e68..b9059764a09 100644
--- a/src/devices/bus/rs232/hlemouse.cpp
+++ b/src/devices/bus/rs232/hlemouse.cpp
@@ -74,12 +74,12 @@
// Device type globals
//**************************************************
-DEFINE_DEVICE_TYPE_NS(MSFT_HLE_SERIAL_MOUSE, bus::rs232, hle_msft_mouse_device, "rs232_mouse_hle_msft", "Microsoft 2-Button Serial Mouse (HLE)")
-DEFINE_DEVICE_TYPE_NS(LOGITECH_HLE_SERIAL_MOUSE, bus::rs232, hle_logitech_mouse_device, "rs232_mouse_hle_logitech", "Logitech 3-Button Serial Mouse (HLE)")
-DEFINE_DEVICE_TYPE_NS(WHEEL_HLE_SERIAL_MOUSE, bus::rs232, hle_wheel_mouse_device, "rs232_mouse_hle_wheel", "Microsoft Serial Mouse with Wheel (HLE)")
-DEFINE_DEVICE_TYPE_NS(MSYSTEMS_HLE_SERIAL_MOUSE, bus::rs232, hle_msystems_mouse_device, "rs232_mouse_hle_msystems", "Mouse Systems Non-rotatable Mouse (HLE)")
-DEFINE_DEVICE_TYPE_NS(ROTATABLE_HLE_SERIAL_MOUSE, bus::rs232, hle_rotatable_mouse_device, "rs232_mouse_hle_rotatable", "Mouse Systems Rotatable Mouse (HLE)")
-DEFINE_DEVICE_TYPE_NS(SGI_HLE_SERIAL_MOUSE, bus::rs232, hle_sgi_mouse_device, "rs232_mouse_hle_sgi", "SGI IRIS Indigo Mouse (HLE)")
+DEFINE_DEVICE_TYPE(MSFT_HLE_SERIAL_MOUSE, bus::rs232::hle_msft_mouse_device, "rs232_mouse_hle_msft", "Microsoft 2-Button Serial Mouse (HLE)")
+DEFINE_DEVICE_TYPE(LOGITECH_HLE_SERIAL_MOUSE, bus::rs232::hle_logitech_mouse_device, "rs232_mouse_hle_logitech", "Logitech 3-Button Serial Mouse (HLE)")
+DEFINE_DEVICE_TYPE(WHEEL_HLE_SERIAL_MOUSE, bus::rs232::hle_wheel_mouse_device, "rs232_mouse_hle_wheel", "Microsoft Serial Mouse with Wheel (HLE)")
+DEFINE_DEVICE_TYPE(MSYSTEMS_HLE_SERIAL_MOUSE, bus::rs232::hle_msystems_mouse_device, "rs232_mouse_hle_msystems", "Mouse Systems Non-rotatable Mouse (HLE)")
+DEFINE_DEVICE_TYPE(ROTATABLE_HLE_SERIAL_MOUSE, bus::rs232::hle_rotatable_mouse_device, "rs232_mouse_hle_rotatable", "Mouse Systems Rotatable Mouse (HLE)")
+DEFINE_DEVICE_TYPE(SGI_HLE_SERIAL_MOUSE, bus::rs232::hle_sgi_mouse_device, "rs232_mouse_hle_sgi", "SGI IRIS Indigo Mouse (HLE)")
namespace bus::rs232 {
diff --git a/src/devices/bus/saitek_osa/expansion.h b/src/devices/bus/saitek_osa/expansion.h
index cb513bf2f4e..f155754cea4 100644
--- a/src/devices/bus/saitek_osa/expansion.h
+++ b/src/devices/bus/saitek_osa/expansion.h
@@ -31,6 +31,8 @@
#include "screen.h"
+DECLARE_DEVICE_TYPE(SAITEKOSA_EXPANSION, saitekosa_expansion_device)
+
//**************************************************************************
// TYPE DEFINITIONS
@@ -122,7 +124,4 @@ protected:
void saitekosa_expansion_modules(device_slot_interface &device);
-// device type definition
-DECLARE_DEVICE_TYPE(SAITEKOSA_EXPANSION, saitekosa_expansion_device)
-
#endif // MAME_BUS_SAITEKOSA_EXPANSION_H
diff --git a/src/devices/bus/saitek_osa/maestro.cpp b/src/devices/bus/saitek_osa/maestro.cpp
index 6e9353ec1d9..fc755dd023c 100644
--- a/src/devices/bus/saitek_osa/maestro.cpp
+++ b/src/devices/bus/saitek_osa/maestro.cpp
@@ -224,7 +224,10 @@ void saitekosa_analyst_device::device_add_mconfig(machine_config &config)
// video hardware
HD44780(config, m_lcd, 0);
m_lcd->set_lcd_size(2, 8);
+}
+void saitekosa_analyst_device::device_config_complete()
+{
auto *screen = subdevice<screen_device>("^screen");
screen->set_size(6 * 16 + 3, 16);
screen->set_visarea_full();
diff --git a/src/devices/bus/saitek_osa/maestro.h b/src/devices/bus/saitek_osa/maestro.h
index b5739789af8..89c580c9ef5 100644
--- a/src/devices/bus/saitek_osa/maestro.h
+++ b/src/devices/bus/saitek_osa/maestro.h
@@ -16,6 +16,9 @@
#include "bus/generic/slot.h"
#include "video/hd44780.h"
+DECLARE_DEVICE_TYPE(OSA_MAESTRO, saitekosa_maestro_device)
+DECLARE_DEVICE_TYPE(OSA_ANALYST, saitekosa_analyst_device)
+
class saitekosa_maestro_device : public device_t, public device_saitekosa_expansion_interface
{
@@ -69,9 +72,12 @@ public:
virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
+ static auto parent_rom_device_type() { return &OSA_MAESTRO; }
+
protected:
virtual const tiny_rom_entry *device_rom_region() const override;
virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_config_complete() override;
private:
required_device<hd44780_device> m_lcd;
@@ -79,8 +85,4 @@ private:
virtual void main_map(address_map &map) override;
};
-
-DECLARE_DEVICE_TYPE(OSA_MAESTRO, saitekosa_maestro_device)
-DECLARE_DEVICE_TYPE(OSA_ANALYST, saitekosa_analyst_device)
-
#endif // MAME_BUS_SAITEKOSA_MAESTRO_H
diff --git a/src/devices/bus/saitek_osa/maestroa.h b/src/devices/bus/saitek_osa/maestroa.h
index 11bb1a26711..35b5744f07d 100644
--- a/src/devices/bus/saitek_osa/maestroa.h
+++ b/src/devices/bus/saitek_osa/maestroa.h
@@ -13,6 +13,8 @@
#include "expansion.h"
+DECLARE_DEVICE_TYPE(OSA_MAESTROA, saitekosa_maestroa_device)
+
class saitekosa_maestroa_device : public device_t, public device_saitekosa_expansion_interface
{
@@ -52,6 +54,4 @@ private:
};
-DECLARE_DEVICE_TYPE(OSA_MAESTROA, saitekosa_maestroa_device)
-
#endif // MAME_BUS_SAITEKOSA_MAESTROA_H
diff --git a/src/devices/bus/saitek_osa/sparc.h b/src/devices/bus/saitek_osa/sparc.h
index 6cc3fcea950..63855ff0a63 100644
--- a/src/devices/bus/saitek_osa/sparc.h
+++ b/src/devices/bus/saitek_osa/sparc.h
@@ -15,6 +15,8 @@
#include "cpu/sparc/sparc.h"
+DECLARE_DEVICE_TYPE(OSA_SPARC, saitekosa_sparc_device)
+
class saitekosa_sparc_device : public device_t, public device_saitekosa_expansion_interface
{
@@ -39,7 +41,4 @@ private:
void main_map(address_map &map);
};
-
-DECLARE_DEVICE_TYPE(OSA_SPARC, saitekosa_sparc_device)
-
#endif // MAME_BUS_SAITEKOSA_SPARC_H
diff --git a/src/devices/bus/scv/slot.cpp b/src/devices/bus/scv/slot.cpp
index 65081801f30..86dc2d810c1 100644
--- a/src/devices/bus/scv/slot.cpp
+++ b/src/devices/bus/scv/slot.cpp
@@ -157,7 +157,7 @@ image_init_result scv_cart_slot_device::call_load()
if (len > 0x20000)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/sega8/sega8_slot.cpp b/src/devices/bus/sega8/sega8_slot.cpp
index 8330fc68915..8a998e71bf0 100644
--- a/src/devices/bus/sega8/sega8_slot.cpp
+++ b/src/devices/bus/sega8/sega8_slot.cpp
@@ -397,7 +397,7 @@ image_init_result sega8_cart_slot_device::call_load()
if (m_is_card && len > 0x8000)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Attempted loading a card larger than 32KB");
+ seterror(image_error::INVALIDIMAGE, "Attempted loading a card larger than 32KB");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/sgikbd/hlekbd.cpp b/src/devices/bus/sgikbd/hlekbd.cpp
index 1ad8632d848..1012651cc7a 100644
--- a/src/devices/bus/sgikbd/hlekbd.cpp
+++ b/src/devices/bus/sgikbd/hlekbd.cpp
@@ -6,7 +6,7 @@
#include "machine/keyboard.ipp"
#include "speaker.h"
-DEFINE_DEVICE_TYPE_NS(SGI_HLE_KEYBOARD, bus::sgikbd, hle_device, "hlekbd", "SGI Indigo Keyboard (HLE)")
+DEFINE_DEVICE_TYPE(SGI_HLE_KEYBOARD, bus::sgikbd::hle_device, "hlekbd", "SGI Indigo Keyboard (HLE)")
namespace bus::sgikbd {
diff --git a/src/devices/bus/snes/rom21.cpp b/src/devices/bus/snes/rom21.cpp
index 8cc1f6fddb6..9bf43d05894 100644
--- a/src/devices/bus/snes/rom21.cpp
+++ b/src/devices/bus/snes/rom21.cpp
@@ -128,8 +128,8 @@ uint8_t sns_rom21_srtc_device::srtc_weekday( uint32_t year, uint32_t month, uint
uint32_t sum = 0; // Number of days passed since epoch
year = std::max(1900U, year);
- month = std::max(1U, std::min(12U, month));
- day = std::max(1U, std::min(31U, day));
+ month = std::clamp(month, 1U, 12U);
+ day = std::clamp(day, 1U, 31U);
while (y < year)
{
diff --git a/src/devices/bus/spectrum/intf2.cpp b/src/devices/bus/spectrum/intf2.cpp
index 7442dfe49a9..afce2005a99 100644
--- a/src/devices/bus/spectrum/intf2.cpp
+++ b/src/devices/bus/spectrum/intf2.cpp
@@ -99,7 +99,7 @@ DEVICE_IMAGE_LOAD_MEMBER(spectrum_intf2_device::cart_load)
if (size != 0x4000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/sunkbd/hlekbd.cpp b/src/devices/bus/sunkbd/hlekbd.cpp
index 055da61233d..1dfe35586fe 100644
--- a/src/devices/bus/sunkbd/hlekbd.cpp
+++ b/src/devices/bus/sunkbd/hlekbd.cpp
@@ -132,19 +132,6 @@
*/
-/***************************************************************************
- DEVICE TYPE GLOBALS
-***************************************************************************/
-
-DEFINE_DEVICE_TYPE_NS(SUN_TYPE3_HLE_KEYBOARD, bus::sunkbd, hle_type3_device, "kbd_type3_hle", "Sun Type 3 Keyboard (HLE)")
-DEFINE_DEVICE_TYPE_NS(SUN_TYPE4_HLE_KEYBOARD, bus::sunkbd, hle_type4_device, "kbd_type4_hle", "Sun Type 4 Keyboard (HLE)")
-DEFINE_DEVICE_TYPE_NS(SUN_TYPE5_HLE_KEYBOARD, bus::sunkbd, hle_type5_device, "kbd_type5_hle_us", "Sun Type 5 Keyboard (U.S.A. - HLE)")
-DEFINE_DEVICE_TYPE_NS(SUN_TYPE5_GB_HLE_KEYBOARD, bus::sunkbd, hle_type5_gb_device, "kbd_type5_hle_gb", "Sun Type 5 Keyboard (Great Britain - HLE)")
-DEFINE_DEVICE_TYPE_NS(SUN_TYPE5_SE_HLE_KEYBOARD, bus::sunkbd, hle_type5_se_device, "kbd_type5_hle_se", "Sun Type 5 Keyboard (Sweden - HLE)")
-DEFINE_DEVICE_TYPE_NS(SUN_TYPE5_JP_HLE_KEYBOARD, bus::sunkbd, hle_type5_jp_device, "kbd_type5_hle_jp", "Sun Type 5 Keyboard (Japan - HLE)")
-
-
-
namespace bus::sunkbd {
namespace {
@@ -728,6 +715,212 @@ INPUT_PORTS_START( hle_type5_jp_device )
PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Kana") PORT_CODE(KEYCODE_RALT) // かな
INPUT_PORTS_END
+
+
+/***************************************************************************
+ BASE TYPE 4/5/6 HLE KEYBOARD DEVICE
+***************************************************************************/
+
+class hle_type4_device_base : public hle_device_base
+{
+protected:
+ using hle_device_base::hle_device_base;
+
+private:
+ // return identification byte for self test pass response
+ virtual uint8_t ident_byte() override
+ {
+ return (m_dips->read() & 0x80U) ? 0x03U : 0x04U;
+ }
+};
+
+
+
+/***************************************************************************
+ TYPE 3 HLE KEYBOARD DEVICE
+***************************************************************************/
+
+class hle_type3_device : public hle_device_base
+{
+public:
+ hle_type3_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_device_base(
+ mconfig,
+ SUN_TYPE3_HLE_KEYBOARD,
+ tag,
+ owner,
+ clock)
+ {
+ }
+
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(hle_type3_device);
+ }
+
+private:
+ // return identification byte for self test pass response
+ virtual uint8_t ident_byte() override
+ {
+ return 0x03U;
+ }
+};
+
+
+
+/***************************************************************************
+ TYPE 4 HLE KEYBOARD DEVICE
+***************************************************************************/
+
+class hle_type4_device : public hle_type4_device_base
+{
+public:
+ hle_type4_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_type4_device_base(
+ mconfig,
+ SUN_TYPE4_HLE_KEYBOARD,
+ tag,
+ owner,
+ clock)
+ {
+ }
+
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(hle_type4_device);
+ }
+};
+
+
+
+/***************************************************************************
+ TYPE 5 HLE KEYBOARD DEVICE
+***************************************************************************/
+
+class hle_type5_device : public hle_type4_device_base
+{
+public:
+ hle_type5_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_type4_device_base(
+ mconfig,
+ SUN_TYPE5_HLE_KEYBOARD,
+ tag,
+ owner,
+ clock)
+ {
+ }
+
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(hle_type5_device);
+ }
+};
+
+
+
+/***************************************************************************
+ TYPE 5 UK HLE KEYBOARD DEVICE
+***************************************************************************/
+
+class hle_type5_gb_device : public hle_type4_device_base
+{
+public:
+ hle_type5_gb_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_type4_device_base(
+ mconfig,
+ SUN_TYPE5_GB_HLE_KEYBOARD,
+ tag,
+ owner,
+ clock)
+ {
+ }
+
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(hle_type5_gb_device);
+ }
+};
+
+
+
+/***************************************************************************
+ TYPE 5 SWEDISH HLE KEYBOARD DEVICE
+***************************************************************************/
+
+class hle_type5_se_device : public hle_type4_device_base
+{
+public:
+ hle_type5_se_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_type4_device_base(
+ mconfig,
+ SUN_TYPE5_SE_HLE_KEYBOARD,
+ tag,
+ owner,
+ clock)
+ {
+ }
+
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(hle_type5_se_device);
+ }
+};
+
+
+
+/***************************************************************************
+ TYPE 5 JAPANESE HLE KEYBOARD DEVICE
+***************************************************************************/
+
+class hle_type5_jp_device : public hle_type4_device_base
+{
+public:
+ hle_type5_jp_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_type4_device_base(
+ mconfig,
+ SUN_TYPE5_JP_HLE_KEYBOARD,
+ tag,
+ owner,
+ clock)
+ {
+ }
+
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(hle_type5_jp_device);
+ }
+};
+
} // anonymous namespace
@@ -1035,249 +1228,17 @@ void hle_device_base::received_byte(uint8_t byte)
}
}
-
-
-/***************************************************************************
- BASE TYPE 4/5/6 HLE KEYBOARD DEVICE
-***************************************************************************/
-
-/*--------------------------------------------------
- hle_type4_device_base::ident_byte
- return identification byte for self test pass
- response
---------------------------------------------------*/
-
-uint8_t hle_type4_device_base::ident_byte()
-{
- return (m_dips->read() & 0x80U) ? 0x03U : 0x04U;
-}
-
-
-
-/***************************************************************************
- TYPE 3 HLE KEYBOARD DEVICE
-***************************************************************************/
-
-/*--------------------------------------------------
- hle_type3_device::hle_type3_device
- abbreviated constructor
---------------------------------------------------*/
-
-hle_type3_device::hle_type3_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock)
- : hle_device_base(
- mconfig,
- SUN_TYPE3_HLE_KEYBOARD,
- tag,
- owner,
- clock)
-{
-}
-
-
-/*--------------------------------------------------
- hle_type3_device::device_input_ports
- get input ports for this device
---------------------------------------------------*/
-
-ioport_constructor hle_type3_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(hle_type3_device);
-}
-
-
-/*--------------------------------------------------
- hle_type3_device::ident_byte
- return identification byte for self test pass
- response
---------------------------------------------------*/
-
-uint8_t hle_type3_device::ident_byte()
-{
- return 0x03U;
-}
-
-
-
-/***************************************************************************
- TYPE 4 HLE KEYBOARD DEVICE
-***************************************************************************/
-
-/*--------------------------------------------------
- hle_type4_device::hle_type4_device
- abbreviated constructor
---------------------------------------------------*/
-
-hle_type4_device::hle_type4_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock)
- : hle_type4_device_base(
- mconfig,
- SUN_TYPE4_HLE_KEYBOARD,
- tag,
- owner,
- clock)
-{
-}
-
-
-/*--------------------------------------------------
- hle_type4_device::device_input_ports
- get input ports for this device
---------------------------------------------------*/
-
-ioport_constructor hle_type4_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(hle_type4_device);
-}
-
-
-
-/***************************************************************************
- TYPE 5 HLE KEYBOARD DEVICE
-***************************************************************************/
-
-/*--------------------------------------------------
- hle_type5_device::hle_type5_device
- abbreviated constructor
---------------------------------------------------*/
-
-hle_type5_device::hle_type5_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock)
- : hle_type4_device_base(
- mconfig,
- SUN_TYPE5_HLE_KEYBOARD,
- tag,
- owner,
- clock)
-{
-}
-
-
-/*--------------------------------------------------
- hle_type5_device::device_input_ports
- get input ports for this device
---------------------------------------------------*/
-
-ioport_constructor hle_type5_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(hle_type5_device);
-}
-
-
-
-/***************************************************************************
- TYPE 5 UK HLE KEYBOARD DEVICE
-***************************************************************************/
-
-/*--------------------------------------------------
- hle_type5_gb_device::hle_type5_gb_device
- abbreviated constructor
---------------------------------------------------*/
-
-hle_type5_gb_device::hle_type5_gb_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock)
- : hle_type4_device_base(
- mconfig,
- SUN_TYPE5_GB_HLE_KEYBOARD,
- tag,
- owner,
- clock)
-{
-}
-
-
-/*--------------------------------------------------
- hle_type5_gb_device::device_input_ports
- get input ports for this device
---------------------------------------------------*/
-
-ioport_constructor hle_type5_gb_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(hle_type5_gb_device);
-}
-
-
-
-/***************************************************************************
- TYPE 5 SWEDISH HLE KEYBOARD DEVICE
-***************************************************************************/
-
-/*--------------------------------------------------
- hle_type5_se_device::hle_type5_se_device
- abbreviated constructor
---------------------------------------------------*/
-
-hle_type5_se_device::hle_type5_se_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock)
- : hle_type4_device_base(
- mconfig,
- SUN_TYPE5_SE_HLE_KEYBOARD,
- tag,
- owner,
- clock)
-{
-}
-
-
-/*--------------------------------------------------
- hle_type5_se_device::device_input_ports
- get input ports for this device
---------------------------------------------------*/
-
-ioport_constructor hle_type5_se_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(hle_type5_se_device);
-}
+} // namespace bus::sunkbd
/***************************************************************************
- TYPE 5 JAPANESE HLE KEYBOARD DEVICE
+ DEVICE TYPE GLOBALS
***************************************************************************/
-/*--------------------------------------------------
- hle_type5_jp_device::hle_type5_jp_device
- abbreviated constructor
---------------------------------------------------*/
-
-hle_type5_jp_device::hle_type5_jp_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock)
- : hle_type4_device_base(
- mconfig,
- SUN_TYPE5_JP_HLE_KEYBOARD,
- tag,
- owner,
- clock)
-{
-}
-
-
-/*--------------------------------------------------
- hle_type5_jp_device::device_input_ports
- get input ports for this device
---------------------------------------------------*/
-
-ioport_constructor hle_type5_jp_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(hle_type5_jp_device);
-}
-
-} // namespace bus::sunkbd
+DEFINE_DEVICE_TYPE_PRIVATE(SUN_TYPE3_HLE_KEYBOARD, bus::sunkbd::hle_device_base, bus::sunkbd::hle_type3_device, "kbd_type3_hle", "Sun Type 3 Keyboard (HLE)")
+DEFINE_DEVICE_TYPE_PRIVATE(SUN_TYPE4_HLE_KEYBOARD, bus::sunkbd::hle_device_base, bus::sunkbd::hle_type4_device, "kbd_type4_hle", "Sun Type 4 Keyboard (HLE)")
+DEFINE_DEVICE_TYPE_PRIVATE(SUN_TYPE5_HLE_KEYBOARD, bus::sunkbd::hle_device_base, bus::sunkbd::hle_type5_device, "kbd_type5_hle_us", "Sun Type 5 Keyboard (U.S.A. - HLE)")
+DEFINE_DEVICE_TYPE_PRIVATE(SUN_TYPE5_GB_HLE_KEYBOARD, bus::sunkbd::hle_device_base, bus::sunkbd::hle_type5_gb_device, "kbd_type5_hle_gb", "Sun Type 5 Keyboard (Great Britain - HLE)")
+DEFINE_DEVICE_TYPE_PRIVATE(SUN_TYPE5_SE_HLE_KEYBOARD, bus::sunkbd::hle_device_base, bus::sunkbd::hle_type5_se_device, "kbd_type5_hle_se", "Sun Type 5 Keyboard (Sweden - HLE)")
+DEFINE_DEVICE_TYPE_PRIVATE(SUN_TYPE5_JP_HLE_KEYBOARD, bus::sunkbd::hle_device_base, bus::sunkbd::hle_type5_jp_device, "kbd_type5_hle_jp", "Sun Type 5 Keyboard (Japan - HLE)")
diff --git a/src/devices/bus/sunkbd/hlekbd.h b/src/devices/bus/sunkbd/hlekbd.h
index 1ed3724653b..39449d89a97 100644
--- a/src/devices/bus/sunkbd/hlekbd.h
+++ b/src/devices/bus/sunkbd/hlekbd.h
@@ -6,6 +6,7 @@
#pragma once
#include "sunkbd.h"
+
#include "machine/keyboard.h"
#include "sound/beep.h"
#include "diserial.h"
@@ -102,111 +103,14 @@ private:
uint8_t m_beeper_state;
};
-
-class hle_type4_device_base : public hle_device_base
-{
-protected:
- using hle_device_base::hle_device_base;
-
-private:
- virtual uint8_t ident_byte() override;
-};
-
-
-class hle_type3_device : public hle_device_base
-{
-public:
- hle_type3_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-
-private:
- virtual uint8_t ident_byte() override;
-};
-
-
-class hle_type4_device : public hle_type4_device_base
-{
-public:
- hle_type4_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-
-class hle_type5_device : public hle_type4_device_base
-{
-public:
- hle_type5_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-
-class hle_type5_gb_device : public hle_type4_device_base
-{
-public:
- hle_type5_gb_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-
-class hle_type5_se_device : public hle_type4_device_base
-{
-public:
- hle_type5_se_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-
-class hle_type5_jp_device : public hle_type4_device_base
-{
-public:
- hle_type5_jp_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
} // namespace bus::sunkbd
-DECLARE_DEVICE_TYPE_NS(SUN_TYPE3_HLE_KEYBOARD, bus::sunkbd, hle_type3_device)
-DECLARE_DEVICE_TYPE_NS(SUN_TYPE4_HLE_KEYBOARD, bus::sunkbd, hle_type4_device)
-DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_HLE_KEYBOARD, bus::sunkbd, hle_type5_device)
-DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_GB_HLE_KEYBOARD, bus::sunkbd, hle_type5_gb_device)
-DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_SE_HLE_KEYBOARD, bus::sunkbd, hle_type5_se_device)
-DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_JP_HLE_KEYBOARD, bus::sunkbd, hle_type5_jp_device)
+DECLARE_DEVICE_TYPE_NS(SUN_TYPE3_HLE_KEYBOARD, bus::sunkbd, hle_device_base)
+DECLARE_DEVICE_TYPE_NS(SUN_TYPE4_HLE_KEYBOARD, bus::sunkbd, hle_device_base)
+DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_HLE_KEYBOARD, bus::sunkbd, hle_device_base)
+DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_GB_HLE_KEYBOARD, bus::sunkbd, hle_device_base)
+DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_SE_HLE_KEYBOARD, bus::sunkbd, hle_device_base)
+DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_JP_HLE_KEYBOARD, bus::sunkbd, hle_device_base)
#endif // MAME_DEVICES_SUNKBD_HLEKBD_H
diff --git a/src/devices/bus/sunmouse/hlemouse.cpp b/src/devices/bus/sunmouse/hlemouse.cpp
index e3d11558f75..3256f171aee 100644
--- a/src/devices/bus/sunmouse/hlemouse.cpp
+++ b/src/devices/bus/sunmouse/hlemouse.cpp
@@ -27,8 +27,8 @@
DEVICE TYPE GLOBALS
***************************************************************************/
-DEFINE_DEVICE_TYPE_NS(SUN_1200BAUD_HLE_MOUSE, bus::sunmouse, hle_1200baud_device, "sunmouse_hle1200", "Sun Mouse (1200 Baud, HLE)")
-DEFINE_DEVICE_TYPE_NS(SUN_4800BAUD_HLE_MOUSE, bus::sunmouse, hle_4800baud_device, "sunmouse_hle4800", "Sun Mouse (4800 Baud, HLE)")
+DEFINE_DEVICE_TYPE(SUN_1200BAUD_HLE_MOUSE, bus::sunmouse::hle_1200baud_device, "sunmouse_hle1200", "Sun Mouse (1200 Baud, HLE)")
+DEFINE_DEVICE_TYPE(SUN_4800BAUD_HLE_MOUSE, bus::sunmouse::hle_4800baud_device, "sunmouse_hle4800", "Sun Mouse (4800 Baud, HLE)")
namespace bus::sunmouse {
@@ -53,7 +53,7 @@ INPUT_PORTS_END
uint8_t extract_delta_byte(int32_t &delta)
{
- int32_t const result(std::min<int32_t>(std::max<int32_t>(delta, -120), 127));
+ int32_t const result(std::clamp<int32_t>(delta, -120, 127));
delta -= result;
return uint8_t(int8_t(result));
}
diff --git a/src/devices/bus/ti8x/bitsocket.cpp b/src/devices/bus/ti8x/bitsocket.cpp
index 7280e081d98..69ce649cefb 100644
--- a/src/devices/bus/ti8x/bitsocket.cpp
+++ b/src/devices/bus/ti8x/bitsocket.cpp
@@ -5,7 +5,7 @@
#include "bitsocket.h"
-DEFINE_DEVICE_TYPE_NS(TI8X_BIT_SOCKET, bus::ti8x, bit_socket_device, "ti8x_bitsock", "TI-8x Bit Socket")
+DEFINE_DEVICE_TYPE(TI8X_BIT_SOCKET, bus::ti8x::bit_socket_device, "ti8x_bitsock", "TI-8x Bit Socket")
namespace bus::ti8x {
diff --git a/src/devices/bus/ti8x/graphlinkhle.cpp b/src/devices/bus/ti8x/graphlinkhle.cpp
index 9368b2ec0bc..b41d67ca50b 100644
--- a/src/devices/bus/ti8x/graphlinkhle.cpp
+++ b/src/devices/bus/ti8x/graphlinkhle.cpp
@@ -5,7 +5,7 @@
#include "graphlinkhle.h"
-DEFINE_DEVICE_TYPE_NS(TI8X_GRAPH_LINK_HLE, bus::ti8x, graph_link_hle_device, "ti8x_glinkhle", "TI-Graph Link (grey, HLE)")
+DEFINE_DEVICE_TYPE(TI8X_GRAPH_LINK_HLE, bus::ti8x::graph_link_hle_device, "ti8x_glinkhle", "TI-Graph Link (grey, HLE)")
namespace bus::ti8x {
diff --git a/src/devices/bus/ti8x/teeconn.cpp b/src/devices/bus/ti8x/teeconn.cpp
index 92b2048a486..9325816735b 100644
--- a/src/devices/bus/ti8x/teeconn.cpp
+++ b/src/devices/bus/ti8x/teeconn.cpp
@@ -5,7 +5,7 @@
#include "teeconn.h"
-DEFINE_DEVICE_TYPE_NS(TI8X_TEE_CONNECTOR, bus::ti8x, tee_connector_device, "ti8x_tconn", "TI-8x T-connector")
+DEFINE_DEVICE_TYPE(TI8X_TEE_CONNECTOR, bus::ti8x::tee_connector_device, "ti8x_tconn", "TI-8x T-connector")
namespace bus::ti8x {
diff --git a/src/devices/bus/ti8x/tispeaker.cpp b/src/devices/bus/ti8x/tispeaker.cpp
index ec0e9865a57..a3fe86d76fd 100644
--- a/src/devices/bus/ti8x/tispeaker.cpp
+++ b/src/devices/bus/ti8x/tispeaker.cpp
@@ -7,8 +7,8 @@
#include "speaker.h"
-DEFINE_DEVICE_TYPE_NS(TI8X_SPEAKER_STEREO, bus::ti8x, stereo_speaker_device, "ti8x_stspkr", "TI-8x Speaker (Stereo)")
-DEFINE_DEVICE_TYPE_NS(TI8X_SPEAKER_MONO, bus::ti8x, mono_speaker_device, "ti8x_mspkr", "TI-8x Speaker (Mono)")
+DEFINE_DEVICE_TYPE(TI8X_SPEAKER_STEREO, bus::ti8x::stereo_speaker_device, "ti8x_stspkr", "TI-8x Speaker (Stereo)")
+DEFINE_DEVICE_TYPE(TI8X_SPEAKER_MONO, bus::ti8x::mono_speaker_device, "ti8x_mspkr", "TI-8x Speaker (Mono)")
namespace bus::ti8x {
diff --git a/src/devices/bus/ti99/colorbus/busmouse.cpp b/src/devices/bus/ti99/colorbus/busmouse.cpp
index 1c3e1dcbac2..ccaf9c66f25 100644
--- a/src/devices/bus/ti99/colorbus/busmouse.cpp
+++ b/src/devices/bus/ti99/colorbus/busmouse.cpp
@@ -23,7 +23,7 @@
#define VERBOSE ( LOG_GENERAL )
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(V9938_BUSMOUSE, bus::ti99::colorbus, v9938_busmouse_device, "v9938_busmouse", "V9938 Bus Mouse")
+DEFINE_DEVICE_TYPE(V9938_BUSMOUSE, bus::ti99::colorbus::v9938_busmouse_device, "v9938_busmouse", "V9938 Bus Mouse")
namespace bus::ti99::colorbus {
diff --git a/src/devices/bus/ti99/colorbus/colorbus.cpp b/src/devices/bus/ti99/colorbus/colorbus.cpp
index 8d3dbf23071..e3decb6ba61 100644
--- a/src/devices/bus/ti99/colorbus/colorbus.cpp
+++ b/src/devices/bus/ti99/colorbus/colorbus.cpp
@@ -21,7 +21,7 @@
#include "colorbus.h"
#include "busmouse.h"
-DEFINE_DEVICE_TYPE_NS(V9938_COLORBUS, bus::ti99::colorbus, v9938_colorbus_device, "v9938_colorbus", "V9938 Color bus")
+DEFINE_DEVICE_TYPE(V9938_COLORBUS, bus::ti99::colorbus::v9938_colorbus_device, "v9938_colorbus", "V9938 Color bus")
namespace bus::ti99::colorbus {
diff --git a/src/devices/bus/ti99/gromport/cartridges.cpp b/src/devices/bus/ti99/gromport/cartridges.cpp
index 20831395a0c..7a9ccb95a6d 100644
--- a/src/devices/bus/ti99/gromport/cartridges.cpp
+++ b/src/devices/bus/ti99/gromport/cartridges.cpp
@@ -16,6 +16,7 @@
#include "cartridges.h"
#include "corestr.h"
+#include "formats/rpk.h"
#define LOG_WARN (1U<<1) // Warnings
#define LOG_CONFIG (1U<<2) // Configuration
@@ -31,7 +32,7 @@
#define VERBOSE ( LOG_GENERAL | LOG_WARN )
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_CART, bus::ti99::gromport, ti99_cartridge_device, "ti99cart", "TI-99 cartridge")
+DEFINE_DEVICE_TYPE(TI99_CART, bus::ti99::gromport::ti99_cartridge_device, "ti99cart", "TI-99 cartridge")
namespace bus::ti99::gromport {
@@ -59,21 +60,21 @@ enum
PCB_PAGED7
};
-static const pcb_type pcbdefs[] =
-{
- { PCB_STANDARD, "standard" },
- { PCB_PAGED12K, "paged12k" },
- { PCB_PAGED16K, "paged" },
- { PCB_MINIMEM, "minimem" },
- { PCB_SUPER, "super" },
- { PCB_MBX, "mbx" },
- { PCB_PAGED379I, "paged379i" },
- { PCB_PAGED378, "paged378" },
- { PCB_PAGED377, "paged377" },
- { PCB_PAGEDCRU, "pagedcru" },
- { PCB_GROMEMU, "gromemu" },
- { PCB_PAGED7, "paged7" },
- { 0, nullptr}
+static char const *const pcbdefs[] =
+{
+ "standard", // PCB_STANDARD
+ "paged12k", // PCB_PAGED12K
+ "paged", // PCB_PAGED16K
+ "minimem", // PCB_MINIMEM
+ "super", // PCB_SUPER
+ "mbx", // PCB_MBX
+ "paged379i", // PCB_PAGED379I
+ "paged378", // PCB_PAGED378
+ "paged377", // PCB_PAGED377
+ "pagedcru", // PCB_PAGEDCRU
+ "gromemu", // PCB_GROMEMU
+ "paged7", // PCB_PAGED7
+ nullptr
};
static const pcb_type sw_pcbdefs[] =
@@ -95,8 +96,7 @@ ti99_cartridge_device::ti99_cartridge_device(const machine_config &mconfig, cons
m_pcbtype(0),
m_slot(0),
m_pcb(nullptr),
- m_connector(nullptr),
- m_rpk(nullptr)
+ m_connector(nullptr)
{
}
@@ -253,23 +253,19 @@ image_init_result ti99_cartridge_device::call_load()
i++;
} while (sw_pcbdefs[i].id != 0);
LOGMASKED(LOG_CONFIG, "Cartridge type is %s (%d)\n", pcb, m_pcbtype);
- m_rpk = nullptr;
+ m_rpk.reset();
}
else
{
- auto reader = std::make_unique<rpk_reader>(pcbdefs);
- try
- {
- m_rpk = reader->open(machine().options(), filename(), machine().system().name);
- m_pcbtype = m_rpk->get_type();
- }
- catch (rpk_exception& err)
+ std::error_condition err = rpk_open(machine().options(), util::core_file_read(image_core_file()), machine().system().name, m_rpk);
+ if (err)
{
- LOGMASKED(LOG_WARN, "Failed to load cartridge '%s': %s\n", basename(), err.to_string().c_str());
- m_rpk = nullptr;
- m_err = IMAGE_ERROR_INVALIDIMAGE;
+ LOGMASKED(LOG_WARN, "Failed to load cartridge '%s': %s\n", basename(), err.message().c_str());
+ m_rpk.reset();
+ m_err = image_error::INVALIDIMAGE;
return image_init_result::FAIL;
}
+ m_pcbtype = m_rpk->get_type();
}
switch (m_pcbtype)
@@ -338,7 +334,7 @@ void ti99_cartridge_device::call_unload()
if (m_rpk != nullptr)
{
m_rpk->close(); // will write NVRAM contents
- delete m_rpk;
+ m_rpk.reset();
}
else
{
@@ -1447,47 +1443,6 @@ void ti99_gromemu_cartridge::gromemuwrite(offs_t offset, uint8_t data)
RPK loader
- RPK format support
-
- A RPK file ("rompack") contains a collection of dump files and a layout
- file that defines the kind of circuit board (PCB) used in the cartridge
- and the mapping of dumps to sockets on the board.
-
-Example:
- <?xml version="1.0" encoding="utf-8"?>
- <romset>
- <resources>
- <rom id="gromimage" file="ed-assmg.bin" />
- </resources>
- <configuration>
- <pcb type="standard">
- <socket id="grom_socket" uses="gromimage"/>
- </pcb>
- </configuration>
- </romset>
-
-DTD:
- <!ELEMENT romset (resources, configuration)>
- <!ELEMENT resources (rom|ram)+>
- <!ELEMENT rom EMPTY>
- <!ELEMENT ram EMPTY>
- <!ELEMENT configuration (pcb)>
- <!ELEMENT pcb (socket)+>
- <!ELEMENT socket EMPTY>
- <!ATTLIST romset version CDATA #IMPLIED>
- <!ATTLIST rom id ID #REQUIRED
- <!ATTLIST rom file CDATA #REQUIRED>
- <!ATTLIST rom crc CDATA #IMPLIED>
- <!ATTLIST rom sha1 CDATA #IMPLIED>
- <!ATTLIST ram id ID #REQUIRED>
- <!ATTLIST ram type (volatile|persistent) #IMPLIED>
- <!ATTLIST ram store (internal|external) #IMPLIED>
- <!ATTLIST ram file CDATA #IMPLIED>
- <!ATTLIST ram length CDATA #REQUIRED>
- <!ATTLIST pcb type CDATA #REQUIRED>
- <!ATTLIST socket id ID #REQUIRED>
- <!ATTLIST socket uses IDREF #REQUIRED>
-
****************************************************************************/
#undef LOG_OUTPUT_FUNC
@@ -1531,7 +1486,7 @@ int ti99_cartridge_device::rpk::get_resource_length(const char *socket_name)
return socket->second->get_content_length();
}
-void ti99_cartridge_device::rpk::add_socket(const char* id, std::unique_ptr<rpk_socket> newsock)
+void ti99_cartridge_device::rpk::add_socket(const char* id, std::unique_ptr<ti99_rpk_socket> &&newsock)
{
m_sockets.emplace(id, std::move(newsock));
}
@@ -1553,8 +1508,8 @@ void ti99_cartridge_device::rpk::close()
throw emu_fatalerror("ti99_cartridge_device::rpk::close: Buffer is null or length is 0");
emu_file file(m_options.nvram_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr = file.open(socket.second->get_pathname());
- if (filerr == osd_file::error::NONE)
+ std::error_condition const filerr = file.open(socket.second->get_pathname());
+ if (!filerr)
file.write(socket.second->get_contents(), socket.second->get_content_length());
}
@@ -1567,178 +1522,68 @@ void ti99_cartridge_device::rpk::close()
not a network socket)
***************************************************************/
-ti99_cartridge_device::rpk_socket::rpk_socket(const char* id, int length, std::unique_ptr<uint8_t []> &&contents, std::string &&pathname)
+ti99_cartridge_device::ti99_rpk_socket::ti99_rpk_socket(const char* id, int length, std::vector<uint8_t> &&contents, std::string &&pathname)
: m_id(id), m_length(length), m_contents(std::move(contents)), m_pathname(std::move(pathname))
{
}
-ti99_cartridge_device::rpk_socket::rpk_socket(const char* id, int length, std::unique_ptr<uint8_t []> &&contents)
- : rpk_socket(id, length, std::move(contents), "")
-{
-}
-
-/*
- Locate a file in the ZIP container
-*/
-int ti99_cartridge_device::rpk_reader::find_file(util::archive_file &zip, const char *filename, uint32_t crc)
+ti99_cartridge_device::ti99_rpk_socket::ti99_rpk_socket(const char* id, int length, std::vector<uint8_t> &&contents)
+ : ti99_rpk_socket(id, length, std::move(contents), "")
{
- for (int header = zip.first_file(); header >= 0; header = zip.next_file())
- {
- // Ignore directories
- if (!zip.current_is_directory())
- {
- // We don't check for CRC == 0.
- if (crc != 0)
- {
- // if the CRC and name both match, we're good
- // if the CRC matches and the name doesn't, we're still good
- if (zip.current_crc() == crc)
- return header;
- }
- else
- {
- if (core_stricmp(zip.current_name().c_str(), filename) == 0)
- {
- return header;
- }
- }
- }
- }
- return -1;
}
/*
Load a rom resource and put it in a pcb socket instance.
*/
-std::unique_ptr<ti99_cartridge_device::rpk_socket> ti99_cartridge_device::rpk_reader::load_rom_resource(util::archive_file &zip, util::xml::data_node const* rom_resource_node, const char* socketname)
+std::error_condition ti99_cartridge_device::rpk_load_rom_resource(const rpk_socket &socket, std::unique_ptr<ti99_rpk_socket> &result)
{
- // find the file attribute (required)
- std::string const *const file = rom_resource_node->get_attribute_string_ptr("file");
- if (file == nullptr) throw rpk_exception(RPK_INVALID_LAYOUT, "<rom> must have a 'file' attribute");
-
- LOGMASKED(LOG_RPK, "[RPK handler] Loading ROM contents for socket '%s' from file %s\n", socketname, *file);
+ LOGMASKED(LOG_RPK, "[RPK handler] Loading ROM contents for socket '%s' from file %s\n", socket.id(), socket.filename());
- // check for crc
- std::string const *const crcstr = rom_resource_node->get_attribute_string_ptr("crc");
- int header;
- if (crcstr==nullptr)
- {
- // no CRC, just find the file in the RPK
- header = find_file(zip, file->c_str(), 0);
- }
- else
- {
- uint32_t crc = strtoul(crcstr->c_str(), nullptr, 16);
- header = find_file(zip, file->c_str(), crc);
- }
- if (header < 0) throw rpk_exception(RPK_INVALID_FILE_REF, "File not found or CRC check failed");
-
- int length = zip.current_uncompressed_length();
-
- // Allocate storage
- std::unique_ptr<uint8_t []> contents;
- try { contents = make_unique_clear<uint8_t []>(length); }
- catch (std::bad_alloc const &) { throw rpk_exception(RPK_OUT_OF_MEMORY); }
-
- // and unzip file from the zip file
- util::archive_file::error ziperr = zip.decompress(contents.get(), length);
- if (ziperr != util::archive_file::error::NONE)
- {
- if (ziperr == util::archive_file::error::UNSUPPORTED) throw rpk_exception(RPK_ZIP_UNSUPPORTED);
- else throw rpk_exception(RPK_ZIP_ERROR);
- }
-
- // check for sha1
- std::string const *const sha1 = rom_resource_node->get_attribute_string_ptr("sha1");
- if (sha1 != nullptr)
- {
- util::hash_collection actual_hashes;
- actual_hashes.compute(contents.get(), length, util::hash_collection::HASH_TYPES_CRC_SHA1);
-
- util::hash_collection expected_hashes;
- expected_hashes.add_from_string(util::hash_collection::HASH_SHA1, *sha1);
-
- if (actual_hashes != expected_hashes) throw rpk_exception(RPK_INVALID_FILE_REF, "SHA1 check failed");
- }
+ std::vector<uint8_t> contents;
+ std::error_condition err = socket.read_file(contents);
+ if (err)
+ return err;
// Create a socket instance
- return std::make_unique<rpk_socket>(socketname, length, std::move(contents));
+ result = std::make_unique<ti99_rpk_socket>(socket.id().c_str(), contents.size(), std::move(contents));
+ return std::error_condition();
}
/*
Load a ram resource and put it in a pcb socket instance.
*/
-std::unique_ptr<ti99_cartridge_device::rpk_socket> ti99_cartridge_device::rpk_reader::load_ram_resource(emu_options &options, util::xml::data_node const* ram_resource_node, const char* socketname, const char* system_name)
+std::unique_ptr<ti99_cartridge_device::ti99_rpk_socket> ti99_cartridge_device::rpk_load_ram_resource(emu_options &options, const rpk_socket &socket, const char *system_name)
{
- // find the length attribute
- std::string const *const length_string = ram_resource_node->get_attribute_string_ptr("length");
- if (length_string == nullptr) throw rpk_exception(RPK_MISSING_RAM_LENGTH);
-
- // parse it
- unsigned int length;
- char suffix = '\0';
- sscanf(length_string->c_str(), "%u%c", &length, &suffix);
- switch(tolower(suffix))
- {
- case 'k': // kilobytes
- length *= 1024;
- break;
-
- case 'm':
- /* megabytes */
- length *= 1024*1024;
- break;
-
- case '\0':
- break;
-
- default: // failed
- throw rpk_exception(RPK_INVALID_RAM_SPEC);
- }
-
// Allocate memory for this resource
- std::unique_ptr<uint8_t []> contents;
- try { contents = make_unique_clear<uint8_t []>(length); }
- catch (std::bad_alloc const &) { throw rpk_exception(RPK_OUT_OF_MEMORY); }
+ std::vector<uint8_t> contents;
+ contents.resize(socket.length());
+ std::fill(contents.begin(), contents.end(), 0);
- LOGMASKED(LOG_RPK, "[RPK handler] Allocating RAM buffer (%d bytes) for socket '%s'\n", length, socketname);
+ LOGMASKED(LOG_RPK, "[RPK handler] Allocating RAM buffer (%d bytes) for socket '%s'\n", socket.length(), socket.id());
// That's it for pure RAM. Now check whether the RAM is "persistent", i.e. NVRAM.
// In that case we must load it from the NVRAM directory.
// The file name is given in the RPK file; the subdirectory is the system name.
- std::string const *const ram_type = ram_resource_node->get_attribute_string_ptr("type");
std::string ram_pname;
- if (ram_type != nullptr)
+ if (socket.type() == rpk_socket::socket_type::PERSISTENT_RAM)
{
- if (*ram_type == "persistent")
- {
- // Get the file name (required if persistent)
- std::string const *const ram_filename = ram_resource_node->get_attribute_string_ptr("file");
- if (ram_filename==nullptr)
- throw rpk_exception(RPK_INVALID_RAM_SPEC, "<ram type='persistent'> must have a 'file' attribute");
-
- ram_pname = std::string(system_name).append(PATH_SEPARATOR).append(*ram_filename);
- // load, and fill rest with 00
- LOGMASKED(LOG_RPK, "[RPK handler] Loading NVRAM contents from '%s'\n", ram_pname.c_str());
-
- // Load the NVRAM contents
- if (!contents || (length <= 0))
- throw emu_fatalerror("ti99_cartridge_device::rpk_reader::load_ram_resource: Buffer is null or length is 0");
-
- // try to open the battery file and read it if possible
- emu_file file(options.nvram_directory(), OPEN_FLAG_READ);
- osd_file::error filerr = file.open(ram_pname);
- int bytes_read = 0;
- if (filerr == osd_file::error::NONE)
- bytes_read = file.read(contents.get(), length);
-
- // fill remaining bytes (if necessary)
- std::fill_n(&contents[bytes_read], length - bytes_read, 0x00);
- }
+ ram_pname = std::string(system_name).append(PATH_SEPARATOR).append(socket.filename());
+ // load, and fill rest with 00
+ LOGMASKED(LOG_RPK, "[RPK handler] Loading NVRAM contents from '%s'\n", ram_pname);
+
+ // try to open the battery file and read it if possible
+ emu_file file(options.nvram_directory(), OPEN_FLAG_READ);
+ std::error_condition const filerr = file.open(ram_pname);
+ int bytes_read = 0;
+ if (!filerr)
+ bytes_read = file.read(&contents[0], contents.size());
+
+ // fill remaining bytes (if necessary)
+ std::fill_n(&contents[bytes_read], contents.size() - bytes_read, 0x00);
}
// Create a socket instance
- return std::make_unique<rpk_socket>(socketname, length, std::move(contents), std::move(ram_pname));
+ return std::make_unique<ti99_rpk_socket>(socket.id().c_str(), socket.length(), std::move(contents), std::move(ram_pname));
}
/*-------------------------------------------------
@@ -1747,126 +1592,47 @@ std::unique_ptr<ti99_cartridge_device::rpk_socket> ti99_cartridge_device::rpk_re
system_name - name of the driver (also just for NVRAM handling)
-------------------------------------------------*/
-ti99_cartridge_device::rpk* ti99_cartridge_device::rpk_reader::open(emu_options &options, const char *filename, const char *system_name)
+std::error_condition ti99_cartridge_device::rpk_open(emu_options &options, std::unique_ptr<util::random_read> &&stream, const char *system_name, std::unique_ptr<rpk> &result)
{
- util::archive_file::error ziperr;
+ std::unique_ptr<rpk> newrpk = std::make_unique<rpk>(options, system_name);
- util::archive_file::ptr zipfile;
+ rpk_reader reader(pcbdefs, true);
- std::vector<char> layout_text;
-
- int i;
+ // open the RPK
+ rpk_file::ptr file;
+ std::error_condition err = reader.read(std::move(stream), file);
+ if (err)
+ return err;
- auto newrpk = new rpk(options, system_name);
+ // specify the PCB
+ newrpk->m_type = file->pcb_type() + 1;
+ LOGMASKED(LOG_RPK, "[RPK handler] Cartridge says it has PCB type '%s'\n", pcbdefs[file->pcb_type()]);
- try
+ for (const rpk_socket &socket : file->sockets())
{
- /* open the ZIP file */
- ziperr = util::archive_file::open_zip(filename, zipfile);
- if (ziperr != util::archive_file::error::NONE) throw rpk_exception(RPK_NOT_ZIP_FORMAT);
-
- /* find the layout.xml file */
- if (find_file(*zipfile, "layout.xml", 0) < 0) throw rpk_exception(RPK_MISSING_LAYOUT);
-
- /* reserve space for the layout file contents (+1 for the termination) */
- layout_text.resize(zipfile->current_uncompressed_length() + 1);
-
- /* uncompress the layout text */
- ziperr = zipfile->decompress(&layout_text[0], zipfile->current_uncompressed_length());
- if (ziperr != util::archive_file::error::NONE)
- {
- if (ziperr == util::archive_file::error::UNSUPPORTED) throw rpk_exception(RPK_ZIP_UNSUPPORTED);
- else throw rpk_exception(RPK_ZIP_ERROR);
- }
+ std::unique_ptr<ti99_rpk_socket> ti99_socket;
- layout_text[zipfile->current_uncompressed_length()] = '\0'; // Null-terminate
-
- /* parse the layout text */
- util::xml::file::ptr const layout_xml = util::xml::file::string_read(&layout_text[0], nullptr);
- if (!layout_xml) throw rpk_exception(RPK_XML_ERROR);
-
- // Now we work within the XML tree
-
- // romset is the root node
- util::xml::data_node const *const romset_node = layout_xml->get_child("romset");
- if (!romset_node) throw rpk_exception(RPK_INVALID_LAYOUT, "document element must be <romset>");
-
- // resources is a child of romset
- util::xml::data_node const *const resources_node = romset_node->get_child("resources");
- if (!resources_node) throw rpk_exception(RPK_INVALID_LAYOUT, "<romset> must have a <resources> child");
-
- // configuration is a child of romset; we're actually interested in ...
- util::xml::data_node const *const configuration_node = romset_node->get_child("configuration");
- if (!configuration_node) throw rpk_exception(RPK_INVALID_LAYOUT, "<romset> must have a <configuration> child");
-
- // ... pcb, which is a child of configuration
- util::xml::data_node const *const pcb_node = configuration_node->get_child("pcb");
- if (!pcb_node) throw rpk_exception(RPK_INVALID_LAYOUT, "<configuration> must have a <pcb> child");
-
- // We'll try to find the PCB type on the provided type list.
- std::string const *const pcb_type = pcb_node->get_attribute_string_ptr("type");
- if (!pcb_type) throw rpk_exception(RPK_INVALID_LAYOUT, "<pcb> must have a 'type' attribute");
- LOGMASKED(LOG_RPK, "[RPK handler] Cartridge says it has PCB type '%s'\n", *pcb_type);
-
- i=0;
- do
+ switch (socket.type())
{
- if (*pcb_type == m_types[i].name)
- {
- newrpk->m_type = m_types[i].id;
- break;
- }
- i++;
- } while (m_types[i].id != 0);
+ case rpk_socket::socket_type::ROM:
+ err = rpk_load_rom_resource(socket, ti99_socket);
+ if (err)
+ return err;
+ newrpk->add_socket(socket.id().c_str(), std::move(ti99_socket));
+ break;
- if (m_types[i].id==0) throw rpk_exception(RPK_UNKNOWN_PCB_TYPE);
+ case rpk_socket::socket_type::RAM:
+ case rpk_socket::socket_type::PERSISTENT_RAM:
+ newrpk->add_socket(socket.id().c_str(), rpk_load_ram_resource(options, socket, system_name));
+ break;
- // Find the sockets and load their respective resource
- for (util::xml::data_node const *socket_node = pcb_node->get_first_child(); socket_node != nullptr; socket_node = socket_node->get_next_sibling())
- {
- if (strcmp(socket_node->get_name(), "socket")!=0) throw rpk_exception(RPK_INVALID_LAYOUT, "<pcb> element has only <socket> children");
- std::string const *const id = socket_node->get_attribute_string_ptr("id");
- if (!id) throw rpk_exception(RPK_INVALID_LAYOUT, "<socket> must have an 'id' attribute");
- std::string const *const uses_name = socket_node->get_attribute_string_ptr("uses");
- if (!uses_name) throw rpk_exception(RPK_INVALID_LAYOUT, "<socket> must have a 'uses' attribute");
-
- bool found = false;
- // Locate the resource node
- for (util::xml::data_node const *resource_node = resources_node->get_first_child(); resource_node != nullptr; resource_node = resource_node->get_next_sibling())
- {
- std::string const *const resource_name = resource_node->get_attribute_string_ptr("id");
- if (!resource_name) throw rpk_exception(RPK_INVALID_LAYOUT, "resource node must have an 'id' attribute");
-
- if (*resource_name == *uses_name)
- {
- // found it
- if (strcmp(resource_node->get_name(), "rom")==0)
- {
- newrpk->add_socket(id->c_str(), load_rom_resource(*zipfile, resource_node, id->c_str()));
- }
- else
- {
- if (strcmp(resource_node->get_name(), "ram")==0)
- {
- newrpk->add_socket(id->c_str(), load_ram_resource(options, resource_node, id->c_str(), system_name));
- }
- else throw rpk_exception(RPK_INVALID_LAYOUT, "resource node must be <rom> or <ram>");
- }
- found = true;
- }
- }
- if (!found) throw rpk_exception(RPK_INVALID_RESOURCE_REF, uses_name->c_str());
+ default:
+ throw false;
}
}
- catch (rpk_exception &)
- {
- newrpk->close();
-
- // rethrow the exception
- throw;
- }
- return newrpk;
+ result = std::move(newrpk);
+ return std::error_condition();
}
} // end namespace bus::ti99::gromport
diff --git a/src/devices/bus/ti99/gromport/cartridges.h b/src/devices/bus/ti99/gromport/cartridges.h
index db2de6b2672..ccf8773c79b 100644
--- a/src/devices/bus/ti99/gromport/cartridges.h
+++ b/src/devices/bus/ti99/gromport/cartridges.h
@@ -8,56 +8,20 @@
#pragma once
-#include "emuopts.h"
+#include "gromport.h"
+
#include "machine/tmc0430.h"
+#include "formats/rpk.h"
+
+#include "emuopts.h"
#include "softlist_dev.h"
-#include "gromport.h"
-#include "unzip.h"
-#include "xmlfile.h"
-namespace bus::ti99::gromport {
+#include "utilfwd.h"
-class ti99_cartridge_pcb;
-enum rpk_open_error
-{
- RPK_OK,
- RPK_NOT_ZIP_FORMAT,
- RPK_CORRUPT,
- RPK_OUT_OF_MEMORY,
- RPK_XML_ERROR,
- RPK_INVALID_FILE_REF,
- RPK_ZIP_ERROR,
- RPK_ZIP_UNSUPPORTED,
- RPK_MISSING_RAM_LENGTH,
- RPK_INVALID_RAM_SPEC,
- RPK_UNKNOWN_RESOURCE_TYPE,
- RPK_INVALID_RESOURCE_REF,
- RPK_INVALID_LAYOUT,
- RPK_MISSING_LAYOUT,
- RPK_NO_PCB_OR_RESOURCES,
- RPK_UNKNOWN_PCB_TYPE
-};
+namespace bus::ti99::gromport {
-const char *const error_text[16] =
-{
- "No error",
- "Not a RPK (zip) file",
- "Module definition corrupt",
- "Out of memory",
- "XML format error",
- "Invalid file reference",
- "Zip file error",
- "Unsupported zip version",
- "Missing RAM length",
- "Invalid RAM specification",
- "Unknown resource type",
- "Invalid resource reference",
- "layout.xml not valid",
- "Missing layout",
- "No pcb or resource found",
- "Unknown pcb type"
-};
+class ti99_cartridge_pcb;
class ti99_cartridge_device : public device_t, public device_image_interface
{
@@ -105,50 +69,16 @@ protected:
private:
- /***************** RPK support ********************
- Actually deprecated, and to be removed as soon as
- softlists allow for homebrew cartridges
- ***************************************************/
-
- class rpk_socket;
+ class ti99_rpk_socket;
class rpk;
- class rpk_exception
- {
- public:
- rpk_exception(rpk_open_error value): m_err(value), m_detail(nullptr) { }
- rpk_exception(rpk_open_error value, const char* detail) : m_err(value), m_detail(detail) { }
-
- std::string to_string()
- {
- std::string errmsg(error_text[(int)m_err]);
- if (m_detail==nullptr)
- return errmsg;
- return errmsg.append(": ").append(m_detail);
- }
-
- private:
- rpk_open_error m_err;
- const char* m_detail;
- };
-
- class rpk_reader
- {
- public:
- rpk_reader(const pcb_type *types) : m_types(types) { }
-
- rpk *open(emu_options &options, const char *filename, const char *system_name);
-
- private:
- int find_file(util::archive_file &zip, const char *filename, uint32_t crc);
- std::unique_ptr<rpk_socket> load_rom_resource(util::archive_file &zip, util::xml::data_node const* rom_resource_node, const char* socketname);
- std::unique_ptr<rpk_socket> load_ram_resource(emu_options &options, util::xml::data_node const* ram_resource_node, const char* socketname, const char* system_name);
- const pcb_type* m_types;
- };
+ static std::error_condition rpk_open(emu_options &options, std::unique_ptr<util::random_read> &&stream, const char *system_name, std::unique_ptr<rpk> &result);
+ static std::error_condition rpk_load_rom_resource(const rpk_socket &socket, std::unique_ptr<ti99_rpk_socket> &result);
+ static std::unique_ptr<ti99_rpk_socket> rpk_load_ram_resource(emu_options &options, const rpk_socket &socket, const char *system_name);
class rpk
{
- friend class rpk_reader;
+ friend class ti99_cartridge_device;
public:
rpk(emu_options& options, const char* sysname);
~rpk();
@@ -162,29 +92,29 @@ private:
emu_options& m_options; // need this to find the path to the nvram files
int m_type;
//const char* m_system_name; // need this to find the path to the nvram files
- std::unordered_map<std::string,std::unique_ptr<rpk_socket>> m_sockets;
+ std::unordered_map<std::string,std::unique_ptr<ti99_rpk_socket>> m_sockets;
- void add_socket(const char* id, std::unique_ptr<rpk_socket> newsock);
+ void add_socket(const char* id, std::unique_ptr<ti99_rpk_socket> &&newsock);
};
- class rpk_socket
+ class ti99_rpk_socket
{
public:
- rpk_socket(const char *id, int length, std::unique_ptr<uint8_t []> &&contents);
- rpk_socket(const char *id, int length, std::unique_ptr<uint8_t []> &&contents, std::string &&pathname);
- ~rpk_socket() {}
+ ti99_rpk_socket(const char *id, int length, std::vector<uint8_t> &&contents);
+ ti99_rpk_socket(const char *id, int length, std::vector<uint8_t> &&contents, std::string &&pathname);
+ ~ti99_rpk_socket() {}
const char* id() { return m_id; }
int get_content_length() { return m_length; }
- uint8_t* get_contents() { return m_contents.get(); }
+ uint8_t* get_contents() { return &m_contents[0]; }
bool persistent_ram() { return !m_pathname.empty(); }
const char* get_pathname() { return m_pathname.c_str(); }
- void cleanup() { m_contents.reset(); }
+ void cleanup() { m_contents.clear(); }
private:
const char* m_id;
uint32_t m_length;
- std::unique_ptr<uint8_t []> m_contents;
+ std::vector<uint8_t> m_contents;
const std::string m_pathname;
};
@@ -198,7 +128,7 @@ private:
// RPK which is associated to this cartridge
// When we close it, the contents are saved to NVRAM if available
- rpk *m_rpk;
+ std::unique_ptr<rpk> m_rpk;
};
/****************************************************************************/
diff --git a/src/devices/bus/ti99/gromport/gkracker.cpp b/src/devices/bus/ti99/gromport/gkracker.cpp
index 91544460541..37f13623575 100644
--- a/src/devices/bus/ti99/gromport/gkracker.cpp
+++ b/src/devices/bus/ti99/gromport/gkracker.cpp
@@ -104,7 +104,7 @@
#define VERBOSE ( LOG_WARN )
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_GROMPORT_GK, bus::ti99::gromport, ti99_gkracker_device, "ti99_gkracker", "Miller's Graphics GRAM Kracker")
+DEFINE_DEVICE_TYPE(TI99_GROMPORT_GK, bus::ti99::gromport::ti99_gkracker_device, "ti99_gkracker", "Miller's Graphics GRAM Kracker")
namespace bus::ti99::gromport {
diff --git a/src/devices/bus/ti99/gromport/gromport.cpp b/src/devices/bus/ti99/gromport/gromport.cpp
index 0fb1ff03e65..1a53362416c 100644
--- a/src/devices/bus/ti99/gromport/gromport.cpp
+++ b/src/devices/bus/ti99/gromport/gromport.cpp
@@ -121,7 +121,7 @@
#define VERBOSE ( LOG_WARN )
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_GROMPORT, bus::ti99::gromport, gromport_device, "gromport", "TI-99 Cartridge port")
+DEFINE_DEVICE_TYPE(TI99_GROMPORT, bus::ti99::gromport::gromport_device, "gromport", "TI-99 Cartridge port")
namespace bus::ti99::gromport {
diff --git a/src/devices/bus/ti99/gromport/multiconn.cpp b/src/devices/bus/ti99/gromport/multiconn.cpp
index f5b948143b0..595a6ab1a29 100644
--- a/src/devices/bus/ti99/gromport/multiconn.cpp
+++ b/src/devices/bus/ti99/gromport/multiconn.cpp
@@ -49,7 +49,7 @@
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_GROMPORT_MULTI, bus::ti99::gromport, ti99_multi_cart_conn_device, "ti99_mcartconn", "TI-99 Multi-cartridge extender")
+DEFINE_DEVICE_TYPE(TI99_GROMPORT_MULTI, bus::ti99::gromport::ti99_multi_cart_conn_device, "ti99_mcartconn", "TI-99 Multi-cartridge extender")
namespace bus::ti99::gromport {
diff --git a/src/devices/bus/ti99/gromport/singleconn.cpp b/src/devices/bus/ti99/gromport/singleconn.cpp
index ce07dba59f5..e24a3ba416a 100644
--- a/src/devices/bus/ti99/gromport/singleconn.cpp
+++ b/src/devices/bus/ti99/gromport/singleconn.cpp
@@ -9,7 +9,7 @@
#include "emu.h"
#include "singleconn.h"
-DEFINE_DEVICE_TYPE_NS(TI99_GROMPORT_SINGLE, bus::ti99::gromport, ti99_single_cart_conn_device, "ti99_scartconn", "TI-99 Standard cartridge connector")
+DEFINE_DEVICE_TYPE(TI99_GROMPORT_SINGLE, bus::ti99::gromport::ti99_single_cart_conn_device, "ti99_scartconn", "TI-99 Standard cartridge connector")
namespace bus::ti99::gromport {
diff --git a/src/devices/bus/ti99/internal/992board.cpp b/src/devices/bus/ti99/internal/992board.cpp
index f3b0d586a44..8a12db86cbd 100644
--- a/src/devices/bus/ti99/internal/992board.cpp
+++ b/src/devices/bus/ti99/internal/992board.cpp
@@ -129,13 +129,13 @@
[2] VDC Controller CF40052
*/
-DEFINE_DEVICE_TYPE_NS(VIDEO99224, bus::ti99::internal, video992_24_device, "video992_24", "TI-99/2 CRT Controller 24K version")
-DEFINE_DEVICE_TYPE_NS(VIDEO99232, bus::ti99::internal, video992_32_device, "video992_32", "TI-99/2 CRT Controller 32K version")
-DEFINE_DEVICE_TYPE_NS(IO99224, bus::ti99::internal, io992_24_device, "io992_24", "TI-99/2 I/O controller 24K version")
-DEFINE_DEVICE_TYPE_NS(IO99232, bus::ti99::internal, io992_32_device, "io992_32", "TI-99/2 I/O controller 32K version")
+DEFINE_DEVICE_TYPE(VIDEO99224, bus::ti99::internal::video992_24_device, "video992_24", "TI-99/2 CRT Controller 24K version")
+DEFINE_DEVICE_TYPE(VIDEO99232, bus::ti99::internal::video992_32_device, "video992_32", "TI-99/2 CRT Controller 32K version")
+DEFINE_DEVICE_TYPE(IO99224, bus::ti99::internal::io992_24_device, "io992_24", "TI-99/2 I/O controller 24K version")
+DEFINE_DEVICE_TYPE(IO99232, bus::ti99::internal::io992_32_device, "io992_32", "TI-99/2 I/O controller 32K version")
-DEFINE_DEVICE_TYPE_NS(TI992_EXPPORT, bus::ti99::internal, ti992_expport_device, "ti992_expport", "TI-99/2 Expansion Port")
-DEFINE_DEVICE_TYPE_NS(TI992_RAM32K, bus::ti99::internal, ti992_expram_device, "ti992_ram32k", "TI-99/2 RAM Expansion 32K")
+DEFINE_DEVICE_TYPE(TI992_EXPPORT, bus::ti99::internal::ti992_expport_device, "ti992_expport", "TI-99/2 Expansion Port")
+DEFINE_DEVICE_TYPE(TI992_RAM32K, bus::ti99::internal::ti992_expram_device, "ti992_ram32k", "TI-99/2 RAM Expansion 32K")
namespace bus::ti99::internal {
diff --git a/src/devices/bus/ti99/internal/998board.cpp b/src/devices/bus/ti99/internal/998board.cpp
index 32a018b540c..49533d97c29 100644
--- a/src/devices/bus/ti99/internal/998board.cpp
+++ b/src/devices/bus/ti99/internal/998board.cpp
@@ -128,11 +128,11 @@
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_MAINBOARD8, bus::ti99::internal, mainboard8_device, "ti998_mainboard", "TI-99/8 Mainboard")
-DEFINE_DEVICE_TYPE_NS(TI99_VAQUERRO, bus::ti99::internal, vaquerro_device, "ti998_vaquerro", "TI-99/8 Logical Address Space Decoder")
-DEFINE_DEVICE_TYPE_NS(TI99_MOFETTA, bus::ti99::internal, mofetta_device, "ti998_mofetta", "TI-99/8 Physical Address Space Decoder")
-DEFINE_DEVICE_TYPE_NS(TI99_OSO, bus::ti99::internal, oso_device, "ti998_oso", "TI-99/8 Hexbus interface")
-DEFINE_DEVICE_TYPE_NS(TI99_AMIGO, bus::ti99::internal, amigo_device, "ti998_amigo", "TI-99/8 Address space mapper")
+DEFINE_DEVICE_TYPE(TI99_MAINBOARD8, bus::ti99::internal::mainboard8_device, "ti998_mainboard", "TI-99/8 Mainboard")
+DEFINE_DEVICE_TYPE(TI99_VAQUERRO, bus::ti99::internal::vaquerro_device, "ti998_vaquerro", "TI-99/8 Logical Address Space Decoder")
+DEFINE_DEVICE_TYPE(TI99_MOFETTA, bus::ti99::internal::mofetta_device, "ti998_mofetta", "TI-99/8 Physical Address Space Decoder")
+DEFINE_DEVICE_TYPE(TI99_OSO, bus::ti99::internal::oso_device, "ti998_oso", "TI-99/8 Hexbus interface")
+DEFINE_DEVICE_TYPE(TI99_AMIGO, bus::ti99::internal::amigo_device, "ti998_amigo", "TI-99/8 Address space mapper")
namespace bus::ti99::internal {
diff --git a/src/devices/bus/ti99/internal/buffram.cpp b/src/devices/bus/ti99/internal/buffram.cpp
index 338313d4733..1677e2ede8d 100644
--- a/src/devices/bus/ti99/internal/buffram.cpp
+++ b/src/devices/bus/ti99/internal/buffram.cpp
@@ -16,7 +16,7 @@
#define BUFFRAM_TAG "buffered_ram"
-DEFINE_DEVICE_TYPE_NS(BUFF_RAM, bus::ti99::internal, buffered_ram_device, BUFFRAM_TAG, "Buffered SRAM")
+DEFINE_DEVICE_TYPE(BUFF_RAM, bus::ti99::internal::buffered_ram_device, BUFFRAM_TAG, "Buffered SRAM")
namespace bus::ti99::internal {
diff --git a/src/devices/bus/ti99/internal/datamux.cpp b/src/devices/bus/ti99/internal/datamux.cpp
index 53092cf187e..d56d8573822 100644
--- a/src/devices/bus/ti99/internal/datamux.cpp
+++ b/src/devices/bus/ti99/internal/datamux.cpp
@@ -82,7 +82,7 @@
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_DATAMUX, bus::ti99::internal, datamux_device, "ti99_datamux", "TI-99 Databus multiplexer")
+DEFINE_DEVICE_TYPE(TI99_DATAMUX, bus::ti99::internal::datamux_device, "ti99_datamux", "TI-99 Databus multiplexer")
namespace bus::ti99::internal {
diff --git a/src/devices/bus/ti99/internal/evpcconn.cpp b/src/devices/bus/ti99/internal/evpcconn.cpp
index 366a3ad4c94..2b7647d52dd 100644
--- a/src/devices/bus/ti99/internal/evpcconn.cpp
+++ b/src/devices/bus/ti99/internal/evpcconn.cpp
@@ -22,7 +22,7 @@
#include "emu.h"
#include "evpcconn.h"
-DEFINE_DEVICE_TYPE_NS(TI99_EVPCCONN, bus::ti99::internal, evpc_clock_connector, "ti99_evpc_clock", "EVPC clock connector")
+DEFINE_DEVICE_TYPE(TI99_EVPCCONN, bus::ti99::internal::evpc_clock_connector, "ti99_evpc_clock", "EVPC clock connector")
namespace bus::ti99::internal {
diff --git a/src/devices/bus/ti99/internal/genboard.cpp b/src/devices/bus/ti99/internal/genboard.cpp
index dbe4664e997..10813d9d32e 100644
--- a/src/devices/bus/ti99/internal/genboard.cpp
+++ b/src/devices/bus/ti99/internal/genboard.cpp
@@ -434,9 +434,9 @@
#include "genboard.h"
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(GENEVE_GATE_ARRAY, bus::ti99::internal, geneve_gate_array_device, "geneve_gate_array", "Geneve Gate Array")
-DEFINE_DEVICE_TYPE_NS(GENMOD_DECODER, bus::ti99::internal, genmod_decoder_device, "genmod_decoder", "GenMod decoder circuit")
-DEFINE_DEVICE_TYPE_NS(GENEVE_PAL, bus::ti99::internal, geneve_pal_device, "geneve_pal", "Geneve PAL circuit")
+DEFINE_DEVICE_TYPE(GENEVE_GATE_ARRAY, bus::ti99::internal::geneve_gate_array_device, "geneve_gate_array", "Geneve Gate Array")
+DEFINE_DEVICE_TYPE(GENMOD_DECODER, bus::ti99::internal::genmod_decoder_device, "genmod_decoder", "GenMod decoder circuit")
+DEFINE_DEVICE_TYPE(GENEVE_PAL, bus::ti99::internal::geneve_pal_device, "geneve_pal", "Geneve PAL circuit")
namespace bus::ti99::internal {
diff --git a/src/devices/bus/ti99/internal/ioport.cpp b/src/devices/bus/ti99/internal/ioport.cpp
index a6049e72a6b..4ab42b201b4 100644
--- a/src/devices/bus/ti99/internal/ioport.cpp
+++ b/src/devices/bus/ti99/internal/ioport.cpp
@@ -80,7 +80,7 @@
#include "ioport.h"
#include "bus/ti99/peb/peribox.h"
-DEFINE_DEVICE_TYPE_NS(TI99_IOPORT, bus::ti99::internal, ioport_device, "ti99_ioport", "TI-99 I/O Port")
+DEFINE_DEVICE_TYPE(TI99_IOPORT, bus::ti99::internal::ioport_device, "ti99_ioport", "TI-99 I/O Port")
namespace bus::ti99::internal {
diff --git a/src/devices/bus/ti99/joyport/handset.cpp b/src/devices/bus/ti99/joyport/handset.cpp
index ad32a9f489e..b04499578e5 100644
--- a/src/devices/bus/ti99/joyport/handset.cpp
+++ b/src/devices/bus/ti99/joyport/handset.cpp
@@ -49,8 +49,8 @@
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_JOYSTICK, bus::ti99::joyport, ti99_twin_joystick_device, "ti99_twinjoy", "TI-99/4(A) Twin Joysticks")
-DEFINE_DEVICE_TYPE_NS(TI99_HANDSET, bus::ti99::joyport, ti99_handset_device, "ti99_handset", "TI-99/4 IR handset")
+DEFINE_DEVICE_TYPE(TI99_JOYSTICK, bus::ti99::joyport::ti99_twin_joystick_device, "ti99_twinjoy", "TI-99/4(A) Twin Joysticks")
+DEFINE_DEVICE_TYPE(TI99_HANDSET, bus::ti99::joyport::ti99_handset_device, "ti99_handset", "TI-99/4 IR handset")
namespace bus::ti99::joyport {
diff --git a/src/devices/bus/ti99/joyport/joyport.cpp b/src/devices/bus/ti99/joyport/joyport.cpp
index 92680ab2c09..77825e85f96 100644
--- a/src/devices/bus/ti99/joyport/joyport.cpp
+++ b/src/devices/bus/ti99/joyport/joyport.cpp
@@ -40,7 +40,7 @@
#include "handset.h"
#include "mecmouse.h"
-DEFINE_DEVICE_TYPE_NS(TI99_JOYPORT, bus::ti99::joyport, joyport_device, "ti99_joyport", "TI-99 Joystick port")
+DEFINE_DEVICE_TYPE(TI99_JOYPORT, bus::ti99::joyport::joyport_device, "ti99_joyport", "TI-99 Joystick port")
namespace bus::ti99::joyport {
diff --git a/src/devices/bus/ti99/joyport/mecmouse.cpp b/src/devices/bus/ti99/joyport/mecmouse.cpp
index 3d4bf27ec5b..27dc147b73d 100644
--- a/src/devices/bus/ti99/joyport/mecmouse.cpp
+++ b/src/devices/bus/ti99/joyport/mecmouse.cpp
@@ -51,7 +51,7 @@
#include "emu.h"
#include "mecmouse.h"
-DEFINE_DEVICE_TYPE_NS(TI99_MECMOUSE, bus::ti99::joyport, mecmouse_device, "ti99_mecmouse", "TI-99 Mechatronics Mouse")
+DEFINE_DEVICE_TYPE(TI99_MECMOUSE, bus::ti99::joyport::mecmouse_device, "ti99_mecmouse", "TI-99 Mechatronics Mouse")
namespace bus::ti99::joyport {
diff --git a/src/devices/bus/ti99/peb/bwg.cpp b/src/devices/bus/ti99/peb/bwg.cpp
index e0373ae2fc6..4950943a8a8 100644
--- a/src/devices/bus/ti99/peb/bwg.cpp
+++ b/src/devices/bus/ti99/peb/bwg.cpp
@@ -63,7 +63,7 @@
#define VERBOSE ( LOG_CONFIG | LOG_WARN )
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_BWG, bus::ti99::peb, snug_bwg_device, "ti99_bwg", "SNUG BwG Floppy Controller")
+DEFINE_DEVICE_TYPE(TI99_BWG, bus::ti99::peb::snug_bwg_device, "ti99_bwg", "SNUG BwG Floppy Controller")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/cc_fdc.cpp b/src/devices/bus/ti99/peb/cc_fdc.cpp
index c2b20e778a8..6762dea8a05 100644
--- a/src/devices/bus/ti99/peb/cc_fdc.cpp
+++ b/src/devices/bus/ti99/peb/cc_fdc.cpp
@@ -59,14 +59,14 @@
#define BUFFER "ram"
-DEFINE_DEVICE_TYPE_NS(TI99_CCDCC, bus::ti99::peb, corcomp_dcc_device, CCDCC_TAG, "CorComp Disk Controller Card")
-DEFINE_DEVICE_TYPE_NS(TI99_CCFDC, bus::ti99::peb, corcomp_fdca_device, CCFDC_TAG, "CorComp Floppy Disk Controller Card Rev A")
+DEFINE_DEVICE_TYPE(TI99_CCDCC, bus::ti99::peb::corcomp_dcc_device, CCDCC_TAG, "CorComp Disk Controller Card")
+DEFINE_DEVICE_TYPE(TI99_CCFDC, bus::ti99::peb::corcomp_fdca_device, CCFDC_TAG, "CorComp Floppy Disk Controller Card Rev A")
-DEFINE_DEVICE_TYPE_NS(CCDCC_PALU2, bus::ti99::peb, ccdcc_palu2_device, CCDCC_PALU2_TAG, "CorComp DCC PAL u2")
-DEFINE_DEVICE_TYPE_NS(CCDCC_PALU1, bus::ti99::peb, ccdcc_palu1_device, CCDCC_PALU1_TAG, "CorComp DCC PAL u1")
+DEFINE_DEVICE_TYPE(CCDCC_PALU2, bus::ti99::peb::ccdcc_palu2_device, CCDCC_PALU2_TAG, "CorComp DCC PAL u2")
+DEFINE_DEVICE_TYPE(CCDCC_PALU1, bus::ti99::peb::ccdcc_palu1_device, CCDCC_PALU1_TAG, "CorComp DCC PAL u1")
-DEFINE_DEVICE_TYPE_NS(CCFDC_PALU12, bus::ti99::peb, ccfdc_palu12_device, CCFDC_PALU12_TAG, "CorComp FDC PAL u12")
-DEFINE_DEVICE_TYPE_NS(CCFDC_PALU6, bus::ti99::peb, ccfdc_palu6_device, CCFDC_PALU6_TAG, "CorComp FDC PAL u6")
+DEFINE_DEVICE_TYPE(CCFDC_PALU12, bus::ti99::peb::ccfdc_palu12_device, CCFDC_PALU12_TAG, "CorComp FDC PAL u12")
+DEFINE_DEVICE_TYPE(CCFDC_PALU6, bus::ti99::peb::ccfdc_palu6_device, CCFDC_PALU6_TAG, "CorComp FDC PAL u6")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/evpc.cpp b/src/devices/bus/ti99/peb/evpc.cpp
index f45c672d00c..b99821baf4a 100644
--- a/src/devices/bus/ti99/peb/evpc.cpp
+++ b/src/devices/bus/ti99/peb/evpc.cpp
@@ -52,7 +52,7 @@
#include "logmacro.h"
#define EVPC_SCREEN_TAG "screen"
-DEFINE_DEVICE_TYPE_NS(TI99_EVPC, bus::ti99::peb, snug_enhanced_video_device, "ti99_evpc", "SNUG Enhanced Video Processor Card")
+DEFINE_DEVICE_TYPE(TI99_EVPC, bus::ti99::peb::snug_enhanced_video_device, "ti99_evpc", "SNUG Enhanced Video Processor Card")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/forti.cpp b/src/devices/bus/ti99/peb/forti.cpp
index 25b0ce0a3a0..0ee053a740c 100644
--- a/src/devices/bus/ti99/peb/forti.cpp
+++ b/src/devices/bus/ti99/peb/forti.cpp
@@ -41,7 +41,7 @@
#define FORTI_GEN3_TAG "soundchip3"
#define FORTI_GEN4_TAG "soundchip4"
-DEFINE_DEVICE_TYPE_NS(TI99_FORTI, bus::ti99::peb, forti_device, "ti99_forti", "FORTi Sound Card")
+DEFINE_DEVICE_TYPE(TI99_FORTI, bus::ti99::peb::forti_device, "ti99_forti", "FORTi Sound Card")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/hfdc.cpp b/src/devices/bus/ti99/peb/hfdc.cpp
index 53613fa0c0b..621339f9d72 100644
--- a/src/devices/bus/ti99/peb/hfdc.cpp
+++ b/src/devices/bus/ti99/peb/hfdc.cpp
@@ -74,7 +74,7 @@
#define VERBOSE ( LOG_GENERAL | LOG_CONFIG | LOG_WARN )
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_HFDC, bus::ti99::peb, myarc_hfdc_device, "ti99_hfdc", "Myarc Hard and Floppy Disk Controller")
+DEFINE_DEVICE_TYPE(TI99_HFDC, bus::ti99::peb::myarc_hfdc_device, "ti99_hfdc", "Myarc Hard and Floppy Disk Controller")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/horizon.cpp b/src/devices/bus/ti99/peb/horizon.cpp
index e0e226f646b..1be6264189c 100644
--- a/src/devices/bus/ti99/peb/horizon.cpp
+++ b/src/devices/bus/ti99/peb/horizon.cpp
@@ -139,7 +139,7 @@
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_HORIZON, bus::ti99::peb, horizon_ramdisk_device, "ti99_horizon", "Horizon 4000B RAMdisk")
+DEFINE_DEVICE_TYPE(TI99_HORIZON, bus::ti99::peb::horizon_ramdisk_device, "ti99_horizon", "Horizon 4000B RAMdisk")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/hsgpl.cpp b/src/devices/bus/ti99/peb/hsgpl.cpp
index cc5f4b0feee..fc687b25785 100644
--- a/src/devices/bus/ti99/peb/hsgpl.cpp
+++ b/src/devices/bus/ti99/peb/hsgpl.cpp
@@ -136,7 +136,7 @@
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_HSGPL, bus::ti99::peb, snug_high_speed_gpl_device, "ti99_hsgpl", "SNUG High-speed GPL card")
+DEFINE_DEVICE_TYPE(TI99_HSGPL, bus::ti99::peb::snug_high_speed_gpl_device, "ti99_hsgpl", "SNUG High-speed GPL card")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/memex.cpp b/src/devices/bus/ti99/peb/memex.cpp
index 44db15aa6af..1ee9bf423e1 100644
--- a/src/devices/bus/ti99/peb/memex.cpp
+++ b/src/devices/bus/ti99/peb/memex.cpp
@@ -25,7 +25,7 @@
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_MEMEX, bus::ti99::peb, geneve_memex_device, "ti99_memex", "Geneve memory expansion card")
+DEFINE_DEVICE_TYPE(TI99_MEMEX, bus::ti99::peb::geneve_memex_device, "ti99_memex", "Geneve memory expansion card")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/myarcfdc.cpp b/src/devices/bus/ti99/peb/myarcfdc.cpp
index 8c1410bb848..4e85d5be0c0 100644
--- a/src/devices/bus/ti99/peb/myarcfdc.cpp
+++ b/src/devices/bus/ti99/peb/myarcfdc.cpp
@@ -47,8 +47,8 @@
#define WD1772_TAG "wd1772"
#define PAL_TAG "pal"
-DEFINE_DEVICE_TYPE_NS(TI99_DDCC1, bus::ti99::peb, myarc_fdc_device, "ti99_ddcc1", "Myarc Disk Controller Card")
-DEFINE_DEVICE_TYPE_NS(DDCC1_PAL, bus::ti99::peb, ddcc1_pal_device, PAL_TAG, "Myarc DDCC-1 PAL u1")
+DEFINE_DEVICE_TYPE(TI99_DDCC1, bus::ti99::peb::myarc_fdc_device, "ti99_ddcc1", "Myarc Disk Controller Card")
+DEFINE_DEVICE_TYPE(DDCC1_PAL, bus::ti99::peb::ddcc1_pal_device, PAL_TAG, "Myarc DDCC-1 PAL u1")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/myarcmem.cpp b/src/devices/bus/ti99/peb/myarcmem.cpp
index 20d2bd5af4e..edee7601c80 100644
--- a/src/devices/bus/ti99/peb/myarcmem.cpp
+++ b/src/devices/bus/ti99/peb/myarcmem.cpp
@@ -30,7 +30,7 @@
#include "emu.h"
#include "myarcmem.h"
-DEFINE_DEVICE_TYPE_NS(TI99_MYARCMEM, bus::ti99::peb, myarc_memory_expansion_device, "ti99_myarcmem", "Myarc Memory expansion card MEXP-1")
+DEFINE_DEVICE_TYPE(TI99_MYARCMEM, bus::ti99::peb::myarc_memory_expansion_device, "ti99_myarcmem", "Myarc Memory expansion card MEXP-1")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/pcode.cpp b/src/devices/bus/ti99/peb/pcode.cpp
index c7f10650995..156d190adc6 100644
--- a/src/devices/bus/ti99/peb/pcode.cpp
+++ b/src/devices/bus/ti99/peb/pcode.cpp
@@ -86,7 +86,7 @@
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_P_CODE, bus::ti99::peb, ti_pcode_card_device, "ti99_pcode", "TI-99 P-Code Card")
+DEFINE_DEVICE_TYPE(TI99_P_CODE, bus::ti99::peb::ti_pcode_card_device, "ti99_pcode", "TI-99 P-Code Card")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/peribox.cpp b/src/devices/bus/ti99/peb/peribox.cpp
index 13b58cc36e7..b4e047c9815 100644
--- a/src/devices/bus/ti99/peb/peribox.cpp
+++ b/src/devices/bus/ti99/peb/peribox.cpp
@@ -211,22 +211,22 @@ CRUCLK* 51||52 DBIN
// Peripheral box that is attached to the TI console (also TI with EVPC)
// and has the Flex Cable Interface in slot 1
// This is a device that plugs into the slot "ioport" of the console
-DEFINE_DEVICE_TYPE_NS(TI99_PERIBOX, bus::ti99::peb, peribox_device, "peribox", "Peripheral expansion box")
+DEFINE_DEVICE_TYPE(TI99_PERIBOX, bus::ti99::peb::peribox_device, "peribox", "Peripheral expansion box")
// Peripheral box which has a EVPC card in slot 2 (for use with the ti99_4ev)
-DEFINE_DEVICE_TYPE_NS(TI99_PERIBOX_EV, bus::ti99::peb, peribox_ev_device, "peribox_ev", "Peripheral expansion box with EVPC")
+DEFINE_DEVICE_TYPE(TI99_PERIBOX_EV, bus::ti99::peb::peribox_ev_device, "peribox_ev", "Peripheral expansion box with EVPC")
// Peripheral box which hosts the SGCPU card in slot 1
-DEFINE_DEVICE_TYPE_NS(TI99_PERIBOX_SG, bus::ti99::peb, peribox_sg_device, "peribox_sg", "Peripheral expansion box SGCPU")
+DEFINE_DEVICE_TYPE(TI99_PERIBOX_SG, bus::ti99::peb::peribox_sg_device, "peribox_sg", "Peripheral expansion box SGCPU")
// Peripheral box which hosts the Geneve 9640 in slot 1
-DEFINE_DEVICE_TYPE_NS(TI99_PERIBOX_GEN, bus::ti99::peb, peribox_gen_device, "peribox_gen", "Peripheral expansion box Geneve")
+DEFINE_DEVICE_TYPE(TI99_PERIBOX_GEN, bus::ti99::peb::peribox_gen_device, "peribox_gen", "Peripheral expansion box Geneve")
// Peripheral box which hosts the Geneve 9640 in slot 1 with Genmod
-DEFINE_DEVICE_TYPE_NS(TI99_PERIBOX_GENMOD, bus::ti99::peb, peribox_genmod_device, "peribox_genmod", "Peripheral expansion box Genmod")
+DEFINE_DEVICE_TYPE(TI99_PERIBOX_GENMOD, bus::ti99::peb::peribox_genmod_device, "peribox_genmod", "Peripheral expansion box Genmod")
// Single slot of the PEB
-DEFINE_DEVICE_TYPE_NS(TI99_PERIBOX_SLOT, bus::ti99::peb, peribox_slot_device, "peribox_slot", "TI P-Box slot")
+DEFINE_DEVICE_TYPE(TI99_PERIBOX_SLOT, bus::ti99::peb::peribox_slot_device, "peribox_slot", "TI P-Box slot")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/pgram.cpp b/src/devices/bus/ti99/peb/pgram.cpp
index 851a7bcee4a..c6ece9407a0 100644
--- a/src/devices/bus/ti99/peb/pgram.cpp
+++ b/src/devices/bus/ti99/peb/pgram.cpp
@@ -141,7 +141,7 @@
#define COUNT2_TAG "u12_counter"
#define COUNT3_TAG "u10_counter"
-DEFINE_DEVICE_TYPE_NS(TI99_PGRAM, bus::ti99::peb, pgram_device, "ti99_pgram", "PGRAM(+) memory card")
+DEFINE_DEVICE_TYPE(TI99_PGRAM, bus::ti99::peb::pgram_device, "ti99_pgram", "PGRAM(+) memory card")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/samsmem.cpp b/src/devices/bus/ti99/peb/samsmem.cpp
index 2c895e35130..d38f877fc9f 100644
--- a/src/devices/bus/ti99/peb/samsmem.cpp
+++ b/src/devices/bus/ti99/peb/samsmem.cpp
@@ -28,7 +28,7 @@
#include "emu.h"
#include "samsmem.h"
-DEFINE_DEVICE_TYPE_NS(TI99_SAMSMEM, bus::ti99::peb, sams_memory_expansion_device, "ti99_sams", "SuperAMS memory expansion card")
+DEFINE_DEVICE_TYPE(TI99_SAMSMEM, bus::ti99::peb::sams_memory_expansion_device, "ti99_sams", "SuperAMS memory expansion card")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/sidmaster.cpp b/src/devices/bus/ti99/peb/sidmaster.cpp
index 5d6db281b22..9b6eb0af129 100644
--- a/src/devices/bus/ti99/peb/sidmaster.cpp
+++ b/src/devices/bus/ti99/peb/sidmaster.cpp
@@ -31,7 +31,7 @@
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_SIDMASTER, bus::ti99::peb, sidmaster_device, "ti99_sidmaster", "SID Master 99")
+DEFINE_DEVICE_TYPE(TI99_SIDMASTER, bus::ti99::peb::sidmaster_device, "ti99_sidmaster", "SID Master 99")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/spchsyn.cpp b/src/devices/bus/ti99/peb/spchsyn.cpp
index 7c6fd56fbfb..302758f3f4e 100644
--- a/src/devices/bus/ti99/peb/spchsyn.cpp
+++ b/src/devices/bus/ti99/peb/spchsyn.cpp
@@ -36,7 +36,7 @@
#define VERBOSE ( LOG_CONFIG | LOG_WARN )
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_SPEECH, bus::ti99::peb, ti_speech_synthesizer_device, "ti99_speech", "TI-99 Speech synthesizer (on adapter card)")
+DEFINE_DEVICE_TYPE(TI99_SPEECH, bus::ti99::peb::ti_speech_synthesizer_device, "ti99_speech", "TI-99 Speech synthesizer (on adapter card)")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/ti_32kmem.cpp b/src/devices/bus/ti99/peb/ti_32kmem.cpp
index ee17e86ba7b..1f9404bd1e1 100644
--- a/src/devices/bus/ti99/peb/ti_32kmem.cpp
+++ b/src/devices/bus/ti99/peb/ti_32kmem.cpp
@@ -31,7 +31,7 @@
#include "emu.h"
#include "ti_32kmem.h"
-DEFINE_DEVICE_TYPE_NS(TI99_32KMEM, bus::ti99::peb, ti_32k_expcard_device, "ti99_32kmem", "TI-99 32KiB memory expansion card")
+DEFINE_DEVICE_TYPE(TI99_32KMEM, bus::ti99::peb::ti_32k_expcard_device, "ti99_32kmem", "TI-99 32KiB memory expansion card")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/ti_fdc.cpp b/src/devices/bus/ti99/peb/ti_fdc.cpp
index 15636a7d2cc..b68147a8193 100644
--- a/src/devices/bus/ti99/peb/ti_fdc.cpp
+++ b/src/devices/bus/ti99/peb/ti_fdc.cpp
@@ -32,7 +32,7 @@
#define VERBOSE ( LOG_CONFIG | LOG_WARN )
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_FDC, bus::ti99::peb, ti_fdc_device, "ti99_fdc", "TI-99 Standard DSSD Floppy Controller")
+DEFINE_DEVICE_TYPE(TI99_FDC, bus::ti99::peb::ti_fdc_device, "ti99_fdc", "TI-99 Standard DSSD Floppy Controller")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/ti_rs232.cpp b/src/devices/bus/ti99/peb/ti_rs232.cpp
index a88b0124e67..841acf44ac7 100644
--- a/src/devices/bus/ti99/peb/ti_rs232.cpp
+++ b/src/devices/bus/ti99/peb/ti_rs232.cpp
@@ -118,9 +118,9 @@
#define VERBOSE ( LOG_CONFIG | LOG_WARN )
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_RS232, bus::ti99::peb, ti_rs232_pio_device, "ti99_rs232", "TI-99 RS232/PIO interface")
-DEFINE_DEVICE_TYPE_NS(TI99_RS232_DEV, bus::ti99::peb, ti_rs232_attached_device, "ti99_rs232_atttached", "TI-99 Serial attached device")
-DEFINE_DEVICE_TYPE_NS(TI99_PIO_DEV, bus::ti99::peb, ti_pio_attached_device, "ti99_pio_attached", "TI-99 Parallel attached device")
+DEFINE_DEVICE_TYPE(TI99_RS232, bus::ti99::peb::ti_rs232_pio_device, "ti99_rs232", "TI-99 RS232/PIO interface")
+DEFINE_DEVICE_TYPE(TI99_RS232_DEV, bus::ti99::peb::ti_rs232_attached_device, "ti99_rs232_atttached", "TI-99 Serial attached device")
+DEFINE_DEVICE_TYPE(TI99_PIO_DEV, bus::ti99::peb::ti_pio_attached_device, "ti99_pio_attached", "TI-99 Parallel attached device")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/ti99/peb/tn_ide.cpp b/src/devices/bus/ti99/peb/tn_ide.cpp
index a1f7528940e..2a31a86dd6a 100644
--- a/src/devices/bus/ti99/peb/tn_ide.cpp
+++ b/src/devices/bus/ti99/peb/tn_ide.cpp
@@ -134,7 +134,7 @@
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_IDE, bus::ti99::peb, nouspikel_ide_card_device, "ti99_ide", "Nouspikel IDE interface card")
+DEFINE_DEVICE_TYPE(TI99_IDE, bus::ti99::peb::nouspikel_ide_card_device, "ti99_ide", "Nouspikel IDE interface card")
#define CLOCK65_TAG "rtc65271"
#define CLOCK47_TAG "bq4847"
diff --git a/src/devices/bus/ti99/peb/tn_usbsm.cpp b/src/devices/bus/ti99/peb/tn_usbsm.cpp
index 3e48e328772..5a2a266661b 100644
--- a/src/devices/bus/ti99/peb/tn_usbsm.cpp
+++ b/src/devices/bus/ti99/peb/tn_usbsm.cpp
@@ -48,7 +48,7 @@
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_USBSM, bus::ti99::peb, nouspikel_usb_smartmedia_device, "ti99_usbsm", "Nouspikel USB/Smartmedia card")
+DEFINE_DEVICE_TYPE(TI99_USBSM, bus::ti99::peb::nouspikel_usb_smartmedia_device, "ti99_usbsm", "Nouspikel USB/Smartmedia card")
namespace bus::ti99::peb {
diff --git a/src/devices/bus/vboy/slot.cpp b/src/devices/bus/vboy/slot.cpp
index 083c0db745b..70dd9e05063 100644
--- a/src/devices/bus/vboy/slot.cpp
+++ b/src/devices/bus/vboy/slot.cpp
@@ -54,14 +54,14 @@ image_init_result vboy_cart_slot_device::call_load()
memory_region *romregion(loaded_through_softlist() ? memregion("rom") : nullptr);
if (loaded_through_softlist() && !romregion)
{
- seterror(IMAGE_ERROR_INVALIDIMAGE, "Software list item has no 'rom' data area");
+ seterror(image_error::INVALIDIMAGE, "Software list item has no 'rom' data area");
return image_init_result::FAIL;
}
u32 const len(loaded_through_softlist() ? romregion->bytes() : length());
if ((0x0000'0003 & len) || (0x0100'0000 < len))
{
- seterror(IMAGE_ERROR_UNSUPPORTED, "Unsupported cartridge size (must be a multiple of 4 bytes no larger than 16 MiB)");
+ seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size (must be a multiple of 4 bytes no larger than 16 MiB)");
return image_init_result::FAIL;
}
@@ -72,7 +72,7 @@ image_init_result vboy_cart_slot_device::call_load()
u32 const cnt(fread(romregion->base(), len));
if (cnt != len)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Error reading cartridge file");
+ seterror(image_error::UNSPECIFIED, "Error reading cartridge file");
return image_init_result::FAIL;
}
}
diff --git a/src/devices/bus/vc4000/slot.cpp b/src/devices/bus/vc4000/slot.cpp
index f33e5623639..8de01177448 100644
--- a/src/devices/bus/vc4000/slot.cpp
+++ b/src/devices/bus/vc4000/slot.cpp
@@ -176,7 +176,7 @@ image_init_result vc4000_cart_slot_device::call_load()
if (size > 0x1800)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Image extends beyond the expected size for a VC4000 cart");
+ seterror(image_error::INVALIDIMAGE, "Image extends beyond the expected size for a VC4000 cart");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/vcs/vcs_slot.cpp b/src/devices/bus/vcs/vcs_slot.cpp
index 28d402322d5..5efcc4ba32d 100644
--- a/src/devices/bus/vcs/vcs_slot.cpp
+++ b/src/devices/bus/vcs/vcs_slot.cpp
@@ -200,7 +200,7 @@ image_init_result vcs_cart_slot_device::call_load()
break;
default:
- seterror(IMAGE_ERROR_UNSUPPORTED, "Invalid rom file size" );
+ seterror(image_error::INVALIDIMAGE, "Invalid ROM file size" );
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/vectrex/slot.cpp b/src/devices/bus/vectrex/slot.cpp
index 014b6c9516c..9e3ebd14fa6 100644
--- a/src/devices/bus/vectrex/slot.cpp
+++ b/src/devices/bus/vectrex/slot.cpp
@@ -145,7 +145,7 @@ image_init_result vectrex_cart_slot_device::call_load()
if (size > 0x10000)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
@@ -160,7 +160,7 @@ image_init_result vectrex_cart_slot_device::call_load()
// Verify the file is accepted by the Vectrex bios
if (memcmp(ROM, "g GCE", 5))
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid image");
+ seterror(image_error::INVALIDIMAGE, "Invalid image");
return image_init_result::FAIL;
}
diff --git a/src/devices/bus/vsmile/vsmile_slot.cpp b/src/devices/bus/vsmile/vsmile_slot.cpp
index 59f039c685d..9c2906826c9 100644
--- a/src/devices/bus/vsmile/vsmile_slot.cpp
+++ b/src/devices/bus/vsmile/vsmile_slot.cpp
@@ -139,7 +139,7 @@ image_init_result vsmile_cart_slot_device::call_load()
uint32_t size = loaded_through_softlist() ? get_software_region_length("rom") : length();
if (size > 0x1000000)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Attempted loading a cart larger than 16MB");
+ seterror(image_error::INVALIDIMAGE, "Attempted loading a cart larger than 16MB");
return image_init_result::FAIL;
}
diff --git a/src/devices/cpu/adsp2100/adsp2100.cpp b/src/devices/cpu/adsp2100/adsp2100.cpp
index c9377fc26e1..9e030b55df3 100644
--- a/src/devices/cpu/adsp2100/adsp2100.cpp
+++ b/src/devices/cpu/adsp2100/adsp2100.cpp
@@ -570,7 +570,6 @@ void adsp21xx_device::device_start()
state_add(ADSP2100_MSTAT, "MSTAT", m_mstat).mask((m_chip_type == CHIP_TYPE_ADSP2100) ? 0x0f : 0x7f).callimport();
state_add(ADSP2100_PCSP, "PCSP", m_pc_sp).mask(0xff);
- state_add(STATE_GENSP, "CURSP", m_pc_sp).mask(0xff).noshow();
state_add(ADSP2100_CNTRSP, "CNTRSP", m_cntr_sp).mask(0xf);
state_add(ADSP2100_STATSP, "STATSP", m_stat_sp).mask(0xf);
state_add(ADSP2100_LOOPSP, "LOOPSP", m_loop_sp).mask(0xf);
diff --git a/src/devices/cpu/alto2/a2mouse.cpp b/src/devices/cpu/alto2/a2mouse.cpp
index 677ef24f87c..3747abb71ea 100644
--- a/src/devices/cpu/alto2/a2mouse.cpp
+++ b/src/devices/cpu/alto2/a2mouse.cpp
@@ -148,7 +148,7 @@ INPUT_CHANGED_MEMBER( alto2_cpu_device::mouse_motion_x )
{
int16_t ox = static_cast<int16_t>(oldval);
int16_t nx = static_cast<int16_t>(newval);
- m_mouse.dx = std::min(std::max(0, m_mouse.dx + (nx - ox)), 639);
+ m_mouse.dx = std::clamp(m_mouse.dx + (nx - ox), 0, 639);
}
/**
@@ -162,7 +162,7 @@ INPUT_CHANGED_MEMBER( alto2_cpu_device::mouse_motion_y )
{
int16_t oy = static_cast<int16_t>(oldval);
int16_t ny = static_cast<int16_t>(newval);
- m_mouse.dy = std::min(std::max(0, m_mouse.dy + (ny - oy)), 824);
+ m_mouse.dy = std::clamp(m_mouse.dy + (ny - oy), 0, 824);
}
/**
diff --git a/src/devices/cpu/arc/arc.cpp b/src/devices/cpu/arc/arc.cpp
index 70a2b274b57..46ac82a84fb 100644
--- a/src/devices/cpu/arc/arc.cpp
+++ b/src/devices/cpu/arc/arc.cpp
@@ -34,6 +34,13 @@ std::unique_ptr<util::disasm_interface> arc_cpu_device::create_disassembler()
/*****************************************************************************/
+device_memory_interface::space_config_vector arc_cpu_device::memory_space_config() const
+{
+ return space_config_vector {
+ std::make_pair(AS_PROGRAM, &m_program_config)
+ };
+}
+
/*****************************************************************************/
void arc_cpu_device::unimplemented_opcode(uint16_t op)
diff --git a/src/devices/cpu/asap/asap.cpp b/src/devices/cpu/asap/asap.cpp
index d19f3dd3d42..bab7faeb348 100644
--- a/src/devices/cpu/asap/asap.cpp
+++ b/src/devices/cpu/asap/asap.cpp
@@ -187,7 +187,6 @@ void asap_device::device_start()
// register our state for the debugger
state_add(STATE_GENPC, "GENPC", m_pc).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_ppc).noshow();
- state_add(STATE_GENSP, "GENSP", m_src2val[REGBASE + 31]).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_flagsio).callimport().callexport().formatstr("%6s").noshow();
state_add(ASAP_PC, "PC", m_pc);
state_add(ASAP_PS, "PS", m_flagsio).callimport().callexport();
diff --git a/src/devices/cpu/dsp16/dsp16.cpp b/src/devices/cpu/dsp16/dsp16.cpp
index dfa45b6a881..48b0cc35a8b 100644
--- a/src/devices/cpu/dsp16/dsp16.cpp
+++ b/src/devices/cpu/dsp16/dsp16.cpp
@@ -1778,7 +1778,7 @@ s64 dsp16_device_base::dau_saturate(u16 a) const
if (m_core->dau_auc_sat(a))
return m_core->dau_a[a];
else
- return std::min<s64>(std::max<s64>(m_core->dau_a[a], std::numeric_limits<s32>::min()), std::numeric_limits<s32>::max());
+ return std::clamp<s64>(m_core->dau_a[a], std::numeric_limits<s32>::min(), std::numeric_limits<s32>::max());
}
inline bool dsp16_device_base::op_dau_con(u16 op, bool inc)
diff --git a/src/devices/cpu/dsp32/dsp32.cpp b/src/devices/cpu/dsp32/dsp32.cpp
index c7452161137..3519f941c69 100644
--- a/src/devices/cpu/dsp32/dsp32.cpp
+++ b/src/devices/cpu/dsp32/dsp32.cpp
@@ -195,7 +195,6 @@ void dsp32c_device::device_start()
// register our state for the debugger
state_add(STATE_GENPC, "GENPC", m_r[15]).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_ppc).noshow();
- state_add(STATE_GENSP, "GENSP", m_r[21]).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_iotemp).callimport().callexport().formatstr("%6s").noshow();
state_add(DSP32_PC, "PC", m_r[15]).mask(0xffffff);
for (int regnum = 0; regnum <= 14; regnum++)
diff --git a/src/devices/cpu/dsp56156/dsp56156.cpp b/src/devices/cpu/dsp56156/dsp56156.cpp
index 83be73c4852..f3e6e71311b 100644
--- a/src/devices/cpu/dsp56156/dsp56156.cpp
+++ b/src/devices/cpu/dsp56156/dsp56156.cpp
@@ -60,7 +60,7 @@
#include "dsp56mem.h"
-DEFINE_DEVICE_TYPE_NS(DSP56156, DSP_56156, dsp56156_device, "dsp56156", "Motorola DSP56156")
+DEFINE_DEVICE_TYPE(DSP56156, DSP_56156::dsp56156_device, "dsp56156", "Motorola DSP56156")
namespace DSP_56156 {
@@ -345,7 +345,6 @@ void dsp56156_device::device_start()
state_add(STATE_GENPC, "GENPC", m_core.PCU.pc).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_core.ppc).noshow();
- state_add(STATE_GENSP, "GENSP", m_core.PCU.sp).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_core.PCU.sr).formatstr("%14s").noshow();
set_icountptr(m_core.icount);
diff --git a/src/devices/cpu/dspp/dspp.cpp b/src/devices/cpu/dspp/dspp.cpp
index 0ce41f3602a..0a6f0bc6e17 100644
--- a/src/devices/cpu/dspp/dspp.cpp
+++ b/src/devices/cpu/dspp/dspp.cpp
@@ -169,7 +169,6 @@ void dspp_device::device_start()
#if 0
state_add(STATE_GENFLAGS, "GENFLAGS", m_core->m_flags).callimport().callexport().formatstr("%6s").noshow();
state_add(STATE_GENPCBASE, "GENPCBASE", m_ppc).noshow();
- state_add(STATE_GENSP, "GENSP", m_src2val[REGBASE + 31]).noshow();
state_add(DSPP_PS, "PS", m_core->m_flagsio).callimport().callexport();
for (int regnum = 0; regnum < 32; regnum++)
diff --git a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx
index f61f88f482b..9679faf8364 100644
--- a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx
+++ b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx
@@ -2704,9 +2704,55 @@ void hyperstone_device::generate_shri(drcuml_block &block, compiler_state &compi
template <hyperstone_device::shift_type HI_N>
void hyperstone_device::generate_sardi(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc)
{
- printf("Unimplemented: generate_sardi (%08x)\n", desc->pc);
- fflush(stdout);
- fatalerror(" ");
+ UML_MOV(block, I7, mem(&m_core->clock_cycles_2));
+
+ uint16_t op = desc->opptr.w[0];
+
+ const uint32_t dst_code = (op & 0xf0) >> 4;
+ const uint32_t dstf_code = dst_code + 1;
+
+ generate_check_delay_pc(block, compiler, desc);
+
+ UML_ROLAND(block, I3, DRC_SR, 7, 0x7f);
+
+ UML_ADD(block, I2, I3, dst_code);
+ UML_AND(block, I4, I2, 0x3f);
+ UML_LOAD(block, I0, (void *)m_core->local_regs, I4, SIZE_DWORD, SCALE_x4);
+
+ UML_ADD(block, I2, I3, dstf_code);
+ UML_AND(block, I5, I2, 0x3f);
+ UML_LOAD(block, I1, (void *)m_core->local_regs, I5, SIZE_DWORD, SCALE_x4);
+
+#ifndef PTR64
+ UML_DAND(block, I1, I1, 0x00000000ffffffff);
+#endif
+
+ UML_DSHL(block, I2, I0, 32);
+ UML_DOR(block, I0, I1, I2);
+
+ UML_AND(block, I4, DRC_SR, ~(C_MASK | Z_MASK | N_MASK));
+
+ const uint32_t n = HI_N ? (0x10 | (op & 0xf)) : (op & 0xf);
+ if (HI_N || n)
+ {
+ int no_carry = compiler.m_labelnum++;
+ UML_DTEST(block, I2, (1 << (n - 1)));
+ UML_JMPc(block, uml::COND_Z, no_carry);
+ UML_OR(block, I4, I4, 1);
+ UML_LABEL(block, no_carry);
+
+ UML_DSAR(block, I2, I2, n);
+ }
+
+ UML_DTEST(block, I2, ~0ULL);
+ UML_MOVc(block, uml::COND_Z, I5, Z_MASK);
+ UML_MOVc(block, uml::COND_NZ, I5, 0);
+ UML_DROLINS(block, I5, I2, 3, N_MASK);
+ UML_OR(block, DRC_SR, I4, I5);
+
+ UML_STORE(block, (void *)m_core->local_regs, I6, I2, SIZE_DWORD, SCALE_x4);
+ UML_DSHR(block, I0, I2, 32);
+ UML_STORE(block, (void *)m_core->local_regs, I1, I0, SIZE_DWORD, SCALE_x4);
}
diff --git a/src/devices/cpu/e132xs/e132xsop.hxx b/src/devices/cpu/e132xs/e132xsop.hxx
index 36284db88eb..e1898880d89 100644
--- a/src/devices/cpu/e132xs/e132xsop.hxx
+++ b/src/devices/cpu/e132xs/e132xsop.hxx
@@ -1158,10 +1158,8 @@ void hyperstone_device::hyperstone_shrdi()
{
check_delay_PC();
- const uint32_t fp = GET_FP;
- const uint32_t code = DST_CODE;
- const uint32_t dst_code = (code + fp) & 0x3f;
- const uint32_t dstf_code = (code + 1 + fp) & 0x3f;
+ const uint32_t dst_code = (DST_CODE + GET_FP) & 0x3f;
+ const uint32_t dstf_code = (dst_code + 1) & 0x3f;
uint32_t high_order = m_core->local_regs[dst_code];
const uint32_t low_order = m_core->local_regs[dstf_code];
@@ -1196,9 +1194,8 @@ void hyperstone_device::hyperstone_shrd()
const uint32_t fp = GET_FP;
const uint32_t src_code = (SRC_CODE + fp) & 0x3f;
- const uint32_t d_code = DST_CODE;
- const uint32_t dst_code = (d_code + fp) & 0x3f;
- const uint32_t dstf_code = (d_code + 1 + fp) & 0x3f;
+ const uint32_t dst_code = (DST_CODE + fp) & 0x3f;
+ const uint32_t dstf_code = (dst_code + 1) & 0x3f;
if (src_code == dst_code || src_code == dstf_code)
{
@@ -1260,8 +1257,10 @@ void hyperstone_device::hyperstone_sardi()
const uint32_t dst_code = (DST_CODE + GET_FP) & 0x3f;
const uint32_t dstf_code = (dst_code + 1) & 0x3f;
+ uint32_t high_order = m_core->local_regs[dst_code];
+ const uint32_t low_order = m_core->local_regs[dstf_code];
- uint64_t val = concat_64(m_core->local_regs[dst_code], m_core->local_regs[dstf_code]);
+ uint64_t val = concat_64(high_order, low_order);
SR &= ~(C_MASK | Z_MASK | N_MASK);
@@ -1277,12 +1276,14 @@ void hyperstone_device::hyperstone_sardi()
val |= 0xffffffff00000000U << (32 - n);
}
+ high_order = extract_64hi(val);
+
if (val == 0)
SR |= Z_MASK;
- SR |= SIGN_TO_N(m_core->local_regs[dst_code]);
+ SR |= SIGN_TO_N(high_order);
- m_core->local_regs[dst_code] = (uint32_t)(val >> 32);
- m_core->local_regs[dstf_code] = (uint32_t)val;
+ m_core->local_regs[dst_code] = high_order;
+ m_core->local_regs[dstf_code] = extract_64lo(val);
m_core->icount -= m_core->clock_cycles_2;
}
@@ -1303,7 +1304,10 @@ void hyperstone_device::hyperstone_sard()
return;
}
- uint64_t val = concat_64(m_core->local_regs[dst_code], m_core->local_regs[dstf_code]);
+ uint32_t high_order = m_core->local_regs[dst_code];
+ const uint32_t low_order = m_core->local_regs[dstf_code];
+
+ uint64_t val = concat_64(high_order, low_order);
SR &= ~(C_MASK | Z_MASK | N_MASK);
@@ -1313,22 +1317,21 @@ void hyperstone_device::hyperstone_sard()
{
SR |= (val >> (n - 1)) & 1;
- uint32_t sign_bit = val >> 63;
-
+ const uint64_t sign_bit = val >> 63;
val >>= n;
if (sign_bit)
- {
val |= 0xffffffff00000000L << (32 - n);
- }
}
+ high_order = extract_64hi(val);
+
if (val == 0)
SR |= Z_MASK;
- SR |= SIGN64_TO_N(val);
+ SR |= SIGN_TO_N(high_order);
- m_core->local_regs[dst_code] = (uint32_t)(val >> 32);
- m_core->local_regs[dstf_code] = (uint32_t)val;
+ m_core->local_regs[dst_code] = high_order;
+ m_core->local_regs[dstf_code] = extract_64lo(val);
m_core->icount -= m_core->clock_cycles_2;
}
diff --git a/src/devices/cpu/es5510/es5510.cpp b/src/devices/cpu/es5510/es5510.cpp
index cde4b4be4ee..61a25f915db 100644
--- a/src/devices/cpu/es5510/es5510.cpp
+++ b/src/devices/cpu/es5510/es5510.cpp
@@ -363,12 +363,12 @@ uint8_t es5510_device::host_r(address_space &space, offs_t offset)
{
// printf("%06x: DSP read offset %04x (data is %04x)\n",pc(),offset,dsp_ram[offset]);
- // VFX hack
+ // VFX hack (FIXME: this is disgusting)
if (core_stricmp(machine().system().name, "vfx") == 0)
{
if (pc == 0xc091f0)
{
- return space.device().state().state_int(M68K_D2);
+ return downcast<m68000_base_device &>(space.device()).state_int(M68K_D2);
}
}
diff --git a/src/devices/cpu/f2mc16/f2mc16.cpp b/src/devices/cpu/f2mc16/f2mc16.cpp
index a55193b5737..e9ff60a04c8 100644
--- a/src/devices/cpu/f2mc16/f2mc16.cpp
+++ b/src/devices/cpu/f2mc16/f2mc16.cpp
@@ -2840,7 +2840,7 @@ void f2mc16_device::opcodes_ea73(u8 operand)
case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
m_tmp16 = doDEC_16(read_16(m_tmpea));
write_16(m_tmpea, m_tmp16);
m_pc += 3;
diff --git a/src/devices/cpu/g65816/g65816.cpp b/src/devices/cpu/g65816/g65816.cpp
index 2a5c52c2d58..89ecc44167b 100644
--- a/src/devices/cpu/g65816/g65816.cpp
+++ b/src/devices/cpu/g65816/g65816.cpp
@@ -771,6 +771,7 @@ void g65816_device::g65816_set_pc(unsigned val)
g65816_jumping(REGISTER_PB | REGISTER_PC);
}
+#ifdef UNUSED_FUNCTION
/* Get the current Stack Pointer */
unsigned g65816_device::g65816_get_sp()
{
@@ -782,6 +783,7 @@ void g65816_device::g65816_set_sp(unsigned val)
{
REGISTER_S = FLAG_E ? MAKE_UINT_8(val) | 0x100 : MAKE_UINT_16(val);
}
+#endif
/* Get a register */
unsigned g65816_device::g65816_get_reg(int regnum)
@@ -922,7 +924,6 @@ void g65816_device::device_start()
state_add( STATE_GENPC, "GENPC", m_debugger_temp).callimport().callexport().formatstr("%06X").noshow();
state_add( STATE_GENPCBASE, "CURPC", m_debugger_temp).callimport().callexport().formatstr("%06X").noshow();
- state_add( STATE_GENSP, "GENSP", m_debugger_temp).callimport().callexport().formatstr("%06X").noshow();
state_add( STATE_GENFLAGS, "GENFLAGS", m_debugger_temp).formatstr("%8s").noshow();
set_icountptr(m_ICount);
@@ -936,9 +937,6 @@ void g65816_device::state_import(const device_state_entry &entry)
case STATE_GENPCBASE:
g65816_set_pc(m_debugger_temp);
break;
- case STATE_GENSP:
- g65816_set_sp(m_debugger_temp);
- break;
case G65816_PC:
case G65816_PB:
case G65816_DB:
@@ -983,9 +981,6 @@ void g65816_device::state_export(const device_state_entry &entry)
case G65816_PC:
m_debugger_temp = g65816_get_pc();
break;
- case STATE_GENSP:
- m_debugger_temp = g65816_get_sp();
- break;
case G65816_PB:
m_debugger_temp = m_pb>>16;
break;
diff --git a/src/devices/cpu/g65816/g65816.h b/src/devices/cpu/g65816/g65816.h
index 5d88d3d5fde..3c6acf9f6d1 100644
--- a/src/devices/cpu/g65816/g65816.h
+++ b/src/devices/cpu/g65816/g65816.h
@@ -140,8 +140,10 @@ protected:
int bus_5A22_cycle_burst(unsigned addr);
unsigned g65816_get_pc();
void g65816_set_pc(unsigned val);
+#ifdef UNUSED_FUNCTION
unsigned g65816_get_sp();
void g65816_set_sp(unsigned val);
+#endif
public:
unsigned g65816_get_reg(int regnum);
void g65816_set_reg(int regnum, unsigned value);
diff --git a/src/devices/cpu/g65816/g65816op.h b/src/devices/cpu/g65816/g65816op.h
index d1ae11d84c6..6dc51066428 100644
--- a/src/devices/cpu/g65816/g65816op.h
+++ b/src/devices/cpu/g65816/g65816op.h
@@ -1867,7 +1867,6 @@ TABLE_FUNCTION(unsigned, get_reg, (int regnum))
case G65816_A: return REGISTER_B | REGISTER_A;
case G65816_X: return REGISTER_X;
case G65816_Y: return REGISTER_Y;
- case STATE_GENSP: return REGISTER_S;
case G65816_S: return REGISTER_S;
case STATE_GENPC: return REGISTER_PC;
case G65816_PC: return REGISTER_PC;
@@ -1891,9 +1890,9 @@ TABLE_FUNCTION(void, set_reg, (int regnum, unsigned val))
{
case STATE_GENPC: case G65816_PC: REGISTER_PC = MAKE_UINT_16(val); break;
#if FLAG_SET_E
- case STATE_GENSP: case G65816_S: REGISTER_S = MAKE_UINT_8(val) | 0x100; break;
+ case G65816_S: REGISTER_S = MAKE_UINT_8(val) | 0x100; break;
#else
- case STATE_GENSP: case G65816_S: REGISTER_S = MAKE_UINT_16(val); break;
+ case G65816_S: REGISTER_S = MAKE_UINT_16(val); break;
#endif
case G65816_P: g65816i_set_reg_p(val); break;
#if FLAG_SET_M
diff --git a/src/devices/cpu/hphybrid/hphybrid.cpp b/src/devices/cpu/hphybrid/hphybrid.cpp
index fae3b8474c7..5897672ca53 100644
--- a/src/devices/cpu/hphybrid/hphybrid.cpp
+++ b/src/devices/cpu/hphybrid/hphybrid.cpp
@@ -208,7 +208,6 @@ void hp_hybrid_cpu_device::device_start()
state_add(STATE_GENPC, "GENPC", m_genpc).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_genpc).noshow();
state_add(HPHYBRID_R, "R", m_reg_R);
- state_add(STATE_GENSP, "GENSP", m_reg_R).noshow();
state_add(HPHYBRID_IV, "IV", m_reg_IV);
state_add(HPHYBRID_PA, "PA", m_reg_PA[ 0 ]);
state_add(HPHYBRID_W, "W", m_reg_W).noshow();
diff --git a/src/devices/cpu/i386/i386.cpp b/src/devices/cpu/i386/i386.cpp
index c9e13e1b252..d27474ff656 100644
--- a/src/devices/cpu/i386/i386.cpp
+++ b/src/devices/cpu/i386/i386.cpp
@@ -1557,10 +1557,13 @@ void i386_device::report_invalid_opcode()
#ifndef DEBUG_MISSING_OPCODE
logerror("i386: Invalid opcode %02X at %08X %s\n", m_opcode, m_pc - 1, m_lock ? "with lock" : "");
#else
- logerror("i386: Invalid opcode");
+ logerror("Invalid opcode");
for (int a = 0; a < m_opcode_bytes_length; a++)
logerror(" %02X", m_opcode_bytes[a]);
- logerror(" at %08X\n", m_opcode_pc);
+ logerror(" at %08X %s\n", m_opcode_pc, m_lock ? "with lock" : "");
+ logerror("Backtrace:\n");
+ for (uint32_t i = 1; i < 16; i++)
+ logerror(" %08X\n", m_opcode_addrs[(m_opcode_addrs_index - i) & 15]);
#endif
}
@@ -1569,10 +1572,13 @@ void i386_device::report_invalid_modrm(const char* opcode, uint8_t modrm)
#ifndef DEBUG_MISSING_OPCODE
logerror("i386: Invalid %s modrm %01X at %08X\n", opcode, modrm, m_pc - 2);
#else
- logerror("i386: Invalid %s modrm %01X", opcode, modrm);
+ logerror("Invalid %s modrm %01X", opcode, modrm);
for (int a = 0; a < m_opcode_bytes_length; a++)
logerror(" %02X", m_opcode_bytes[a]);
- logerror(" at %08X\n", m_opcode_pc);
+ logerror(" at %08X %s\n", m_opcode_pc, m_lock ? "with lock" : "");
+ logerror("Backtrace:\n");
+ for (uint32_t i = 1; i < 16; i++)
+ logerror(" %08X\n", m_opcode_addrs[(m_opcode_addrs_index - i) & 15]);
#endif
i386_trap(6, 0, 0);
}
@@ -2123,7 +2129,6 @@ void i386_device::register_state_i386()
state_add( STATE_GENPC, "GENPC", m_pc).noshow();
state_add( STATE_GENPCBASE, "CURPC", m_pc).noshow();
state_add( STATE_GENFLAGS, "GENFLAGS", m_debugger_temp).formatstr("%32s").noshow();
- state_add( STATE_GENSP, "GENSP", REG32(ESP)).noshow();
}
void i386_device::register_state_i386_x87()
@@ -2442,6 +2447,8 @@ void i386_device::zero_state()
memset( m_opcode_bytes, 0, sizeof(m_opcode_bytes) );
m_opcode_pc = 0;
m_opcode_bytes_length = 0;
+ memset(m_opcode_addrs, 0, sizeof(m_opcode_addrs));
+ m_opcode_addrs_index = 0;
}
void i386_device::device_reset()
@@ -2788,6 +2795,8 @@ void i386_device::execute_run()
#ifdef DEBUG_MISSING_OPCODE
m_opcode_bytes_length = 0;
m_opcode_pc = m_pc;
+ m_opcode_addrs[m_opcode_addrs_index] = m_opcode_pc;
+ m_opcode_addrs_index = (m_opcode_addrs_index + 1) & 15;
#endif
try
{
diff --git a/src/devices/cpu/i386/i386.h b/src/devices/cpu/i386/i386.h
index 64730816b66..d1080b9608c 100644
--- a/src/devices/cpu/i386/i386.h
+++ b/src/devices/cpu/i386/i386.h
@@ -386,6 +386,8 @@ protected:
uint8_t m_opcode_bytes[16];
uint32_t m_opcode_pc;
int m_opcode_bytes_length;
+ offs_t m_opcode_addrs[16];
+ uint32_t m_opcode_addrs_index;
uint64_t m_debugger_temp;
diff --git a/src/devices/cpu/i8085/i8085.cpp b/src/devices/cpu/i8085/i8085.cpp
index 7fddcb77af5..65d0896c401 100644
--- a/src/devices/cpu/i8085/i8085.cpp
+++ b/src/devices/cpu/i8085/i8085.cpp
@@ -320,7 +320,6 @@ void i8085a_cpu_device::device_start()
state_add(STATE_GENPC, "GENPC", m_PC.w.l).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_PC.w.l).noshow();
state_add(I8085_SP, "SP", m_SP.w.l);
- state_add(STATE_GENSP, "GENSP", m_SP.w.l).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_AF.b.l).noshow().formatstr("%8s");
state_add(I8085_A, "A", m_AF.b.h).noshow();
state_add(I8085_B, "B", m_BC.b.h).noshow();
diff --git a/src/devices/cpu/ks0164/ks0164.cpp b/src/devices/cpu/ks0164/ks0164.cpp
index 8bb447993a4..b77cf5d5114 100644
--- a/src/devices/cpu/ks0164/ks0164.cpp
+++ b/src/devices/cpu/ks0164/ks0164.cpp
@@ -28,7 +28,6 @@ void ks0164_cpu_device::device_start()
state_add(STATE_GENPC, "GENPC", m_r[R_PC]).callexport().noshow();
state_add(STATE_GENPCBASE, "CURPC", m_r[R_PC]).callexport().noshow();
- state_add(STATE_GENSP, "GENSP", m_r[R_SP]).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_r[R_PSW]).callimport().formatstr("%8s").noshow();
state_add(KS0164_PC, "PC", m_r[R_PC]).callimport();
state_add(KS0164_PSW, "PSW", m_r[R_PSW]).callimport();
diff --git a/src/devices/cpu/m6502/m6502.cpp b/src/devices/cpu/m6502/m6502.cpp
index 4bbcd3358f7..50d294dc8d9 100644
--- a/src/devices/cpu/m6502/m6502.cpp
+++ b/src/devices/cpu/m6502/m6502.cpp
@@ -57,7 +57,6 @@ void m6502_device::init()
state_add(STATE_GENPC, "GENPC", XPC).callexport().noshow();
state_add(STATE_GENPCBASE, "CURPC", XPC).callexport().noshow();
- state_add(STATE_GENSP, "GENSP", SP).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", P).callimport().formatstr("%6s").noshow();
state_add(M6502_PC, "PC", NPC).callimport();
state_add(M6502_A, "A", A);
diff --git a/src/devices/cpu/m68000/m68kcpu.cpp b/src/devices/cpu/m68000/m68kcpu.cpp
index 6f47f9b9a4e..dd2938aba61 100644
--- a/src/devices/cpu/m68000/m68kcpu.cpp
+++ b/src/devices/cpu/m68000/m68kcpu.cpp
@@ -1681,7 +1681,6 @@ void m68000_base_device::define_state(void)
state_add(M68K_SR, "SR", m_iotemp).callimport().callexport().mask(m_sr_mask);
state_add(STATE_GENFLAGS, "GENFLAGS", m_iotemp).noshow().callimport().callexport().formatstr("%16s");
state_add(M68K_SP, "SP", m_dar[15]);
- state_add(STATE_GENSP, "GENSP", m_dar[15]).noshow();
state_add(M68K_USP, "USP", m_iotemp).callimport().callexport();
if (m_cpu_type & MASK_020_OR_LATER)
{
diff --git a/src/devices/cpu/m6805/m68705.h b/src/devices/cpu/m6805/m68705.h
index f6e02430acc..9f5354f9f6f 100644
--- a/src/devices/cpu/m6805/m68705.h
+++ b/src/devices/cpu/m6805/m68705.h
@@ -425,6 +425,8 @@ class m68705u3_device : public m68705u_device
public:
m68705u3_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
+ static auto parent_rom_device_type() { return &M68705R3; }
+
protected:
virtual tiny_rom_entry const *device_rom_region() const override;
diff --git a/src/devices/cpu/mb86233/mb86233.cpp b/src/devices/cpu/mb86233/mb86233.cpp
index b3abdb85b44..6e624b1c295 100644
--- a/src/devices/cpu/mb86233/mb86233.cpp
+++ b/src/devices/cpu/mb86233/mb86233.cpp
@@ -96,7 +96,7 @@ void mb86233_device::device_start()
state_add(STATE_GENPC, "GENPC", m_pc);
state_add(STATE_GENPCBASE, "PC", m_ppc).noshow();
- state_add(STATE_GENSP, "SP", m_sp);
+ state_add(REG_SP, "SP", m_sp);
state_add(STATE_GENFLAGS, "ST", m_st);
state_add(REG_A, "A", m_a);
diff --git a/src/devices/cpu/mb86233/mb86233.h b/src/devices/cpu/mb86233/mb86233.h
index 5e8c0b10d16..4b1915dc836 100644
--- a/src/devices/cpu/mb86233/mb86233.h
+++ b/src/devices/cpu/mb86233/mb86233.h
@@ -19,7 +19,8 @@ public:
REG_R, REG_C0, REG_C1,
REG_B0, REG_B1, REG_X0, REG_X1, REG_I0, REG_I1,
REG_SFT, REG_VSM, REG_MASK, REG_M,
- REG_PCS0, REG_PCS1, REG_PCS2, REG_PCS3
+ REG_PCS0, REG_PCS1, REG_PCS2, REG_PCS3,
+ REG_SP
};
enum st_flags {
diff --git a/src/devices/cpu/mc68hc11/mc68hc11.cpp b/src/devices/cpu/mc68hc11/mc68hc11.cpp
index 4b3909b4983..c4768d25765 100644
--- a/src/devices/cpu/mc68hc11/mc68hc11.cpp
+++ b/src/devices/cpu/mc68hc11/mc68hc11.cpp
@@ -245,6 +245,26 @@ void mc68hc11_cpu_device::toc_w(offs_t offset, uint8_t data)
toc = (data << 8) | (toc & 0xff);
}
+uint8_t mc68hc11_cpu_device::tctl1_r()
+{
+ return m_tctl1;
+}
+
+void mc68hc11_cpu_device::tctl1_w(uint8_t data)
+{
+ m_tctl1 = data;
+}
+
+uint8_t mc68hc11_cpu_device::tctl2_r()
+{
+ return m_tctl2;
+}
+
+void mc68hc11_cpu_device::tctl2_w(uint8_t data)
+{
+ m_tctl2 = data;
+}
+
uint8_t mc68hc11_cpu_device::tmsk1_r()
{
return m_tmsk1;
@@ -418,6 +438,12 @@ uint8_t mc68hc11_cpu_device::opt4_r()
return 0;
}
+uint8_t mc68hc11d0_device::reg01_r()
+{
+ // "Reserved" according to datasheet; asma2k reads from here due to a programming error and writes value back to TFLG1
+ return 0xff;
+}
+
void mc68hc11a1_device::mc68hc11_reg_map(memory_view::memory_view_entry &block, offs_t base)
{
block(base + 0x00, base + 0x00).rw(FUNC(mc68hc11a1_device::port_r<0>), FUNC(mc68hc11a1_device::port_w<0>)); // PORTA
@@ -431,6 +457,8 @@ void mc68hc11a1_device::mc68hc11_reg_map(memory_view::memory_view_entry &block,
block(base + 0x0a, base + 0x0a).r(FUNC(mc68hc11a1_device::port_r<4>)); // PORTE
block(base + 0x0e, base + 0x0f).rw(FUNC(mc68hc11a1_device::tcnt_r), FUNC(mc68hc11a1_device::tcnt_w)); // TCNT
block(base + 0x16, base + 0x1f).rw(FUNC(mc68hc11a1_device::toc_r), FUNC(mc68hc11a1_device::toc_w)); // TOC1-TOC5
+ block(base + 0x20, base + 0x20).rw(FUNC(mc68hc11a1_device::tctl1_r), FUNC(mc68hc11a1_device::tctl1_w)); // TCTL1
+ block(base + 0x21, base + 0x21).rw(FUNC(mc68hc11a1_device::tctl2_r), FUNC(mc68hc11a1_device::tctl2_w)); // TCTL2
block(base + 0x22, base + 0x22).rw(FUNC(mc68hc11a1_device::tmsk1_r), FUNC(mc68hc11a1_device::tmsk1_w)); // TMSK1
block(base + 0x23, base + 0x23).rw(FUNC(mc68hc11a1_device::tflg1_r), FUNC(mc68hc11a1_device::tflg1_w)); // TFLG1
block(base + 0x24, base + 0x24).rw(FUNC(mc68hc11a1_device::tmsk2_r), FUNC(mc68hc11a1_device::tmsk2_w)); // TMSK2
@@ -453,6 +481,7 @@ void mc68hc11a1_device::mc68hc11_reg_map(memory_view::memory_view_entry &block,
void mc68hc11d0_device::mc68hc11_reg_map(memory_view::memory_view_entry &block, offs_t base)
{
block(base + 0x00, base + 0x00).rw(FUNC(mc68hc11d0_device::port_r<0>), FUNC(mc68hc11d0_device::port_w<0>)); // PORTA
+ block(base + 0x01, base + 0x01).r(FUNC(mc68hc11d0_device::reg01_r));
block(base + 0x02, base + 0x02).r(FUNC(mc68hc11d0_device::pioc_r)); // PIOC
block(base + 0x03, base + 0x03).rw(FUNC(mc68hc11d0_device::port_r<2>), FUNC(mc68hc11d0_device::port_w<2>)); // PORTC
block(base + 0x04, base + 0x04).rw(FUNC(mc68hc11d0_device::port_r<1>), FUNC(mc68hc11d0_device::port_w<1>)); // PORTB
@@ -462,6 +491,8 @@ void mc68hc11d0_device::mc68hc11_reg_map(memory_view::memory_view_entry &block,
block(base + 0x09, base + 0x09).rw(FUNC(mc68hc11d0_device::ddr_r<3>), FUNC(mc68hc11d0_device::ddr_w<3>)); // DDRD
block(base + 0x0e, base + 0x0f).rw(FUNC(mc68hc11d0_device::tcnt_r), FUNC(mc68hc11d0_device::tcnt_w)); // TCNT
block(base + 0x16, base + 0x1f).rw(FUNC(mc68hc11d0_device::toc_r), FUNC(mc68hc11d0_device::toc_w)); // TOC1-TOC4, TI4/O5
+ block(base + 0x20, base + 0x20).rw(FUNC(mc68hc11d0_device::tctl1_r), FUNC(mc68hc11d0_device::tctl1_w)); // TCTL1
+ block(base + 0x21, base + 0x21).rw(FUNC(mc68hc11d0_device::tctl2_r), FUNC(mc68hc11d0_device::tctl2_w)); // TCTL2
block(base + 0x22, base + 0x22).rw(FUNC(mc68hc11d0_device::tmsk1_r), FUNC(mc68hc11d0_device::tmsk1_w)); // TMSK1
block(base + 0x23, base + 0x23).rw(FUNC(mc68hc11d0_device::tflg1_r), FUNC(mc68hc11d0_device::tflg1_w)); // TFLG1
block(base + 0x24, base + 0x24).rw(FUNC(mc68hc11d0_device::tmsk2_r), FUNC(mc68hc11d0_device::tmsk2_w)); // TMSK2
@@ -493,6 +524,8 @@ void mc68hc811e2_device::mc68hc11_reg_map(memory_view::memory_view_entry &block,
block(base + 0x0a, base + 0x0a).r(FUNC(mc68hc811e2_device::port_r<4>)); // PORTE
block(base + 0x0e, base + 0x0f).rw(FUNC(mc68hc811e2_device::tcnt_r), FUNC(mc68hc811e2_device::tcnt_w)); // TCNT
block(base + 0x16, base + 0x1f).rw(FUNC(mc68hc811e2_device::toc_r), FUNC(mc68hc811e2_device::toc_w)); // TOC1-TOC4, TI4/O5
+ block(base + 0x20, base + 0x20).rw(FUNC(mc68hc811e2_device::tctl1_r), FUNC(mc68hc811e2_device::tctl1_w)); // TCTL1
+ block(base + 0x21, base + 0x21).rw(FUNC(mc68hc811e2_device::tctl2_r), FUNC(mc68hc811e2_device::tctl2_w)); // TCTL2
block(base + 0x22, base + 0x22).rw(FUNC(mc68hc811e2_device::tmsk1_r), FUNC(mc68hc811e2_device::tmsk1_w)); // TMSK1
block(base + 0x23, base + 0x23).rw(FUNC(mc68hc811e2_device::tflg1_r), FUNC(mc68hc811e2_device::tflg1_w)); // TFLG1
block(base + 0x24, base + 0x24).rw(FUNC(mc68hc811e2_device::tmsk2_r), FUNC(mc68hc811e2_device::tmsk2_w)); // TMSK2
@@ -533,6 +566,8 @@ void mc68hc11f1_device::mc68hc11_reg_map(memory_view::memory_view_entry &block,
block(base + 0x12, base + 0x13).nopr(); // TIC2
block(base + 0x14, base + 0x15).nopr(); // TIC3
block(base + 0x16, base + 0x1f).rw(FUNC(mc68hc11f1_device::toc_r), FUNC(mc68hc11f1_device::toc_w)); // TOC1-TOC4, TI4/O5
+ block(base + 0x20, base + 0x20).rw(FUNC(mc68hc11f1_device::tctl1_r), FUNC(mc68hc11f1_device::tctl1_w)); // TCTL1
+ block(base + 0x21, base + 0x21).rw(FUNC(mc68hc11f1_device::tctl2_r), FUNC(mc68hc11f1_device::tctl2_w)); // TCTL2
block(base + 0x22, base + 0x22).rw(FUNC(mc68hc11f1_device::tmsk1_r), FUNC(mc68hc11f1_device::tmsk1_w)); // TMSK1
block(base + 0x23, base + 0x23).rw(FUNC(mc68hc11f1_device::tflg1_r), FUNC(mc68hc11f1_device::tflg1_w)); // TFLG1
block(base + 0x24, base + 0x24).rw(FUNC(mc68hc11f1_device::tmsk2_r), FUNC(mc68hc11f1_device::tmsk2_w)); // TMSK2
@@ -579,6 +614,8 @@ void mc68hc11k1_device::mc68hc11_reg_map(memory_view::memory_view_entry &block,
block(base + 0x0a, base + 0x0a).r(FUNC(mc68hc11k1_device::port_r<4>)); // PORTE
block(base + 0x0e, base + 0x0f).rw(FUNC(mc68hc11k1_device::tcnt_r), FUNC(mc68hc11k1_device::tcnt_w)); // TCNT
block(base + 0x16, base + 0x1f).rw(FUNC(mc68hc11k1_device::toc_r), FUNC(mc68hc11k1_device::toc_w)); // TOC1-TOC4, TI4/O5
+ block(base + 0x20, base + 0x20).rw(FUNC(mc68hc11k1_device::tctl1_r), FUNC(mc68hc11k1_device::tctl1_w)); // TCTL1
+ block(base + 0x21, base + 0x21).rw(FUNC(mc68hc11k1_device::tctl2_r), FUNC(mc68hc11k1_device::tctl2_w)); // TCTL2
block(base + 0x22, base + 0x22).rw(FUNC(mc68hc11k1_device::tmsk1_r), FUNC(mc68hc11k1_device::tmsk1_w)); // TMSK1
block(base + 0x23, base + 0x23).rw(FUNC(mc68hc11k1_device::tflg1_r), FUNC(mc68hc11k1_device::tflg1_w)); // TFLG1
block(base + 0x24, base + 0x24).rw(FUNC(mc68hc11k1_device::tmsk2_r), FUNC(mc68hc11k1_device::tmsk2_w)); // TMSK2
@@ -621,6 +658,8 @@ void mc68hc11m0_device::mc68hc11_reg_map(memory_view::memory_view_entry &block,
block(base + 0x0a, base + 0x0a).r(FUNC(mc68hc11m0_device::port_r<4>)); // PORTE
block(base + 0x0e, base + 0x0f).rw(FUNC(mc68hc11m0_device::tcnt_r), FUNC(mc68hc11m0_device::tcnt_w)); // TCNT
block(base + 0x16, base + 0x1f).rw(FUNC(mc68hc11m0_device::toc_r), FUNC(mc68hc11m0_device::toc_w)); // TOC1-TOC4, TI4/O5
+ block(base + 0x20, base + 0x20).rw(FUNC(mc68hc11m0_device::tctl1_r), FUNC(mc68hc11m0_device::tctl1_w)); // TCTL1
+ block(base + 0x21, base + 0x21).rw(FUNC(mc68hc11m0_device::tctl2_r), FUNC(mc68hc11m0_device::tctl2_w)); // TCTL2
block(base + 0x22, base + 0x22).rw(FUNC(mc68hc11m0_device::tmsk1_r), FUNC(mc68hc11m0_device::tmsk1_w)); // TMSK1
block(base + 0x23, base + 0x23).rw(FUNC(mc68hc11m0_device::tflg1_r), FUNC(mc68hc11m0_device::tflg1_w)); // TFLG1
block(base + 0x24, base + 0x24).rw(FUNC(mc68hc11m0_device::tmsk2_r), FUNC(mc68hc11m0_device::tmsk2_w)); // TMSK2
@@ -741,6 +780,8 @@ void mc68hc11_cpu_device::device_start()
save_item(NAME(m_irq_state));
save_item(NAME(m_wait_state));
save_item(NAME(m_stop_state));
+ save_item(NAME(m_tctl1));
+ save_item(NAME(m_tctl2));
save_item(NAME(m_tflg1));
save_item(NAME(m_tmsk1));
save_item(NAME(m_toc));
@@ -823,6 +864,8 @@ void mc68hc11_cpu_device::device_reset()
std::fill(std::begin(m_toc), std::end(m_toc), 0xffff);
m_tcnt = 0xffff;
// m_por = 1; // for first timer overflow / compare stuff
+ m_tctl1 = 0;
+ m_tctl2 = 0;
m_tflg1 = 0;
m_tflg2 = 0;
m_tmsk2 = 3; // timer prescale
diff --git a/src/devices/cpu/mc68hc11/mc68hc11.h b/src/devices/cpu/mc68hc11/mc68hc11.h
index 99f2671bfbc..da3d7477daf 100644
--- a/src/devices/cpu/mc68hc11/mc68hc11.h
+++ b/src/devices/cpu/mc68hc11/mc68hc11.h
@@ -87,6 +87,10 @@ protected:
void tcnt_w(offs_t offset, uint8_t data);
uint8_t toc_r(offs_t offset);
void toc_w(offs_t offset, uint8_t data);
+ uint8_t tctl1_r();
+ void tctl1_w(uint8_t data);
+ uint8_t tctl2_r();
+ void tctl2_w(uint8_t data);
uint8_t tmsk1_r();
void tmsk1_w(uint8_t data);
uint8_t tflg1_r();
@@ -176,6 +180,8 @@ private:
uint8_t m_wait_state;
uint8_t m_stop_state;
+ uint8_t m_tctl1;
+ uint8_t m_tctl2;
uint8_t m_tflg1;
uint8_t m_tmsk1;
uint16_t m_toc[5];
@@ -562,6 +568,9 @@ protected:
virtual void device_reset() override;
virtual void mc68hc11_reg_map(memory_view::memory_view_entry &block, offs_t base) override;
+
+private:
+ uint8_t reg01_r();
};
class mc68hc811e2_device : public mc68hc11_cpu_device
diff --git a/src/devices/cpu/mcs48/mcs48.cpp b/src/devices/cpu/mcs48/mcs48.cpp
index 2b51e1df82b..3ae0653c98a 100644
--- a/src/devices/cpu/mcs48/mcs48.cpp
+++ b/src/devices/cpu/mcs48/mcs48.cpp
@@ -1148,7 +1148,7 @@ void mcs48_cpu_device::device_start()
state_add(MCS48_PC, "PC", m_pc).mask(0xfff);
state_add(STATE_GENPC, "GENPC", m_pc).mask(0xfff).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_prevpc).mask(0xfff).noshow();
- state_add(STATE_GENSP, "GENSP", m_psw).mask(0x7).noshow();
+ state_add(MCS48_SP, "SP", m_psw).mask(0x7).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_psw).noshow().formatstr("%11s");
state_add(MCS48_A, "A", m_a);
state_add(MCS48_TC, "TC", m_timer);
diff --git a/src/devices/cpu/mcs48/mcs48.h b/src/devices/cpu/mcs48/mcs48.h
index 4fb1b75643f..57693a8eacb 100644
--- a/src/devices/cpu/mcs48/mcs48.h
+++ b/src/devices/cpu/mcs48/mcs48.h
@@ -24,6 +24,7 @@ enum
{
MCS48_PC,
MCS48_PSW,
+ MCS48_SP,
MCS48_A,
MCS48_TC,
MCS48_TPRE,
diff --git a/src/devices/cpu/mcs96/mcs96.cpp b/src/devices/cpu/mcs96/mcs96.cpp
index e1524462f13..a7a3f112c5d 100644
--- a/src/devices/cpu/mcs96/mcs96.cpp
+++ b/src/devices/cpu/mcs96/mcs96.cpp
@@ -38,7 +38,6 @@ void mcs96_device::device_start()
state_add(STATE_GENPC, "GENPC", PC).noshow();
state_add(STATE_GENPCBASE, "CURPC", PPC).noshow();
- state_add(STATE_GENSP, "GENSP", register_file[0]).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", PSW).formatstr("%16s").noshow();
state_add(MCS96_PC, "PC", PC);
state_add(MCS96_PSW, "PSW", PSW);
diff --git a/src/devices/cpu/mips/mips1.cpp b/src/devices/cpu/mips/mips1.cpp
index c5f18b2989e..9b041123d4d 100644
--- a/src/devices/cpu/mips/mips1.cpp
+++ b/src/devices/cpu/mips/mips1.cpp
@@ -1057,7 +1057,7 @@ void mips1core_device_base::lwl(u32 const op)
offs_t const offset = SIMMVAL + m_r[RSREG];
load<u32, false>(offset, [this, op, offset](u32 temp)
{
- unsigned const shift = ((offset & 3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 3, 0)) << 3;
+ unsigned const shift = ((offset & 3) ^ (m_endianness == ENDIANNESS_LITTLE ? 3 : 0)) << 3;
m_r[RTREG] = (m_r[RTREG] & ~u32(0xffffffffU << shift)) | (temp << shift);
});
@@ -1068,7 +1068,7 @@ void mips1core_device_base::lwr(u32 const op)
offs_t const offset = SIMMVAL + m_r[RSREG];
load<u32, false>(offset, [this, op, offset](u32 temp)
{
- unsigned const shift = ((offset & 0x3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 0, 3)) << 3;
+ unsigned const shift = ((offset & 0x3) ^ (m_endianness == ENDIANNESS_LITTLE ? 0 : 3)) << 3;
m_r[RTREG] = (m_r[RTREG] & ~u32(0xffffffffU >> shift)) | (temp >> shift);
});
@@ -1077,7 +1077,7 @@ void mips1core_device_base::lwr(u32 const op)
void mips1core_device_base::swl(u32 const op)
{
offs_t const offset = SIMMVAL + m_r[RSREG];
- unsigned const shift = ((offset & 3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 3, 0)) << 3;
+ unsigned const shift = ((offset & 3) ^ (m_endianness == ENDIANNESS_LITTLE ? 3 : 0)) << 3;
store<u32, false>(offset, m_r[RTREG] >> shift, 0xffffffffU >> shift);
}
@@ -1085,7 +1085,7 @@ void mips1core_device_base::swl(u32 const op)
void mips1core_device_base::swr(u32 const op)
{
offs_t const offset = SIMMVAL + m_r[RSREG];
- unsigned const shift = ((offset & 3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 0, 3)) << 3;
+ unsigned const shift = ((offset & 3) ^ (m_endianness == ENDIANNESS_LITTLE ? 0 : 3)) << 3;
store<u32, false>(offset, m_r[RTREG] << shift, 0xffffffffU << shift);
}
diff --git a/src/devices/cpu/mips/mips3.cpp b/src/devices/cpu/mips/mips3.cpp
index 45ead83f293..30fe253fcb6 100644
--- a/src/devices/cpu/mips/mips3.cpp
+++ b/src/devices/cpu/mips/mips3.cpp
@@ -728,7 +728,6 @@ void mips3_device::device_start()
state_add( MIPS3_LLADDR, "LLAddr", m_core->cpr[0][COP0_LLAddr]).formatstr("%08X");
state_add( STATE_GENPCBASE, "CURPC", m_core->pc).noshow();
- state_add( STATE_GENSP, "CURSP", m_core->r[31]).noshow();
state_add( STATE_GENFLAGS, "CURFLAGS", m_debugger_temp).formatstr("%1s").noshow();
set_icountptr(m_core->icount);
diff --git a/src/devices/cpu/nec/nec.cpp b/src/devices/cpu/nec/nec.cpp
index b46910bc4d9..052e6a6f348 100644
--- a/src/devices/cpu/nec/nec.cpp
+++ b/src/devices/cpu/nec/nec.cpp
@@ -544,7 +544,6 @@ void nec_common_device::device_start()
state_add( STATE_GENPC, "GENPC", m_debugger_temp).callexport().noshow();
state_add( STATE_GENPCBASE, "CURPC", m_debugger_temp).callexport().noshow();
- state_add( STATE_GENSP, "GENSP", m_debugger_temp).callimport().callexport().noshow();
state_add( STATE_GENFLAGS, "GENFLAGS", m_debugger_temp).formatstr("%16s").noshow();
set_icountptr(m_icount);
@@ -614,10 +613,6 @@ void nec_common_device::state_export(const device_state_entry &entry)
m_debugger_temp = (Sreg(PS)<<4) + m_prev_ip;
break;
- case STATE_GENSP:
- m_debugger_temp = (Sreg(SS)<<4) + Wreg(SP);
- break;
-
case NEC_PSW:
m_debugger_temp = CompressFlags();
break;
diff --git a/src/devices/cpu/nec/v25.cpp b/src/devices/cpu/nec/v25.cpp
index 76128dacbd6..50c8fe30a83 100644
--- a/src/devices/cpu/nec/v25.cpp
+++ b/src/devices/cpu/nec/v25.cpp
@@ -670,7 +670,6 @@ void v25_common_device::device_start()
state_add( STATE_GENPC, "GENPC", m_debugger_temp).callexport().noshow();
state_add( STATE_GENPCBASE, "CURPC", m_debugger_temp).callexport().noshow();
- state_add( STATE_GENSP, "GENSP", m_debugger_temp).callimport().callexport().noshow();
state_add( STATE_GENFLAGS, "GENFLAGS", m_debugger_temp).formatstr("%16s").noshow();
set_icountptr(m_icount);
@@ -738,10 +737,6 @@ void v25_common_device::state_export(const device_state_entry &entry)
case STATE_GENPCBASE:
m_debugger_temp = (Sreg(PS)<<4) + m_prev_ip;
break;
-
- case STATE_GENSP:
- m_debugger_temp = (Sreg(SS)<<4) + Wreg(SP);
- break;
}
}
diff --git a/src/devices/cpu/pdp8/hd6120.cpp b/src/devices/cpu/pdp8/hd6120.cpp
index 110dfffaea5..574cdde757a 100644
--- a/src/devices/cpu/pdp8/hd6120.cpp
+++ b/src/devices/cpu/pdp8/hd6120.cpp
@@ -606,9 +606,7 @@ void hd6120_device::execute_run()
case minor_state::TAD_4:
m_temp += m_ac;
if (m_temp >= 010000)
- m_flags |= 4;
- else
- m_flags &= 3;
+ m_flags ^= 4; // LINK is complemented upon carry out
next_instruction();
break;
diff --git a/src/devices/cpu/pdp8/pdp8dasm.cpp b/src/devices/cpu/pdp8/pdp8dasm.cpp
index 3fdbc139249..dca8fadf4e2 100644
--- a/src/devices/cpu/pdp8/pdp8dasm.cpp
+++ b/src/devices/cpu/pdp8/pdp8dasm.cpp
@@ -638,10 +638,10 @@ void pdp8_disassembler::dasm_opr_group2(std::ostream &stream, u16 opr)
{
if (BIT(opr, 7))
stream << "CLA";
- else if (opr == 07400)
+ else if (opr == 0400)
stream << "NOP";
- if ((opr & 0176) == 0)
- stream << "!200";
+ if ((opr & 0170) == 0)
+ stream << "!400";
}
}
diff --git a/src/devices/cpu/powerpc/ppccom.cpp b/src/devices/cpu/powerpc/ppccom.cpp
index 37b24044cca..b96eebeae31 100644
--- a/src/devices/cpu/powerpc/ppccom.cpp
+++ b/src/devices/cpu/powerpc/ppccom.cpp
@@ -842,7 +842,6 @@ void ppc_device::device_start()
state_add(STATE_GENPC, "GENPC", m_core->pc).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_core->pc).noshow();
- state_add(STATE_GENSP, "GENSP", m_core->r[31]).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_debugger_temp).noshow().formatstr("%1s");
set_icountptr(m_core->icount);
diff --git a/src/devices/cpu/pps4/pps4.cpp b/src/devices/cpu/pps4/pps4.cpp
index 9de3131ba19..6603d96db02 100644
--- a/src/devices/cpu/pps4/pps4.cpp
+++ b/src/devices/cpu/pps4/pps4.cpp
@@ -125,7 +125,7 @@ u8 pps4_device::M()
{
u8 ret = m_data.read_byte(m_B & ~m_SAG);
m_SAG = 0;
- return ret;
+ return ret & 15;
}
@@ -211,9 +211,9 @@ inline u8 pps4_device::ARG()
*/
void pps4_device::iAD()
{
- m_A = m_A + M();
- m_C = (m_A >> 4) & 1;
- m_A = m_A & 15;
+ m_A += M();
+ m_C = (m_A > 15) ? 1 : 0;
+ m_A &= 15;
}
/**
@@ -232,8 +232,8 @@ void pps4_device::iAD()
void pps4_device::iADC()
{
m_A = m_A + M() + m_C;
- m_C = m_A >> 4;
- m_A = m_A & 15;
+ m_C = (m_A > 15) ? 1 : 0;
+ m_A &= 15;
}
/**
@@ -252,10 +252,11 @@ void pps4_device::iADC()
*/
void pps4_device::iADSK()
{
- m_A = m_A + M();
- m_C = m_A >> 4;
+ m_A = m_A + M() + m_C; // This fixes the diagnostic test button, same as pinmame. It means ADSK and ADCSK are the same.
+ //m_A += M();
+ m_C = (m_A > 15) ? 1 : 0;
m_Skip = m_C;
- m_A = m_A & 15;
+ m_A &= 15;
}
/**
@@ -275,9 +276,9 @@ void pps4_device::iADSK()
void pps4_device::iADCSK()
{
m_A = m_A + M() + m_C;
- m_C = m_A >> 4;
+ m_C = (m_A > 15) ? 1 : 0;
m_Skip = m_C;
- m_A = m_A & 15;
+ m_A &= 15;
}
/**
@@ -304,9 +305,9 @@ void pps4_device::iADCSK()
void pps4_device::iADI()
{
const u8 imm = ~m_I1 & 15;
- m_A = m_A + imm;
- m_Skip = (m_A >> 4) & 1;
- m_A = m_A & 15;
+ m_A += imm;
+ m_Skip = (m_A > 15) ? 1 : 0;
+ m_A &= 15;
}
/**
@@ -326,7 +327,7 @@ void pps4_device::iADI()
*/
void pps4_device::iDC()
{
- m_A = m_A + 10;
+ m_A = (m_A + 10) & 15;
}
/**
@@ -345,7 +346,7 @@ void pps4_device::iDC()
*/
void pps4_device::iAND()
{
- m_A = m_A & M();
+ m_A &= M();
}
/**
@@ -364,7 +365,7 @@ void pps4_device::iAND()
*/
void pps4_device::iOR()
{
- m_A = m_A | M();
+ m_A |= M();
}
/**
@@ -384,7 +385,7 @@ void pps4_device::iOR()
*/
void pps4_device::iEOR()
{
- m_A = m_A ^ M();
+ m_A ^= M();
}
/**
@@ -402,7 +403,7 @@ void pps4_device::iEOR()
*/
void pps4_device::iCOMP()
{
- m_A = m_A ^ 15;
+ m_A ^= 15;
}
/**
@@ -522,7 +523,7 @@ void pps4_device::iRF2()
* by B register are placed in the accumulator.
* The RAM address in the B register is then
* modified by the result of an exclusive-OR of
- * the 3-b it immediate field I(3:1) and B(7:5)
+ * the 3-b immediate field I(3:1) and B(7:5)
*
* See %Note3
*/
@@ -530,7 +531,7 @@ void pps4_device::iLD()
{
const u16 i3c = ~m_I1 & 7;
m_A = M();
- m_B = m_B ^ (i3c << 4);
+ m_B ^= (i3c << 4);
}
/**
@@ -555,7 +556,7 @@ void pps4_device::iEX()
const u8 mem = M();
W(m_A);
m_A = mem;
- m_B = m_B ^ (i3c << 4);
+ m_B ^= (i3c << 4);
}
/**
@@ -585,14 +586,10 @@ void pps4_device::iEXD()
u8 bl = m_B & 15;
W(m_A);
m_A = mem;
- m_B = m_B ^ (i3c << 4);
+ m_B ^= (i3c << 4);
// if decrement BL wraps to 1111b
- if (0 == bl) {
- bl = 15;
- m_Skip = 1;
- } else {
- bl = bl - 1;
- }
+ bl = (bl - 1) & 15;
+ m_Skip = (bl == 15);
m_B = (m_B & ~15) | bl;
}
@@ -640,7 +637,7 @@ void pps4_device::iLDI()
*/
void pps4_device::iLAX()
{
- m_A = m_X;
+ m_A = m_X & 15;
}
/**
@@ -654,11 +651,11 @@ void pps4_device::iLAX()
* X <- A
*
* The contents of the accumulator are
- * tansferred to the X register.
+ * transferred to the X register.
*/
void pps4_device::iLXA()
{
- m_X = m_A;
+ m_X = m_A & 15;
}
/**
@@ -672,7 +669,7 @@ void pps4_device::iLXA()
* A <- BL
*
* The contents of BL register are
- * tansferred to the accumulator.
+ * transferred to the accumulator.
*/
void pps4_device::iLABL()
{
@@ -690,7 +687,7 @@ void pps4_device::iLABL()
* BM <- X
*
* The contents of X register are
- * tansferred to BM register.
+ * transferred to the BM register.
*/
void pps4_device::iLBMX()
{
@@ -708,7 +705,7 @@ void pps4_device::iLBMX()
* BU <- A
* A <- M
*
- * The contents of accumulator are tansferred to
+ * The contents of accumulator are transferred to
* BU register. Also, the contents of the currently
* addressed RAM are transferred to accumulator.
*/
@@ -776,9 +773,7 @@ void pps4_device::iXBMX()
void pps4_device::iXAX()
{
// swap A and X
- m_A ^= m_X;
- m_X ^= m_A;
- m_A ^= m_X;
+ std::swap(m_A, m_X);
}
/**
@@ -797,9 +792,7 @@ void pps4_device::iXAX()
void pps4_device::iXS()
{
// swap SA and SB
- m_SA ^= m_SB;
- m_SB ^= m_SA;
- m_SA ^= m_SB;
+ std::swap(m_SA, m_SB);
}
/**
@@ -875,9 +868,7 @@ void pps4_device::iLB()
m_B = ~ARG() & 255;
m_P = m_SA;
// swap SA and SB
- m_SA ^= m_SB;
- m_SB ^= m_SA;
- m_SA ^= m_SB;
+ std::swap(m_SA, m_SB);
}
/**
@@ -1103,7 +1094,7 @@ void pps4_device::iSKC()
*/
void pps4_device::iSKZ()
{
- m_Skip = (0 == m_A) ? 1 : 0;
+ m_Skip = m_A ? 0 : 1;
}
/**
@@ -1175,9 +1166,7 @@ void pps4_device::iRTN()
{
m_P = m_SA & 0xFFF;
// swap SA and SB
- m_SA ^= m_SB;
- m_SB ^= m_SA;
- m_SA ^= m_SB;
+ std::swap(m_SA, m_SB);
}
/**
@@ -1198,9 +1187,7 @@ void pps4_device::iRTNSK()
{
m_P = m_SA & 0xFFF;
// swap SA and SB
- m_SA ^= m_SB;
- m_SB ^= m_SA;
- m_SA ^= m_SB;
+ std::swap(m_SA, m_SB);
m_Skip = 1; // next opcode is ignored
}
@@ -1235,7 +1222,7 @@ void pps4_device::iRTNSK()
*/
void pps4_device::iIOL()
{
- u8 ac = (~m_A & 15);
+ u8 ac = ~m_A & 15;
m_I2 = ARG();
m_io.write_byte(m_I2, ac);
LOG("%s: port:%02x <- %x\n", __FUNCTION__, m_I2, ac);
@@ -1283,7 +1270,7 @@ void pps4_device::iDIB()
void pps4_2_device::iDIB()
{
// PPS-4/2 can write zeros onto bidirectional DIO pins to mask open-drain inputs
- m_A = m_dib_cb() & m_DIO;
+ m_A = m_dib_cb() & m_DIO & 15;
}
/**
@@ -1307,7 +1294,7 @@ void pps4_device::iDOA()
void pps4_2_device::iDOA()
{
// DOA also transfers contents of X to DIO on PPS-4/2
- m_DIO = m_X;
+ m_DIO = m_X & 15;
m_do_cb(m_A | (m_X << 4));
}
diff --git a/src/devices/cpu/pps41/mm78.cpp b/src/devices/cpu/pps41/mm78.cpp
index 99550886a45..5eae6f0b672 100644
--- a/src/devices/cpu/pps41/mm78.cpp
+++ b/src/devices/cpu/pps41/mm78.cpp
@@ -12,7 +12,7 @@
#include "pps41d.h"
-DEFINE_DEVICE_TYPE(MM78, mm78_device, "mm78", "Rockwell MM78") // 2KB bytes ROM, 128 nibbles RAM
+DEFINE_DEVICE_TYPE(MM78, mm78_device, "mm78", "Rockwell MM78") // 2KB ROM, 128 nibbles RAM
DEFINE_DEVICE_TYPE(MM78L, mm78l_device, "mm78l", "Rockwell MM78L") // low-power
DEFINE_DEVICE_TYPE(MM77, mm77_device, "mm77", "Rockwell MM77") // 1.3KB ROM, 96 nibbles RAM
DEFINE_DEVICE_TYPE(MM77L, mm77l_device, "mm77l", "Rockwell MM77L") // 1.5KB ROM, low-power
diff --git a/src/devices/cpu/rsp/rsp.cpp b/src/devices/cpu/rsp/rsp.cpp
index 8c62118db97..1fe32aec236 100644
--- a/src/devices/cpu/rsp/rsp.cpp
+++ b/src/devices/cpu/rsp/rsp.cpp
@@ -64,10 +64,10 @@ DEFINE_DEVICE_TYPE(RSP, rsp_device, "rsp", "Nintendo & SGI Reality Signal Proces
#define ZERO 3
#define CLIP2 4
-#define SLICE_H 3
-#define SLICE_M 2
-#define SLICE_L 1
-#define SLICE_LL 0
+#define SLICE_H 3
+#define SLICE_M 2
+#define SLICE_L 1
+#define SLICE_LL 0
#define WRITEBACK_RESULT() memcpy(m_v[VDREG].s, vres, sizeof(uint16_t) * 8);
@@ -379,7 +379,6 @@ void rsp_device::device_start()
state_add( STATE_GENPC, "GENPC", m_pc).noshow();
state_add( STATE_GENPCBASE, "CURPC", m_pc).noshow();
state_add( STATE_GENFLAGS, "GENFLAGS", m_r[31]).formatstr("%1s").noshow();
- state_add( STATE_GENSP, "GENSP", m_r[31]).noshow();
set_icountptr(m_icount);
}
@@ -2803,25 +2802,25 @@ void rsp_device::update_scalar_op_deduction()
{
/*if (m_paired_busy)
{
- m_scalar_busy = false;
- m_vector_busy = false;
- m_paired_busy = false;
- m_ideduct = 1;
+ m_scalar_busy = false;
+ m_vector_busy = false;
+ m_paired_busy = false;
+ m_ideduct = 1;
}
else if (m_vector_busy)
{
- m_scalar_busy = true;
- m_paired_busy = true;
- m_ideduct = 0;
+ m_scalar_busy = true;
+ m_paired_busy = true;
+ m_ideduct = 0;
}
else if (m_scalar_busy)
{
- m_ideduct = 1;
+ m_ideduct = 1;
}
else
{
- m_scalar_busy = true;
- m_ideduct = 0;
+ m_scalar_busy = true;
+ m_ideduct = 0;
}*/
}
@@ -2829,25 +2828,25 @@ void rsp_device::update_vector_op_deduction()
{
/*if (m_paired_busy)
{
- m_scalar_busy = false;
- m_vector_busy = false;
- m_paired_busy = false;
- m_ideduct = 1;
+ m_scalar_busy = false;
+ m_vector_busy = false;
+ m_paired_busy = false;
+ m_ideduct = 1;
}
else if (m_scalar_busy)
{
- m_vector_busy = true;
- m_paired_busy = true;
- m_ideduct = 0;
+ m_vector_busy = true;
+ m_paired_busy = true;
+ m_ideduct = 0;
}
else if (m_vector_busy)
{
- m_ideduct = 1;
+ m_ideduct = 1;
}
else
{
- m_vector_busy = true;
- m_ideduct = 0;
+ m_vector_busy = true;
+ m_ideduct = 0;
}*/
}
diff --git a/src/devices/cpu/sc61860/sc61860.cpp b/src/devices/cpu/sc61860/sc61860.cpp
index d77ca6ffa9b..a171c275b46 100644
--- a/src/devices/cpu/sc61860/sc61860.cpp
+++ b/src/devices/cpu/sc61860/sc61860.cpp
@@ -170,7 +170,6 @@ void sc61860_device::device_start()
state_add(STATE_GENPC, "GENPC", m_pc).formatstr("%04X").noshow();
state_add(STATE_GENPCBASE, "CURPC", m_oldpc).formatstr("%04X").noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_debugger_temp).formatstr("%2s").noshow();
- state_add(STATE_GENSP, "GENSP", m_r).mask(0x7f).formatstr("%02X").noshow();
set_icountptr(m_icount);
}
diff --git a/src/devices/cpu/se3208/se3208.cpp b/src/devices/cpu/se3208/se3208.cpp
index 6e5a15bef2c..71235c9423d 100644
--- a/src/devices/cpu/se3208/se3208.cpp
+++ b/src/devices/cpu/se3208/se3208.cpp
@@ -1807,7 +1807,6 @@ void se3208_device::device_start()
state_add(STATE_GENPC, "GENPC", m_PC).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_PPC).noshow();
- state_add(STATE_GENSP, "GENSP", m_SP).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_SR).formatstr("%10s").noshow();
set_icountptr(m_icount);
diff --git a/src/devices/cpu/sh/sh.cpp b/src/devices/cpu/sh/sh.cpp
index 47f1a290d23..2c19eec049f 100644
--- a/src/devices/cpu/sh/sh.cpp
+++ b/src/devices/cpu/sh/sh.cpp
@@ -77,7 +77,7 @@ void sh_common_execution::device_start()
state_add(SH4_R15, "R15", m_sh2_state->r[15]).formatstr("%08X");
state_add(SH4_EA, "EA", m_sh2_state->ea).formatstr("%08X");
- state_add(STATE_GENSP, "GENSP", m_sh2_state->r[15]).noshow();
+ state_add(SH4_SP, "SP", m_sh2_state->r[15]).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_sh2_state->sr).formatstr("%20s").noshow();
set_icountptr(m_sh2_state->icount);
diff --git a/src/devices/cpu/sh/sh.h b/src/devices/cpu/sh/sh.h
index 6920d85fd3b..09a97128a56 100644
--- a/src/devices/cpu/sh/sh.h
+++ b/src/devices/cpu/sh/sh.h
@@ -94,7 +94,7 @@ enum
{
SH4_PC = 1, SH_SR, SH4_PR, SH4_GBR, SH4_VBR, SH4_DBR, SH4_MACH, SH4_MACL,
SH4_R0, SH4_R1, SH4_R2, SH4_R3, SH4_R4, SH4_R5, SH4_R6, SH4_R7,
- SH4_R8, SH4_R9, SH4_R10, SH4_R11, SH4_R12, SH4_R13, SH4_R14, SH4_R15, SH4_EA
+ SH4_R8, SH4_R9, SH4_R10, SH4_R11, SH4_R12, SH4_R13, SH4_R14, SH4_R15, SH4_EA, SH4_SP
};
class sh_common_execution : public cpu_device
diff --git a/src/devices/cpu/spc700/spc700.cpp b/src/devices/cpu/spc700/spc700.cpp
index 7be3d1633df..e4d150310e7 100644
--- a/src/devices/cpu/spc700/spc700.cpp
+++ b/src/devices/cpu/spc700/spc700.cpp
@@ -1244,7 +1244,6 @@ void spc700_device::device_start()
state_add(STATE_GENPC, "GENPC", m_pc).formatstr("%04X").noshow();
state_add(STATE_GENPCBASE, "CURPC", m_ppc).formatstr("%04X").noshow();
- state_add(STATE_GENSP, "GENSP", m_debugger_temp).mask(0x1ff).callexport().formatstr("%04X").noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_debugger_temp).formatstr("%8s").noshow();
set_icountptr(m_ICount);
@@ -1296,10 +1295,6 @@ void spc700_device::state_export(const device_state_entry &entry)
((!FLAG_Z) << 1) |
((FLAG_C >> 8)&1));
break;
-
- case STATE_GENSP:
- m_debugger_temp = m_s + STACK_PAGE;
- break;
}
}
diff --git a/src/devices/cpu/tlcs870/tlcs870.cpp b/src/devices/cpu/tlcs870/tlcs870.cpp
index 5994fdc5fad..18dedeb590a 100644
--- a/src/devices/cpu/tlcs870/tlcs870.cpp
+++ b/src/devices/cpu/tlcs870/tlcs870.cpp
@@ -1235,7 +1235,7 @@ void tlcs870_device::device_start()
state_add(STATE_GENPC, "GENPC", m_pc.w.l).formatstr("%04X");
state_add(STATE_GENPCBASE, "CURPC", m_prvpc.w.l).formatstr("%04X").noshow();
- state_add(STATE_GENSP, "GENSP", m_sp.w.l).formatstr("%04X");
+ state_add(DEBUGGER_REG_SP, "SP", m_sp.w.l).formatstr("%04X");
state_add(STATE_GENFLAGS, "GENFLAGS", m_F).formatstr("%8s").noshow();
set_icountptr(m_icount);
diff --git a/src/devices/cpu/tlcs870/tlcs870.h b/src/devices/cpu/tlcs870/tlcs870.h
index f6794127fdd..b6c3d73478d 100644
--- a/src/devices/cpu/tlcs870/tlcs870.h
+++ b/src/devices/cpu/tlcs870/tlcs870.h
@@ -127,7 +127,8 @@ private:
DEBUGGER_REG_BC,
DEBUGGER_REG_DE,
DEBUGGER_REG_HL,
- DEBUGGER_REG_RB
+ DEBUGGER_REG_RB,
+ DEBUGGER_REG_SP
};
enum _conditions
diff --git a/src/devices/cpu/tlcs90/tlcs90.cpp b/src/devices/cpu/tlcs90/tlcs90.cpp
index 7a6e923ac35..1f6e60331d3 100644
--- a/src/devices/cpu/tlcs90/tlcs90.cpp
+++ b/src/devices/cpu/tlcs90/tlcs90.cpp
@@ -2973,7 +2973,6 @@ void tlcs90_device::device_start()
state_add(STATE_GENPC, "GENPC", m_pc.w.l).formatstr("%04X").noshow();
state_add(STATE_GENPCBASE, "CURPC", m_prvpc.w.l).formatstr("%04X").noshow();
- state_add(STATE_GENSP, "GENSP", m_sp.w.l).formatstr("%04X").noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", F ).formatstr("%8s").noshow();
set_icountptr(m_icount);
diff --git a/src/devices/cpu/tms32010/tms32010.cpp b/src/devices/cpu/tms32010/tms32010.cpp
index 01c18fb4471..44c1c1af4f5 100644
--- a/src/devices/cpu/tms32010/tms32010.cpp
+++ b/src/devices/cpu/tms32010/tms32010.cpp
@@ -869,8 +869,6 @@ void tms32010_device::device_start()
state_add(STATE_GENPC, "GENPC", m_PC).formatstr("%04X").noshow();
state_add(STATE_GENPCBASE, "CURPC", m_PREVPC).formatstr("%04X").noshow();
- /* This is actually not a stack pointer, but the stack contents */
- state_add(STATE_GENSP, "GENSP", m_STACK[3]).formatstr("%04X").noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_STR).formatstr("%16s").noshow();
set_icountptr(m_icount);
diff --git a/src/devices/cpu/tms32025/tms32025.cpp b/src/devices/cpu/tms32025/tms32025.cpp
index 11444c83b23..b629cdc97a5 100644
--- a/src/devices/cpu/tms32025/tms32025.cpp
+++ b/src/devices/cpu/tms32025/tms32025.cpp
@@ -1754,8 +1754,6 @@ void tms32025_device::device_start()
state_add(STATE_GENPC, "GENPC", m_PC).formatstr("%04X").noshow();
state_add(STATE_GENPCBASE, "CURPC", m_PREVPC).formatstr("%04X").noshow();
- /* This is actually not a stack pointer, but the stack contents */
- state_add(STATE_GENSP, "GENSP", m_STACK[7]).formatstr("%04X").noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_STR0).formatstr("%33s").noshow();
set_icountptr(m_icount);
diff --git a/src/devices/cpu/tms34010/tms34010.cpp b/src/devices/cpu/tms34010/tms34010.cpp
index 269986c7d68..bd9370d9e33 100644
--- a/src/devices/cpu/tms34010/tms34010.cpp
+++ b/src/devices/cpu/tms34010/tms34010.cpp
@@ -727,7 +727,6 @@ void tms340x0_device::device_start()
state_add(STATE_GENPC, "GENPC", m_pc).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_ppc).noshow();
state_add(TMS34010_SP, "SP", m_regs[15].reg);
- state_add(STATE_GENSP, "GENSP", m_regs[15].reg).noshow();
state_add(TMS34010_ST, "ST", m_st);
state_add(STATE_GENFLAGS, "GENFLAGS", m_st).noshow().formatstr("%18s");
diff --git a/src/devices/cpu/tms7000/tms7000.cpp b/src/devices/cpu/tms7000/tms7000.cpp
index 02c8195c333..3416fb312a6 100644
--- a/src/devices/cpu/tms7000/tms7000.cpp
+++ b/src/devices/cpu/tms7000/tms7000.cpp
@@ -260,7 +260,6 @@ void tms7000_device::device_start()
state_add(STATE_GENPC, "GENPC", m_pc).formatstr("%04X").noshow();
state_add(STATE_GENPCBASE, "CURPC", m_pc).formatstr("%04X").noshow();
- state_add(STATE_GENSP, "GENSP", m_sp).formatstr("%02X").noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_sr).formatstr("%8s").noshow();
}
diff --git a/src/devices/cpu/tx0/tx0.cpp b/src/devices/cpu/tx0/tx0.cpp
index ff3a8e0ac45..51bc1ba6c6b 100644
--- a/src/devices/cpu/tx0/tx0.cpp
+++ b/src/devices/cpu/tx0/tx0.cpp
@@ -989,12 +989,12 @@ void tx0_8kw_device::execute_instruction_8kw()
{
switch (MAR & 0000300)
{
- case 0000000: /* (1.6) CYR = CYcle ac contents Right one binary
+ case 0000200: /* (1.6) CYR = CYcle ac contents Right one binary
position (AC(17) -> AC(0)) */
AC = (AC >> 1) | ((AC & 1) << 17);
break;
- case 0000200: /* (1.6) CYcle ac contents Right one binary
+ case 0000000: /* (1.6) SHR = SHift ac contents Right one binary
position (AC(0) unchanged) */
AC = (AC >> 1) | (AC & 0400000);
break;
diff --git a/src/devices/cpu/tx0/tx0dasm.cpp b/src/devices/cpu/tx0/tx0dasm.cpp
index 2ea131211e1..a810f280b47 100644
--- a/src/devices/cpu/tx0/tx0dasm.cpp
+++ b/src/devices/cpu/tx0/tx0dasm.cpp
@@ -4,6 +4,80 @@
MIT TX-0 disassembler
+ Mnemonics and relative timing of operate class micro-instructions
+ until mid-1960 (as given in M-5001-27):
+
+ 0.8 | 700000 (CLL) Clear left 9 bits of AC
+ 0.8 | 640000 (CLR) Clear right 9 bits of AC
+ ----+--------------------------------------------------------
+ IOS | 610000 (EX0) Operate external equipment 0
+ IOS | 611000 (EX1) Operate external equipment 1
+ IOS | 612000 (EX2) Operate external equipment 2
+ IOS | 613000 (EX3) Operate external equipment 3
+ IOS | 614000 (EX4) Operate external equipment 4
+ IOS | 615000 (EX5) Operate external equipment 5
+ IOS | 616000 (EX6) Operate external equipment 6
+ IOS | 617000 (EX7) Operate external equipment 7
+ IOS | 621000 (R1L) Read one line of tape from PETR into AC
+ IOS | 622000 (DIS) Display point on scope (coordinates in AC)
+ IOS | 623000 (R3L) Read three lines of tape from PETR into AC
+ IOS | 624000 (PRT) Print character on Flexowriter
+ IOS | 626000 (P6H) Punch six holes (as specified by AC)
+ IOS | 627000 (P7H) Punch seven holes (as specified by AC)
+ ----+--------------------------------------------------------
+ 1.1 | Clear MBR
+ 1.1 | 600100 (PEN) Set AC bits 0 and 1 from LP0 and LP1
+ 1.1 | 600004 (TAC) Transfer (inclusive or) TAC to AC
+ 1.2 | 600001 (AMB) Transfer AC to MBR (executed before COM)
+ 1.2 | 600040 (COM) Complement AC
+ 1.2 | 600003 (TBR) Transfer (inclusive or) TBR to MBR
+ 1.3 | 600200 (MLR) Transfer MBR to LR
+ 1.3 | 600002 (LMB) Transfer LR to MBR
+ 1.3 | 600104 (ORL) Inclusive or MBR into LR
+ 1.3 | 600304 (ANL) And MBR into LR
+ 1.4 | 600020 (PAD) Partial add (exclusive or) MBR to AC
+ 1.4 | 600400 (SHR) Shift AC right once
+ 1.4 | 600600 (CYR) Cycle AC right once
+ 1.7 | 600010 (CRY) Add carry digits to AC (according to LR)
+ 1.8 | 603000 (HLT) Halt computer
+
+ ANL and ORL were added in the first half of 1959 (M-5001-6).
+
+ Mnemonics and relative timing of operate class micro-instructions
+ after 1960 (as given in M-5001-27-3 and M-5001-27-4):
+
+ 0.6 | 631000 (CLL) Clear left 9 bits of AC
+ 0.6 | 632000 (CLR) Clear right 9 bits of AC
+ 0.7 | 640000 (AMB) Transfer AC to MBR
+ 0.8 | 700000 (CLA) Clear AC
+ ----+------------------------------------------------------------
+ ** | 604000 (SEL) Select magnetic tape device
+ | 6x4x00 Backspace tape
+ | 6x4x04 Read select tape
+ | 6x4x10 Rewind tape
+ | 6x4x14 Write select tape
+ ** | 620000 (CPY) Synchronize with copy (transfer to or from LR)
+ ----+------------------------------------------------------------
+ 1.1 | 601000 (TAC) Transfer (inclusive or) TAC to AC
+ 1.1 | 603000 (PEN) Set AC bits 0 and 1 from LP0 and LP1
+ 1.2 | 600100 (XMB) Transfer XR to MBR (with sign extension)
+ 1.2 | 600040 (COM) Complement AC
+ 1.2 | 602000 (TBR) Transfer (inclusive or) TBR to MBR
+ 1.2 | 606000 (RPF) Read (inclusive or) PFR into MBR
+ 1.3 | 600005 (ORB) Inclusive or LR into MBR
+ 1.3 | 600007 (ANB) And LR into MBR
+ 1.4 | 600200 (MBL) Transfer MBR to LR
+ 1.4 | 600002 (LMB) Transfer LR to MBR
+ 1.5 | 600020 (PAD) Partial add (exclusive or) MBR to AC
+ 1.6 | 600400 (SHR) Shift AC right once
+ 1.6 | 600600 (CYR) Cycle AC right once
+ 1.6 | 607000 (SPF) Set PFR from MBR
+ 1.7 | 600010 (CRY) Add carry digits to AC (according to LR)
+ 1.8 | 600001 (MBX) Transfer MBR to XR
+ 1.8 | 603000 (HLT) Halt computer
+
+ Previously supported Input-Output Stop group codes were unchanged.
+
***************************************************************************/
#include "emu.h"
diff --git a/src/devices/cpu/upd7810/upd7810.cpp b/src/devices/cpu/upd7810/upd7810.cpp
index 1e212dfe24e..3ddbbb64612 100644
--- a/src/devices/cpu/upd7810/upd7810.cpp
+++ b/src/devices/cpu/upd7810/upd7810.cpp
@@ -1720,7 +1720,6 @@ void upd7810_device::device_start()
state_add( STATE_GENPC, "GENPC", m_pc.w.l ).formatstr("%04X").noshow();
state_add( STATE_GENPCBASE, "CURPC", m_ppc.w.l ).formatstr("%04X").noshow();
- state_add( STATE_GENSP, "GENSP", m_sp.w.l ).formatstr("%04X").noshow();
state_add( STATE_GENFLAGS, "GENFLAGS", m_psw ).formatstr("%17s").noshow();
}
@@ -1751,9 +1750,7 @@ void upd78c05_device::device_start()
state_add( STATE_GENPC, "GENPC", m_pc.w.l ).formatstr("%04X").noshow();
state_add( STATE_GENPCBASE, "CURPC", m_ppc.w.l ).formatstr("%04X").noshow();
- state_add( STATE_GENSP, "GENSP", m_sp.w.l ).formatstr("%04X").noshow();
state_add( STATE_GENFLAGS, "GENFLAGS", m_psw ).formatstr("%17s").noshow();
-
}
void upd7810_device::state_string_export(const device_state_entry &entry, std::string &str) const
diff --git a/src/devices/cpu/v60/v60.cpp b/src/devices/cpu/v60/v60.cpp
index 0a9030ad313..46220d8637e 100644
--- a/src/devices/cpu/v60/v60.cpp
+++ b/src/devices/cpu/v60/v60.cpp
@@ -497,7 +497,6 @@ void v60_device::device_start()
state_add( STATE_GENPC, "GENPC", PC).noshow();
state_add( STATE_GENPCBASE, "CURPC", m_PPC ).noshow();
- state_add( STATE_GENSP, "GENSP", SP ).noshow();
state_add( STATE_GENFLAGS, "GENFLAGS", m_debugger_temp).callimport().formatstr("%7s").noshow();
set_icountptr(m_icount);
diff --git a/src/devices/cpu/v810/v810.cpp b/src/devices/cpu/v810/v810.cpp
index a5a7e8dfc52..42a73ca9149 100644
--- a/src/devices/cpu/v810/v810.cpp
+++ b/src/devices/cpu/v810/v810.cpp
@@ -1316,7 +1316,6 @@ void v810_device::device_start()
state_add(STATE_GENPC, "GENPC", PC).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_PPC).noshow();
- state_add(STATE_GENSP, "GENSP", SP).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", PSW).formatstr("%8s").noshow();
set_icountptr(m_icount);
diff --git a/src/devices/cpu/vax/vaxdasm.cpp b/src/devices/cpu/vax/vaxdasm.cpp
new file mode 100644
index 00000000000..d016901692c
--- /dev/null
+++ b/src/devices/cpu/vax/vaxdasm.cpp
@@ -0,0 +1,1120 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ DEC VAX disassembler
+
+ TODO:
+ * Floating point literal formats
+ * Vector instruction notation
+
+***************************************************************************/
+
+#include "emu.h"
+#include "vaxdasm.h"
+
+vax_disassembler::vax_disassembler()
+ : util::disasm_interface()
+{
+}
+
+u32 vax_disassembler::opcode_alignment() const
+{
+ return 1;
+}
+
+enum class vax_disassembler::mode : u8
+{
+ none,
+ rb, srb, urb, cntb, rw, srw, urw, mskw, rl, srl, url, posl, prl, rq, srq, urq, ro, uro,
+ mb, mw, ml, mq, mo,
+ wb, ww, wl, wq, wo,
+ ab, aw, al, aq, ao,
+ bb, bw,
+ vb
+};
+
+namespace {
+
+using namespace std::literals;
+using mode = vax_disassembler::mode;
+
+static constexpr bool is_read_mode(mode m)
+{
+ switch (m)
+ {
+ case mode::rb: case mode::srb: case mode::urb: case mode::cntb:
+ case mode::rw: case mode::srw: case mode::urw: case mode::mskw:
+ case mode::rl: case mode::srl: case mode::url: case mode::posl: case mode::prl:
+ case mode::rq: case mode::urq:
+ case mode::ro: case mode::uro:
+ return true;
+ default:
+ return false;
+ }
+}
+
+static constexpr bool is_address_mode(mode m)
+{
+ return m == mode::ab || m == mode::aw || m == mode::al || m == mode::aq || m == mode::ao;
+}
+
+static const std::string_view s_gpr_names[0x10] =
+{
+ "R0"sv,
+ "R1"sv,
+ "R2"sv,
+ "R3"sv,
+ "R4"sv,
+ "R5"sv,
+ "R6"sv,
+ "R7"sv,
+ "R8"sv,
+ "R9"sv,
+ "R10"sv,
+ "R11"sv,
+ "AP"sv,
+ "FP"sv,
+ "SP"sv,
+ "PC"sv
+};
+
+static const std::string_view s_pr_names[0xf3] =
+{
+ "KSP"sv,
+ "ESP"sv,
+ "SSP"sv,
+ "USP"sv,
+ "ISP"sv,
+ {},
+ "ASN"sv,
+ "SPTEP"sv,
+
+ "P0BR"sv,
+ "P0LR"sv,
+ "P1BR"sv,
+ "P1LR"sv,
+ "SBR"sv,
+ "SLR"sv,
+ "CPUID"sv,
+ "WHAMI"sv,
+
+ "PCBB"sv,
+ "SCBB"sv,
+ "IPL"sv,
+ "ASTLVL"sv,
+ "SIRR"sv,
+ "SISR"sv,
+ "IPIR"sv,
+ "CMIERR"sv,
+
+ "ICCS"sv,
+ "NICR"sv,
+ "ICR"sv,
+ "TODR"sv,
+ "CSRS"sv,
+ "CSRD"sv,
+ "CSTS"sv,
+ "CSTD"sv,
+
+ "RXCS"sv,
+ "RXDB"sv,
+ "TXCS"sv,
+ "TXDB"sv,
+ "TBDR"sv,
+ "CADR"sv,
+ "MCESR"sv,
+ "CAER"sv,
+
+ "ACCS"sv,
+ "SAVGPR"sv, // or ACCR or SAVISP
+ "SAVPC"sv,
+ "SAVPSL"sv,
+ "WCSA"sv, // or MCESR
+ "WCSD"sv, // or BCWBLK
+ "WCSL"sv, // or PCIBLK
+ "TBTAG"sv,
+
+ "SBIFS"sv,
+ "SBIS"sv,
+ "SBISC"sv,
+ "SBIMT"sv,
+ "SBIER"sv,
+ "SBITA"sv,
+ "SBIQC"sv,
+ "IORESET"sv,
+
+ "MAPEN"sv,
+ "TBIA"sv,
+ "TBIS"sv,
+ "TBDATA"sv, // or TBIASN
+ "MBRK"sv, // or TBISYS
+ "PME"sv,
+ "SID"sv,
+ "TBCHK"sv,
+
+ "PAMACC"sv,
+ "PAMLOC"sv,
+ "CSWP"sv,
+ "MDECC"sv,
+ "MENA"sv,
+ "MDCTL"sv,
+ "MCCTL"sv,
+ "MERG"sv,
+
+ "CRBT"sv,
+ "DFI"sv,
+ "EHSR"sv,
+ {},
+ "STXCS"sv,
+ "STXDB"sv,
+ "ESPA"sv,
+ "ESPD"sv,
+
+ "RXCS1"sv,
+ "RXDB1"sv,
+ "TXCS1"sv,
+ "TXDB1"sv,
+ "RXCS2"sv,
+ "RXDB2"sv,
+ "TXCS2"sv,
+ "TXDB2"sv,
+
+ "RXCS3"sv,
+ "RXDB3"sv,
+ "TXCS3"sv,
+ "TXDB3"sv,
+ "RXCD"sv,
+ "CACHEX"sv,
+ "BINID"sv,
+ "BISTOP"sv,
+
+ {},
+ {},
+ {},
+ {},
+ "MEMSIZE"sv,
+ "KCALL"sv,
+ "VMPSL"sv,
+ {},
+
+ {},
+ {},
+ "CPUCNF"sv,
+ "ICIR"sv,
+ "RXFCT"sv,
+ "RXPRM"sv,
+ "TXFCT"sv,
+ "TXPRM"sv,
+
+ "BCIDX"sv,
+ "BCBTS"sv, // or BCSTS
+ "BCP1TS"sv, // or BCCTL
+ "BCP2TS"sv, // or BCERA
+ "BCRFR"sv, // or BCBTS
+ "BCIDX"sv, // or BCDET
+ "BCSTS"sv, // or BCERT
+ "BCCTL"sv,
+
+ "BCERR"sv,
+ "BCFBTS"sv,
+ "BCFPTS"sv,
+ "VINTSR"sv,
+ "PCTAG"sv, // or JTAGCR
+ "PCIDX"sv, // or ECR
+ "PCERR"sv,
+ "PCSTS"sv,
+
+ "NMICTL"sv,
+ "INOP"sv,
+ "NMIFSR"sv,
+ "NMISILO"sv,
+ "NMIEAR"sv,
+ "COR"sv,
+ "REVR1"sv,
+ "REVR2"sv, // or VPAMODE
+
+ "CLRTOSTS"sv,
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+
+ "VPSR"sv,
+ "VAER"sv,
+ "VMAC"sv,
+ "VTBIA"sv,
+ "VSAR"sv,
+ {},
+ {},
+ {},
+
+ {},
+ {},
+ {},
+ {},
+ {},
+ "VIADR"sv,
+ "VIDLO"sv,
+ "VIDHI"sv,
+
+ "CCTL"sv,
+ {},
+ "BDCECC"sv,
+ "BCETSTS"sv,
+ "BCETIDX"sv,
+ "BCETAG"sv,
+ "BCEDSTS"sv,
+ "BCEDIDX"sv,
+
+ "BCEDHI"sv,
+ "BCEDLO"sv,
+ "BCEDECC"sv,
+ "CEFADR"sv,
+ "CEFSTS"sv,
+ {},
+ {},
+ {},
+
+ "NESTS"sv,
+ "NEOADR"sv,
+ "NEOCMD"sv,
+ "NEDATHI"sv,
+ "NEDATLO"sv,
+ "NEICMD"sv,
+ {},
+ {},
+
+ "VADR"sv,
+ "VCMD"sv,
+ "VQWLO"sv,
+ "VQWHI"sv,
+ {},
+ {},
+ {},
+ {},
+
+ {}, {}, {}, {}, {}, {}, {}, {},
+ {}, {}, {}, {}, {}, {}, {}, {},
+
+ "VMAR"sv,
+ "VTAG"sv,
+ "VDATA"sv,
+ "ICSR"sv,
+ {},
+ {},
+ {},
+ {},
+
+ {}, {}, {}, {}, {}, {}, {}, {},
+
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ "PAMODE"sv,
+
+ "MMEADR"sv,
+ "MMEPTE"sv,
+ "MMESTS"sv,
+ {},
+ "TBADR"sv,
+ "TBSTS"sv,
+ {},
+ {},
+
+ "PCADR"sv,
+ "PCSTS"sv,
+ "PCCTL"sv
+};
+
+static const vax_disassembler::opdef s_nonprefix_ops[0x100 - 3] =
+{
+ { "HALT"sv, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "NOP"sv, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "REI"sv, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, vax_disassembler::STEP_OUT },
+ { "BPT"sv, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "RET"sv, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, vax_disassembler::STEP_OUT },
+ { "RSB"sv, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, vax_disassembler::STEP_OUT },
+ { "LDPCTX"sv, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, vax_disassembler::STEP_OUT },
+ { "SVPCTX"sv, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTPS"sv, { mode::rw, mode::ab, mode::rw, mode::ab, mode::none, mode::none }, 0 },
+ { "CVTSP"sv, { mode::rw, mode::ab, mode::rw, mode::ab, mode::none, mode::none }, 0 },
+ { "INDEX"sv, { mode::rl, mode::rl, mode::rl, mode::rl, mode::rl, mode::wl }, 0 },
+ { "CRC"sv, { mode::ab, mode::rl, mode::rw, mode::ab, mode::none, mode::none }, 0 },
+ { "PROBER"sv, { mode::rl, mode::rw, mode::ab, mode::none, mode::none, mode::none }, 0 },
+ { "PROBEW"sv, { mode::rl, mode::rw, mode::ab, mode::none, mode::none, mode::none }, 0 },
+ { "INSQUE"sv, { mode::ab, mode::ab, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "REMQUE"sv, { mode::ab, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+
+ { "BSBB"sv, { mode::bb, mode::none, mode::none, mode::none, mode::none, mode::none }, vax_disassembler::STEP_OUT },
+ { "BRB"sv, { mode::bb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BNEQ"sv, { mode::bb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 }, // or BNEQU
+ { "BEQL"sv, { mode::bb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 }, // or BEQLU
+ { "BGTR"sv, { mode::bb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BLEQ"sv, { mode::bb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "JSB"sv, { mode::ab, mode::none, mode::none, mode::none, mode::none, mode::none }, vax_disassembler::STEP_OVER },
+ { "JMP"sv, { mode::ab, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BGEQ"sv, { mode::bb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BLSS"sv, { mode::bb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BGTRU"sv, { mode::bb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BLEQU"sv, { mode::bb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BVC"sv, { mode::bb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BVS"sv, { mode::bb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BCC"sv, { mode::bb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 }, // or BGEQU
+ { "BCS"sv, { mode::bb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 }, // or BLSSU
+
+ { "ADDP4"sv, { mode::rw, mode::ab, mode::rw, mode::ab, mode::none, mode::none }, 0 },
+ { "ADDP6"sv, { mode::rw, mode::ab, mode::rw, mode::ab, mode::rw, mode::ab }, 0 },
+ { "SUBP4"sv, { mode::rw, mode::ab, mode::rw, mode::ab, mode::none, mode::none }, 0 },
+ { "SUBP6"sv, { mode::rw, mode::ab, mode::rw, mode::ab, mode::rw, mode::ab }, 0 },
+ { "CVTPT"sv, { mode::rw, mode::ab, mode::ab, mode::rw, mode::ab, mode::none }, 0 },
+ { "MULP"sv, { mode::rw, mode::ab, mode::rw, mode::ab, mode::rw, mode::ab }, 0 },
+ { "CVTTP"sv, { mode::rw, mode::ab, mode::ab, mode::rw, mode::ab, mode::none }, 0 },
+ { "DIVP"sv, { mode::rw, mode::ab, mode::rw, mode::ab, mode::rw, mode::ab }, 0 },
+ { "MOVC3"sv, { mode::rw, mode::ab, mode::ab, mode::none, mode::none, mode::none }, 0 },
+ { "CMPC3"sv, { mode::rw, mode::ab, mode::ab, mode::none, mode::none, mode::none }, 0 },
+ { "SCANC"sv, { mode::rw, mode::ab, mode::ab, mode::rb, mode::none, mode::none }, 0 },
+ { "SPANC"sv, { mode::rw, mode::ab, mode::ab, mode::rb, mode::none, mode::none }, 0 },
+ { "MOVC5"sv, { mode::rw, mode::ab, mode::rb, mode::rw, mode::ab, mode::none }, 0 },
+ { "CMPC5"sv, { mode::rw, mode::ab, mode::rb, mode::rw, mode::ab, mode::none }, 0 },
+ { "MOVTC"sv, { mode::rw, mode::ab, mode::rb, mode::ab, mode::rw, mode::ab }, 0 },
+ { "MOVTUC"sv, { mode::rw, mode::ab, mode::rb, mode::ab, mode::rw, mode::ab }, 0 },
+
+ { "BSBW"sv, { mode::bw, mode::none, mode::none, mode::none, mode::none, mode::none }, vax_disassembler::STEP_OVER },
+ { "BRW"sv, { mode::bw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTWL"sv, { mode::srw, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTWB"sv, { mode::srw, mode::wb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MOVP"sv, { mode::rw, mode::ab, mode::ab, mode::none, mode::none, mode::none }, 0 },
+ { "CMPP3"sv, { mode::rw, mode::ab, mode::ab, mode::none, mode::none, mode::none }, 0 },
+ { "CVTPL"sv, { mode::rw, mode::ab, mode::wl, mode::none, mode::none, mode::none }, 0 },
+ { "CMPP4"sv, { mode::rw, mode::ab, mode::rw, mode::ab, mode::none, mode::none }, 0 },
+ { "EDITPC"sv, { mode::rw, mode::ab, mode::ab, mode::ab, mode::none, mode::none }, 0 },
+ { "MATCHC"sv, { mode::rw, mode::ab, mode::rw, mode::ab, mode::none, mode::none }, 0 },
+ { "LOCC"sv, { mode::rb, mode::rw, mode::ab, mode::none, mode::none, mode::none }, 0 },
+ { "SKPC"sv, { mode::rb, mode::rw, mode::ab, mode::none, mode::none, mode::none }, 0 },
+ { "MOVZWL"sv, { mode::rw, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ACBW"sv, { mode::srw, mode::srw, mode::mw, mode::bw, mode::none, mode::none }, 0 },
+ { "MOVAW"sv, { mode::aw, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "PUSHAW"sv, { mode::aw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+
+ { "ADDF2"sv, { mode::rl, mode::ml, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ADDF3"sv, { mode::rl, mode::rl, mode::wl, mode::none, mode::none, mode::none }, 0 },
+ { "SUBF2"sv, { mode::rl, mode::ml, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "SUBF3"sv, { mode::rl, mode::rl, mode::wl, mode::none, mode::none, mode::none }, 0 },
+ { "MULF2"sv, { mode::rl, mode::ml, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MULF3"sv, { mode::rl, mode::rl, mode::wl, mode::none, mode::none, mode::none }, 0 },
+ { "DIVF2"sv, { mode::rl, mode::ml, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "DIVF3"sv, { mode::rl, mode::rl, mode::wl, mode::none, mode::none, mode::none }, 0 },
+ { "CVTFB"sv, { mode::rl, mode::wb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTFW"sv, { mode::rl, mode::ww, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTFL"sv, { mode::rl, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTRFL"sv, { mode::rl, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTBF"sv, { mode::srb, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTWF"sv, { mode::srw, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTLF"sv, { mode::srl, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ACBF"sv, { mode::rl, mode::rl, mode::ml, mode::bw, mode::none, mode::none }, 0 },
+
+ { "MOVF"sv, { mode::rl, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CMPF"sv, { mode::rl, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MNEGF"sv, { mode::rl, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "TSTF"sv, { mode::rl, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "EMODF"sv, { mode::rl, mode::rb, mode::rl, mode::wl, mode::wl, mode::none }, 0 },
+ { "POLYF"sv, { mode::rl, mode::rw, mode::ab, mode::none, mode::none, mode::none }, 0 },
+ { "CVTFD"sv, { mode::rl, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ADAWI"sv, { mode::rw, mode::mw, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "INSQHI"sv, { mode::ab, mode::aq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "INSQTI"sv, { mode::ab, mode::aq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "REMQHI"sv, { mode::aq, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "REMQTI"sv, { mode::aq, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+
+ { "ADDD2"sv, { mode::rq, mode::mq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ADDD3"sv, { mode::rq, mode::rq, mode::wq, mode::none, mode::none, mode::none }, 0 },
+ { "SUBD2"sv, { mode::rq, mode::mq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "SUBD3"sv, { mode::rq, mode::rq, mode::wq, mode::none, mode::none, mode::none }, 0 },
+ { "MULD2"sv, { mode::rq, mode::mq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MULD3"sv, { mode::rq, mode::rq, mode::wq, mode::none, mode::none, mode::none }, 0 },
+ { "DIVD2"sv, { mode::rq, mode::mq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "DIVD3"sv, { mode::rq, mode::rq, mode::wq, mode::none, mode::none, mode::none }, 0 },
+ { "CVTDB"sv, { mode::rq, mode::wb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTDW"sv, { mode::rq, mode::ww, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTDL"sv, { mode::rq, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTRDL"sv, { mode::rq, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTBD"sv, { mode::srb, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTWD"sv, { mode::srw, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTLD"sv, { mode::srl, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ACBD"sv, { mode::rq, mode::rq, mode::mq, mode::bw, mode::none, mode::none }, 0 },
+
+ { "MOVD"sv, { mode::rq, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CMPD"sv, { mode::rq, mode::rq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MNEGD"sv, { mode::rq, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "TSTD"sv, { mode::rq, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "EMODD"sv, { mode::rq, mode::rb, mode::rq, mode::wl, mode::wq, mode::none }, 0 },
+ { "POLYD"sv, { mode::rq, mode::rw, mode::ab, mode::none, mode::none, mode::none }, 0 },
+ { "CVTDF"sv, { mode::rq, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ASHL"sv, { mode::cntb, mode::rl, mode::wl, mode::none, mode::none, mode::none }, 0 },
+ { "ASHQ"sv, { mode::cntb, mode::rq, mode::wq, mode::none, mode::none, mode::none }, 0 },
+ { "EMUL"sv, { mode::rl, mode::rl, mode::rl, mode::wq, mode::none, mode::none }, 0 },
+ { "EDIV"sv, { mode::rl, mode::rq, mode::wl, mode::wl, mode::none, mode::none }, 0 },
+ { "CLRQ"sv, { mode::wq, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 }, // or CLRD or CLRG
+ { "MOVQ"sv, { mode::urq, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MOVAQ"sv, { mode::aq, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 }, // or MOVAD or MOVAG
+ { "PUSHAQ"sv, { mode::aq, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 }, // or PUSHAD or PUSHAG
+
+ { "ADDB2"sv, { mode::srb, mode::mb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ADDB3"sv, { mode::srb, mode::srb, mode::wb, mode::none, mode::none, mode::none }, 0 },
+ { "SUBB2"sv, { mode::srb, mode::mb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "SUBB3"sv, { mode::srb, mode::srb, mode::wb, mode::none, mode::none, mode::none }, 0 },
+ { "MULB2"sv, { mode::srb, mode::mb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MULB3"sv, { mode::srb, mode::srb, mode::wb, mode::none, mode::none, mode::none }, 0 },
+ { "DIVB2"sv, { mode::srb, mode::mb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "DIVB3"sv, { mode::srb, mode::srb, mode::wb, mode::none, mode::none, mode::none }, 0 },
+ { "BISB2"sv, { mode::urb, mode::mb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BISB3"sv, { mode::urb, mode::urb, mode::wb, mode::none, mode::none, mode::none }, 0 },
+ { "BICB2"sv, { mode::urb, mode::mb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BICB3"sv, { mode::urb, mode::urb, mode::wb, mode::none, mode::none, mode::none }, 0 },
+ { "XORB2"sv, { mode::urb, mode::mb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "XORB3"sv, { mode::urb, mode::urb, mode::wb, mode::none, mode::none, mode::none }, 0 },
+ { "MNEGB"sv, { mode::srb, mode::wb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CASEB"sv, { mode::rb, mode::rb, mode::rb, mode::none, mode::none, mode::none }, 0 },
+
+ { "MOVB"sv, { mode::urb, mode::wb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CMPB"sv, { mode::srb, mode::srb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MCOMB"sv, { mode::rb, mode::wb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BITB"sv, { mode::urb, mode::urb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CLRB"sv, { mode::wb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "TSTB"sv, { mode::rb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "INCB"sv, { mode::mb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "DECB"sv, { mode::mb, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTBL"sv, { mode::srb, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTBW"sv, { mode::srb, mode::ww, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MOVZBL"sv, { mode::rb, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MOVZBW"sv, { mode::rb, mode::ww, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ROTL"sv, { mode::cntb, mode::rl, mode::wl, mode::none, mode::none, mode::none }, 0 },
+ { "ACBB"sv, { mode::srb, mode::srb, mode::mb, mode::bw, mode::none, mode::none }, 0 },
+ { "MOVAB"sv, { mode::ab, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "PUSHAB"sv, { mode::ab, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+
+ { "ADDW2"sv, { mode::srw, mode::mw, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ADDW3"sv, { mode::srw, mode::srw, mode::ww, mode::none, mode::none, mode::none }, 0 },
+ { "SUBW2"sv, { mode::srw, mode::mw, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "SUBW3"sv, { mode::srw, mode::srw, mode::ww, mode::none, mode::none, mode::none }, 0 },
+ { "MULW2"sv, { mode::srw, mode::mw, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MULW3"sv, { mode::srw, mode::srw, mode::ww, mode::none, mode::none, mode::none }, 0 },
+ { "DIVW2"sv, { mode::srw, mode::mw, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "DIVW3"sv, { mode::srw, mode::srw, mode::ww, mode::none, mode::none, mode::none }, 0 },
+ { "BISW2"sv, { mode::urw, mode::mw, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BISW3"sv, { mode::urw, mode::urw, mode::ww, mode::none, mode::none, mode::none }, 0 },
+ { "BICW2"sv, { mode::urw, mode::mw, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BICW3"sv, { mode::urw, mode::urw, mode::ww, mode::none, mode::none, mode::none }, 0 },
+ { "XORW2"sv, { mode::urw, mode::mw, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "XORW3"sv, { mode::urw, mode::urw, mode::ww, mode::none, mode::none, mode::none }, 0 },
+ { "MNEGW"sv, { mode::srw, mode::ww, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CASEW"sv, { mode::rw, mode::rw, mode::rw, mode::none, mode::none, mode::none }, 0 },
+
+ { "MOVW"sv, { mode::urw, mode::ww, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CMPW"sv, { mode::srw, mode::srw, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MCOMW"sv, { mode::rw, mode::ww, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BITW"sv, { mode::urw, mode::urw, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CLRW"sv, { mode::ww, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "TSTW"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "INCW"sv, { mode::mw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "DECW"sv, { mode::mw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BISPSW"sv, { mode::urw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BICPSW"sv, { mode::urw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "POPR"sv, { mode::mskw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "PUSHR"sv, { mode::mskw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CHMK"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CHME"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CHMS"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CHMU"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+
+ { "ADDL2"sv, { mode::srl, mode::ml, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ADDL3"sv, { mode::srl, mode::srl, mode::wl, mode::none, mode::none, mode::none }, 0 },
+ { "SUBL2"sv, { mode::srl, mode::ml, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "SUBL3"sv, { mode::srl, mode::srl, mode::wl, mode::none, mode::none, mode::none }, 0 },
+ { "MULL2"sv, { mode::srl, mode::ml, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MULL3"sv, { mode::srl, mode::srl, mode::wl, mode::none, mode::none, mode::none }, 0 },
+ { "DIVL2"sv, { mode::srl, mode::ml, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "DIVL3"sv, { mode::srl, mode::srl, mode::wl, mode::none, mode::none, mode::none }, 0 },
+ { "BISL2"sv, { mode::url, mode::ml, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BISL3"sv, { mode::url, mode::url, mode::wl, mode::none, mode::none, mode::none }, 0 },
+ { "BICL2"sv, { mode::url, mode::ml, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BICL3"sv, { mode::url, mode::url, mode::wl, mode::none, mode::none, mode::none }, 0 },
+ { "XORL2"sv, { mode::url, mode::ml, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "XORL3"sv, { mode::url, mode::url, mode::wl, mode::none, mode::none, mode::none }, 0 },
+ { "MNEGL"sv, { mode::srl, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CASEL"sv, { mode::rl, mode::rl, mode::rl, mode::none, mode::none, mode::none }, 0 },
+
+ { "MOVL"sv, { mode::url, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CMPL"sv, { mode::srl, mode::srl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MCOML"sv, { mode::rl, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BITL"sv, { mode::url, mode::url, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CLRL"sv, { mode::wl, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 }, // or CLRF
+ { "TSTL"sv, { mode::rl, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "INCL"sv, { mode::ml, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "DECL"sv, { mode::ml, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ADWC"sv, { mode::rl, mode::ml, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "SBWC"sv, { mode::rl, mode::ml, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MTPR"sv, { mode::url, mode::prl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MFPR"sv, { mode::prl, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MOVPSL"sv, { mode::wl, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "PUSHL"sv, { mode::rl, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MOVAL"sv, { mode::al, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 }, // or MOVAF
+ { "PUSHAL"sv, { mode::al, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 }, // or PUSHAF
+
+ { "BBS"sv, { mode::posl, mode::vb, mode::bb, mode::none, mode::none, mode::none }, 0 },
+ { "BBC"sv, { mode::posl, mode::vb, mode::bb, mode::none, mode::none, mode::none }, 0 },
+ { "BBSS"sv, { mode::posl, mode::vb, mode::bb, mode::none, mode::none, mode::none }, 0 },
+ { "BBCS"sv, { mode::posl, mode::vb, mode::bb, mode::none, mode::none, mode::none }, 0 },
+ { "BBSC"sv, { mode::posl, mode::vb, mode::bb, mode::none, mode::none, mode::none }, 0 },
+ { "BBCC"sv, { mode::posl, mode::vb, mode::bb, mode::none, mode::none, mode::none }, 0 },
+ { "BBSSI"sv, { mode::posl, mode::vb, mode::bb, mode::none, mode::none, mode::none }, 0 },
+ { "BBCCI"sv, { mode::posl, mode::vb, mode::bb, mode::none, mode::none, mode::none }, 0 },
+ { "BLBS"sv, { mode::posl, mode::bb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "BLBC"sv, { mode::posl, mode::bb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "FFS"sv, { mode::posl, mode::cntb, mode::vb, mode::wl, mode::none, mode::none }, 0 },
+ { "FFC"sv, { mode::posl, mode::cntb, mode::vb, mode::wl, mode::none, mode::none }, 0 },
+ { "CMPV"sv, { mode::posl, mode::cntb, mode::vb, mode::rl, mode::none, mode::none }, 0 },
+ { "CMPZV"sv, { mode::posl, mode::cntb, mode::vb, mode::rl, mode::none, mode::none }, 0 },
+ { "EXTV"sv, { mode::posl, mode::cntb, mode::vb, mode::wl, mode::none, mode::none }, 0 },
+ { "EXTZV"sv, { mode::posl, mode::cntb, mode::vb, mode::wl, mode::none, mode::none }, 0 },
+
+ { "INSV"sv, { mode::rl, mode::posl, mode::cntb, mode::vb, mode::none, mode::none }, 0 },
+ { "ACBL"sv, { mode::srl, mode::srl, mode::ml, mode::bw, mode::none, mode::none }, 0 },
+ { "AOBLSS"sv, { mode::srl, mode::ml, mode::bb, mode::none, mode::none, mode::none }, 0 },
+ { "AOBLEQ"sv, { mode::srl, mode::ml, mode::bb, mode::none, mode::none, mode::none }, 0 },
+ { "SOBGEQ"sv, { mode::ml, mode::bb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "SOBGTR"sv, { mode::ml, mode::bb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTLB"sv, { mode::srl, mode::wb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTLW"sv, { mode::srl, mode::ww, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ASHP"sv, { mode::cntb, mode::rw, mode::ab, mode::rb, mode::rw, mode::ab }, 0 },
+ { "CVTLP"sv, { mode::srb, mode::rw, mode::ab, mode::none, mode::none, mode::none }, 0 },
+ { "CALLG"sv, { mode::ab, mode::ab, mode::none, mode::none, mode::none, mode::none }, vax_disassembler::STEP_OVER },
+ { "CALLS"sv, { mode::rl, mode::ab, mode::none, mode::none, mode::none, mode::none }, vax_disassembler::STEP_OVER },
+ { "XFC"sv, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 }
+};
+
+static const vax_disassembler::opdef s_fdprefix_ops[0x100 - 0x31] =
+{
+ { "MFVP"sv, { mode::rw, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTDH"sv, { mode::rq, mode::wo, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTGF"sv, { mode::rq, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VLDL"sv, { mode::rw, mode::ab, mode::rl, mode::none, mode::none, mode::none }, 0 },
+ { "VGATHL"sv, { mode::rw, mode::ab, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VLDQ"sv, { mode::rw, mode::ab, mode::rl, mode::none, mode::none, mode::none }, 0 },
+ { "VLGATHQ"sv,{ mode::rw, mode::ab, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+
+ { "ADDG2"sv, { mode::rq, mode::mq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ADDG3"sv, { mode::rq, mode::rq, mode::wq, mode::none, mode::none, mode::none }, 0 },
+ { "SUBG2"sv, { mode::rq, mode::mq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "SUBG3"sv, { mode::rq, mode::rq, mode::wq, mode::none, mode::none, mode::none }, 0 },
+ { "MULG2"sv, { mode::rq, mode::mq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MULG3"sv, { mode::rq, mode::rq, mode::wq, mode::none, mode::none, mode::none }, 0 },
+ { "DIVG2"sv, { mode::rq, mode::mq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "DIVG3"sv, { mode::rq, mode::rq, mode::wq, mode::none, mode::none, mode::none }, 0 },
+ { "CVTGB"sv, { mode::rq, mode::wb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTGW"sv, { mode::rq, mode::ww, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTGL"sv, { mode::rq, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTRGL"sv, { mode::rq, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTBG"sv, { mode::srb, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTWG"sv, { mode::srw, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTLG"sv, { mode::srl, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ACBG"sv, { mode::rq, mode::rq, mode::mq, mode::bw, mode::none, mode::none }, 0 },
+
+ { "MOVG"sv, { mode::rq, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CMPG"sv, { mode::rq, mode::rq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MNEGG"sv, { mode::rq, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "TSTG"sv, { mode::rq, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "EMODG"sv, { mode::rq, mode::rb, mode::rq, mode::wl, mode::wq, mode::none }, 0 },
+ { "POLYG"sv, { mode::rq, mode::rw, mode::ab, mode::none, mode::none, mode::none }, 0 },
+ { "CVTGH"sv, { mode::rq, mode::wo, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+
+ { "ADDH2"sv, { mode::ro, mode::wo, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ADDH3"sv, { mode::ro, mode::ro, mode::wo, mode::none, mode::none, mode::none }, 0 },
+ { "SUBH2"sv, { mode::ro, mode::mo, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "SUBH3"sv, { mode::ro, mode::ro, mode::wo, mode::none, mode::none, mode::none }, 0 },
+ { "MULH2"sv, { mode::ro, mode::mo, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MULH3"sv, { mode::ro, mode::ro, mode::wo, mode::none, mode::none, mode::none }, 0 },
+ { "DIVH2"sv, { mode::ro, mode::mo, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "DIVH3"sv, { mode::ro, mode::ro, mode::wo, mode::none, mode::none, mode::none }, 0 },
+ { "CVTHB"sv, { mode::ro, mode::wb, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTHW"sv, { mode::ro, mode::ww, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTHL"sv, { mode::ro, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTRHL"sv, { mode::ro, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTBH"sv, { mode::srb, mode::wo, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTWH"sv, { mode::srw, mode::wo, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTLH"sv, { mode::srl, mode::wo, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "ACBH"sv, { mode::ro, mode::ro, mode::mq, mode::bw, mode::none, mode::none }, 0 },
+
+ { "MOVH"sv, { mode::ro, mode::wo, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CMPH"sv, { mode::ro, mode::ro, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MNEGH"sv, { mode::ro, mode::wo, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "TSTH"sv, { mode::ro, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "EMODH"sv, { mode::ro, mode::rb, mode::ro, mode::wl, mode::wo, mode::none }, 0 },
+ { "POLYH"sv, { mode::ro, mode::rw, mode::ab, mode::none, mode::none, mode::none }, 0 },
+ { "CVTHG"sv, { mode::ro, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CLRO"sv, { mode::wo, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 }, // or CLRH
+ { "MOVO"sv, { mode::uro, mode::wo, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "MOVAO"sv, { mode::ao, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 }, // or MOVAH
+ { "PUSHAO"sv, { mode::ao, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 }, // or PUSHAH
+
+ { "VVADDL"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSADDL"sv, { mode::rw, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVADDG"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSADDG"sv, { mode::rw, mode::rq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVADDF"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSADDF"sv, { mode::rw, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVADDD"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSADDD"sv, { mode::rw, mode::rq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVSUBL"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSSUBL"sv, { mode::rw, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVSUBG"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSSUBG"sv, { mode::rw, mode::rq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVSUBF"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSSUBF"sv, { mode::rw, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVSUBD"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSSUBD"sv, { mode::rw, mode::rq, mode::none, mode::none, mode::none, mode::none }, 0 },
+
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTFH"sv, { mode::rl, mode::wo, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTFG"sv, { mode::rl, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "PROBEVMR"sv, { mode::rb, mode::ab, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "PROBEVMW"sv, { mode::rb, mode::ab, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSTL"sv, { mode::rw, mode::ab, mode::rl, mode::none, mode::none, mode::none }, 0 },
+ { "VSCATL"sv, { mode::rw, mode::ab, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSTQ"sv, { mode::rw, mode::ab, mode::rl, mode::none, mode::none, mode::none }, 0 },
+ { "VSCATQ"sv, { mode::rw, mode::ab, mode::none, mode::none, mode::none, mode::none }, 0 },
+
+ { "VVMULL"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSMULL"sv, { mode::rw, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVMULG"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSMULG"sv, { mode::rw, mode::rq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVMULF"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSMULF"sv, { mode::rw, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVMULD"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSMULD"sv, { mode::rw, mode::rq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVDIVL"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSDIVL"sv, { mode::rw, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVDIVG"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSDIVG"sv, { mode::rw, mode::rq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVDIVF"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSDIVF"sv, { mode::rw, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVDIVD"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSDIVD"sv, { mode::rw, mode::rq, mode::none, mode::none, mode::none, mode::none }, 0 },
+
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+
+ { "VVCMPL"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSCMPL"sv, { mode::rw, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVCMPG"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSCMPG"sv, { mode::rw, mode::rq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVCMPF"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSCMPF"sv, { mode::rw, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVCMPD"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSCMPD"sv, { mode::rw, mode::rq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVBISL"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSBISL"sv, { mode::rw, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVBICL"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSBICL"sv, { mode::rw, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+
+ { "VVSRLL"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSSRLL"sv, { mode::rw, mode::posl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVSLLL"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSSLLL"sv, { mode::rw, mode::posl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVXORL"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSXORL"sv, { mode::rw, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVCNT"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "IOTA"sv, { mode::rw, mode::rl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VVMERGE"sv, { mode::rw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "VSMERGE"sv, { mode::rw, mode::rq, mode::none, mode::none, mode::none, mode::none }, 0 },
+
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTHF"sv, { mode::ro, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { "CVTHD"sv, { mode::ro, mode::wq, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 },
+ { {}, { mode::none, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 }
+};
+
+} // anonymous namespace
+
+void vax_disassembler::format_immediate(std::ostream &stream, u32 i) const
+{
+ stream << '#';
+ if (i > 9)
+ stream << "^X";
+ util::stream_format(stream, "%X", i);
+}
+
+void vax_disassembler::format_signed(std::ostream &stream, s32 value) const
+{
+ if (value < 0)
+ {
+ stream << '-';
+ value = -value;
+ }
+ if (u32(value) > 9)
+ stream << "^X";
+ util::stream_format(stream, "%X", u32(value));
+}
+
+void vax_disassembler::format_relative(std::ostream &stream, u32 pc, s32 displ) const
+{
+ util::stream_format(stream, "^X%08X", pc + displ);
+}
+
+void vax_disassembler::format_register_mask(std::ostream &stream, u16 mask) const
+{
+ stream << "^M<";
+
+ for (int n = 0; mask != 0; n++)
+ {
+ assert(n < 16);
+ if (BIT(mask, n))
+ {
+ stream << s_gpr_names[n];
+ mask &= ~(1 << n);
+ if (mask != 0)
+ stream << ',';
+ }
+ }
+
+ stream << '>';
+}
+
+offs_t vax_disassembler::disassemble_inst(std::ostream &stream, const vax_disassembler::opdef &inst, offs_t &pc, offs_t ppc, const vax_disassembler::data_buffer &opcodes) const
+{
+ if (inst.operand[0] == mode::none)
+ stream << inst.mnemonic;
+ else
+ util::stream_format(stream, "%-7s ", inst.mnemonic);
+ for (int n = 0; n < 6 && inst.operand[n] != mode::none; n++)
+ {
+ if (n != 0)
+ stream << ", ";
+ if (inst.operand[n] == mode::bb)
+ {
+ s8 displacement = opcodes.r8(pc++);
+ format_relative(stream, pc, s32(displacement));
+ }
+ else if (inst.operand[n] == mode::bw)
+ {
+ s16 displacement = opcodes.r16(pc);
+ pc += 2;
+ format_relative(stream, pc, s32(displacement));
+ }
+ else
+ {
+ u8 opmode = opcodes.r8(pc++);
+ u8 idxmode = 0;
+ if (opmode >= 0x40 && opmode < 0x4f)
+ {
+ // Indexed mode
+ idxmode = opmode;
+ opmode = opcodes.r8(pc++);
+ }
+ if (opmode < 0x40 && is_read_mode(inst.operand[n]) && idxmode == 0)
+ {
+ // Literal mode
+ if (inst.operand[n] == mode::mskw)
+ format_register_mask(stream, opmode);
+ else if (inst.operand[n] == mode::prl && !s_pr_names[opmode].empty())
+ stream << s_pr_names[opmode];
+ else if (inst.operand[n] == mode::urb)
+ util::stream_format(stream, "#^X%02X", opmode);
+ else if (inst.operand[n] == mode::cntb || inst.operand[n] == mode::posl)
+ util::stream_format(stream, "#%d", opmode);
+ else
+ format_immediate(stream, opmode);
+ }
+ else if (opmode < 0x50)
+ stream << "<invalid>";
+ else if (opmode < 0x60)
+ {
+ // Register mode
+ if (idxmode != 0 || is_address_mode(inst.operand[n]))
+ stream << "<invalid>";
+ else
+ stream << s_gpr_names[opmode & 0x0f];
+ }
+ else
+ {
+ if (opmode < 0x80)
+ {
+ // Register deferred or autodecrement mode
+ if (opmode >= 0x70)
+ stream << '-';
+ util::stream_format(stream, "(%s)", s_gpr_names[opmode & 0x0f]);
+ }
+ else if (opmode < 0xa0)
+ {
+ // Autoincrement mode
+ if (BIT(opmode, 4))
+ stream << '@';
+ if (opmode == 0x9f)
+ {
+ util::stream_format(stream, "#^X%08X", opcodes.r32(pc));
+ pc += 4;
+ }
+ else if (opmode != 0x8f)
+ util::stream_format(stream, "(%s)+", s_gpr_names[opmode & 0x0f]);
+ else switch (inst.operand[n])
+ {
+ case mode::rb:
+ format_immediate(stream, opcodes.r8(pc++));
+ break;
+
+ case mode::srb:
+ stream << '#';
+ format_signed(stream, s8(opcodes.r8(pc++)));
+ break;
+
+ case mode::urb:
+ util::stream_format(stream, "#^X%02X", opcodes.r8(pc++));
+ break;
+
+ case mode::cntb:
+ util::stream_format(stream, "#%d", s8(opcodes.r8(pc++)));
+ break;
+
+ case mode::rw:
+ format_immediate(stream, opcodes.r16(pc));
+ pc += 2;
+ break;
+
+ case mode::srw:
+ stream << '#';
+ format_signed(stream, s16(opcodes.r16(pc)));
+ pc += 2;
+ break;
+
+ case mode::urw:
+ util::stream_format(stream, "#^X%04X", opcodes.r16(pc));
+ pc += 2;
+ break;
+
+ case mode::mskw:
+ format_register_mask(stream, opcodes.r16(pc));
+ pc += 2;
+ break;
+
+ case mode::rl: case mode::posl:
+ format_immediate(stream, opcodes.r32(pc));
+ pc += 4;
+ break;
+
+ case mode::srl:
+ stream << '#';
+ format_signed(stream, s32(opcodes.r32(pc)));
+ pc += 4;
+ break;
+
+ case mode::url:
+ util::stream_format(stream, "#^X%08X", opcodes.r32(pc));
+ pc += 4;
+ break;
+
+ case mode::prl:
+ {
+ u32 i = opcodes.r32(pc);
+ pc += 4;
+ if (i < std::size(s_pr_names) && !s_pr_names[i].empty())
+ stream << s_pr_names[i];
+ else
+ util::stream_format(stream, "#^X%X", i);
+ break;
+ }
+
+ case mode::rq: case mode::urq:
+ util::stream_format(stream, "#^X%016X", opcodes.r64(pc));
+ pc += 8;
+ break;
+
+ case mode::ro: case mode::uro:
+ util::stream_format(stream, "#^X%016X%016X", opcodes.r64(pc), opcodes.r64(pc + 4));
+ pc += 16;
+ break;
+
+ default:
+ stream << "(PC)+";
+ break;
+ }
+ }
+ else
+ {
+ if (BIT(opmode, 4))
+ stream << '@';
+
+ s32 displ;
+ if (opmode < 0xc0)
+ {
+ // Byte displacement mode
+ displ = s32(s8(opcodes.r8(pc++)));
+ }
+ else if (opmode < 0xe0)
+ {
+ // Word displacement mode
+ displ = s32(s16(opcodes.r16(pc)));
+ pc += 2;
+ }
+ else
+ {
+ // Long displacement mode
+ displ = s32(opcodes.r32(pc));
+ pc += 4;
+ }
+
+ if ((opmode & 0x0f) != 0x0f)
+ {
+ if (opmode >= 0xe0)
+ util::stream_format(stream, "^X%X", displ);
+ else
+ format_signed(stream, displ);
+ util::stream_format(stream, "(%s)", s_gpr_names[opmode & 0x0f]);
+ }
+ else
+ format_relative(stream, pc, displ);
+ }
+ if (idxmode != 0)
+ util::stream_format(stream, "[%s]", s_gpr_names[idxmode & 0x0f]);
+ }
+ }
+ }
+ return (pc - ppc) | inst.flags | SUPPORTED;
+}
+
+offs_t vax_disassembler::disassemble(std::ostream &stream, offs_t pc, const vax_disassembler::data_buffer &opcodes, const vax_disassembler::data_buffer &params)
+{
+ offs_t ppc = pc;
+ u8 op = opcodes.r8(pc++);
+
+ if (op >= 0xfd)
+ {
+ u8 op2 = opcodes.r8(pc++);
+ if (op == 0xfd)
+ {
+ if (op2 == 0x02)
+ {
+ stream << "WAIT";
+ return 2 | SUPPORTED;
+ }
+ else if (op2 >= 0x31 && !s_fdprefix_ops[op2 - 0x31].mnemonic.empty())
+ return disassemble_inst(stream, s_fdprefix_ops[op2 - 0x31], pc, ppc, opcodes);
+ }
+ else if (op == 0xff)
+ {
+ if (op2 == 0xfe)
+ {
+ stream << "BUGW";
+ return 2 | SUPPORTED;
+ }
+ else if (op2 == 0xfd)
+ {
+ stream << "BUGL";
+ return 2 | SUPPORTED;
+ }
+ }
+ util::stream_format(stream, "%-8s^X%02X%02X", ".WORD", op2, op);
+ return 2 | SUPPORTED;
+ }
+ else if (s_nonprefix_ops[op].mnemonic.empty())
+ {
+ util::stream_format(stream, "%-8s^X%02X", ".BYTE", op);
+ return 1 | SUPPORTED;
+ }
+ else
+ return disassemble_inst(stream, s_nonprefix_ops[op], pc, ppc, opcodes);
+}
diff --git a/src/devices/cpu/vax/vaxdasm.h b/src/devices/cpu/vax/vaxdasm.h
new file mode 100644
index 00000000000..e5549d4d59f
--- /dev/null
+++ b/src/devices/cpu/vax/vaxdasm.h
@@ -0,0 +1,38 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+
+#ifndef MAME_CPU_VAX_VAXDASM_H
+#define MAME_CPU_VAX_VAXDASM_H
+
+#pragma once
+
+class vax_disassembler : public util::disasm_interface
+{
+public:
+ enum class mode : u8;
+
+ struct opdef
+ {
+ std::string_view mnemonic;
+ mode operand[6];
+ u32 flags;
+ };
+
+ // construction/destruction
+ vax_disassembler();
+
+protected:
+ // disassembler overrides
+ virtual u32 opcode_alignment() const override;
+ virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params) override;
+
+private:
+ // internal helpers
+ void format_immediate(std::ostream &stream, u32 i) const;
+ void format_signed(std::ostream &stream, s32 value) const;
+ void format_relative(std::ostream &stream, u32 pc, s32 displ) const;
+ void format_register_mask(std::ostream &stream, u16 mask) const;
+ offs_t disassemble_inst(std::ostream &stream, const opdef &inst, offs_t &pc, offs_t ppc, const data_buffer &opcodes) const;
+};
+
+#endif // MAME_CPU_VAX_VAXDASM_H
diff --git a/src/devices/cpu/xavix2/xavix2.cpp b/src/devices/cpu/xavix2/xavix2.cpp
index 8ebab9bb085..a6ab3018ea9 100644
--- a/src/devices/cpu/xavix2/xavix2.cpp
+++ b/src/devices/cpu/xavix2/xavix2.cpp
@@ -23,7 +23,6 @@ void xavix2_device::device_start()
state_add(STATE_GENPC, "GENPC", m_pc).callexport().noshow();
state_add(STATE_GENPCBASE, "CURPC", m_pc).callexport().noshow();
- state_add(STATE_GENSP, "GENSP", m_r[7]).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_hr[4]).callimport().formatstr("%5s").noshow();
state_add(XAVIX2_PC, "PC", m_pc).callimport();
state_add(XAVIX2_FLAGS, "FLAGS", m_hr[4]).callimport();
diff --git a/src/devices/cpu/z180/z180.cpp b/src/devices/cpu/z180/z180.cpp
index 1c1f8f3df54..18ded716eb7 100644
--- a/src/devices/cpu/z180/z180.cpp
+++ b/src/devices/cpu/z180/z180.cpp
@@ -1683,7 +1683,6 @@ void z180_device::device_start()
state_add(STATE_GENPC, "GENPC", _PCD).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_PREPC.w.l).noshow();
state_add(Z180_SP, "SP", m_SP.w.l);
- state_add(STATE_GENSP, "GENSP", m_SP.w.l).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_AF.b.l).noshow().formatstr("%8s");
state_add(Z180_A, "A", _A).noshow();
state_add(Z180_B, "B", _B).noshow();
diff --git a/src/devices/cpu/z8/z8.cpp b/src/devices/cpu/z8/z8.cpp
index 9475d8e3edb..7ca616ccdd9 100644
--- a/src/devices/cpu/z8/z8.cpp
+++ b/src/devices/cpu/z8/z8.cpp
@@ -1219,7 +1219,6 @@ void z8_device::device_start()
state_add(STATE_GENPC, "GENPC", m_pc).callimport().noshow();
state_add(STATE_GENPCBASE, "CURPC", m_ppc).callimport().noshow();
state_add(Z8_SP, "SP", m_sp.w);
- state_add(STATE_GENSP, "GENSP", m_sp.w).noshow();
state_add(Z8_RP, "RP", m_rp);
state_add(STATE_GENFLAGS, "GENFLAGS", m_flags).noshow().formatstr("%6s");
state_add(Z8_IMR, "IMR", m_imr);
diff --git a/src/devices/cpu/z80/z80.cpp b/src/devices/cpu/z80/z80.cpp
index e3575a90af7..bdce00888ae 100644
--- a/src/devices/cpu/z80/z80.cpp
+++ b/src/devices/cpu/z80/z80.cpp
@@ -3416,7 +3416,6 @@ void z80_device::device_start()
state_add(STATE_GENPC, "PC", m_pc.w.l).callimport();
state_add(STATE_GENPCBASE, "CURPC", m_prvpc.w.l).callimport().noshow();
state_add(Z80_SP, "SP", SP);
- state_add(STATE_GENSP, "GENSP", SP).noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", F).noshow().formatstr("%8s");
state_add(Z80_A, "A", A).noshow();
state_add(Z80_B, "B", B).noshow();
diff --git a/src/devices/cpu/z8000/z8000.cpp b/src/devices/cpu/z8000/z8000.cpp
index 4ce857cecb5..d000f3aa2b7 100644
--- a/src/devices/cpu/z8000/z8000.cpp
+++ b/src/devices/cpu/z8000/z8000.cpp
@@ -520,7 +520,6 @@ void z8002_device::register_debug_state()
state_add( STATE_GENPC, "GENPC", m_pc ).noshow();
state_add( STATE_GENPCBASE, "CURPC", m_ppc ).noshow();
state_add( STATE_GENFLAGS, "GENFLAGS", m_fcw ).formatstr("%16s").noshow();
- state_add( STATE_GENSP, "GENSP", m_nspoff ).noshow();
}
void z8002_device::state_string_export(const device_state_entry &entry, std::string &str) const
diff --git a/src/devices/imagedev/cassette.cpp b/src/devices/imagedev/cassette.cpp
index 778b296d63d..52103cb1e7d 100644
--- a/src/devices/imagedev/cassette.cpp
+++ b/src/devices/imagedev/cassette.cpp
@@ -9,9 +9,12 @@
*********************************************************************/
#include "emu.h"
-#include "formats/imageutl.h"
#include "cassette.h"
+#include "formats/imageutl.h"
+
+#include "util/ioprocs.h"
+
#define LOG_WARN (1U<<1) // Warnings
#define LOG_DETAIL (1U<<2) // Details
@@ -19,6 +22,7 @@
#include "logmacro.h"
+
// device type definition
DEFINE_DEVICE_TYPE(CASSETTE, cassette_image_device, "cassette_image", "Cassette")
@@ -253,12 +257,24 @@ image_init_result cassette_image_device::internal_load(bool is_create)
device_image_interface *image = nullptr;
interface(image);
+ check_for_file();
if (is_create || (length()==0)) // empty existing images are fine to write over.
{
- // creating an image
- err = cassette_image::create((void *)image, &image_ioprocs, &cassette_image::wavfile_format, m_create_opts, cassette_image::FLAG_READWRITE|cassette_image::FLAG_SAVEONEXIT, m_cassette);
- if (err != cassette_image::error::SUCCESS)
- goto error;
+ auto io = util::core_file_read_write(image_core_file(), 0x00);
+ if (io)
+ {
+ // creating an image
+ err = cassette_image::create(
+ std::move(io),
+ &cassette_image::wavfile_format,
+ m_create_opts,
+ cassette_image::FLAG_READWRITE|cassette_image::FLAG_SAVEONEXIT,
+ m_cassette);
+ }
+ else
+ {
+ err = cassette_image::error::OUT_OF_MEMORY;
+ }
}
else
{
@@ -269,11 +285,24 @@ image_init_result cassette_image_device::internal_load(bool is_create)
// we probably don't want to retry...
retry = false;
- // try opening the cassette
- int cassette_flags = is_readonly()
- ? cassette_image::FLAG_READONLY
- : (cassette_image::FLAG_READWRITE | cassette_image::FLAG_SAVEONEXIT);
- err = cassette_image::open_choices((void *)image, &image_ioprocs, filetype(), m_formats, cassette_flags, m_cassette);
+ auto io = util::core_file_read_write(image_core_file(), 0x00);
+ if (io)
+ {
+ // try opening the cassette
+ int const cassette_flags = is_readonly()
+ ? cassette_image::FLAG_READONLY
+ : (cassette_image::FLAG_READWRITE | cassette_image::FLAG_SAVEONEXIT);
+ err = cassette_image::open_choices(
+ std::move(io),
+ filetype(),
+ m_formats,
+ cassette_flags,
+ m_cassette);
+ }
+ else
+ {
+ err = cassette_image::error::OUT_OF_MEMORY;
+ }
// special case - if we failed due to readwrite not being supported, make the image be read only and retry
if (err == cassette_image::error::READ_WRITE_UNSUPPORTED)
@@ -283,47 +312,48 @@ image_init_result cassette_image_device::internal_load(bool is_create)
}
}
while(retry);
-
- if (err != cassette_image::error::SUCCESS)
- goto error;
}
- /* set to default state, but only change the UI state */
- change_state(m_default_state, CASSETTE_MASK_UISTATE);
-
- /* reset the position */
- m_position = 0.0;
- m_position_time = machine().time().as_double();
+ if (err == cassette_image::error::SUCCESS)
+ {
+ /* set to default state, but only change the UI state */
+ change_state(m_default_state, CASSETTE_MASK_UISTATE);
- /* default channel to 0, speed multiplier to 1 */
- m_channel = 0;
- m_speed = 1;
- m_direction = 1;
+ /* reset the position */
+ m_position = 0.0;
+ m_position_time = machine().time().as_double();
- return image_init_result::PASS;
+ /* default channel to 0, speed multiplier to 1 */
+ m_channel = 0;
+ m_speed = 1;
+ m_direction = 1;
-error:
- image_error_t imgerr = IMAGE_ERROR_UNSPECIFIED;
- switch(err)
+ return image_init_result::PASS;
+ }
+ else
{
- case cassette_image::error::INTERNAL:
- imgerr = IMAGE_ERROR_INTERNAL;
- break;
- case cassette_image::error::UNSUPPORTED:
- imgerr = IMAGE_ERROR_UNSUPPORTED;
- break;
- case cassette_image::error::OUT_OF_MEMORY:
- imgerr = IMAGE_ERROR_OUTOFMEMORY;
- break;
- case cassette_image::error::INVALID_IMAGE:
- imgerr = IMAGE_ERROR_INVALIDIMAGE;
- break;
- default:
- imgerr = IMAGE_ERROR_UNSPECIFIED;
- break;
+ std::error_condition imgerr = image_error::UNSPECIFIED;
+ switch(err)
+ {
+ case cassette_image::error::INTERNAL:
+ imgerr = image_error::INTERNAL;
+ break;
+ case cassette_image::error::UNSUPPORTED:
+ imgerr = image_error::UNSUPPORTED;
+ break;
+ case cassette_image::error::OUT_OF_MEMORY:
+ imgerr = std::errc::not_enough_memory;
+ break;
+ case cassette_image::error::INVALID_IMAGE:
+ imgerr = image_error::INVALIDIMAGE;
+ break;
+ default:
+ imgerr = image_error::UNSPECIFIED;
+ break;
+ }
+ image->seterror(imgerr, nullptr);
+ return image_init_result::FAIL;
}
- image->seterror(imgerr, "" );
- return image_init_result::FAIL;
}
diff --git a/src/devices/imagedev/chd_cd.cpp b/src/devices/imagedev/chd_cd.cpp
index 5daaba2ed45..4eacb3d3b58 100644
--- a/src/devices/imagedev/chd_cd.cpp
+++ b/src/devices/imagedev/chd_cd.cpp
@@ -83,17 +83,16 @@ void cdrom_image_device::device_stop()
image_init_result cdrom_image_device::call_load()
{
- chd_error err = (chd_error)0;
- chd_file *chd = nullptr;
+ std::error_condition err;
+ chd_file *chd = nullptr;
if (m_cdrom_handle)
cdrom_close(m_cdrom_handle);
- if (!loaded_through_softlist())
- {
+ if (!loaded_through_softlist()) {
if (is_filetype("chd") && is_loaded()) {
- err = m_self_chd.open( image_core_file() ); /* CDs are never writeable */
- if ( err )
+ err = m_self_chd.open(util::core_file_read_write(image_core_file())); // CDs are never writeable
+ if (err)
goto error;
chd = &m_self_chd;
}
@@ -103,20 +102,20 @@ image_init_result cdrom_image_device::call_load()
/* open the CHD file */
if (chd) {
- m_cdrom_handle = cdrom_open( chd );
+ m_cdrom_handle = cdrom_open(chd);
} else {
m_cdrom_handle = cdrom_open(filename());
}
- if ( ! m_cdrom_handle )
+ if (!m_cdrom_handle)
goto error;
return image_init_result::PASS;
error:
- if ( chd && chd == &m_self_chd )
- m_self_chd.close( );
- if ( err )
- seterror( IMAGE_ERROR_UNSPECIFIED, chd_file::error_string( err ) );
+ if (chd && chd == &m_self_chd)
+ m_self_chd.close();
+ if (err)
+ seterror(err, nullptr);
return image_init_result::FAIL;
}
diff --git a/src/devices/imagedev/diablo.cpp b/src/devices/imagedev/diablo.cpp
index 58a34a664f6..be09c263719 100644
--- a/src/devices/imagedev/diablo.cpp
+++ b/src/devices/imagedev/diablo.cpp
@@ -112,8 +112,6 @@ image_init_result diablo_image_device::call_load()
image_init_result diablo_image_device::call_create(int create_format, util::option_resolution *create_args)
{
- int err;
-
if (!create_args)
throw emu_fatalerror("diablo_image_device::call_create: Expected create_args to not be nullptr");
@@ -127,15 +125,15 @@ image_init_result diablo_image_device::call_create(int create_format, util::opti
/* create the CHD file */
chd_codec_type compression[4] = { CHD_CODEC_NONE };
- err = m_origchd.create(image_core_file(), (uint64_t)totalsectors * (uint64_t)sectorsize, hunksize, sectorsize, compression);
- if (err != CHDERR_NONE)
+ std::error_condition err = m_origchd.create(util::core_file_read_write(image_core_file()), uint64_t(totalsectors) * uint64_t(sectorsize), hunksize, sectorsize, compression);
+ if (err)
return image_init_result::FAIL;
/* if we created the image and hence, have metadata to set, set the metadata */
err = m_origchd.write_metadata(HARD_DISK_METADATA_TAG, 0, string_format(HARD_DISK_METADATA_FORMAT, cylinders, heads, sectors, sectorsize));
m_origchd.close();
- if (err != CHDERR_NONE)
+ if (err)
return image_init_result::FAIL;
return internal_load_dsk();
@@ -164,28 +162,28 @@ void diablo_image_device::call_unload()
open_disk_diff - open a DISK diff file
-------------------------------------------------*/
-static chd_error open_disk_diff(emu_options &options, const char *name, chd_file &source, chd_file &diff_chd)
+static std::error_condition open_disk_diff(emu_options &options, const char *name, chd_file &source, chd_file &diff_chd)
{
std::string fname = std::string(name).append(".dif");
/* try to open the diff */
//printf("Opening differencing image file: %s\n", fname.c_str());
emu_file diff_file(options.diff_directory(), OPEN_FLAG_READ | OPEN_FLAG_WRITE);
- osd_file::error filerr = diff_file.open(fname.c_str());
- if (filerr == osd_file::error::NONE)
+ std::error_condition filerr = diff_file.open(fname);
+ if (!filerr)
{
std::string fullpath(diff_file.fullpath());
diff_file.close();
//printf("Opening differencing image file: %s\n", fullpath.c_str());
- return diff_chd.open(fullpath.c_str(), true, &source);
+ return diff_chd.open(fullpath, true, &source);
}
/* didn't work; try creating it instead */
//printf("Creating differencing image: %s\n", fname.c_str());
diff_file.set_openflags(OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- filerr = diff_file.open(fname.c_str());
- if (filerr == osd_file::error::NONE)
+ filerr = diff_file.open(fname);
+ if (!filerr)
{
std::string fullpath(diff_file.fullpath());
diff_file.close();
@@ -193,19 +191,19 @@ static chd_error open_disk_diff(emu_options &options, const char *name, chd_file
/* create the CHD */
//printf("Creating differencing image file: %s\n", fullpath.c_str());
chd_codec_type compression[4] = { CHD_CODEC_NONE };
- chd_error err = diff_chd.create(fullpath.c_str(), source.logical_bytes(), source.hunk_bytes(), compression, source);
- if (err != CHDERR_NONE)
+ std::error_condition err = diff_chd.create(fullpath, source.logical_bytes(), source.hunk_bytes(), compression, source);
+ if (err)
return err;
return diff_chd.clone_all_metadata(source);
}
- return CHDERR_FILE_NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
}
image_init_result diablo_image_device::internal_load_dsk()
{
- chd_error err = CHDERR_NONE;
+ std::error_condition err;
m_chd = nullptr;
@@ -219,18 +217,18 @@ image_init_result diablo_image_device::internal_load_dsk()
}
else
{
- err = m_origchd.open(image_core_file(), true);
- if (err == CHDERR_NONE)
+ err = m_origchd.open(util::core_file_read_write(image_core_file()), true);
+ if (!err)
{
m_chd = &m_origchd;
}
- else if (err == CHDERR_FILE_NOT_WRITEABLE)
+ else if (err == chd_file::error::FILE_NOT_WRITEABLE)
{
- err = m_origchd.open(image_core_file(), false);
- if (err == CHDERR_NONE)
+ err = m_origchd.open(util::core_file_read_write(image_core_file()), false);
+ if (!err)
{
err = open_disk_diff(device().machine().options(), basename_noext(), m_origchd, m_diffchd);
- if (err == CHDERR_NONE)
+ if (!err)
{
m_chd = &m_diffchd;
}
@@ -250,7 +248,7 @@ image_init_result diablo_image_device::internal_load_dsk()
m_origchd.close();
m_diffchd.close();
m_chd = nullptr;
- seterror(IMAGE_ERROR_UNSPECIFIED, chd_file::error_string(err));
+ seterror(err, nullptr);
return image_init_result::FAIL;
}
diff --git a/src/devices/imagedev/flopdrv.cpp b/src/devices/imagedev/flopdrv.cpp
index bccfef975d8..d47f2a0fa52 100644
--- a/src/devices/imagedev/flopdrv.cpp
+++ b/src/devices/imagedev/flopdrv.cpp
@@ -14,9 +14,13 @@
*/
#include "emu.h"
-#include "formats/imageutl.h"
#include "flopdrv.h"
+#include "formats/imageutl.h"
+
+#include "util/ioprocs.h"
+
+
#define VERBOSE 0
#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
@@ -33,7 +37,7 @@
struct floppy_error_map
{
floperr_t ferr;
- image_error_t ierr;
+ std::error_condition ierr;
const char *message;
};
@@ -45,11 +49,11 @@ struct floppy_error_map
static const floppy_error_map errmap[] =
{
- { FLOPPY_ERROR_SUCCESS, IMAGE_ERROR_SUCCESS },
- { FLOPPY_ERROR_INTERNAL, IMAGE_ERROR_INTERNAL },
- { FLOPPY_ERROR_UNSUPPORTED, IMAGE_ERROR_UNSUPPORTED },
- { FLOPPY_ERROR_OUTOFMEMORY, IMAGE_ERROR_OUTOFMEMORY },
- { FLOPPY_ERROR_INVALIDIMAGE, IMAGE_ERROR_INVALIDIMAGE }
+ { FLOPPY_ERROR_SUCCESS, { } },
+ { FLOPPY_ERROR_INTERNAL, { image_error::INTERNAL } },
+ { FLOPPY_ERROR_UNSUPPORTED, { image_error::UNSUPPORTED } },
+ { FLOPPY_ERROR_OUTOFMEMORY, { std::errc::not_enough_memory } },
+ { FLOPPY_ERROR_INVALIDIMAGE, { image_error::INVALIDIMAGE } }
};
/***************************************************************************
@@ -418,50 +422,52 @@ void legacy_floppy_image_device::floppy_drive_set_controller(device_t *controlle
image_init_result legacy_floppy_image_device::internal_floppy_device_load(bool is_create, int create_format, util::option_resolution *create_args)
{
- floperr_t err;
- const struct FloppyFormat *floppy_options;
- int floppy_flags, i;
+ const struct FloppyFormat *floppy_options = m_config->formats;
- device_image_interface *image = nullptr;
- interface(image); /* figure out the floppy options */
- floppy_options = m_config->formats;
-
- if (is_create)
+ floperr_t err;
+ check_for_file();
+ auto io = util::core_file_read_write(image_core_file(), 0xff);
+ if (!io)
+ {
+ err = FLOPPY_ERROR_OUTOFMEMORY;
+ }
+ else if (is_create)
{
/* creating an image */
assert(create_format >= 0);
- err = floppy_create((void *) image, &image_ioprocs, &floppy_options[create_format], create_args, &m_floppy);
- if (err)
- goto error;
+ err = floppy_create(std::move(io), &floppy_options[create_format], create_args, &m_floppy);
}
else
{
/* opening an image */
- floppy_flags = !is_readonly() ? FLOPPY_FLAGS_READWRITE : FLOPPY_FLAGS_READONLY;
- err = floppy_open_choices((void *) image, &image_ioprocs, filetype(), floppy_options, floppy_flags, &m_floppy);
- if (err)
- goto error;
+ int const floppy_flags = !is_readonly() ? FLOPPY_FLAGS_READWRITE : FLOPPY_FLAGS_READONLY;
+ err = floppy_open_choices(std::move(io), filetype(), floppy_options, floppy_flags, &m_floppy);
}
- if (floppy_callbacks(m_floppy)->get_heads_per_disk && floppy_callbacks(m_floppy)->get_tracks_per_disk)
- {
- floppy_drive_set_geometry_absolute(floppy_get_tracks_per_disk(m_floppy),floppy_get_heads_per_disk(m_floppy));
- }
- /* disk changed */
- m_dskchg = CLEAR_LINE;
- // If we have one of our hacky load procs, call it
- if (m_load_proc)
- m_load_proc(*this, is_create);
+ if (!err)
+ {
+ if (floppy_callbacks(m_floppy)->get_heads_per_disk && floppy_callbacks(m_floppy)->get_tracks_per_disk)
+ {
+ floppy_drive_set_geometry_absolute(floppy_get_tracks_per_disk(m_floppy),floppy_get_heads_per_disk(m_floppy));
+ }
+ /* disk changed */
+ m_dskchg = CLEAR_LINE;
- return image_init_result::PASS;
+ // If we have one of our hacky load procs, call it
+ if (m_load_proc)
+ m_load_proc(*this, is_create);
-error:
- for (i = 0; i < std::size(errmap); i++)
+ return image_init_result::PASS;
+ }
+ else
{
- if (err == errmap[i].ferr)
- seterror(errmap[i].ierr, errmap[i].message);
+ for (int i = 0; i < std::size(errmap); i++)
+ {
+ if (err == errmap[i].ferr)
+ seterror(errmap[i].ierr, errmap[i].message);
+ }
+ return image_init_result::FAIL;
}
- return image_init_result::FAIL;
}
TIMER_CALLBACK_MEMBER( legacy_floppy_image_device::set_wpt )
diff --git a/src/devices/imagedev/floppy.cpp b/src/devices/imagedev/floppy.cpp
index 76c8e3c613d..a431f32c647 100644
--- a/src/devices/imagedev/floppy.cpp
+++ b/src/devices/imagedev/floppy.cpp
@@ -26,8 +26,11 @@
#include "screen.h"
#include "speaker.h"
+
#include "formats/imageutl.h"
-#include "zippath.h"
+
+#include "util/ioprocs.h"
+#include "util/zippath.h"
/*
Debugging flags. Set to 0 or 1.
@@ -273,7 +276,7 @@ floppy_image_device::floppy_image_device(const machine_config &mconfig, device_t
m_flux_screen(*this, "flux")
{
extension_list[0] = '\0';
- m_err = IMAGE_ERROR_INVALIDIMAGE;
+ m_err = image_error::INVALIDIMAGE;
}
//-------------------------------------------------
@@ -398,17 +401,19 @@ void floppy_image_device::commit_image()
image_dirty = false;
if(!output_format || !output_format->supports_save())
return;
- io_generic io;
- // Do _not_ remove this cast otherwise the pointer will be incorrect when used by the ioprocs.
- io.file = (device_image_interface *)this;
- io.procs = &image_ioprocs;
- io.filler = 0xff;
- osd_file::error err = image_core_file().truncate(0);
- if (err != osd_file::error::NONE)
- popmessage("Error, unable to truncate image: %d", int(err));
+ check_for_file();
+ auto io = util::core_file_read_write(image_core_file(), 0xff);
+ if(!io) {
+ popmessage("Error, out of memory");
+ return;
+ }
+
+ std::error_condition const err = image_core_file().truncate(0);
+ if (err)
+ popmessage("Error, unable to truncate image: %s", err.message());
- output_format->save(&io, variants, image.get());
+ output_format->save(*io, variants, image.get());
}
void floppy_image_device::device_config_complete()
@@ -532,28 +537,28 @@ floppy_image_format_t *floppy_image_device::identify(std::string filename)
{
util::core_file::ptr fd;
std::string revised_path;
+ std::error_condition err = util::zippath_fopen(filename, OPEN_FLAG_READ, fd, revised_path);
+ if(err) {
+ seterror(err, nullptr);
+ return nullptr;
+ }
- osd_file::error err = util::zippath_fopen(filename, OPEN_FLAG_READ, fd, revised_path);
- if(err != osd_file::error::NONE) {
- seterror(IMAGE_ERROR_INVALIDIMAGE, "Unable to open the image file");
+ auto io = util::core_file_read(std::move(fd), 0xff);
+ if(!io) {
+ seterror(std::errc::not_enough_memory, nullptr);
return nullptr;
}
- io_generic io;
- io.file = fd.get();
- io.procs = &corefile_ioprocs_noclose;
- io.filler = 0xff;
int best = 0;
floppy_image_format_t *best_format = nullptr;
- for (floppy_image_format_t *format : fif_list)
- {
- int score = format->identify(&io, form_factor, variants);
+ for(floppy_image_format_t *format : fif_list) {
+ int score = format->identify(*io, form_factor, variants);
if(score > best) {
best = score;
best_format = format;
}
}
- fd.reset();
+
return best_format;
}
@@ -585,16 +590,17 @@ void floppy_image_device::init_floppy_load(bool write_supported)
image_init_result floppy_image_device::call_load()
{
- io_generic io;
+ check_for_file();
+ auto io = util::core_file_read(image_core_file(), 0xff);
+ if(!io) {
+ seterror(std::errc::not_enough_memory, nullptr);
+ return image_init_result::FAIL;
+ }
- // Do _not_ remove this cast otherwise the pointer will be incorrect when used by the ioprocs.
- io.file = (device_image_interface *)this;
- io.procs = &image_ioprocs;
- io.filler = 0xff;
int best = 0;
floppy_image_format_t *best_format = nullptr;
for (floppy_image_format_t *format : fif_list) {
- int score = format->identify(&io, form_factor, variants);
+ int score = format->identify(*io, form_factor, variants);
if(score > best) {
best = score;
best_format = format;
@@ -602,13 +608,13 @@ image_init_result floppy_image_device::call_load()
}
if (!best_format) {
- seterror(IMAGE_ERROR_INVALIDIMAGE, "Unable to identify the image format");
+ seterror(image_error::INVALIDIMAGE, "Unable to identify the image format");
return image_init_result::FAIL;
}
image = std::make_unique<floppy_image>(tracks, sides, form_factor);
- if (!best_format->load(&io, form_factor, variants, image.get())) {
- seterror(IMAGE_ERROR_UNSUPPORTED, "Incompatible image format or corrupted data");
+ if (!best_format->load(*io, form_factor, variants, image.get())) {
+ seterror(image_error::UNSUPPORTED, "Incompatible image format or corrupted data");
image.reset();
return image_init_result::FAIL;
}
@@ -822,88 +828,22 @@ image_init_result floppy_image_device::call_create(int format_type, util::option
return image_init_result::PASS;
}
-// Should that go into ioprocs? Should ioprocs be turned into something C++?
-
-struct iofile_ram {
- std::vector<u8> *data;
- int64_t pos;
-};
-
-static void ram_closeproc(void *file)
-{
- auto f = (iofile_ram *)file;
- delete f;
-}
-
-static int ram_seekproc(void *file, int64_t offset, int whence)
-{
- auto f = (iofile_ram *)file;
- switch(whence) {
- case SEEK_SET: f->pos = offset; break;
- case SEEK_CUR: f->pos += offset; break;
- case SEEK_END: f->pos = f->data->size() + offset; break;
- }
-
- f->pos = std::clamp(f->pos, int64_t(0), int64_t(f->data->size()));
- return 0;
-}
-
-static size_t ram_readproc(void *file, void *buffer, size_t length)
-{
- auto f = (iofile_ram *)file;
- size_t l = std::min(length, size_t(f->data->size() - f->pos));
- memcpy(buffer, f->data->data() + f->pos, l);
- return l;
-}
-
-static size_t ram_writeproc(void *file, const void *buffer, size_t length)
-{
- auto f = (iofile_ram *)file;
- size_t l = std::min(length, size_t(f->data->size() - f->pos));
- memcpy(f->data->data() + f->pos, buffer, l);
- return l;
-}
-
-static uint64_t ram_filesizeproc(void *file)
-{
- auto f = (iofile_ram *)file;
- return f->data->size();
-}
-
-
-static const io_procs iop_ram = {
- ram_closeproc,
- ram_seekproc,
- ram_readproc,
- ram_writeproc,
- ram_filesizeproc
-};
-
-static io_generic *ram_open(std::vector<u8> &data)
-{
- iofile_ram *f = new iofile_ram;
- f->data = &data;
- f->pos = 0;
- return new io_generic({ &iop_ram, f });
-}
-
void floppy_image_device::init_fs(const fs_info *fs, const fs_meta_data &meta)
{
assert(image);
- if (fs->m_type)
- {
+ if (fs->m_type) {
std::vector<u8> img(fs->m_image_size);
fsblk_vec_t blockdev(img);
auto cfs = fs->m_manager->mount(blockdev);
cfs->format(meta);
- auto iog = ram_open(img);
auto source_format = fs->m_type();
- source_format->load(iog, floppy_image::FF_UNKNOWN, variants, image.get());
+ auto io = util::ram_read(img.data(), img.size(), 0xff);
+ source_format->load(*io, floppy_image::FF_UNKNOWN, variants, image.get());
delete source_format;
- delete iog;
- } else
+ } else {
fs_unformatted::format(fs->m_key, image.get());
+ }
}
/* write protect, active high
diff --git a/src/devices/imagedev/harddriv.cpp b/src/devices/imagedev/harddriv.cpp
index e6e0c56f896..5a7b9fe8109 100644
--- a/src/devices/imagedev/harddriv.cpp
+++ b/src/devices/imagedev/harddriv.cpp
@@ -133,8 +133,6 @@ image_init_result harddisk_image_device::call_load()
image_init_result harddisk_image_device::call_create(int create_format, util::option_resolution *create_args)
{
- int err;
-
if (!create_args)
throw emu_fatalerror("harddisk_image_device::call_create: Expected create_args to not be nullptr");
@@ -148,15 +146,15 @@ image_init_result harddisk_image_device::call_create(int create_format, util::op
/* create the CHD file */
chd_codec_type compression[4] = { CHD_CODEC_NONE };
- err = m_origchd.create(image_core_file(), (uint64_t)totalsectors * (uint64_t)sectorsize, hunksize, sectorsize, compression);
- if (err != CHDERR_NONE)
+ std::error_condition err = m_origchd.create(util::core_file_read_write(image_core_file()), (uint64_t)totalsectors * (uint64_t)sectorsize, hunksize, sectorsize, compression);
+ if (err)
return image_init_result::FAIL;
/* if we created the image and hence, have metadata to set, set the metadata */
err = m_origchd.write_metadata(HARD_DISK_METADATA_TAG, 0, string_format(HARD_DISK_METADATA_FORMAT, cylinders, heads, sectors, sectorsize));
m_origchd.close();
- if (err != CHDERR_NONE)
+ if (err)
return image_init_result::FAIL;
return internal_load_hd();
@@ -168,7 +166,7 @@ void harddisk_image_device::call_unload()
if (!m_device_image_unload.isnull())
m_device_image_unload(*this);
- if (m_hard_disk_handle != nullptr)
+ if (m_hard_disk_handle)
{
hard_disk_close(m_hard_disk_handle);
m_hard_disk_handle = nullptr;
@@ -186,28 +184,28 @@ void harddisk_image_device::call_unload()
open_disk_diff - open a DISK diff file
-------------------------------------------------*/
-static chd_error open_disk_diff(emu_options &options, const char *name, chd_file &source, chd_file &diff_chd)
+static std::error_condition open_disk_diff(emu_options &options, const char *name, chd_file &source, chd_file &diff_chd)
{
std::string fname = std::string(name).append(".dif");
/* try to open the diff */
//printf("Opening differencing image file: %s\n", fname.c_str());
emu_file diff_file(options.diff_directory(), OPEN_FLAG_READ | OPEN_FLAG_WRITE);
- osd_file::error filerr = diff_file.open(fname.c_str());
- if (filerr == osd_file::error::NONE)
+ std::error_condition filerr = diff_file.open(fname);
+ if (!filerr)
{
std::string fullpath(diff_file.fullpath());
diff_file.close();
//printf("Opening differencing image file: %s\n", fullpath.c_str());
- return diff_chd.open(fullpath.c_str(), true, &source);
+ return diff_chd.open(fullpath, true, &source);
}
/* didn't work; try creating it instead */
//printf("Creating differencing image: %s\n", fname.c_str());
diff_file.set_openflags(OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- filerr = diff_file.open(fname.c_str());
- if (filerr == osd_file::error::NONE)
+ filerr = diff_file.open(fname);
+ if (!filerr)
{
std::string fullpath(diff_file.fullpath());
diff_file.close();
@@ -215,23 +213,23 @@ static chd_error open_disk_diff(emu_options &options, const char *name, chd_file
/* create the CHD */
//printf("Creating differencing image file: %s\n", fupointllpath.c_str());
chd_codec_type compression[4] = { CHD_CODEC_NONE };
- chd_error err = diff_chd.create(fullpath.c_str(), source.logical_bytes(), source.hunk_bytes(), compression, source);
- if (err != CHDERR_NONE)
+ std::error_condition err = diff_chd.create(fullpath, source.logical_bytes(), source.hunk_bytes(), compression, source);
+ if (err)
return err;
return diff_chd.clone_all_metadata(source);
}
- return CHDERR_FILE_NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
}
image_init_result harddisk_image_device::internal_load_hd()
{
- chd_error err = CHDERR_NONE;
+ std::error_condition err;
m_chd = nullptr;
uint8_t header[64];
- if (m_hard_disk_handle != nullptr)
+ if (m_hard_disk_handle)
{
hard_disk_close(m_hard_disk_handle);
m_hard_disk_handle = nullptr;
@@ -250,19 +248,19 @@ image_init_result harddisk_image_device::internal_load_hd()
if (!memcmp("MComprHD", header, 8))
{
- err = m_origchd.open(image_core_file(), true);
+ err = m_origchd.open(util::core_file_read_write(image_core_file()), true);
- if (err == CHDERR_NONE)
+ if (!err)
{
m_chd = &m_origchd;
}
- else if (err == CHDERR_FILE_NOT_WRITEABLE)
+ else if (err == chd_file::error::FILE_NOT_WRITEABLE)
{
- err = m_origchd.open(image_core_file(), false);
- if (err == CHDERR_NONE)
+ err = m_origchd.open(util::core_file_read_write(image_core_file()), false);
+ if (!err)
{
err = open_disk_diff(device().machine().options(), basename_noext(), m_origchd, m_diffchd);
- if (err == CHDERR_NONE)
+ if (!err)
{
m_chd = &m_diffchd;
}
@@ -271,11 +269,11 @@ image_init_result harddisk_image_device::internal_load_hd()
}
}
- if (m_chd != nullptr)
+ if (m_chd)
{
/* open the hard disk file */
m_hard_disk_handle = hard_disk_open(m_chd);
- if (m_hard_disk_handle != nullptr)
+ if (m_hard_disk_handle)
return image_init_result::PASS;
}
else
@@ -306,7 +304,7 @@ image_init_result harddisk_image_device::internal_load_hd()
}
m_hard_disk_handle = hard_disk_open(image_core_file(), skip);
- if (m_hard_disk_handle != nullptr)
+ if (m_hard_disk_handle)
return image_init_result::PASS;
}
@@ -317,7 +315,7 @@ image_init_result harddisk_image_device::internal_load_hd()
m_origchd.close();
m_diffchd.close();
m_chd = nullptr;
- seterror(IMAGE_ERROR_UNSPECIFIED, chd_file::error_string(err));
+ seterror(err, nullptr);
return image_init_result::FAIL;
}
diff --git a/src/devices/imagedev/mfmhd.cpp b/src/devices/imagedev/mfmhd.cpp
index 27a2770836d..2b701eef22a 100644
--- a/src/devices/imagedev/mfmhd.cpp
+++ b/src/devices/imagedev/mfmhd.cpp
@@ -440,8 +440,8 @@ image_init_result mfm_harddisk_device::call_load()
}
// Read the hard disk metadata
- chd_error state = chdfile->read_metadata(HARD_DISK_METADATA_TAG, 0, metadata);
- if (state != CHDERR_NONE)
+ std::error_condition state = chdfile->read_metadata(HARD_DISK_METADATA_TAG, 0, metadata);
+ if (state)
{
LOG("Failed to read CHD metadata\n");
return image_init_result::FAIL;
@@ -475,7 +475,7 @@ image_init_result mfm_harddisk_device::call_load()
param.reduced_wcurr_cylinder = -1;
state = chdfile->read_metadata(MFM_HARD_DISK_METADATA_TAG, 0, metadata);
- if (state != CHDERR_NONE)
+ if (state)
{
LOGMASKED(LOG_WARN, "Failed to read CHD sector arrangement/recording specs, applying defaults\n");
}
@@ -494,7 +494,7 @@ image_init_result mfm_harddisk_device::call_load()
param.interleave, param.cylskew, param.headskew, param.write_precomp_cylinder, param.reduced_wcurr_cylinder);
state = chdfile->read_metadata(MFM_HARD_DISK_METADATA_TAG, 1, metadata);
- if (state != CHDERR_NONE)
+ if (state)
{
LOGMASKED(LOG_WARN, "Failed to read CHD track gap specs, applying defaults\n");
}
@@ -561,8 +561,8 @@ void mfm_harddisk_device::call_unload()
LOGMASKED(LOG_WARN, "MFM HD sector arrangement and recording specs have changed; updating CHD metadata\n");
chd_file* chdfile = get_chd_file();
- chd_error err = chdfile->write_metadata(MFM_HARD_DISK_METADATA_TAG, 0, string_format(MFMHD_REC_METADATA_FORMAT, params->interleave, params->cylskew, params->headskew, params->write_precomp_cylinder, params->reduced_wcurr_cylinder), 0);
- if (err != CHDERR_NONE)
+ std::error_condition err = chdfile->write_metadata(MFM_HARD_DISK_METADATA_TAG, 0, string_format(MFMHD_REC_METADATA_FORMAT, params->interleave, params->cylskew, params->headskew, params->write_precomp_cylinder, params->reduced_wcurr_cylinder), 0);
+ if (err)
{
LOGMASKED(LOG_WARN, "Failed to save MFM HD sector arrangement/recording specs to CHD\n");
}
@@ -573,8 +573,8 @@ void mfm_harddisk_device::call_unload()
LOGMASKED(LOG_WARN, "MFM HD track gap specs have changed; updating CHD metadata\n");
chd_file* chdfile = get_chd_file();
- chd_error err = chdfile->write_metadata(MFM_HARD_DISK_METADATA_TAG, 1, string_format(MFMHD_GAP_METADATA_FORMAT, params->gap1, params->gap2, params->gap3, params->sync, params->headerlen, params->ecctype), 0);
- if (err != CHDERR_NONE)
+ std::error_condition err = chdfile->write_metadata(MFM_HARD_DISK_METADATA_TAG, 1, string_format(MFMHD_GAP_METADATA_FORMAT, params->gap1, params->gap2, params->gap3, params->sync, params->headerlen, params->ecctype), 0);
+ if (err)
{
LOGMASKED(LOG_WARN, "Failed to save MFM HD track gap specs to CHD\n");
}
@@ -919,10 +919,9 @@ bool mfm_harddisk_device::write(attotime &from_when, const attotime &limit, uint
return false;
}
-chd_error mfm_harddisk_device::load_track(uint16_t* data, int cylinder, int head)
+std::error_condition mfm_harddisk_device::load_track(uint16_t* data, int cylinder, int head)
{
- chd_error state = m_format->load(m_chd, data, m_trackimage_size, cylinder, head);
- return state;
+ return m_format->load(m_chd, data, m_trackimage_size, cylinder, head);
}
void mfm_harddisk_device::write_track(uint16_t* data, int cylinder, int head)
@@ -1070,7 +1069,7 @@ void mfmhd_trackimage_cache::init(mfm_harddisk_device* mfmhd, int tracksize, int
{
if (TRACE_CACHE) m_machine.logerror("[%s:cache] MFM HD cache init; cache size is %d tracks\n", mfmhd->tag(), trackslots);
- chd_error state;
+ std::error_condition state;
mfmhd_trackimage* previous;
mfmhd_trackimage* current = nullptr;
@@ -1091,7 +1090,8 @@ void mfmhd_trackimage_cache::init(mfm_harddisk_device* mfmhd, int tracksize, int
// Load the first tracks into the slots
state = m_mfmhd->load_track(current->encdata.get(), cylinder, head);
- if (state != CHDERR_NONE) throw emu_fatalerror("Cannot load (c=%d,h=%d) from hard disk", cylinder, head);
+ if (state)
+ throw emu_fatalerror("Cannot load (c=%d,h=%d) from hard disk", cylinder, head);
current->dirty = false;
current->cylinder = cylinder;
@@ -1128,11 +1128,11 @@ uint16_t* mfmhd_trackimage_cache::get_trackimage(int cylinder, int head)
mfmhd_trackimage* current = m_tracks;
mfmhd_trackimage* previous = nullptr;
- chd_error state = CHDERR_NONE;
+ std::error_condition state;
// Repeat the search. This loop should run at most twice; once for a direct hit,
// and twice on miss, then the second iteration will be a hit.
- while (state == CHDERR_NONE)
+ while (!state)
{
// A simple linear search
while (current != nullptr)
diff --git a/src/devices/imagedev/mfmhd.h b/src/devices/imagedev/mfmhd.h
index 3adaa32e183..fbc335f083d 100644
--- a/src/devices/imagedev/mfmhd.h
+++ b/src/devices/imagedev/mfmhd.h
@@ -17,8 +17,12 @@
#pragma once
#include "imagedev/harddriv.h"
+
#include "formats/mfm_hd.h"
+#include <system_error>
+
+
class mfm_harddisk_device;
class mfmhd_trackimage
@@ -94,7 +98,7 @@ public:
attotime track_end_time();
// Access the tracks on the image. Used as a callback from the cache.
- chd_error load_track(uint16_t* data, int cylinder, int head);
+ std::error_condition load_track(uint16_t* data, int cylinder, int head);
void write_track(uint16_t* data, int cylinder, int head);
// Delivers the number of heads according to the loaded image
diff --git a/src/devices/imagedev/midiin.cpp b/src/devices/imagedev/midiin.cpp
index 7ec8d148a9d..3c8e71f30d1 100644
--- a/src/devices/imagedev/midiin.cpp
+++ b/src/devices/imagedev/midiin.cpp
@@ -129,7 +129,7 @@ image_init_result midiin_device::call_load()
{
// attempt to load if it's a real file
m_err = load_image_by_path(OPEN_FLAG_READ, filename());
- if (m_err == IMAGE_ERROR_SUCCESS)
+ if (!m_err)
{
// if the parsing succeeds, schedule the start to happen at least
// 10 seconds after starting to allow the keyboards to initialize
diff --git a/src/devices/machine/8042kbdc.cpp b/src/devices/machine/8042kbdc.cpp
index 516f3efe12c..2789da21dfd 100644
--- a/src/devices/machine/8042kbdc.cpp
+++ b/src/devices/machine/8042kbdc.cpp
@@ -40,9 +40,12 @@ kbdc8042_device::kbdc8042_device(const machine_config &mconfig, const char *tag,
, m_system_reset_cb(*this)
, m_gate_a20_cb(*this)
, m_input_buffer_full_cb(*this)
+ , m_input_buffer_full_mouse_cb(*this)
, m_output_buffer_empty_cb(*this)
, m_speaker_cb(*this)
{
+ m_keybtype = KBDC8042_STANDARD;
+ m_interrupttype = KBDC8042_SINGLE;
}
void kbdc8042_device::device_add_mconfig(machine_config &config)
@@ -62,12 +65,15 @@ void kbdc8042_device::device_start()
m_system_reset_cb.resolve_safe();
m_gate_a20_cb.resolve_safe();
m_input_buffer_full_cb.resolve_safe();
+ m_input_buffer_full_mouse_cb.resolve_safe();
m_output_buffer_empty_cb.resolve_safe();
m_speaker_cb.resolve_safe();
m_operation_write_state = 0; /* first write to 0x60 might occur before anything can set this */
memset(&m_keyboard, 0x00, sizeof(m_keyboard));
memset(&m_mouse, 0x00, sizeof(m_mouse));
m_mouse.sample_rate = 100;
+ m_mouse.resolution = 3;
+ m_mouse.on = true;
m_sending = 0;
m_last_write_to_control = 0;
m_status_read_mode = 0;
@@ -127,8 +133,22 @@ void kbdc8042_device::at_8042_receive(uint8_t data, bool mouse)
else
m_keyboard.received = 1;
- if (!m_input_buffer_full_cb.isnull())
- m_input_buffer_full_cb(1);
+ if (m_interrupttype == KBDC8042_SINGLE)
+ {
+ if (!m_input_buffer_full_cb.isnull())
+ m_input_buffer_full_cb(1);
+ }
+ else
+ {
+ if (m_keyboard.received && (m_command & 1) && !m_input_buffer_full_cb.isnull())
+ {
+ m_input_buffer_full_cb(1);
+ }
+ if (m_mouse.received && (m_command & 2) && !m_input_buffer_full_mouse_cb.isnull())
+ {
+ m_input_buffer_full_mouse_cb(1);
+ }
+ }
}
}
@@ -146,7 +166,7 @@ void kbdc8042_device::at_8042_check_mouse()
{
if ((m_keybtype == KBDC8042_PS2) && PS2_MOUSE_ON && !m_keyboard.received && !m_mouse.received)
{
- if (m_mouse.to_transmit == 0)
+ if (m_mouse.reporting && (m_mouse.to_transmit == 0))
{
uint16_t x = m_mousex_port->read();
uint16_t y = m_mousey_port->read();
@@ -173,6 +193,7 @@ void kbdc8042_device::at_8042_check_mouse()
if (dx != 0 || dy != 0 || buttons != old_mouse_btn)
{
m_mouse.to_transmit = 3;
+ m_mouse.from_transmit = 0;
m_mouse.transmit_buf[0] = buttons | 0x08 | (BIT(dx, 8) << 4) | (BIT(dy, 8) << 5);
m_mouse.transmit_buf[1] = dx & 0xff;
m_mouse.transmit_buf[2] = dy & 0xff;
@@ -181,12 +202,9 @@ void kbdc8042_device::at_8042_check_mouse()
if (m_mouse.to_transmit)
{
- at_8042_receive(m_mouse.transmit_buf[0], true);
+ at_8042_receive(m_mouse.transmit_buf[m_mouse.from_transmit], true);
m_mouse.to_transmit--;
- for (int i = 0; i < m_mouse.to_transmit; i++)
- {
- m_mouse.transmit_buf[i] = m_mouse.transmit_buf[i + 1];
- }
+ m_mouse.from_transmit = (m_mouse.from_transmit + 1) & (sizeof(m_mouse.transmit_buf) - 1);
}
}
}
@@ -200,6 +218,7 @@ void kbdc8042_device::at_8042_clear_keyboard_received()
}
m_input_buffer_full_cb(0);
+ m_input_buffer_full_mouse_cb(0);
m_keyboard.received = 0;
m_mouse.received = 0;
}
@@ -214,6 +233,15 @@ void kbdc8042_device::device_timer(timer_instance const &timer)
}
}
+void kbdc8042_device::mouse_enqueue(uint8_t value)
+{
+ if (m_mouse.to_transmit < 8)
+ {
+ m_mouse.transmit_buf[(m_mouse.from_transmit + m_mouse.to_transmit) & (sizeof(m_mouse.transmit_buf) - 1)] = value;
+ m_mouse.to_transmit++;
+ }
+}
+
/* **************************************************************************
* Port 0x60 Input and Output Buffer (keyboard and mouse data)
* Port 0x64 Read Status Register
@@ -246,6 +274,8 @@ uint8_t kbdc8042_device::data_r(offs_t offset)
data = m_data;
at_8042_clear_keyboard_received();
at_8042_check_keyboard();
+ if (m_mouse.on)
+ at_8042_check_mouse();
break;
case 1:
@@ -356,9 +386,16 @@ void kbdc8042_device::data_w(offs_t offset, uint8_t data)
m_data = data;
if (m_mouse.receiving_sample_rate)
{
- m_mouse.received = 1;
m_mouse.sample_rate = data;
- m_data = 0xfa;
+ m_mouse.receiving_sample_rate = false;
+ mouse_enqueue(0xfa);
+ break;
+ }
+ if (m_mouse.receiving_resolution)
+ {
+ m_mouse.resolution = data;
+ m_mouse.receiving_resolution = false;
+ mouse_enqueue(0xfa);
break;
}
@@ -367,17 +404,52 @@ void kbdc8042_device::data_w(offs_t offset, uint8_t data)
case 0xff:
logerror("Mouse reset command received\n");
m_mouse.sample_rate = 100;
- m_mouse.received = 1;
- m_data = 0xfa;
+ m_mouse.from_transmit = 0;
+ m_mouse.to_transmit = 0;
+ m_mouse.reporting = false;
+ if (m_mouse.on)
+ {
+ mouse_enqueue(0xfa);
+ mouse_enqueue(0xaa);
+ mouse_enqueue(0x00);
+ }
+ else
+ {
+ m_mouse.received = 1;
+ m_data = 0xfa;
+ }
break;
case 0xf6:
- m_mouse.received = 1;
- m_data = 0xfa;
+ mouse_enqueue(0xfa);
+ break;
+ case 0xf5:
+ m_mouse.reporting = false;
+ mouse_enqueue(0xfa);
+ break;
+ case 0xf4:
+ m_mouse.reporting = true;
+ mouse_enqueue(0xfa);
break;
case 0xf3:
- m_mouse.received = 1;
- m_data = 0xfa;
m_mouse.receiving_sample_rate = true;
+ mouse_enqueue(0xfa);
+ break;
+ case 0xf2:
+ mouse_enqueue(0xfa);
+ mouse_enqueue(0x00);
+ break;
+ case 0xe8:
+ mouse_enqueue(0xfa);
+ m_mouse.receiving_resolution = true;
+ break;
+ case 0xe6:
+ mouse_enqueue(0xfa);
+ break;
+ case 0xe9:
+ mouse_enqueue(0xfa);
+ mouse_enqueue(0x00);
+ mouse_enqueue(m_mouse.resolution);
+ mouse_enqueue(m_mouse.sample_rate);
break;
default:
logerror("%s: Unknown mouse command: %02x\n", machine().describe_context(), m_data);
@@ -416,13 +488,12 @@ void kbdc8042_device::data_w(offs_t offset, uint8_t data)
break;
case 0x60: /* next data byte is placed in 8042 command byte */
m_operation_write_state = 5;
- m_send_to_mouse = 0;
break;
case 0xa7: /* disable auxilary interface */
- m_mouse.on = 0;
+ m_mouse.on = false;
break;
case 0xa8: /* enable auxilary interface */
- m_mouse.on = 1;
+ m_mouse.on = true;
break;
case 0xa9: /* test mouse */
at_8042_receive(((m_keybtype == KBDC8042_PS2) && PS2_MOUSE_ON) ? 0x00 : 0xff);
@@ -473,21 +544,18 @@ void kbdc8042_device::data_w(offs_t offset, uint8_t data)
* write is written to port 60h output register as if initiated
* by a device; invokes interrupt if enabled */
m_operation_write_state = 2;
- m_send_to_mouse = 0;
break;
case 0xd3:
/* write auxillary output register; on PS/2 systems next port 60h
* write is written to port 60h input register as if initiated
* by a device; invokes interrupt if enabled */
m_operation_write_state = 3;
- m_send_to_mouse = 1;
break;
case 0xd4:
/* write auxillary device; on PS/2 systems the next data byte
* written to input register a port at 60h is sent to the
* auxiliary device */
m_operation_write_state = 4;
- m_send_to_mouse = 1;
break;
case 0xe0:
/* read test inputs; read T1/T0 test inputs into bit 1/0 */
@@ -514,6 +582,11 @@ void kbdc8042_device::data_w(offs_t offset, uint8_t data)
m_system_reset_cb(CLEAR_LINE);
at_8042_set_outport(m_outport | 0x02, 0);
break;
+ default:
+ if (data != 0xff)
+ {
+ logerror("%s: Unknown command: %02x\n", machine().describe_context(), data);
+ }
}
m_sending = 1;
break;
diff --git a/src/devices/machine/8042kbdc.h b/src/devices/machine/8042kbdc.h
index d9643ab3964..a12ec397b55 100644
--- a/src/devices/machine/8042kbdc.h
+++ b/src/devices/machine/8042kbdc.h
@@ -30,14 +30,21 @@ public:
KBDC8042_STANDARD,
KBDC8042_PS2
};
+ enum kbdc8042_interrupt_type_t
+ {
+ KBDC8042_SINGLE,
+ KBDC8042_DOUBLE
+ };
// construction/destruction
kbdc8042_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
void set_keyboard_type(kbdc8042_type_t keybtype) { m_keybtype = keybtype; }
+ void set_interrupt_type(kbdc8042_interrupt_type_t interrupttype) { m_interrupttype = interrupttype; }
auto system_reset_callback() { return m_system_reset_cb.bind(); }
auto gate_a20_callback() { return m_gate_a20_cb.bind(); }
auto input_buffer_full_callback() { return m_input_buffer_full_cb.bind(); }
+ auto input_buffer_full_mouse_callback() { return m_input_buffer_full_mouse_cb.bind(); }
auto output_buffer_empty_callback() { return m_output_buffer_empty_cb.bind(); }
auto speaker_callback() { return m_speaker_cb.bind(); }
@@ -60,6 +67,8 @@ protected:
virtual void device_timer(timer_instance const &timer) override;
virtual ioport_constructor device_input_ports() const override;
+ void mouse_enqueue(uint8_t value);
+
static const device_timer_id TIMER_UPDATE = 0;
private:
@@ -74,16 +83,19 @@ private:
} m_keyboard;
struct {
int received;
- int on;
+ bool on;
+ bool reporting;
uint8_t sample_rate;
+ uint8_t resolution;
bool receiving_sample_rate;
+ bool receiving_resolution;
uint8_t transmit_buf[8];
- uint8_t to_transmit;
+ int to_transmit;
+ int from_transmit;
} m_mouse;
int m_last_write_to_control;
int m_sending;
- int m_send_to_mouse;
int m_operation_write_state;
int m_status_read_mode;
@@ -102,11 +114,13 @@ private:
optional_ioport m_mousebtn_port;
kbdc8042_type_t m_keybtype;
+ kbdc8042_interrupt_type_t m_interrupttype;
devcb_write_line m_system_reset_cb;
devcb_write_line m_gate_a20_cb;
devcb_write_line m_input_buffer_full_cb;
- devcb_write_line m_output_buffer_empty_cb;
+ devcb_write_line m_input_buffer_full_mouse_cb;
+ devcb_write_line m_output_buffer_empty_cb; // currently not used
devcb_write8 m_speaker_cb;
diff --git a/src/devices/machine/ataflash.cpp b/src/devices/machine/ataflash.cpp
index 464bd074cdf..155ec34bcd3 100644
--- a/src/devices/machine/ataflash.cpp
+++ b/src/devices/machine/ataflash.cpp
@@ -140,7 +140,7 @@ void taito_pccard1_device::device_reset()
uint32_t metalength;
memset(m_key, 0, sizeof(m_key));
- if (m_handle != nullptr && m_handle->read_metadata(HARD_DISK_KEY_METADATA_TAG, 0, m_key, 5, metalength) == CHDERR_NONE)
+ if (m_handle && !m_handle->read_metadata(HARD_DISK_KEY_METADATA_TAG, 0, m_key, 5, metalength))
{
m_locked = 0x1ff;
}
@@ -231,7 +231,7 @@ void taito_pccard2_device::device_reset()
uint32_t metalength;
memset(m_key, 0, sizeof(m_key));
- if (m_handle != nullptr && m_handle->read_metadata(HARD_DISK_KEY_METADATA_TAG, 0, m_key, 5, metalength) == CHDERR_NONE)
+ if (m_handle && !m_handle->read_metadata(HARD_DISK_KEY_METADATA_TAG, 0, m_key, 5, metalength))
{
m_locked = true;
}
@@ -330,7 +330,7 @@ void taito_compact_flash_device::device_reset()
uint32_t metalength;
memset(m_key, 0, sizeof(m_key));
- if (m_handle != nullptr && m_handle->read_metadata(HARD_DISK_KEY_METADATA_TAG, 0, m_key, 5, metalength) == CHDERR_NONE)
+ if (m_handle && !m_handle->read_metadata(HARD_DISK_KEY_METADATA_TAG, 0, m_key, 5, metalength))
{
m_locked = true;
}
diff --git a/src/devices/machine/ch376.cpp b/src/devices/machine/ch376.cpp
index 8c13833292e..eeca140ec0a 100644
--- a/src/devices/machine/ch376.cpp
+++ b/src/devices/machine/ch376.cpp
@@ -255,7 +255,7 @@ void ch376_device::write(offs_t offset, u8 data)
tmpPath.append(m_file_name);
}
- if (osd_file::open(tmpPath, OPEN_FLAG_READ|OPEN_FLAG_WRITE, m_file, size) == osd_file::error::NONE)
+ if (!osd_file::open(tmpPath, OPEN_FLAG_READ|OPEN_FLAG_WRITE, m_file, size))
{
m_int_status = STATUS_USB_INT_SUCCESS;
m_cur_file_size = size & 0xffffffff;
diff --git a/src/devices/machine/clock.cpp b/src/devices/machine/clock.cpp
index d4c8dfc0d28..64e937ffb29 100644
--- a/src/devices/machine/clock.cpp
+++ b/src/devices/machine/clock.cpp
@@ -1,46 +1,146 @@
// license:BSD-3-Clause
-// copyright-holders:smf
+// copyright-holders:smf, hap
+/*
+
+Generic clock signal device
+
+Set the period either with device_t m_clock, or with set_period if it needs
+to be more fine-tuned (m_clock has higher priority).
+
+The duty cycle can be changed with set_duty_cycle (default is 50%), or the
+pulse width (active time) can be set directly with set_pulse_width.
+
+Output signal at machine start is right after falling edge.
+
+TODO:
+- add one-shot trigger? eg. monostable 555
+
+*/
+
#include "emu.h"
#include "clock.h"
DEFINE_DEVICE_TYPE(CLOCK, clock_device, "clock", "Clock")
-clock_device::clock_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, CLOCK, tag, owner, clock),
+clock_device::clock_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ device_t(mconfig, CLOCK, tag, owner, clock),
m_signal(0),
- m_timer(nullptr),
+ m_output(-1),
+ m_duty(0.5),
+ m_period(attotime::never),
+ m_pw(attotime::never),
+ m_timer_init(nullptr),
+ m_timer_tick(nullptr),
m_signal_handler(*this)
{
}
void clock_device::device_start()
{
- m_signal_handler.resolve();
+ m_signal_handler.resolve_safe();
save_item(NAME(m_signal));
+ save_item(NAME(m_output));
+ save_item(NAME(m_duty));
+ save_item(NAME(m_period));
+ save_item(NAME(m_pw));
+ save_item(NAME(m_thigh));
+ save_item(NAME(m_tlow));
+
+ m_timer_init = timer_alloc(TID_CLOCK_INIT);
+ m_timer_tick = timer_alloc(TID_CLOCK_TICK);
+ reinit();
}
-void clock_device::device_clock_changed()
+void clock_device::reinit()
{
- if (!m_signal_handler.isnull() && m_clock > 0)
- {
- if (m_timer == nullptr)
- m_timer = timer_alloc(0);
+ if (!m_timer_init)
+ return;
- const attotime period(attotime::from_hz(m_clock * 2));
-
- attotime next = period - m_timer->elapsed();
- if (next < attotime::zero)
- next = attotime::zero;
+ // not using synchronize(), that may retrigger more than once
+ m_timer_init->adjust(attotime::zero);
+}
- m_timer->adjust(next, 0, period);
+void clock_device::output()
+{
+ if (m_signal != m_output)
+ {
+ m_output = m_signal;
+ m_signal_handler(m_output);
}
- else if (m_timer != nullptr)
- m_timer->adjust(attotime::never);
}
void clock_device::device_timer(timer_instance const &timer)
{
- m_signal = !m_signal;
- m_signal_handler(m_signal);
+ switch (id)
+ {
+ case TID_CLOCK_INIT:
+ {
+ attotime period = (m_clock > 0) ? attotime::from_hz(m_clock) : m_period;
+ assert(!period.is_zero());
+
+ if (period.is_never())
+ {
+ m_timer_tick->adjust(attotime::never);
+ return;
+ }
+
+ if (!m_pw.is_never())
+ {
+ // set timing via pulse width
+ attotime pw = m_pw;
+ if (pw > period)
+ pw = period;
+
+ m_thigh = pw;
+ m_tlow = period - pw;
+ }
+ else
+ {
+ // set timing via duty cycle
+ if (m_duty == 0.5)
+ {
+ m_thigh = period / 2;
+ m_tlow = m_thigh;
+ }
+ else if (m_duty == 0.0)
+ {
+ m_thigh = attotime::zero;
+ m_tlow = period;
+ }
+ else if (m_duty == 1.0)
+ {
+ m_thigh = period;
+ m_tlow = attotime::zero;
+ }
+ else
+ {
+ double p = period.as_double();
+ m_thigh = attotime::from_double(m_duty * p);
+ m_tlow = attotime::from_double((1.0 - m_duty) * p);
+ }
+ }
+
+ attotime next = m_signal ? m_thigh : m_tlow;
+ if (next < m_timer_tick->remaining())
+ m_timer_tick->adjust(next);
+
+ break;
+ }
+
+ case TID_CLOCK_TICK:
+ if (m_thigh.is_zero())
+ m_signal = 0;
+ else if (m_tlow.is_zero())
+ m_signal = 1;
+ else
+ m_signal ^= 1;
+
+ m_timer_tick->adjust(m_signal ? m_thigh : m_tlow);
+ output();
+ break;
+
+ default:
+ break;
+ }
}
diff --git a/src/devices/machine/clock.h b/src/devices/machine/clock.h
index 15c9642d448..95d6a46a419 100644
--- a/src/devices/machine/clock.h
+++ b/src/devices/machine/clock.h
@@ -1,27 +1,51 @@
// license:BSD-3-Clause
-// copyright-holders:smf
+// copyright-holders:smf, hap
+/*
+
+ Generic clock signal device
+
+*/
+
#ifndef MAME_MACHINE_CLOCK_H
#define MAME_MACHINE_CLOCK_H
#pragma once
-
class clock_device : public device_t
{
public:
+ clock_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+
auto signal_handler() { return m_signal_handler.bind(); }
- DECLARE_READ_LINE_MEMBER(signal_r) { return m_signal; }
+ auto &set_period(attotime period) { m_period = period; reinit(); return *this; }
+ auto &set_pulse_width(attotime pw) { assert(!pw.is_never()); m_pw = pw; reinit(); return *this; }
+ auto &set_duty_cycle(double duty) { assert(duty >= 0.0 && duty <= 1.0); m_duty = duty; m_pw = attotime::never; reinit(); return *this; }
- clock_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ DECLARE_READ_LINE_MEMBER(signal_r) { return m_signal; }
protected:
virtual void device_start() override;
+ virtual void device_reset() override { output(); }
virtual void device_timer(timer_instance const &timer) override;
- virtual void device_clock_changed() override;
+ virtual void device_clock_changed() override { reinit(); }
private:
+ static constexpr device_timer_id TID_CLOCK_INIT = 0;
+ static constexpr device_timer_id TID_CLOCK_TICK = 1;
+
+ void reinit();
+ void output();
+
int m_signal;
- emu_timer *m_timer;
+ int m_output;
+ double m_duty;
+ attotime m_period;
+ attotime m_pw;
+ attotime m_thigh;
+ attotime m_tlow;
+
+ emu_timer *m_timer_init;
+ emu_timer *m_timer_tick;
devcb_write_line m_signal_handler;
};
diff --git a/src/devices/machine/fdc37c665gt.cpp b/src/devices/machine/fdc37c665gt.cpp
index d95acc0358c..c14e6437d3e 100644
--- a/src/devices/machine/fdc37c665gt.cpp
+++ b/src/devices/machine/fdc37c665gt.cpp
@@ -129,7 +129,7 @@ uint8_t fdc37c665gt_device::read(offs_t offset)
return 0;
}
- return m_serial[0]->ins8250_r(offset - device_addresses[LogicalDevice::Serial1]);
+ return m_serial[0]->ins8250_r(offset - com_addresses[device_addresses[LogicalDevice::Serial1]]);
}
// Serial 2
@@ -138,7 +138,7 @@ uint8_t fdc37c665gt_device::read(offs_t offset)
return 0;
}
- return m_serial[1]->ins8250_r(offset - device_addresses[LogicalDevice::Serial2]);
+ return m_serial[1]->ins8250_r(offset - com_addresses[device_addresses[LogicalDevice::Serial2]]);
}
// FDC, +6 is used by IDE
@@ -177,22 +177,22 @@ void fdc37c665gt_device::write(offs_t offset, uint8_t data)
}
// Serial 1
- if (offset >= device_addresses[LogicalDevice::Serial1] && offset <= device_addresses[LogicalDevice::Serial1] + 7) {
+ if (offset >= com_addresses[device_addresses[LogicalDevice::Serial1]] && offset <= com_addresses[device_addresses[LogicalDevice::Serial1]] + 7) {
if (!enabled_logical[LogicalDevice::Serial1]) {
return;
}
- m_serial[0]->ins8250_w(offset - device_addresses[LogicalDevice::Serial1], data);
+ m_serial[0]->ins8250_w(offset - com_addresses[device_addresses[LogicalDevice::Serial1]], data);
return;
}
// Serial 2
- if (offset >= device_addresses[LogicalDevice::Serial2] && offset <= device_addresses[LogicalDevice::Serial2] + 7) {
+ if (offset >= com_addresses[device_addresses[LogicalDevice::Serial2]] && offset <= com_addresses[device_addresses[LogicalDevice::Serial2]] + 7) {
if (!enabled_logical[LogicalDevice::Serial2]) {
return;
}
- m_serial[1]->ins8250_w(offset - device_addresses[LogicalDevice::Serial2], data);
+ m_serial[1]->ins8250_w(offset - com_addresses[device_addresses[LogicalDevice::Serial2]], data);
return;
}
diff --git a/src/devices/machine/fdc37c93x.cpp b/src/devices/machine/fdc37c93x.cpp
index 5d7fed53196..9e76e058a00 100644
--- a/src/devices/machine/fdc37c93x.cpp
+++ b/src/devices/machine/fdc37c93x.cpp
@@ -275,7 +275,9 @@ void fdc37c93x_device::device_add_mconfig(machine_config &config)
// keyboard
KBDC8042(config, m_kbdc);
m_kbdc->set_keyboard_type(kbdc8042_device::KBDC8042_PS2);
+ m_kbdc->set_interrupt_type(kbdc8042_device::KBDC8042_DOUBLE);
m_kbdc->input_buffer_full_callback().set(FUNC(fdc37c93x_device::irq_keyboard_w));
+ m_kbdc->input_buffer_full_mouse_callback().set(FUNC(fdc37c93x_device::irq_mouse_w));
m_kbdc->system_reset_callback().set(FUNC(fdc37c93x_device::kbdp20_gp20_reset_w));
m_kbdc->gate_a20_callback().set(FUNC(fdc37c93x_device::kbdp21_gp25_gatea20_w));
}
diff --git a/src/devices/machine/hp_dc100_tape.cpp b/src/devices/machine/hp_dc100_tape.cpp
index 59f3687c005..32136b2ee47 100644
--- a/src/devices/machine/hp_dc100_tape.cpp
+++ b/src/devices/machine/hp_dc100_tape.cpp
@@ -30,6 +30,8 @@
#include "emu.h"
#include "hp_dc100_tape.h"
+#include "util/ioprocs.h"
+
// Debugging
#include "logmacro.h"
#define LOG_TMR_MASK (LOG_GENERAL << 1)
@@ -107,12 +109,12 @@ void hp_dc100_tape_device::call_unload()
device_reset();
if (m_image_dirty) {
- io_generic io;
- io.file = (device_image_interface *)this;
- io.procs = &image_ioprocs;
- io.filler = 0;
- m_image.save_tape(&io);
- m_image_dirty = false;
+ check_for_file();
+ auto io = util::core_file_read_write(image_core_file(), 0);
+ if (io) {
+ m_image.save_tape(*io);
+ m_image_dirty = false;
+ }
}
m_image.clear_tape();
@@ -602,18 +604,31 @@ image_init_result hp_dc100_tape_device::internal_load(bool is_create)
device_reset();
- io_generic io;
- io.file = (device_image_interface *)this;
- io.procs = &image_ioprocs;
- io.filler = 0;
+ check_for_file();
if (is_create) {
+ auto io = util::core_file_read_write(image_core_file(), 0);
+ if (!io) {
+ LOG("out of memory\n");
+ seterror(std::errc::not_enough_memory, nullptr);
+ set_tape_present(false);
+ return image_init_result::FAIL;
+ }
m_image.clear_tape();
- m_image.save_tape(&io);
- } else if (!m_image.load_tape(&io)) {
- LOG("load failed\n");
- seterror(IMAGE_ERROR_INVALIDIMAGE , "Wrong format");
- set_tape_present(false);
- return image_init_result::FAIL;
+ m_image.save_tape(*io);
+ } else {
+ auto io = util::core_file_read(image_core_file(), 0);
+ if (!io) {
+ LOG("out of memory\n");
+ seterror(std::errc::not_enough_memory, nullptr);
+ set_tape_present(false);
+ return image_init_result::FAIL;
+ }
+ if (!m_image.load_tape(*io)) {
+ LOG("load failed\n");
+ seterror(image_error::INVALIDIMAGE , "Wrong format");
+ set_tape_present(false);
+ return image_init_result::FAIL;
+ }
}
LOG("load OK\n");
diff --git a/src/devices/machine/i8255.cpp b/src/devices/machine/i8255.cpp
index e0e5d8297a6..003734413e4 100644
--- a/src/devices/machine/i8255.cpp
+++ b/src/devices/machine/i8255.cpp
@@ -64,7 +64,6 @@ enum
//**************************************************************************
DEFINE_DEVICE_TYPE(I8255, i8255_device, "i8255", "Intel 8255 PPI")
-decltype(I8255) I8255A = I8255;
DEFINE_DEVICE_TYPE(AMS40489_PPI, ams40489_ppi_device, "ams40489_ppi", "Amstrad AMS40489 PPI")
diff --git a/src/devices/machine/i8255.h b/src/devices/machine/i8255.h
index 44a4dc72e5f..bd74fe2eb6e 100644
--- a/src/devices/machine/i8255.h
+++ b/src/devices/machine/i8255.h
@@ -142,7 +142,7 @@ public:
// device type definition
DECLARE_DEVICE_TYPE(I8255, i8255_device)
-DECLARE_DEVICE_TYPE(I8255A, i8255_device)
+static auto &I8255A = I8255;
DECLARE_DEVICE_TYPE(AMS40489_PPI, ams40489_ppi_device)
#endif // MAME_MACHINE_I8255_H
diff --git a/src/devices/machine/i8257.cpp b/src/devices/machine/i8257.cpp
index 2a5a05b6421..9f0d47083ba 100644
--- a/src/devices/machine/i8257.cpp
+++ b/src/devices/machine/i8257.cpp
@@ -428,7 +428,7 @@ void i8257_device::execute_run()
if (m_ready)
{
m_state = STATE_S4;
- if (m_channel[m_current_channel].m_count == 0)
+ if ((m_channel[m_current_channel].m_count == 0) && (MODE_TRANSFER_MASK != MODE_TRANSFER_READ))
set_tc(1);
}
else
@@ -439,7 +439,7 @@ void i8257_device::execute_run()
if (m_ready)
{
m_state = STATE_S4;
- if (m_channel[m_current_channel].m_count == 0)
+ if ((m_channel[m_current_channel].m_count == 0) && (MODE_TRANSFER_MASK != MODE_TRANSFER_READ))
set_tc(1);
}
break;
@@ -449,6 +449,8 @@ void i8257_device::execute_run()
{
dma_write();
}
+ if ((m_channel[m_current_channel].m_count == 0) && (MODE_TRANSFER_MASK == MODE_TRANSFER_READ))
+ set_tc(1);
advance();
if(m_hack && next_channel())
diff --git a/src/devices/machine/laserdsc.cpp b/src/devices/machine/laserdsc.cpp
index e751abb2254..a23f315563f 100644
--- a/src/devices/machine/laserdsc.cpp
+++ b/src/devices/machine/laserdsc.cpp
@@ -10,11 +10,11 @@
#include "emu.h"
#include "laserdsc.h"
-#include "avhuff.h"
-#include "vbiparse.h"
+
#include "config.h"
#include "render.h"
#include "romload.h"
+
#include "chd.h"
@@ -73,7 +73,7 @@ laserdisc_device::laserdisc_device(const machine_config &mconfig, device_type ty
m_height(0),
m_fps_times_1million(0),
m_samplerate(0),
- m_readresult(CHDERR_NONE),
+ m_readresult(),
m_chdtracks(0),
m_work_queue(osd_work_queue_alloc(WORK_QUEUE_FLAG_IO)),
m_audiosquelch(0),
@@ -666,8 +666,9 @@ void laserdisc_device::init_disc()
// read the metadata
std::string metadata;
- chd_error err = m_disc->read_metadata(AV_METADATA_TAG, 0, metadata);
- if (err != CHDERR_NONE)
+ std::error_condition err;
+ err = m_disc->read_metadata(AV_METADATA_TAG, 0, metadata);
+ if (err)
throw emu_fatalerror("Non-A/V CHD file specified");
// extract the metadata
@@ -687,7 +688,7 @@ void laserdisc_device::init_disc()
// allocate memory for the precomputed per-frame metadata
err = m_disc->read_metadata(AV_LD_METADATA_TAG, 0, m_vbidata);
- if (err != CHDERR_NONE || m_vbidata.size() != totalhunks * VBI_PACKED_BYTES)
+ if (err || (m_vbidata.size() != totalhunks * VBI_PACKED_BYTES))
throw emu_fatalerror("Precomputed VBI metadata missing or incorrect size");
}
m_maxtrack = std::max(m_maxtrack, VIRTUAL_LEAD_IN_TRACKS + VIRTUAL_LEAD_OUT_TRACKS + m_chdtracks);
@@ -964,14 +965,14 @@ void laserdisc_device::read_track_data()
}
// configure the codec and then read
- m_readresult = CHDERR_FILE_NOT_FOUND;
- if (m_disc != nullptr && !m_videosquelch)
+ m_readresult = std::errc::no_such_file_or_directory;
+ if (m_disc && !m_videosquelch)
{
m_readresult = m_disc->codec_configure(CHD_CODEC_AVHUFF, AVHUFF_CODEC_DECOMPRESS_CONFIG, &m_avhuff_config);
- if (m_readresult == CHDERR_NONE)
+ if (!m_readresult)
{
m_queued_hunknum = readhunk;
- m_readresult = CHDERR_OPERATION_PENDING;
+ m_readresult = chd_file::error::OPERATION_PENDING;
osd_work_item_queue(m_work_queue, read_async_static, this, WORK_ITEM_FLAG_AUTO_RELEASE);
}
}
@@ -999,12 +1000,12 @@ void *laserdisc_device::read_async_static(void *param, int threadid)
void laserdisc_device::process_track_data()
{
// wait for the async operation to complete
- if (m_readresult == CHDERR_OPERATION_PENDING)
+ if (m_readresult == chd_file::error::OPERATION_PENDING)
osd_work_queue_wait(m_work_queue, osd_ticks_per_second() * 10);
- assert(m_readresult != CHDERR_OPERATION_PENDING);
+ assert(m_readresult != chd_file::error::OPERATION_PENDING);
// remove the video if we had an error
- if (m_readresult != CHDERR_NONE)
+ if (m_readresult)
m_avhuff_video.reset();
// count the field as read if we are successful
diff --git a/src/devices/machine/laserdsc.h b/src/devices/machine/laserdsc.h
index 4f233c2e641..fa5a8eabccc 100644
--- a/src/devices/machine/laserdsc.h
+++ b/src/devices/machine/laserdsc.h
@@ -18,8 +18,10 @@
#include "vbiparse.h"
#include "avhuff.h"
-#include <type_traits>
+#include <algorithm>
+#include <system_error>
#include <utility>
+#include <vector>
//**************************************************************************
@@ -244,8 +246,8 @@ private:
{
bitmap_yuy16 m_bitmap; // cached bitmap
bitmap_yuy16 m_visbitmap; // wrapper around bitmap with only visible lines
- uint8_t m_numfields; // number of fields in this frame
- int32_t m_lastfield; // last absolute field number
+ uint8_t m_numfields; // number of fields in this frame
+ int32_t m_lastfield; // last absolute field number
};
// internal helpers
@@ -267,19 +269,19 @@ private:
get_disc_delegate m_getdisc_callback;
audio_delegate m_audio_callback; // audio streaming callback
laserdisc_overlay_config m_orig_config; // original overlay configuration
- uint32_t m_overwidth; // overlay screen width
- uint32_t m_overheight; // overlay screen height
+ uint32_t m_overwidth; // overlay screen width
+ uint32_t m_overheight; // overlay screen height
rectangle m_overclip; // overlay visarea
screen_update_rgb32_delegate m_overupdate_rgb32; // overlay update delegate
// disc parameters
chd_file * m_disc; // handle to the disc itself
- std::vector<uint8_t> m_vbidata; // pointer to precomputed VBI data
+ std::vector<uint8_t> m_vbidata; // pointer to precomputed VBI data
int m_width; // width of video
int m_height; // height of video
uint32_t m_fps_times_1million; // frame rate of video
int m_samplerate; // audio samplerate
- int m_readresult; // result of the most recent read
+ std::error_condition m_readresult; // result of the most recent read
uint32_t m_chdtracks; // number of tracks in the CHD
bitmap_yuy16 m_avhuff_video; // decompresed frame buffer
avhuff_decoder::config m_avhuff_config; // decompression configuration
@@ -305,12 +307,12 @@ private:
// audio data
sound_stream * m_stream;
- std::vector<int16_t> m_audiobuffer[2]; // buffer for audio samples
- uint32_t m_audiobufsize; // size of buffer
- uint32_t m_audiobufin; // input index
- uint32_t m_audiobufout; // output index
- uint32_t m_audiocursamples; // current samples this track
- uint32_t m_audiomaxsamples; // maximum samples per track
+ std::vector<int16_t> m_audiobuffer[2]; // buffer for audio samples
+ uint32_t m_audiobufsize; // size of buffer
+ uint32_t m_audiobufin; // input index
+ uint32_t m_audiobufout; // output index
+ uint32_t m_audiocursamples; // current samples this track
+ uint32_t m_audiomaxsamples; // maximum samples per track
// metadata
vbi_metadata m_metadata[2]; // metadata parsed from the stream, for each field
diff --git a/src/devices/machine/nscsi_bus.cpp b/src/devices/machine/nscsi_bus.cpp
index 084f9b63d6c..ab61dc73d7e 100644
--- a/src/devices/machine/nscsi_bus.cpp
+++ b/src/devices/machine/nscsi_bus.cpp
@@ -263,6 +263,7 @@ void nscsi_full_device::device_reset()
scsi_bus->data_w(scsi_refid, 0);
scsi_bus->ctrl_w(scsi_refid, 0, S_ALL);
scsi_bus->ctrl_wait(scsi_refid, S_SEL|S_BSY|S_RST, S_ALL);
+ sense(false, SK_NO_SENSE);
}
void nscsi_full_device::device_timer(timer_instance const &timer)
diff --git a/src/devices/machine/r10788.cpp b/src/devices/machine/r10788.cpp
index daab1341fa0..56470527373 100644
--- a/src/devices/machine/r10788.cpp
+++ b/src/devices/machine/r10788.cpp
@@ -13,7 +13,7 @@
KTR 1 1 x x x 1 1 0 0 Transfer Keyboard Return
KTS 1 1 x x x 1 0 1 0 Transfer Keyboard Strobe
KLA 1 1 x x x 1 1 1 0 Load Display Register A
- KLB 1 1 x x x 1 1 0 1 Load Display Register A
+ KLB 1 1 x x x 1 1 0 1 Load Display Register B
KDN 1 1 x x x 0 0 1 1 Turn On Display
KAF 1 1 x x x 1 0 1 1 Turn Off A
KBF 1 1 x x x 0 1 1 1 Turn Off B
@@ -34,6 +34,9 @@
7.) KER takes a maximum of 10-bit times to complete (= 80 clocks)
Therefore, there must be at least 10 bit times between KER
and the next KTS instruction.
+ 8.) This device has only been tested on the gts1 driver. It does
+ not use the keyboard. The digit data is inverted (so it stores
+ 6 when we want to display 9).
**********************************************************************/
#include "emu.h"
@@ -137,7 +140,7 @@ void r10788_device::device_timer(timer_instance const &timer)
void r10788_device::io_w(offs_t offset, uint8_t data)
{
- assert(offset < 16);
+ offset &= 15;
switch (offset)
{
case KTR: // Transfer Keyboard Return
@@ -149,6 +152,7 @@ void r10788_device::io_w(offs_t offset, uint8_t data)
m_kts = data;
break;
case KLA: // Load Display Register A
+ m_io_counter = (m_io_counter + 1) % 16;
LOG("%s: KLA [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data);
m_kla = data;
m_reg[0][m_io_counter] = m_kla;
@@ -156,21 +160,22 @@ void r10788_device::io_w(offs_t offset, uint8_t data)
case KLB: // Load Display Register B
LOG("%s: KLB [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data);
m_klb = data;
- m_reg[1][m_io_counter] = m_kla;
+ m_reg[1][m_io_counter] = m_klb;
break;
case KDN: // Turn On Display
LOG("%s: KDN data:%02x\n", __FUNCTION__, data);
m_mask_a = 15;
m_mask_b = 15;
+ m_io_counter = 15;
break;
case KAF: // Turn Off A
LOG("%s: KAF data:%02x\n", __FUNCTION__, data);
m_mask_a = 0;
- m_mask_b &= ~3;
+ m_mask_b &= 12;
break;
case KBF: // Turn Off B
LOG("%s: KBF data:%02x\n", __FUNCTION__, data);
- m_mask_b &= ~12;
+ m_mask_b &= 3;
break;
case KER: // Reset Keyboard Error
LOG("%s: KER data:%02x\n", __FUNCTION__, data);
@@ -182,7 +187,7 @@ void r10788_device::io_w(offs_t offset, uint8_t data)
uint8_t r10788_device::io_r(offs_t offset)
{
- assert(offset < 16);
+ offset &= 15;
uint8_t data = 0xf;
switch (offset)
{
@@ -203,8 +208,6 @@ uint8_t r10788_device::io_r(offs_t offset)
m_klb = m_reg[1][m_io_counter];
data = m_klb;
LOG("%s: KLB [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data);
- // FIXME: does it automagically increment at KLB write?
- m_io_counter = (m_io_counter + 1) % 16;
break;
case KDN: // Turn On Display
LOG("%s: KDN data:%02x\n", __FUNCTION__, data);
diff --git a/src/devices/machine/spi_sdcard.cpp b/src/devices/machine/spi_sdcard.cpp
new file mode 100644
index 00000000000..0f51026e852
--- /dev/null
+++ b/src/devices/machine/spi_sdcard.cpp
@@ -0,0 +1,273 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+/*
+ SD Card emulation, SPI interface only currently
+ Emulation by R. Belmont
+
+ This emulates an SDHC card, which means the block size is fixed at 512 bytes and makes things simpler.
+ Adapting the code to also handle SD version 2 non-HC cards would be relatively straightforward as well;
+ the block size defaults to 1 byte in that case but can be overridden with CMD16.
+
+ Adding the native 4-bit-wide SD interface is also possible
+
+ Multiple block read/write commands are not supported but would be straightforward to add.
+
+ Refrences:
+ https://www.sdcard.org/downloads/pls/ (Physical Layer Simplified Specification)
+ http://www.dejazzer.com/ee379/lecture_notes/lec12_sd_card.pdf
+ https://embdev.net/attachment/39390/TOSHIBA_SD_Card_Specification.pdf
+ http://elm-chan.org/docs/mmc/mmc_e.html
+*/
+
+#include "emu.h"
+#include "spi_sdcard.h"
+#include "imagedev/harddriv.h"
+
+#define LOG_GENERAL (1U << 0)
+#define LOG_COMMAND (1U << 1)
+#define LOG_SPI (1U << 2)
+
+//#define VERBOSE (LOG_COMMAND)
+#define LOG_OUTPUT_FUNC osd_printf_info
+
+#include "logmacro.h"
+
+static constexpr u8 DATA_RESPONSE_OK = 0x05;
+static constexpr u8 DATA_RESPONSE_IO_ERROR = 0x0d;
+
+DEFINE_DEVICE_TYPE(SPI_SDCARD, spi_sdcard_device, "spi_sdcard", "SD Card (SPI Interface)")
+
+spi_sdcard_device::spi_sdcard_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, type, tag, owner, clock),
+ write_miso(*this),
+ m_image(*this, "image"),
+ m_harddisk(nullptr),
+ m_in_latch(0), m_out_latch(0), m_cmd_ptr(0), m_state(0), m_out_ptr(0), m_out_count(0), m_ss(0), m_in_bit(0),
+ m_cur_bit(0), m_write_ptr(0), m_bACMD(false)
+{
+}
+
+spi_sdcard_device::spi_sdcard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ spi_sdcard_device(mconfig, SPI_SDCARD, tag, owner, clock)
+{
+}
+
+void spi_sdcard_device::device_start()
+{
+ write_miso.resolve_safe();
+ save_item(NAME(m_in_latch));
+ save_item(NAME(m_out_latch));
+ save_item(NAME(m_cmd_ptr));
+ save_item(NAME(m_state));
+ save_item(NAME(m_out_ptr));
+ save_item(NAME(m_out_count));
+ save_item(NAME(m_ss));
+ save_item(NAME(m_in_bit));
+ save_item(NAME(m_cur_bit));
+ save_item(NAME(m_write_ptr));
+ save_item(NAME(m_cmd));
+ save_item(NAME(m_data));
+ save_item(NAME(m_bACMD));
+}
+
+void spi_sdcard_device::device_reset()
+{
+ m_harddisk = m_image->get_hard_disk_file();
+}
+
+void spi_sdcard_device::device_add_mconfig(machine_config &config)
+{
+ HARDDISK(config, m_image).set_interface("spi_sdcard");
+}
+
+void spi_sdcard_device::send_data(int count)
+{
+ m_out_ptr = 0;
+ m_out_count = count;
+}
+
+void spi_sdcard_device::spi_clock_w(int state)
+{
+ // only respond if selected
+ if (m_ss)
+ {
+ // We implmement SPI Mode 3 signalling, in which we latch the data on
+ // rising clock edges, and shift the data on falling clock edges.
+ // See http://www.dejazzer.com/ee379/lecture_notes/lec12_sd_card.pdf for details
+ // on the 4 SPI signalling modes. SD Cards can work in ether Mode 0 or Mode 3,
+ // both of which shift on the falling edge and latch on the rising edge but
+ // have opposite CLK polarity.
+
+ if (state)
+ {
+ m_in_latch &= ~0x01;
+ m_in_latch |= m_in_bit;
+ LOGMASKED(LOG_SPI, "\tsdcard: L %02x (%d) (out %02x)\n", m_in_latch, m_cur_bit, m_out_latch);
+ m_cur_bit++;
+ if (m_cur_bit == 8)
+ {
+ LOGMASKED(LOG_SPI, "SDCARD: got %02x\n", m_in_latch);
+
+ switch (m_state)
+ {
+ case SD_STATE_IDLE:
+ for (int i = 0; i < 5; i++)
+ {
+ m_cmd[i] = m_cmd[i + 1];
+ }
+ m_cmd[5] = m_in_latch;
+
+ if ((((m_cmd[0] & 0xc0) == 0x40) && (m_cmd[5] & 1)) && (m_out_count == 0))
+ {
+ do_command();
+ }
+ break;
+
+ case SD_STATE_WRITE_WAITFE:
+ if (m_in_latch == 0xfe)
+ {
+ m_state = SD_STATE_WRITE_DATA;
+ m_out_latch = 0xff;
+ m_write_ptr = 0;
+ }
+ break;
+
+ case SD_STATE_WRITE_DATA:
+ m_data[m_write_ptr++] = m_in_latch;
+ if (m_write_ptr == 514)
+ {
+ u32 blk = (m_cmd[1] << 24) | (m_cmd[2] << 16) | (m_cmd[3] << 8) | m_cmd[4];
+ LOGMASKED(LOG_GENERAL, "writing LBA %x, data %02x %02x %02x %02x\n", blk, m_data[0], m_data[1], m_data[2], m_data[3]);
+ if (hard_disk_write(m_harddisk, blk, &m_data[0]))
+ {
+ m_data[0] = DATA_RESPONSE_OK;
+ }
+ else
+ {
+ m_data[0] = DATA_RESPONSE_IO_ERROR;
+ }
+ m_data[1] = 0x01;
+
+ m_state = SD_STATE_IDLE;
+ send_data(2);
+ }
+ break;
+ }
+ }
+ }
+ else
+ {
+ m_in_latch <<= 1;
+ m_out_latch <<= 1;
+ LOGMASKED(LOG_SPI, "\tsdcard: S %02x %02x (%d)\n", m_in_latch, m_out_latch, m_cur_bit);
+ if (m_cur_bit == 8)
+ {
+ m_cur_bit = 0;
+ }
+
+ if (m_cur_bit == 0)
+ {
+ if (m_out_count > 0)
+ {
+ m_out_latch = m_data[m_out_ptr++];
+ LOGMASKED(LOG_SPI, "SDCARD: latching %02x (start of shift)\n", m_out_latch);
+ m_out_count--;
+ }
+ }
+
+ write_miso(BIT(m_out_latch, 7) ? ASSERT_LINE : CLEAR_LINE);
+ }
+ }
+}
+
+void spi_sdcard_device::do_command()
+{
+ LOGMASKED(LOG_COMMAND, "SDCARD: cmd %02d %02x %02x %02x %02x %02x\n", m_cmd[0] & 0x3f, m_cmd[1], m_cmd[2], m_cmd[3], m_cmd[4], m_cmd[5]);
+ switch (m_cmd[0] & 0x3f)
+ {
+ case 0: // CMD0 - GO_IDLE_STATE
+ if (m_harddisk)
+ {
+ m_data[0] = 0x01;
+ }
+ else
+ {
+ m_data[0] = 0x00;
+ }
+ send_data(1);
+ break;
+
+ case 8: // CMD8 - SEND_IF_COND (SD v2 only)
+ m_data[0] = 0x01;
+ m_data[1] = 0;
+ m_data[2] = 0;
+ m_data[3] = 0;
+ m_data[4] = 0xaa;
+ send_data(5);
+ break;
+
+ case 17: // CMD17 - READ_SINGLE_BLOCK
+ if (m_harddisk)
+ {
+ m_data[0] = 0x00; // initial R1 response
+ // data token occurs some time after the R1 response. A2SD expects at least 1
+ // byte of space between R1 and the data packet.
+ m_data[2] = 0xfe; // data token
+ u32 blk = (m_cmd[1] << 24) | (m_cmd[2] << 16) | (m_cmd[3] << 8) | m_cmd[4];
+ LOGMASKED(LOG_GENERAL, "reading LBA %x\n", blk);
+ hard_disk_read(m_harddisk, blk, &m_data[3]);
+ send_data(3 + 512 + 2);
+ }
+ else
+ {
+ m_data[0] = 0xff; // show an error
+ send_data(1);
+ }
+ break;
+
+ case 24: // CMD24 - WRITE_BLOCK
+ m_data[0] = 0;
+ send_data(1);
+ m_state = SD_STATE_WRITE_WAITFE;
+ break;
+
+ case 41:
+ if (m_bACMD) // ACMD41 - SD_SEND_OP_COND
+ {
+ m_data[0] = 0;
+ }
+ else // CMD41 - illegal
+ {
+ m_data[0] = 0xff;
+ }
+ send_data(1);
+ break;
+
+ case 55: // CMD55 - APP_CMD
+ m_data[0] = 0x01;
+ send_data(1);
+ break;
+
+ case 58: // CMD58 - READ_OCR
+ m_data[0] = 0;
+ m_data[1] = 0x40; // indicate SDHC support
+ m_data[2] = 0;
+ m_data[3] = 0;
+ m_data[4] = 0;
+ send_data(5);
+ break;
+
+ default:
+ break;
+ }
+
+ // if this is command 55, that's a prefix indicating the next command is an "app command" or "ACMD"
+ if ((m_cmd[0] & 0x3f) == 55)
+ {
+ m_bACMD = true;
+ }
+ else
+ {
+ m_bACMD = false;
+ }
+}
diff --git a/src/devices/machine/spi_sdcard.h b/src/devices/machine/spi_sdcard.h
new file mode 100644
index 00000000000..4bd79e5aa30
--- /dev/null
+++ b/src/devices/machine/spi_sdcard.h
@@ -0,0 +1,55 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+#ifndef MAME_MACHINE_SPI_SDCARD_H
+#define MAME_MACHINE_SPI_SDCARD_H
+
+#pragma once
+
+#include "imagedev/harddriv.h"
+
+class spi_sdcard_device : public device_t
+{
+public:
+ spi_sdcard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // SPI 4-wire interface
+ auto spi_miso_callback() { return write_miso.bind(); }
+ void spi_clock_w(int state);
+ void spi_ss_w(int state) { m_ss = state; }
+ void spi_mosi_w(int state) { m_in_bit = state; }
+
+ bool get_card_present() { return !(m_harddisk == nullptr); }
+
+ devcb_write_line write_miso;
+
+protected:
+ spi_sdcard_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ required_device<harddisk_image_device> m_image;
+
+private:
+ enum
+ {
+ SD_STATE_IDLE = 0,
+ SD_STATE_WRITE_WAITFE,
+ SD_STATE_WRITE_DATA
+ };
+
+ void send_data(int count);
+ void do_command();
+
+ u8 m_data[520], m_cmd[6];
+ hard_disk_file *m_harddisk;
+
+ u8 m_in_latch, m_out_latch;
+ int m_cmd_ptr, m_state, m_out_ptr, m_out_count, m_ss, m_in_bit, m_cur_bit, m_write_ptr;
+ bool m_bACMD;
+};
+
+DECLARE_DEVICE_TYPE(SPI_SDCARD, spi_sdcard_device)
+
+#endif // MAME_MACHINE_SPI_SDCARD_H
diff --git a/src/devices/machine/upd4991a.cpp b/src/devices/machine/upd4991a.cpp
new file mode 100644
index 00000000000..da192819024
--- /dev/null
+++ b/src/devices/machine/upd4991a.cpp
@@ -0,0 +1,140 @@
+// license:BSD-3-Clause
+// copyright-holders: Angelo Salese
+/**************************************************************************************************
+
+ NEC uPD4991/uPD4991a parallel RTC
+
+ uPD4991 should be very similar but with "30% more power consumption" (cit.)
+
+ TODO:
+ - bare minimum to make PC98HA happy;
+ - set clock regs;
+ - alarm & timer pulse;
+ - AM/PM hour mode;
+ - leap year;
+ - busy flag;
+ - adjust/clock stop/clock wait mechanisms;
+
+**************************************************************************************************/
+
+#include "emu.h"
+#include "machine/upd4991a.h"
+
+
+//*************************************************************************************************
+// GLOBAL VARIABLES
+//*************************************************************************************************
+
+// device type definition
+DEFINE_DEVICE_TYPE(UPD4991A, upd4991a_device, "upd4991a", "NEC uPD4991a parallel RTC")
+
+
+//*************************************************************************************************
+// LIVE DEVICE
+//*************************************************************************************************
+
+//-------------------------------------------------
+// upd4991a_device - constructor
+//-------------------------------------------------
+
+upd4991a_device::upd4991a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, UPD4991A, tag, owner, clock)
+ , device_rtc_interface(mconfig, *this)
+ , m_timer_clock(nullptr)
+{
+ std::fill(std::begin(m_rtc_regs), std::end(m_rtc_regs), 0);
+}
+
+
+//-------------------------------------------------
+// device_validity_check - perform validity checks
+// on this device
+//-------------------------------------------------
+
+void upd4991a_device::device_validity_check(validity_checker &valid) const
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void upd4991a_device::device_start()
+{
+ m_timer_clock = timer_alloc(TIMER_CLOCK);
+ m_timer_clock->adjust(attotime::from_hz(clock() / 32768), 0, attotime::from_hz(clock() / 32768));
+
+ save_item(NAME(m_address));
+}
+
+
+void upd4991a_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_CLOCK:
+ advance_seconds();
+ break;
+ }
+}
+
+//-------------------------------------------------
+// rtc_clock_updated -
+//-------------------------------------------------
+
+void upd4991a_device::rtc_clock_updated(int year, int month, int day, int day_of_week, int hour, int minute, int second)
+{
+/*
+[0-1]
+xxxx xxxx seconds
+[2-3]
+xxxx xxxx minutes
+[4-5]
+xxxx xxxx hour
+[6-7]
+---- xxxx date digit (weekday?)
+xxxx ---- 1 day digit
+[8-9]
+---- xxxx 10 day digit
+xxxx ---- 1 month digit
+[a-b]
+---- xxxx 10 month digit
+xxxx ---- 1 year digit
+[c-d]
+---- xxxx 10 year digit
+xxxx ---- control register 1 (write only)
+[e-f]
+---- xxxx control register 2 (read/write)
+xxxx ---- mode register (write only)
+*/
+ m_rtc_regs[0] = convert_to_bcd(second);
+ m_rtc_regs[1] = convert_to_bcd(minute);
+ m_rtc_regs[2] = convert_to_bcd(hour);
+ const u8 bcd_day = convert_to_bcd(day);
+ const u8 bcd_month = convert_to_bcd(month);
+ const u8 bcd_year = convert_to_bcd(year);
+ m_rtc_regs[3] = (day_of_week-1) | ((bcd_day & 0x0f) << 4);
+ m_rtc_regs[4] = ((bcd_day & 0xf0) >> 4) | ((bcd_month & 0x0f) << 4);
+ m_rtc_regs[5] = ((bcd_month & 0xf0) >> 4) | ((bcd_year & 0x0f) << 4);
+ m_rtc_regs[6] = ((bcd_year & 0xf0) >> 4);
+}
+
+//*************************************************************************************************
+// READ/WRITE HANDLERS
+//*************************************************************************************************
+
+u8 upd4991a_device::data_r(offs_t offset)
+{
+ return m_rtc_regs[m_address >> 1] >> ((m_address & 1) ? 4 : 0);
+}
+
+void upd4991a_device::data_w(offs_t offset, u8 data)
+{
+ // ...
+}
+
+void upd4991a_device::address_w(offs_t offset, u8 data)
+{
+ m_address = data & 0xf;
+}
diff --git a/src/devices/machine/upd4991a.h b/src/devices/machine/upd4991a.h
new file mode 100644
index 00000000000..64746980a87
--- /dev/null
+++ b/src/devices/machine/upd4991a.h
@@ -0,0 +1,59 @@
+// license:BSD-3-Clause
+// copyright-holders: Angelo Salese
+/***************************************************************************
+
+ uPD4991a RTC
+
+***************************************************************************/
+
+#ifndef MAME_MACHINE_UPD4991A_H
+#define MAME_MACHINE_UPD4991A_H
+
+#pragma once
+
+#include "dirtc.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> upd4991a_device
+
+class upd4991a_device : public device_t, public device_rtc_interface
+{
+public:
+ // construction/destruction
+ upd4991a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ // I/O operations
+ void address_w(offs_t offset, u8 data);
+ u8 data_r(offs_t offset);
+ void data_w(offs_t offset, u8 data);
+
+protected:
+ // device-level overrides
+ virtual void device_validity_check(validity_checker &valid) const override;
+ virtual void device_start() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+ virtual void rtc_clock_updated(int year, int month, int day, int day_of_week, int hour, int minute, int second) override;
+
+private:
+ enum
+ {
+ TIMER_CLOCK
+ //TIMER_TP,
+ //TIMER_DATA_OUT,
+ //TIMER_TEST_MODE
+ };
+
+ emu_timer *m_timer_clock;
+ u8 m_rtc_regs[8];
+ u8 m_address;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(UPD4991A, upd4991a_device)
+
+#endif // MAME_MACHINE_UPD4991A_H
diff --git a/src/devices/sound/aica.cpp b/src/devices/sound/aica.cpp
index 4f1d127762d..33196d8de53 100644
--- a/src/devices/sound/aica.cpp
+++ b/src/devices/sound/aica.cpp
@@ -22,8 +22,8 @@
#include <algorithm>
-static constexpr s32 clip16(int x) { return std::min(32767, std::max(-32768, x)); }
-static constexpr s32 clip18(int x) { return std::min(131071, std::max(-131072, x)); }
+static constexpr s32 clip16(int x) { return std::clamp(x, -32768, 32767); }
+static constexpr s32 clip18(int x) { return std::clamp(x, -131072, 131071); }
#define SHIFT 12
#define FIX(v) ((u32)((float)(1 << SHIFT) * (v)))
diff --git a/src/devices/sound/aicadsp.cpp b/src/devices/sound/aicadsp.cpp
index 20faff8e5b8..a59c99b5bef 100644
--- a/src/devices/sound/aicadsp.cpp
+++ b/src/devices/sound/aicadsp.cpp
@@ -214,9 +214,9 @@ void AICADSP::step()
//Shifter
s32 SHIFTED = 0; //24 bit
if (SHIFT == 0)
- SHIFTED = std::max<s32>(std::min<s32>(ACC, 0x007FFFFF), -0x00800000);
+ SHIFTED = std::clamp<s32>(ACC, -0x00800000, 0x007FFFFF);
else if (SHIFT == 1)
- SHIFTED = std::max<s32>(std::min<s32>(ACC * 2, 0x007FFFFF), -0x00800000);
+ SHIFTED = std::clamp<s32>(ACC * 2, -0x00800000, 0x007FFFFF);
else if (SHIFT == 2)
{
SHIFTED = ACC * 2;
diff --git a/src/devices/sound/cem3394.cpp b/src/devices/sound/cem3394.cpp
index e0c74635648..0a4ba228827 100644
--- a/src/devices/sound/cem3394.cpp
+++ b/src/devices/sound/cem3394.cpp
@@ -171,7 +171,7 @@ double cem3394_device::filter(double input, double cutoff)
double cem3394_device::filter(double input, double cutoff)
{
// clamp cutoff to useful range, 50Hz-20kHz
- cutoff = std::min(std::max(cutoff, 50.0), 20000.0);
+ cutoff = std::clamp(cutoff, 50.0, 20000.0);
// clamp resonance to below 1.0 to prevent runaway behavior; when clamping,
// also apply an (arbitrary) scale factor to the output since we're close
@@ -222,7 +222,7 @@ double cem3394_device::filter(double input, double cutoff)
double cem3394_device::filter(double input, double cutoff)
{
// clamp cutoff to useful range, 50Hz-20kHz
- cutoff = std::min(std::max(cutoff, 50.0), 20000.0);
+ cutoff = std::clamp(cutoff, 50.0, 20000.0);
// clamp resonance to 0.95 to prevent infinite gain
double r = 4.0 * std::min(res, 0.95);
diff --git a/src/devices/sound/dmadac.cpp b/src/devices/sound/dmadac.cpp
index 384449fca9b..ae2ebce61ad 100644
--- a/src/devices/sound/dmadac.cpp
+++ b/src/devices/sound/dmadac.cpp
@@ -23,8 +23,6 @@
#define DEFAULT_SAMPLE_RATE (48000)
-#define BUFFER_SIZE 32768
-
/*************************************
*
@@ -38,8 +36,7 @@
void dmadac_sound_device::device_start()
{
- /* reset the state */
- m_volume = 1.0;
+ initialize_state();
/* allocate a stream channel */
m_channel = stream_alloc(0, 1, DEFAULT_SAMPLE_RATE);
@@ -49,11 +46,18 @@ void dmadac_sound_device::device_start()
save_item(NAME(m_bufout));
save_item(NAME(m_volume));
save_item(NAME(m_enabled));
- save_item(NAME(m_frequency));
save_item(NAME(m_buffer));
}
+void dmadac_sound_device::initialize_state()
+{
+ /* reset the state */
+ m_volume = 1.0;
+ m_bufin = m_bufout = 0;
+ m_enabled = 0;
+ std::fill_n(m_buffer.begin(), BUFFER_SIZE, 0);
+}
/*************************************
*
@@ -83,66 +87,6 @@ void dmadac_sound_device::flush()
m_channel->update();
}
-void dmadac_sound_device::transfer(int channel, offs_t channel_spacing, offs_t frame_spacing, offs_t total_frames, int16_t *data)
-{
- int j;
-
- /* loop over all channels and accumulate the data */
- constexpr stream_buffer::sample_t sample_scale = 1.0 / 32768.0;
- if (m_enabled)
- {
- int maxin = (m_bufout + BUFFER_SIZE - 1) % BUFFER_SIZE;
- int16_t *src = data + channel * channel_spacing;
- int curin = m_bufin;
-
- /* copy the data */
- for (j = 0; j < total_frames && curin != maxin; j++)
- {
- m_buffer[curin] = stream_buffer::sample_t(*src) * sample_scale;
- curin = (curin + 1) % BUFFER_SIZE;
- src += frame_spacing;
- }
- m_bufin = curin;
-
- /* log overruns */
- if (j != total_frames)
- logerror("dmadac_transfer: buffer overrun (short %d frames)\n", total_frames - j);
- }
-
- // FIXME: this line has rotted and can no longer compile - it should be fixed and uncommented or removed
- //LOG("dmadac_transfer - %d samples, %d effective, %d in buffer\n", total_frames, int(total_frames * double(DEFAULT_SAMPLE_RATE) / dmadac[first_channel].frequency), dmadac[first_channel].curinpos - dmadac[first_channel].curoutpos);
-}
-
-void dmadac_sound_device::transfer(int channel, offs_t channel_spacing, offs_t frame_spacing, offs_t total_frames, stream_buffer::sample_t *data)
-{
- int j;
-
- /* loop over all channels and accumulate the data */
- if (m_enabled)
- {
- int maxin = (m_bufout + BUFFER_SIZE - 1) % BUFFER_SIZE;
- stream_buffer::sample_t *src = data + channel * channel_spacing;
- int curin = m_bufin;
-
- /* copy the data */
- for (j = 0; j < total_frames && curin != maxin; j++)
- {
- m_buffer[curin] = *src;
- curin = (curin + 1) % BUFFER_SIZE;
- src += frame_spacing;
- }
- m_bufin = curin;
-
- /* log overruns */
- if (j != total_frames)
- logerror("dmadac_transfer: buffer overrun (short %d frames)\n", total_frames - j);
- }
-
- // FIXME: this line has rotted and can no longer compile - it should be fixed and uncommented or removed
- //LOG("dmadac_transfer - %d samples, %d effective, %d in buffer\n", total_frames, int(total_frames * double(DEFAULT_SAMPLE_RATE) / dmadac[first_channel].frequency), dmadac[first_channel].curinpos - dmadac[first_channel].curoutpos);
-}
-
-
/*************************************
*
@@ -226,8 +170,7 @@ dmadac_sound_device::dmadac_sound_device(const machine_config &mconfig, const ch
m_bufin(0),
m_bufout(0),
m_volume(0),
- m_enabled(0),
- m_frequency(0)
+ m_enabled(0)
{
}
diff --git a/src/devices/sound/dmadac.h b/src/devices/sound/dmadac.h
index eb73d338eb9..6cbe8312231 100644
--- a/src/devices/sound/dmadac.h
+++ b/src/devices/sound/dmadac.h
@@ -18,9 +18,35 @@ class dmadac_sound_device : public device_t, public device_sound_interface
public:
dmadac_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+ void initialize_state();
void flush();
- void transfer(int channel, offs_t channel_spacing, offs_t frame_spacing, offs_t total_frames, int16_t *data);
- void transfer(int channel, offs_t channel_spacing, offs_t frame_spacing, offs_t total_frames, stream_buffer::sample_t *data);
+
+ template <typename T> void transfer(int channel, offs_t channel_spacing, offs_t frame_spacing, offs_t total_frames, T* data) {
+ int j;
+
+ constexpr stream_buffer::sample_t sample_scale = 1.0 / double(std::numeric_limits<T>::max());
+
+ if (m_enabled)
+ {
+ int maxin = (m_bufout + BUFFER_SIZE - 1) % BUFFER_SIZE;
+ T* src = data + channel * channel_spacing;
+ int curin = m_bufin;
+
+ /* copy the data */
+ for (j = 0; j < total_frames && curin != maxin; j++)
+ {
+ m_buffer[curin] = stream_buffer::sample_t(*src) * sample_scale;
+ curin = (curin + 1) % BUFFER_SIZE;
+ src += frame_spacing;
+ }
+ m_bufin = curin;
+
+ /* log overruns */
+ if (j != total_frames)
+ logerror("dmadac_transfer: buffer overrun (short %d frames)\n", total_frames - j);
+ }
+ }
+
void enable(uint8_t enable);
void set_frequency(double frequency);
void set_volume(uint16_t volume);
@@ -43,7 +69,8 @@ private:
/* per-channel parameters */
stream_buffer::sample_t m_volume;
uint8_t m_enabled;
- double m_frequency;
+
+ static constexpr int BUFFER_SIZE = 32768;
};
DECLARE_DEVICE_TYPE(DMADAC, dmadac_sound_device)
diff --git a/src/devices/sound/es5503.cpp b/src/devices/sound/es5503.cpp
index adf30ec9a67..a318b30f7b9 100644
--- a/src/devices/sound/es5503.cpp
+++ b/src/devices/sound/es5503.cpp
@@ -230,12 +230,11 @@ void es5503_device::device_start()
save_pointer(STRUCT_MEMBER(oscillators, accumulator), 32);
save_pointer(STRUCT_MEMBER(oscillators, irqpend), 32);
+ oscsenabled = 1;
output_rate = (clock() / 8) / (2 + oscsenabled);
m_stream = stream_alloc(0, output_channels, output_rate);
m_timer = timer_alloc(0, nullptr);
- attotime update_rate = output_rate ? attotime::from_hz(output_rate) : attotime::never;
- m_timer->adjust(update_rate, 0, update_rate);
}
void es5503_device::device_clock_changed()
@@ -268,10 +267,9 @@ void es5503_device::device_reset()
}
oscsenabled = 1;
+ notify_clock_changed();
m_channel_strobe = 0;
-
- output_rate = (clock()/8)/34; // (input clock / 8) / # of oscs. enabled + 2
}
u8 es5503_device::read(offs_t offset)
@@ -429,18 +427,9 @@ void es5503_device::write(offs_t offset, u8 data)
break;
case 0xe1: // oscillator enable
- {
oscsenabled = (data>>1) & 0x1f;
-
- output_rate = (clock()/8)/(2+oscsenabled);
- m_stream->set_sample_rate(output_rate);
-
- m_mix_buffer.resize((output_rate/50)*8);
-
- attotime update_rate = output_rate ? attotime::from_hz(output_rate) : attotime::never;
- m_timer->adjust(update_rate, 0, update_rate);
+ notify_clock_changed();
break;
- }
case 0xe2: // A/D converter
break;
diff --git a/src/devices/sound/gaelco.h b/src/devices/sound/gaelco.h
index 76a77c0bb40..2d0180e290f 100644
--- a/src/devices/sound/gaelco.h
+++ b/src/devices/sound/gaelco.h
@@ -7,14 +7,13 @@
#include "dirom.h"
+
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> gaelco_gae1_device
-#include "dirom.h"
-
class gaelco_gae1_device : public device_t,
public device_sound_interface,
public device_rom_interface<27> // Unknown address bits
diff --git a/src/devices/sound/huc6230.cpp b/src/devices/sound/huc6230.cpp
index cbf09cb9a9b..dda44676615 100644
--- a/src/devices/sound/huc6230.cpp
+++ b/src/devices/sound/huc6230.cpp
@@ -18,8 +18,6 @@
#include "emu.h"
#include "huc6230.h"
-constexpr int clamp(int val, int min, int max) { return std::min(max, std::max(min, val)); }
-
void huc6230_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs)
{
@@ -35,8 +33,8 @@ void huc6230_device::sound_stream_update(sound_stream &stream, std::vector<read_
if (!channel->m_playing)
continue;
- samp0 = clamp(samp0 + ((channel->m_output * channel->m_lvol) >> 3), -32768, 32767);
- samp1 = clamp(samp1 + ((channel->m_output * channel->m_rvol) >> 3), -32768, 32767);
+ samp0 = std::clamp(samp0 + ((channel->m_output * channel->m_lvol) >> 3), -32768, 32767);
+ samp1 = std::clamp(samp1 + ((channel->m_output * channel->m_rvol) >> 3), -32768, 32767);
}
outputs[0].put_int(i, samp0, 32768);
diff --git a/src/devices/sound/ics2115.cpp b/src/devices/sound/ics2115.cpp
index 928c3f2a8fc..16377429d11 100644
--- a/src/devices/sound/ics2115.cpp
+++ b/src/devices/sound/ics2115.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Alex Marshall,nimitz,austere
+// copyright-holders:Alex Marshall, nimitz, austere
/*
ICS2115 by Raiden II team (c) 2010
members: austere, nimitz, Alex Marshal
@@ -9,26 +9,24 @@
Use tab size = 4 for your viewing pleasure.
TODO:
- - Implement Panning, Chip has support stereo
- - Verify BYTE/ROMEN pin behaviors
+ - Verify BYTE/ROMEN pin behavior
- DRAM, DMA, MIDI interface is unimplemented
- Verify interrupt, envelope, timer period
- Verify unemulated registers
- Changelog:
-
- 25th july 2020 [cam900]:
- - Improve envelope behavior, Improve debugging registers, Fix ramping
*/
#include "emu.h"
#include "ics2115.h"
+
#include <algorithm>
#include <cmath>
+
//#define ICS2115_DEBUG
//#define ICS2115_ISOLATE 6
+
// device type definition
DEFINE_DEVICE_TYPE(ICS2115, ics2115_device, "ics2115", "ICS2115 WaveFront Synthesizer")
@@ -85,13 +83,20 @@ void ics2115_device::device_start()
const u16 lut_initial = 33 << 2; //shift up 2-bits for 16-bit range.
for (int i = 0; i < 8; i++)
lut[i] = (lut_initial << i) - lut_initial;
+
+ //pan law level
+ //log2(256*128) = 15 for -3db + 1 must be confirmed by real hardware owners
+ constexpr int PAN_LEVEL = 16;
+
for (int i = 0; i < 256; i++)
{
u8 exponent = (~i >> 4) & 0x07;
u8 mantissa = ~i & 0x0f;
s16 value = lut[exponent] + (mantissa << (exponent + 3));
m_ulaw[i] = (i & 0x80) ? -value : value;
+ m_panlaw[i] = PAN_LEVEL - (31 - count_leading_zeros_32(i)); //m_panlaw[i] = PAN_LEVEL - log2(i)
}
+ m_panlaw[0] = 0xfff; //all bits to one when no pan
save_item(NAME(m_timer[0].period));
save_item(NAME(m_timer[0].scale));
@@ -201,9 +206,33 @@ device_memory_interface::space_config_vector ics2115_device::memory_space_config
}
-//TODO: improve using next-state logic from column 126 of patent 5809466
+/*
+ Using next-state logic from column 126 of patent 5809466.
+ VOL(L) = vol.acc
+ VINC = vol.inc
+ DIR = invert
+ BC = boundary cross (start or end )
+ BLEN = bi directional loop enable
+ LEN loop enable
+ UVOL LEN BLEN DIR BC Next VOL(L)
+ 0 x x x x VOL(L) // no change no vol envelope
+ 1 x x 0 0 VOL(L) + VINC // forward dir no bc
+ 1 x x 1 0 VOL(L) - VINC // invert no bc
+ 1 0 x x 1 VOL(L) // no env len no vol envelope
+ ----------------------------------------------------------------------------
+ 1 1 0 0 1 start - ( end - (VOL(L) + VINC) )
+ 1 1 0 1 1 end + ( (VOL(L) - VINC) - start)
+ 1 1 1 0 1 end + (end - (VOL(L) + VINC) ) // here
+ 1 1 1 1 1 start - ( (VOL(L) - VINC)- start)
+*/
int ics2115_device::ics2115_voice::update_volume_envelope()
{
+
+ // test for boundary cross
+ bool bc = false;
+ if (vol.acc >= vol.end || vol.acc <= vol.end)
+ bc = true;
+
int ret = 0;
if (vol_ctrl.bitflags.done || vol_ctrl.bitflags.stop)
return ret;
@@ -233,13 +262,23 @@ int ics2115_device::ics2115_voice::update_volume_envelope()
if (vol_ctrl.bitflags.loop)
{
- if (vol_ctrl.bitflags.loop_bidir)
- vol_ctrl.bitflags.invert = !vol_ctrl.bitflags.invert;
-
- if (vol_ctrl.bitflags.invert)
- vol.acc = vol.end + vol.left;
- else
- vol.acc = vol.start - vol.left;
+ if (bc)
+ {
+ if (!vol_ctrl.bitflags.loop_bidir)
+ {
+ if (!vol_ctrl.bitflags.invert)
+ vol.acc = vol.start - (vol.end - (vol.acc + vol.incr)); // uvol = 1* len = 1* blen = 0 dir = 0 bc = 1* start - ( end - (VOL(L) + VINC) )
+ else
+ vol.acc = vol.end + ((vol.acc - vol.incr) - vol.start); // 1 1 blen = 0 dir = 1 1 end + ( (VOL(L) - VINC) - start)
+ }
+ else
+ {
+ if (!vol_ctrl.bitflags.invert)
+ vol.acc = vol.end + (vol.end - (vol.acc + vol.incr)); // 1 1 blen = 1 dir = 0 1 end + (end - (VOL(L) + VINC) )
+ else
+ vol.acc = vol.start - ((vol.acc - vol.incr) - vol.start); // 1 1 beln = 1 dir = 1 1 start - ( (VOL(L) - VINC)- start)
+ }
+ }
}
else
vol_ctrl.bitflags.done = true;
@@ -393,10 +432,13 @@ int ics2115_device::fill_output(ics2115_voice& voice, std::vector<write_stream_v
for (int i = 0; i < outputs[0].samples(); i++)
{
- const u32 volacc = (voice.vol.acc >> 10) & 0xffff;
- const u32 volume = (m_volume[volacc >> 4] * voice.state.ramp) >> 6;
- const u16 vleft = volume; //* (255 - voice.vol.pan) / 0x80];
- const u16 vright = volume; //* (voice.vol.pan + 1) / 0x80];
+ constexpr int RAMP_SHIFT = 6;
+ const u32 volacc = (voice.vol.acc >> 14) & 0xfff;
+ const u16 vlefti = volacc - m_panlaw[255 - voice.vol.pan]; // left index from acc - pan law
+ const u16 vrighti = volacc - m_panlaw[voice.vol.pan]; // right index from acc - pan law
+ //check negative values so no cracks, is it a hardware feature ?
+ const u16 vleft = vlefti > 0 ? (m_volume[vlefti] * voice.state.ramp >> RAMP_SHIFT) : 0;
+ const u16 vright = vrighti > 0 ? (m_volume[vrighti] * voice.state.ramp >> RAMP_SHIFT) : 0;
//From GUS doc:
//In general, it is necessary to remember that all voices are being summed in to the
diff --git a/src/devices/sound/ics2115.h b/src/devices/sound/ics2115.h
index 5dd18fcf4ed..269069ff387 100644
--- a/src/devices/sound/ics2115.h
+++ b/src/devices/sound/ics2115.h
@@ -132,6 +132,7 @@ private:
s16 m_ulaw[256];
u16 m_volume[4096];
+ u16 m_panlaw[256];
static const int volume_bits = 15;
ics2115_voice m_voice[32];
diff --git a/src/devices/sound/ks0164.cpp b/src/devices/sound/ks0164.cpp
index bd5e29e06c3..540a2c75099 100644
--- a/src/devices/sound/ks0164.cpp
+++ b/src/devices/sound/ks0164.cpp
@@ -421,7 +421,7 @@ u16 ks0164_device::uncomp_8_16(u8 value)
s16 o = (0x10 | (value & 0xf)) << 10;
o = o >> xp;
if(value & 0x10)
- o = -o;
+ o = -o;
return o;
}
diff --git a/src/devices/sound/okim6295.cpp b/src/devices/sound/okim6295.cpp
index a6acbe12e9b..4d304ef1721 100644
--- a/src/devices/sound/okim6295.cpp
+++ b/src/devices/sound/okim6295.cpp
@@ -183,6 +183,9 @@ void okim6295_device::sound_stream_update(sound_stream &stream, std::vector<read
// iterate over voices and accumulate sample data
for (auto & elem : m_voice)
elem.generate_adpcm(*this, outputs[0]);
+
+ for (int i = 0; i < outputs[0].samples(); i++)
+ outputs[0].put(i, std::clamp(outputs[0].getraw(i), -1.0f, 1.0f));
}
diff --git a/src/devices/sound/okim6376.cpp b/src/devices/sound/okim6376.cpp
index d7cd143e003..997b3e8b13f 100644
--- a/src/devices/sound/okim6376.cpp
+++ b/src/devices/sound/okim6376.cpp
@@ -615,4 +615,7 @@ void okim6376_device::sound_stream_update(sound_stream &stream, std::vector<read
sampindex += samples;
}
}
+
+ for (int i = 0; i < outputs[0].samples(); i++)
+ outputs[0].put(i, std::clamp(outputs[0].getraw(i), -1.0f, 1.0f));
}
diff --git a/src/devices/sound/okim9810.cpp b/src/devices/sound/okim9810.cpp
index 21e2624cd80..f7a9f6d6f09 100644
--- a/src/devices/sound/okim9810.cpp
+++ b/src/devices/sound/okim9810.cpp
@@ -223,6 +223,12 @@ void okim9810_device::sound_stream_update(sound_stream &stream, std::vector<read
// iterate over voices and accumulate sample data
for (auto & elem : m_voice)
elem.generate_audio(*this, outputs, m_global_volume, m_filter_type);
+
+ for (int i = 0; i < outputs[0].samples(); i++)
+ {
+ outputs[0].put(i, std::clamp(outputs[0].getraw(i), -1.0f, 1.0f));
+ outputs[1].put(i, std::clamp(outputs[1].getraw(i), -1.0f, 1.0f));
+ }
}
diff --git a/src/devices/sound/qsoundhle.cpp b/src/devices/sound/qsoundhle.cpp
index 913d22baed1..a9595a4b00d 100644
--- a/src/devices/sound/qsoundhle.cpp
+++ b/src/devices/sound/qsoundhle.cpp
@@ -416,7 +416,7 @@ int16_t qsound_hle_device::qsound_voice::update(qsound_hle_device &dsp, int32_t
if ((new_phase >> 12) >= m_end_addr)
new_phase -= (m_loop_len << 12);
- new_phase = std::min<int32_t>(std::max<int32_t>(new_phase, -0x8000000), 0x7FFFFFF);
+ new_phase = std::clamp<int32_t>(new_phase, -0x8000000, 0x7FFFFFF);
m_addr = new_phase >> 12;
m_phase = (new_phase << 4)&0xffff;
@@ -465,10 +465,10 @@ int16_t qsound_hle_device::qsound_adpcm::update(qsound_hle_device &dsp, int16_t
if (step <= 0)
delta = -delta;
delta += curr_sample;
- delta = std::min<int32_t>(std::max<int32_t>(delta, -32768), 32767);
+ delta = std::clamp<int32_t>(delta, -32768, 32767);
m_step_size = (dsp.read_dsp_rom(DATA_ADPCM_TAB + 8 + step) * m_step_size) >> 6;
- m_step_size = std::min<int16_t>(std::max<int16_t>(m_step_size, 1), 2000);
+ m_step_size = std::clamp<int16_t>(m_step_size, 1, 2000);
return (delta * m_cur_vol) >> 16;
}
@@ -504,7 +504,7 @@ void qsound_hle_device::state_normal_update()
else
m_echo.m_length = m_echo.m_end_pos - DELAY_BASE_OFFSET;
- m_echo.m_length = std::min<int16_t>(std::max<int16_t>(m_echo.m_length, 0), 1024);
+ m_echo.m_length = std::clamp<int16_t>(m_echo.m_length, 0, 1024);
// update PCM voices
int32_t echo_input = 0;
@@ -534,8 +534,8 @@ void qsound_hle_device::state_normal_update()
wet -= (m_voice_output[i] * (int16_t)read_dsp_rom(pan_index + PAN_TABLE_WET));
}
// Saturate accumulated voices
- dry = (std::min<int32_t>(std::max<int32_t>(dry, -0x1fffffff), 0x1fffffff)) << 2;
- wet = (std::min<int32_t>(std::max<int32_t>(wet, -0x1fffffff), 0x1fffffff)) << 2;
+ dry = std::clamp<int32_t>(dry, -0x1fffffff, 0x1fffffff) << 2;
+ wet = std::clamp<int32_t>(wet, -0x1fffffff, 0x1fffffff) << 2;
// Apply FIR filter on 'wet' input
wet = m_filter[ch].apply(wet >> 16);
@@ -549,7 +549,7 @@ void qsound_hle_device::state_normal_update()
// DSP round function
output = (output + 0x2000) & ~0x3fff;
- m_out[ch] = (std::min<int32_t>(std::max<int32_t>(output >> 14, -0x7fff), 0x7fff));
+ m_out[ch] = std::clamp<int32_t>(output >> 14, -0x7fff, 0x7fff);
if (m_delay_update)
{
diff --git a/src/devices/sound/rolandpcm.cpp b/src/devices/sound/rolandpcm.cpp
index d3393785f88..41f8f351e38 100644
--- a/src/devices/sound/rolandpcm.cpp
+++ b/src/devices/sound/rolandpcm.cpp
@@ -24,9 +24,6 @@
#include "rolandpcm.h"
-constexpr int clamp16(int16_t val, int16_t min, int16_t max) { return std::min(max, std::max(min, val)); }
-
-
DEFINE_DEVICE_TYPE(MB87419_MB87420, mb87419_mb87420_device, "mb87419_mb87420", "Roland MB87419/MB87420 PCM")
mb87419_mb87420_device::mb87419_mb87420_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
@@ -307,7 +304,7 @@ void mb87419_mb87420_device::sound_stream_update(sound_stream &stream, std::vect
chn.smpl_nxt += decode_sample((int8_t)read_byte(addr)); // This was verified to be independent from play_dir.
// until the decoding is fixed, we prevent overflow bugs (due to DC offsets when looping) this way
- chn.smpl_nxt = clamp16(chn.smpl_nxt, -0x7FF, +0x7FF);
+ chn.smpl_nxt = std::clamp<int16_t>(chn.smpl_nxt, -0x7FF, +0x7FF);
}
bool reachedEnd = false;
diff --git a/src/devices/sound/samples.cpp b/src/devices/sound/samples.cpp
index 5c8d129b799..7663d921475 100644
--- a/src/devices/sound/samples.cpp
+++ b/src/devices/sound/samples.cpp
@@ -605,26 +605,28 @@ bool samples_device::load_samples()
// load the samples
int index = 0;
- for (const char *samplename = iter.first(); samplename != nullptr; index++, samplename = iter.next())
+ for (const char *samplename = iter.first(); samplename; index++, samplename = iter.next())
{
// attempt to open as FLAC first
emu_file file(machine().options().sample_path(), OPEN_FLAG_READ);
- osd_file::error filerr = file.open(util::string_format("%s" PATH_SEPARATOR "%s.flac", basename, samplename));
- if (filerr != osd_file::error::NONE && altbasename != nullptr)
+ std::error_condition filerr = file.open(util::string_format("%s" PATH_SEPARATOR "%s.flac", basename, samplename));
+ if (filerr && altbasename)
filerr = file.open(util::string_format("%s" PATH_SEPARATOR "%s.flac", altbasename, samplename));
// if not, try as WAV
- if (filerr != osd_file::error::NONE)
+ if (filerr)
filerr = file.open(util::string_format("%s" PATH_SEPARATOR "%s.wav", basename, samplename));
- if (filerr != osd_file::error::NONE && altbasename != nullptr)
+ if (filerr && altbasename)
filerr = file.open(util::string_format("%s" PATH_SEPARATOR "%s.wav", altbasename, samplename));
// if opened, read it
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
+ {
read_sample(file, m_sample[index]);
- else if (filerr == osd_file::error::NOT_FOUND)
+ }
+ else
{
- logerror("%s: Sample '%s' NOT FOUND\n", tag(), samplename);
+ logerror("Error opening sample '%s' (%s:%d %s)\n", samplename, filerr.category().name(), filerr.value(), filerr.message());
ok = false;
}
}
diff --git a/src/devices/sound/scsp.cpp b/src/devices/sound/scsp.cpp
index f7df68508eb..5b3c0192ddb 100644
--- a/src/devices/sound/scsp.cpp
+++ b/src/devices/sound/scsp.cpp
@@ -436,13 +436,13 @@ TIMER_CALLBACK_MEMBER(scsp_device::timerC_cb)
int scsp_device::Get_AR(int base, int R)
{
int Rate = base + (R << 1);
- return m_ARTABLE[std::min(63, std::max(0, Rate))];
+ return m_ARTABLE[std::clamp(Rate, 0, 63)];
}
int scsp_device::Get_DR(int base, int R)
{
int Rate = base + (R << 1);
- return m_DRTABLE[std::min(63, std::max(0, Rate))];
+ return m_DRTABLE[std::clamp(Rate, 0, 63)];
}
void scsp_device::Compute_EG(SCSP_SLOT *slot)
diff --git a/src/devices/sound/scsp.h b/src/devices/sound/scsp.h
index 7ff91fdb576..f3d08df9793 100644
--- a/src/devices/sound/scsp.h
+++ b/src/devices/sound/scsp.h
@@ -9,9 +9,11 @@
#pragma once
-#include "dirom.h"
#include "scspdsp.h"
+#include "dirom.h"
+
+
#define SCSP_FM_DELAY 0 // delay in number of slots processed before samples are written to the FM ring buffer
// driver code indicates should be 4, but sounds distorted then
diff --git a/src/devices/sound/scspdsp.cpp b/src/devices/sound/scspdsp.cpp
index 4ed21455110..d34ab084694 100644
--- a/src/devices/sound/scspdsp.cpp
+++ b/src/devices/sound/scspdsp.cpp
@@ -224,9 +224,9 @@ void SCSPDSP::Step()
//Shifter
s32 SHIFTED = 0; //24 bit
if (SHIFT == 0)
- SHIFTED = std::max<s32>(std::min<s32>(ACC, 0x007FFFFF), -0x00800000);
+ SHIFTED = std::clamp<s32>(ACC, -0x00800000, 0x007FFFFF);
else if (SHIFT == 1)
- SHIFTED = std::max<s32>(std::min<s32>(ACC * 2, 0x007FFFFF), -0x00800000);
+ SHIFTED = std::clamp<s32>(ACC * 2, -0x00800000, 0x007FFFFF);
else if (SHIFT == 2)
{
SHIFTED = ACC * 2;
diff --git a/src/devices/sound/spu.cpp b/src/devices/sound/spu.cpp
index 6cfba4fc5bc..7cc987a8067 100644
--- a/src/devices/sound/spu.cpp
+++ b/src/devices/sound/spu.cpp
@@ -2207,7 +2207,7 @@ bool spu_device::update_envelope(const int v)
break;
case 4: // release
- voice[v].env_level=(std::min)(1.0f,(std::max)(0.0f,voice[v].env_level));
+ voice[v].env_level=std::clamp(voice[v].env_level,0.0f,1.0f);
voice[v].env_delta=voice[v].env_rr;
if (voice[v].env_rr == -0.0f) // 0.0 release means infinite time
{
diff --git a/src/devices/sound/zsg2.cpp b/src/devices/sound/zsg2.cpp
index 2fa01cfb3a5..518d765ccc3 100644
--- a/src/devices/sound/zsg2.cpp
+++ b/src/devices/sound/zsg2.cpp
@@ -275,7 +275,7 @@ void zsg2_device::filter_samples(zchan *ch)
ch->emphasis_filter_state += raw_samples[i]-((ch->emphasis_filter_state+EMPHASIS_ROUNDING)>>EMPHASIS_FILTER_SHIFT);
int32_t sample = ch->emphasis_filter_state >> EMPHASIS_OUTPUT_SHIFT;
- ch->samples[i+1] = std::min<int32_t>(std::max<int32_t>(sample, -32768), 32767);
+ ch->samples[i+1] = std::clamp<int32_t>(sample, -32768, 32767);
}
}
diff --git a/src/devices/video/hd44780.cpp b/src/devices/video/hd44780.cpp
index f2e0d90485f..6b00a9a7328 100644
--- a/src/devices/video/hd44780.cpp
+++ b/src/devices/video/hd44780.cpp
@@ -70,6 +70,7 @@ hd44780_device::hd44780_device(const machine_config &mconfig, device_type type,
, m_rw_input(0)
, m_db_input(0)
, m_enabled(false)
+ , m_function_set_at_any_time(false)
{
}
@@ -487,7 +488,7 @@ void hd44780_device::control_write(u8 data)
else if (BIT(m_ir, 5))
{
// function set
- if (!m_first_cmd && m_data_len == (BIT(m_ir, 4) ? 8 : 4) && (m_char_size != (BIT(m_ir, 2) ? 10 : 8) || m_num_line != (BIT(m_ir, 3) + 1)))
+ if (!m_function_set_at_any_time && !m_first_cmd && m_data_len == (BIT(m_ir, 4) ? 8 : 4) && (m_char_size != (BIT(m_ir, 2) ? 10 : 8) || m_num_line != (BIT(m_ir, 3) + 1)))
{
logerror("HD44780: function set cannot be executed after other instructions unless the interface data length is changed\n");
return;
diff --git a/src/devices/video/hd44780.h b/src/devices/video/hd44780.h
index 3062bd1aa70..e77e1d7b3c4 100644
--- a/src/devices/video/hd44780.h
+++ b/src/devices/video/hd44780.h
@@ -33,6 +33,7 @@ public:
void set_lcd_size(int lines, int chars) { m_lines = lines; m_chars = chars; }
template <typename... T> void set_pixel_update_cb(T &&... args) { m_pixel_update_cb.set(std::forward<T>(args)...); }
void set_busy_factor(float f) { m_busy_factor = f; } // it's a workaround for inaccurate busy flag emulation
+ void set_function_set_at_any_time(bool v = true) { m_function_set_at_any_time = v; }
// device interface
void write(offs_t offset, u8 data);
@@ -135,6 +136,7 @@ private:
bool m_nibble;
int m_charset_type;
u8 m_render_buf[80 * 16];
+ bool m_function_set_at_any_time;
enum { DDRAM, CGRAM };
};
diff --git a/src/devices/video/hd61830.cpp b/src/devices/video/hd61830.cpp
index 24b4400344d..277b772211b 100644
--- a/src/devices/video/hd61830.cpp
+++ b/src/devices/video/hd61830.cpp
@@ -21,7 +21,6 @@
//**************************************************************************
DEFINE_DEVICE_TYPE(HD61830, hd61830_device, "hd61830", "Hitachi HD61830B LCD Controller")
-decltype(HD61830) HD61830B = HD61830;
// default address map
diff --git a/src/devices/video/hd61830.h b/src/devices/video/hd61830.h
index 880a4af18a8..9bbbb4b4ab6 100644
--- a/src/devices/video/hd61830.h
+++ b/src/devices/video/hd61830.h
@@ -108,6 +108,6 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(HD61830, hd61830_device)
-DECLARE_DEVICE_TYPE(HD61830B, hd61830_device)
+static auto &HD61830B = HD61830;
#endif // MAME_VIDEO_HD61830_H
diff --git a/src/devices/video/i8244.h b/src/devices/video/i8244.h
index c10bef25c83..0cf0d06debe 100644
--- a/src/devices/video/i8244.h
+++ b/src/devices/video/i8244.h
@@ -35,6 +35,9 @@
*/
+DECLARE_DEVICE_TYPE(I8244, i8244_device)
+DECLARE_DEVICE_TYPE(I8245, i8245_device)
+
class i8244_device : public device_t
, public device_sound_interface
@@ -172,19 +175,17 @@ protected:
};
-class i8245_device : public i8244_device
+class i8245_device : public i8244_device
{
public:
// construction/destruction
i8245_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ static auto parent_rom_device_type() { return &I8244; }
+
protected:
virtual void set_default_params() override;
};
-// device type definition
-DECLARE_DEVICE_TYPE(I8244, i8244_device)
-DECLARE_DEVICE_TYPE(I8245, i8245_device)
-
#endif // MAME_VIDEO_I8244_H
diff --git a/src/devices/video/poly.h b/src/devices/video/poly.h
index 6d1f10e7efd..e09fb17331a 100644
--- a/src/devices/video/poly.h
+++ b/src/devices/video/poly.h
@@ -50,19 +50,32 @@
// CONSTANTS
//**************************************************************************
-static constexpr u8 POLY_FLAG_INCLUDE_BOTTOM_EDGE = 0x01;
-static constexpr u8 POLY_FLAG_INCLUDE_RIGHT_EDGE = 0x02;
-static constexpr u8 POLY_FLAG_NO_WORK_QUEUE = 0x04;
-static constexpr u8 POLY_FLAG_NO_CLIPPING = 0x08;
+static constexpr u8 POLY_FLAG_NO_WORK_QUEUE = 0x01;
+static constexpr u8 POLY_FLAG_NO_CLIPPING = 0x02;
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
+// base class for poly_array
+class poly_array_base
+{
+public:
+ // construction
+ poly_array_base() { }
+
+ // destruction
+ virtual ~poly_array_base() { }
+
+ // reset
+ virtual void reset() = 0;
+};
+
+
// class for managing an array of items
template<class ArrayType, int TrackingCount>
-class poly_array
+class poly_array : public poly_array_base
{
public:
// this is really architecture-specific, but 64 is a reasonable
@@ -95,7 +108,7 @@ public:
}
// destruction
- ~poly_array() { m_base = nullptr; }
+ virtual ~poly_array() { m_base = nullptr; }
// getters
u32 count() const { return m_next; }
@@ -106,6 +119,7 @@ public:
// return an item by index
ArrayType &byindex(u32 index)
{
+ assert(index < m_next);
if (index < m_allocated)
return *item_ptr(index);
assert(m_chain);
@@ -115,6 +129,8 @@ public:
// return a contiguous chunk of items
ArrayType *contiguous(u32 index, u32 count, u32 &chunk)
{
+ assert(index < m_next);
+ assert(index + count <= m_next);
if (index < m_allocated)
{
chunk = std::min(count, m_allocated - index);
@@ -135,7 +151,7 @@ public:
}
// operations
- void reset()
+ virtual void reset() override
{
m_next = 0;
@@ -151,7 +167,7 @@ public:
}
// allocate a return a new item
- ArrayType &next(int index = 0)
+ ArrayType &next(int tracking_index = 0)
{
// track the maximum
if (m_next > m_max)
@@ -174,24 +190,25 @@ public:
m_next++;
if (TrackingCount > 0)
{
- assert(index < TrackingCount);
- m_last[index] = item;
+ assert(tracking_index < TrackingCount);
+ m_last[tracking_index] = item;
}
return *item;
}
// return the last
- ArrayType &last(int index = 0) const
+ ArrayType &last(int tracking_index = 0) const
{
- assert(index < TrackingCount);
- assert(m_last[index] != nullptr);
- return *m_last[index];
+ assert(tracking_index < TrackingCount);
+ assert(m_last[tracking_index] != nullptr);
+ return *m_last[tracking_index];
}
private:
// internal helper to make size pointers
ArrayType *item_ptr(u32 index)
{
+ assert(index < m_allocated);
return reinterpret_cast<ArrayType *>(m_base + index * ITEM_SIZE);
}
@@ -219,13 +236,13 @@ private:
// repopulate items
void repopulate()
{
- for (int index = 0; index < TrackingCount; index++)
- if (m_last[index] != nullptr)
+ for (int tracking_index = 0; tracking_index < TrackingCount; tracking_index++)
+ if (m_last[tracking_index] != nullptr)
{
- if (m_last[index] == item_ptr(m_next))
+ if (m_last[tracking_index] == item_ptr(m_next))
m_next++;
else
- next(index) = *m_last[index];
+ next(tracking_index) = *m_last[tracking_index];
}
}
@@ -252,7 +269,7 @@ public:
vertex_t(BaseType _x, BaseType _y) { x = _x; y = _y; }
BaseType x, y; // X, Y coordinates
- std::array<BaseType, MaxParams> p; // interpolated parameters
+ std::array<BaseType, MaxParams> p; // iterated parameters
};
// a single extent describes a span and a list of parameter extents
@@ -269,21 +286,23 @@ public:
};
// delegate type for scanline callbacks
- typedef delegate<void (int32_t, const extent_t &, const ObjectType &, int)> render_delegate;
+ using render_delegate = delegate<void (int32_t, extent_t const &, ObjectType const &, int)>;
+
+ // poly_array of object data
+ using objectdata_array = poly_array<ObjectType, 1>;
// construction/destruction
poly_manager(running_machine &machine);
virtual ~poly_manager();
- // getters
- uint32_t triangles_drawn() const { return m_triangles; }
-
// synchronization
- void wait(const char *debug_reason = "general");
+ void wait(char const *debug_reason = "general");
+
+ // return a reference to our ObjectType poly_array
+ objectdata_array &object_data() { return m_object; }
- // object data allocators
- ObjectType &object_data_alloc();
- ObjectType &object_data_last() const { return m_object.last(); }
+ // register a poly_array to be reset after a wait
+ void register_poly_array(poly_array_base &array) { m_arrays.push_back(&array); }
// tiles
template<int ParamCount>
@@ -296,19 +315,18 @@ public:
uint32_t render_triangle_fan(rectangle const &cliprect, render_delegate callback, int numverts, vertex_t const *v);
template<int ParamCount>
uint32_t render_triangle_strip(rectangle const &cliprect, render_delegate callback, int numverts, vertex_t const *v);
- uint32_t render_triangle_custom(const rectangle &cliprect, render_delegate callback, int startscanline, int numscanlines, const extent_t *extents);
// polygons
template<int NumVerts, int ParamCount>
- uint32_t render_polygon(const rectangle &cliprect, render_delegate callback, const vertex_t *v);
+ uint32_t render_polygon(rectangle const &cliprect, render_delegate callback, vertex_t const *v);
- // public helpers
+ // direct custom extents
template<int ParamCount>
- int zclip_if_less(int numverts, const vertex_t *v, vertex_t *outv, BaseType clipval);
+ uint32_t render_extents(rectangle const &cliprect, render_delegate callback, int startscanline, int numscanlines, extent_t const *extents);
-protected:
- // optional overrides
- virtual void reset_after_wait() { }
+ // public helpers
+ template<int ParamCount>
+ int zclip_if_less(int numverts, vertex_t const *v, vertex_t *outv, BaseType clipval);
private:
// number of profiling ticks before we consider a wait "long"
@@ -317,8 +335,8 @@ private:
static constexpr int SCANLINES_PER_BUCKET = 32;
static constexpr int TOTAL_BUCKETS = (512 / SCANLINES_PER_BUCKET);
- // polygon_info describes a single polygon, which includes the poly_params
- struct polygon_info
+ // primitive_info describes a single primitive
+ struct primitive_info
{
poly_manager * m_owner; // pointer back to the poly manager
ObjectType * m_object; // object data pointer
@@ -335,15 +353,14 @@ private:
}
std::atomic<uint32_t> count_next; // number of scanlines and index of next item to process
- polygon_info * polygon; // pointer to polygon
+ primitive_info * primitive; // pointer to primitive
int32_t scanline; // starting scanline
uint32_t previtem; // index of previous item in the same bucket
extent_t extent[SCANLINES_PER_BUCKET]; // array of scanline extents
};
// internal array types
- using polygon_array = poly_array<polygon_info, 0>;
- using objectdata_array = poly_array<ObjectType, 1>;
+ using primitive_array = poly_array<primitive_info, 0>;
using unit_array = poly_array<work_unit, 0>;
// round in a cross-platform consistent manner
@@ -356,14 +373,14 @@ private:
}
// internal helpers
- polygon_info &polygon_alloc(int minx, int maxx, int miny, int maxy, render_delegate callback)
+ primitive_info &primitive_alloc(int minx, int maxx, int miny, int maxy, render_delegate callback)
{
// return and initialize the next one
- polygon_info &polygon = m_polygon.next();
- polygon.m_owner = this;
- polygon.m_object = &object_data_last();
- polygon.m_callback = callback;
- return polygon;
+ primitive_info &primitive = m_primitive.next();
+ primitive.m_owner = this;
+ primitive.m_object = &m_object.last();
+ primitive.m_callback = callback;
+ return primitive;
}
// enqueue work items in contiguous chunks
@@ -390,9 +407,10 @@ private:
osd_work_queue *m_queue; // work queue
// arrays
- polygon_array m_polygon; // array of polygons
+ primitive_array m_primitive; // array of primitives
objectdata_array m_object; // array of object data
unit_array m_unit; // array of work units
+ std::vector<poly_array_base *> m_arrays; // list of arrays we are managing
// buckets
uint32_t m_unit_bucket[TOTAL_BUCKETS]; // buckets for tracking unit usage
@@ -400,7 +418,7 @@ private:
// statistics
uint32_t m_tiles; // number of tiles queued
uint32_t m_triangles; // number of triangles queued
- uint32_t m_quads; // number of quads queued
+ uint32_t m_polygons; // number of polygons queued
uint64_t m_pixels; // number of pixels rendered
#if KEEP_POLY_STATISTICS
uint32_t m_conflicts[WORK_MAX_THREADS] = { 0 }; // number of conflicts found, per thread
@@ -448,15 +466,21 @@ poly_manager<BaseType, ObjectType, MaxParams, Flags>::poly_manager(running_machi
m_queue(nullptr),
m_tiles(0),
m_triangles(0),
- m_quads(0),
+ m_polygons(0),
m_pixels(0)
{
// create the work queue
if (!(Flags & POLY_FLAG_NO_WORK_QUEUE))
m_queue = osd_work_queue_alloc(WORK_QUEUE_FLAG_MULTI | WORK_QUEUE_FLAG_HIGH_FREQ);
+ // initialize the buckets to empty
std::fill_n(&m_unit_bucket[0], std::size(m_unit_bucket), 0xffffffff);
+ // register our arrays for reset
+ register_poly_array(m_primitive);
+ register_poly_array(m_object);
+ register_poly_array(m_unit);
+
// request a pre-save callback for synchronization
machine.save().register_presave(save_prepost_delegate(FUNC(poly_manager::presave), this));
}
@@ -504,7 +528,7 @@ poly_manager<BaseType, ObjectType, MaxParams, Flags>::~poly_manager()
// output global stats
osd_printf_info("Total triangles = %d\n", m_triangles);
- osd_printf_info("Total quads = %d\n", m_quads);
+ osd_printf_info("Total polygons = %d\n", m_polygons);
if (m_pixels > 1000000000)
osd_printf_info("Total pixels = %d%09d\n", uint32_t(m_pixels / 1000000000), uint32_t(m_pixels % 1000000000));
else
@@ -512,7 +536,7 @@ poly_manager<BaseType, ObjectType, MaxParams, Flags>::~poly_manager()
osd_printf_info("Conflicts: %d resolved, %d total\n", resolved, conflicts);
osd_printf_info("Units: %5d used, %5d allocated, %4d bytes each, %7d total\n", m_unit.max(), m_unit.allocated(), int(m_unit.itemsize()), int(m_unit.allocated() * m_unit.itemsize()));
- osd_printf_info("Polygons: %5d used, %5d allocated, %4d bytes each, %7d total\n", m_polygon.max(), m_polygon.allocated(), int(m_polygon.itemsize()), int(m_polygon.allocated() * m_polygon.itemsize()));
+ osd_printf_info("Primitives: %5d used, %5d allocated, %4d bytes each, %7d total\n", m_primitive.max(), m_primitive.allocated(), int(m_primitive.itemsize()), int(m_primitive.allocated() * m_primitive.itemsize()));
osd_printf_info("Object data: %5d used, %5d allocated, %4d bytes each, %7d total\n", m_object.max(), m_object.allocated(), int(m_object.itemsize()), int(m_object.allocated() * m_object.itemsize()));
}
#endif
@@ -564,17 +588,17 @@ void *poly_manager<BaseType, ObjectType, MaxParams, Flags>::work_item_callback(v
while (1)
{
work_unit &unit = *(work_unit *)param;
- polygon_info &polygon = *unit.polygon;
+ primitive_info &primitive = *unit.primitive;
int count = unit.count_next & 0xff;
uint32_t orig_count_next;
// if our previous item isn't done yet, enqueue this item to the end and proceed
if (unit.previtem != 0xffffffff)
{
- work_unit &prevunit = polygon.m_owner->m_unit.byindex(unit.previtem);
+ work_unit &prevunit = primitive.m_owner->m_unit.byindex(unit.previtem);
if (prevunit.count_next != 0)
{
- uint32_t unitnum = polygon.m_owner->m_unit.indexof(unit);
+ uint32_t unitnum = primitive.m_owner->m_unit.indexof(unit);
uint32_t new_count_next;
// attempt to atomically swap in this new value
@@ -586,9 +610,9 @@ void *poly_manager<BaseType, ObjectType, MaxParams, Flags>::work_item_callback(v
#if KEEP_POLY_STATISTICS
// track resolved conflicts
- polygon.m_owner->m_conflicts[threadid]++;
+ primitive.m_owner->m_conflicts[threadid]++;
if (orig_count_next != 0)
- polygon.m_owner->m_resolved[threadid]++;
+ primitive.m_owner->m_resolved[threadid]++;
#endif
// if we succeeded, skip out early so we can do other work
if (orig_count_next != 0)
@@ -598,7 +622,7 @@ void *poly_manager<BaseType, ObjectType, MaxParams, Flags>::work_item_callback(v
// iterate over extents
for (int curscan = 0; curscan < count; curscan++)
- polygon.m_callback(unit.scanline + curscan, unit.extent[curscan], *polygon.m_object, threadid);
+ primitive.m_callback(unit.scanline + curscan, unit.extent[curscan], *primitive.m_object, threadid);
// set our count to 0 and re-fetch the original count value
do
@@ -610,7 +634,7 @@ void *poly_manager<BaseType, ObjectType, MaxParams, Flags>::work_item_callback(v
orig_count_next >>= 8;
if (orig_count_next == 0)
break;
- param = &polygon.m_owner->m_unit.byindex(orig_count_next);
+ param = &primitive.m_owner->m_unit.byindex(orig_count_next);
}
return nullptr;
}
@@ -621,7 +645,7 @@ void *poly_manager<BaseType, ObjectType, MaxParams, Flags>::work_item_callback(v
//-------------------------------------------------
template<typename BaseType, class ObjectType, int MaxParams, u8 Flags>
-void poly_manager<BaseType, ObjectType, MaxParams, Flags>::wait(const char *debug_reason)
+void poly_manager<BaseType, ObjectType, MaxParams, Flags>::wait(char const *debug_reason)
{
// early out if no units outstanding
if (m_unit.count() == 0)
@@ -645,27 +669,12 @@ void poly_manager<BaseType, ObjectType, MaxParams, Flags>::wait(const char *debu
m_waitmap[debug_reason].update(items, get_profile_ticks() - time);
#endif
- // reset all the poly arrays
- m_polygon.reset();
- m_unit.reset();
- m_object.reset();
-
// clear the buckets
std::fill_n(&m_unit_bucket[0], std::size(m_unit_bucket), 0xffffffff);
- // allow derived classes to do additional cleanup
- reset_after_wait();
-}
-
-
-//-------------------------------------------------
-// object_data_alloc - allocate a new ObjectType
-//-------------------------------------------------
-
-template<typename BaseType, class ObjectType, int MaxParams, u8 Flags>
-ObjectType &poly_manager<BaseType, ObjectType, MaxParams, Flags>::object_data_alloc()
-{
- return m_object.next();
+ // reset all the poly arrays
+ for (auto array : m_arrays)
+ array->reset();
}
@@ -677,8 +686,8 @@ template<typename BaseType, class ObjectType, int MaxParams, u8 Flags>
template<int ParamCount>
uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_tile(rectangle const &cliprect, render_delegate callback, vertex_t const &_v1, vertex_t const &_v2)
{
- const vertex_t *v1 = &_v1;
- const vertex_t *v2 = &_v2;
+ vertex_t const *v1 = &_v1;
+ vertex_t const *v2 = &_v2;
// first sort by Y
if (v2->y < v1->y)
@@ -690,7 +699,7 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_tile(recta
// clip coordinates
int32_t v1yclip = v1y;
- int32_t v2yclip = v2y + ((Flags & POLY_FLAG_INCLUDE_BOTTOM_EDGE) ? 1 : 0);
+ int32_t v2yclip = v2y;
if (!(Flags & POLY_FLAG_NO_CLIPPING))
{
v1yclip = std::max(v1yclip, cliprect.top());
@@ -705,8 +714,8 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_tile(recta
if (minx > maxx)
return 0;
- // allocate and populate a new polygon
- polygon_info &polygon = polygon_alloc(round_coordinate(minx), round_coordinate(maxx), v1yclip, v2yclip, callback);
+ // allocate and populate a new primitive
+ primitive_info &primitive = primitive_alloc(round_coordinate(minx), round_coordinate(maxx), v1yclip, v2yclip, callback);
// compute parameter deltas
std::array<BaseType, ParamCount> param_dpdx;
@@ -730,10 +739,6 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_tile(recta
if (istartx > istopx)
std::swap(istartx, istopx);
- // include the right edge if requested
- if (Flags & POLY_FLAG_INCLUDE_RIGHT_EDGE)
- istopx++;
-
// apply left/right clipping
if (!(Flags & POLY_FLAG_NO_CLIPPING))
{
@@ -757,7 +762,7 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_tile(recta
scaninc = SCANLINES_PER_BUCKET - uint32_t(curscan) % SCANLINES_PER_BUCKET;
// fill in the work unit basics
- unit.polygon = &polygon;
+ unit.primitive = &primitive;
unit.count_next = std::min(v2yclip - curscan, scaninc);
unit.scanline = curscan;
unit.previtem = m_unit_bucket[bucketnum];
@@ -805,9 +810,9 @@ template<typename BaseType, class ObjectType, int MaxParams, u8 Flags>
template<int ParamCount>
uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle(const rectangle &cliprect, render_delegate callback, const vertex_t &_v1, const vertex_t &_v2, const vertex_t &_v3)
{
- const vertex_t *v1 = &_v1;
- const vertex_t *v2 = &_v2;
- const vertex_t *v3 = &_v3;
+ vertex_t const *v1 = &_v1;
+ vertex_t const *v2 = &_v2;
+ vertex_t const *v3 = &_v3;
// first sort by Y
if (v2->y < v1->y)
@@ -825,7 +830,7 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle(c
// clip coordinates
int32_t v1yclip = v1y;
- int32_t v3yclip = v3y + ((Flags & POLY_FLAG_INCLUDE_BOTTOM_EDGE) ? 1 : 0);
+ int32_t v3yclip = v3y;
if (!(Flags & POLY_FLAG_NO_CLIPPING))
{
v1yclip = std::max(v1yclip, cliprect.top());
@@ -838,8 +843,8 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle(c
BaseType minx = std::min(std::min(v1->x, v2->x), v3->x);
BaseType maxx = std::max(std::max(v1->x, v2->x), v3->x);
- // allocate and populate a new polygon
- polygon_info &polygon = polygon_alloc(round_coordinate(minx), round_coordinate(maxx), v1yclip, v3yclip, callback);
+ // allocate and populate a new primitive
+ primitive_info &primitive = primitive_alloc(round_coordinate(minx), round_coordinate(maxx), v1yclip, v3yclip, callback);
// compute the slopes for each portion of the triangle
BaseType dxdy_v1v2 = (v2->y == v1->y) ? BaseType(0.0) : (v2->x - v1->x) / (v2->y - v1->y);
@@ -898,7 +903,7 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle(c
scaninc = SCANLINES_PER_BUCKET - uint32_t(curscan) % SCANLINES_PER_BUCKET;
// fill in the work unit basics
- unit.polygon = &polygon;
+ unit.primitive = &primitive;
unit.count_next = std::min(v3yclip - curscan, scaninc);
unit.scanline = curscan;
unit.previtem = m_unit_bucket[bucketnum];
@@ -924,10 +929,6 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle(c
if (istartx > istopx)
std::swap(istartx, istopx);
- // include the right edge if requested
- if (Flags & POLY_FLAG_INCLUDE_RIGHT_EDGE)
- istopx++;
-
// apply left/right clipping
if (!(Flags & POLY_FLAG_NO_CLIPPING))
{
@@ -970,7 +971,7 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle(c
template<typename BaseType, class ObjectType, int MaxParams, u8 Flags>
template<int ParamCount>
-uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle_fan(const rectangle &cliprect, render_delegate callback, int numverts, const vertex_t *v)
+uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle_fan(rectangle const &cliprect, render_delegate callback, int numverts, vertex_t const *v)
{
// iterate over vertices
uint32_t pixels = 0;
@@ -987,7 +988,7 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle_f
template<typename BaseType, class ObjectType, int MaxParams, u8 Flags>
template<int ParamCount>
-uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle_strip(const rectangle &cliprect, render_delegate callback, int numverts, const vertex_t *v)
+uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle_strip(rectangle const &cliprect, render_delegate callback, int numverts, vertex_t const *v)
{
// iterate over vertices
uint32_t pixels = 0;
@@ -998,12 +999,13 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle_s
//-------------------------------------------------
-// render_triangle_custom - perform a custom
-// render of an object, given specific extents
+// render_extents - perform a custom render of
+// an object, given specific extents
//-------------------------------------------------
template<typename BaseType, class ObjectType, int MaxParams, u8 Flags>
-uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle_custom(const rectangle &cliprect, render_delegate callback, int startscanline, int numscanlines, const extent_t *extents)
+template<int ParamCount>
+uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_extents(rectangle const &cliprect, render_delegate callback, int startscanline, int numscanlines, extent_t const *extents)
{
// clip coordinates
int32_t v1yclip = startscanline;
@@ -1016,8 +1018,8 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle_c
return 0;
}
- // allocate and populate a new polygon
- polygon_info &polygon = polygon_alloc(0, 0, v1yclip, v3yclip, callback);
+ // allocate and populate a new primitive
+ primitive_info &primitive = primitive_alloc(0, 0, v1yclip, v3yclip, callback);
// compute the X extents for each scanline
int32_t pixels = 0;
@@ -1033,7 +1035,7 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle_c
scaninc = SCANLINES_PER_BUCKET - uint32_t(curscan) % SCANLINES_PER_BUCKET;
// fill in the work unit basics
- unit.polygon = &polygon;
+ unit.primitive = &primitive;
unit.count_next = std::min(v3yclip - curscan, scaninc);
unit.scanline = curscan;
unit.previtem = m_unit_bucket[bucketnum];
@@ -1042,7 +1044,7 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle_c
// iterate over extents
for (int extnum = 0; extnum < unit.count_next; extnum++)
{
- const extent_t &srcextent = extents[(curscan + extnum) - startscanline];
+ extent_t const &srcextent = extents[(curscan + extnum) - startscanline];
int32_t istartx = srcextent.startx, istopx = srcextent.stopx;
// apply left/right clipping
@@ -1060,7 +1062,7 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle_c
extent.stopx = istopx;
// fill in the parameters for the extent
- for (int paramnum = 0; paramnum < MaxParams; paramnum++)
+ for (int paramnum = 0; paramnum < ParamCount; paramnum++)
{
extent.param[paramnum].start = srcextent.param[paramnum].start;
extent.param[paramnum].dpdx = srcextent.param[paramnum].dpdx;
@@ -1091,7 +1093,7 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_triangle_c
template<typename BaseType, class ObjectType, int MaxParams, u8 Flags>
template<int NumVerts, int ParamCount>
-uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_polygon(const rectangle &cliprect, render_delegate callback, const vertex_t *v)
+uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_polygon(rectangle const &cliprect, render_delegate callback, vertex_t const *v)
{
// determine min/max Y vertices
BaseType minx = v[0].x;
@@ -1114,7 +1116,7 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_polygon(co
// clip coordinates
int32_t minyclip = miny;
- int32_t maxyclip = maxy + ((Flags & POLY_FLAG_INCLUDE_BOTTOM_EDGE) ? 1 : 0);
+ int32_t maxyclip = maxy;
if (!(Flags & POLY_FLAG_NO_CLIPPING))
{
minyclip = std::max(minyclip, cliprect.top());
@@ -1123,16 +1125,16 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_polygon(co
return 0;
}
- // allocate a new polygon
- polygon_info &polygon = polygon_alloc(round_coordinate(minx), round_coordinate(maxx), minyclip, maxyclip, callback);
+ // allocate a new primitive
+ primitive_info &primitive = primitive_alloc(round_coordinate(minx), round_coordinate(maxx), minyclip, maxyclip, callback);
// walk forward to build up the forward edge list
struct poly_edge
{
poly_edge *next; // next edge in sequence
int index; // index of this edge
- const vertex_t *v1; // pointer to first vertex
- const vertex_t *v2; // pointer to second vertex
+ vertex_t const *v1; // pointer to first vertex
+ vertex_t const *v2; // pointer to second vertex
BaseType dxdy; // dx/dy along the edge
std::array<BaseType, MaxParams> dpdy; // per-parameter dp/dy values
};
@@ -1180,7 +1182,7 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_polygon(co
// determine which list is left/right:
// if the first vertex is shared, compare the slopes
// if the first vertex is not shared, compare the X coordinates
- const poly_edge *ledge, *redge;
+ poly_edge const *ledge, *redge;
if ((fedgelist[0].v1 == bedgelist[0].v1 && fedgelist[0].dxdy < bedgelist[0].dxdy) ||
(fedgelist[0].v1 != bedgelist[0].v1 && fedgelist[0].v1->x < bedgelist[0].v1->x))
{
@@ -1207,7 +1209,7 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_polygon(co
scaninc = SCANLINES_PER_BUCKET - uint32_t(curscan) % SCANLINES_PER_BUCKET;
// fill in the work unit basics
- unit.polygon = &polygon;
+ unit.primitive = &primitive;
unit.count_next = std::min(maxyclip - curscan, scaninc);
unit.scanline = curscan;
unit.previtem = m_unit_bucket[bucketnum];
@@ -1249,10 +1251,6 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_polygon(co
}
}
- // include the right edge if requested
- if (Flags & POLY_FLAG_INCLUDE_RIGHT_EDGE)
- istopx++;
-
// apply left/right clipping
if (!(Flags & POLY_FLAG_NO_CLIPPING))
{
@@ -1278,8 +1276,8 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_polygon(co
// enqueue the work items
queue_items(startunit);
- // return the total number of pixels in the triangle
- m_quads++;
+ // return the total number of pixels in the polygon
+ m_polygons++;
m_pixels += pixels;
return pixels;
}
@@ -1292,7 +1290,7 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_polygon(co
template<typename BaseType, class ObjectType, int MaxParams, u8 Flags>
template<int ParamCount>
-int poly_manager<BaseType, ObjectType, MaxParams, Flags>::zclip_if_less(int numverts, const vertex_t *v, vertex_t *outv, BaseType clipval)
+int poly_manager<BaseType, ObjectType, MaxParams, Flags>::zclip_if_less(int numverts, vertex_t const *v, vertex_t *outv, BaseType clipval)
{
bool prevclipped = (v[numverts - 1].p[0] < clipval);
vertex_t *nextout = outv;
@@ -1305,8 +1303,8 @@ int poly_manager<BaseType, ObjectType, MaxParams, Flags>::zclip_if_less(int numv
// if we switched from clipped to non-clipped, interpolate a vertex
if (thisclipped != prevclipped)
{
- const vertex_t &v1 = v[(vertnum == 0) ? (numverts - 1) : (vertnum - 1)];
- const vertex_t &v2 = v[vertnum];
+ vertex_t const &v1 = v[(vertnum == 0) ? (numverts - 1) : (vertnum - 1)];
+ vertex_t const &v2 = v[vertnum];
BaseType frac = (clipval - v1.p[0]) / (v2.p[0] - v1.p[0]);
nextout->x = v1.x + frac * (v2.x - v1.x);
nextout->y = v1.y + frac * (v2.y - v1.y);
diff --git a/src/devices/video/upd7220.cpp b/src/devices/video/upd7220.cpp
index dc63f4c071e..946d2719fc6 100644
--- a/src/devices/video/upd7220.cpp
+++ b/src/devices/video/upd7220.cpp
@@ -426,6 +426,7 @@ inline void upd7220_device::reset_figs_param()
m_figs.m_d2 = 0x0008;
m_figs.m_dm = 0xffff;
m_figs.m_gd = 0;
+ m_figs.m_figure_type = 0;
}
@@ -1302,6 +1303,10 @@ void upd7220_device::process_fifo()
{
LOG("uPD7220 RA%u: %02x\n", m_ra_addr, data);
+ if (m_ra_addr == 8)
+ m_pattern = (m_pattern & 0xff00) | data;
+ else if (m_ra_addr == 9)
+ m_pattern = (m_pattern & 0xff) | (data << 8);
m_ra[m_ra_addr] = data;
m_ra_addr++;
}
@@ -1324,6 +1329,12 @@ void upd7220_device::process_fifo()
if (m_param_ptr == 3 || (m_param_ptr == 2 && m_cr & 0x10))
{
+ m_pattern = (m_pattern & 0xff00) | m_pr[1];
+ if (m_param_ptr == 3)
+ m_pattern = (m_pattern & 0xff) | (m_pr[2] << 8);
+ LOG("uPD7220 PATTERN: %04x\n", m_pattern);
+ if (m_figs.m_figure_type)
+ break;
LOG("%02x = %02x %02x (%c) %06x %04x\n",m_cr,m_pr[2],m_pr[1],m_pr[1]?m_pr[1]:' ',m_ead,m_figs.m_dc);
fifo_set_direction(FIFO_WRITE);
@@ -1348,6 +1359,8 @@ void upd7220_device::process_fifo()
m_figs.m_dir = m_pr[1] & 0x7;
m_figs.m_figure_type = (m_pr[1] & 0xf8) >> 3;
+ LOG("uPD7220 DIR: %02x\n", m_figs.m_dir);
+ LOG("uPD7220 FIG: %02x\n", m_figs.m_figure_type);
//if(m_figs.m_dir != 2)
// printf("DIR %02x\n",m_pr[1]);
}
@@ -1355,30 +1368,46 @@ void upd7220_device::process_fifo()
// the Decision Mate V during start-up test upload only 2 params before execute the
// RDAT command, so I assume this is the expected behaviour, but this needs to be verified.
if (m_param_ptr == 3)
+ {
m_figs.m_dc = (m_pr[2]) | (m_figs.m_dc & 0x3f00);
+ LOG("uPD7220 DC: %04x\n", m_figs.m_dc);
+ }
if (m_param_ptr == 4)
{
m_figs.m_dc = (m_pr[2]) | ((m_pr[3] & 0x3f) << 8);
m_figs.m_gd = (m_pr[3] & 0x40) && ((m_mode & UPD7220_MODE_DISPLAY_MASK) == UPD7220_MODE_DISPLAY_MIXED);
+ LOG("uPD7220 DC: %04x\n", m_figs.m_dc);
+ LOG("uPD7220 GD: %02x\n", m_figs.m_gd);
}
if (m_param_ptr == 6)
+ {
m_figs.m_d = (m_pr[4]) | ((m_pr[5] & 0x3f) << 8);
+ LOG("uPD7220 D: %04x\n", m_figs.m_d);
+ }
if (m_param_ptr == 8)
+ {
m_figs.m_d2 = (m_pr[6]) | ((m_pr[7] & 0x3f) << 8);
+ LOG("uPD7220 D2: %04x\n", m_figs.m_d2);
+ }
if (m_param_ptr == 10)
+ {
m_figs.m_d1 = (m_pr[8]) | ((m_pr[9] & 0x3f) << 8);
+ LOG("uPD7220 D1: %04x\n", m_figs.m_d1);
+ }
if (m_param_ptr == 12)
+ {
m_figs.m_dm = (m_pr[10]) | ((m_pr[11] & 0x3f) << 8);
+ LOG("uPD7220 DM: %04x\n", m_figs.m_dm);
+ }
break;
case COMMAND_FIGD: /* figure draw start */
- m_pattern = (m_ra[8]) | (m_ra[9]<<8);
if(m_figs.m_figure_type == 0)
draw_pixel();
else if(m_figs.m_figure_type == 1)
diff --git a/src/devices/video/vector.cpp b/src/devices/video/vector.cpp
index b344801dd9f..9f4a35f4bf5 100644
--- a/src/devices/video/vector.cpp
+++ b/src/devices/video/vector.cpp
@@ -108,7 +108,7 @@ void vector_device::add_point(int x, int y, rgb_t color, int intensity)
{
point *newpoint;
- intensity = std::max(0, std::min(255, intensity));
+ intensity = std::clamp(intensity, 0, 255);
m_min_intensity = intensity > 0 ? std::min(m_min_intensity, intensity) : m_min_intensity;
m_max_intensity = intensity > 0 ? std::max(m_max_intensity, intensity) : m_max_intensity;
@@ -119,7 +119,7 @@ void vector_device::add_point(int x, int y, rgb_t color, int intensity)
intensity -= (int)(intensity * random * vector_options::s_flicker);
- intensity = std::max(0, std::min(255, intensity));
+ intensity = std::clamp(intensity, 0, 255);
}
newpoint = &m_vector_list[m_vector_index];
diff --git a/src/devices/video/voodoo_render.cpp b/src/devices/video/voodoo_render.cpp
index eaa85062a5f..7a698a9b028 100644
--- a/src/devices/video/voodoo_render.cpp
+++ b/src/devices/video/voodoo_render.cpp
@@ -1246,6 +1246,10 @@ voodoo_renderer::voodoo_renderer(running_machine &machine, u16 tmu_config, const
// empty the hash table
std::fill(std::begin(m_raster_hash), std::end(m_raster_hash), nullptr);
+ // register our arrays
+ register_poly_array(m_textures);
+ register_poly_array(m_palettes);
+
// add all predefined rasterizers
for (static_rasterizer_info const *info = s_predef_raster_table; info->params.generic() != 0xffffffff; info++)
add_rasterizer(info->params, info->mfp, false);
@@ -1278,7 +1282,7 @@ void voodoo_renderer::register_save(save_proxy &save)
poly_data &voodoo_renderer::alloc_poly()
{
// allocate poly data and compute the rasterization parameters
- poly_data &poly = object_data_alloc();
+ poly_data &poly = object_data().next();
poly.raster.compute(m_fbi_reg, m_tmu0_reg, m_tmu1_reg);
return poly;
}
@@ -2610,19 +2614,6 @@ void voodoo_renderer::dump_rasterizer_stats()
}
-//-------------------------------------------------
-// reset_after_wait - handle a reset after a
-// wait operation by resetting our allocated
-// object queues
-//-------------------------------------------------
-
-void voodoo_renderer::reset_after_wait()
-{
- m_textures.reset();
- m_palettes.reset();
-}
-
-
//**************************************************************************
// GAME-SPECIFIC RASTERIZERS
//**************************************************************************
diff --git a/src/devices/video/voodoo_render.h b/src/devices/video/voodoo_render.h
index 6bd6e4077c8..9eafef87f98 100644
--- a/src/devices/video/voodoo_render.h
+++ b/src/devices/video/voodoo_render.h
@@ -574,10 +574,6 @@ public:
// dump rasterizer statistics if enabled
void dump_rasterizer_stats();
-protected:
- // overrides
- virtual void reset_after_wait() override;
-
private:
// pipeline stages, in order
bool stipple_test(thread_stats_block &threadstats, voodoo::reg_fbz_mode const fbzmode, s32 x, s32 y, u32 &stipple);
diff --git a/src/devices/video/zeus2.cpp b/src/devices/video/zeus2.cpp
index 73a1237b125..13cfc5b594b 100644
--- a/src/devices/video/zeus2.cpp
+++ b/src/devices/video/zeus2.cpp
@@ -1777,7 +1777,7 @@ void zeus2_renderer::zeus2_draw_quad(const uint32_t *databuffer, uint32_t texdat
return;
}
- zeus2_poly_extra_data& extra = this->object_data_alloc();
+ zeus2_poly_extra_data& extra = this->object_data().next();
extra.ucode_src = m_state->m_curUCodeSrc;
extra.tex_src = m_state->zeus_texbase;
diff --git a/src/emu/addrmap.h b/src/emu/addrmap.h
index c5a6c17d128..76cdc6aef54 100644
--- a/src/emu/addrmap.h
+++ b/src/emu/addrmap.h
@@ -72,7 +72,7 @@ class address_map_entry
friend class address_map;
template <typename T, typename Ret, typename... Params>
- struct is_addrmap_method { static constexpr bool value = std::is_constructible<address_map_constructor, Ret (T::*)(Params...), const char *, T*>::value; };
+ using is_addrmap_method = std::bool_constant<std::is_constructible_v<address_map_constructor, Ret (T::*)(Params...), const char *, T *> >;
template <typename T, typename Ret, typename... Params>
static std::enable_if_t<is_addrmap_method<T, Ret, Params...>::value, address_map_constructor> make_delegate(Ret (T::*func)(Params...), const char *name, T *obj)
diff --git a/src/emu/attotime.h b/src/emu/attotime.h
index 589098b7adf..c4c41069a75 100644
--- a/src/emu/attotime.h
+++ b/src/emu/attotime.h
@@ -1018,7 +1018,12 @@ inline constexpr bool operator>=(const attotime &left, const attotime &right) no
// string describing a subseconds value
//-------------------------------------------------
+<<<<<<< HEAD
inline const char *subseconds::as_string(int precision, bool dividers) const noexcept
+=======
+/** Create an attotime from a tick count @p ticks at the given frequency @p frequency */
+inline attotime attotime::from_ticks(u64 ticks, u32 frequency)
+>>>>>>> master
{
// just leverage the full attotime logic to do this
return attotime(*this).as_string(precision, dividers);
diff --git a/src/emu/config.cpp b/src/emu/config.cpp
index 46bec43c1dd..792da6f255d 100644
--- a/src/emu/config.cpp
+++ b/src/emu/config.cpp
@@ -64,16 +64,16 @@ bool configuration_manager::load_settings()
type.load(config_type::INIT, config_level::DEFAULT, nullptr);
// now load the controller file
- const char *controller = machine().options().ctrlr();
+ char const *const controller = machine().options().ctrlr();
if (controller && *controller)
{
// open the config file
emu_file file(machine().options().ctrlr_path(), OPEN_FLAG_READ);
osd_printf_verbose("Attempting to parse: %s.cfg\n", controller);
- osd_file::error filerr = file.open(std::string(controller) + ".cfg");
+ std::error_condition const filerr = file.open(std::string(controller) + ".cfg");
- if (filerr != osd_file::error::NONE)
- throw emu_fatalerror("Could not open controller file %s.cfg", controller);
+ if (filerr)
+ throw emu_fatalerror("Could not open controller file %s.cfg (%s:%d %s)", controller, filerr.category().name(), filerr.value(), filerr.message());
// load the XML
if (!load_xml(file, config_type::CONTROLLER))
@@ -82,15 +82,15 @@ bool configuration_manager::load_settings()
// next load the defaults file
emu_file file(machine().options().cfg_directory(), OPEN_FLAG_READ);
- osd_file::error filerr = file.open("default.cfg");
+ std::error_condition filerr = file.open("default.cfg");
osd_printf_verbose("Attempting to parse: default.cfg\n");
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
load_xml(file, config_type::DEFAULT);
// finally, load the game-specific file
filerr = file.open(machine().basename() + ".cfg");
osd_printf_verbose("Attempting to parse: %s.cfg\n",machine().basename());
- const bool loaded = (osd_file::error::NONE == filerr) && load_xml(file, config_type::SYSTEM);
+ const bool loaded = !filerr && load_xml(file, config_type::SYSTEM);
// loop over all registrants and call their final function
for (const auto &type : m_typelist)
@@ -110,13 +110,13 @@ void configuration_manager::save_settings()
// save the defaults file
emu_file file(machine().options().cfg_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr = file.open("default.cfg");
- if (filerr == osd_file::error::NONE)
+ std::error_condition filerr = file.open("default.cfg");
+ if (!filerr)
save_xml(file, config_type::DEFAULT);
// finally, save the system-specific file
filerr = file.open(machine().basename() + ".cfg");
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
save_xml(file, config_type::SYSTEM);
// loop over all registrants and call their final function
diff --git a/src/emu/crsshair.cpp b/src/emu/crsshair.cpp
index 43eac50587b..3c6a6b807f0 100644
--- a/src/emu/crsshair.cpp
+++ b/src/emu/crsshair.cpp
@@ -189,7 +189,7 @@ void render_crosshair::create_bitmap()
if (!m_name.empty())
{
// look for user specified file
- if (crossfile.open(m_name + ".png") == osd_file::error::NONE)
+ if (!crossfile.open(m_name + ".png"))
{
render_load_png(*m_bitmap, crossfile);
crossfile.close();
@@ -199,14 +199,14 @@ void render_crosshair::create_bitmap()
{
// look for default cross?.png in crsshair/game dir
std::string const filename = string_format("cross%d.png", m_player + 1);
- if (crossfile.open(m_machine.system().name + (PATH_SEPARATOR + filename)) == osd_file::error::NONE)
+ if (!crossfile.open(m_machine.system().name + (PATH_SEPARATOR + filename)))
{
render_load_png(*m_bitmap, crossfile);
crossfile.close();
}
// look for default cross?.png in crsshair dir
- if (!m_bitmap->valid() && (crossfile.open(filename) == osd_file::error::NONE))
+ if (!m_bitmap->valid() && !crossfile.open(filename))
{
render_load_png(*m_bitmap, crossfile);
crossfile.close();
diff --git a/src/emu/debug/debugcmd.cpp b/src/emu/debug/debugcmd.cpp
index ace535f1084..58cc85f7a86 100644
--- a/src/emu/debug/debugcmd.cpp
+++ b/src/emu/debug/debugcmd.cpp
@@ -225,8 +225,6 @@ debugger_commands::debugger_commands(running_machine& machine, debugger_cpu& cpu
m_console.register_command("rpenable", CMDFLAG_NONE, 1, 0, 1, std::bind(&debugger_commands::execute_rpdisenable, this, _1, _2));
m_console.register_command("rplist", CMDFLAG_NONE, 0, 0, 0, std::bind(&debugger_commands::execute_rplist, this, _1, _2));
- m_console.register_command("hotspot", CMDFLAG_NONE, 0, 0, 3, std::bind(&debugger_commands::execute_hotspot, this, _1, _2));
-
m_console.register_command("statesave", CMDFLAG_NONE, 0, 1, 1, std::bind(&debugger_commands::execute_statesave, this, _1, _2));
m_console.register_command("ss", CMDFLAG_NONE, 0, 1, 1, std::bind(&debugger_commands::execute_statesave, this, _1, _2));
m_console.register_command("stateload", CMDFLAG_NONE, 0, 1, 1, std::bind(&debugger_commands::execute_stateload, this, _1, _2));
@@ -1342,7 +1340,7 @@ void debugger_commands::execute_cpulist(int ref, const std::vector<std::string>
int index = 0;
for (device_execute_interface &exec : execute_interface_enumerator(m_machine.root_device()))
{
- device_state_interface *state;
+ const device_state_interface *state;
if (exec.device().interface(state) && state->state_find_entry(STATE_GENPCBASE) != nullptr)
m_console.printf("[%s%d] %s\n", &exec.device() == m_console.get_visible_cpu() ? "*" : "", index++, exec.device().tag());
}
@@ -1463,23 +1461,22 @@ void debugger_commands::execute_bpset(int ref, const std::vector<std::string> &p
u64 address;
int bpnum;
const char *action = nullptr;
- int p = 0;
- /* CPU defaults to the active cpu */
- if (!validate_cpu_parameter((params[p][0] == '#') ? &params[p++][1] : nullptr, cpu))
+ /* CPU is implicit */
+ if (!validate_cpu_parameter(nullptr, cpu))
return;
/* param 1 is the address */
- if (!validate_number_parameter(params[p++], address))
+ if (!validate_number_parameter(params[0], address))
return;
/* param 2 is the condition */
parsed_expression condition(cpu->debug()->symtable());
- if (params.size() > p && !debug_command_parameter_expression(params[p++], condition))
+ if (params.size() > 1 && !debug_command_parameter_expression(params[1], condition))
return;
/* param 3 is the action */
- if (params.size() > p && !debug_command_parameter_command(action = params[p++].c_str()))
+ if (params.size() > 2 && !debug_command_parameter_command(action = params[2].c_str()))
return;
/* set the breakpoint */
@@ -1606,41 +1603,39 @@ void debugger_commands::execute_wpset(int ref, const std::vector<std::string> &p
u64 address, length;
read_or_write type;
int wpnum;
- int p = 0;
- /* CPU defaults to the active cpu */
- if (!validate_cpu_space_parameter((params[p][0] == '#') ? &params[p++][1] : nullptr, ref, space))
+ /* CPU is implicit */
+ if (!validate_cpu_space_parameter(nullptr, ref, space))
return;
/* param 1 is the address */
- if (!validate_number_parameter(params[p++], address))
+ if (!validate_number_parameter(params[0], address))
return;
/* param 2 is the length */
- if (!validate_number_parameter(params[p++], length))
+ if (!validate_number_parameter(params[1], length))
return;
/* param 3 is the type */
- if (!core_stricmp(params[p].c_str(), "r"))
+ if (!core_stricmp(params[2].c_str(), "r"))
type = read_or_write::READ;
- else if (!core_stricmp(params[p].c_str(), "w"))
+ else if (!core_stricmp(params[2].c_str(), "w"))
type = read_or_write::WRITE;
- else if (!core_stricmp(params[p].c_str(), "rw") || !core_stricmp(params[p].c_str(), "wr"))
+ else if (!core_stricmp(params[2].c_str(), "rw") || !core_stricmp(params[2].c_str(), "wr"))
type = read_or_write::READWRITE;
else
{
m_console.printf("Invalid watchpoint type: expected r, w, or rw\n");
return;
}
- p++;
/* param 4 is the condition */
parsed_expression condition(space->device().debug()->symtable());
- if (params.size() > p && !debug_command_parameter_expression(params[p++], condition))
+ if (params.size() > 3 && !debug_command_parameter_expression(params[3], condition))
return;
/* param 5 is the action */
- if (params.size() > p && !debug_command_parameter_command(action = params[p++].c_str()))
+ if (params.size() > 4 && !debug_command_parameter_command(action = params[4].c_str()))
return;
/* set the watchpoint */
@@ -1771,19 +1766,18 @@ void debugger_commands::execute_rpset(int ref, const std::vector<std::string> &p
device_t *cpu;
const char *action = nullptr;
int bpnum;
- int p = 0;
- /* CPU defaults to the active cpu */
- if (!validate_cpu_parameter((params[p][0] == '#') ? &params[p++][1] : nullptr, cpu))
+ /* CPU is implicit */
+ if (!validate_cpu_parameter(nullptr, cpu))
return;
/* param 1 is the condition */
parsed_expression condition(cpu->debug()->symtable());
- if (params.size() > p && !debug_command_parameter_expression(params[p], condition))
+ if (params.size() > 0 && !debug_command_parameter_expression(params[0], condition))
return;
/* param 2 is the action */
- if (params.size() > p && !debug_command_parameter_command(action = params[p].c_str()))
+ if (params.size() > 1 && !debug_command_parameter_command(action = params[1].c_str()))
return;
/* set the breakpoint */
@@ -1896,49 +1890,6 @@ void debugger_commands::execute_rplist(int ref, const std::vector<std::string> &
/*-------------------------------------------------
- execute_hotspot - execute the hotspot
- command
--------------------------------------------------*/
-
-void debugger_commands::execute_hotspot(int ref, const std::vector<std::string> &params)
-{
- /* if no params, and there are live hotspots, clear them */
- if (params.empty())
- {
- bool cleared = false;
-
- /* loop over CPUs and find live spots */
- for (device_t &device : device_enumerator(m_machine.root_device()))
- if (device.debug()->hotspot_tracking_enabled())
- {
- device.debug()->hotspot_track(0, 0);
- m_console.printf("Cleared hotspot tracking on CPU '%s'\n", device.tag());
- cleared = true;
- }
-
- /* if we cleared, we're done */
- if (cleared)
- return;
- }
-
- /* extract parameters */
- device_t *device = nullptr;
- if (!validate_cpu_parameter(!params.empty() ? params[0].c_str() : nullptr, device))
- return;
- u64 count = 64;
- if (params.size() > 1 && !validate_number_parameter(params[1], count))
- return;
- u64 threshhold = 250;
- if (params.size() > 2 && !validate_number_parameter(params[2], threshhold))
- return;
-
- /* attempt to install */
- device->debug()->hotspot_track(count, threshhold);
- m_console.printf("Now tracking hotspots on CPU '%s' using %d slots with a threshold of %d\n", device->tag(), (int)count, (int)threshhold);
-}
-
-
-/*-------------------------------------------------
execute_statesave - execute the statesave command
-------------------------------------------------*/
@@ -3559,6 +3510,13 @@ void debugger_commands::execute_trackpc(int ref, const std::vector<std::string>
if (!validate_cpu_parameter((params.size() > 1) ? params[1].c_str() : nullptr, cpu))
return;
+ const device_state_interface *state;
+ if (!cpu->interface(state))
+ {
+ m_console.printf("Device has no PC to be tracked\n");
+ return;
+ }
+
// Should we clear the existing data?
bool clear = false;
if (params.size() > 2 && !validate_boolean_parameter(params[2], clear))
@@ -3570,7 +3528,7 @@ void debugger_commands::execute_trackpc(int ref, const std::vector<std::string>
// Insert current pc
if (m_console.get_visible_cpu() == cpu)
{
- const offs_t pc = cpu->state().pcbase();
+ const offs_t pc = state->pcbase();
cpu->debug()->set_track_pc_visited(pc);
}
m_console.printf("PC tracking enabled\n");
@@ -3713,11 +3671,11 @@ void debugger_commands::execute_snap(int ref, const std::vector<std::string> &pa
if (fname.find(".png") == -1)
fname.append(".png");
emu_file file(m_machine.options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr = file.open(std::move(fname));
+ std::error_condition filerr = file.open(std::move(fname));
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
- m_console.printf("Error creating file '%s'\n", filename);
+ m_console.printf("Error creating file '%s' (%s:%d %s)\n", filename, filerr.category().name(), filerr.value(), filerr.message());
return;
}
@@ -3747,14 +3705,13 @@ void debugger_commands::execute_map(int ref, const std::vector<std::string> &par
offs_t taddress;
u64 address;
int intention;
- int p = 0;
- /* CPU defaults to the active cpu */
- if (!validate_cpu_space_parameter((params[p][0] == '#') ? &params[p++][1] : nullptr, ref, space))
+ /* validate parameters */
+ if (!validate_number_parameter(params[0], address))
return;
- /* validate parameters */
- if (!validate_number_parameter(params[p++], address))
+ /* CPU is implicit */
+ if (!validate_cpu_space_parameter(nullptr, ref, space))
return;
/* do the translation first */
diff --git a/src/emu/debug/debugcmd.h b/src/emu/debug/debugcmd.h
index 0bda10ac299..7ed81ce9f00 100644
--- a/src/emu/debug/debugcmd.h
+++ b/src/emu/debug/debugcmd.h
@@ -143,7 +143,6 @@ private:
void execute_rpclear(int ref, const std::vector<std::string> &params);
void execute_rpdisenable(int ref, const std::vector<std::string> &params);
void execute_rplist(int ref, const std::vector<std::string> &params);
- void execute_hotspot(int ref, const std::vector<std::string> &params);
void execute_statesave(int ref, const std::vector<std::string> &params);
void execute_stateload(int ref, const std::vector<std::string> &params);
void execute_rewind(int ref, const std::vector<std::string> &params);
diff --git a/src/emu/debug/debugcpu.cpp b/src/emu/debug/debugcpu.cpp
index 1c8058d5b7e..04183a8dcda 100644
--- a/src/emu/debug/debugcpu.cpp
+++ b/src/emu/debug/debugcpu.cpp
@@ -171,8 +171,8 @@ bool debugger_cpu::comment_save()
if (found_comments)
{
emu_file file(m_machine.options().comment_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr = file.open(m_machine.basename() + ".cmt");
- if (filerr == osd_file::error::NONE)
+ std::error_condition const filerr = file.open(m_machine.basename() + ".cmt");
+ if (!filerr)
{
root->write(file);
comments_saved = true;
@@ -197,10 +197,10 @@ bool debugger_cpu::comment_load(bool is_inline)
{
// open the file
emu_file file(m_machine.options().comment_directory(), OPEN_FLAG_READ);
- osd_file::error filerr = file.open(m_machine.basename() + ".cmt");
+ std::error_condition const filerr = file.open(m_machine.basename() + ".cmt");
// if an error, just return false
- if (filerr != osd_file::error::NONE)
+ if (filerr)
return false;
// wrap in a try/catch to handle errors
@@ -442,7 +442,6 @@ device_debug::device_debug(device_t &device)
, m_triggered_breakpoint(nullptr)
, m_triggered_watchpoint(nullptr)
, m_trace(nullptr)
- , m_hotspot_threshhold(0)
, m_track_pc_set()
, m_track_pc(false)
, m_comment_set()
@@ -461,7 +460,6 @@ device_debug::device_debug(device_t &device)
// set up notifiers and clear the passthrough handlers
if (m_memory) {
int count = m_memory->max_space_count();
- m_phr.resize(count, nullptr);
m_phw.resize(count, nullptr);
for (int i=0; i != count; i++)
if (m_memory->has_space(i)) {
@@ -555,7 +553,7 @@ device_debug::~device_debug()
void device_debug::write_tracking(address_space &space, offs_t address, u64 data)
{
- dasm_memory_access const newAccess(space.spacenum(), address, data, history_pc(0));
+ dasm_memory_access const newAccess(space.spacenum(), address, data, m_state->pcbase());
std::pair<std::set<dasm_memory_access>::iterator, bool> trackedAccess = m_track_mem_set.insert(newAccess);
if (!trackedAccess.second)
trackedAccess.first->m_pc = newAccess.m_pc;
@@ -564,19 +562,6 @@ void device_debug::write_tracking(address_space &space, offs_t address, u64 data
void device_debug::reinstall(address_space &space, read_or_write mode)
{
int id = space.spacenum();
- if (u32(mode) & u32(read_or_write::READ))
- {
- if (m_phr[id])
- m_phr[id]->remove();
- if (!m_hotspots.empty())
- switch (space.data_width())
- {
- case 8: m_phr[id] = space.install_read_tap(0, space.addrmask(), "hotspot", [this, &space](offs_t address, u8 &, u8 ) { hotspot_check(space, address); }, m_phr[id]); break;
- case 16: m_phr[id] = space.install_read_tap(0, space.addrmask(), "hotspot", [this, &space](offs_t address, u16 &, u16) { hotspot_check(space, address); }, m_phr[id]); break;
- case 32: m_phr[id] = space.install_read_tap(0, space.addrmask(), "hotspot", [this, &space](offs_t address, u32 &, u32) { hotspot_check(space, address); }, m_phr[id]); break;
- case 64: m_phr[id] = space.install_read_tap(0, space.addrmask(), "hotspot", [this, &space](offs_t address, u64 &, u64) { hotspot_check(space, address); }, m_phr[id]); break;
- }
- }
if (u32(mode) & u32(read_or_write::WRITE))
{
if (m_phw[id])
@@ -1358,30 +1343,6 @@ void device_debug::registerpoint_enable_all(bool enable)
//-------------------------------------------------
-// hotspot_track - enable/disable tracking of
-// hotspots
-//-------------------------------------------------
-
-void device_debug::hotspot_track(int numspots, int threshhold)
-{
- // if we already have tracking enabled, kill it
- m_hotspots.clear();
-
- // only start tracking if we have a non-zero count
- if (numspots > 0)
- {
- // allocate memory for hotspots
- m_hotspots.resize(numspots);
- memset(&m_hotspots[0], 0xff, numspots*sizeof(m_hotspots[0]));
-
- // fill in the info
- m_hotspot_threshhold = threshhold;
- }
- reinstall_all(read_or_write::READ);
-}
-
-
-//-------------------------------------------------
// history_pc - return an entry from the PC
// history
//-------------------------------------------------
@@ -1760,56 +1721,6 @@ void device_debug::breakpoint_check(offs_t pc)
}
-//-------------------------------------------------
-// watchpoint_check - check the watchpoints
-// for a given CPU and address space
-//-------------------------------------------------
-
-//-------------------------------------------------
-// hotspot_check - check for hotspots on a
-// memory read access
-//-------------------------------------------------
-
-void device_debug::hotspot_check(address_space &space, offs_t address)
-{
- offs_t curpc = m_device.state().pcbase();
-
- // see if we have a match in our list
- unsigned int hotindex;
- for (hotindex = 0; hotindex < m_hotspots.size(); hotindex++)
- if (m_hotspots[hotindex].m_access == address && m_hotspots[hotindex].m_pc == curpc && m_hotspots[hotindex].m_space == &space)
- break;
-
- // if we didn't find any, make a new entry
- if (hotindex == m_hotspots.size())
- {
- // if the bottom of the list is over the threshold, print it
- hotspot_entry &spot = m_hotspots[m_hotspots.size() - 1];
- if (spot.m_count > m_hotspot_threshhold)
- m_device.machine().debugger().console().printf("Hotspot @ %s %08X (PC=%08X) hit %d times (fell off bottom)\n", space.name(), spot.m_access, spot.m_pc, spot.m_count);
-
- // move everything else down and insert this one at the top
- memmove(&m_hotspots[1], &m_hotspots[0], sizeof(m_hotspots[0]) * (m_hotspots.size() - 1));
- m_hotspots[0].m_access = address;
- m_hotspots[0].m_pc = curpc;
- m_hotspots[0].m_space = &space;
- m_hotspots[0].m_count = 1;
- }
-
- // if we did find one, increase the count and move it to the top
- else
- {
- m_hotspots[hotindex].m_count++;
- if (hotindex != 0)
- {
- hotspot_entry temp = m_hotspots[hotindex];
- memmove(&m_hotspots[1], &m_hotspots[0], sizeof(m_hotspots[0]) * hotindex);
- m_hotspots[0] = temp;
- }
- }
-}
-
-
//**************************************************************************
// TRACER
diff --git a/src/emu/debug/debugcpu.h b/src/emu/debug/debugcpu.h
index aeb59f36ea3..82635df71a9 100644
--- a/src/emu/debug/debugcpu.h
+++ b/src/emu/debug/debugcpu.h
@@ -118,10 +118,6 @@ public:
bool registerpoint_enable(int index, bool enable = true);
void registerpoint_enable_all(bool enable = true );
- // hotspots
- bool hotspot_tracking_enabled() const { return !m_hotspots.empty(); }
- void hotspot_track(int numspots, int threshhold);
-
// comments
void comment_add(offs_t address, const char *comment, rgb_t color);
bool comment_remove(offs_t addr);
@@ -170,7 +166,6 @@ private:
// breakpoint and watchpoint helpers
void breakpoint_update_flags();
void breakpoint_check(offs_t pc);
- void hotspot_check(address_space &space, offs_t address);
void reinstall_all(read_or_write mode);
void reinstall(address_space &space, read_or_write mode);
void write_tracking(address_space &space, offs_t address, u64 data);
@@ -244,18 +239,6 @@ private:
};
std::unique_ptr<tracer> m_trace; // tracer state
- // hotspots
- struct hotspot_entry
- {
- offs_t m_access; // access address
- offs_t m_pc; // PC of the access
- address_space * m_space; // space where the access occurred
- u32 m_count; // number of hits
- };
- std::vector<hotspot_entry> m_hotspots; // hotspot list
- int m_hotspot_threshhold; // threshhold for the number of hits to print
-
- std::vector<memory_passthrough_handler *> m_phr; // passthrough handler reference for each space, read mode
std::vector<memory_passthrough_handler *> m_phw; // passthrough handler reference for each space, write mode
std::vector<int> m_notifiers; // notifiers for each space
diff --git a/src/emu/debug/debughlp.cpp b/src/emu/debug/debughlp.cpp
index 74d6b7f29ea..99fda175735 100644
--- a/src/emu/debug/debughlp.cpp
+++ b/src/emu/debug/debughlp.cpp
@@ -188,7 +188,6 @@ static const help_item static_help_list[] =
" wpdisable [<wpnum>] -- disables a given watchpoint or all if no <wpnum> specified\n"
" wpenable [<wpnum>] -- enables a given watchpoint or all if no <wpnum> specified\n"
" wplist -- lists all the watchpoints\n"
- " hotspot [<CPU>,[<depth>[,<hits>]]] -- attempt to find hotspots\n"
},
{
"registerpoints",
@@ -1215,36 +1214,6 @@ static const help_item static_help_list[] =
"conditions or actions attached to them.\n"
},
{
- "hotspot",
- "\n"
- " hotspot [<CPU>,[<depth>[,<hits>]]]\n"
- "\n"
- "The hotspot command attempts to help locate hotspots in the code where speedup opportunities "
- "might be present. <CPU>, which defaults to the currently active CPU, specified which "
- "processor's memory to track. <depth>, which defaults to 64, controls the depth of the search "
- "buffer. The search buffer tracks the last <depth> memory reads from unique PCs. The <hits> "
- "parameter, which defaults to 250, specifies the minimum number of hits to report.\n"
- "\n"
- "The basic theory of operation is like this: each memory read is trapped by the debugger and "
- "logged in the search buffer according to the address which was read and the PC that executed "
- "the opcode. If the search buffer already contains a matching entry, that entry's count is "
- "incremented and the entry is moved to the top of the list. If the search buffer does not "
- "contain a matching entry, the entry from the bottom of the list is removed, and a new entry "
- "is created at the top with an initial count of 1. Entries which fall off the bottom are "
- "examined and if their count is larger than <hits>, they are reported to the debugger "
- "console.\n"
- "\n"
- "Examples:\n"
- "\n"
- "hotspot 0,10\n"
- " Looks for hotspots on CPU 0 using a search buffer of 16 entries, reporting any entries which "
- "end up with 250 or more hits.\n"
- "\n"
- "hotspot 1,40,#1000\n"
- " Looks for hotspots on CPU 1 using a search buffer of 64 entries, reporting any entries which "
- "end up with 1000 or more hits.\n"
- },
- {
"rpset",
"\n"
" rp[set] {<condition>}[,<action>]]\n"
diff --git a/src/emu/debug/dvdisasm.cpp b/src/emu/debug/dvdisasm.cpp
index ab24206ff90..5c371b37426 100644
--- a/src/emu/debug/dvdisasm.cpp
+++ b/src/emu/debug/dvdisasm.cpp
@@ -25,8 +25,12 @@
debug_view_disasm_source::debug_view_disasm_source(std::string &&name, device_t &device)
: debug_view_source(std::move(name), &device),
m_space(device.memory().space(AS_PROGRAM)),
- m_decrypted_space(device.memory().has_space(AS_OPCODES) ? device.memory().space(AS_OPCODES) : device.memory().space(AS_PROGRAM))
+ m_decrypted_space(device.memory().has_space(AS_OPCODES) ? device.memory().space(AS_OPCODES) : device.memory().space(AS_PROGRAM)),
+ m_pcbase(nullptr)
{
+ const device_state_interface *state;
+ if (device.interface(state))
+ m_pcbase = state->state_find_entry(STATE_GENPCBASE);
}
@@ -164,7 +168,7 @@ void debug_view_disasm::view_char(int chval)
case DCH_HOME: // set the active column to the PC
{
const debug_view_disasm_source &source = downcast<const debug_view_disasm_source &>(*m_source);
- offs_t pc = source.device()->state().pcbase() & source.m_space.logaddrmask();
+ offs_t pc = source.pcbase();
// figure out which row the pc is on
for(unsigned int curline = 0; curline < m_dasm.size(); curline++)
@@ -377,7 +381,7 @@ void debug_view_disasm::view_update()
{
const debug_view_disasm_source &source = downcast<const debug_view_disasm_source &>(*m_source);
debug_disasm_buffer buffer(*source.device());
- offs_t pc = source.device()->state().pcbase() & source.m_space.logaddrmask();
+ offs_t pc = source.pcbase();
generate_dasm(buffer, pc);
diff --git a/src/emu/debug/dvdisasm.h b/src/emu/debug/dvdisasm.h
index e445481a0e3..0a16f95d5fe 100644
--- a/src/emu/debug/dvdisasm.h
+++ b/src/emu/debug/dvdisasm.h
@@ -49,11 +49,13 @@ public:
// getters
address_space &space() const { return m_space; }
+ offs_t pcbase() const { return m_pcbase != nullptr ? m_pcbase->value() & m_space.logaddrmask() : 0; }
private:
// internal state
address_space & m_space; // address space to display
address_space & m_decrypted_space; // address space to display for decrypted opcodes
+ const device_state_entry *m_pcbase;
};
diff --git a/src/emu/debug/dvmemory.cpp b/src/emu/debug/dvmemory.cpp
index 3ae8008f0a2..2e384e90866 100644
--- a/src/emu/debug/dvmemory.cpp
+++ b/src/emu/debug/dvmemory.cpp
@@ -25,22 +25,21 @@
const debug_view_memory::memory_view_pos debug_view_memory::s_memory_pos_table[12] =
{
- /* 0 bytes per chunk: */ { 0, { 0 } },
- /* 1 byte per chunk: 00 11 22 33 44 55 66 77 */ { 3, { 0x04, 0x00, 0x80 } },
- /* 2 bytes per chunk: 0011 2233 4455 6677 */ { 6, { 0x8c, 0x0c, 0x08, 0x04, 0x00, 0x80 } },
- /* 3 bytes per chunk: */ { 0, { 0 } },
- /* 4 bytes per chunk: 00112233 44556677 */ { 12, { 0x9c, 0x9c, 0x1c, 0x18, 0x14, 0x10, 0x0c, 0x08, 0x04, 0x00, 0x80, 0x80 } },
- /* 5 bytes per chunk: */ { 0, { 0 } },
- /* 6 bytes per chunk: */ { 0, { 0 } },
- /* 7 bytes per chunk: */ { 0, { 0 } },
- /* 8 bytes per chunk: 0011223344556677 */ { 24, { 0xbc, 0xbc, 0xbc, 0xbc, 0x3c, 0x38, 0x34, 0x30, 0x2c, 0x28, 0x24, 0x20, 0x1c, 0x18, 0x14, 0x10, 0x0c, 0x08, 0x04, 0x00, 0x80, 0x80, 0x80, 0x80 } },
- /* 32 bit floating point: */ { 16, { 0 } },
- /* 64 bit floating point: */ { 32, { 0 } },
- /* 80 bit floating point: */ { 32, { 0 } },
+ /* 0 bytes per chunk: */ { 0, 0, { 0 } },
+ /* 1 byte per chunk: 00 11 22 33 44 55 66 77 */ { 1, 3, { 0x04, 0x00, 0x80 } },
+ /* 2 bytes per chunk: 0011 2233 4455 6677 */ { 2, 6, { 0x8c, 0x0c, 0x08, 0x04, 0x00, 0x80 } },
+ /* 3 bytes per chunk: */ { 0, 0, { 0 } },
+ /* 4 bytes per chunk: 00112233 44556677 */ { 4, 12, { 0x9c, 0x9c, 0x1c, 0x18, 0x14, 0x10, 0x0c, 0x08, 0x04, 0x00, 0x80, 0x80 } },
+ /* 5 bytes per chunk: */ { 0, 0, { 0 } },
+ /* 6 bytes per chunk: */ { 0, 0, { 0 } },
+ /* 7 bytes per chunk: */ { 0, 0, { 0 } },
+ /* 8 bytes per chunk: 0011223344556677 */ { 8, 24, { 0xbc, 0xbc, 0xbc, 0xbc, 0x3c, 0x38, 0x34, 0x30, 0x2c, 0x28, 0x24, 0x20, 0x1c, 0x18, 0x14, 0x10, 0x0c, 0x08, 0x04, 0x00, 0x80, 0x80, 0x80, 0x80 } },
+ /* 32 bit floating point: */ { 4, 16, { 0 } },
+ /* 64 bit floating point: */ { 8, 32, { 0 } },
+ /* 80 bit floating point: */ { 10, 32, { 0 } },
};
-
//**************************************************************************
// DEBUG VIEW MEMORY SOURCE
//**************************************************************************
@@ -71,7 +70,7 @@ debug_view_memory_source::debug_view_memory_source(std::string &&name, memory_re
, m_blocklength(region.bytes())
, m_numblocks(1)
, m_blockstride(0)
- , m_offsetxor(ENDIAN_VALUE_NE_NNE(region.endianness(), 0, region.bytewidth() - 1))
+ , m_offsetxor(region.endianness() == ENDIANNESS_NATIVE ? 0 : region.bytewidth() - 1)
, m_endianness(region.endianness())
, m_prefsize(std::min<u8>(region.bytewidth(), 8))
{
@@ -107,7 +106,7 @@ debug_view_memory::debug_view_memory(running_machine &machine, debug_view_osd_up
m_chunks_per_row(16),
m_bytes_per_chunk(1),
m_steps_per_chunk(1),
- m_data_format(1),
+ m_data_format(data_format::HEX_8BIT),
m_reverse_view(false),
m_ascii_view(true),
m_no_translation(false),
@@ -214,7 +213,24 @@ void debug_view_memory::view_notify(debug_view_notification type)
m_bytes_per_chunk = source.m_prefsize;
if (m_bytes_per_chunk > 8)
m_bytes_per_chunk = 8;
- m_data_format = m_bytes_per_chunk;
+ switch (m_bytes_per_chunk)
+ {
+ case 1:
+ m_data_format = data_format::HEX_8BIT;
+ break;
+
+ case 2:
+ m_data_format = data_format::HEX_16BIT;
+ break;
+
+ case 4:
+ m_data_format = data_format::HEX_32BIT;
+ break;
+
+ case 8:
+ m_data_format = data_format::HEX_64BIT;
+ break;
+ }
m_steps_per_chunk = source.m_space ? source.m_space->byte_to_address(m_bytes_per_chunk) : m_bytes_per_chunk;
if (source.m_space != nullptr)
m_expression.set_context(&source.m_space->device().debug()->symtable());
@@ -264,7 +280,7 @@ static inline float u64_to_double(u64 value)
void debug_view_memory::generate_row(debug_view_char *destmin, debug_view_char *destmax, debug_view_char *destrow, offs_t address)
{
// get positional data
- const memory_view_pos &posdata = s_memory_pos_table[m_data_format];
+ const memory_view_pos &posdata = get_posdata(m_data_format);
int spacing = posdata.m_spacing;
// generate the address
@@ -277,7 +293,7 @@ void debug_view_memory::generate_row(debug_view_char *destmin, debug_view_char *
// generate the data and the ascii string
std::string chunkascii;
- if (m_data_format <= 8)
+ if (is_hex_format(m_data_format))
{
for (int chunknum = 0; chunknum < m_chunks_per_row; chunknum++)
{
@@ -310,7 +326,7 @@ void debug_view_memory::generate_row(debug_view_char *destmin, debug_view_char *
extFloat80_t chunkdata80 = { 0, 0 };
bool ismapped;
- if (m_data_format != 11)
+ if (m_data_format != data_format::FLOAT_80BIT)
ismapped = read(m_bytes_per_chunk, address + chunknum * m_steps_per_chunk, chunkdata);
else
ismapped = read(m_bytes_per_chunk, address + chunknum * m_steps_per_chunk, chunkdata80);
@@ -318,17 +334,21 @@ void debug_view_memory::generate_row(debug_view_char *destmin, debug_view_char *
if (ismapped)
switch (m_data_format)
{
- case 9:
+ case data_format::FLOAT_32BIT:
sprintf(valuetext, "%.8g", u32_to_float(u32(chunkdata)));
break;
- case 10:
+ case data_format::FLOAT_64BIT:
sprintf(valuetext, "%.24g", u64_to_double(chunkdata));
break;
- case 11:
+ case data_format::FLOAT_80BIT:
+ {
float64_t f64 = extF80M_to_f64(&chunkdata80);
sprintf(valuetext, "%.24g", u64_to_double(f64.v));
break;
}
+ default:
+ break;
+ }
else
{
valuetext[0] = '*';
@@ -621,10 +641,10 @@ void debug_view_memory::recompute()
// compute the section widths
m_section[0].m_width = 1 + 8 + 1;
- if (m_data_format <= 8)
+ if (is_hex_format(m_data_format))
m_section[1].m_width = 1 + 3 * m_bytes_per_row + 1;
else {
- const memory_view_pos &posdata = s_memory_pos_table[m_data_format];
+ const memory_view_pos &posdata = get_posdata(m_data_format);
m_section[1].m_width = 1 + posdata.m_spacing * m_chunks_per_row + 1;
}
@@ -693,11 +713,11 @@ debug_view_memory::cursor_pos debug_view_memory::get_cursor_pos(const debug_view
{
// start with the base address for this row
cursor_pos pos;
- const memory_view_pos &posdata = s_memory_pos_table[m_data_format];
+ const memory_view_pos &posdata = get_posdata(m_data_format);
pos.m_address = m_byte_offset + cursor.y * m_bytes_per_chunk * m_chunks_per_row;
// determine the X position within the middle section, clamping as necessary
- if (m_data_format <= 8) {
+ if (is_hex_format(m_data_format)) {
int xposition = cursor.x - m_section[1].m_pos - 1;
if (xposition < 0)
xposition = 0;
@@ -744,7 +764,7 @@ debug_view_memory::cursor_pos debug_view_memory::get_cursor_pos(const debug_view
void debug_view_memory::set_cursor_pos(cursor_pos pos)
{
- const memory_view_pos &posdata = s_memory_pos_table[m_data_format];
+ const memory_view_pos &posdata = get_posdata(m_data_format);
// offset the address by the byte offset
if (pos.m_address < m_byte_offset)
@@ -759,7 +779,7 @@ void debug_view_memory::set_cursor_pos(cursor_pos pos)
if (m_reverse_view)
chunknum = m_chunks_per_row - 1 - chunknum;
- if (m_data_format <= 8) {
+ if (is_hex_format(m_data_format)) {
// scan within the chunk to find the shift
for (m_cursor.x = 0; m_cursor.x < posdata.m_spacing; m_cursor.x++)
if (posdata.m_shift[m_cursor.x] == pos.m_shift)
@@ -965,15 +985,15 @@ void debug_view_memory::set_chunks_per_row(u32 rowchunks)
//-------------------------------------------------
// set_data_format - specify what kind of values
-// are shown, 1-8 8-64 bits, 9 32bit floating point
+// are shown
//-------------------------------------------------
-void debug_view_memory::set_data_format(int format)
+void debug_view_memory::set_data_format(data_format format)
{
cursor_pos pos;
// should never be
- if ((format <= 0) || (format > 11))
+ if (!is_valid_format(format))
return;
// no need to change
if (format == m_data_format)
@@ -981,45 +1001,33 @@ void debug_view_memory::set_data_format(int format)
pos = begin_update_and_get_cursor_pos();
const debug_view_memory_source &source = downcast<const debug_view_memory_source &>(*m_source);
- if ((format <= 8) && (m_data_format <= 8)) {
-
+ if (is_hex_format(format) && is_hex_format(m_data_format)) {
pos.m_address += (pos.m_shift / 8) ^ ((source.m_endianness == ENDIANNESS_LITTLE) ? 0 : (m_bytes_per_chunk - 1));
pos.m_shift %= 8;
- m_bytes_per_chunk = format;
+ m_bytes_per_chunk = get_posdata(format).m_bytes;
m_steps_per_chunk = source.m_space ? source.m_space->byte_to_address(m_bytes_per_chunk) : m_bytes_per_chunk;
- m_chunks_per_row = m_bytes_per_row / format;
+ m_chunks_per_row = m_bytes_per_row / m_bytes_per_chunk;
if (m_chunks_per_row < 1)
m_chunks_per_row = 1;
pos.m_shift += 8 * ((pos.m_address % m_bytes_per_chunk) ^ ((source.m_endianness == ENDIANNESS_LITTLE) ? 0 : (m_bytes_per_chunk - 1)));
pos.m_address -= pos.m_address % m_bytes_per_chunk;
} else {
- if (format <= 8) {
+ if (is_hex_format(format)) {
m_supports_cursor = true;
m_edit_enabled = true;
-
- m_bytes_per_chunk = format;
}
else {
m_supports_cursor = false;
m_edit_enabled = false;
m_cursor_visible = false;
-
- switch (format)
- {
- case 9:
- m_bytes_per_chunk = 4;
- break;
- case 10:
- m_bytes_per_chunk = 8;
- break;
- case 11:
- m_bytes_per_chunk = 10;
- break;
- }
}
+
+ m_bytes_per_chunk = get_posdata(format).m_bytes;
m_chunks_per_row = m_bytes_per_row / m_bytes_per_chunk;
+ if (m_chunks_per_row < 1)
+ m_chunks_per_row = 1;
m_steps_per_chunk = source.m_space ? source.m_space->byte_to_address(m_bytes_per_chunk) : m_bytes_per_chunk;
pos.m_shift = 0;
pos.m_address -= pos.m_address % m_bytes_per_chunk;
diff --git a/src/emu/debug/dvmemory.h b/src/emu/debug/dvmemory.h
index 8aa5df7cbeb..da92ae43bf7 100644
--- a/src/emu/debug/dvmemory.h
+++ b/src/emu/debug/dvmemory.h
@@ -55,10 +55,24 @@ class debug_view_memory : public debug_view
// construction/destruction
debug_view_memory(running_machine &machine, debug_view_osd_update_func osdupdate, void *osdprivate);
+ struct memory_view_pos;
+
public:
+ enum class data_format
+ {
+ HEX_8BIT = 1,
+ HEX_16BIT = 2,
+ HEX_32BIT = 4,
+ HEX_64BIT = 8,
+ FLOAT_32BIT = 9,
+ FLOAT_64BIT = 10,
+ FLOAT_80BIT = 11
+ };
+ static bool is_valid_format(data_format format) { return int(format) >= 0 && int(format) < std::size(s_memory_pos_table) && get_posdata(format).m_bytes != 0; }
+
// getters
const char *expression() const { return m_expression.string(); }
- int get_data_format() { flush_updates(); return m_data_format; }
+ data_format get_data_format() { flush_updates(); return m_data_format; }
u32 chunks_per_row() { flush_updates(); return m_chunks_per_row; }
bool reverse() const { return m_reverse_view; }
bool ascii() const { return m_ascii_view; }
@@ -68,7 +82,7 @@ public:
// setters
void set_expression(const std::string &expression);
void set_chunks_per_row(u32 rowchunks);
- void set_data_format(int format); // 1-8 current values 9 32bit floating point
+ void set_data_format(data_format format);
void set_reverse(bool reverse);
void set_ascii(bool reverse);
void set_physical(bool physical);
@@ -88,6 +102,10 @@ private:
u8 m_shift;
};
+ // data format helpers
+ static bool is_hex_format(data_format format) { return int(format) <= 8; }
+ static const memory_view_pos &get_posdata(data_format format) { return s_memory_pos_table[int(format)]; }
+
// internal helpers
void enumerate_sources();
void recompute();
@@ -111,7 +129,7 @@ private:
u32 m_chunks_per_row; // number of chunks displayed per line
u8 m_bytes_per_chunk; // bytes per chunk
u8 m_steps_per_chunk; // bytes per chunk
- int m_data_format; // 1-8 current values 9 32bit floating point
+ data_format m_data_format; // 1-8 current values 9 32bit floating point
bool m_reverse_view; // reverse-endian view?
bool m_ascii_view; // display ASCII characters?
bool m_no_translation; // don't run addresses through the cpu translation hook
@@ -131,8 +149,9 @@ private:
struct memory_view_pos
{
- u8 m_spacing; /* spacing between each entry */
- u8 m_shift[24]; /* shift for each character */
+ u8 m_bytes; // bytes per entry
+ u8 m_spacing; // spacing between each entry
+ u8 m_shift[24]; // shift for each character
};
static const memory_view_pos s_memory_pos_table[12]; // table for rendering at different data formats
diff --git a/src/emu/debug/points.cpp b/src/emu/debug/points.cpp
index 688881a40e6..c44bc3f7563 100644
--- a/src/emu/debug/points.cpp
+++ b/src/emu/debug/points.cpp
@@ -371,18 +371,29 @@ void debug_watchpoint::triggered(read_or_write type, offs_t address, u64 data, u
{
std::string buffer;
- buffer = string_format(type == read_or_write::READ ?
- "Stopped at watchpoint %X reading %0*X from %08X" :
- "Stopped at watchpoint %X writing %0*X to %08X",
- m_index,
- size * unit_size / 4,
- data,
- address);
-
- if (debug.cpu().live_cpu() == &m_debugInterface->device())
+ if (m_space.is_octal())
+ buffer = string_format(type == read_or_write::READ ?
+ "Stopped at watchpoint %X reading %0*o from %0*o" :
+ "Stopped at watchpoint %X writing %0*o to %0*o",
+ m_index,
+ (size * unit_size + 2) / 3,
+ data,
+ (m_space.addr_width() + 2) / 3,
+ address);
+ else
+ buffer = string_format(type == read_or_write::READ ?
+ "Stopped at watchpoint %X reading %0*X from %0*X" :
+ "Stopped at watchpoint %X writing %0*X to %0*X",
+ m_index,
+ size * unit_size / 4,
+ data,
+ (m_space.addr_width() + 3) / 4,
+ address);
+
+ const device_state_interface *state;
+ if (debug.cpu().live_cpu() == &m_debugInterface->device() && m_debugInterface->device().interface(state))
{
- offs_t pc = m_debugInterface->device().state().pcbase();
- debug.console().printf("%s (PC=%X)\n", buffer, pc);
+ debug.console().printf("%s (PC=%s)\n", buffer, state->state_string(STATE_GENPCBASE));
m_debugInterface->compute_debug_flags();
}
else if (!was_stopped)
diff --git a/src/emu/devcb.h b/src/emu/devcb.h
index ec543aa48d6..d27d3beb74d 100644
--- a/src/emu/devcb.h
+++ b/src/emu/devcb.h
@@ -82,16 +82,16 @@ protected:
template <typename T, typename U> using mask_t = std::make_unsigned_t<intermediate_t<T, U> >;
// Detecting candidates for transform functions
- template <typename Input, typename Result, typename Func, typename Enable = void> struct is_transform_form1 { static constexpr bool value = false; };
- template <typename Input, typename Result, typename Func, typename Enable = void> struct is_transform_form2 { static constexpr bool value = false; };
- template <typename Input, typename Result, typename Func, typename Enable = void> struct is_transform_form3 { static constexpr bool value = false; };
- template <typename Input, typename Result, typename Func, typename Enable = void> struct is_transform_form4 { static constexpr bool value = false; };
- template <typename Input, typename Result, typename Func, typename Enable = void> struct is_transform_form5 { static constexpr bool value = false; };
- template <typename Input, typename Result, typename Func, typename Enable = void> struct is_transform_form6 { static constexpr bool value = false; };
- template <typename Input, typename Result, typename Func> struct is_transform_form3<Input, Result, Func, std::enable_if_t<std::is_convertible<std::invoke_result_t<Func, offs_t &, Input, std::make_unsigned_t<Input> &>, Result>::value> > { static constexpr bool value = true; };
- template <typename Input, typename Result, typename Func> struct is_transform_form4<Input, Result, Func, std::enable_if_t<std::is_convertible<std::invoke_result_t<Func, offs_t &, Input>, Result>::value> > { static constexpr bool value = true; };
- template <typename Input, typename Result, typename Func> struct is_transform_form6<Input, Result, Func, std::enable_if_t<std::is_convertible<std::invoke_result_t<Func, Input>, Result>::value> > { static constexpr bool value = true; };
- template <typename Input, typename Result, typename Func> struct is_transform { static constexpr bool value = is_transform_form1<Input, Result, Func>::value || is_transform_form2<Input, Result, Func>::value || is_transform_form3<Input, Result, Func>::value || is_transform_form4<Input, Result, Func>::value || is_transform_form5<Input, Result, Func>::value || is_transform_form6<Input, Result, Func>::value; };
+ template <typename Input, typename Result, typename Func, typename Enable = void> struct is_transform_form1 : public std::false_type { };
+ template <typename Input, typename Result, typename Func, typename Enable = void> struct is_transform_form2 : public std::false_type { };
+ template <typename Input, typename Result, typename Func, typename Enable = void> struct is_transform_form3 : public std::false_type { };
+ template <typename Input, typename Result, typename Func, typename Enable = void> struct is_transform_form4 : public std::false_type { };
+ template <typename Input, typename Result, typename Func, typename Enable = void> struct is_transform_form5 : public std::false_type { };
+ template <typename Input, typename Result, typename Func, typename Enable = void> struct is_transform_form6 : public std::false_type { };
+ template <typename Input, typename Result, typename Func> struct is_transform_form3<Input, Result, Func, std::enable_if_t<std::is_convertible<std::invoke_result_t<Func, offs_t &, Input, std::make_unsigned_t<Input> &>, Result>::value> > : public std::true_type { };
+ template <typename Input, typename Result, typename Func> struct is_transform_form4<Input, Result, Func, std::enable_if_t<std::is_convertible<std::invoke_result_t<Func, offs_t &, Input>, Result>::value> > : public std::true_type { };
+ template <typename Input, typename Result, typename Func> struct is_transform_form6<Input, Result, Func, std::enable_if_t<std::is_convertible<std::invoke_result_t<Func, Input>, Result>::value> > : public std::true_type { };
+ template <typename Input, typename Result, typename Func> struct is_transform : public std::bool_constant<is_transform_form1<Input, Result, Func>::value || is_transform_form2<Input, Result, Func>::value || is_transform_form3<Input, Result, Func>::value || is_transform_form4<Input, Result, Func>::value || is_transform_form5<Input, Result, Func>::value || is_transform_form6<Input, Result, Func>::value> { };
// Determining the result type of a transform function
template <typename Input, typename Result, typename Func, typename Enable = void> struct transform_result;
@@ -211,13 +211,13 @@ class devcb_read_base : public devcb_base
{
protected:
// Detecting candidates for read functions
- template <typename Result, typename Func, typename Enable = void> struct is_read_form1 { static constexpr bool value = false; };
- template <typename Result, typename Func, typename Enable = void> struct is_read_form2 { static constexpr bool value = false; };
- template <typename Result, typename Func, typename Enable = void> struct is_read_form3 { static constexpr bool value = false; };
- template <typename Result, typename Func> struct is_read_form1<Result, Func, std::enable_if_t<std::is_convertible<std::invoke_result_t<Func, offs_t, Result>, Result>::value> > { static constexpr bool value = true; };
- template <typename Result, typename Func> struct is_read_form2<Result, Func, std::enable_if_t<std::is_convertible<std::invoke_result_t<Func, offs_t>, Result>::value> > { static constexpr bool value = true; };
- template <typename Result, typename Func> struct is_read_form3<Result, Func, std::enable_if_t<std::is_convertible<std::invoke_result_t<Func>, Result>::value> > { static constexpr bool value = true; };
- template <typename Result, typename Func> struct is_read { static constexpr bool value = is_read_form1<Result, Func>::value || is_read_form2<Result, Func>::value || is_read_form3<Result, Func>::value; };
+ template <typename Result, typename Func, typename Enable = void> struct is_read_form1 : public std::false_type { };
+ template <typename Result, typename Func, typename Enable = void> struct is_read_form2 : public std::false_type { };
+ template <typename Result, typename Func, typename Enable = void> struct is_read_form3 : public std::false_type { };
+ template <typename Result, typename Func> struct is_read_form1<Result, Func, std::enable_if_t<std::is_convertible<std::invoke_result_t<Func, offs_t, Result>, Result>::value> > : public std::true_type { };
+ template <typename Result, typename Func> struct is_read_form2<Result, Func, std::enable_if_t<std::is_convertible<std::invoke_result_t<Func, offs_t>, Result>::value> > : public std::true_type { };
+ template <typename Result, typename Func> struct is_read_form3<Result, Func, std::enable_if_t<std::is_convertible<std::invoke_result_t<Func>, Result>::value> > : public std::true_type { };
+ template <typename Result, typename Func> struct is_read : public std::bool_constant<is_read_form1<Result, Func>::value || is_read_form2<Result, Func>::value || is_read_form3<Result, Func>::value> { };
// Determining the result type of a read function
template <typename Result, typename Func, typename Enable = void> struct read_result;
@@ -227,20 +227,20 @@ protected:
template <typename Result, typename Func> using read_result_t = typename read_result<Result, Func>::type;
// Detecting candidates for read delegates
- template <typename T, typename Enable = void> struct is_read_method { static constexpr bool value = false; };
- template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read8s_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read16s_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read32s_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read64s_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read8sm_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read16sm_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read32sm_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read64sm_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read8smo_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read16smo_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read32smo_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read64smo_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read_line_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
+ template <typename T, typename Enable = void> struct is_read_method : public std::false_type { };
+ template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read8s_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read16s_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read32s_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read64s_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read8sm_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read16sm_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read32sm_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read64sm_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read8smo_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read16smo_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read32smo_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read64smo_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read_line_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
// Invoking read callbacks
template <typename Result, typename T> static std::enable_if_t<is_read_form1<Result, T>::value, mask_t<read_result_t<Result, T>, Result> > invoke_read(T const &cb, offs_t offset, std::make_unsigned_t<Result> mem_mask) { return std::make_unsigned_t<read_result_t<Result, T> >(cb(offset, mem_mask)); }
@@ -275,29 +275,29 @@ class devcb_write_base : public devcb_base
{
protected:
// Detecting candidates for write functions
- template <typename Input, typename Func, typename Enable = void> struct is_write_form1 { static constexpr bool value = false; };
- template <typename Input, typename Func, typename Enable = void> struct is_write_form2 { static constexpr bool value = false; };
- template <typename Input, typename Func, typename Enable = void> struct is_write_form3 { static constexpr bool value = false; };
- template <typename Input, typename Func> struct is_write_form1<Input, Func, void_t<std::invoke_result_t<Func, offs_t, Input, std::make_unsigned_t<Input>> > > { static constexpr bool value = true; };
- template <typename Input, typename Func> struct is_write_form2<Input, Func, void_t<std::invoke_result_t<Func, offs_t, Input> > > { static constexpr bool value = true; };
- template <typename Input, typename Func> struct is_write_form3<Input, Func, void_t<std::invoke_result_t<Func, Input> > > { static constexpr bool value = true; };
- template <typename Input, typename Func> struct is_write { static constexpr bool value = is_write_form1<Input, Func>::value || is_write_form2<Input, Func>::value || is_write_form3<Input, Func>::value; };
+ template <typename Input, typename Func, typename Enable = void> struct is_write_form1 : public std::false_type { };
+ template <typename Input, typename Func, typename Enable = void> struct is_write_form2 : public std::false_type { };
+ template <typename Input, typename Func, typename Enable = void> struct is_write_form3 : public std::false_type { };
+ template <typename Input, typename Func> struct is_write_form1<Input, Func, void_t<std::invoke_result_t<Func, offs_t, Input, std::make_unsigned_t<Input>> > > : public std::true_type { };
+ template <typename Input, typename Func> struct is_write_form2<Input, Func, void_t<std::invoke_result_t<Func, offs_t, Input> > > : public std::true_type { };
+ template <typename Input, typename Func> struct is_write_form3<Input, Func, void_t<std::invoke_result_t<Func, Input> > > : public std::true_type { };
+ template <typename Input, typename Func> struct is_write : public std::bool_constant<is_write_form1<Input, Func>::value || is_write_form2<Input, Func>::value || is_write_form3<Input, Func>::value> { };
// Detecting candidates for write delegates
- template <typename T, typename Enable = void> struct is_write_method { static constexpr bool value = false; };
- template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write8s_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write16s_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write32s_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write64s_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write8sm_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write16sm_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write32sm_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write64sm_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write8smo_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write16smo_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write32smo_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write64smo_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
- template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write_line_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; };
+ template <typename T, typename Enable = void> struct is_write_method : public std::false_type { };
+ template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write8s_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write16s_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write32s_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write64s_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write8sm_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write16sm_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write32sm_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write64sm_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write8smo_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write16smo_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write32smo_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write64smo_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
+ template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write_line_delegate, std::remove_reference_t<T> > > > : public std::true_type { };
// Invoking write callbacks
template <typename Input, typename T> static std::enable_if_t<is_write_form1<Input, T>::value> invoke_write(T const &cb, offs_t &offset, Input data, std::make_unsigned_t<Input> mem_mask) { return cb(offset, data, mem_mask); }
diff --git a/src/emu/devdelegate.h b/src/emu/devdelegate.h
index 1ba303d3ef3..906e1da9274 100644
--- a/src/emu/devdelegate.h
+++ b/src/emu/devdelegate.h
@@ -111,12 +111,12 @@ class device_delegate<ReturnType (Params...)> : protected named_delegate<ReturnT
private:
using basetype = named_delegate<ReturnType (Params...)>;
- template <class T, class U> struct is_related_device_implementation
- { static constexpr bool value = std::is_base_of<T, U>::value && std::is_base_of<device_t, U>::value; };
- template <class T, class U> struct is_related_device_interface
- { static constexpr bool value = std::is_base_of<T, U>::value && std::is_base_of<device_interface, U>::value && !std::is_base_of<device_t, U>::value; };
- template <class T, class U> struct is_related_device
- { static constexpr bool value = is_related_device_implementation<T, U>::value || is_related_device_interface<T, U>::value; };
+ template <class T, class U>
+ using is_related_device_implementation = std::bool_constant<std::is_base_of_v<T, U> && std::is_base_of_v<device_t, U> >;
+ template <class T, class U>
+ using is_related_device_interface = std::bool_constant<std::is_base_of_v<T, U> && std::is_base_of_v<device_interface, U> && !std::is_base_of_v<device_t, U> >;
+ template <class T, class U>
+ using is_related_device = std::bool_constant<is_related_device_implementation<T, U>::value || is_related_device_interface<T, U>::value>;
template <class T> static std::enable_if_t<is_related_device_implementation<T, T>::value, device_t &> get_device(T &object) { return object; }
template <class T> static std::enable_if_t<is_related_device_interface<T, T>::value, device_t &> get_device(T &object) { return object.device(); }
@@ -124,8 +124,8 @@ private:
public:
template <unsigned Count> using array = device_delegate_array<ReturnType (Params...), Count>;
- template <typename T> struct supports_callback
- { static constexpr bool value = std::is_constructible<device_delegate, device_t &, char const *, T, char const *>::value; };
+ template <typename T>
+ using supports_callback = std::bool_constant<std::is_constructible_v<device_delegate, device_t &, char const *, T, char const *> >;
// construct/assign
explicit device_delegate(device_t &owner) : basetype(), detail::device_delegate_helper(owner) { }
diff --git a/src/emu/devfind.h b/src/emu/devfind.h
index c5f7a04929a..c8884d9582f 100644
--- a/src/emu/devfind.h
+++ b/src/emu/devfind.h
@@ -308,7 +308,7 @@ public:
}
/// \brief Dummy tag always treated as not found
- constexpr static char DUMMY_TAG[17] = "finder_dummy_tag";
+ static constexpr char DUMMY_TAG[17] = "finder_dummy_tag";
protected:
/// \brief Designated constructor
@@ -350,8 +350,6 @@ protected:
/// report_missing to print an error message if the region is
/// not found. Returns true if the region is required but no
/// matching region is found, or false otherwise.
- /// \param [in] bytes Desired region length in bytes, or 0U to match
- /// any length.
/// \param [in] required True if the region is required, or false if
/// it is optional.
/// \return True if the region is optional, or if the region is
@@ -1059,8 +1057,6 @@ public:
/// \param [in] tag Memory region tag to search for. This is not
/// copied, it is the caller's responsibility to ensure this
/// pointer remains valid until resolution time.
- /// \param [in] length Desired memory region length in units of the
- /// size of the element type, or zero to match any region length.
region_ptr_finder(device_t &base, char const *tag)
: object_finder_base<PointerType, Required>(base, tag)
, m_length(0)
diff --git a/src/emu/device.cpp b/src/emu/device.cpp
index d1e9cc245c0..f6ed21643aa 100644
--- a/src/emu/device.cpp
+++ b/src/emu/device.cpp
@@ -135,6 +135,8 @@ std::vector<std::string> device_t::searchpath() const
system = system->owner();
if (system)
result = system->searchpath();
+ if (type().parent_rom_device_type())
+ result.emplace(result.begin(), type().parent_rom_device_type()->shortname());
result.emplace(result.begin(), shortname());
return result;
}
diff --git a/src/emu/device.h b/src/emu/device.h
index f5a61fbdc30..def0748ff4e 100644
--- a/src/emu/device.h
+++ b/src/emu/device.h
@@ -69,15 +69,11 @@ namespace emu::detail {
class device_type_impl_base;
-template <typename T> struct is_device_implementation
-{
- static constexpr bool value = std::is_base_of<device_t, T>::value;
-};
+template <typename T>
+using is_device_implementation = std::bool_constant<std::is_base_of_v<device_t, T> >;
-template <typename T> struct is_device_interface
-{
- static constexpr bool value = std::is_base_of<device_interface, T>::value && !is_device_implementation<T>::value;
-};
+template <typename T>
+using is_device_interface = std::bool_constant<std::is_base_of_v<device_interface, T> && !is_device_implementation<T>::value>;
struct device_feature
@@ -224,6 +220,7 @@ private:
char const *const m_source;
device_feature::type const m_unemulated_features;
device_feature::type const m_imperfect_features;
+ device_type_impl_base const *const m_parent_rom;
device_type_impl_base *m_next;
@@ -238,6 +235,7 @@ public:
, m_source(nullptr)
, m_unemulated_features(device_feature::NONE)
, m_imperfect_features(device_feature::NONE)
+ , m_parent_rom(nullptr)
, m_next(nullptr)
{
}
@@ -251,6 +249,7 @@ public:
, m_source(Source)
, m_unemulated_features(DeviceClass::unemulated_features())
, m_imperfect_features(DeviceClass::imperfect_features())
+ , m_parent_rom(DeviceClass::parent_rom_device_type())
, m_next(device_registrar::register_device(*this))
{
}
@@ -264,6 +263,7 @@ public:
, m_source(Source)
, m_unemulated_features(DriverClass::unemulated_features() | Unemulated)
, m_imperfect_features((DriverClass::imperfect_features() & ~Unemulated) | Imperfect)
+ , m_parent_rom(DriverClass::parent_rom_device_type())
, m_next(nullptr)
{
}
@@ -274,6 +274,7 @@ public:
char const *source() const { return m_source; }
device_feature::type unemulated_features() const { return m_unemulated_features; }
device_feature::type imperfect_features() const { return m_imperfect_features; }
+ device_type_impl_base const *parent_rom_device_type() const { return m_parent_rom; }
std::unique_ptr<device_t> create(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) const
{
@@ -334,42 +335,126 @@ template <
emu::detail::device_feature::type Imperfect>
constexpr auto driver_device_creator = &emu::detail::driver_tag_func<DriverClass, ShortName, FullName, Source, Unemulated, Imperfect>;
+
+/// \addtogroup machinedef
+/// \{
+
+/// \brief Declare a device type
+///
+/// Declares a device type where the exposed device class is in the
+/// global namespace. Must be used in the global namespace.
+///
+/// In addition to declaring the device type itself, a forward
+/// declaration for the exposed device class is generated, and automatic
+/// instantiation of device finder templates for the exposed device
+/// class is suppressed.
+/// \param Type The device type name (an identifier). By convention,
+/// these start with an uppercase letter and consist only of uppercase
+/// letters and underscores.
+/// \param Class The exposed device class name. Must be the device
+/// implementation class, or a public base of it, and must be derived
+/// from #device_t.
+/// \sa DECLARE_DEVICE_TYPE_NS DEFINE_DEVICE_TYPE
+/// DEFINE_DEVICE_TYPE_PRIVATE
#define DECLARE_DEVICE_TYPE(Type, Class) \
class Class; \
- extern emu::detail::device_type_impl<Class> const &Type; \
+ extern emu::detail::device_type_impl<Class> const Type; \
extern template class device_finder<Class, false>; \
extern template class device_finder<Class, true>;
+
+/// \brief Declare a device type for a class in a namespace
+///
+/// Declares a device type where the exposed device class is not in the
+/// global namespace. Must be used in the global namespace.
+///
+/// In addition to declaring the device type itself, a forward
+/// declaration for the exposed device class is generated, and automatic
+/// instantiation of device finder templates for the exposed device
+/// class is suppressed.
+/// \param Type The device type name (an identifier). By convention,
+/// these start with an uppercase letter and consist only of uppercase
+/// letters and underscores.
+/// \param Namespace The fully qualified name of the namespace
+/// containing the exposed device class.
+/// \param Class The exposed device class name, without namespace
+/// qualifiers. Must be the device implementation class, or a public
+/// base of it, and must be derived from #device_t.
+/// \sa DECLARE_DEVICE_TYPE DEFINE_DEVICE_TYPE
+/// DEFINE_DEVICE_TYPE_PRIVATE
#define DECLARE_DEVICE_TYPE_NS(Type, Namespace, Class) \
namespace Namespace { class Class; } \
- extern emu::detail::device_type_impl<Namespace::Class> const &Type; \
+ extern emu::detail::device_type_impl<Namespace::Class> const Type; \
extern template class device_finder<Namespace::Class, false>; \
extern template class device_finder<Namespace::Class, true>;
+
+/// \brief Define a device type
+///
+/// Defines a device type where the exposed device class is the same as
+/// the device implementation class. Must be used in the global
+/// namespace.
+///
+/// As well as defining the device type, device finder templates are
+/// instantiated for the device class.
+/// \param Type The device type name (an identifier). By convention,
+/// these start with an uppercase letter and consist only of uppercase
+/// letters and underscores.
+/// \param Class The device implementation class name. Must be the same
+/// as the exposed device class, and must be derived from #device_t.
+/// \param ShortName The short name of the device, used for
+/// identification, and in filesystem paths for assets and data. Must
+/// be a string no longer than thirty-two characters, containing only
+/// ASCII lowercase letters, digits and underscores. Must be globally
+/// unique across systems and devices.
+/// \param FullName Display name for the device. Must be a string, and
+/// must be globally unique across systems and devices.
+/// \sa DECLARE_DEVICE_TYPE DECLARE_DEVICE_TYPE_NS
+/// DEFINE_DEVICE_TYPE_PRIVATE
#define DEFINE_DEVICE_TYPE(Type, Class, ShortName, FullName) \
namespace { \
- struct Class##_device_traits { static constexpr char const shortname[] = ShortName, fullname[] = FullName, source[] = __FILE__; }; \
- constexpr char const Class##_device_traits::shortname[], Class##_device_traits::fullname[], Class##_device_traits::source[]; \
+ struct Type##_device_traits { static constexpr char const shortname[] = ShortName, fullname[] = FullName, source[] = __FILE__; }; \
+ constexpr char const Type##_device_traits::shortname[], Type##_device_traits::fullname[], Type##_device_traits::source[]; \
} \
- emu::detail::device_type_impl<Class> const &Type = device_creator<Class, (Class##_device_traits::shortname), (Class##_device_traits::fullname), (Class##_device_traits::source)>; \
+ emu::detail::device_type_impl<Class> const Type = device_creator<Class, (Type##_device_traits::shortname), (Type##_device_traits::fullname), (Type##_device_traits::source)>; \
template class device_finder<Class, false>; \
template class device_finder<Class, true>;
+
+/// \brief Define a device type with a private implementation class
+///
+/// Defines a device type where the exposed device class is a base of
+/// the device implementation class. Must be used in the global
+/// namespace.
+///
+/// Device finder templates are not instantiated for the exposed device
+/// class. This must be done explicitly in a single location for the
+/// project.
+/// \param Type The device type name (an identifier). By convention,
+/// these start with an uppercase letter and consist only of uppercase
+/// letters and underscores.
+/// \param Base The fully-qualified exposed device class name. Must be
+/// a public base of the device implementation class, and must be
+/// derived from #device_t.
+/// \param Class The fully-qualified device implementation class name.
+/// Must be derived from the exposed device class, and indirectly from
+/// #device_t.
+/// \param ShortName The short name of the device, used for
+/// identification, and in filesystem paths for assets and data. Must
+/// be a string no longer than thirty-two characters, containing only
+/// ASCII lowercase letters, digits and underscores. Must be globally
+/// unique across systems and devices.
+/// \param FullName Display name for the device. Must be a string, and
+/// must be globally unique across systems and devices.
+/// \sa DECLARE_DEVICE_TYPE DECLARE_DEVICE_TYPE_NS DEFINE_DEVICE_TYPE
#define DEFINE_DEVICE_TYPE_PRIVATE(Type, Base, Class, ShortName, FullName) \
namespace { \
- struct Class##_device_traits { static constexpr char const shortname[] = ShortName, fullname[] = FullName, source[] = __FILE__; }; \
- constexpr char const Class##_device_traits::shortname[], Class##_device_traits::fullname[], Class##_device_traits::source[]; \
+ struct Type##_device_traits { static constexpr char const shortname[] = ShortName, fullname[] = FullName, source[] = __FILE__; }; \
+ constexpr char const Type##_device_traits::shortname[], Type##_device_traits::fullname[], Type##_device_traits::source[]; \
} \
- emu::detail::device_type_impl<Base> const &Type = device_creator<Class, (Class##_device_traits::shortname), (Class##_device_traits::fullname), (Class##_device_traits::source)>;
+ emu::detail::device_type_impl<Base> const Type = device_creator<Class, (Type##_device_traits::shortname), (Type##_device_traits::fullname), (Type##_device_traits::source)>;
-#define DEFINE_DEVICE_TYPE_NS(Type, Namespace, Class, ShortName, FullName) \
- namespace { \
- struct Class##_device_traits { static constexpr char const shortname[] = ShortName, fullname[] = FullName, source[] = __FILE__; }; \
- constexpr char const Class##_device_traits::shortname[], Class##_device_traits::fullname[], Class##_device_traits::source[]; \
- } \
- emu::detail::device_type_impl<Namespace::Class> const &Type = device_creator<Namespace::Class, (Class##_device_traits::shortname), (Class##_device_traits::fullname), (Class##_device_traits::source)>; \
- template class device_finder<Namespace::Class, false>; \
- template class device_finder<Namespace::Class, true>;
+/// \}
// exception classes
@@ -432,7 +517,6 @@ class device_t : public delegate_late_bind
friend class device_t;
friend class device_interface;
friend class device_memory_interface;
- friend class device_state_interface;
friend class device_execute_interface;
public:
@@ -462,7 +546,7 @@ class device_t : public delegate_late_bind
};
// construction/destruction
- interface_list() : m_head(nullptr), m_execute(nullptr), m_memory(nullptr), m_state(nullptr) { }
+ interface_list() : m_head(nullptr), m_execute(nullptr), m_memory(nullptr) { }
// getters
device_interface *first() const { return m_head; }
@@ -475,7 +559,6 @@ class device_t : public delegate_late_bind
device_interface *m_head; // head of interface list
device_execute_interface *m_execute; // pre-cached pointer to execute interface
device_memory_interface *m_memory; // pre-cached pointer to memory interface
- device_state_interface *m_state; // pre-cached pointer to state interface
};
protected:
@@ -521,6 +604,15 @@ public:
/// \sa unemulated_features
static constexpr feature_type imperfect_features() { return feature::NONE; }
+ /// \brief Get parent device type for ROM search
+ ///
+ /// Implement this member in a derived class to declare the parent
+ /// device type for the purpose of searching for ROMs. Only one
+ /// level is allowed. It is an error if the parent device type
+ /// itself declares a parent device type.
+ /// \return Pointer to parent device type, or nullptr.
+ static auto parent_rom_device_type() { return nullptr; }
+
virtual ~device_t();
// getters
@@ -557,11 +649,8 @@ public:
bool interface(device_execute_interface *&intf) const { intf = m_interfaces.m_execute; return (intf != nullptr); }
bool interface(device_memory_interface *&intf) { intf = m_interfaces.m_memory; return (intf != nullptr); }
bool interface(device_memory_interface *&intf) const { intf = m_interfaces.m_memory; return (intf != nullptr); }
- bool interface(device_state_interface *&intf) { intf = m_interfaces.m_state; return (intf != nullptr); }
- bool interface(device_state_interface *&intf) const { intf = m_interfaces.m_state; return (intf != nullptr); }
device_execute_interface &execute() const { assert(m_interfaces.m_execute != nullptr); return *m_interfaces.m_execute; }
device_memory_interface &memory() const { assert(m_interfaces.m_memory != nullptr); return *m_interfaces.m_memory; }
- device_state_interface &state() const { assert(m_interfaces.m_state != nullptr); return *m_interfaces.m_state; }
// owned object helpers
subdevice_list &subdevices() { return m_subdevices; }
diff --git a/src/emu/diimage.cpp b/src/emu/diimage.cpp
index 55a9193f3f1..e38b4939a2b 100644
--- a/src/emu/diimage.cpp
+++ b/src/emu/diimage.cpp
@@ -10,14 +10,15 @@
#include "emu.h"
-#include "corestr.h"
#include "emuopts.h"
#include "romload.h"
-#include "ui/uimain.h"
-#include "zippath.h"
#include "softlist.h"
#include "softlist_dev.h"
-#include "formats/ioprocs.h"
+
+#include "ui/uimain.h"
+
+#include "corestr.h"
+#include "zippath.h"
#include <algorithm>
#include <cctype>
@@ -270,11 +271,8 @@ void device_image_interface::add_format(std::string &&name, std::string &&descri
void device_image_interface::clear_error()
{
- m_err = IMAGE_ERROR_SUCCESS;
- if (!m_err_message.empty())
- {
- m_err_message.clear();
- }
+ m_err.clear();
+ m_err_message.clear();
}
@@ -284,21 +282,38 @@ void device_image_interface::clear_error()
// error
//-------------------------------------------------
-static std::string_view messages[] =
+std::error_category const &image_category() noexcept
{
- "",
- "Internal error",
- "Unsupported operation",
- "Out of memory",
- "File not found",
- "Invalid image",
- "File already open",
- "Unspecified error"
-};
+ class image_category_impl : public std::error_category
+ {
+ public:
+ virtual char const *name() const noexcept override { return "image"; }
+
+ virtual std::string message(int condition) const override
+ {
+ using namespace std::literals;
+ static std::string_view const s_messages[] = {
+ "No error"sv,
+ "Internal error"sv,
+ "Unsupported operation"sv,
+ "Invalid image"sv,
+ "File already open"sv,
+ "Unspecified error"sv };
+ if ((0 <= condition) && (std::size(s_messages) > condition))
+ return std::string(s_messages[condition]);
+ else
+ return "Unknown error"s;
+ }
+ };
+ static image_category_impl const s_image_category_instance;
+ return s_image_category_instance;
+}
std::string_view device_image_interface::error()
{
- return (!m_err_message.empty()) ? m_err_message : messages[m_err];
+ if (m_err && m_err_message.empty())
+ m_err_message = m_err.message();
+ return m_err_message;
}
@@ -307,14 +322,12 @@ std::string_view device_image_interface::error()
// seterror - specifies an error on an image
//-------------------------------------------------
-void device_image_interface::seterror(image_error_t err, const char *message)
+void device_image_interface::seterror(std::error_condition err, const char *message)
{
clear_error();
m_err = err;
- if (message != nullptr)
- {
+ if (message)
m_err_message = message;
- }
}
@@ -544,14 +557,13 @@ void device_image_interface::battery_load(void *buffer, int length, int fill)
if (!buffer || (length <= 0))
throw emu_fatalerror("device_image_interface::battery_load: Must specify sensical buffer/length");
- osd_file::error filerr;
- int bytes_read = 0;
- std::string fname = std::string(device().machine().system().name).append(PATH_SEPARATOR).append(m_basename_noext).append(".nv");
+ std::string const fname = std::string(device().machine().system().name).append(PATH_SEPARATOR).append(m_basename_noext).append(".nv");
/* try to open the battery file and read it in, if possible */
emu_file file(device().machine().options().nvram_directory(), OPEN_FLAG_READ);
- filerr = file.open(fname);
- if (filerr == osd_file::error::NONE)
+ std::error_condition const filerr = file.open(fname);
+ int bytes_read = 0;
+ if (!filerr)
bytes_read = file.read(buffer, length);
// fill remaining bytes (if necessary)
@@ -563,14 +575,13 @@ void device_image_interface::battery_load(void *buffer, int length, const void *
if (!buffer || (length <= 0))
throw emu_fatalerror("device_image_interface::battery_load: Must specify sensical buffer/length");
- osd_file::error filerr;
- int bytes_read = 0;
- std::string fname = std::string(device().machine().system().name).append(PATH_SEPARATOR).append(m_basename_noext).append(".nv");
+ std::string const fname = std::string(device().machine().system().name).append(PATH_SEPARATOR).append(m_basename_noext).append(".nv");
// try to open the battery file and read it in, if possible
emu_file file(device().machine().options().nvram_directory(), OPEN_FLAG_READ);
- filerr = file.open(fname);
- if (filerr == osd_file::error::NONE)
+ std::error_condition const filerr = file.open(fname);
+ int bytes_read = 0;
+ if (!filerr)
bytes_read = file.read(buffer, length);
// if no file was present, copy the default contents
@@ -598,8 +609,8 @@ void device_image_interface::battery_save(const void *buffer, int length)
// try to open the battery file and write it out, if possible
emu_file file(device().machine().options().nvram_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr = file.open(fname);
- if (filerr == osd_file::error::NONE)
+ std::error_condition const filerr = file.open(fname);
+ if (!filerr)
file.write(buffer, length);
}
@@ -637,58 +648,30 @@ bool device_image_interface::uses_file_extension(const char *file_extension) con
// ***************************************************************************
//-------------------------------------------------
-// image_error_from_file_error - converts an image
-// error to a file error
-//-------------------------------------------------
-
-image_error_t device_image_interface::image_error_from_file_error(osd_file::error filerr)
-{
- switch (filerr)
- {
- case osd_file::error::NONE:
- return IMAGE_ERROR_SUCCESS;
-
- case osd_file::error::NOT_FOUND:
- case osd_file::error::ACCESS_DENIED:
- // file not found (or otherwise cannot open)
- return IMAGE_ERROR_FILENOTFOUND;
-
- case osd_file::error::OUT_OF_MEMORY:
- // out of memory
- return IMAGE_ERROR_OUTOFMEMORY;
-
- case osd_file::error::ALREADY_OPEN:
- // this shouldn't happen
- return IMAGE_ERROR_ALREADYOPEN;
-
- case osd_file::error::FAILURE:
- case osd_file::error::TOO_MANY_FILES:
- case osd_file::error::INVALID_DATA:
- default:
- // other errors
- return IMAGE_ERROR_INTERNAL;
- }
-}
-
-
-//-------------------------------------------------
// load_image_by_path - loads an image with a
// specific path
//-------------------------------------------------
-image_error_t device_image_interface::load_image_by_path(u32 open_flags, std::string_view path)
+std::error_condition device_image_interface::load_image_by_path(u32 open_flags, std::string_view path)
{
std::string revised_path;
// attempt to read the file
- auto const filerr = util::zippath_fopen(path, open_flags, m_file, revised_path);
- if (filerr != osd_file::error::NONE)
- return image_error_from_file_error(filerr);
+ auto filerr = util::zippath_fopen(path, open_flags, m_file, revised_path);
+ if (filerr)
+ {
+ osd_printf_verbose("%s: error opening image file %s with flags=%08X (%s:%d %s)\n", device().tag(), path, open_flags, filerr.category().name(), filerr.value(), filerr.message());
+ return filerr;
+ }
+ else
+ {
+ osd_printf_verbose("%s: opened image file %s with flags=%08X\n", device().tag(), path, open_flags);
+ }
m_readonly = (open_flags & OPEN_FLAG_WRITE) ? 0 : 1;
m_created = (open_flags & OPEN_FLAG_CREATE) ? 1 : 0;
set_image_filename(revised_path);
- return IMAGE_ERROR_SUCCESS;
+ return std::error_condition();
}
@@ -696,7 +679,7 @@ image_error_t device_image_interface::load_image_by_path(u32 open_flags, std::st
// reopen_for_write
//-------------------------------------------------
-int device_image_interface::reopen_for_write(std::string_view path)
+std::error_condition device_image_interface::reopen_for_write(std::string_view path)
{
m_file.reset();
@@ -704,15 +687,15 @@ int device_image_interface::reopen_for_write(std::string_view path)
// attempt to open the file for writing
auto const filerr = util::zippath_fopen(path, OPEN_FLAG_READ|OPEN_FLAG_WRITE|OPEN_FLAG_CREATE, m_file, revised_path);
- if (filerr != osd_file::error::NONE)
- return image_error_from_file_error(filerr);
+ if (filerr)
+ return filerr;
// success!
m_readonly = 0;
m_created = 1;
set_image_filename(revised_path);
- return IMAGE_ERROR_SUCCESS;
+ return std::error_condition();
}
@@ -823,19 +806,19 @@ bool device_image_interface::load_software(software_list_device &swlist, std::st
// try to load the file
m_mame_file.reset(new emu_file(device().machine().options().media_path(), searchpath, OPEN_FLAG_READ));
m_mame_file->set_restrict_to_mediapath(1);
- osd_file::error filerr;
+ std::error_condition filerr;
if (has_crc)
filerr = m_mame_file->open(romp->name(), crc);
else
filerr = m_mame_file->open(romp->name());
- if (filerr != osd_file::error::NONE)
+ if (filerr)
m_mame_file.reset();
warningcount += verify_length_and_hash(m_mame_file.get(), romp->name(), romp->get_length(), util::hash_collection(romp->hashdata()));
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
filerr = util::core_file::open_proxy(*m_mame_file, m_file);
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
retval = true;
break; // load first item for start
@@ -878,14 +861,14 @@ image_init_result device_image_interface::load_internal(std::string_view path, b
{
// open the file
m_err = load_image_by_path(*iter, path);
- if (m_err && (m_err != IMAGE_ERROR_FILENOTFOUND))
+ if (m_err && (m_err != std::errc::no_such_file_or_directory) && (m_err != std::errc::permission_denied))
goto done;
}
// did we fail to find the file?
if (!m_file)
{
- m_err = IMAGE_ERROR_FILENOTFOUND;
+ m_err = std::errc::no_such_file_or_directory;
goto done;
}
}
@@ -894,15 +877,17 @@ image_init_result device_image_interface::load_internal(std::string_view path, b
m_create_format = create_format;
m_create_args = create_args;
- if (init_phase()==false) {
- m_err = (finish_load() == image_init_result::PASS) ? IMAGE_ERROR_SUCCESS : IMAGE_ERROR_INTERNAL;
+ if (!init_phase())
+ {
+ m_err = (finish_load() == image_init_result::PASS) ? std::error_condition() : image_error::INTERNAL;
if (m_err)
goto done;
}
// success!
done:
- if (m_err!=0) {
+ if (m_err)
+ {
if (!init_phase())
{
if (device().machine().phase() == machine_phase::RUNNING)
@@ -1004,7 +989,7 @@ image_init_result device_image_interface::finish_load()
{
if (!image_checkhash())
{
- m_err = IMAGE_ERROR_INVALIDIMAGE;
+ m_err = image_error::INVALIDIMAGE;
err = image_init_result::FAIL;
}
@@ -1016,7 +1001,7 @@ image_init_result device_image_interface::finish_load()
if (err != image_init_result::PASS)
{
if (!m_err)
- m_err = IMAGE_ERROR_UNSPECIFIED;
+ m_err = image_error::UNSPECIFIED;
}
}
else
@@ -1026,7 +1011,7 @@ image_init_result device_image_interface::finish_load()
if (err != image_init_result::PASS)
{
if (!m_err)
- m_err = IMAGE_ERROR_UNSPECIFIED;
+ m_err = image_error::UNSPECIFIED;
}
}
}
@@ -1354,41 +1339,3 @@ bool device_image_interface::init_phase() const
return !device().has_running_machine()
|| device().machine().phase() == machine_phase::INIT;
}
-
-
-//----------------------------------------------------------------------------
-
-static int image_fseek_thunk(void *file, s64 offset, int whence)
-{
- device_image_interface *image = (device_image_interface *) file;
- return image->fseek(offset, whence);
-}
-
-static size_t image_fread_thunk(void *file, void *buffer, size_t length)
-{
- device_image_interface *image = (device_image_interface *) file;
- return image->fread(buffer, length);
-}
-
-static size_t image_fwrite_thunk(void *file, const void *buffer, size_t length)
-{
- device_image_interface *image = (device_image_interface *) file;
- return image->fwrite(buffer, length);
-}
-
-static u64 image_fsize_thunk(void *file)
-{
- device_image_interface *image = (device_image_interface *) file;
- return image->length();
-}
-
-//----------------------------------------------------------------------------
-
-struct io_procs image_ioprocs =
-{
- nullptr,
- image_fseek_thunk,
- image_fread_thunk,
- image_fwrite_thunk,
- image_fsize_thunk
-};
diff --git a/src/emu/diimage.h b/src/emu/diimage.h
index 507fd34e1d3..05f714f2647 100644
--- a/src/emu/diimage.h
+++ b/src/emu/diimage.h
@@ -19,6 +19,7 @@
#include <memory>
#include <string>
+#include <system_error>
#include <vector>
@@ -26,8 +27,6 @@
// TYPE DEFINITIONS
//**************************************************************************
-extern struct io_procs image_ioprocs;
-
enum iodevice_t
{
/* List of all supported devices. Refer to the device by these names only */
@@ -55,18 +54,19 @@ enum iodevice_t
IO_COUNT /* 21 - Total Number of IO_devices for searching */
};
-enum image_error_t
+enum class image_error : int
{
- IMAGE_ERROR_SUCCESS,
- IMAGE_ERROR_INTERNAL,
- IMAGE_ERROR_UNSUPPORTED,
- IMAGE_ERROR_OUTOFMEMORY,
- IMAGE_ERROR_FILENOTFOUND,
- IMAGE_ERROR_INVALIDIMAGE,
- IMAGE_ERROR_ALREADYOPEN,
- IMAGE_ERROR_UNSPECIFIED
+ INTERNAL = 1,
+ UNSUPPORTED,
+ INVALIDIMAGE,
+ ALREADYOPEN,
+ UNSPECIFIED
};
+const std::error_category &image_category() noexcept;
+inline std::error_condition make_error_condition(image_error e) noexcept { return std::error_condition(int(e), image_category()); }
+namespace std { template <> struct is_error_condition_enum<image_error> : public std::true_type { }; }
+
struct image_device_type_info
{
iodevice_t m_type;
@@ -150,7 +150,7 @@ public:
const util::option_guide &device_get_creation_option_guide() const { return create_option_guide(); }
std::string_view error();
- void seterror(image_error_t err, const char *message);
+ void seterror(std::error_condition err, const char *message);
void message(const char *format, ...) ATTR_PRINTF(2,3);
bool exists() const noexcept { return !m_image_name.empty(); }
@@ -172,7 +172,7 @@ public:
int fgetc() { char ch; if (fread(&ch, 1) != 1) ch = '\0'; return ch; }
char *fgets(char *buffer, u32 length) { check_for_file(); return m_file->gets(buffer, length); }
int image_feof() { check_for_file(); return m_file->eof(); }
- void *ptr() {check_for_file(); return const_cast<void *>(m_file->buffer()); }
+ void *ptr() { check_for_file(); return const_cast<void *>(m_file->buffer()); }
// configuration access
const software_info *software_entry() const noexcept;
@@ -217,7 +217,7 @@ public:
image_init_result create(std::string_view path, const image_device_format *create_format, util::option_resolution *create_args);
image_init_result create(std::string_view path);
bool load_software(software_list_device &swlist, std::string_view swname, const rom_entry *entry);
- int reopen_for_write(std::string_view path);
+ std::error_condition reopen_for_write(std::string_view path);
void set_user_loadable(bool user_loadable) { m_user_loadable = user_loadable; }
@@ -233,7 +233,7 @@ protected:
virtual const bool use_software_list_file_extension_for_filetype() const { return false; }
image_init_result load_internal(std::string_view path, bool is_create, int create_format, util::option_resolution *create_args);
- image_error_t load_image_by_path(u32 open_flags, std::string_view path);
+ std::error_condition load_image_by_path(u32 open_flags, std::string_view path);
void clear();
bool is_loaded() const { return m_file != nullptr; }
@@ -260,7 +260,7 @@ protected:
static const image_device_type_info m_device_info_array[];
// error related info
- image_error_t m_err;
+ std::error_condition m_err;
std::string m_err_message;
private:
@@ -277,7 +277,6 @@ private:
const software_part *m_software_part_ptr;
std::string m_software_list_name;
- static image_error_t image_error_from_file_error(osd_file::error filerr);
std::vector<u32> determine_open_plan(bool is_create);
void update_names();
bool load_software_part(std::string_view identifier);
diff --git a/src/emu/dimemory.h b/src/emu/dimemory.h
index f15a04166f4..119ec9bc6f9 100644
--- a/src/emu/dimemory.h
+++ b/src/emu/dimemory.h
@@ -50,11 +50,11 @@ constexpr int TRANSLATE_FETCH_DEBUG = (TRANSLATE_FETCH | TRANSLATE_DEBUG_MAS
class device_memory_interface : public device_interface
{
friend class device_scheduler;
- template <typename T, typename U> struct is_related_class { static constexpr bool value = std::is_convertible<std::add_pointer_t<T>, std::add_pointer_t<U> >::value; };
- template <typename T, typename U> struct is_related_device { static constexpr bool value = emu::detail::is_device_implementation<T>::value && is_related_class<T, U>::value; };
- template <typename T, typename U> struct is_related_interface { static constexpr bool value = emu::detail::is_device_interface<T>::value && is_related_class<T, U>::value; };
- template <typename T, typename U> struct is_unrelated_device { static constexpr bool value = emu::detail::is_device_implementation<T>::value && !is_related_class<T, U>::value; };
- template <typename T, typename U> struct is_unrelated_interface { static constexpr bool value = emu::detail::is_device_interface<T>::value && !is_related_class<T, U>::value; };
+ template <typename T, typename U> using is_related_class = std::bool_constant<std::is_convertible_v<std::add_pointer_t<T>, std::add_pointer_t<U> > >;
+ template <typename T, typename U> using is_related_device = std::bool_constant<emu::detail::is_device_implementation<T>::value && is_related_class<T, U>::value >;
+ template <typename T, typename U> using is_related_interface = std::bool_constant<emu::detail::is_device_interface<T>::value && is_related_class<T, U>::value >;
+ template <typename T, typename U> using is_unrelated_device = std::bool_constant<emu::detail::is_device_implementation<T>::value && !is_related_class<T, U>::value >;
+ template <typename T, typename U> using is_unrelated_interface = std::bool_constant<emu::detail::is_device_interface<T>::value && !is_related_class<T, U>::value >;
public:
// construction/destruction
diff --git a/src/emu/dipty.cpp b/src/emu/dipty.cpp
index 925113edd08..6a323d84e7f 100644
--- a/src/emu/dipty.cpp
+++ b/src/emu/dipty.cpp
@@ -27,7 +27,7 @@ bool device_pty_interface::open()
{
if (!m_opened)
{
- if (osd_file::openpty(m_pty_master, m_slave_name) == osd_file::error::NONE)
+ if (!osd_file::openpty(m_pty_master, m_slave_name))
{
m_opened = true;
}
@@ -54,7 +54,7 @@ bool device_pty_interface::is_open() const
ssize_t device_pty_interface::read(u8 *rx_chars , size_t count) const
{
u32 actual_bytes;
- if (m_opened && m_pty_master->read(rx_chars, 0, count, actual_bytes) == osd_file::error::NONE)
+ if (m_opened && !m_pty_master->read(rx_chars, 0, count, actual_bytes))
return actual_bytes;
else
return -1;
@@ -72,8 +72,3 @@ bool device_pty_interface::is_slave_connected() const
// TODO: really check for slave status
return m_opened;
}
-
-const char *device_pty_interface::slave_name() const
-{
- return m_slave_name.c_str();
-}
diff --git a/src/emu/dipty.h b/src/emu/dipty.h
index 790d4ec39b0..9fc1ddbc7e1 100644
--- a/src/emu/dipty.h
+++ b/src/emu/dipty.h
@@ -7,10 +7,14 @@
Device PTY interface
***************************************************************************/
-
#ifndef MAME_EMU_DIPTY_H
#define MAME_EMU_DIPTY_H
+#pragma once
+
+#include <string>
+
+
class device_pty_interface : public device_interface
{
public:
@@ -28,7 +32,7 @@ public:
bool is_slave_connected() const;
- const char *slave_name() const;
+ const std::string &slave_name() const { return m_slave_name; }
protected:
osd_file::ptr m_pty_master;
diff --git a/src/emu/distate.cpp b/src/emu/distate.cpp
index 215f140efd1..0d94c4dcf81 100644
--- a/src/emu/distate.cpp
+++ b/src/emu/distate.cpp
@@ -65,8 +65,6 @@ device_state_entry::device_state_entry(int index, const char *symbol, u8 size, u
// override well-known symbols
if (index == STATE_GENPCBASE)
m_symbol.assign("CURPC");
- else if (index == STATE_GENSP)
- m_symbol.assign("CURSP");
else if (index == STATE_GENFLAGS)
m_symbol.assign("CURFLAGS");
}
@@ -491,9 +489,6 @@ device_state_interface::device_state_interface(const machine_config &mconfig, de
: device_interface(device, "state")
{
memset(m_fast_state, 0, sizeof(m_fast_state));
-
- // configure the fast accessor
- device.interfaces().m_state = this;
}
diff --git a/src/emu/distate.h b/src/emu/distate.h
index 0155d2afb11..f0cf04eadeb 100644
--- a/src/emu/distate.h
+++ b/src/emu/distate.h
@@ -27,8 +27,7 @@ enum
{
STATE_GENPC = -1, // generic program counter (live)
STATE_GENPCBASE = -2, // generic program counter (base of current instruction)
- STATE_GENSP = -3, // generic stack pointer
- STATE_GENFLAGS = -4 // generic flags
+ STATE_GENFLAGS = -3 // generic flags
};
@@ -295,12 +294,11 @@ public:
const std::vector<std::unique_ptr<device_state_entry>> &state_entries() const { return m_state_list; }
// state getters
- u64 state_int(int index) { const device_state_entry *entry = state_find_entry(index); return (entry == nullptr) ? 0 : entry->value(); }
+ u64 state_int(int index) const { const device_state_entry *entry = state_find_entry(index); return (entry == nullptr) ? 0 : entry->value(); }
std::string state_string(int index) const { const device_state_entry *entry = state_find_entry(index); return (entry == nullptr) ? std::string("???") : entry->to_string(); }
- offs_t pc() { return state_int(STATE_GENPC); }
- offs_t pcbase() { return state_int(STATE_GENPCBASE); }
- offs_t sp() { return state_int(STATE_GENSP); }
- u64 flags() { return state_int(STATE_GENFLAGS); }
+ offs_t pc() const { return state_int(STATE_GENPC); }
+ offs_t pcbase() const { return state_int(STATE_GENPCBASE); }
+ u64 flags() const { return state_int(STATE_GENFLAGS); }
// state setters
void set_state_int(int index, u64 value) { const device_state_entry *entry = state_find_entry(index); if (entry != nullptr) entry->set_value(value); }
@@ -309,10 +307,6 @@ public:
// find the entry for a given index
const device_state_entry *state_find_entry(int index) const;
- // deliberately ambiguous functions; if you have the state interface
- // just use it directly
- device_state_interface &state() { return *this; }
-
public: // protected eventually
// add a new state register item
diff --git a/src/emu/divtlb.cpp b/src/emu/divtlb.cpp
index a09abd5300a..41a0aa96aad 100644
--- a/src/emu/divtlb.cpp
+++ b/src/emu/divtlb.cpp
@@ -177,8 +177,9 @@ bool device_vtlb_interface::vtlb_fill(offs_t address, int intention)
// if this is the first successful translation for this address, allocate a new entry
if ((entry & VTLB_FLAGS_MASK) == 0)
{
- int liveindex = m_dynindex++ % m_dynamic;
+ int liveindex = m_dynindex;
+ m_dynindex = (m_dynindex + 1) % m_dynamic;
// if an entry already exists at this index, free it
if (m_live[liveindex] != 0)
@@ -277,7 +278,10 @@ void device_vtlb_interface::vtlb_dynload(u32 index, offs_t address, vtlb_entry v
return;
}
- int liveindex = m_dynindex++ % m_dynamic;
+ int liveindex = m_dynindex;
+
+ m_dynindex = (m_dynindex + 1) % m_dynamic;
+
// is entry already live?
if (!(entry & VTLB_FLAG_VALID))
{
diff --git a/src/emu/driver.h b/src/emu/driver.h
index 43697f2d109..0656775ab7b 100644
--- a/src/emu/driver.h
+++ b/src/emu/driver.h
@@ -76,9 +76,14 @@
typedef delegate<void ()> driver_callback_delegate;
-// ======================> driver_device
-
-// base class for machine driver-specific devices
+/// \brief Base class for system device classes
+///
+/// System devices can be used as the root device of a system.
+/// Indirection for metadata, input port definitons, initialisation
+/// functions, ROM definitions, internal artwork and emulation status
+/// flags is provided via the #game_driver structure. This allows
+/// multiple systems to be be implemented using a single
+/// system device class.
class driver_device : public device_t
{
public:
@@ -102,7 +107,10 @@ public:
// inline configuration helpers
static void static_set_callback(device_t &device, callback_type type, driver_callback_delegate callback);
- // dummy driver_init callback
+ /// \brief Empty system initialisation function
+ ///
+ /// Provided as a convenience for systems that have no additional
+ /// initialisation tasks.
void empty_init();
// output heler
diff --git a/src/emu/emucore.cpp b/src/emu/emucore.cpp
index 84eb5cf11c6..bc6139fe3cf 100644
--- a/src/emu/emucore.cpp
+++ b/src/emu/emucore.cpp
@@ -13,8 +13,6 @@
#include "emucore.h"
#include "osdcore.h"
-const char *const endianness_names[2] = { "little", "big" };
-
emu_fatalerror::emu_fatalerror(util::format_argument_pack<std::ostream> const &args)
: emu_fatalerror(0, args)
{
diff --git a/src/emu/emucore.h b/src/emu/emucore.h
index 6c446b812b7..768fa8c7280 100644
--- a/src/emu/emucore.h
+++ b/src/emu/emucore.h
@@ -37,6 +37,7 @@
#include "osdcomm.h"
#include "coretmpl.h"
#include "bitmap.h"
+#include "endianness.h"
#include "strformat.h"
#include "vecstream.h"
@@ -78,6 +79,21 @@ using util::bitswap;
using util::iabs;
using util::string_format;
+using endianness_t = util::endianness;
+
+using util::BYTE_XOR_BE;
+using util::BYTE_XOR_LE;
+using util::BYTE4_XOR_BE;
+using util::BYTE4_XOR_LE;
+using util::WORD_XOR_BE;
+using util::WORD_XOR_LE;
+using util::BYTE8_XOR_BE;
+using util::BYTE8_XOR_LE;
+using util::WORD2_XOR_BE;
+using util::WORD2_XOR_LE;
+using util::DWORD_XOR_BE;
+using util::DWORD_XOR_LE;
+
// pen_t is used to represent pixel values in bitmaps
typedef u32 pen_t;
@@ -150,21 +166,9 @@ union PAIR64
// COMMON CONSTANTS
//**************************************************************************
-// constants for expression endianness
-enum endianness_t
-{
- ENDIANNESS_LITTLE,
- ENDIANNESS_BIG
-};
-
-extern const char *const endianness_names[2];
-
-// declare native endianness to be one or the other
-#ifdef LSB_FIRST
-const endianness_t ENDIANNESS_NATIVE = ENDIANNESS_LITTLE;
-#else
-const endianness_t ENDIANNESS_NATIVE = ENDIANNESS_BIG;
-#endif
+constexpr endianness_t ENDIANNESS_LITTLE = util::endianness::little;
+constexpr endianness_t ENDIANNESS_BIG = util::endianness::big;
+constexpr endianness_t ENDIANNESS_NATIVE = util::endianness::native;
// M_PI is not part of the C/C++ standards and is not present on
@@ -174,15 +178,19 @@ const endianness_t ENDIANNESS_NATIVE = ENDIANNESS_BIG;
#endif
-// orientation of bitmaps
-constexpr int ORIENTATION_FLIP_X = 0x0001; // mirror everything in the X direction
-constexpr int ORIENTATION_FLIP_Y = 0x0002; // mirror everything in the Y direction
-constexpr int ORIENTATION_SWAP_XY = 0x0004; // mirror along the top-left/bottom-right diagonal
+/// \name Image orientation flags
+/// \{
+
+constexpr int ORIENTATION_FLIP_X = 0x0001; ///< Mirror horizontally (in the X direction)
+constexpr int ORIENTATION_FLIP_Y = 0x0002; ///< Mirror vertically (in the Y direction)
+constexpr int ORIENTATION_SWAP_XY = 0x0004; ///< Mirror along the top-left/bottom-right diagonal
constexpr int ROT0 = 0;
-constexpr int ROT90 = ORIENTATION_SWAP_XY | ORIENTATION_FLIP_X; // rotate clockwise 90 degrees
-constexpr int ROT180 = ORIENTATION_FLIP_X | ORIENTATION_FLIP_Y; // rotate 180 degrees
-constexpr int ROT270 = ORIENTATION_SWAP_XY | ORIENTATION_FLIP_Y; // rotate counter-clockwise 90 degrees
+constexpr int ROT90 = ORIENTATION_SWAP_XY | ORIENTATION_FLIP_X; ///< Rotate 90 degrees clockwise
+constexpr int ROT180 = ORIENTATION_FLIP_X | ORIENTATION_FLIP_Y; ///< Rotate 180 degrees
+constexpr int ROT270 = ORIENTATION_SWAP_XY | ORIENTATION_FLIP_Y; ///< Rotate 90 degrees anti-clockwise (270 degrees clockwise)
+
+/// \}
// these are UTF-8 encoded strings for common characters
@@ -264,16 +272,6 @@ template <typename T> constexpr auto RADIAN_TO_DEGREE(T const &x) { return (180.
template <typename T> constexpr auto DEGREE_TO_RADIAN(T const &x) { return (M_PI / 180.0) * x; }
-// endian-based value: first value is if 'endian' is little-endian, second is if 'endian' is big-endian
-#define ENDIAN_VALUE_LE_BE(endian,leval,beval) (((endian) == ENDIANNESS_LITTLE) ? (leval) : (beval))
-
-// endian-based value: first value is if native endianness is little-endian, second is if native is big-endian
-#define NATIVE_ENDIAN_VALUE_LE_BE(leval,beval) ENDIAN_VALUE_LE_BE(ENDIANNESS_NATIVE, leval, beval)
-
-// endian-based value: first value is if 'endian' matches native, second is if 'endian' doesn't match native
-#define ENDIAN_VALUE_NE_NNE(endian,neval,nneval) (((endian) == ENDIANNESS_NATIVE) ? (neval) : (nneval))
-
-
//**************************************************************************
// EXCEPTION CLASSES
//**************************************************************************
diff --git a/src/emu/emumem.h b/src/emu/emumem.h
index b5deae3dd23..9d56a14ce3c 100644
--- a/src/emu/emumem.h
+++ b/src/emu/emumem.h
@@ -1567,7 +1567,7 @@ public:
fatalerror("Requesting cache() with data width %d while the config says %d\n", 8 << Width, m_config.data_width());
if(Endian != m_config.endianness())
fatalerror("Requesting cache() with endianness %s while the config says %s\n",
- endianness_names[Endian], endianness_names[m_config.endianness()]);
+ util::endian_to_string_view(Endian), util::endian_to_string_view(m_config.endianness()));
v.set(this, get_cache_info());
}
@@ -1581,7 +1581,7 @@ public:
fatalerror("Requesting specific() with data width %d while the config says %d\n", 8 << Width, m_config.data_width());
if(Endian != m_config.endianness())
fatalerror("Requesting spefific() with endianness %s while the config says %s\n",
- endianness_names[Endian], endianness_names[m_config.endianness()]);
+ util::endian_to_string_view(Endian), util::endian_to_string_view(m_config.endianness()));
v.set(this, get_specific_info());
}
@@ -1966,33 +1966,6 @@ private:
#define ACCESSING_BITS_32_63 ((mem_mask & 0xffffffff00000000U) != 0)
-// macros for accessing bytes and words within larger chunks
-
-// read/write a byte to a 16-bit space
-#define BYTE_XOR_BE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(1,0))
-#define BYTE_XOR_LE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(0,1))
-
-// read/write a byte to a 32-bit space
-#define BYTE4_XOR_BE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(3,0))
-#define BYTE4_XOR_LE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(0,3))
-
-// read/write a word to a 32-bit space
-#define WORD_XOR_BE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(2,0))
-#define WORD_XOR_LE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(0,2))
-
-// read/write a byte to a 64-bit space
-#define BYTE8_XOR_BE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(7,0))
-#define BYTE8_XOR_LE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(0,7))
-
-// read/write a word to a 64-bit space
-#define WORD2_XOR_BE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(6,0))
-#define WORD2_XOR_LE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(0,6))
-
-// read/write a dword to a 64-bit space
-#define DWORD_XOR_BE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(4,0))
-#define DWORD_XOR_LE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(0,4))
-
-
// helpers for checking address alignment
#define WORD_ALIGNED(a) (((a) & 1) == 0)
#define DWORD_ALIGNED(a) (((a) & 3) == 0)
diff --git a/src/emu/emumem_mud.cpp b/src/emu/emumem_mud.cpp
index 094e6663a04..b8fed565eea 100644
--- a/src/emu/emumem_mud.cpp
+++ b/src/emu/emumem_mud.cpp
@@ -35,7 +35,7 @@ template<> u8 mask_to_ukey<u64>(u64 mask)
(mask & 0x00000000000000ff ? 0x01 : 0x00);
}
-template<int Width, int AddrShift> memory_units_descriptor<Width, AddrShift>::memory_units_descriptor(u8 access_width, u8 access_endian, handler_entry *handler, offs_t addrstart, offs_t addrend, offs_t mask, typename emu::detail::handler_entry_size<Width>::uX unitmask, int cswidth) : m_handler(handler), m_access_width(access_width), m_access_endian(access_endian)
+template<int Width, int AddrShift> memory_units_descriptor<Width, AddrShift>::memory_units_descriptor(u8 access_width, endianness_t access_endian, handler_entry *handler, offs_t addrstart, offs_t addrend, offs_t mask, typename emu::detail::handler_entry_size<Width>::uX unitmask, int cswidth) : m_handler(handler), m_access_width(access_width), m_access_endian(access_endian)
{
u32 bits_per_access = 8 << access_width;
constexpr u32 NATIVE_MASK = Width + AddrShift >= 0 ? make_bitmask<u32>(Width + AddrShift) : 0;
diff --git a/src/emu/emumem_mud.h b/src/emu/emumem_mud.h
index 5a95af1a49f..12c8cf92eb5 100644
--- a/src/emu/emumem_mud.h
+++ b/src/emu/emumem_mud.h
@@ -15,7 +15,7 @@ public:
u8 m_offset;
};
- memory_units_descriptor(u8 access_width, u8 access_endian, handler_entry *handler, offs_t addrstart, offs_t addrend, offs_t mask, uX unitmask, int cswidth);
+ memory_units_descriptor(u8 access_width, endianness_t access_endian, handler_entry *handler, offs_t addrstart, offs_t addrend, offs_t mask, uX unitmask, int cswidth);
offs_t get_handler_start() const { return m_handler_start; }
offs_t get_handler_mask() const { return m_handler_mask; }
@@ -24,7 +24,7 @@ public:
const std::vector<entry> &get_entries_for_key(u8 key) const { return m_entries_for_key.find(key)->second; }
u8 get_subunit_width() const { return m_access_width; }
- u8 get_subunit_endian() const { return m_access_endian; }
+ endianness_t get_subunit_endian() const { return m_access_endian; }
void set_subunit_handler(handler_entry *handler) { m_handler = handler; }
handler_entry *get_subunit_handler() const { return m_handler; }
@@ -35,7 +35,7 @@ private:
handler_entry *m_handler;
std::array<u8, 4> m_keymap;
u8 m_access_width;
- u8 m_access_endian;
+ endianness_t m_access_endian;
void generate(u8 ukey, uX gumask, uX umask, u32 cswidth, u32 bits_per_access, u8 base_shift, s8 shift, u32 active_count);
};
diff --git a/src/emu/fileio.cpp b/src/emu/fileio.cpp
index 293c23045b4..0fa41d3cd11 100644
--- a/src/emu/fileio.cpp
+++ b/src/emu/fileio.cpp
@@ -11,7 +11,8 @@
#include "emu.h"
#include "fileio.h"
-#include "unzip.h"
+#include "util/path.h"
+#include "util/unzip.h"
//#define VERBOSE 1
#define LOG_OUTPUT_FUNC osd_printf_verbose
@@ -121,12 +122,7 @@ bool path_iterator::next(std::string &buffer, const char *name)
// append the name if we have one
if (name)
- {
- // compute the full pathname
- if (!buffer.empty() && !util::is_directory_separator(buffer.back()))
- buffer.append(PATH_SEPARATOR);
- buffer.append(name);
- }
+ util::path_append(buffer, name);
// bump the index and return true
m_is_first = false;
@@ -298,7 +294,7 @@ util::hash_collection &emu_file::hashes(std::string_view types)
// open - open a file by searching paths
//-------------------------------------------------
-osd_file::error emu_file::open(std::string &&name)
+std::error_condition emu_file::open(std::string &&name)
{
// remember the filename and CRC info
m_filename = std::move(name);
@@ -310,7 +306,7 @@ osd_file::error emu_file::open(std::string &&name)
return open_next();
}
-osd_file::error emu_file::open(std::string &&name, u32 crc)
+std::error_condition emu_file::open(std::string &&name, u32 crc)
{
// remember the filename and CRC info
m_filename = std::move(name);
@@ -328,7 +324,7 @@ osd_file::error emu_file::open(std::string &&name, u32 crc)
// the filename by iterating over paths
//-------------------------------------------------
-osd_file::error emu_file::open_next()
+std::error_condition emu_file::open_next()
{
// if we're open from a previous attempt, close up now
if (m_file)
@@ -336,8 +332,8 @@ osd_file::error emu_file::open_next()
// loop over paths
LOG("emu_file: open next '%s'\n", m_filename);
- osd_file::error filerr = osd_file::error::NOT_FOUND;
- while (osd_file::error::NONE != filerr)
+ std::error_condition filerr = std::errc::no_such_file_or_directory;
+ while (filerr)
{
if (m_first)
{
@@ -385,7 +381,7 @@ osd_file::error emu_file::open_next()
filerr = util::core_file::open(m_fullpath, m_openflags, m_file);
// if we're opening for read-only we have other options
- if ((osd_file::error::NONE != filerr) && ((m_openflags & (OPEN_FLAG_READ | OPEN_FLAG_WRITE)) == OPEN_FLAG_READ))
+ if (filerr && ((m_openflags & (OPEN_FLAG_READ | OPEN_FLAG_WRITE)) == OPEN_FLAG_READ))
{
LOG("emu_file: attempting to open '%s' from archives\n", m_fullpath);
filerr = attempt_zipped();
@@ -400,7 +396,7 @@ osd_file::error emu_file::open_next()
// just an array of data in RAM
//-------------------------------------------------
-osd_file::error emu_file::open_ram(const void *data, u32 length)
+std::error_condition emu_file::open_ram(const void *data, u32 length)
{
// set a fake filename and CRC
m_filename = "RAM";
@@ -435,29 +431,14 @@ void emu_file::close()
//-------------------------------------------------
-// compress - enable/disable streaming file
-// compression via zlib; level is 0 to disable
-// compression, or up to 9 for max compression
-//-------------------------------------------------
-
-osd_file::error emu_file::compress(int level)
-{
- return m_file->compress(level);
-}
-
-
-//-------------------------------------------------
// compressed_file_ready - ensure our zip is ready
// loading if needed
//-------------------------------------------------
-bool emu_file::compressed_file_ready()
+std::error_condition emu_file::compressed_file_ready()
{
// load the ZIP file now if we haven't yet
- if (m_zipfile && (load_zipped_file() != osd_file::error::NONE))
- return true;
-
- return false;
+ return m_zipfile ? load_zipped_file() : std::error_condition();
}
//-------------------------------------------------
@@ -715,9 +696,9 @@ bool emu_file::part_of_mediapath(const std::string &path)
// attempt_zipped - attempt to open a ZIPped file
//-------------------------------------------------
-osd_file::error emu_file::attempt_zipped()
+std::error_condition emu_file::attempt_zipped()
{
- typedef util::archive_file::error (*open_func)(const std::string &filename, util::archive_file::ptr &result);
+ typedef std::error_condition (*open_func)(std::string_view filename, util::archive_file::ptr &result);
char const *const suffixes[] = { ".zip", ".7z" };
open_func const open_funcs[std::size(suffixes)] = { &util::archive_file::open_zip, &util::archive_file::open_7z };
@@ -750,13 +731,13 @@ osd_file::error emu_file::attempt_zipped()
// attempt to open the archive file
util::archive_file::ptr zip;
- util::archive_file::error ziperr = open_funcs[i](m_fullpath, zip);
+ std::error_condition ziperr = open_funcs[i](m_fullpath, zip);
// chop the archive suffix back off the filename before continuing
m_fullpath = m_fullpath.substr(0, dirsep);
// if we failed to open this file, continue scanning
- if (ziperr != util::archive_file::error::NONE)
+ if (ziperr)
continue;
int header = -1;
@@ -788,14 +769,14 @@ osd_file::error emu_file::attempt_zipped()
m_hashes.reset();
m_hashes.add_crc(m_zipfile->current_crc());
m_fullpath = savepath;
- return (m_openflags & OPEN_FLAG_NO_PRELOAD) ? osd_file::error::NONE : load_zipped_file();
+ return (m_openflags & OPEN_FLAG_NO_PRELOAD) ? std::error_condition() : load_zipped_file();
}
// close up the archive file and try the next level
zip.reset();
}
}
- return osd_file::error::NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
}
@@ -803,7 +784,7 @@ osd_file::error emu_file::attempt_zipped()
// load_zipped_file - load a ZIPped file
//-------------------------------------------------
-osd_file::error emu_file::load_zipped_file()
+std::error_condition emu_file::load_zipped_file()
{
assert(m_file == nullptr);
assert(m_zipdata.empty());
@@ -814,21 +795,21 @@ osd_file::error emu_file::load_zipped_file()
// read the data into our buffer and return
auto const ziperr = m_zipfile->decompress(&m_zipdata[0], m_zipdata.size());
- if (ziperr != util::archive_file::error::NONE)
+ if (ziperr)
{
m_zipdata.clear();
- return osd_file::error::FAILURE;
+ return ziperr;
}
// convert to RAM file
- osd_file::error filerr = util::core_file::open_ram(&m_zipdata[0], m_zipdata.size(), m_openflags, m_file);
- if (filerr != osd_file::error::NONE)
+ std::error_condition const filerr = util::core_file::open_ram(&m_zipdata[0], m_zipdata.size(), m_openflags, m_file);
+ if (filerr)
{
m_zipdata.clear();
- return osd_file::error::FAILURE;
+ return filerr;
}
// close out the ZIP file
m_zipfile.reset();
- return osd_file::error::NONE;
+ return std::error_condition();
}
diff --git a/src/emu/fileio.h b/src/emu/fileio.h
index d05905efa83..f05706dffed 100644
--- a/src/emu/fileio.h
+++ b/src/emu/fileio.h
@@ -18,6 +18,7 @@
#include <iterator>
#include <string>
+#include <system_error>
#include <type_traits>
#include <utility>
#include <vector>
@@ -156,19 +157,16 @@ public:
void set_restrict_to_mediapath(int rtmp) { m_restrict_to_mediapath = rtmp; }
// open/close
- osd_file::error open(std::string &&name);
- osd_file::error open(std::string &&name, u32 crc);
- osd_file::error open(std::string_view name) { return open(std::string(name)); }
- osd_file::error open(std::string_view name, u32 crc) { return open(std::string(name), crc); }
- osd_file::error open(const char *name) { return open(std::string(name)); }
- osd_file::error open(const char *name, u32 crc) { return open(std::string(name), crc); }
- osd_file::error open_next();
- osd_file::error open_ram(const void *data, u32 length);
+ std::error_condition open(std::string &&name);
+ std::error_condition open(std::string &&name, u32 crc);
+ std::error_condition open(std::string_view name) { return open(std::string(name)); }
+ std::error_condition open(std::string_view name, u32 crc) { return open(std::string(name), crc); }
+ std::error_condition open(const char *name) { return open(std::string(name)); }
+ std::error_condition open(const char *name, u32 crc) { return open(std::string(name), crc); }
+ std::error_condition open_next();
+ std::error_condition open_ram(const void *data, u32 length);
void close();
- // control
- osd_file::error compress(int compress);
-
// position
int seek(s64 offset, int whence);
u64 tell();
@@ -213,11 +211,11 @@ private:
}
bool part_of_mediapath(const std::string &path);
- bool compressed_file_ready();
+ std::error_condition compressed_file_ready();
// internal helpers
- osd_file::error attempt_zipped();
- osd_file::error load_zipped_file();
+ std::error_condition attempt_zipped();
+ std::error_condition load_zipped_file();
// internal state
std::string m_filename; // original filename provided
diff --git a/src/emu/gamedrv.h b/src/emu/gamedrv.h
index 2843e7a36c8..eba153e3410 100644
--- a/src/emu/gamedrv.h
+++ b/src/emu/gamedrv.h
@@ -16,6 +16,9 @@
#include <type_traits>
+/// \defgroup machinedef Machine definition macros
+
+
//**************************************************************************
// CONSTANTS
//**************************************************************************
@@ -59,51 +62,76 @@ struct machine_flags
DECLARE_ENUM_BITWISE_OPERATORS(machine_flags::type);
-// flags for machine drivers
constexpr u64 MACHINE_TYPE_ARCADE = machine_flags::TYPE_ARCADE;
constexpr u64 MACHINE_TYPE_CONSOLE = machine_flags::TYPE_CONSOLE;
constexpr u64 MACHINE_TYPE_COMPUTER = machine_flags::TYPE_COMPUTER;
constexpr u64 MACHINE_TYPE_OTHER = machine_flags::TYPE_OTHER;
-constexpr u64 MACHINE_NOT_WORKING = machine_flags::NOT_WORKING;
-constexpr u64 MACHINE_SUPPORTS_SAVE = machine_flags::SUPPORTS_SAVE;
-constexpr u64 MACHINE_NO_COCKTAIL = machine_flags::NO_COCKTAIL;
-constexpr u64 MACHINE_IS_BIOS_ROOT = machine_flags::IS_BIOS_ROOT;
-constexpr u64 MACHINE_REQUIRES_ARTWORK = machine_flags::REQUIRES_ARTWORK;
-constexpr u64 MACHINE_CLICKABLE_ARTWORK = machine_flags::CLICKABLE_ARTWORK;
-constexpr u64 MACHINE_UNOFFICIAL = machine_flags::UNOFFICIAL;
-constexpr u64 MACHINE_NO_SOUND_HW = machine_flags::NO_SOUND_HW;
-constexpr u64 MACHINE_MECHANICAL = machine_flags::MECHANICAL;
-constexpr u64 MACHINE_IS_INCOMPLETE = machine_flags::IS_INCOMPLETE;
+
+
+/// \addtogroup machinedef
+/// \{
+/// \name System emulation status constants
+///
+/// Constants representing system emulation status flags. May be
+/// combined for use as FLAGS arguments to the #GAME, #GAMEL, #CONS,
+/// #COMP and #SYST macros.
+/// \{
+
+// flags for machine drivers
+constexpr u64 MACHINE_NOT_WORKING = machine_flags::NOT_WORKING; ///< Imperfect emulation prevents using the system as intended
+constexpr u64 MACHINE_SUPPORTS_SAVE = machine_flags::SUPPORTS_SAVE; ///< All devices in the system supports save states (enables auto save feature, and won't show a warning on using save states)
+constexpr u64 MACHINE_NO_COCKTAIL = machine_flags::NO_COCKTAIL; ///< The system supports screen flipping for use in a cocktail cabinet, but this feature is not properly emulated
+constexpr u64 MACHINE_IS_BIOS_ROOT = machine_flags::IS_BIOS_ROOT; ///< The system represents an empty system board of some kind - clones are treated as separate systems rather than variants
+constexpr u64 MACHINE_REQUIRES_ARTWORK = machine_flags::REQUIRES_ARTWORK; ///< The system requires external artwork for key functionality
+constexpr u64 MACHINE_CLICKABLE_ARTWORK = machine_flags::CLICKABLE_ARTWORK; ///< Enables pointer display for the system to facilitate using clickable artwork
+constexpr u64 MACHINE_UNOFFICIAL = machine_flags::UNOFFICIAL; ///< The system represents an after-market or end-user modification to a system
+constexpr u64 MACHINE_NO_SOUND_HW = machine_flags::NO_SOUND_HW; ///< The system has no sound output capability
+constexpr u64 MACHINE_MECHANICAL = machine_flags::MECHANICAL; ///< The system depends on mechanical features for key functionality
+constexpr u64 MACHINE_IS_INCOMPLETE = machine_flags::IS_INCOMPLETE; ///< The system represents an incomplete prototype
// flags that map to device feature flags
-constexpr u64 MACHINE_UNEMULATED_PROTECTION = 0x00000001'00000000; // game's protection not fully emulated
-constexpr u64 MACHINE_WRONG_COLORS = 0x00000002'00000000; // colors are totally wrong
-constexpr u64 MACHINE_IMPERFECT_COLORS = 0x00000004'00000000; // colors are not 100% accurate, but close
-constexpr u64 MACHINE_IMPERFECT_GRAPHICS = 0x00000008'00000000; // graphics are wrong/incomplete
-constexpr u64 MACHINE_NO_SOUND = 0x00000010'00000000; // sound is missing
-constexpr u64 MACHINE_IMPERFECT_SOUND = 0x00000020'00000000; // sound is known to be wrong
-constexpr u64 MACHINE_IMPERFECT_CONTROLS = 0x00000040'00000000; // controls are known to be imperfectly emulated
-constexpr u64 MACHINE_NODEVICE_MICROPHONE = 0x00000080'00000000; // any game/system that has unemulated audio capture device
-constexpr u64 MACHINE_NODEVICE_PRINTER = 0x00000100'00000000; // any game/system that has unemulated hardcopy output device
-constexpr u64 MACHINE_NODEVICE_LAN = 0x00000200'00000000; // any game/system that has unemulated local networking
-constexpr u64 MACHINE_IMPERFECT_TIMING = 0x00000400'00000000; // timing is known to be imperfectly emulated
+constexpr u64 MACHINE_UNEMULATED_PROTECTION = 0x00000001'00000000; ///< Some form of protection is imperfectly emulated (e.g. copy protection or anti-tampering)
+constexpr u64 MACHINE_WRONG_COLORS = 0x00000002'00000000; ///< Colours are completely wrong
+constexpr u64 MACHINE_IMPERFECT_COLORS = 0x00000004'00000000; ///< Colours are close but not completely accurate
+constexpr u64 MACHINE_IMPERFECT_GRAPHICS = 0x00000008'00000000; ///< Graphics are emulated incorrectly for the system
+constexpr u64 MACHINE_NO_SOUND = 0x00000010'00000000; ///< The system has sound output, but it is not emulated
+constexpr u64 MACHINE_IMPERFECT_SOUND = 0x00000020'00000000; ///< Sound is known to be imperfectly emulated for the system
+constexpr u64 MACHINE_IMPERFECT_CONTROLS = 0x00000040'00000000; ///< Controls or inputs are emulated imperfectly for the system
+constexpr u64 MACHINE_NODEVICE_MICROPHONE = 0x00000080'00000000; ///< The system has unemulated audio capture functionality
+constexpr u64 MACHINE_NODEVICE_PRINTER = 0x00000100'00000000; ///< The system has unemulated printer functionality
+constexpr u64 MACHINE_NODEVICE_LAN = 0x00000200'00000000; ///< The system has unemulated local area networking
+constexpr u64 MACHINE_IMPERFECT_TIMING = 0x00000400'00000000; ///< Timing is known to be imperfectly emulated for the system
// useful combinations of flags
-constexpr u64 MACHINE_IS_SKELETON = MACHINE_NO_SOUND | MACHINE_NOT_WORKING; // flag combination for skeleton drivers
+constexpr u64 MACHINE_IS_SKELETON = MACHINE_NO_SOUND | MACHINE_NOT_WORKING; ///< Useful combination of flags for preliminary systems
constexpr u64 MACHINE_IS_SKELETON_MECHANICAL = MACHINE_IS_SKELETON | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK; // flag combination for skeleton mechanical machines
+/// \}
+/// \}
+
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
-// static POD structure describing each game driver entry
+/// \brief Static system description
+///
+/// A plain data structure providing static information about an system.
+/// Used to allow multiple systems to be implemented using a single
+/// system device class (an implementation of #driver_device).
class game_driver
{
public:
typedef void (*machine_creator_wrapper)(machine_config &, device_t &);
typedef void (*driver_init_wrapper)(device_t &);
+ /// \brief Get unemulated system features
+ ///
+ /// Converts system flags corresponding to unemulated device
+ /// features to the a device feature type bit field.
+ /// \param [in] flags A system flags bit field.
+ /// \return A device feature type bit field corresponding to
+ /// unemulated features declared in the \p flags argument.
static constexpr device_t::feature_type unemulated_features(u64 flags)
{
return
@@ -114,6 +142,14 @@ public:
((flags & MACHINE_NODEVICE_LAN) ? device_t::feature::LAN : device_t::feature::NONE);
}
+ /// \brief Get imperfectly emulated system features
+ ///
+ /// Converts system flags corresponding to imperfectly emulated
+ /// device features to the a device feature type bit field.
+ /// \param [in] flags A system flags bit field.
+ /// \return A device feature type bit field corresponding to
+ /// imperfectly emulated features declared in the \p flags
+ /// argument.
static constexpr device_t::feature_type imperfect_features(u64 flags)
{
return
@@ -126,7 +162,7 @@ public:
}
device_type type; // static type info for driver class
- const char * parent; // if this is a clone, the name of the parent
+ const char * parent; // name of the parent or BIOS system if applicable
const char * year; // year the game was released
const char * manufacturer; // manufacturer of the game
machine_creator_wrapper machine_creator; // machine driver tokens
@@ -136,7 +172,7 @@ public:
const char * compatible_with;
const internal_layout * default_layout; // default internally defined layout
machine_flags::type flags; // orientation and other flags; see defines above
- char name[MAX_DRIVER_NAME_CHARS + 1]; // short name of the game
+ char name[MAX_DRIVER_NAME_CHARS + 1]; // short name of the system
};
@@ -164,9 +200,61 @@ driver_device_creator< \
game_driver::unemulated_features(FLAGS), \
game_driver::imperfect_features(FLAGS)>
-// standard GAME() macro
-#define GAME(YEAR,NAME,PARENT,MACHINE,INPUT,CLASS,INIT,MONITOR,COMPANY,FULLNAME,FLAGS) \
-GAME_DRIVER_TRAITS(NAME,FULLNAME) \
+
+/// \addtogroup machinedef
+/// \{
+
+/// \brief Define a "game" system
+///
+/// Use this macro to define most systems intended for public use,
+/// including arcade games, gambling machines, vending machines, and
+/// information kiosks. Muse be used in the global namespace.
+///
+/// Creates an appropriately named and populated #game_driver structure
+/// describing the system.
+/// \param YEAR The year that the system was first made available. Must
+/// be a token containing only the digits zero to nine, question mark
+/// and plus sign.
+/// \param NAME The short name of the system, used for identification,
+/// and in filesystem paths for assets and data. Must be a token no
+/// longer than sixteen characters, containing only ASCII lowercase
+/// letters, digits and underscores. Must be globally unique across
+/// systems and devices.
+/// \param PARENT Short name of the parent or BIOS system if applicable,
+/// or a single digit zero otherwise.
+/// \param MACHINE Function used to buid machine configuration for the
+/// system. Must be a public member function of the system device
+/// class (\p CLASS argument), returning void and taking a reference
+/// to a #machine_config object as a parameter.
+/// \param INPUT Input port definitions for the root device of the
+/// system, usually defined using #INPUT_PORTS_START and associated
+/// macros.
+/// \param CLASS Class to instantiate as the root device of the system.
+/// Must be an implementation of #driver_device.
+/// \param INIT Initialisation function called after all child devices
+/// have started, but before the driver start functions are called.
+/// Often used for tasks like decrypting ROMs. Must be a public
+/// member function of the system device class (\p CLASS argument),
+/// returning void and accepting no parameters. The function
+/// #driver_device::empty_init is supplied for systems that don't need
+/// to perform additional tasks.
+/// \param MONITOR Screen orientation flags applied to all screens in
+/// the system, after the individual screens' orientation flags are
+/// applied. Usually one #ROT0, #ROT90, #ROT180 or #ROT270.
+/// \param COMPANY Name of the developer or distributor of the system.
+/// Must be a string.
+/// \param FULLNAME Display name for the system. Must be a string, and
+/// must be globally unique across systems and devices.
+/// \param FLAGS Bitwise combination of emulation status flags for the
+/// system, in addition to flags supplied by the system device class
+/// (see #device_t::unemulated_features and
+/// #device_t::imperfect_features). It is advisable to supply
+/// unemulated and imperfectly emulated feature flags that apply to
+/// all systems implemented using the class in the class itself to
+/// avoid repetition.
+/// \sa GAMEL CONS COMP SYST
+#define GAME(YEAR, NAME, PARENT, MACHINE, INPUT, CLASS, INIT, MONITOR, COMPANY, FULLNAME, FLAGS) \
+GAME_DRIVER_TRAITS(NAME, FULLNAME) \
extern game_driver const GAME_NAME(NAME) \
{ \
GAME_DRIVER_TYPE(NAME, CLASS, FLAGS), \
@@ -183,9 +271,62 @@ extern game_driver const GAME_NAME(NAME) \
#NAME \
};
-// standard macro with additional layout
-#define GAMEL(YEAR,NAME,PARENT,MACHINE,INPUT,CLASS,INIT,MONITOR,COMPANY,FULLNAME,FLAGS,LAYOUT) \
-GAME_DRIVER_TRAITS(NAME,FULLNAME) \
+
+/// \brief Define a "game" system with an additional internal layout
+///
+/// Equivalent to the #GAME macro, but with the additional ability to
+/// supply system-specific internal artwork layout data. Views from the
+/// system-specific layout are available in addition to any views from
+/// layout data specified in the machine configuration. Must be used in
+/// the global namespace.
+///
+/// Creates an appropriately named and populated #game_driver structure
+/// describing the system.
+/// \param YEAR The year that the system was first made available. Must
+/// be a token containing only the digits zero to nine, question mark
+/// and plus sign.
+/// \param NAME The short name of the system, used for identification,
+/// and in filesystem paths for assets and data. Must be a token no
+/// longer than sixteen characters, containing only ASCII lowercase
+/// letters, digits and underscores. Must be globally unique across
+/// systems and devices.
+/// \param PARENT Short name of the parent or BIOS system if applicable,
+/// or a single digit zero otherwise.
+/// \param MACHINE Function used to buid machine configuration for the
+/// system. Must be a public member function of the system device
+/// class (\p CLASS argument), returning void and taking a reference
+/// to a #machine_config object as a parameter.
+/// \param INPUT Input port definitions for the root device of the
+/// system, usually defined using #INPUT_PORTS_START and associated
+/// macros.
+/// \param CLASS Class to instantiate as the root device of the system.
+/// Must be an implementation of #driver_device.
+/// \param INIT Initialisation function called after all child devices
+/// have started, but before the driver start functions are called.
+/// Often used for tasks like decrypting ROMs. Must be a public
+/// member function of the system device class (\p CLASS argument),
+/// returning void and accepting no parameters. The function
+/// #driver_device::empty_init is supplied for systems that don't need
+/// to perform additional tasks.
+/// \param MONITOR Screen orientation flags applied to all screens in
+/// the system, after the individual screens' orientation flags are
+/// applied. Usually one #ROT0, #ROT90, #ROT180 or #ROT270.
+/// \param COMPANY Name of the developer or distributor of the system.
+/// Must be a string.
+/// \param FULLNAME Display name for the system. Must be a string, and
+/// must be globally unique across systems and devices.
+/// \param FLAGS Bitwise combination of emulation status flags for the
+/// system, in addition to flags supplied by the system device class
+/// (see #device_t::unemulated_features and
+/// #device_t::imperfect_features). It is advisable to supply
+/// unemulated and imperfectly emulated feature flags that apply to
+/// all systems implemented using the class in the class itself to
+/// avoid repetition.
+/// \param LAYOUT An #internal_layout structure providing additional
+/// internal artwork for the system.
+/// \sa GAME CONS COMP SYST
+#define GAMEL(YEAR, NAME, PARENT, MACHINE, INPUT, CLASS, INIT, MONITOR, COMPANY, FULLNAME, FLAGS, LAYOUT) \
+GAME_DRIVER_TRAITS(NAME, FULLNAME) \
extern game_driver const GAME_NAME(NAME) \
{ \
GAME_DRIVER_TYPE(NAME, CLASS, FLAGS), \
@@ -203,8 +344,54 @@ extern game_driver const GAME_NAME(NAME) \
};
-// standard console definition macro
-#define CONS(YEAR,NAME,PARENT,COMPAT,MACHINE,INPUT,CLASS,INIT,COMPANY,FULLNAME,FLAGS) \
+/// \brief Define a "console" system
+///
+/// Use this macro to define appliance-like entertainment systems
+/// designed for domestic use. Must be used in the global namespace.
+///
+/// Creates an appropriately named and populated #game_driver structure
+/// describing the system.
+/// \param YEAR The year that the system was first made available. Must
+/// be a token containing only the digits zero to nine, question mark
+/// and plus sign.
+/// \param NAME The short name of the system, used for identification,
+/// and in filesystem paths for assets and data. Must be a token no
+/// longer than sixteen characters, containing only ASCII lowercase
+/// letters, digits and underscores. Must be globally unique across
+/// systems and devices.
+/// \param PARENT Short name of the parent or BIOS system if applicable,
+/// or a single digit zero otherwise.
+/// \param COMPAT Short name of a system that this system is compatible
+/// with if applicable, or a single digit zero otherwise.
+/// \param MACHINE Function used to buid machine configuration for the
+/// system. Must be a public member function of the system device
+/// class (\p CLASS argument), returning void and taking a reference
+/// to a #machine_config object as a parameter.
+/// \param INPUT Input port definitions for the root device of the
+/// system, usually defined using #INPUT_PORTS_START and associated
+/// macros.
+/// \param CLASS Class to instantiate as the root device of the system.
+/// Must be an implementation of #driver_device.
+/// \param INIT Initialisation function called after all child devices
+/// have started, but before the driver start functions are called.
+/// Often used for tasks like decrypting ROMs. Must be a public
+/// member function of the system device class (\p CLASS argument),
+/// returning void and accepting no parameters. The function
+/// #driver_device::empty_init is supplied for systems that don't need
+/// to perform additional tasks.
+/// \param COMPANY Name of the developer or distributor of the system.
+/// Must be a string.
+/// \param FULLNAME Display name for the system. Must be a string, and
+/// must be globally unique across systems and devices.
+/// \param FLAGS Bitwise combination of emulation status flags for the
+/// system, in addition to flags supplied by the system device class
+/// (see #device_t::unemulated_features and
+/// #device_t::imperfect_features). It is advisable to supply
+/// unemulated and imperfectly emulated feature flags that apply to
+/// all systems implemented using the class in the class itself to
+/// avoid repetition. Screen orientation flags may be included here.
+/// \sa GAME GAMEL COMP SYST
+#define CONS(YEAR, NAME, PARENT, COMPAT, MACHINE, INPUT, CLASS, INIT, COMPANY, FULLNAME, FLAGS) \
GAME_DRIVER_TRAITS(NAME,FULLNAME) \
extern game_driver const GAME_NAME(NAME) \
{ \
@@ -222,7 +409,54 @@ extern game_driver const GAME_NAME(NAME) \
#NAME \
};
-// standard computer definition macro
+
+/// \brief Define a "computer" system
+///
+/// Use this macro to define computer-like systems. Must be used in the
+/// global namespace.
+///
+/// Creates an appropriately named and populated #game_driver structure
+/// describing the system.
+/// \param YEAR The year that the system was first made available. Must
+/// be a token containing only the digits zero to nine, question mark
+/// and plus sign.
+/// \param NAME The short name of the system, used for identification,
+/// and in filesystem paths for assets and data. Must be a token no
+/// longer than sixteen characters, containing only ASCII lowercase
+/// letters, digits and underscores. Must be globally unique across
+/// systems and devices.
+/// \param PARENT Short name of the parent or BIOS system if applicable,
+/// or a single digit zero otherwise.
+/// \param COMPAT Short name of a system that this system is compatible
+/// with if applicable, or a single digit zero otherwise.
+/// \param MACHINE Function used to buid machine configuration for the
+/// system. Must be a public member function of the system device
+/// class (\p CLASS argument), returning void and taking a reference
+/// to a #machine_config object as a parameter.
+/// \param INPUT Input port definitions for the root device of the
+/// system, usually defined using #INPUT_PORTS_START and associated
+/// macros.
+/// \param CLASS Class to instantiate as the root device of the system.
+/// Must be an implementation of #driver_device.
+/// \param INIT Initialisation function called after all child devices
+/// have started, but before the driver start functions are called.
+/// Often used for tasks like decrypting ROMs. Must be a public
+/// member function of the system device class (\p CLASS argument),
+/// returning void and accepting no parameters. The function
+/// #driver_device::empty_init is supplied for systems that don't need
+/// to perform additional tasks.
+/// \param COMPANY Name of the developer or distributor of the system.
+/// Must be a string.
+/// \param FULLNAME Display name for the system. Must be a string, and
+/// must be globally unique across systems and devices.
+/// \param FLAGS Bitwise combination of emulation status flags for the
+/// system, in addition to flags supplied by the system device class
+/// (see #device_t::unemulated_features and
+/// #device_t::imperfect_features). It is advisable to supply
+/// unemulated and imperfectly emulated feature flags that apply to
+/// all systems implemented using the class in the class itself to
+/// avoid repetition. Screen orientation flags may be included here.
+/// \sa GAME GAMEL CONS SYST
#define COMP(YEAR,NAME,PARENT,COMPAT,MACHINE,INPUT,CLASS,INIT,COMPANY,FULLNAME,FLAGS) \
GAME_DRIVER_TRAITS(NAME,FULLNAME) \
extern game_driver const GAME_NAME(NAME) \
@@ -241,7 +475,54 @@ extern game_driver const GAME_NAME(NAME) \
#NAME \
};
-// standard system definition macro
+
+/// \brief Define a generic system
+///
+/// Use this macro to define miscellaneous systems that don't fall into
+/// one of the other categories. Must be used in the global namespace.
+///
+/// Creates an appropriately named and populated #game_driver structure
+/// describing the system.
+/// \param YEAR The year that the system was first made available. Must
+/// be a token containing only the digits zero to nine, question mark
+/// and plus sign.
+/// \param NAME The short name of the system, used for identification,
+/// and in filesystem paths for assets and data. Must be a token no
+/// longer than sixteen characters, containing only ASCII lowercase
+/// letters, digits and underscores. Must be globally unique across
+/// systems and devices.
+/// \param PARENT Short name of the parent or BIOS system if applicable,
+/// or a single digit zero otherwise.
+/// \param COMPAT Short name of a system that this system is compatible
+/// with if applicable, or a single digit zero otherwise.
+/// \param MACHINE Function used to buid machine configuration for the
+/// system. Must be a public member function of the system device
+/// class (\p CLASS argument), returning void and taking a reference
+/// to a #machine_config object as a parameter.
+/// \param INPUT Input port definitions for the root device of the
+/// system, usually defined using #INPUT_PORTS_START and associated
+/// macros.
+/// \param CLASS Class to instantiate as the root device of the system.
+/// Must be an implementation of #driver_device.
+/// \param INIT Initialisation function called after all child devices
+/// have started, but before the driver start functions are called.
+/// Often used for tasks like decrypting ROMs. Must be a public
+/// member function of the system device class (\p CLASS argument),
+/// returning void and accepting no parameters. The function
+/// #driver_device::empty_init is supplied for systems that don't need
+/// to perform additional tasks.
+/// \param COMPANY Name of the developer or distributor of the system.
+/// Must be a string.
+/// \param FULLNAME Display name for the system. Must be a string, and
+/// must be globally unique across systems and devices.
+/// \param FLAGS Bitwise combination of emulation status flags for the
+/// system, in addition to flags supplied by the system device class
+/// (see #device_t::unemulated_features and
+/// #device_t::imperfect_features). It is advisable to supply
+/// unemulated and imperfectly emulated feature flags that apply to
+/// all systems implemented using the class in the class itself to
+/// avoid repetition. Screen orientation flags may be included here.
+/// \sa GAME GAMEL CONS COMP
#define SYST(YEAR,NAME,PARENT,COMPAT,MACHINE,INPUT,CLASS,INIT,COMPANY,FULLNAME,FLAGS) \
GAME_DRIVER_TRAITS(NAME,FULLNAME) \
extern game_driver const GAME_NAME(NAME) \
@@ -260,5 +541,6 @@ extern game_driver const GAME_NAME(NAME) \
#NAME \
};
+/// \}
#endif // MAME_EMU_GAMEDRV_H
diff --git a/src/emu/hashfile.cpp b/src/emu/hashfile.cpp
index 50a32a60b29..a6107e5e630 100644
--- a/src/emu/hashfile.cpp
+++ b/src/emu/hashfile.cpp
@@ -27,10 +27,8 @@ static bool read_hash_config(const char *hash_path, const util::hash_collection
{
/* open a file */
emu_file file(hash_path, OPEN_FLAG_READ);
- if (file.open(std::string(sysname) + ".hsi") != osd_file::error::NONE)
- {
+ if (file.open(std::string(sysname) + ".hsi"))
return false;
- }
pugi::xml_document doc;
diff --git a/src/emu/http.cpp b/src/emu/http.cpp
index b384049a37f..42d8120d32e 100644
--- a/src/emu/http.cpp
+++ b/src/emu/http.cpp
@@ -422,8 +422,8 @@ bool http_manager::read_file(std::ostream &os, const std::string &path) {
std::ostringstream full_path;
full_path << m_root << path;
util::core_file::ptr f;
- osd_file::error e = util::core_file::open(full_path.str(), OPEN_FLAG_READ, f);
- if (e == osd_file::error::NONE)
+ std::error_condition const e = util::core_file::open(full_path.str(), OPEN_FLAG_READ, f);
+ if (!e)
{
int c;
while ((c = f->getc()) >= 0)
@@ -431,7 +431,7 @@ bool http_manager::read_file(std::ostream &os, const std::string &path) {
os.put(c);
}
}
- return e == osd_file::error::NONE;
+ return !e;
}
void http_manager::serve_document(http_request_ptr request, http_response_ptr response, const std::string &filename) {
diff --git a/src/emu/image.cpp b/src/emu/image.cpp
index c80d9bafde7..02cc25ce80b 100644
--- a/src/emu/image.cpp
+++ b/src/emu/image.cpp
@@ -173,8 +173,8 @@ int image_manager::write_config(emu_options &options, const char *filename, cons
}
emu_file file(options.ini_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE);
- osd_file::error filerr = file.open(filename);
- if (filerr == osd_file::error::NONE)
+ std::error_condition const filerr = file.open(filename);
+ if (!filerr)
{
std::string inistring = options.output_ini();
file.puts(inistring);
diff --git a/src/emu/inpttype.ipp b/src/emu/inpttype.ipp
index ff7b17f757b..989400b064e 100644
--- a/src/emu/inpttype.ipp
+++ b/src/emu/inpttype.ipp
@@ -838,6 +838,7 @@ namespace {
INPUT_PORT_DIGITAL_TYPE( 0, UI, UI_CLEAR, "UI Clear", input_seq(KEYCODE_DEL) ) \
INPUT_PORT_DIGITAL_TYPE( 0, UI, UI_ZOOM_IN, "UI Zoom In", input_seq(KEYCODE_EQUALS) ) \
INPUT_PORT_DIGITAL_TYPE( 0, UI, UI_ZOOM_OUT, "UI Zoom Out", input_seq(KEYCODE_MINUS) ) \
+ INPUT_PORT_DIGITAL_TYPE( 0, UI, UI_ZOOM_DEFAULT, "UI Default Zoom", input_seq(KEYCODE_0) ) \
INPUT_PORT_DIGITAL_TYPE( 0, UI, UI_PREV_GROUP, "UI Previous Group", input_seq(KEYCODE_OPENBRACE) ) \
INPUT_PORT_DIGITAL_TYPE( 0, UI, UI_NEXT_GROUP, "UI Next Group", input_seq(KEYCODE_CLOSEBRACE) ) \
INPUT_PORT_DIGITAL_TYPE( 0, UI, UI_ROTATE, "UI Rotate", input_seq(KEYCODE_R) ) \
diff --git a/src/emu/ioport.cpp b/src/emu/ioport.cpp
index 53e0946ca1f..b771119842b 100644
--- a/src/emu/ioport.cpp
+++ b/src/emu/ioport.cpp
@@ -99,9 +99,11 @@
#include "inputdev.h"
#include "natkeyboard.h"
-#include "corestr.h"
+#include "util/corestr.h"
+#include "util/ioprocsfilter.h"
+#include "util/unicode.h"
+
#include "osdepend.h"
-#include "unicode.h"
#include <cctype>
#include <ctime>
@@ -1657,9 +1659,10 @@ ioport_manager::ioport_manager(running_machine &machine)
, m_timecode_file(machine.options().input_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS)
, m_timecode_count(0)
, m_timecode_last_time(attotime::zero)
- , m_deselected_card_config(nullptr)
+ , m_deselected_card_config()
{
- memset(m_type_to_entry, 0, sizeof(m_type_to_entry));
+ for (auto &entries : m_type_to_entry)
+ std::fill(std::begin(entries), std::end(entries), nullptr);
}
@@ -1835,7 +1838,6 @@ void ioport_manager::exit()
ioport_manager::~ioport_manager()
{
- delete m_deselected_card_config;
}
@@ -2427,7 +2429,7 @@ void ioport_manager::load_system_config(util::xml::data_node const &portnode, in
if (parent_device->interface(slot) && (slot->option_list().find(std::string(child_tag)) != slot->option_list().end()))
{
if (!m_deselected_card_config)
- m_deselected_card_config = util::xml::file::create().release();
+ m_deselected_card_config = util::xml::file::create();
portnode.copy_into(*m_deselected_card_config);
}
break;
@@ -2652,23 +2654,26 @@ template<typename Type>
Type ioport_manager::playback_read(Type &result)
{
// protect against nullptr handles if previous reads fail
- if (!m_playback_file.is_open())
- result = 0;
+ if (!m_playback_stream)
+ return result = Type(0);
// read the value; if we fail, end playback
- else if (m_playback_file.read(&result, sizeof(result)) != sizeof(result))
+ size_t read;
+ m_playback_stream->read(&result, sizeof(result), read);
+ if (sizeof(result) != read)
{
playback_end("End of file");
- result = 0;
+ return result = Type(0);
}
- // return the appropriate value
- else if (sizeof(result) == 8)
+ // normalize byte order
+ if (sizeof(result) == 8)
result = little_endianize_int64(result);
else if (sizeof(result) == 4)
result = little_endianize_int32(result);
else if (sizeof(result) == 2)
result = little_endianize_int16(result);
+
return result;
}
@@ -2693,15 +2698,15 @@ time_t ioport_manager::playback_init()
return 0;
// open the playback file
- osd_file::error filerr = m_playback_file.open(filename);
+ std::error_condition const filerr = m_playback_file.open(filename);
// return an explicit error if file isn't found in given path
- if(filerr == osd_file::error::NOT_FOUND)
+ if (filerr == std::errc::no_such_file_or_directory)
fatalerror("Input file %s not found\n",filename);
// TODO: bail out any other error laconically for now
- if(filerr != osd_file::error::NONE)
- fatalerror("Failed to open file %s for playback (code error=%d)\n",filename,int(filerr));
+ if (filerr)
+ fatalerror("Failed to open file %s for playback (%s:%d %s)\n", filename, filerr.category().name(), filerr.value(), filerr.message());
// read the header and verify that it is a modern version; if not, print an error
inp_header header;
@@ -2725,7 +2730,7 @@ time_t ioport_manager::playback_init()
osd_printf_info("Input file is for machine '%s', not for current machine '%s'\n", sysname, machine().system().name);
// enable compression
- m_playback_file.compress(FCOMPRESS_MEDIUM);
+ m_playback_stream = util::zlib_read(util::core_file_read(m_playback_file), 16386);
return basetime;
}
@@ -2737,9 +2742,10 @@ time_t ioport_manager::playback_init()
void ioport_manager::playback_end(const char *message)
{
// only applies if we have a live file
- if (m_playback_file.is_open())
+ if (m_playback_stream)
{
// close the file
+ m_playback_stream.reset();
m_playback_file.close();
// pop a message
@@ -2753,7 +2759,8 @@ void ioport_manager::playback_end(const char *message)
osd_printf_info("Average recorded speed: %d%%\n", u32((m_playback_accumulated_speed * 200 + 1) >> 21));
// close the program at the end of inp file playback
- if (machine().options().exit_after_playback()) {
+ if (machine().options().exit_after_playback())
+ {
osd_printf_info("Exiting MAME now...\n");
machine().schedule_exit();
}
@@ -2769,7 +2776,7 @@ void ioport_manager::playback_end(const char *message)
void ioport_manager::playback_frame(const attotime &curtime)
{
// if playing back, fetch the information and verify
- if (m_playback_file.is_open())
+ if (m_playback_stream)
{
// first the absolute time
s32 seconds_temp;
@@ -2795,7 +2802,7 @@ void ioport_manager::playback_frame(const attotime &curtime)
void ioport_manager::playback_port(ioport_port &port)
{
// if playing back, fetch information about this port
- if (m_playback_file.is_open())
+ if (m_playback_stream)
{
// read the default value and the digital state
playback_read(port.live().defvalue);
@@ -2824,11 +2831,20 @@ template<typename Type>
void ioport_manager::record_write(Type value)
{
// protect against nullptr handles if previous reads fail
- if (!m_record_file.is_open())
+ if (!m_record_stream)
return;
- // read the value; if we fail, end playback
- if (m_record_file.write(&value, sizeof(value)) != sizeof(value))
+ // normalize byte order
+ if (sizeof(value) == 8)
+ value = little_endianize_int64(value);
+ else if (sizeof(value) == 4)
+ value = little_endianize_int32(value);
+ else if (sizeof(value) == 2)
+ value = little_endianize_int16(value);
+
+ // write the value; if we fail, end recording
+ size_t written;
+ if (m_record_stream->write(&value, sizeof(value), written) || (sizeof(value) != written))
record_end("Out of space");
}
@@ -2875,9 +2891,9 @@ void ioport_manager::record_init()
return;
// open the record file
- osd_file::error filerr = m_record_file.open(filename);
- if (filerr != osd_file::error::NONE)
- throw emu_fatalerror("ioport_manager::record_init: Failed to open file for recording");
+ std::error_condition const filerr = m_record_file.open(filename);
+ if (filerr)
+ throw emu_fatalerror("ioport_manager::record_init: Failed to open file for recording (%s:%d %s)", filerr.category().name(), filerr.value(), filerr.message());
// get the base time
system_time systime;
@@ -2895,7 +2911,7 @@ void ioport_manager::record_init()
header.write(m_record_file);
// enable compression
- m_record_file.compress(FCOMPRESS_MEDIUM);
+ m_record_stream = util::zlib_write(util::core_file_read_write(m_record_file), 6, 16384);
}
@@ -2922,9 +2938,9 @@ void ioport_manager::timecode_init()
filename.append(record_filename).append(".timecode");
osd_printf_info("Record input timecode file: %s\n", record_filename);
- osd_file::error filerr = m_timecode_file.open(filename);
- if (filerr != osd_file::error::NONE)
- throw emu_fatalerror("ioport_manager::timecode_init: Failed to open file for input timecode recording");
+ std::error_condition const filerr = m_timecode_file.open(filename);
+ if (filerr)
+ throw emu_fatalerror("ioport_manager::timecode_init: Failed to open file for input timecode recording (%s:%d %s)", filerr.category().name(), filerr.value(), filerr.message());
m_timecode_file.puts("# ==========================================\n");
m_timecode_file.puts("# TIMECODE FILE FOR VIDEO PREVIEW GENERATION\n");
@@ -2948,9 +2964,10 @@ void ioport_manager::timecode_init()
void ioport_manager::record_end(const char *message)
{
// only applies if we have a live file
- if (m_record_file.is_open())
+ if (m_record_stream)
{
// close the file
+ m_record_stream.reset(); // TODO: check for errors flushing the last compressed block before doing this
m_record_file.close();
// pop a message
@@ -2981,7 +2998,7 @@ void ioport_manager::timecode_end(const char *message)
void ioport_manager::record_frame(const attotime &curtime)
{
// if recording, record information about the current frame
- if (m_record_file.is_open())
+ if (m_record_stream)
{
// first the absolute time
record_write(curtime.seconds());
@@ -3091,7 +3108,7 @@ void ioport_manager::record_frame(const attotime &curtime)
void ioport_manager::record_port(ioport_port &port)
{
// if recording, store information about this port
- if (m_record_file.is_open())
+ if (m_record_stream)
{
// store the default value and digital state
record_write(port.live().defvalue);
diff --git a/src/emu/ioport.h b/src/emu/ioport.h
index 1e98ef3f0ac..dccb5568c78 100644
--- a/src/emu/ioport.h
+++ b/src/emu/ioport.h
@@ -17,11 +17,14 @@
#ifndef MAME_EMU_IOPORT_H
#define MAME_EMU_IOPORT_H
+#include "ioprocs.h"
+
#include <array>
#include <cstdint>
#include <cstring>
#include <ctime>
#include <list>
+#include <memory>
#include <vector>
@@ -354,6 +357,7 @@ enum ioport_type
IPT_UI_CLEAR,
IPT_UI_ZOOM_IN,
IPT_UI_ZOOM_OUT,
+ IPT_UI_ZOOM_DEFAULT,
IPT_UI_PREV_GROUP,
IPT_UI_NEXT_GROUP,
IPT_UI_ROTATE,
@@ -1447,8 +1451,10 @@ private:
s32 m_last_delta_nsec; // nanoseconds that passed since the previous callback
// playback/record information
- emu_file m_record_file; // recording file (nullptr if not recording)
- emu_file m_playback_file; // playback file (nullptr if not recording)
+ emu_file m_record_file; // recording file (closed if not recording)
+ emu_file m_playback_file; // playback file (closed if not recording)
+ util::write_stream::ptr m_record_stream; // recording stream (nullptr if not recording)
+ util::read_stream::ptr m_playback_stream; // playback stream (nullptr if not recording)
u64 m_playback_accumulated_speed; // accumulated speed during playback
u32 m_playback_accumulated_frames; // accumulated frames during playback
emu_file m_timecode_file; // timecode/frames playback file (nullptr if not recording)
@@ -1456,7 +1462,7 @@ private:
attotime m_timecode_last_time;
// storage for inactive configuration
- util::xml::file * m_deselected_card_config; // using smart pointer would pull xmlfile.h into emu.h
+ std::unique_ptr<util::xml::file> m_deselected_card_config;
};
diff --git a/src/emu/machine.cpp b/src/emu/machine.cpp
index f6d171b1fcc..2c1c9eab81f 100644
--- a/src/emu/machine.cpp
+++ b/src/emu/machine.cpp
@@ -316,8 +316,8 @@ int running_machine::run(bool quiet)
if (options().log() && !quiet)
{
m_logfile = std::make_unique<emu_file>(OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr = m_logfile->open("error.log");
- if (filerr != osd_file::error::NONE)
+ std::error_condition const filerr = m_logfile->open("error.log");
+ if (filerr)
throw emu_fatalerror("running_machine::run: unable to open error.log file");
using namespace std::placeholders;
@@ -327,8 +327,8 @@ int running_machine::run(bool quiet)
if (options().debug() && options().debuglog())
{
m_debuglogfile = std::make_unique<emu_file>(OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr = m_debuglogfile->open("debug.log");
- if (filerr != osd_file::error::NONE)
+ std::error_condition const filerr = m_debuglogfile->open("debug.log");
+ if (filerr)
throw emu_fatalerror("running_machine::run: unable to open debug.log file");
}
@@ -874,7 +874,7 @@ void running_machine::handle_saveload(bool load)
if (saverr != STATERR_NONE && !load)
file.remove_on_close();
}
- else if (openflags == OPEN_FLAG_READ && filerr == osd_file::error::NOT_FOUND)
+ else if (openflags == OPEN_FLAG_READ && filerr == std::errc::no_such_file_or_directory)
{
// attempt to load a non-existent savestate, report empty slot
popmessage("Error: No savestate file to load.", opname);
@@ -1100,7 +1100,7 @@ void running_machine::nvram_load()
for (device_nvram_interface &nvram : nvram_interface_enumerator(root_device()))
{
emu_file file(options().nvram_directory(), OPEN_FLAG_READ);
- if (file.open(nvram_filename(nvram.device())) == osd_file::error::NONE)
+ if (!file.open(nvram_filename(nvram.device())))
{
nvram.nvram_load(file);
file.close();
@@ -1122,7 +1122,7 @@ void running_machine::nvram_save()
if (nvram.nvram_can_save())
{
emu_file file(options().nvram_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(nvram_filename(nvram.device())) == osd_file::error::NONE)
+ if (!file.open(nvram_filename(nvram.device())))
{
nvram.nvram_save(file);
file.close();
diff --git a/src/emu/machine.h b/src/emu/machine.h
index 5e436cc3225..8b26dc5c3bd 100644
--- a/src/emu/machine.h
+++ b/src/emu/machine.h
@@ -51,12 +51,6 @@ enum machine_notification
// debug flags
constexpr int DEBUG_FLAG_ENABLED = 0x00000001; // debugging is enabled
constexpr int DEBUG_FLAG_CALL_HOOK = 0x00000002; // CPU cores must call instruction hook
-constexpr int DEBUG_FLAG_WPR_PROGRAM = 0x00000010; // watchpoints are enabled for PROGRAM memory reads
-constexpr int DEBUG_FLAG_WPR_DATA = 0x00000020; // watchpoints are enabled for DATA memory reads
-constexpr int DEBUG_FLAG_WPR_IO = 0x00000040; // watchpoints are enabled for IO memory reads
-constexpr int DEBUG_FLAG_WPW_PROGRAM = 0x00000100; // watchpoints are enabled for PROGRAM memory writes
-constexpr int DEBUG_FLAG_WPW_DATA = 0x00000200; // watchpoints are enabled for DATA memory writes
-constexpr int DEBUG_FLAG_WPW_IO = 0x00000400; // watchpoints are enabled for IO memory writes
constexpr int DEBUG_FLAG_OSD_ENABLED = 0x00001000; // The OSD debugger is enabled
diff --git a/src/emu/memarray.cpp b/src/emu/memarray.cpp
index 48fde5f90ba..22bfa17b80a 100644
--- a/src/emu/memarray.cpp
+++ b/src/emu/memarray.cpp
@@ -52,34 +52,34 @@ void memory_array::set(void *base, u32 bytes, int membits, endianness_t endianne
m_bytes_per_entry = bpe;
// derive data
- switch (bpe*1000 + membits*10 + endianness)
+ switch (bpe*1000 + membits*10 + (endianness == ENDIANNESS_LITTLE ? 0 : 1))
{
- case 1*1000 + 8*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read8_from_8; m_write_entry = &memory_array::write8_to_8; break;
- case 1*1000 + 8*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read8_from_8; m_write_entry = &memory_array::write8_to_8; break;
- case 1*1000 + 16*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read8_from_16le; m_write_entry = &memory_array::write8_to_16le; break;
- case 1*1000 + 16*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read8_from_16be; m_write_entry = &memory_array::write8_to_16be; break;
- case 1*1000 + 32*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read8_from_32le; m_write_entry = &memory_array::write8_to_32le; break;
- case 1*1000 + 32*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read8_from_32be; m_write_entry = &memory_array::write8_to_32be; break;
- case 1*1000 + 64*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read8_from_64le; m_write_entry = &memory_array::write8_to_64le; break;
- case 1*1000 + 64*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read8_from_64be; m_write_entry = &memory_array::write8_to_64be; break;
-
- case 2*1000 + 8*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read16_from_8le; m_write_entry = &memory_array::write16_to_8le; break;
- case 2*1000 + 8*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read16_from_8be; m_write_entry = &memory_array::write16_to_8be; break;
- case 2*1000 + 16*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read16_from_16; m_write_entry = &memory_array::write16_to_16; break;
- case 2*1000 + 16*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read16_from_16; m_write_entry = &memory_array::write16_to_16; break;
- case 2*1000 + 32*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read16_from_32le; m_write_entry = &memory_array::write16_to_32le; break;
- case 2*1000 + 32*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read16_from_32be; m_write_entry = &memory_array::write16_to_32be; break;
- case 2*1000 + 64*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read16_from_64le; m_write_entry = &memory_array::write16_to_64le; break;
- case 2*1000 + 64*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read16_from_64be; m_write_entry = &memory_array::write16_to_64be; break;
-
- case 4*1000 + 8*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read32_from_8le; m_write_entry = &memory_array::write32_to_8le; break;
- case 4*1000 + 8*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read32_from_8be; m_write_entry = &memory_array::write32_to_8be; break;
- case 4*1000 + 16*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read32_from_16le; m_write_entry = &memory_array::write32_to_16le; break;
- case 4*1000 + 16*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read32_from_16be; m_write_entry = &memory_array::write32_to_16be; break;
- case 4*1000 + 32*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read32_from_32; m_write_entry = &memory_array::write32_to_32; break;
- case 4*1000 + 32*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read32_from_32; m_write_entry = &memory_array::write32_to_32; break;
- case 4*1000 + 64*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read32_from_64le; m_write_entry = &memory_array::write32_to_64le; break;
- case 4*1000 + 64*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read32_from_64be; m_write_entry = &memory_array::write32_to_64be; break;
+ case 1*1000 + 8*10 + 0: m_read_entry = &memory_array::read8_from_8; m_write_entry = &memory_array::write8_to_8; break;
+ case 1*1000 + 8*10 + 1: m_read_entry = &memory_array::read8_from_8; m_write_entry = &memory_array::write8_to_8; break;
+ case 1*1000 + 16*10 + 0: m_read_entry = &memory_array::read8_from_16le; m_write_entry = &memory_array::write8_to_16le; break;
+ case 1*1000 + 16*10 + 1: m_read_entry = &memory_array::read8_from_16be; m_write_entry = &memory_array::write8_to_16be; break;
+ case 1*1000 + 32*10 + 0: m_read_entry = &memory_array::read8_from_32le; m_write_entry = &memory_array::write8_to_32le; break;
+ case 1*1000 + 32*10 + 1: m_read_entry = &memory_array::read8_from_32be; m_write_entry = &memory_array::write8_to_32be; break;
+ case 1*1000 + 64*10 + 0: m_read_entry = &memory_array::read8_from_64le; m_write_entry = &memory_array::write8_to_64le; break;
+ case 1*1000 + 64*10 + 1: m_read_entry = &memory_array::read8_from_64be; m_write_entry = &memory_array::write8_to_64be; break;
+
+ case 2*1000 + 8*10 + 0: m_read_entry = &memory_array::read16_from_8le; m_write_entry = &memory_array::write16_to_8le; break;
+ case 2*1000 + 8*10 + 1: m_read_entry = &memory_array::read16_from_8be; m_write_entry = &memory_array::write16_to_8be; break;
+ case 2*1000 + 16*10 + 0: m_read_entry = &memory_array::read16_from_16; m_write_entry = &memory_array::write16_to_16; break;
+ case 2*1000 + 16*10 + 1: m_read_entry = &memory_array::read16_from_16; m_write_entry = &memory_array::write16_to_16; break;
+ case 2*1000 + 32*10 + 0: m_read_entry = &memory_array::read16_from_32le; m_write_entry = &memory_array::write16_to_32le; break;
+ case 2*1000 + 32*10 + 1: m_read_entry = &memory_array::read16_from_32be; m_write_entry = &memory_array::write16_to_32be; break;
+ case 2*1000 + 64*10 + 0: m_read_entry = &memory_array::read16_from_64le; m_write_entry = &memory_array::write16_to_64le; break;
+ case 2*1000 + 64*10 + 1: m_read_entry = &memory_array::read16_from_64be; m_write_entry = &memory_array::write16_to_64be; break;
+
+ case 4*1000 + 8*10 + 0: m_read_entry = &memory_array::read32_from_8le; m_write_entry = &memory_array::write32_to_8le; break;
+ case 4*1000 + 8*10 + 1: m_read_entry = &memory_array::read32_from_8be; m_write_entry = &memory_array::write32_to_8be; break;
+ case 4*1000 + 16*10 + 0: m_read_entry = &memory_array::read32_from_16le; m_write_entry = &memory_array::write32_to_16le; break;
+ case 4*1000 + 16*10 + 1: m_read_entry = &memory_array::read32_from_16be; m_write_entry = &memory_array::write32_to_16be; break;
+ case 4*1000 + 32*10 + 0: m_read_entry = &memory_array::read32_from_32; m_write_entry = &memory_array::write32_to_32; break;
+ case 4*1000 + 32*10 + 1: m_read_entry = &memory_array::read32_from_32; m_write_entry = &memory_array::write32_to_32; break;
+ case 4*1000 + 64*10 + 0: m_read_entry = &memory_array::read32_from_64le; m_write_entry = &memory_array::write32_to_64le; break;
+ case 4*1000 + 64*10 + 1: m_read_entry = &memory_array::read32_from_64be; m_write_entry = &memory_array::write32_to_64be; break;
default: throw emu_fatalerror("Illegal memory bits/bus width combo in memory_array");
}
diff --git a/src/emu/render.cpp b/src/emu/render.cpp
index 1c176929aad..ec718d25df5 100644
--- a/src/emu/render.cpp
+++ b/src/emu/render.cpp
@@ -50,9 +50,9 @@
#include "ui/uimain.h"
-#include "xmlfile.h"
-
-#include <zlib.h>
+#include "util/ioprocsfilter.h"
+#include "util/path.h"
+#include "util/xmlfile.h"
#include <algorithm>
@@ -2117,58 +2117,56 @@ void render_target::load_additional_layout_files(const char *basename, bool have
bool render_target::load_layout_file(const char *dirname, const internal_layout &layout_data, device_t *device)
{
// +1 to ensure data is terminated for XML parser
- auto tempout = make_unique_clear<u8 []>(layout_data.decompressed_size + 1);
-
- z_stream stream;
- int zerr;
-
- // initialize the stream
- memset(&stream, 0, sizeof(stream));
- stream.next_out = tempout.get();
- stream.avail_out = layout_data.decompressed_size;
-
- zerr = inflateInit(&stream);
- if (zerr != Z_OK)
+ std::unique_ptr<u8 []> tempout(new (std::nothrow) u8 [layout_data.decompressed_size + 1]);
+ auto inflater(util::zlib_read(util::ram_read(layout_data.data, layout_data.compressed_size), 8192));
+ if (!tempout || !inflater)
{
- osd_printf_error("render_target::load_layout_file: zlib initialization error\n");
+ osd_printf_error("render_target::load_layout_file: not enough memory to decompress layout\n");
return false;
}
- // decompress this chunk
- stream.next_in = (unsigned char *)layout_data.data;
- stream.avail_in = layout_data.compressed_size;
- zerr = inflate(&stream, Z_NO_FLUSH);
-
- // stop at the end of the stream
- if (zerr == Z_STREAM_END)
+ size_t decompressed = 0;
+ do
{
- // OK
- }
- else if (zerr != Z_OK)
- {
- osd_printf_error("render_target::load_layout_file: zlib decompression error\n");
- inflateEnd(&stream);
- return false;
+ size_t actual;
+ std::error_condition const err = inflater->read(
+ &tempout[decompressed],
+ layout_data.decompressed_size - decompressed,
+ actual);
+ decompressed += actual;
+ if (err)
+ {
+ osd_printf_error(
+ "render_target::load_layout_file: error decompressing layout (%s:%d %s)\n",
+ err.category().name(),
+ err.value(),
+ err.message());
+ return false;
+ }
+ if (!actual && (layout_data.decompressed_size < decompressed))
+ {
+ osd_printf_warning(
+ "render_target::load_layout_file: expected %u bytes of decompressed data but only got %u\n",
+ layout_data.decompressed_size,
+ decompressed);
+ break;
+ }
}
+ while (layout_data.decompressed_size > decompressed);
+ inflater.reset();
- // clean up
- zerr = inflateEnd(&stream);
- if (zerr != Z_OK)
- osd_printf_error("render_target::load_layout_file: zlib cleanup error\n");
-
+ tempout[decompressed] = 0U;
util::xml::file::ptr rootnode(util::xml::file::string_read(reinterpret_cast<char const *>(tempout.get()), nullptr));
tempout.reset();
// if we didn't get a properly-formatted XML file, record a warning and exit
if (!load_layout_file(device ? *device : m_manager.machine().root_device(), *rootnode, m_manager.machine().options().art_path(), dirname))
{
- osd_printf_warning("Improperly formatted XML string, ignoring\n");
+ osd_printf_warning("render_target::load_layout_file: Improperly formatted XML string, ignoring\n");
return false;
}
- else
- {
- return true;
- }
+
+ return true;
}
bool render_target::load_layout_file(const char *dirname, const char *filename)
@@ -2186,7 +2184,7 @@ bool render_target::load_layout_file(const char *dirname, const char *filename)
emu_file layoutfile(m_manager.machine().options().art_path(), OPEN_FLAG_READ);
layoutfile.set_restrict_to_mediapath(1);
bool result(false);
- for (osd_file::error filerr = layoutfile.open(fname); osd_file::error::NONE == filerr; filerr = layoutfile.open_next())
+ for (std::error_condition filerr = layoutfile.open(fname); !filerr; filerr = layoutfile.open_next())
{
// read the file and parse as XML
util::xml::file::ptr const rootnode(util::xml::file::read(layoutfile, &parseopt));
diff --git a/src/emu/rendfont.cpp b/src/emu/rendfont.cpp
index c20a7979bbc..ae295e39e2d 100644
--- a/src/emu/rendfont.cpp
+++ b/src/emu/rendfont.cpp
@@ -594,8 +594,8 @@ render_font::render_font(render_manager &manager, const char *filename)
// load the compiled in data instead
emu_file ramfile(OPEN_FLAG_READ);
- osd_file::error const filerr(ramfile.open_ram(font_uismall, sizeof(font_uismall)));
- if (osd_file::error::NONE == filerr)
+ std::error_condition const filerr(ramfile.open_ram(font_uismall, sizeof(font_uismall)));
+ if (!filerr)
load_cached(ramfile, 0, 0);
render_font_command_glyph();
}
@@ -908,14 +908,14 @@ float render_font::utf8string_width(float height, float aspect, std::string_view
bool render_font::load_cached_bdf(const char *filename)
{
- osd_file::error filerr;
+ std::error_condition filerr;
u32 chunk;
u64 bytes;
// first try to open the BDF itself
emu_file file(m_manager.machine().options().font_path(), OPEN_FLAG_READ);
filerr = file.open(filename);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
return false;
// determine the file size and allocate memory
@@ -952,7 +952,7 @@ bool render_font::load_cached_bdf(const char *filename)
{
emu_file cachefile(m_manager.machine().options().font_path(), OPEN_FLAG_READ);
filerr = cachefile.open(cachedname);
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
{
// if we have a cached version, load it
bool const result = load_cached(cachefile, m_rawsize, hash);
@@ -1456,8 +1456,8 @@ bool render_font::save_cached(const char *filename, u64 length, u32 hash)
// attempt to open the file
emu_file file(m_manager.machine().options().font_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE);
- osd_file::error const filerr = file.open(filename);
- if (osd_file::error::NONE != filerr)
+ std::error_condition const filerr = file.open(filename);
+ if (filerr)
return false;
// count glyphs
@@ -1596,7 +1596,7 @@ void render_font::render_font_command_glyph()
{
// FIXME: this is copy/pasta from the BDC loading, and it shouldn't be injected into every font
emu_file file(OPEN_FLAG_READ);
- if (file.open_ram(font_uicmd14, sizeof(font_uicmd14)) == osd_file::error::NONE)
+ if (!file.open_ram(font_uicmd14, sizeof(font_uicmd14)))
{
// get the file size, read the header, and check that it looks good
u64 const filesize(file.size());
diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp
index 13b2d6e16c1..c3f7a70a2e8 100644
--- a/src/emu/rendlay.cpp
+++ b/src/emu/rendlay.cpp
@@ -17,10 +17,11 @@
#include "rendutil.h"
#include "video/rgbutil.h"
-#include "nanosvg.h"
-#include "unicode.h"
-#include "vecstream.h"
-#include "xmlfile.h"
+#include "util/nanosvg.h"
+#include "util/path.h"
+#include "util/unicode.h"
+#include "util/vecstream.h"
+#include "util/xmlfile.h"
#include <cctype>
#include <algorithm>
@@ -1713,12 +1714,10 @@ private:
std::string filename;
if (!m_searchpath.empty())
filename = m_dirname;
- if (!filename.empty() && !util::is_directory_separator(filename[filename.size() - 1]))
- filename.append(PATH_SEPARATOR);
- filename.append(m_imagefile);
+ util::path_append(filename, m_imagefile);
LOGMASKED(LOG_IMAGE_LOAD, "Image component attempt to load image file '%s'\n", filename);
- osd_file::error const imgerr = file.open(filename);
- if (osd_file::error::NONE == imgerr)
+ std::error_condition const imgerr = file.open(filename);
+ if (!imgerr)
{
if (!load_bitmap(file))
{
@@ -1729,7 +1728,8 @@ private:
}
else
{
- LOGMASKED(LOG_IMAGE_LOAD, "Image component unable to open image file '%s'\n", filename);
+ LOGMASKED(LOG_IMAGE_LOAD, "Image component unable to open image file '%s' (%s:%d %s)\n",
+ filename, imgerr.category().name(), imgerr.value(), imgerr.message());
}
}
else if (!m_data.empty())
@@ -1745,12 +1745,10 @@ private:
std::string filename;
if (!m_searchpath.empty())
filename = m_dirname;
- if (!filename.empty() && !util::is_directory_separator(filename[filename.size() - 1]))
- filename.append(PATH_SEPARATOR);
- filename.append(m_alphafile);
+ util::path_append(filename, m_alphafile);
LOGMASKED(LOG_IMAGE_LOAD, "Image component attempt to load alpha channel from file '%s'\n", filename);
- osd_file::error const alferr = file.open(filename);
- if (osd_file::error::NONE == alferr)
+ std::error_condition const alferr = file.open(filename);
+ if (!alferr)
{
// TODO: no way to detect corner case where we had alpha from the image but the alpha PNG makes it entirely opaque
if (render_load_png(m_bitmap, file, true))
@@ -1759,7 +1757,8 @@ private:
}
else
{
- LOGMASKED(LOG_IMAGE_LOAD, "Image component unable to open alpha channel file '%s'\n", filename);
+ LOGMASKED(LOG_IMAGE_LOAD, "Image component unable to open alpha channel file '%s' (%s:%d %s)\n",
+ filename, alferr.category().name(), alferr.value(), alferr.message());
}
}
else if (m_svg)
@@ -1841,8 +1840,8 @@ private:
// make a file wrapper for the data and see if it looks like a bitmap
util::core_file::ptr file;
- osd_file::error const filerr(util::core_file::open_ram(m_data.c_str(), m_data.size(), OPEN_FLAG_READ, file));
- bool const bitmapdata((osd_file::error::NONE == filerr) && file && load_bitmap(*file));
+ std::error_condition const filerr(util::core_file::open_ram(m_data.c_str(), m_data.size(), OPEN_FLAG_READ, file));
+ bool const bitmapdata(!filerr && file && load_bitmap(*file));
file.reset();
// if it didn't look like a bitmap, see if it looks like it might be XML and hence SVG
@@ -3398,12 +3397,10 @@ private:
std::string filename;
if (!m_searchpath.empty())
filename = m_dirname;
- if (!filename.empty() && !util::is_directory_separator(filename[filename.size() - 1]))
- filename.append(PATH_SEPARATOR);
- filename.append(m_imagefile[number]);
+ util::path_append(filename, m_imagefile[number]);
// load the basic bitmap
- if (file.open(filename) == osd_file::error::NONE)
+ if (!file.open(filename))
render_load_png(m_bitmap[number], file);
// if we can't load the bitmap just use text rendering
diff --git a/src/emu/rendlay.h b/src/emu/rendlay.h
index fb7871bd0ef..5555af820ac 100644
--- a/src/emu/rendlay.h
+++ b/src/emu/rendlay.h
@@ -52,12 +52,11 @@ class view_environment;
/// \brief A description of a piece of visible artwork
///
-/// Most view_items (except for those in the screen layer) have exactly
+/// Most view items (except for those referencing screens) have exactly
/// one layout_element which describes the contents of the item.
/// Elements are separate from items because they can be re-used
/// multiple times within a layout. Even though an element can contain
-/// a number of components, they are treated as if they were a single
-/// bitmap.
+/// a number of components, they are drawn as a single textured quad.
class layout_element
{
public:
@@ -76,13 +75,14 @@ public:
void preload();
private:
- /// \brief An image, rectangle, or disk in an element
+ /// \brief A drawing component within a layout element
///
- /// Each layout_element contains one or more components. Each
+ /// Each #layout_element contains one or more components. Each
/// component can describe either an image or a rectangle/disk
- /// primitive. Each component also has a "state" associated with it,
- /// which controls whether or not the component is visible (if the
- /// owning item has the same state, it is visible).
+ /// primitive. A component can also have a state mask and value
+ /// for controlling visibility. If the state of the item
+ /// instantiating the element matches the component's state value
+ /// for the bits that are set in the mask, the component is visible.
class component
{
public:
@@ -188,14 +188,14 @@ private:
};
-/// \brief A reusable group of elements
+/// \brief A reusable group of items
///
/// Views expand/flatten groups into their component elements applying
-/// an optional coordinate transform. This is mainly useful duplicating
-/// the same sublayout in multiple views. It would be more useful
-/// within a view if it could be parameterised. Groups only exist while
-/// parsing a layout file - no information about element grouping is
-/// preserved.
+/// an optional coordinate transform. This is useful for duplicating
+/// the same sublayout in multiple views, or grouping related items to
+/// simplify overall view arrangement. Groups only exist while parsing
+/// a layout file - no information about element grouping is preserved
+/// after the views have been built.
class layout_group
{
public:
@@ -233,7 +233,7 @@ private:
};
-/// \brief A single view within a layout_file
+/// \brief A single view within a #layout_file
///
/// The view is described using arbitrary coordinates that are scaled to
/// fit within the render target. Pixels within a view are assumed to
diff --git a/src/emu/romload.cpp b/src/emu/romload.cpp
index 36d7896e467..c4c3101bc89 100644
--- a/src/emu/romload.cpp
+++ b/src/emu/romload.cpp
@@ -101,15 +101,15 @@ std::vector<std::string> make_software_searchpath(software_list_device &swlist,
}
-chd_error do_open_disk(const emu_options &options, std::initializer_list<std::reference_wrapper<const std::vector<std::string> > > searchpath, const rom_entry *romp, chd_file &chd, std::function<const rom_entry * ()> next_parent)
+std::error_condition do_open_disk(const emu_options &options, std::initializer_list<std::reference_wrapper<const std::vector<std::string> > > searchpath, const rom_entry *romp, chd_file &chd, std::function<const rom_entry * ()> next_parent)
{
// hashes are fixed, but we might need to try multiple filenames
std::set<std::string> tried;
const util::hash_collection hashes(romp->hashdata());
std::string filename, fullpath;
const rom_entry *parent(nullptr);
- chd_error result(CHDERR_FILE_NOT_FOUND);
- while (romp && (CHDERR_NONE != result))
+ std::error_condition result(std::errc::no_such_file_or_directory);
+ while (romp && result)
{
filename = romp->name() + ".chd";
if (tried.insert(filename).second)
@@ -120,8 +120,8 @@ chd_error do_open_disk(const emu_options &options, std::initializer_list<std::re
{
imgfile.reset(new emu_file(options.media_path(), paths, OPEN_FLAG_READ));
imgfile->set_restrict_to_mediapath(1);
- const osd_file::error filerr(imgfile->open(filename, OPEN_FLAG_READ));
- if (osd_file::error::NONE == filerr)
+ const std::error_condition filerr(imgfile->open(filename, OPEN_FLAG_READ));
+ if (!filerr)
break;
else
imgfile.reset();
@@ -132,12 +132,12 @@ chd_error do_open_disk(const emu_options &options, std::initializer_list<std::re
{
fullpath = imgfile->fullpath();
imgfile.reset();
- result = chd.open(fullpath.c_str());
+ result = chd.open(fullpath);
}
}
// walk the parents looking for a CHD with the same hashes but a different name
- if (CHDERR_NONE != result)
+ if (result)
{
while (romp)
{
@@ -345,11 +345,11 @@ chd_file *rom_load_manager::get_disk_handle(std::string_view region)
file associated with the given region
-------------------------------------------------*/
-int rom_load_manager::set_disk_handle(std::string_view region, const char *fullpath)
+std::error_condition rom_load_manager::set_disk_handle(std::string_view region, const char *fullpath)
{
auto chd = std::make_unique<open_chd>(region);
auto err = chd->orig_chd().open(fullpath);
- if (err == CHDERR_NONE)
+ if (!err)
m_chd_list.push_back(std::move(chd));
return err;
}
@@ -439,7 +439,7 @@ void rom_load_manager::fill_random(u8 *base, u32 length)
for missing files
-------------------------------------------------*/
-void rom_load_manager::handle_missing_file(const rom_entry *romp, const std::vector<std::string> &tried_file_names, chd_error chderr)
+void rom_load_manager::handle_missing_file(const rom_entry *romp, const std::vector<std::string> &tried_file_names, std::error_condition chderr)
{
std::string tried;
if (!tried_file_names.empty())
@@ -453,12 +453,12 @@ void rom_load_manager::handle_missing_file(const rom_entry *romp, const std::vec
tried += ')';
}
- const bool is_chd(chderr != CHDERR_NONE);
+ const bool is_chd(chderr);
const std::string name(is_chd ? romp->name() + ".chd" : romp->name());
- const bool is_chd_error(is_chd && chderr != CHDERR_FILE_NOT_FOUND);
+ const bool is_chd_error(is_chd && chderr != std::errc::no_such_file_or_directory);
if (is_chd_error)
- m_errorstring.append(string_format("%s CHD ERROR: %s\n", name, chd_file::error_string(chderr)));
+ m_errorstring.append(string_format("%s CHD ERROR: %s\n", name, chderr.message()));
if (ROM_ISOPTIONAL(romp))
{
@@ -638,7 +638,7 @@ void rom_load_manager::region_post_process(memory_region *region, bool invert)
std::unique_ptr<emu_file> rom_load_manager::open_rom_file(std::initializer_list<std::reference_wrapper<const std::vector<std::string> > > searchpath, const rom_entry *romp, std::vector<std::string> &tried_file_names, bool from_list)
{
- osd_file::error filerr = osd_file::error::NOT_FOUND;
+ std::error_condition filerr = std::errc::no_such_file_or_directory;
u32 const romsize = rom_file_size(romp);
tried_file_names.clear();
@@ -664,14 +664,14 @@ std::unique_ptr<emu_file> rom_load_manager::open_rom_file(std::initializer_list<
m_romsloadedsize += romsize;
// return the result
- if (osd_file::error::NONE != filerr)
+ if (filerr)
return nullptr;
else
return result;
}
-std::unique_ptr<emu_file> rom_load_manager::open_rom_file(const std::vector<std::string> &paths, std::vector<std::string> &tried, bool has_crc, u32 crc, std::string_view name, osd_file::error &filerr)
+std::unique_ptr<emu_file> rom_load_manager::open_rom_file(const std::vector<std::string> &paths, std::vector<std::string> &tried, bool has_crc, u32 crc, std::string_view name, std::error_condition &filerr)
{
// record the set names we search
tried.insert(tried.end(), paths.begin(), paths.end());
@@ -685,7 +685,7 @@ std::unique_ptr<emu_file> rom_load_manager::open_rom_file(const std::vector<std:
filerr = result->open(name);
// don't return anything if unsuccessful
- if (osd_file::error::NONE != filerr)
+ if (filerr)
return nullptr;
else
return result;
@@ -939,7 +939,7 @@ void rom_load_manager::process_rom_entries(std::initializer_list<std::reference_
{
file = open_rom_file(searchpath, romp, tried_file_names, from_list);
if (!file)
- handle_missing_file(romp, tried_file_names, CHDERR_NONE);
+ handle_missing_file(romp, tried_file_names, std::error_condition());
}
// loop until we run out of reloads
@@ -1000,44 +1000,44 @@ void rom_load_manager::process_rom_entries(std::initializer_list<std::reference_
open_disk_diff - open a DISK diff file
-------------------------------------------------*/
-chd_error rom_load_manager::open_disk_diff(emu_options &options, const rom_entry *romp, chd_file &source, chd_file &diff_chd)
+std::error_condition rom_load_manager::open_disk_diff(emu_options &options, const rom_entry *romp, chd_file &source, chd_file &diff_chd)
{
// TODO: use system name and/or software list name in the path - the current setup doesn't scale
std::string fname = romp->name() + ".dif";
- /* try to open the diff */
+ // try to open the diff
LOG("Opening differencing image file: %s\n", fname.c_str());
emu_file diff_file(options.diff_directory(), OPEN_FLAG_READ | OPEN_FLAG_WRITE);
- osd_file::error filerr = diff_file.open(fname);
- if (filerr == osd_file::error::NONE)
+ std::error_condition filerr = diff_file.open(fname);
+ if (!filerr)
{
std::string fullpath(diff_file.fullpath());
diff_file.close();
LOG("Opening differencing image file: %s\n", fullpath.c_str());
- return diff_chd.open(fullpath.c_str(), true, &source);
+ return diff_chd.open(fullpath, true, &source);
}
- /* didn't work; try creating it instead */
+ // didn't work; try creating it instead
LOG("Creating differencing image: %s\n", fname.c_str());
diff_file.set_openflags(OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
filerr = diff_file.open(fname);
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
{
std::string fullpath(diff_file.fullpath());
diff_file.close();
- /* create the CHD */
+ // create the CHD
LOG("Creating differencing image file: %s\n", fullpath.c_str());
chd_codec_type compression[4] = { CHD_CODEC_NONE };
- chd_error err = diff_chd.create(fullpath.c_str(), source.logical_bytes(), source.hunk_bytes(), compression, source);
- if (err != CHDERR_NONE)
+ std::error_condition err = diff_chd.create(fullpath, source.logical_bytes(), source.hunk_bytes(), compression, source);
+ if (err)
return err;
return diff_chd.clone_all_metadata(source);
}
- return CHDERR_FILE_NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
}
@@ -1059,7 +1059,7 @@ void rom_load_manager::process_disk_entries(std::initializer_list<std::reference
if (ROMENTRY_ISFILE(romp))
{
auto chd = std::make_unique<open_chd>(regiontag);
- chd_error err;
+ std::error_condition err;
/* make the filename of the source */
const std::string filename = romp->name() + ".chd";
@@ -1068,7 +1068,7 @@ void rom_load_manager::process_disk_entries(std::initializer_list<std::reference
// FIXME: we've lost the ability to search parents here
LOG("Opening disk image: %s\n", filename.c_str());
err = do_open_disk(machine().options(), searchpath, romp, chd->orig_chd(), next_parent);
- if (err != CHDERR_NONE)
+ if (err)
{
handle_missing_file(romp, std::vector<std::string>(), err);
chd = nullptr;
@@ -1098,9 +1098,9 @@ void rom_load_manager::process_disk_entries(std::initializer_list<std::reference
{
/* try to open or create the diff */
err = open_disk_diff(machine().options(), romp, chd->orig_chd(), chd->diff_chd());
- if (err != CHDERR_NONE)
+ if (err)
{
- m_errorstring.append(string_format("%s DIFF CHD ERROR: %s\n", filename, chd_file::error_string(err)));
+ m_errorstring.append(string_format("%s DIFF CHD ERROR: %s\n", filename, err.message()));
m_errors++;
chd = nullptr;
continue;
@@ -1132,7 +1132,7 @@ std::vector<std::string> rom_load_manager::get_software_searchpath(software_list
device
-------------------------------------------------*/
-chd_error rom_load_manager::open_disk_image(const emu_options &options, const device_t &device, const rom_entry *romp, chd_file &image_chd)
+std::error_condition rom_load_manager::open_disk_image(const emu_options &options, const device_t &device, const rom_entry *romp, chd_file &image_chd)
{
const std::vector<std::string> searchpath(device.searchpath());
@@ -1151,7 +1151,7 @@ chd_error rom_load_manager::open_disk_image(const emu_options &options, const de
software item
-------------------------------------------------*/
-chd_error rom_load_manager::open_disk_image(const emu_options &options, software_list_device &swlist, const software_info &swinfo, const rom_entry *romp, chd_file &image_chd)
+std::error_condition rom_load_manager::open_disk_image(const emu_options &options, software_list_device &swlist, const software_info &swinfo, const rom_entry *romp, chd_file &image_chd)
{
std::vector<software_info const *> parents;
std::vector<std::string> searchpath = make_software_searchpath(swlist, swinfo, parents);
diff --git a/src/emu/romload.h b/src/emu/romload.h
index 29caaf8e124..76fdb111cc6 100644
--- a/src/emu/romload.h
+++ b/src/emu/romload.h
@@ -18,6 +18,7 @@
#include <functional>
#include <initializer_list>
#include <string>
+#include <system_error>
#include <type_traits>
#include <vector>
@@ -419,7 +420,7 @@ public:
chd_file *get_disk_handle(std::string_view region);
/* set a pointer to the CHD file associated with the given region */
- int set_disk_handle(std::string_view region, const char *fullpath);
+ std::error_condition set_disk_handle(std::string_view region, const char *fullpath);
void load_software_part_region(device_t &device, software_list_device &swlist, std::string_view swname, const rom_entry *start_region);
@@ -427,27 +428,27 @@ public:
static std::vector<std::string> get_software_searchpath(software_list_device &swlist, const software_info &swinfo);
/* open a disk image, searching up the parent and loading by checksum */
- static chd_error open_disk_image(const emu_options &options, const device_t &device, const rom_entry *romp, chd_file &image_chd);
- static chd_error open_disk_image(const emu_options &options, software_list_device &swlist, const software_info &swinfo, const rom_entry *romp, chd_file &image_chd);
+ static std::error_condition open_disk_image(const emu_options &options, const device_t &device, const rom_entry *romp, chd_file &image_chd);
+ static std::error_condition open_disk_image(const emu_options &options, software_list_device &swlist, const software_info &swinfo, const rom_entry *romp, chd_file &image_chd);
private:
void determine_bios_rom(device_t &device, const char *specbios);
void count_roms();
void fill_random(u8 *base, u32 length);
- void handle_missing_file(const rom_entry *romp, const std::vector<std::string> &tried_file_names, chd_error chderr);
+ void handle_missing_file(const rom_entry *romp, const std::vector<std::string> &tried_file_names, std::error_condition chderr);
void dump_wrong_and_correct_checksums(const util::hash_collection &hashes, const util::hash_collection &acthashes);
void verify_length_and_hash(emu_file *file, std::string_view name, u32 explength, const util::hash_collection &hashes);
void display_loading_rom_message(const char *name, bool from_list);
void display_rom_load_results(bool from_list);
void region_post_process(memory_region *region, bool invert);
std::unique_ptr<emu_file> open_rom_file(std::initializer_list<std::reference_wrapper<const std::vector<std::string> > > searchpath, const rom_entry *romp, std::vector<std::string> &tried_file_names, bool from_list);
- std::unique_ptr<emu_file> open_rom_file(const std::vector<std::string> &paths, std::vector<std::string> &tried, bool has_crc, u32 crc, std::string_view name, osd_file::error &filerr);
+ std::unique_ptr<emu_file> open_rom_file(const std::vector<std::string> &paths, std::vector<std::string> &tried, bool has_crc, u32 crc, std::string_view name, std::error_condition &filerr);
int rom_fread(emu_file *file, u8 *buffer, int length, const rom_entry *parent_region);
int read_rom_data(emu_file *file, const rom_entry *parent_region, const rom_entry *romp);
void fill_rom_data(const rom_entry *romp);
void copy_rom_data(const rom_entry *romp);
void process_rom_entries(std::initializer_list<std::reference_wrapper<const std::vector<std::string> > > searchpath, u8 bios, const rom_entry *parent_region, const rom_entry *romp, bool from_list);
- chd_error open_disk_diff(emu_options &options, const rom_entry *romp, chd_file &source, chd_file &diff_chd);
+ std::error_condition open_disk_diff(emu_options &options, const rom_entry *romp, chd_file &source, chd_file &diff_chd);
void process_disk_entries(std::initializer_list<std::reference_wrapper<const std::vector<std::string> > > searchpath, std::string_view regiontag, const rom_entry *romp, std::function<const rom_entry * ()> next_parent);
void normalize_flags_for_device(std::string_view rgntag, u8 &width, endianness_t &endian);
void process_region_list();
diff --git a/src/emu/save.cpp b/src/emu/save.cpp
index 96fb3429a1c..120fa883655 100644
--- a/src/emu/save.cpp
+++ b/src/emu/save.cpp
@@ -24,7 +24,10 @@
#include "emu.h"
#include "emuopts.h"
-#include "coreutil.h"
+
+#include "util/coreutil.h"
+#include "util/ioprocs.h"
+#include "util/ioprocsfilter.h"
//**************************************************************************
@@ -212,7 +215,6 @@ save_error save_manager::check_file(running_machine &machine, emu_file &file, co
sig = machine.save().signature();
// seek to the beginning and read the header
- file.compress(FCOMPRESS_NONE);
file.seek(0, SEEK_SET);
u8 header[HEADER_SIZE];
if (file.read(header, sizeof(header)) != sizeof(header))
@@ -257,20 +259,28 @@ void save_manager::dispatch_presave()
save_error save_manager::write_file(emu_file &file)
{
- return do_write(
+ util::write_stream::ptr writer;
+ save_error err = do_write(
[] (size_t total_size) { return true; },
- [&file] (const void *data, size_t size) { return file.write(data, size) == size; },
- [&file] ()
+ [&writer] (const void *data, size_t size)
{
- file.compress(FCOMPRESS_NONE);
- file.seek(0, SEEK_SET);
- return true;
+ size_t written;
+ std::error_condition filerr = writer->write(data, size, written);
+ return !filerr && (size == written);
},
- [&file] ()
+ [&file, &writer] ()
{
- file.compress(FCOMPRESS_MEDIUM);
- return true;
+ if (file.seek(0, SEEK_SET))
+ return false;
+ writer = util::core_file_read_write(file);
+ return bool(writer);
+ },
+ [&file, &writer] ()
+ {
+ writer = util::zlib_write(util::core_file_read_write(file), 6, 16384);
+ return bool(writer);
});
+ return (STATERR_NONE != err) ? err : writer->finalize() ? STATERR_WRITE_ERROR : STATERR_NONE;
}
@@ -280,19 +290,26 @@ save_error save_manager::write_file(emu_file &file)
save_error save_manager::read_file(emu_file &file)
{
+ util::read_stream::ptr reader;
return do_read(
[] (size_t total_size) { return true; },
- [&file] (void *data, size_t size) { return file.read(data, size) == size; },
- [&file] ()
+ [&reader] (void *data, size_t size)
{
- file.compress(FCOMPRESS_NONE);
- file.seek(0, SEEK_SET);
- return true;
+ std::size_t read;
+ std::error_condition filerr = reader->read(data, size, read);
+ return !filerr && (read == size);
},
- [&file] ()
+ [&file, &reader] ()
{
- file.compress(FCOMPRESS_MEDIUM);
- return true;
+ if (file.seek(0, SEEK_SET))
+ return false;
+ reader = util::core_file_read(file);
+ return bool(reader);
+ },
+ [&file, &reader] ()
+ {
+ reader = util::zlib_read(util::core_file_read(file), 16384);
+ return bool(reader);
});
}
diff --git a/src/emu/save.h b/src/emu/save.h
index bb3715e0824..99af7139130 100644
--- a/src/emu/save.h
+++ b/src/emu/save.h
@@ -55,12 +55,12 @@ typedef named_delegate<void ()> save_prepost_delegate;
// saved; in general, this is intended only to be used for specific enum types
// defined by your device
#define ALLOW_SAVE_TYPE(TYPE) \
- template <> struct save_manager::is_atom<TYPE> { static constexpr bool value = true; };
+ template <> struct save_manager::is_atom<TYPE> : public std::true_type { };
// use this as above, but also to declare that std::vector<TYPE> is safe as well
#define ALLOW_SAVE_TYPE_AND_VECTOR(TYPE) \
ALLOW_SAVE_TYPE(TYPE) \
- template <> struct save_manager::is_vector_safe<TYPE> { static constexpr bool value = true; };
+ template <> struct save_manager::is_vector_safe<TYPE> : public std::true_type { };
// use this for saving members of structures in arrays
#define STRUCT_MEMBER(s, m) s, &save_manager::pointer_unwrap<decltype(s)>::underlying_type::m, #s "." #m
@@ -99,8 +99,8 @@ class save_manager
};
// set of templates to identify valid save types
- template <typename ItemType> struct is_atom { static constexpr bool value = false; };
- template <typename ItemType> struct is_vector_safe { static constexpr bool value = false; };
+ template <typename ItemType> struct is_atom : public std::false_type { };
+ template <typename ItemType> struct is_vector_safe : public std::false_type { };
class state_entry
{
diff --git a/src/emu/screen.cpp b/src/emu/screen.cpp
index 93d42f4f9b6..1042868d985 100644
--- a/src/emu/screen.cpp
+++ b/src/emu/screen.cpp
@@ -1886,8 +1886,8 @@ void screen_device::finalize_burnin()
// compute the name and create the file
emu_file file(machine().options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr = file.open(util::string_format("%s" PATH_SEPARATOR "burnin-%s.png", machine().basename(), tag() + 1));
- if (filerr == osd_file::error::NONE)
+ std::error_condition const filerr = file.open(util::string_format("%s" PATH_SEPARATOR "burnin-%s.png", machine().basename(), tag() + 1));
+ if (!filerr)
{
util::png_info pnginfo;
@@ -1917,7 +1917,7 @@ void screen_device::load_effect_overlay(const char *filename)
// load the file
m_screen_overlay_bitmap.reset();
emu_file file(machine().options().art_path(), OPEN_FLAG_READ);
- if (file.open(fullname) == osd_file::error::NONE)
+ if (!file.open(fullname))
{
render_load_png(m_screen_overlay_bitmap, file);
file.close();
diff --git a/src/emu/screen.h b/src/emu/screen.h
index 267f7928718..8e81b3e951a 100644
--- a/src/emu/screen.h
+++ b/src/emu/screen.h
@@ -545,13 +545,4 @@ DECLARE_DEVICE_TYPE(SCREEN, screen_device)
// iterator helper
typedef device_type_enumerator<screen_device> screen_device_enumerator;
-/*!
- @defgroup Screen device configuration functions
- @{
- @def set_type
- Modify the screen device type
- @see screen_type_enum
- @}
- */
-
#endif // MAME_EMU_SCREEN_H
diff --git a/src/emu/softlist_dev.cpp b/src/emu/softlist_dev.cpp
index c48f7820c23..7d25dd17013 100644
--- a/src/emu/softlist_dev.cpp
+++ b/src/emu/softlist_dev.cpp
@@ -288,9 +288,9 @@ void software_list_device::parse()
// attempt to open the file
emu_file file(mconfig().options().hash_path(), OPEN_FLAG_READ);
- const osd_file::error filerr = file.open(m_list_name + ".xml");
+ const std::error_condition filerr = file.open(m_list_name + ".xml");
m_filename = file.filename();
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
{
// parse if no error
std::ostringstream errs;
@@ -298,7 +298,7 @@ void software_list_device::parse()
file.close();
m_errors = errs.str();
}
- else if (filerr == osd_file::error::NOT_FOUND)
+ else if (std::errc::no_such_file_or_directory == filerr)
{
osd_printf_verbose("%s: Software list %s not found\n", tag(), m_filename);
}
diff --git a/src/emu/sound.h b/src/emu/sound.h
index 3aebdd71be9..d2da7be32b4 100644
--- a/src/emu/sound.h
+++ b/src/emu/sound.h
@@ -763,6 +763,7 @@ public:
attotime last_update() const { return m_last_update; }
int sample_count() const { return m_samples_this_update; }
int unique_id() { return m_unique_id++; }
+ stream_buffer::sample_t compressor_scale() const { return m_compressor_scale; }
// allocate a new stream with a new-style callback
sound_stream *stream_alloc(device_t &device, u32 inputs, u32 outputs, u32 sample_rate, stream_update_delegate callback, sound_stream_flags flags);
diff --git a/src/emu/uiinput.h b/src/emu/uiinput.h
index 29b18d06d30..3fc89d7a4ff 100644
--- a/src/emu/uiinput.h
+++ b/src/emu/uiinput.h
@@ -103,7 +103,7 @@ public:
private:
// constants
- constexpr static unsigned EVENT_QUEUE_SIZE = 128;
+ static constexpr unsigned EVENT_QUEUE_SIZE = 128;
// internal state
running_machine & m_machine; // reference to our machine
diff --git a/src/emu/validity.cpp b/src/emu/validity.cpp
index 9bd9edb1ff0..fd8b8d4464b 100644
--- a/src/emu/validity.cpp
+++ b/src/emu/validity.cpp
@@ -1493,6 +1493,10 @@ void validity_checker::validate_driver(device_t &root)
if (clone_of != -1 && (clone_of = driver_list::non_bios_clone(clone_of)) != -1)
osd_printf_error("Driver is a clone of a clone\n");
+ // look for drivers specifying a parent ROM device type
+ if (root.type().parent_rom_device_type())
+ osd_printf_error("Driver has parent ROM device type '%s'\n", root.type().parent_rom_device_type()->shortname());
+
// make sure the driver name is not too long
if (!is_clone && strlen(m_current_driver->name) > 16)
osd_printf_error("Parent driver name must be 16 characters or less\n");
@@ -1548,11 +1552,11 @@ void validity_checker::validate_driver(device_t &root)
// catch invalid flag combinations
if (unemulated & ~device_t::feature::ALL)
- osd_printf_error("Driver has invalid unemulated feature flags (0x%08lX)\n", static_cast<unsigned long>(unemulated & ~device_t::feature::ALL));
+ osd_printf_error("Driver has invalid unemulated feature flags (0x%08X)\n", util::underlying_value(unemulated & ~device_t::feature::ALL));
if (imperfect & ~device_t::feature::ALL)
- osd_printf_error("Driver has invalid imperfect feature flags (0x%08lX)\n", static_cast<unsigned long>(imperfect & ~device_t::feature::ALL));
+ osd_printf_error("Driver has invalid imperfect feature flags (0x%08X)\n", util::underlying_value(imperfect & ~device_t::feature::ALL));
if (unemulated & imperfect)
- osd_printf_error("Driver cannot have features that are both unemulated and imperfect (0x%08lX)\n", static_cast<unsigned long>(unemulated & imperfect));
+ osd_printf_error("Driver cannot have features that are both unemulated and imperfect (0x%08X)\n", util::underlying_value(unemulated & imperfect));
if ((m_current_driver->flags & machine_flags::NO_SOUND_HW) && ((unemulated | imperfect) & device_t::feature::SOUND))
osd_printf_error("Machine without sound hardware cannot have unemulated/imperfect sound\n");
}
@@ -2203,11 +2207,22 @@ void validity_checker::validate_device_types()
device_t::feature_type const unemulated(dev->type().unemulated_features());
device_t::feature_type const imperfect(dev->type().imperfect_features());
if (unemulated & ~device_t::feature::ALL)
- osd_printf_error("Device has invalid unemulated feature flags (0x%08lX)\n", static_cast<unsigned long>(unemulated & ~device_t::feature::ALL));
+ osd_printf_error("Device has invalid unemulated feature flags (0x%08X)\n", util::underlying_value(unemulated & ~device_t::feature::ALL));
if (imperfect & ~device_t::feature::ALL)
- osd_printf_error("Device has invalid imperfect feature flags (0x%08lX)\n", static_cast<unsigned long>(imperfect & ~device_t::feature::ALL));
+ osd_printf_error("Device has invalid imperfect feature flags (0x%08X)\n", util::underlying_value(imperfect & ~device_t::feature::ALL));
if (unemulated & imperfect)
- osd_printf_error("Device cannot have features that are both unemulated and imperfect (0x%08lX)\n", static_cast<unsigned long>(unemulated & imperfect));
+ osd_printf_error("Device cannot have features that are both unemulated and imperfect (0x%08X)\n", util::underlying_value(unemulated & imperfect));
+
+ // check that parents are only ever one generation deep
+ auto const parent(dev->type().parent_rom_device_type());
+ if (parent)
+ {
+ auto const grandparent(parent->parent_rom_device_type());
+ if ((dev->type() == *parent) || !strcmp(parent->shortname(), name))
+ osd_printf_error("Device has parent ROM set that identical to its type\n");
+ if (grandparent)
+ osd_printf_error("Device has parent ROM set '%s' which has parent ROM set '%s'\n", parent->shortname(), grandparent->shortname());
+ }
// give devices some of the same scrutiny that drivers get - necessary for cards not default for any slots
validate_roms(*dev);
diff --git a/src/emu/video.cpp b/src/emu/video.cpp
index e1f25106c44..01d0ad576a2 100644
--- a/src/emu/video.cpp
+++ b/src/emu/video.cpp
@@ -357,8 +357,8 @@ void video_manager::save_active_screen_snapshots()
if (machine().render().is_live(screen))
{
emu_file file(machine().options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr = open_next(file, "png");
- if (filerr == osd_file::error::NONE)
+ std::error_condition const filerr = open_next(file, "png");
+ if (!filerr)
save_snapshot(&screen, file);
}
}
@@ -366,8 +366,8 @@ void video_manager::save_active_screen_snapshots()
{
// otherwise, just write a single snapshot
emu_file file(machine().options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr = open_next(file, "png");
- if (filerr == osd_file::error::NONE)
+ std::error_condition const filerr = open_next(file, "png");
+ if (!filerr)
save_snapshot(nullptr, file);
}
}
@@ -429,12 +429,12 @@ void video_manager::begin_recording_screen(const std::string &filename, uint32_t
OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
// and open the actual file
- osd_file::error filerr = filename.empty()
+ std::error_condition filerr = filename.empty()
? open_next(*movie_file, extension)
: movie_file->open(filename);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
- osd_printf_error("Error creating movie, osd_file::error=%d\n", int(filerr));
+ osd_printf_error("Error creating movie, %s:%d %s\n", filerr.category().name(), filerr.value(), filerr.message());
return;
}
@@ -1012,8 +1012,8 @@ void video_manager::save_final_snapshot()
{
// create a final screenshot
emu_file file(machine().options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr = file.open(machine().basename() + PATH_SEPARATOR "final.png");
- if (filerr == osd_file::error::NONE)
+ std::error_condition filerr = file.open(machine().basename() + PATH_SEPARATOR "final.png");
+ if (!filerr)
save_snapshot(nullptr, file);
}
@@ -1096,7 +1096,7 @@ void video_manager::pixels(u32 *buffer)
// scheme
//-------------------------------------------------
-osd_file::error video_manager::open_next(emu_file &file, const char *extension, uint32_t added_index)
+std::error_condition video_manager::open_next(emu_file &file, const char *extension, uint32_t added_index)
{
u32 origflags = file.openflags();
@@ -1205,11 +1205,9 @@ osd_file::error video_manager::open_next(emu_file &file, const char *extension,
strreplace(fname, "%i", string_format("%04d", seq));
// try to open the file; stop when we fail
- osd_file::error filerr = file.open(fname);
- if (filerr == osd_file::error::NOT_FOUND)
- {
+ std::error_condition const filerr = file.open(fname);
+ if (std::errc::no_such_file_or_directory == filerr)
break;
- }
}
}
diff --git a/src/emu/video.h b/src/emu/video.h
index 4d784b4c66e..a65959d89db 100644
--- a/src/emu/video.h
+++ b/src/emu/video.h
@@ -19,6 +19,8 @@
#include "recording.h"
+#include <system_error>
+
//**************************************************************************
// CONSTANTS
@@ -61,7 +63,7 @@ public:
// misc
void toggle_record_movie(movie_recording::format format);
- osd_file::error open_next(emu_file &file, const char *extension, uint32_t index = 0);
+ std::error_condition open_next(emu_file &file, const char *extension, uint32_t index = 0);
void compute_snapshot_size(s32 &width, s32 &height);
void pixels(u32 *buffer);
diff --git a/src/emu/xtal.cpp b/src/emu/xtal.cpp
index d1105b187e2..30bea7b1a20 100644
--- a/src/emu/xtal.cpp
+++ b/src/emu/xtal.cpp
@@ -364,7 +364,7 @@ const double XTAL::known_xtals[] = {
27'562'000, /* 27.562_MHz_XTAL Visual 220 */
27'720'000, /* 27.72_MHz_XTAL AT&T 610 132-column display clock */
27'956'000, /* 27.956_MHz_XTAL CIT-101e 132-column display clock */
- 28'000'000, /* 28_MHz_XTAL Sega System H1 SH2 clock */
+ 28'000'000, /* 28_MHz_XTAL Sega System H1 SH2 clock, Kyukyoku Tiger / Twin Cobra */
28'224'000, /* 28.224_MHz_XTAL Roland JD-800 */
28'322'000, /* 28.322_MHz_XTAL Saitek RISC 2500, Mephisto Montreux */
28'375'160, /* 28.37516_MHz_XTAL Amiga PAL systems */
diff --git a/src/frontend/mame/audit.cpp b/src/frontend/mame/audit.cpp
index 42ddcdad438..0a37c4a3fff 100644
--- a/src/frontend/mame/audit.cpp
+++ b/src/frontend/mame/audit.cpp
@@ -425,11 +425,11 @@ media_auditor::summary media_auditor::audit_samples()
while (path.next(curpath, samplename))
{
// attempt to access the file (.flac) or (.wav)
- osd_file::error filerr = file.open(curpath + ".flac");
- if (filerr != osd_file::error::NONE)
+ std::error_condition filerr = file.open(curpath + ".flac");
+ if (filerr)
filerr = file.open(curpath + ".wav");
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
{
record.set_status(audit_status::GOOD, audit_substatus::GOOD);
found++;
@@ -589,14 +589,14 @@ media_auditor::audit_record &media_auditor::audit_one_rom(const std::vector<std:
file.set_restrict_to_mediapath(1);
// open the file if we can
- osd_file::error filerr;
+ std::error_condition filerr;
if (has_crc)
filerr = file.open(record.name(), crc);
else
filerr = file.open(record.name());
// if it worked, get the actual length and hashes, then stop
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
record.set_actual(file.hashes(m_validation), file.size());
// compute the final status
@@ -617,10 +617,10 @@ media_auditor::audit_record &media_auditor::audit_one_disk(const rom_entry *rom,
// open the disk
chd_file source;
- const chd_error err = rom_load_manager::open_disk_image(m_enumerator.options(), std::forward<T>(args)..., rom, source);
+ const std::error_condition err = rom_load_manager::open_disk_image(m_enumerator.options(), std::forward<T>(args)..., rom, source);
// if we succeeded, get the hashes
- if (err == CHDERR_NONE)
+ if (!err)
{
util::hash_collection hashes;
@@ -633,7 +633,7 @@ media_auditor::audit_record &media_auditor::audit_one_disk(const rom_entry *rom,
}
// compute the final status
- compute_status(record, rom, err == CHDERR_NONE);
+ compute_status(record, rom, !err);
return record;
}
diff --git a/src/frontend/mame/cheat.cpp b/src/frontend/mame/cheat.cpp
index 61cda1cf475..f4a567db28f 100644
--- a/src/frontend/mame/cheat.cpp
+++ b/src/frontend/mame/cheat.cpp
@@ -1191,10 +1191,10 @@ bool cheat_manager::save_all(std::string const &filename)
{
// open the file with the proper name
emu_file cheatfile(machine().options().cheat_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error const filerr(cheatfile.open(filename + ".xml"));
+ std::error_condition const filerr(cheatfile.open(filename + ".xml"));
// if that failed, return nothing
- if (filerr != osd_file::error::NONE)
+ if (filerr)
return false;
// wrap the rest of catch errors
@@ -1264,7 +1264,8 @@ std::string &cheat_manager::get_output_string(int row, ui::text_layout::text_jus
row = (row < 0) ? (m_numlines + row) : (row - 1);
// clamp within range
- row = std::min(std::max(row, 0), m_numlines - 1);
+ assert(m_numlines > 0);
+ row = std::clamp(row, 0, m_numlines - 1);
// return the appropriate string
m_justify[row] = justify;
@@ -1390,7 +1391,7 @@ void cheat_manager::load_cheats(std::string const &filename)
try
{
// loop over all instrances of the files found in our search paths
- for (osd_file::error filerr = cheatfile.open(filename + ".xml"); filerr == osd_file::error::NONE; filerr = cheatfile.open_next())
+ for (std::error_condition filerr = cheatfile.open(filename + ".xml"); !filerr; filerr = cheatfile.open_next())
{
osd_printf_verbose("Loading cheats file from %s\n", cheatfile.fullpath());
diff --git a/src/frontend/mame/clifront.cpp b/src/frontend/mame/clifront.cpp
index 38b61b9755f..eb77ead8e5c 100644
--- a/src/frontend/mame/clifront.cpp
+++ b/src/frontend/mame/clifront.cpp
@@ -1681,7 +1681,7 @@ void cli_frontend::execute_commands(std::string_view exename)
{
// attempt to open the output file
emu_file file(OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(std::string(emulator_info::get_configname()) + ".ini") != osd_file::error::NONE)
+ if (file.open(std::string(emulator_info::get_configname()) + ".ini"))
throw emu_fatalerror("Unable to create file %s.ini\n",emulator_info::get_configname());
// generate the updated INI
@@ -1689,7 +1689,7 @@ void cli_frontend::execute_commands(std::string_view exename)
ui_options ui_opts;
emu_file file_ui(OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file_ui.open("ui.ini") != osd_file::error::NONE)
+ if (file_ui.open("ui.ini"))
throw emu_fatalerror("Unable to create file ui.ini\n");
// generate the updated INI
@@ -1704,7 +1704,7 @@ void cli_frontend::execute_commands(std::string_view exename)
plugin_opts.scan_directory(pluginpath, true);
}
emu_file file_plugin(OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file_plugin.open("plugin.ini") != osd_file::error::NONE)
+ if (file_plugin.open("plugin.ini"))
throw emu_fatalerror("Unable to create file plugin.ini\n");
// generate the updated INI
diff --git a/src/frontend/mame/infoxml.cpp b/src/frontend/mame/infoxml.cpp
index f4fe63130d7..1e6049921a4 100644
--- a/src/frontend/mame/infoxml.cpp
+++ b/src/frontend/mame/infoxml.cpp
@@ -63,7 +63,7 @@ void output_footer(std::ostream &out);
void output_one(std::ostream &out, driver_enumerator &drivlist, const game_driver &driver, device_type_set *devtypes);
void output_sampleof(std::ostream &out, device_t &device);
void output_bios(std::ostream &out, device_t const &device);
-void output_rom(std::ostream &out, driver_enumerator *drivlist, const game_driver *driver, device_t &device);
+void output_rom(std::ostream &out, machine_config &config, driver_enumerator *drivlist, const game_driver *driver, device_t &device);
void output_device_refs(std::ostream &out, device_t &root);
void output_sample(std::ostream &out, device_t &device);
void output_chips(std::ostream &out, device_t &device, const char *root_tag);
@@ -84,7 +84,9 @@ void output_ramoptions(std::ostream &out, device_t &root);
void output_one_device(std::ostream &out, machine_config &config, device_t &device, const char *devtag);
void output_devices(std::ostream &out, emu_options &lookup_options, device_type_set const *filter);
-const char *get_merge_name(driver_enumerator &drivlist, const game_driver &driver, util::hash_collection const &romhashes);
+char const *get_merge_name(driver_enumerator &drivlist, game_driver const &driver, util::hash_collection const &romhashes);
+char const *get_merge_name(machine_config &config, device_t const &device, util::hash_collection const &romhashes);
+char const *get_merge_name(tiny_rom_entry const *roms, util::hash_collection const &romhashes);
//**************************************************************************
@@ -658,7 +660,7 @@ void output_one(std::ostream &out, driver_enumerator &drivlist, const game_drive
// now print various additional information
output_bios(out, config.root_device());
- output_rom(out, &drivlist, &driver, config.root_device());
+ output_rom(out, config, &drivlist, &driver, config.root_device());
output_device_refs(out, config.root_device());
output_sample(out, config.root_device());
output_chips(out, config.root_device(), "");
@@ -720,11 +722,14 @@ void output_one_device(std::ostream &out, machine_config &config, device_t &devi
std::string src(device.source());
strreplace(src,"../", "");
out << util::string_format(" sourcefile=\"%s\" isdevice=\"yes\" runnable=\"no\"", normalize_string(src.c_str()));
+ auto const parent(device.type().parent_rom_device_type());
+ if (parent)
+ out << util::string_format(" romof=\"%s\"", normalize_string(parent->shortname()));
output_sampleof(out, device);
out << ">\n" << util::string_format("\t\t<description>%s</description>\n", normalize_string(device.name()));
output_bios(out, device);
- output_rom(out, nullptr, nullptr, device);
+ output_rom(out, config, nullptr, nullptr, device);
output_device_refs(out, device);
if (device.type().type() != typeid(samples_device)) // ignore samples_device itself
@@ -857,7 +862,7 @@ void output_bios(std::ostream &out, device_t const &device)
// the XML output
//-------------------------------------------------
-void output_rom(std::ostream &out, driver_enumerator *drivlist, const game_driver *driver, device_t &device)
+void output_rom(std::ostream &out, machine_config &config, driver_enumerator *drivlist, const game_driver *driver, device_t &device)
{
enum class type { BIOS, NORMAL, DISK };
std::map<u32, char const *> biosnames;
@@ -895,7 +900,7 @@ void output_rom(std::ostream &out, driver_enumerator *drivlist, const game_drive
// loop until we run out of reloads
do
{
- // loop until we run out of continues/ignores */
+ // loop until we run out of continues/ignores
u32 curlength(ROM_GETLENGTH(romp++));
while (ROMENTRY_ISCONTINUE(romp) || ROMENTRY_ISIGNORE(romp))
curlength += ROM_GETLENGTH(romp++);
@@ -909,7 +914,7 @@ void output_rom(std::ostream &out, driver_enumerator *drivlist, const game_drive
};
// iterate over 3 different ROM "types": BIOS, ROMs, DISKs
- bool const do_merge_name = drivlist && dynamic_cast<driver_device *>(&device);
+ bool const driver_merge = drivlist && dynamic_cast<driver_device *>(&device);
for (type pass : { type::BIOS, type::NORMAL, type::DISK })
{
tiny_rom_entry const *region(nullptr);
@@ -937,7 +942,10 @@ void output_rom(std::ostream &out, driver_enumerator *drivlist, const game_drive
// if we have a valid ROM and we are a clone, see if we can find the parent ROM
util::hash_collection const hashes(rom->hashdata);
- char const *const merge_name((do_merge_name && !hashes.flag(util::hash_collection::FLAG_NO_DUMP)) ? get_merge_name(*drivlist, *driver, hashes) : nullptr);
+ char const *const merge_name(
+ hashes.flag(util::hash_collection::FLAG_NO_DUMP) ? nullptr :
+ driver_merge ? get_merge_name(*drivlist, *driver, hashes) :
+ get_merge_name(config, device, hashes));
// opening tag
if (is_disk)
@@ -945,7 +953,7 @@ void output_rom(std::ostream &out, driver_enumerator *drivlist, const game_drive
else
out << "\t\t<rom";
- // add name, merge, bios, and size tags */
+ // add name, merge, bios, and size tags
char const *const name(rom->name);
if (name && name[0])
out << util::string_format(" name=\"%s\"", normalize_string(name));
@@ -2041,21 +2049,51 @@ void output_ramoptions(std::ostream &out, device_t &root)
// parent set
//-------------------------------------------------
-const char *get_merge_name(driver_enumerator &drivlist, const game_driver &driver, util::hash_collection const &romhashes)
+char const *get_merge_name(driver_enumerator &drivlist, game_driver const &driver, util::hash_collection const &romhashes)
{
+ char const *result = nullptr;
+
// walk the parent chain
- for (int clone_of = drivlist.find(driver.parent); 0 <= clone_of; clone_of = drivlist.find(drivlist.driver(clone_of).parent))
+ for (int clone_of = drivlist.find(driver.parent); !result && (0 <= clone_of); clone_of = drivlist.find(drivlist.driver(clone_of).parent))
+ result = get_merge_name(drivlist.driver(clone_of).rom, romhashes);
+
+ return result;
+}
+
+
+char const *get_merge_name(machine_config &config, device_t const &device, util::hash_collection const &romhashes)
+{
+ char const *result = nullptr;
+
+ // check for a parent type
+ auto const parenttype(device.type().parent_rom_device_type());
+ if (parenttype)
{
+ // instantiate the parent device
+ machine_config::token const tok(config.begin_configuration(config.root_device()));
+ device_t *const parent = config.device_add("_parent", *parenttype, 0);
+
// look in the parent's ROMs
- for (romload::region const &pregion : romload::entries(drivlist.driver(clone_of).rom).get_regions())
+ result = get_merge_name(parent->rom_region(), romhashes);
+
+ // remember to remove the device
+ config.device_remove("_parent");
+ }
+
+ return result;
+}
+
+
+char const *get_merge_name(tiny_rom_entry const *roms, util::hash_collection const &romhashes)
+{
+ for (romload::region const &pregion : romload::entries(roms).get_regions())
+ {
+ for (romload::file const &prom : pregion.get_files())
{
- for (romload::file const &prom : pregion.get_files())
- {
- // stop when we find a match
- util::hash_collection const phashes(prom.get_hashdata());
- if (!phashes.flag(util::hash_collection::FLAG_NO_DUMP) && (romhashes == phashes))
- return prom.get_name();
- }
+ // stop when we find a match
+ util::hash_collection const phashes(prom.get_hashdata());
+ if (!phashes.flag(util::hash_collection::FLAG_NO_DUMP) && (romhashes == phashes))
+ return prom.get_name();
}
}
diff --git a/src/frontend/mame/language.cpp b/src/frontend/mame/language.cpp
index 1cd0d1be65e..eae75b3fd6f 100644
--- a/src/frontend/mame/language.cpp
+++ b/src/frontend/mame/language.cpp
@@ -70,7 +70,7 @@ void load_translation(emu_options &m_options)
strreplace(name, "(", "");
strreplace(name, ")", "");
emu_file file(m_options.language_path(), OPEN_FLAG_READ);
- if (file.open(name + PATH_SEPARATOR "strings.mo") != osd_file::error::NONE)
+ if (file.open(name + PATH_SEPARATOR "strings.mo"))
{
osd_printf_error("Error opening translation file %s\n", name);
return;
diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp
index 5f1b48af6d3..4953416b22a 100644
--- a/src/frontend/mame/luaengine.cpp
+++ b/src/frontend/mame/luaengine.cpp
@@ -322,48 +322,12 @@ public:
} // namespace sol
-int sol_lua_push(sol::types<osd_file::error>, lua_State *L, osd_file::error &&value)
+int sol_lua_push(sol::types<std::error_condition>, lua_State *L, std::error_condition &&value)
{
- const char *strerror;
- switch(value)
- {
- case osd_file::error::NONE:
- return sol::stack::push(L, sol::lua_nil);
- case osd_file::error::FAILURE:
- strerror = "failure";
- break;
- case osd_file::error::OUT_OF_MEMORY:
- strerror = "out_of_memory";
- break;
- case osd_file::error::NOT_FOUND:
- strerror = "not_found";
- break;
- case osd_file::error::ACCESS_DENIED:
- strerror = "access_denied";
- break;
- case osd_file::error::ALREADY_OPEN:
- strerror = "already_open";
- break;
- case osd_file::error::TOO_MANY_FILES:
- strerror = "too_many_files";
- break;
- case osd_file::error::INVALID_DATA:
- strerror = "invalid_data";
- break;
- case osd_file::error::INVALID_ACCESS:
- strerror = "invalid_access";
- break;
- default:
- strerror = "unknown_error";
- break;
- }
- return sol::stack::push(L, strerror);
-}
-
-template <typename Handler>
-bool sol_lua_check(sol::types<osd_file::error>, lua_State *L, int index, Handler &&handler, sol::stack::record &tracking)
-{
- return sol::stack::check<int>(L, index, std::forward<Handler>(handler));
+ if (!value)
+ return sol::stack::push(L, sol::lua_nil);
+ else
+ return sol::stack::push(L, value.message());
}
@@ -886,7 +850,7 @@ void lua_engine::initialize()
}));
file_type.set("read", [](emu_file &file, sol::buffer *buff) { buff->set_len(file.read(buff->get_ptr(), buff->get_len())); return buff; });
file_type.set("write", [](emu_file &file, const std::string &data) { return file.write(data.data(), data.size()); });
- file_type.set("open", static_cast<osd_file::error (emu_file::*)(std::string_view)>(&emu_file::open));
+ file_type.set("open", static_cast<std::error_condition (emu_file::*)(std::string_view)>(&emu_file::open));
file_type.set("open_next", &emu_file::open_next);
file_type.set("seek", sol::overload(
[](emu_file &file) { return file.tell(); },
@@ -1424,10 +1388,11 @@ void lua_engine::initialize()
[this] (device_t &dev)
{
sol::table st_table = sol().create_table();
- if(!dynamic_cast<device_state_interface *>(&dev))
+ const device_state_interface *state;
+ if(!dev.interface(state))
return st_table;
// XXX: refrain from exporting non-visible entries?
- for(auto &s : dev.state().state_entries())
+ for(auto &s : state->state_entries())
st_table[s->symbol()] = s.get();
return st_table;
});
@@ -1533,12 +1498,12 @@ void lua_engine::initialize()
// open the file
emu_file file(is_absolute_path ? "" : machine().options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr;
+ std::error_condition filerr;
if (!snapstr.empty())
filerr = file.open(snapstr);
else
filerr = machine().video().open_next(file, "png");
- if (filerr != osd_file::error::NONE)
+ if (filerr)
return sol::make_object(sol(), filerr);
// and save the snapshot
diff --git a/src/frontend/mame/luaengine.ipp b/src/frontend/mame/luaengine.ipp
index d532b8be1b4..f995b0a4a7b 100644
--- a/src/frontend/mame/luaengine.ipp
+++ b/src/frontend/mame/luaengine.ipp
@@ -16,6 +16,8 @@
#include <lua.hpp>
+#include <system_error>
+
template <typename T>
@@ -258,10 +260,8 @@ public:
} // namespace sol
-// osd_file::error customisation
-int sol_lua_push(sol::types<osd_file::error>, lua_State *L, osd_file::error &&value);
-template <typename Handler>
-bool sol_lua_check(sol::types<osd_file::error>, lua_State *L, int index, Handler &&handler, sol::stack::record &tracking);
+// automatically convert std::error_condition to string
+int sol_lua_push(sol::types<std::error_condition>, lua_State &L, std::error_condition &&value);
// enums to automatically convert to strings
int sol_lua_push(sol::types<map_handler_type>, lua_State *L, map_handler_type &&value);
diff --git a/src/frontend/mame/luaengine_mem.cpp b/src/frontend/mame/luaengine_mem.cpp
index 4016ce1d20f..f95ebdb37c2 100644
--- a/src/frontend/mame/luaengine_mem.cpp
+++ b/src/frontend/mame/luaengine_mem.cpp
@@ -179,17 +179,7 @@ int sol_lua_push(sol::types<map_handler_type>, lua_State *L, map_handler_type &&
int sol_lua_push(sol::types<endianness_t>, lua_State *L, endianness_t &&value)
{
- char const *endianness = "unknown";
- switch (value)
- {
- case endianness_t::ENDIANNESS_BIG:
- endianness = "big";
- break;
- case endianness_t::ENDIANNESS_LITTLE:
- endianness = "little";
- break;
- }
- return sol::stack::push(L, endianness);
+ return sol::stack::push(L, util::endian_to_string_view(value));
}
diff --git a/src/frontend/mame/mame.cpp b/src/frontend/mame/mame.cpp
index 2286e2a3f56..88a08908d00 100644
--- a/src/frontend/mame/mame.cpp
+++ b/src/frontend/mame/mame.cpp
@@ -151,7 +151,7 @@ void mame_machine_manager::start_luaengine()
// parse the file
// attempt to open the output file
emu_file file(options().ini_path(), OPEN_FLAG_READ);
- if (file.open("plugin.ini") == osd_file::error::NONE)
+ if (!file.open("plugin.ini"))
{
try
{
@@ -197,8 +197,8 @@ void mame_machine_manager::start_luaengine()
{
emu_file file(options().plugins_path(), OPEN_FLAG_READ);
- osd_file::error filerr = file.open("boot.lua");
- if (filerr == osd_file::error::NONE)
+ std::error_condition const filerr = file.open("boot.lua");
+ if (!filerr)
{
std::string exppath;
osd_subst_env(exppath, std::string(file.fullpath()));
diff --git a/src/frontend/mame/mameopts.cpp b/src/frontend/mame/mameopts.cpp
index 0e6c28da23d..a1d370ddb74 100644
--- a/src/frontend/mame/mameopts.cpp
+++ b/src/frontend/mame/mameopts.cpp
@@ -130,8 +130,8 @@ void mame_options::parse_one_ini(emu_options &options, const char *basename, int
// open the file; if we fail, that's ok
emu_file file(options.ini_path(), OPEN_FLAG_READ);
osd_printf_verbose("Attempting load of %s.ini\n", basename);
- osd_file::error filerr = file.open(std::string(basename) + ".ini");
- if (filerr != osd_file::error::NONE)
+ std::error_condition const filerr = file.open(std::string(basename) + ".ini");
+ if (filerr)
return;
// parse the file
diff --git a/src/frontend/mame/media_ident.cpp b/src/frontend/mame/media_ident.cpp
index 690996145b2..08a7381ad3e 100644
--- a/src/frontend/mame/media_ident.cpp
+++ b/src/frontend/mame/media_ident.cpp
@@ -134,13 +134,13 @@ void media_identifier::collect_files(std::vector<file_info> &info, char const *p
{
// first attempt to examine it as a valid zip/7z file
util::archive_file::ptr archive;
- util::archive_file::error err;
+ std::error_condition err;
if (core_filename_ends_with(path, ".7z"))
err = util::archive_file::open_7z(path, archive);
else
err = util::archive_file::open_zip(path, archive);
- if ((util::archive_file::error::NONE == err) && archive)
+ if (!err && archive)
{
std::vector<std::uint8_t> data;
@@ -158,10 +158,10 @@ void media_identifier::collect_files(std::vector<file_info> &info, char const *p
{
data.resize(std::size_t(length));
err = archive->decompress(&data[0], std::uint32_t(length));
- if (util::archive_file::error::NONE == err)
+ if (!err)
digest_data(info, curfile.c_str(), &data[0], length);
else
- osd_printf_error("%s: error decompressing file\n", curfile);
+ osd_printf_error("%s: error decompressing file (%s:%d %s)\n", curfile, err.category().name(), err.value(), err.message());
}
catch (...)
{
@@ -205,9 +205,9 @@ void media_identifier::digest_file(std::vector<file_info> &info, char const *pat
{
// attempt to open as a CHD; fail if not
chd_file chd;
- chd_error const err = chd.open(path);
+ std::error_condition const err = chd.open(path);
m_total++;
- if (err != CHDERR_NONE)
+ if (err)
{
osd_printf_info("%-20s NOT A CHD\n", core_filename_extract_base(path));
m_nonroms++;
@@ -233,7 +233,7 @@ void media_identifier::digest_file(std::vector<file_info> &info, char const *pat
// load the file and process if it opens and has a valid length
uint32_t length;
void *data;
- if (osd_file::error::NONE == util::core_file::load(path, &data, length))
+ if (!util::core_file::load(path, &data, length))
{
jed_data jed;
if (JEDERR_NONE == jed_parse(data, length, &jed))
@@ -260,7 +260,7 @@ void media_identifier::digest_file(std::vector<file_info> &info, char const *pat
// load the file and process if it opens and has a valid length
util::core_file::ptr file;
- if ((osd_file::error::NONE == util::core_file::open(path, OPEN_FLAG_READ, file)) && file)
+ if (!util::core_file::open(path, OPEN_FLAG_READ, file) && file)
{
util::hash_collection hashes;
hashes.begin(util::hash_collection::HASH_TYPES_CRC_SHA1);
diff --git a/src/frontend/mame/ui/auditmenu.cpp b/src/frontend/mame/ui/auditmenu.cpp
index 9cadb5b5d97..66c1aab0597 100644
--- a/src/frontend/mame/ui/auditmenu.cpp
+++ b/src/frontend/mame/ui/auditmenu.cpp
@@ -229,7 +229,7 @@ void menu_audit::save_available_machines()
{
// attempt to open the output file
emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(std::string(emulator_info::get_configname()) + "_avail.ini") == osd_file::error::NONE)
+ if (!file.open(std::string(emulator_info::get_configname()) + "_avail.ini"))
{
// generate header
file.printf("#\n%s%s\n#\n\n", UI_VERSION_TAG, emulator_info::get_bare_build_version());
diff --git a/src/frontend/mame/ui/filesel.cpp b/src/frontend/mame/ui/filesel.cpp
index b722afab60d..41ecac49c16 100644
--- a/src/frontend/mame/ui/filesel.cpp
+++ b/src/frontend/mame/ui/filesel.cpp
@@ -316,8 +316,8 @@ void menu_file_selector::select_item(const file_selector_entry &entry)
{
// drive/directory - first check the path
util::zippath_directory::ptr dir;
- osd_file::error const err = util::zippath_directory::open(entry.fullpath, dir);
- if (err != osd_file::error::NONE)
+ std::error_condition const err = util::zippath_directory::open(entry.fullpath, dir);
+ if (err)
{
// this path is problematic; present the user with an error and bail
ui().popup_time(1, _("Error accessing %s"), entry.fullpath);
@@ -393,20 +393,19 @@ void menu_file_selector::populate(float &customtop, float &custombottom)
{
const file_selector_entry *selected_entry = nullptr;
-
// clear out the menu entries
m_entrylist.clear();
// open the directory
util::zippath_directory::ptr directory;
- osd_file::error const err = util::zippath_directory::open(m_current_directory, directory);
+ std::error_condition const err = util::zippath_directory::open(m_current_directory, directory);
// add the "[empty slot]" entry if available
if (m_has_empty)
append_entry(SELECTOR_ENTRY_TYPE_EMPTY, "", "");
// add the "[create]" entry
- if (m_has_create && !directory->is_archive())
+ if (m_has_create && directory && !directory->is_archive())
append_entry(SELECTOR_ENTRY_TYPE_CREATE, "", "");
// add and select the "[software list]" entry if available
@@ -421,9 +420,11 @@ void menu_file_selector::populate(float &customtop, float &custombottom)
std::size_t const first = m_entrylist.size() + 1;
// build the menu for each item
- if (osd_file::error::NONE != err)
+ if (err)
{
- osd_printf_verbose("menu_file_selector::populate: error opening directory '%s' (%d)\n", m_current_directory, int(err));
+ osd_printf_verbose(
+ "menu_file_selector::populate: error opening directory '%s' (%s:%d %s)\n",
+ m_current_directory, err.category().name(), err.value(), err.message());
}
else
{
@@ -445,17 +446,20 @@ void menu_file_selector::populate(float &customtop, float &custombottom)
}
directory.reset();
- // sort the menu entries
- const std::collate<wchar_t> &coll = std::use_facet<std::collate<wchar_t>>(std::locale());
- std::sort(
- m_entrylist.begin() + first,
- m_entrylist.end(),
- [&coll] (file_selector_entry const &x, file_selector_entry const &y)
- {
- std::wstring const xstr = wstring_from_utf8(x.basename);
- std::wstring const ystr = wstring_from_utf8(y.basename);
- return coll.compare(xstr.data(), xstr.data()+xstr.size(), ystr.data(), ystr.data()+ystr.size()) < 0;
- });
+ if (m_entrylist.size() > first)
+ {
+ // sort the menu entries
+ const std::collate<wchar_t> &coll = std::use_facet<std::collate<wchar_t>>(std::locale());
+ std::sort(
+ m_entrylist.begin() + first,
+ m_entrylist.end(),
+ [&coll] (file_selector_entry const &x, file_selector_entry const &y)
+ {
+ std::wstring const xstr = wstring_from_utf8(x.basename);
+ std::wstring const ystr = wstring_from_utf8(y.basename);
+ return coll.compare(xstr.data(), xstr.data()+xstr.size(), ystr.data(), ystr.data()+ystr.size()) < 0;
+ });
+ }
// append all of the menu entries
for (file_selector_entry const &entry : m_entrylist)
diff --git a/src/frontend/mame/ui/floppycntrl.cpp b/src/frontend/mame/ui/floppycntrl.cpp
index 0cfc8ac2333..2f1cc9e0192 100644
--- a/src/frontend/mame/ui/floppycntrl.cpp
+++ b/src/frontend/mame/ui/floppycntrl.cpp
@@ -79,12 +79,11 @@ void menu_control_floppy_image::hook_load(const std::string &filename)
bool can_in_place = input_format->supports_save();
if(can_in_place) {
- osd_file::error filerr;
std::string tmp_path;
util::core_file::ptr tmp_file;
// attempt to open the file for writing but *without* create
- filerr = util::zippath_fopen(filename, OPEN_FLAG_READ | OPEN_FLAG_WRITE, tmp_file, tmp_path);
- if(filerr == osd_file::error::NONE)
+ std::error_condition const filerr = util::zippath_fopen(filename, OPEN_FLAG_READ | OPEN_FLAG_WRITE, tmp_file, tmp_path);
+ if(!filerr)
tmp_file.reset();
else
can_in_place = false;
diff --git a/src/frontend/mame/ui/imgcntrl.cpp b/src/frontend/mame/ui/imgcntrl.cpp
index 33a71b7354a..43f40603479 100644
--- a/src/frontend/mame/ui/imgcntrl.cpp
+++ b/src/frontend/mame/ui/imgcntrl.cpp
@@ -85,7 +85,7 @@ menu_control_device_image::menu_control_device_image(mame_ui_manager &mui, rende
// check to see if the path exists; if not then set to current directory
util::zippath_directory::ptr dir;
- if (util::zippath_directory::open(m_current_directory, dir) != osd_file::error::NONE)
+ if (util::zippath_directory::open(m_current_directory, dir))
osd_get_full_path(m_current_directory, ".");
}
}
diff --git a/src/frontend/mame/ui/inifile.cpp b/src/frontend/mame/ui/inifile.cpp
index f1e0346769a..000ea922a4a 100644
--- a/src/frontend/mame/ui/inifile.cpp
+++ b/src/frontend/mame/ui/inifile.cpp
@@ -45,7 +45,7 @@ inifile_manager::inifile_manager(ui_options &options)
if (core_filename_ends_with(name, ".ini"))
{
emu_file file(m_options.categoryini_path(), OPEN_FLAG_READ);
- if (file.open(name) == osd_file::error::NONE)
+ if (!file.open(name))
{
init_category(std::move(name), file);
file.close();
@@ -63,7 +63,7 @@ void inifile_manager::load_ini_category(size_t file, size_t category, std::unord
{
std::string const &filename(m_ini_index[file].first);
emu_file fp(m_options.categoryini_path(), OPEN_FLAG_READ);
- if (fp.open(filename) != osd_file::error::NONE)
+ if (fp.open(filename))
{
osd_printf_error("Failed to open category file %s for reading\n", filename);
return;
@@ -216,7 +216,7 @@ favorite_manager::favorite_manager(ui_options &options)
, m_need_sort(true)
{
emu_file file(m_options.ui_path(), OPEN_FLAG_READ);
- if (file.open(FAVORITE_FILENAME) == osd_file::error::NONE)
+ if (!file.open(FAVORITE_FILENAME))
{
char readbuf[1024];
file.gets(readbuf, 1024);
@@ -537,7 +537,7 @@ void favorite_manager::save_favorites()
{
// attempt to open the output file
emu_file file(m_options.ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(FAVORITE_FILENAME) == osd_file::error::NONE)
+ if (!file.open(FAVORITE_FILENAME))
{
if (m_favorites.empty())
{
diff --git a/src/frontend/mame/ui/menu.cpp b/src/frontend/mame/ui/menu.cpp
index 8eb1eab47c9..923a0fae6df 100644
--- a/src/frontend/mame/ui/menu.cpp
+++ b/src/frontend/mame/ui/menu.cpp
@@ -92,13 +92,13 @@ menu::global_state::global_state(running_machine &machine, ui_options const &opt
{
m_bgrnd_bitmap = std::make_unique<bitmap_argb32>(0, 0);
emu_file backgroundfile(".", OPEN_FLAG_READ);
- if (backgroundfile.open("background.jpg") == osd_file::error::NONE)
+ if (!backgroundfile.open("background.jpg"))
{
render_load_jpeg(*m_bgrnd_bitmap, backgroundfile);
backgroundfile.close();
}
- if (!m_bgrnd_bitmap->valid() && (backgroundfile.open("background.png") == osd_file::error::NONE))
+ if (!m_bgrnd_bitmap->valid() && !backgroundfile.open("background.png"))
{
render_load_png(*m_bgrnd_bitmap, backgroundfile);
backgroundfile.close();
diff --git a/src/frontend/mame/ui/miscmenu.cpp b/src/frontend/mame/ui/miscmenu.cpp
index bf1754481dc..da7989e6e3b 100644
--- a/src/frontend/mame/ui/miscmenu.cpp
+++ b/src/frontend/mame/ui/miscmenu.cpp
@@ -599,11 +599,11 @@ void menu_export::handle()
{
std::string filename("exported");
emu_file infile(ui().options().ui_path(), OPEN_FLAG_READ);
- if (infile.open(filename + ".xml") == osd_file::error::NONE)
+ if (!infile.open(filename + ".xml"))
for (int seq = 0; ; ++seq)
{
const std::string seqtext = string_format("%s_%04d", filename, seq);
- if (infile.open(seqtext + ".xml") != osd_file::error::NONE)
+ if (infile.open(seqtext + ".xml"))
{
filename = seqtext;
break;
@@ -612,7 +612,7 @@ void menu_export::handle()
// attempt to open the output file
emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(filename + ".xml") == osd_file::error::NONE)
+ if (!file.open(filename + ".xml"))
{
const std::string fullpath(file.fullpath());
file.close();
@@ -644,11 +644,11 @@ void menu_export::handle()
{
std::string filename("exported");
emu_file infile(ui().options().ui_path(), OPEN_FLAG_READ);
- if (infile.open(filename + ".txt") == osd_file::error::NONE)
+ if (!infile.open(filename + ".txt"))
for (int seq = 0; ; ++seq)
{
const std::string seqtext = string_format("%s_%04d", filename, seq);
- if (infile.open(seqtext + ".txt") != osd_file::error::NONE)
+ if (infile.open(seqtext + ".txt"))
{
filename = seqtext;
break;
@@ -657,7 +657,7 @@ void menu_export::handle()
// attempt to open the output file
emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(filename + ".txt") == osd_file::error::NONE)
+ if (!file.open(filename + ".txt"))
{
// print the header
std::ostringstream buffer;
@@ -754,8 +754,8 @@ void menu_machine_configure::handle()
{
const std::string filename(m_drv.name);
emu_file file(machine().options().ini_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE);
- osd_file::error filerr = file.open(filename + ".ini");
- if (filerr == osd_file::error::NONE)
+ std::error_condition const filerr = file.open(filename + ".ini");
+ if (!filerr)
{
std::string inistring = m_opts.output_ini();
file.puts(inistring);
@@ -891,7 +891,7 @@ menu_plugins_configure::menu_plugins_configure(mame_ui_manager &mui, render_cont
menu_plugins_configure::~menu_plugins_configure()
{
emu_file file_plugin(machine().options().ini_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file_plugin.open("plugin.ini") != osd_file::error::NONE)
+ if (file_plugin.open("plugin.ini"))
// Can't throw in a destructor, so let's ignore silently for
// now. We shouldn't write files in a destructor in any case.
//
diff --git a/src/frontend/mame/ui/optsmenu.cpp b/src/frontend/mame/ui/optsmenu.cpp
index 0ceeca25ce2..922bbb5b6fa 100644
--- a/src/frontend/mame/ui/optsmenu.cpp
+++ b/src/frontend/mame/ui/optsmenu.cpp
@@ -265,7 +265,7 @@ void menu_game_options::handle_item_event(event const &menu_event)
if (machine_filter::CUSTOM == filter.get_type())
{
emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(util::string_format("custom_%s_filter.ini", emulator_info::get_configname())) == osd_file::error::NONE)
+ if (!file.open(util::string_format("custom_%s_filter.ini", emulator_info::get_configname())))
{
filter.save_ini(file, 0);
file.close();
diff --git a/src/frontend/mame/ui/selgame.cpp b/src/frontend/mame/ui/selgame.cpp
index 338f98c42d0..ece205a8ef4 100644
--- a/src/frontend/mame/ui/selgame.cpp
+++ b/src/frontend/mame/ui/selgame.cpp
@@ -266,7 +266,7 @@ menu_select_game::menu_select_game(mame_ui_manager &mui, render_container &conta
}
emu_file file(ui().options().ui_path(), OPEN_FLAG_READ);
- if (file.open_ram(fake_ini.c_str(), fake_ini.size()) == osd_file::error::NONE)
+ if (!file.open_ram(fake_ini.c_str(), fake_ini.size()))
{
m_persistent_data.filter_data().load_ini(file);
file.close();
@@ -1259,12 +1259,12 @@ render_texture *menu_select_game::get_icon_texture(int linenum, void *selectedre
bitmap_argb32 tmp;
emu_file snapfile(std::string(m_icon_paths), OPEN_FLAG_READ);
- if (snapfile.open(std::string(driver->name) + ".ico") == osd_file::error::NONE)
+ if (!snapfile.open(std::string(driver->name) + ".ico"))
{
render_load_ico_highest_detail(snapfile, tmp);
snapfile.close();
}
- if (!tmp.valid() && cloneof && (snapfile.open(std::string(driver->parent) + ".ico") == osd_file::error::NONE))
+ if (!tmp.valid() && cloneof && !snapfile.open(std::string(driver->parent) + ".ico"))
{
render_load_ico_highest_detail(snapfile, tmp);
snapfile.close();
@@ -1309,7 +1309,7 @@ bool menu_select_game::load_available_machines()
{
// try to load available drivers from file
emu_file file(ui().options().ui_path(), OPEN_FLAG_READ);
- if (file.open(std::string(emulator_info::get_configname()) + "_avail.ini") != osd_file::error::NONE)
+ if (file.open(std::string(emulator_info::get_configname()) + "_avail.ini"))
return false;
char rbuf[MAX_CHAR_INFO];
@@ -1361,7 +1361,7 @@ bool menu_select_game::load_available_machines()
void menu_select_game::load_custom_filters()
{
emu_file file(ui().options().ui_path(), OPEN_FLAG_READ);
- if (file.open(util::string_format("custom_%s_filter.ini", emulator_info::get_configname())) == osd_file::error::NONE)
+ if (!file.open(util::string_format("custom_%s_filter.ini", emulator_info::get_configname())))
{
machine_filter::ptr flt(machine_filter::create(file, m_persistent_data.filter_data()));
if (flt)
@@ -1456,7 +1456,7 @@ void menu_select_game::filter_selected()
if (machine_filter::CUSTOM == new_type)
{
emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(util::string_format("custom_%s_filter.ini", emulator_info::get_configname())) == osd_file::error::NONE)
+ if (!file.open(util::string_format("custom_%s_filter.ini", emulator_info::get_configname())))
{
filter.save_ini(file, 0);
file.close();
diff --git a/src/frontend/mame/ui/selmenu.cpp b/src/frontend/mame/ui/selmenu.cpp
index fb3f7087e27..15c7e1c3364 100644
--- a/src/frontend/mame/ui/selmenu.cpp
+++ b/src/frontend/mame/ui/selmenu.cpp
@@ -36,6 +36,8 @@
#include "uiinput.h"
#include "luaengine.h"
+#include "util/path.h"
+
#include <algorithm>
#include <cmath>
#include <cstring>
@@ -99,19 +101,19 @@ char const *const hover_msg[] = {
void load_image(bitmap_argb32 &bitmap, emu_file &file, std::string const &base)
{
- if (file.open(base + ".png") == osd_file::error::NONE)
+ if (!file.open(base + ".png"))
{
render_load_png(bitmap, file);
file.close();
}
- if (!bitmap.valid() && (file.open(base + ".jpg") == osd_file::error::NONE))
+ if (!bitmap.valid() && !file.open(base + ".jpg"))
{
render_load_jpeg(bitmap, file);
file.close();
}
- if (!bitmap.valid() && (file.open(base + ".bmp") == osd_file::error::NONE))
+ if (!bitmap.valid() && !file.open(base + ".bmp"))
{
render_load_msdib(bitmap, file);
file.close();
@@ -123,7 +125,7 @@ void load_driver_image(bitmap_argb32 &bitmap, emu_file &file, game_driver const
{
// try to load snapshot first from saved "0000.png" file
std::string fullname = driver.name;
- load_image(bitmap, file, fullname + PATH_SEPARATOR + "0000");
+ load_image(bitmap, file, util::path_concat(fullname, "0000"));
// if fail, attempt to load from standard file
if (!bitmap.valid())
@@ -144,7 +146,7 @@ void load_driver_image(bitmap_argb32 &bitmap, emu_file &file, game_driver const
if (isclone)
{
fullname = driver.parent;
- load_image(bitmap, file, fullname + PATH_SEPARATOR + "0000");
+ load_image(bitmap, file, util::path_concat(fullname, "0000"));
if (!bitmap.valid())
load_image(bitmap, file, fullname);
@@ -621,7 +623,7 @@ void menu_select_launch::launch_system(mame_ui_manager &mui, game_driver const &
else
moptions.set_value(OPTION_SOFTWARENAME, util::string_format("%s:%s", swinfo->listname, swinfo->shortname), OPTION_PRIORITY_CMDLINE);
- moptions.set_value(OPTION_SNAPNAME, util::string_format("%s%s%s", swinfo->listname, PATH_SEPARATOR, swinfo->shortname), OPTION_PRIORITY_CMDLINE);
+ moptions.set_value(OPTION_SNAPNAME, util::path_concat(swinfo->listname, swinfo->shortname), OPTION_PRIORITY_CMDLINE);
}
reselect_last::set_software(driver, *swinfo);
}
@@ -1087,11 +1089,7 @@ void menu_select_launch::check_for_icons(char const *listname)
{
// if we're doing a software list, append it to the configured path
if (listname)
- {
- if (!current.empty() && !util::is_directory_separator(current.back()))
- current.append(PATH_SEPARATOR);
- current.append(listname);
- }
+ util::path_append(current, listname);
osd_printf_verbose("Checking for icons in directory %s\n", current);
// open and walk the directory
@@ -1136,11 +1134,7 @@ std::string menu_select_launch::make_icon_paths(char const *listname) const
{
// if we're doing a software list, append it to the configured path
if (listname)
- {
- if (!current.empty() && !util::is_directory_separator(current.back()))
- current.append(PATH_SEPARATOR);
- current.append(listname);
- }
+ util::path_append(current, listname);
// append the configured path
if (!result.empty())
@@ -2286,11 +2280,11 @@ void menu_select_launch::arts_render(float origx1, float origy1, float origx2, f
else
{
// First attempt from name list
- load_image(tmp_bitmap, snapfile, software->listname + PATH_SEPARATOR + software->shortname);
+ load_image(tmp_bitmap, snapfile, util::path_concat(software->listname, software->shortname));
// Second attempt from driver name + part name
if (!tmp_bitmap.valid())
- load_image(tmp_bitmap, snapfile, software->driver->name + software->part + PATH_SEPARATOR + software->shortname);
+ load_image(tmp_bitmap, snapfile, util::path_concat(software->driver->name + software->part, software->shortname));
}
m_cache->set_snapx_software(software);
diff --git a/src/frontend/mame/ui/selsoft.cpp b/src/frontend/mame/ui/selsoft.cpp
index 2ac32cce987..95c02a9d853 100644
--- a/src/frontend/mame/ui/selsoft.cpp
+++ b/src/frontend/mame/ui/selsoft.cpp
@@ -517,7 +517,7 @@ void menu_select_software::load_sw_custom_filters()
{
// attempt to open the output file
emu_file file(ui().options().ui_path(), OPEN_FLAG_READ);
- if (file.open(util::string_format("custom_%s_filter.ini", m_driver.name)) == osd_file::error::NONE)
+ if (!file.open(util::string_format("custom_%s_filter.ini", m_driver.name)))
{
software_filter::ptr flt(software_filter::create(file, m_filter_data));
if (flt)
@@ -593,12 +593,12 @@ render_texture *menu_select_software::get_icon_texture(int linenum, void *select
bitmap_argb32 tmp;
emu_file snapfile(std::string(paths->second), OPEN_FLAG_READ);
- if (snapfile.open(std::string(swinfo->shortname) + ".ico") == osd_file::error::NONE)
+ if (!snapfile.open(std::string(swinfo->shortname) + ".ico"))
{
render_load_ico_highest_detail(snapfile, tmp);
snapfile.close();
}
- if (!tmp.valid() && !swinfo->parentname.empty() && (snapfile.open(std::string(swinfo->parentname) + ".ico") == osd_file::error::NONE))
+ if (!tmp.valid() && !swinfo->parentname.empty() && !snapfile.open(std::string(swinfo->parentname) + ".ico"))
{
render_load_ico_highest_detail(snapfile, tmp);
snapfile.close();
@@ -668,7 +668,7 @@ void menu_select_software::filter_selected()
if (software_filter::CUSTOM == new_type)
{
emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(util::string_format("custom_%s_filter.ini", m_driver.name)) == osd_file::error::NONE)
+ if (!file.open(util::string_format("custom_%s_filter.ini", m_driver.name)))
{
filter.save_ini(file, 0);
file.close();
diff --git a/src/frontend/mame/ui/state.cpp b/src/frontend/mame/ui/state.cpp
index 8f911b8f15b..6bb0b9ccdc5 100644
--- a/src/frontend/mame/ui/state.cpp
+++ b/src/frontend/mame/ui/state.cpp
@@ -365,14 +365,16 @@ void menu_load_save_state_base::handle_keys(uint32_t flags, int &iptkey)
machine().options().state_directory(),
machine().get_statename(machine().options().state_name()),
m_confirm_delete->file_name()));
- osd_file::error const err(osd_file::remove(filename));
- if (osd_file::error::NONE != err)
+ std::error_condition const err(osd_file::remove(filename));
+ if (err)
{
osd_printf_error(
- "Error removing file %s for state %s (%d)\n",
+ "Error removing file %s for state %s (%s:%d %s)\n",
filename,
m_confirm_delete->visible_name(),
- std::underlying_type_t<osd_file::error>(err));
+ err.category().name(),
+ err.value(),
+ err.message());
machine().popmessage(_("Error removing saved state file %1$s"), filename);
}
diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp
index 483cdc17623..b730083e160 100644
--- a/src/frontend/mame/ui/ui.cpp
+++ b/src/frontend/mame/ui/ui.cpp
@@ -43,6 +43,8 @@
#include <chrono>
#include <type_traits>
+#define VISIBLE_SOUND_OVERDRIVE (1)
+
/***************************************************************************
CONSTANTS
@@ -643,6 +645,20 @@ void mame_ui_manager::update_and_render(render_container &container)
container.add_rect(0.0f, 0.0f, 1.0f, 1.0f, rgb_t(alpha,0x00,0x00,0x00), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
}
+ // show red if overdriving sound
+ if (VISIBLE_SOUND_OVERDRIVE && machine().phase() == machine_phase::RUNNING)
+ {
+ auto compressor = machine().sound().compressor_scale();
+ if (compressor < 1.0)
+ {
+ float width = 0.05f + std::min(0.15f, (1.0f - compressor) * 0.4f);
+ container.add_rect(0.0f, 0.0f, 1.0f, width, rgb_t(0xc0,0xff,0x00,0x00), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
+ container.add_rect(0.0f, 1.0f - width, 1.0f, 1.0f, rgb_t(0xc0,0xff,0x00,0x00), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
+ container.add_rect(0.0f, width, width, 1.0f - width, rgb_t(0xc0,0xff,0x00,0x00), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
+ container.add_rect(1.0f - width, width, 1.0f, 1.0f - width, rgb_t(0xc0,0xff,0x00,0x00), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
+ }
+ }
+
// render any cheat stuff at the bottom
if (machine().phase() >= machine_phase::RESET)
mame_machine_manager::instance()->cheat().render_text(*this, container);
@@ -2136,7 +2152,7 @@ void mame_ui_manager::load_ui_options()
// parse the file
// attempt to open the output file
emu_file file(machine().options().ini_path(), OPEN_FLAG_READ);
- if (file.open("ui.ini") == osd_file::error::NONE)
+ if (!file.open("ui.ini"))
{
try
{
@@ -2157,7 +2173,7 @@ void mame_ui_manager::save_ui_options()
{
// attempt to open the output file
emu_file file(machine().options().ini_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open("ui.ini") == osd_file::error::NONE)
+ if (!file.open("ui.ini"))
{
// generate the updated INI
file.puts(options().output_ini());
@@ -2185,13 +2201,13 @@ void mame_ui_manager::save_main_option()
// attempt to open the main ini file
{
emu_file file(machine().options().ini_path(), OPEN_FLAG_READ);
- if (file.open(std::string(emulator_info::get_configname()) + ".ini") == osd_file::error::NONE)
+ if (!file.open(std::string(emulator_info::get_configname()) + ".ini"))
{
try
{
options.parse_ini_file((util::core_file&)file, OPTION_PRIORITY_MAME_INI, OPTION_PRIORITY_MAME_INI < OPTION_PRIORITY_DRIVER_INI, true);
}
- catch(options_error_exception &)
+ catch (options_error_exception &)
{
osd_printf_error("**Error loading %s.ini**\n", emulator_info::get_configname());
return;
@@ -2215,13 +2231,14 @@ void mame_ui_manager::save_main_option()
// attempt to open the output file
{
emu_file file(machine().options().ini_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(std::string(emulator_info::get_configname()) + ".ini") == osd_file::error::NONE)
+ if (!file.open(std::string(emulator_info::get_configname()) + ".ini"))
{
// generate the updated INI
file.puts(options.output_ini());
file.close();
}
- else {
+ else
+ {
machine().popmessage(_("**Error saving %s.ini**"), emulator_info::get_configname());
return;
}
diff --git a/src/frontend/mame/ui/utils.cpp b/src/frontend/mame/ui/utils.cpp
index 794eae4bdef..b18b3aa22af 100644
--- a/src/frontend/mame/ui/utils.cpp
+++ b/src/frontend/mame/ui/utils.cpp
@@ -306,7 +306,7 @@ protected:
// try to load filters from a file
if (value && file)
{
- unsigned const cnt(unsigned((std::max)(std::min(int(MAX), std::atoi(value)), 0)));
+ unsigned const cnt(std::clamp<int>(std::atoi(value), 0, MAX));
for (unsigned i = 0; cnt > i; ++i)
{
typename Base::ptr flt(static_cast<Impl &>(*this).create(*file, indent + 1));
diff --git a/src/frontend/mame/ui/viewgfx.cpp b/src/frontend/mame/ui/viewgfx.cpp
index 6816d56bb68..1c263fed451 100644
--- a/src/frontend/mame/ui/viewgfx.cpp
+++ b/src/frontend/mame/ui/viewgfx.cpp
@@ -9,15 +9,17 @@
*********************************************************************/
#include "emu.h"
+#include "ui/viewgfx.h"
+
+
#include "emupal.h"
-#include "ui/ui.h"
-#include "uiinput.h"
#include "render.h"
#include "rendfont.h"
#include "rendutil.h"
#include "tilemap.h"
-#include "ui/viewgfx.h"
+#include "uiinput.h"
+#include <cmath>
/***************************************************************************
@@ -31,7 +33,9 @@ enum ui_gfx_modes
UI_GFX_TILEMAP
};
-const uint8_t MAX_GFX_DECODERS = 8;
+constexpr uint8_t MAX_GFX_DECODERS = 8;
+constexpr int MAX_ZOOM_LEVEL = 8;
+constexpr int MIN_ZOOM_LEVEL = 8;
@@ -46,16 +50,16 @@ struct ui_gfx_info
uint8_t setcount; // how many gfx sets device has
uint8_t rotate[MAX_GFX_ELEMENTS]; // current rotation (orientation) value
uint8_t columns[MAX_GFX_ELEMENTS]; // number of items per row
- int offset[MAX_GFX_ELEMENTS]; // current offset of top,left item
- int color[MAX_GFX_ELEMENTS]; // current color selected
+ int offset[MAX_GFX_ELEMENTS]; // current offset of top,left item
+ int color[MAX_GFX_ELEMENTS]; // current color selected
device_palette_interface *palette[MAX_GFX_ELEMENTS]; // associated palette (maybe multiple choice one day?)
- int color_count[MAX_GFX_ELEMENTS]; // Range of color values
+ int color_count[MAX_GFX_ELEMENTS]; // Range of color values
};
struct ui_gfx_state
{
bool started; // have we called ui_gfx_count_devices() yet?
- uint8_t mode; // which mode are we in?
+ uint8_t mode; // which mode are we in?
// intermediate bitmaps
bool bitmap_dirty; // is the bitmap dirty?
@@ -66,19 +70,19 @@ struct ui_gfx_state
struct
{
device_palette_interface *interface; // pointer to current palette
- int devcount; // how many palette devices exist
- int devindex; // which palette device is visible
- uint8_t which; // which subset (pens or indirect colors)?
- uint8_t columns; // number of items per row
- int offset; // current offset of top left item
+ int devcount; // how many palette devices exist
+ int devindex; // which palette device is visible
+ uint8_t which; // which subset (pens or indirect colors)?
+ uint8_t columns; // number of items per row
+ int offset; // current offset of top left item
} palette;
// graphics-specific data
struct
{
- uint8_t devcount; // how many gfx devices exist
- uint8_t devindex; // which device is visible
- uint8_t set; // which set is visible
+ uint8_t devcount; // how many gfx devices exist
+ uint8_t devindex; // which device is visible
+ uint8_t set; // which set is visible
} gfxset;
// information about each gfx device
@@ -87,12 +91,14 @@ struct ui_gfx_state
// tilemap-specific data
struct
{
- int which; // which tilemap are we viewing?
- int xoffs; // current X offset
- int yoffs; // current Y offset
- int zoom; // zoom factor
- uint8_t rotate; // current rotation (orientation) value
- uint32_t flags; // render flags
+ int which; // which tilemap are we viewing?
+ int xoffs; // current X offset
+ int yoffs; // current Y offset
+ int zoom; // zoom factor, either x or 1/x
+ bool zoom_frac; // zoom via reciprocal fractions
+ bool auto_zoom; // auto-zoom toggle
+ uint8_t rotate; // current rotation (orientation) value
+ uint32_t flags; // render flags
} tilemap;
};
@@ -125,7 +131,7 @@ static void gfxset_update_bitmap(running_machine &machine, ui_gfx_state &state,
static void gfxset_handler(mame_ui_manager &mui, render_container &container, ui_gfx_state &state);
// tilemap handling
-static void tilemap_handle_keys(running_machine &machine, ui_gfx_state &state, int viswidth, int visheight);
+static void tilemap_handle_keys(running_machine &machine, ui_gfx_state &state, float pixelscale);
static void tilemap_update_bitmap(running_machine &machine, ui_gfx_state &state, int width, int height);
static void tilemap_handler(mame_ui_manager &mui, render_container &container, ui_gfx_state &state);
@@ -184,7 +190,9 @@ void ui_gfx_init(running_machine &machine)
state.tilemap.which = 0;
state.tilemap.xoffs = 0;
state.tilemap.yoffs = 0;
- state.tilemap.zoom = 0;
+ state.tilemap.zoom = 1;
+ state.tilemap.zoom_frac = false;
+ state.tilemap.auto_zoom = true;
state.tilemap.rotate = rotate;
state.tilemap.flags = TILEMAP_DRAW_ALL_CATEGORIES;
}
@@ -473,7 +481,7 @@ static void palette_handler(mame_ui_manager &mui, render_container &container, u
skip = int(chwidth / cellwidth);
for (int x = 0; x < state.palette.columns; x += 1 + skip)
{
- x0 = boxbounds.x0 + 6.0f * chwidth + (float)x * cellwidth;
+ x0 = boxbounds.x0 + 6.0f * chwidth + float(x) * cellwidth;
y0 = boxbounds.y0 + 2.0f * chheight;
container.add_char(x0 + 0.5f * (cellwidth - chwidth), y0, chheight, aspect, rgb_t::white(), *ui_font, "0123456789ABCDEF"[x & 0xf]);
@@ -495,7 +503,7 @@ static void palette_handler(mame_ui_manager &mui, render_container &container, u
// if we're skipping, draw a point between the character and the box to indicate which
// one it's referring to
x0 = boxbounds.x0 + 5.5f * chwidth;
- y0 = boxbounds.y0 + 3.5f * chheight + (float)y * cellheight;
+ y0 = boxbounds.y0 + 3.5f * chheight + float(y) * cellheight;
if (skip != 0)
container.add_point(0.5f * (x0 + cellboxbounds.x0), y0 + 0.5f * cellheight, UI_LINE_WIDTH, rgb_t::white(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
@@ -535,20 +543,13 @@ static void palette_handler(mame_ui_manager &mui, render_container &container, u
static void palette_handle_keys(running_machine &machine, ui_gfx_state &state)
{
device_palette_interface *palette = state.palette.interface;
- int rowcount, screencount;
- int total;
-
// handle zoom (minus,plus)
if (machine.ui_input().pressed(IPT_UI_ZOOM_OUT))
- state.palette.columns /= 2;
+ state.palette.columns = std::min<uint8_t>(state.palette.columns * 2, 64);
if (machine.ui_input().pressed(IPT_UI_ZOOM_IN))
- state.palette.columns *= 2;
-
- // clamp within range
- if (state.palette.columns <= 4)
- state.palette.columns = 4;
- if (state.palette.columns > 64)
- state.palette.columns = 64;
+ state.palette.columns = std::max<uint8_t>(state.palette.columns / 2, 4);
+ if (machine.ui_input().pressed(IPT_UI_ZOOM_DEFAULT))
+ state.palette.columns = 16;
// handle colormap selection (open bracket,close bracket)
if (machine.ui_input().pressed(IPT_UI_PREV_GROUP))
@@ -577,11 +578,11 @@ static void palette_handle_keys(running_machine &machine, ui_gfx_state &state)
}
// cache some info in locals
- total = state.palette.which ? palette->indirect_entries() : palette->entries();
+ const int total = state.palette.which ? palette->indirect_entries() : palette->entries();
// determine number of entries per row and total
- rowcount = state.palette.columns;
- screencount = rowcount * rowcount;
+ const int rowcount = state.palette.columns;
+ const int screencount = rowcount * rowcount;
// handle keyboard navigation
if (machine.ui_input().pressed_repeat(IPT_UI_UP, 4))
@@ -626,12 +627,12 @@ static void gfxset_handler(mame_ui_manager &mui, render_container &container, ui
float x0, y0;
render_bounds cellboxbounds;
render_bounds boxbounds;
- int cellboxwidth, cellboxheight;
+ float cellboxwidth, cellboxheight;
int targwidth = mui.machine().render().ui_target().width();
int targheight = mui.machine().render().ui_target().height();
int cellxpix, cellypix;
int xcells;
- int pixelscale = 0;
+ float pixelscale = 0.0f;
int skip;
// add a half character padding for the box
@@ -675,24 +676,23 @@ static void gfxset_handler(mame_ui_manager &mui, render_container &container, ui
}
info.columns[set] = xcells;
- // worst case, we need a pixel scale of 1
- pixelscale = std::max(1, pixelscale);
+ if (pixelscale <= 0.0f)
+ pixelscale = 1.0f;
// in the Y direction, we just display as many as we can
- const int ycells = cellboxheight / (pixelscale * cellypix);
+ const int ycells = int(cellboxheight / (pixelscale * cellypix));
// now determine the actual cellbox size
cellboxwidth = std::min(cellboxwidth, xcells * pixelscale * cellxpix);
cellboxheight = std::min(cellboxheight, ycells * pixelscale * cellypix);
- // compute the size of a single cell at this pixel scale factor, as well as the aspect ratio
- const float cellwidth = (cellboxwidth / float(xcells)) / float(targwidth);
- const float cellheight = (cellboxheight / float(ycells)) / float(targheight);
- //cellaspect = cellwidth / cellheight;
+ // compute the size of a single cell at this pixel scale factor
+ const float cellwidth = (cellboxwidth / xcells) / targwidth;
+ const float cellheight = (cellboxheight / ycells) / targheight;
// working from the new width/height, recompute the boxbounds
- const float fullwidth = float(cellboxwidth) / float(targwidth) + 6.5f * chwidth;
- const float fullheight = float(cellboxheight) / float(targheight) + 4.0f * chheight;
+ const float fullwidth = cellboxwidth / targwidth + 6.5f * chwidth;
+ const float fullheight = cellboxheight / targheight + 4.0f * chheight;
// recompute boxbounds from this
boxbounds.x0 = (1.0f - fullwidth) * 0.5f;
@@ -702,9 +702,9 @@ static void gfxset_handler(mame_ui_manager &mui, render_container &container, ui
// recompute cellboxbounds
cellboxbounds.x0 = boxbounds.x0 + 6.0f * chwidth;
- cellboxbounds.x1 = cellboxbounds.x0 + float(cellboxwidth) / float(targwidth);
+ cellboxbounds.x1 = cellboxbounds.x0 + cellboxwidth / float(targwidth);
cellboxbounds.y0 = boxbounds.y0 + 3.5f * chheight;
- cellboxbounds.y1 = cellboxbounds.y0 + float(cellboxheight) / float(targheight);
+ cellboxbounds.y1 = cellboxbounds.y0 + cellboxheight / float(targheight);
// figure out the title
std::ostringstream title_buf;
@@ -764,7 +764,7 @@ static void gfxset_handler(mame_ui_manager &mui, render_container &container, ui
skip = int(chwidth / cellwidth);
for (int x = 0; x < xcells; x += 1 + skip)
{
- x0 = boxbounds.x0 + 6.0f * chwidth + (float)x * cellwidth;
+ x0 = boxbounds.x0 + 6.0f * chwidth + float(x) * cellwidth;
y0 = boxbounds.y0 + 2.0f * chheight;
container.add_char(x0 + 0.5f * (cellwidth - chwidth), y0, chheight, aspect, rgb_t::white(), *ui_font, "0123456789ABCDEF"[x & 0xf]);
@@ -786,7 +786,7 @@ static void gfxset_handler(mame_ui_manager &mui, render_container &container, ui
// if we're skipping, draw a point between the character and the box to indicate which
// one it's referring to
x0 = boxbounds.x0 + 5.5f * chwidth;
- y0 = boxbounds.y0 + 3.5f * chheight + (float)y * cellheight;
+ y0 = boxbounds.y0 + 3.5f * chheight + float(y) * cellheight;
if (skip != 0)
container.add_point(0.5f * (x0 + boxbounds.x0 + 6.0f * chwidth), y0 + 0.5f * cellheight, UI_LINE_WIDTH, rgb_t::white(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
@@ -849,17 +849,14 @@ static void gfxset_handle_keys(running_machine &machine, ui_gfx_state &state, in
gfx_element &gfx = *info.interface->gfx(set);
// handle cells per line (minus,plus)
- if (machine.ui_input().pressed(IPT_UI_ZOOM_OUT))
- { info.columns[set] = xcells - 1; state.bitmap_dirty = true; }
-
- if (machine.ui_input().pressed(IPT_UI_ZOOM_IN))
+ if (machine.ui_input().pressed(IPT_UI_ZOOM_OUT) && (xcells < 128))
{ info.columns[set] = xcells + 1; state.bitmap_dirty = true; }
- // clamp within range
- if (info.columns[set] < 2)
- { info.columns[set] = 2; state.bitmap_dirty = true; }
- if (info.columns[set] > 128)
- { info.columns[set] = 128; state.bitmap_dirty = true; }
+ if (machine.ui_input().pressed(IPT_UI_ZOOM_IN) && (xcells > 2))
+ { info.columns[set] = xcells - 1; state.bitmap_dirty = true; }
+
+ if (machine.ui_input().pressed(IPT_UI_ZOOM_DEFAULT) && (xcells != 16))
+ { info.columns[set] = 16; state.bitmap_dirty = true; }
// handle rotation (R)
if (machine.ui_input().pressed(IPT_UI_ROTATE))
@@ -912,18 +909,16 @@ static void gfxset_handle_keys(running_machine &machine, ui_gfx_state &state, in
static void gfxset_update_bitmap(running_machine &machine, ui_gfx_state &state, int xcells, int ycells, gfx_element &gfx)
{
- int dev = state.gfxset.devindex;
- int set = state.gfxset.set;
+ const int dev = state.gfxset.devindex;
+ const int set = state.gfxset.set;
ui_gfx_info &info = state.gfxdev[dev];
- int cellxpix, cellypix;
- int x, y;
// compute the number of source pixels in a cell
- cellxpix = 1 + ((info.rotate[set] & ORIENTATION_SWAP_XY) ? gfx.height() : gfx.width());
- cellypix = 1 + ((info.rotate[set] & ORIENTATION_SWAP_XY) ? gfx.width() : gfx.height());
+ const int cellxpix = 1 + ((info.rotate[set] & ORIENTATION_SWAP_XY) ? gfx.height() : gfx.width());
+ const int cellypix = 1 + ((info.rotate[set] & ORIENTATION_SWAP_XY) ? gfx.width() : gfx.height());
// realloc the bitmap if it is too small
- if (!state.bitmap.valid() || state.texture == nullptr || state.bitmap.width() != cellxpix * xcells || state.bitmap.height() != cellypix * ycells)
+ if (!state.bitmap.valid() || !state.texture || state.bitmap.width() != cellxpix * xcells || state.bitmap.height() != cellypix * ycells)
{
// free the old stuff
machine.render().texture_free(state.texture);
@@ -942,37 +937,28 @@ static void gfxset_update_bitmap(running_machine &machine, ui_gfx_state &state,
if (state.bitmap_dirty)
{
// loop over rows
- for (y = 0; y < ycells; y++)
+ for (int y = 0, index = info.offset[set]; y < ycells; y++)
{
- rectangle cellbounds;
-
// make a rect that covers this row
- cellbounds.set(0, state.bitmap.width() - 1, y * cellypix, (y + 1) * cellypix - 1);
+ rectangle cellbounds(0, state.bitmap.width() - 1, y * cellypix, (y + 1) * cellypix - 1);
// only display if there is data to show
- if (info.offset[set] + y * xcells < gfx.elements())
+ if (index < gfx.elements())
{
// draw the individual cells
- for (x = 0; x < xcells; x++)
+ for (int x = 0; x < xcells; x++, index++)
{
- int index = info.offset[set] + y * xcells + x;
-
// update the bounds for this cell
cellbounds.min_x = x * cellxpix;
cellbounds.max_x = (x + 1) * cellxpix - 1;
- // only render if there is data
- if (index < gfx.elements())
+ if (index < gfx.elements()) // only render if there is data
gfxset_draw_item(machine, gfx, index, state.bitmap, cellbounds.min_x, cellbounds.min_y, info.color[set], info.rotate[set], info.palette[set]);
-
- // otherwise, fill with transparency
- else
+ else // otherwise, fill with transparency
state.bitmap.fill(0, cellbounds);
}
}
-
- // otherwise, fill with transparency
- else
+ else // otherwise, fill with transparency
state.bitmap.fill(0, cellbounds);
}
@@ -1081,28 +1067,30 @@ static void tilemap_handler(mame_ui_manager &mui, render_container &container, u
mapboxbounds.y0 += 1.5f * chheight;
// convert back to pixels
- mapboxwidth = (mapboxbounds.x1 - mapboxbounds.x0) * (float)targwidth;
- mapboxheight = (mapboxbounds.y1 - mapboxbounds.y0) * (float)targheight;
+ mapboxwidth = (mapboxbounds.x1 - mapboxbounds.x0) * float(targwidth);
+ mapboxheight = (mapboxbounds.y1 - mapboxbounds.y0) * float(targheight);
- // determine the maximum integral scaling factor
- int pixelscale = state.tilemap.zoom;
- if (pixelscale == 0)
+ float pixelscale;
+ if (state.tilemap.auto_zoom)
+ {
+ // determine the maximum integral scaling factor
+ pixelscale = std::min(std::floor(mapboxwidth / mapwidth), std::floor(mapboxheight / mapheight));
+ pixelscale = std::max(pixelscale, 1.0f);
+ }
+ else
{
- int maxxscale, maxyscale;
- for (maxxscale = 1; mapwidth * (maxxscale + 1) < mapboxwidth; maxxscale++) { }
- for (maxyscale = 1; mapheight * (maxyscale + 1) < mapboxheight; maxyscale++) { }
- pixelscale = std::min(maxxscale, maxyscale);
+ pixelscale = state.tilemap.zoom_frac ? (1.0f / state.tilemap.zoom) : float(state.tilemap.zoom);
}
// recompute the final box size
- mapboxwidth = std::min(mapboxwidth, int(mapwidth * pixelscale));
- mapboxheight = std::min(mapboxheight, int(mapheight * pixelscale));
+ mapboxwidth = std::min<int>(mapboxwidth, std::lround(mapwidth * pixelscale));
+ mapboxheight = std::min<int>(mapboxheight, std::lround(mapheight * pixelscale));
// recompute the bounds, centered within the existing bounds
- mapboxbounds.x0 += 0.5f * ((mapboxbounds.x1 - mapboxbounds.x0) - (float)mapboxwidth / (float)targwidth);
- mapboxbounds.x1 = mapboxbounds.x0 + (float)mapboxwidth / (float)targwidth;
- mapboxbounds.y0 += 0.5f * ((mapboxbounds.y1 - mapboxbounds.y0) - (float)mapboxheight / (float)targheight);
- mapboxbounds.y1 = mapboxbounds.y0 + (float)mapboxheight / (float)targheight;
+ mapboxbounds.x0 += 0.5f * ((mapboxbounds.x1 - mapboxbounds.x0) - float(mapboxwidth) / targwidth);
+ mapboxbounds.x1 = mapboxbounds.x0 + float(mapboxwidth) / targwidth;
+ mapboxbounds.y0 += 0.5f * ((mapboxbounds.y1 - mapboxbounds.y0) - float(mapboxheight) / targheight);
+ mapboxbounds.y1 = mapboxbounds.y0 + float(mapboxheight) / targheight;
// now recompute the outer box against this new info
boxbounds.x0 = mapboxbounds.x0 - 0.5f * chwidth;
@@ -1131,8 +1119,8 @@ static void tilemap_handler(mame_ui_manager &mui, render_container &container, u
ypixel = (mapboxheight - 1) - ypixel;
if (state.tilemap.rotate & ORIENTATION_SWAP_XY)
std::swap(xpixel, ypixel);
- uint32_t col = ((xpixel / pixelscale + state.tilemap.xoffs) / tilemap->tilewidth()) % tilemap->cols();
- uint32_t row = ((ypixel / pixelscale + state.tilemap.yoffs) / tilemap->tileheight()) % tilemap->rows();
+ uint32_t col = ((std::lround(xpixel / pixelscale) + state.tilemap.xoffs) / tilemap->tilewidth()) % tilemap->cols();
+ uint32_t row = ((std::lround(ypixel / pixelscale) + state.tilemap.yoffs) / tilemap->tileheight()) % tilemap->rows();
uint8_t gfxnum;
uint32_t code, color;
tilemap->get_info_debug(col, row, gfxnum, code, color);
@@ -1168,7 +1156,7 @@ static void tilemap_handler(mame_ui_manager &mui, render_container &container, u
}
// update the bitmap
- tilemap_update_bitmap(mui.machine(), state, mapboxwidth / pixelscale, mapboxheight / pixelscale);
+ tilemap_update_bitmap(mui.machine(), state, std::lround(mapboxwidth / pixelscale), std::lround(mapboxheight / pixelscale));
// add the final quad
container.add_quad(mapboxbounds.x0, mapboxbounds.y0,
@@ -1177,7 +1165,7 @@ static void tilemap_handler(mame_ui_manager &mui, render_container &container, u
PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXORIENT(state.tilemap.rotate));
// handle keyboard input
- tilemap_handle_keys(mui.machine(), state, mapboxwidth, mapboxheight);
+ tilemap_handle_keys(mui.machine(), state, pixelscale);
}
@@ -1186,7 +1174,7 @@ static void tilemap_handler(mame_ui_manager &mui, render_container &container, u
// tilemap view
//-------------------------------------------------
-static void tilemap_handle_keys(running_machine &machine, ui_gfx_state &state, int viswidth, int visheight)
+static void tilemap_handle_keys(running_machine &machine, ui_gfx_state &state, float pixelscale)
{
// handle tilemap selection (open bracket,close bracket)
if (machine.ui_input().pressed(IPT_UI_PREV_GROUP) && state.tilemap.which > 0)
@@ -1199,21 +1187,79 @@ static void tilemap_handle_keys(running_machine &machine, ui_gfx_state &state, i
uint32_t mapwidth = tilemap->width();
uint32_t mapheight = tilemap->height();
+ const bool at_max_zoom = !state.tilemap.auto_zoom && !state.tilemap.zoom_frac && state.tilemap.zoom == MAX_ZOOM_LEVEL;
+ const bool at_min_zoom = !state.tilemap.auto_zoom && state.tilemap.zoom_frac && state.tilemap.zoom == MIN_ZOOM_LEVEL;
+
// handle zoom (minus,plus)
- if (machine.ui_input().pressed(IPT_UI_ZOOM_OUT) && state.tilemap.zoom > 0)
+ if (machine.ui_input().pressed(IPT_UI_ZOOM_OUT) && !at_min_zoom)
{
- state.tilemap.zoom--;
- state.bitmap_dirty = true;
- if (state.tilemap.zoom != 0)
- machine.popmessage("Zoom = %d", state.tilemap.zoom);
+ if (state.tilemap.auto_zoom)
+ {
+ // auto zoom never uses fractional factors
+ state.tilemap.zoom = std::lround(pixelscale) - 1;
+ state.tilemap.zoom_frac = !state.tilemap.zoom;
+ if (state.tilemap.zoom_frac)
+ state.tilemap.zoom = 2;
+ state.tilemap.auto_zoom = false;
+ }
+ else if (state.tilemap.zoom_frac)
+ {
+ // remaining in fractional zoom range
+ state.tilemap.zoom++;
+ }
+ else if (state.tilemap.zoom == 1)
+ {
+ // entering fractional zoom range
+ state.tilemap.zoom++;
+ state.tilemap.zoom_frac = true;
+ }
else
- machine.popmessage("Zoom Auto");
+ {
+ // remaining in integer zoom range
+ state.tilemap.zoom--;
+ }
+
+ state.bitmap_dirty = true;
+
+ machine.popmessage(state.tilemap.zoom_frac ? _("Zoom = 1/%1$d") : _("Zoom = %1$d"), state.tilemap.zoom);
}
- if (machine.ui_input().pressed(IPT_UI_ZOOM_IN) && state.tilemap.zoom < 8)
+
+ if (machine.ui_input().pressed(IPT_UI_ZOOM_IN) && !at_max_zoom)
{
- state.tilemap.zoom++;
+ if (state.tilemap.auto_zoom)
+ {
+ // auto zoom never uses fractional factors
+ state.tilemap.zoom = std::min<int>(std::lround(pixelscale) + 1, MAX_ZOOM_LEVEL);
+ state.tilemap.zoom_frac = false;
+ state.tilemap.auto_zoom = false;
+ }
+ else if (!state.tilemap.zoom_frac)
+ {
+ // remaining in integer zoom range
+ state.tilemap.zoom++;
+ }
+ else if (state.tilemap.zoom == 2)
+ {
+ // entering integer zoom range
+ state.tilemap.zoom--;
+ state.tilemap.zoom_frac = false;
+ }
+ else
+ {
+ // remaining in fractional zoom range
+ state.tilemap.zoom--;
+ }
+
state.bitmap_dirty = true;
- machine.popmessage("Zoom = %d", state.tilemap.zoom);
+
+ machine.popmessage(state.tilemap.zoom_frac ? _("Zoom = 1/%1$d") : _("Zoom = %1$d"), state.tilemap.zoom);
+ }
+
+ if (machine.ui_input().pressed(IPT_UI_ZOOM_DEFAULT) && !state.tilemap.auto_zoom)
+ {
+ state.tilemap.auto_zoom = true;
+
+ machine.popmessage(_("Expand to fit"));
}
// handle rotation (R)
@@ -1317,7 +1363,7 @@ static void tilemap_update_bitmap(running_machine &machine, ui_gfx_state &state,
std::swap(width, height);
// realloc the bitmap if it is too small
- if (!state.bitmap.valid() || state.texture == nullptr || state.bitmap.width() != width || state.bitmap.height() != height)
+ if (!state.bitmap.valid() || !state.texture || state.bitmap.width() != width || state.bitmap.height() != height)
{
// free the old stuff
machine.render().texture_free(state.texture);
diff --git a/src/frontend/mame/ui/viewgfx.h b/src/frontend/mame/ui/viewgfx.h
index a4d2205d7a8..765384b4bea 100644
--- a/src/frontend/mame/ui/viewgfx.h
+++ b/src/frontend/mame/ui/viewgfx.h
@@ -13,6 +13,7 @@
#pragma once
+#include "ui/ui.h"
/***************************************************************************
diff --git a/src/lib/formats/acorn_dsk.cpp b/src/lib/formats/acorn_dsk.cpp
index c4668478b05..40ab6eb1029 100644
--- a/src/lib/formats/acorn_dsk.cpp
+++ b/src/lib/formats/acorn_dsk.cpp
@@ -10,6 +10,9 @@
#include "acorn_dsk.h"
+#include "ioprocs.h"
+
+
acorn_ssd_format::acorn_ssd_format() : wd177x_format(formats)
{
}
@@ -29,29 +32,36 @@ const char *acorn_ssd_format::extensions() const
return "ssd,bbc,img";
}
-int acorn_ssd_format::find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int acorn_ssd_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t cat[8];
uint32_t sectors0, sectors2;
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ {
+ LOG_FORMATS("ssd: error getting image size\n");
+ return -1;
+ }
- for(int i=0; formats[i].form_factor; i++) {
+ for (int i=0; formats[i].form_factor; i++)
+ {
+ size_t actual;
const format &f = formats[i];
- if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
+ if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
continue;
// test for Torch CPN - test pattern at sector &0018
- io_generic_read(io, cat, 0x32800, 8);
+ io.read_at(0x32800, cat, 8, actual);
if (memcmp(cat, "\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd", 4) == 0 && size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count)
return i;
// test for HADFS - test pattern at sector 70
- io_generic_read(io, cat, 0x04610, 8);
+ io.read_at(0x04610, cat, 8, actual);
if (memcmp(cat, "\x00\x28\x43\x29\x4a\x47\x48\x00", 4) == 0 && size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count)
return i;
// test for Kenda SD - offset &0962 = 0 SD/1 DD, offset &0963 = disk size blocks / 4 (block size = 1K, ie. 0x400 bytes), reserved tracks = 3, ie. 0x1e00 bytes, soft stagger = 2 sectors, ie. 0x200 bytes
- io_generic_read(io, cat, 0x0960, 8);
+ io.read_at(0x0960, cat, 8, actual);
if (cat[2] == 0 && ((uint64_t)cat[3] * 4 * 0x400 + 0x2000) == size && size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count)
{
// valid blocks for single sided
@@ -63,20 +73,22 @@ int acorn_ssd_format::find_size(io_generic *io, uint32_t form_factor, const std:
}
// read sector count from side 0 catalogue
- io_generic_read(io, cat, 0x100, 8);
+ io.read_at(0x100, cat, 8, actual);
sectors0 = ((cat[6] & 3) << 8) + cat[7];
LOG_FORMATS("ssd: sector count 0: %d %s\n", sectors0, sectors0 % 10 != 0 ? "invalid" : "");
- if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && (sectors0 <= f.track_count * f.sector_count)) {
+ if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && (sectors0 <= f.track_count * f.sector_count))
+ {
if (f.head_count == 2)
{
// read sector count from side 2 catalogue
- io_generic_read(io, cat, (uint64_t)compute_track_size(f) * f.track_count + 0x100, 8); // sequential
+ io.read_at((uint64_t)compute_track_size(f) * f.track_count + 0x100, cat, 8, actual); // sequential
sectors2 = ((cat[6] & 3) << 8) + cat[7];
// exception case for Acorn CP/M System Disc 1
- io_generic_read(io, cat, 0x367ec, 8);
- if (memcmp(cat, "/M ", 4) == 0) sectors2 = ((cat[6] & 3) << 8) + cat[7];
+ io.read_at(0x367ec, cat, 8, actual);
+ if (memcmp(cat, "/M ", 4) == 0)
+ sectors2 = ((cat[6] & 3) << 8) + cat[7];
LOG_FORMATS("ssd: sector count 2: %d %s\n", sectors2, sectors2 % 10 != 0 ? "invalid" : "");
}
@@ -93,12 +105,13 @@ int acorn_ssd_format::find_size(io_generic *io, uint32_t form_factor, const std:
return -1;
}
-int acorn_ssd_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int acorn_ssd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
int type = find_size(io, form_factor, variants);
- if(type != -1)
+ if (type != -1)
return 90;
+
return 0;
}
@@ -171,40 +184,49 @@ const char *acorn_dsd_format::extensions() const
return "dsd";
}
-int acorn_dsd_format::find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int acorn_dsd_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t cat[8];
uint32_t sectors0, sectors2;
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ {
+ LOG_FORMATS("dsd: error getting image size\n");
+ return -1;
+ }
- for (int i = 0; formats[i].form_factor; i++) {
+ for (int i = 0; formats[i].form_factor; i++)
+ {
+ size_t actual;
const format &f = formats[i];
if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
continue;
// test for Torch CPN - test pattern at sector &0018
- io_generic_read(io, cat, 0x1200, 8);
+ io.read_at(0x1200, cat, 8, actual);
if (memcmp(cat, "\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd", 4) == 0 && size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count)
return i;
// test for HADFS - test pattern at sector 70
- io_generic_read(io, cat, 0x08c10, 8);
+ io.read_at(0x08c10, cat, 8, actual);
if (memcmp(cat, "\x00\x28\x43\x29\x4a\x47\x48\x00", 4) == 0 && size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count)
return i;
// read sector count from side 0 catalogue
- io_generic_read(io, cat, 0x100, 8);
+ io.read_at(0x100, cat, 8, actual);
sectors0 = ((cat[6] & 3) << 8) + cat[7];
LOG_FORMATS("dsd: sector count 0: %d %s\n", sectors0, sectors0 % 10 != 0 ? "invalid" : "");
- if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && (sectors0 <= f.track_count * f.sector_count)) {
+ if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && (sectors0 <= f.track_count * f.sector_count))
+ {
// read sector count from side 2 catalogue
- io_generic_read(io, cat, 0xb00, 8); // interleaved
+ io.read_at(0xb00, cat, 8, actual); // interleaved
sectors2 = ((cat[6] & 3) << 8) + cat[7];
// exception case for Acorn CP/M System Disc 1
- io_generic_read(io, cat, 0x97ec, 8);
- if (memcmp(cat, "/M ", 4) == 0) sectors2 = ((cat[6] & 3) << 8) + cat[7];
+ io.read_at(0x97ec, cat, 8, actual);
+ if (memcmp(cat, "/M ", 4) == 0)
+ sectors2 = ((cat[6] & 3) << 8) + cat[7];
LOG_FORMATS("dsd: sector count 2: %d %s\n", sectors2, sectors2 % 10 != 0 ? "invalid" : "");
@@ -216,12 +238,13 @@ int acorn_dsd_format::find_size(io_generic *io, uint32_t form_factor, const std:
return -1;
}
-int acorn_dsd_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int acorn_dsd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
int type = find_size(io, form_factor, variants);
if (type != -1)
return 90;
+
return 0;
}
@@ -274,27 +297,36 @@ const char *opus_ddos_format::extensions() const
return "dds";
}
-int opus_ddos_format::find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int opus_ddos_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
+ size_t actual;
uint8_t cat[8];
uint32_t sectors0, sectors2;
// read sector count from side 0 catalogue
- io_generic_read(io, cat, 0x1000, 8);
+ io.read_at(0x1000, cat, 8, actual);
sectors0 = (cat[1] << 8) + cat[2];
LOG_FORMATS("ddos: sector count 0: %d %s\n", sectors0, sectors0 % 18 != 0 ? "invalid" : "");
- uint64_t size = io_generic_size(io);
- for (int i = 0; formats[i].form_factor; i++) {
+ uint64_t size;
+ if (io.length(size))
+ {
+ LOG_FORMATS("ddos: error getting image size\n");
+ return -1;
+ }
+
+ for (int i = 0; formats[i].form_factor; i++)
+ {
const format &f = formats[i];
if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
continue;
- if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && (sectors0 <= f.track_count * f.sector_count)) {
+ if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && (sectors0 <= f.track_count * f.sector_count))
+ {
if (f.head_count == 2)
{
// read sector count from side 2 catalogue
- io_generic_read(io, cat, (uint64_t)compute_track_size(f) * f.track_count + 0x1000, 8); // sequential
+ io.read_at((uint64_t)compute_track_size(f) * f.track_count + 0x1000, cat, 8, actual); // sequential
sectors2 = (cat[1] << 8) + cat[2];
LOG_FORMATS("ddos: sector count 2: %d %s\n", sectors2, sectors2 % 18 != 0 ? "invalid" : "");
}
@@ -311,12 +343,13 @@ int opus_ddos_format::find_size(io_generic *io, uint32_t form_factor, const std:
return -1;
}
-int opus_ddos_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int opus_ddos_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
int type = find_size(io, form_factor, variants);
if (type != -1)
return 90;
+
return 0;
}
@@ -369,25 +402,33 @@ const char *acorn_adfs_old_format::extensions() const
return "adf,ads,adm,adl";
}
-int acorn_adfs_old_format::find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int acorn_adfs_old_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
+ size_t actual;
uint8_t map[3];
uint32_t sectors;
uint8_t oldmap[4];
// read sector count from free space map
- io_generic_read(io, map, 0xfc, 3);
+ io.read_at(0xfc, map, 3, actual);
sectors = map[0] + (map[1] << 8) + (map[2] << 16);
LOG_FORMATS("adfs_o: sector count %d %s\n", sectors, sectors % 16 != 0 ? "invalid" : "");
// read map identifier
- io_generic_read(io, oldmap, 0x201, 4);
+ io.read_at(0x201, oldmap, 4, actual);
LOG_FORMATS("adfs_o: map identifier %s %s\n", oldmap, memcmp(oldmap, "Hugo", 4) != 0 ? "invalid" : "");
- uint64_t size = io_generic_size(io);
- for(int i=0; formats[i].form_factor; i++) {
+ uint64_t size;
+ if (io.length(size))
+ {
+ LOG_FORMATS("adfs_o: error getting image size\n");
+ return -1;
+ }
+
+ for (int i=0; formats[i].form_factor; i++)
+ {
const format &f = formats[i];
- if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
+ if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
continue;
// valid images will have map identifier 'Hugo' and sector counts adfs-s = 0x280; adfs-m = 0x500; adfs-l = 0xa00; adfs-dos = 0xaa0; though many adfs-s images are incorrect
@@ -399,12 +440,13 @@ int acorn_adfs_old_format::find_size(io_generic *io, uint32_t form_factor, const
return -1;
}
-int acorn_adfs_old_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int acorn_adfs_old_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
int type = find_size(io, form_factor, variants);
if(type != -1)
return 100;
+
return 0;
}
@@ -465,43 +507,50 @@ const char *acorn_adfs_new_format::extensions() const
return "adf";
}
-int acorn_adfs_new_format::find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int acorn_adfs_new_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
+ size_t actual;
uint8_t dform[4];
uint8_t eform[4];
// read map identifiers for D and E formats
- io_generic_read(io, dform, 0x401, 4);
+ io.read_at(0x401, dform, 4, actual);
LOG_FORMATS("adfs_n: map identifier (D format) %s %s\n", dform, (memcmp(dform, "Hugo", 4) != 0 && memcmp(dform, "Nick", 4) != 0) ? "invalid" : "");
- io_generic_read(io, eform, 0x801, 4);
+ io.read_at(0x801, eform, 4, actual);
LOG_FORMATS("adfs_n: map identifier (E format) %s %s\n", eform, memcmp(eform, "Nick", 4) != 0 ? "invalid" : "");
- uint64_t size = io_generic_size(io);
- for (int i = 0; formats[i].form_factor; i++) {
+ uint64_t size;
+ if (io.length(size))
+ {
+ LOG_FORMATS("adfs_n: error getting image size\n");
+ return -1;
+ }
+
+ for (int i = 0; formats[i].form_factor; i++)
+ {
const format &f = formats[i];
if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
continue;
// no further checks for 1600K images
- if ((size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && size == 0x190000) {
+ if ((size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && size == 0x190000)
return i;
- }
// valid 800K images will have map identifier Nick, Arthur D format still use Hugo
- if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && (memcmp(dform, "Hugo", 4) == 0 || memcmp(dform, "Nick", 4) == 0 || memcmp(eform, "Nick", 4) == 0)) {
+ if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && (memcmp(dform, "Hugo", 4) == 0 || memcmp(dform, "Nick", 4) == 0 || memcmp(eform, "Nick", 4) == 0))
return i;
- }
}
LOG_FORMATS("adfs_n: no match\n");
return -1;
}
-int acorn_adfs_new_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int acorn_adfs_new_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
int type = find_size(io, form_factor, variants);
if (type != -1)
return 100;
+
return 0;
}
@@ -546,33 +595,43 @@ const char *acorn_dos_format::extensions() const
return "img";
}
-int acorn_dos_format::find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int acorn_dos_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint8_t type;
+ uint64_t size;
+ if (io.length(size))
+ {
+ LOG_FORMATS("dos: error getting image size\n");
+ return -1;
+ }
- uint64_t size = io_generic_size(io);
- for(int i=0; formats[i].form_factor; i++) {
+ for (int i=0; formats[i].form_factor; i++)
+ {
const format &f = formats[i];
- if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
+ if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
continue;
- if (size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) {
+ if (size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count)
+ {
// read media type ID from FAT - Acorn DOS = 0xfd
- io_generic_read(io, &type, 0, 1);
+ size_t actual;
+ uint8_t type;
+ io.read_at(0, &type, 1, actual);
LOG_FORMATS("dos: 800k media type id %02X %s\n", type, type != 0xfd ? "invalid" : "");
- if (type == 0xfd) return i;
+ if (type == 0xfd)
+ return i;
}
}
LOG_FORMATS("dos: no match\n");
return -1;
}
-int acorn_dos_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int acorn_dos_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
int type = find_size(io, form_factor, variants);
- if(type != -1)
+ if (type != -1)
return 90;
+
return 0;
}
@@ -618,19 +677,28 @@ bool opus_ddcpm_format::supports_save() const
return false;
}
-int opus_ddcpm_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int opus_ddcpm_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
+ size_t actual;
uint8_t h[8];
- io_generic_read(io, h, 0, 8);
+ io.read_at(0, h, 8, actual);
+
+ uint64_t size;
+ if (io.length(size))
+ {
+ LOG_FORMATS("ddcpm: error getting image size\n");
+ return -1;
+ }
- if (io_generic_size(io) == 819200 && memcmp(h, "Slogger ", 8) == 0)
+ if (size == 819200 && memcmp(h, "Slogger ", 8) == 0)
return 100;
+
LOG_FORMATS("ddcpm: no match\n");
return 0;
}
-bool opus_ddcpm_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool opus_ddcpm_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
// Double density discs formatted with DDCPM :
//
@@ -644,19 +712,21 @@ bool opus_ddcpm_format::load(io_generic *io, uint32_t form_factor, const std::ve
// Sector skew of 1
// Sector interleave of 2
//
- int spt, bps;
-
- for (int head = 0; head < 2; head++) {
- for (int track = 0; track < 80; track++) {
- bool mfm = track > 2 || head;
- bps = mfm ? 512 : 256;
- spt = 10;
+ for (int head = 0; head < 2; head++)
+ {
+ for (int track = 0; track < 80; track++)
+ {
+ bool const mfm = track > 2 || head;
+ int const bps = mfm ? 512 : 256;
+ int const spt = 10;
desc_pc_sector sects[10];
uint8_t sectdata[10*512];
- io_generic_read(io, sectdata, head * 80 * spt * 512 + track * spt * 512, spt * 512);
+ size_t actual;
+ io.read_at(head * 80 * spt * 512 + track * spt * 512, sectdata, spt * 512, actual);
- for (int i = 0; i < spt; i++) {
+ for (int i = 0; i < spt; i++)
+ {
sects[i].track = track;
sects[i].head = head;
sects[i].sector = i;
@@ -677,7 +747,7 @@ bool opus_ddcpm_format::load(io_generic *io, uint32_t form_factor, const std::ve
return true;
}
-bool opus_ddcpm_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool opus_ddcpm_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
return false;
}
diff --git a/src/lib/formats/acorn_dsk.h b/src/lib/formats/acorn_dsk.h
index 1428212cfaa..de07e8b9fed 100644
--- a/src/lib/formats/acorn_dsk.h
+++ b/src/lib/formats/acorn_dsk.h
@@ -20,8 +20,8 @@ class acorn_ssd_format : public wd177x_format
public:
acorn_ssd_format();
- virtual int find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual int get_image_offset(const format &f, int head, int track) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -36,8 +36,8 @@ class acorn_dsd_format : public wd177x_format
public:
acorn_dsd_format();
- virtual int find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual int get_image_offset(const format &f, int head, int track) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -52,8 +52,8 @@ class opus_ddos_format : public wd177x_format
public:
opus_ddos_format();
- virtual int find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual int get_image_offset(const format &f, int head, int track) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -68,8 +68,8 @@ class acorn_adfs_old_format : public wd177x_format
public:
acorn_adfs_old_format();
- virtual int find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual int get_image_offset(const format &f, int head, int track) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -84,8 +84,8 @@ class acorn_adfs_new_format : public wd177x_format
public:
acorn_adfs_new_format();
- virtual int find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual int get_image_offset(const format &f, int head, int track) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -100,8 +100,8 @@ class acorn_dos_format : public wd177x_format
public:
acorn_dos_format();
- virtual int find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual int get_image_offset(const format &f, int head, int track) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -116,9 +116,9 @@ class opus_ddcpm_format : public floppy_image_format_t
public:
opus_ddcpm_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/afs_dsk.cpp b/src/lib/formats/afs_dsk.cpp
index d6b275240de..000daf62df7 100644
--- a/src/lib/formats/afs_dsk.cpp
+++ b/src/lib/formats/afs_dsk.cpp
@@ -30,12 +30,13 @@ const char *afs_format::extensions() const
return "adl,img";
}
-int afs_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int afs_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
int type = find_size(io, form_factor, variants);
if (type != -1)
return 50;
+
return 0;
}
diff --git a/src/lib/formats/afs_dsk.h b/src/lib/formats/afs_dsk.h
index 1a15e54d90d..f56b2dcb1f4 100644
--- a/src/lib/formats/afs_dsk.h
+++ b/src/lib/formats/afs_dsk.h
@@ -20,7 +20,7 @@ class afs_format : public wd177x_format
public:
afs_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual int get_image_offset(const format &f, int head, int track) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/aim_dsk.cpp b/src/lib/formats/aim_dsk.cpp
index 489ec1752e4..6ad49b22969 100644
--- a/src/lib/formats/aim_dsk.cpp
+++ b/src/lib/formats/aim_dsk.cpp
@@ -12,10 +12,10 @@
*********************************************************************/
-#include <cassert>
-
#include "aim_dsk.h"
+#include "ioprocs.h"
+
aim_format::aim_format()
{
@@ -40,18 +40,20 @@ const char *aim_format::extensions() const
}
-int aim_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int aim_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- if (io_generic_size(io) == 2068480)
- {
+ uint64_t size;
+ if (io.length(size))
+ return 0;
+
+ if (size == 2068480)
return 100;
- }
return 0;
}
-bool aim_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool aim_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
image->set_variant(floppy_image::DSQD);
@@ -70,7 +72,8 @@ bool aim_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
bool header = false;
// Read track
- io_generic_read(io, &track_data[0], ( heads * track + head ) * track_size, track_size);
+ size_t actual;
+ io.read_at((heads * track + head) * track_size, &track_data[0], track_size, actual);
// Find first sector header or index mark
for (int offset = 0; offset < track_size; offset += 2)
diff --git a/src/lib/formats/aim_dsk.h b/src/lib/formats/aim_dsk.h
index c4737efc7e6..560943be30c 100644
--- a/src/lib/formats/aim_dsk.h
+++ b/src/lib/formats/aim_dsk.h
@@ -7,9 +7,10 @@
AIM disk images
*********************************************************************/
+#ifndef MAME_FORMATS_AIM_DSK_H
+#define MAME_FORMATS_AIM_DSK_H
-#ifndef AIM_DSK_H
-#define AIM_DSK_H
+#pragma once
#include "flopimg.h"
@@ -20,8 +21,8 @@ class aim_format : public floppy_image_format_t
public:
aim_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -31,4 +32,4 @@ public:
extern const floppy_format_type FLOPPY_AIM_FORMAT;
-#endif /* AIM_DSK_H */
+#endif // MAME_FORMATS_AIM_DSK_H
diff --git a/src/lib/formats/ami_dsk.cpp b/src/lib/formats/ami_dsk.cpp
index 5973bc69dab..eb96b01377d 100644
--- a/src/lib/formats/ami_dsk.cpp
+++ b/src/lib/formats/ami_dsk.cpp
@@ -8,10 +8,11 @@
*********************************************************************/
-#include <cassert>
-
#include "formats/ami_dsk.h"
+#include "ioprocs.h"
+
+
adf_format::adf_format() : floppy_image_format_t()
{
}
@@ -36,59 +37,61 @@ bool adf_format::supports_save() const
return true;
}
-int adf_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int adf_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return 0;
+
if ((size == 901120) || (size == 912384) || (size == 1802240))
- {
return 50;
- }
+
return 0;
}
-bool adf_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool adf_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
desc_s sectors[22];
uint8_t sectdata[512*22];
bool is_hd = false;
int tracks = 80;
- for(int i=0; i<22; i++) {
+ for (int i=0; i<22; i++) {
sectors[i].data = sectdata + 512*i;
sectors[i].size = 512;
sectors[i].sector_id = i;
}
- uint64_t size = io_generic_size(io);
- if(size == 901120)
- {
+ uint64_t size;
+ if (io.length(size))
+ return false;
+
+ if (size == 901120) {
is_hd = false;
tracks = 80;
- }
- else if (size == 912384)
- {
+ } else if (size == 912384) {
is_hd = false;
tracks = 81;
- }
- else
- {
+ } else {
is_hd = true;
tracks = 80;
}
if (!is_hd) {
image->set_variant(floppy_image::DSDD);
- for(int track=0; track < tracks; track++) {
- for(int side=0; side < 2; side++) {
- io_generic_read(io, sectdata, (track*2 + side)*512*11, 512*11);
+ for (int track=0; track < tracks; track++) {
+ for (int side=0; side < 2; side++) {
+ size_t actual;
+ io.read_at((track*2 + side)*512*11, sectdata, 512*11, actual);
generate_track(amiga_11, track, side, sectors, 11, 100000, image);
}
}
} else {
image->set_variant(floppy_image::DSHD);
- for(int track=0; track < tracks; track++) {
- for(int side=0; side < 2; side++) {
- io_generic_read(io, sectdata, (track*2 + side)*512*22, 512*22);
+ for (int track=0; track < tracks; track++) {
+ for (int side=0; side < 2; side++) {
+ size_t actual;
+ io.read_at((track*2 + side)*512*22, sectdata, 512*22, actual);
generate_track(amiga_22, track, side, sectors, 22, 200000, image);
}
}
@@ -100,11 +103,11 @@ bool adf_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
uint32_t adf_format::g32(const std::vector<bool> &trackbuf, uint32_t pos)
{
uint32_t res = 0;
- for(int i=0; i != 32; i++) {
- if(trackbuf[pos])
+ for (int i=0; i != 32; i++) {
+ if (trackbuf[pos])
res |= 0x80000000 >> i;
- pos ++;
- if(pos == trackbuf.size())
+ pos++;
+ if (pos == trackbuf.size())
pos = 0;
}
return res;
@@ -113,34 +116,34 @@ uint32_t adf_format::g32(const std::vector<bool> &trackbuf, uint32_t pos)
uint32_t adf_format::checksum(const std::vector<bool> &trackbuf, uint32_t pos, int long_count)
{
uint32_t check = 0;
- for(int i=0; i<long_count; i++)
+ for (int i=0; i<long_count; i++)
check ^= g32(trackbuf, pos+32*i);
return check & 0x55555555;
}
-bool adf_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool adf_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
uint8_t sectdata[512*22];
- bool hd = image->get_variant() == floppy_image::DSHD;
+ bool const hd = image->get_variant() == floppy_image::DSHD;
- int data_track_size = hd ? 512*22 : 512*11;
+ int const data_track_size = hd ? 512*22 : 512*11;
- for(int track=0; track < 80; track++) {
- for(int side=0; side < 2; side++) {
+ for (int track=0; track < 80; track++) {
+ for (int side=0; side < 2; side++) {
auto trackbuf = generate_bitstream_from_track(track, side, hd ? 1000 : 2000, image);
- for(uint32_t i=0; i<trackbuf.size(); i++)
- if(g32(trackbuf, i) == 0x44894489 &&
+ for (uint32_t i=0; i<trackbuf.size(); i++)
+ if (g32(trackbuf, i) == 0x44894489 &&
(g32(trackbuf, i+384) & 0x55555555) == checksum(trackbuf, i+32, 10) &&
(g32(trackbuf, i+448) & 0x55555555) == checksum(trackbuf, i+480, 256)) {
uint32_t head = ((g32(trackbuf, i+32) & 0x55555555) << 1) | (g32(trackbuf, i+64) & 0x55555555);
int sect = (head >> 8) & 0xff;
- if(sect > (hd ? 22 : 11))
+ if (sect > (hd ? 22 : 11))
continue;
uint8_t *dest = sectdata + 512*sect;
- for(int j=0; j<128; j++) {
+ for (int j=0; j<128; j++) {
uint32_t val = ((g32(trackbuf, i+480+32*j) & 0x55555555) << 1) | (g32(trackbuf, i+4576+32*j) & 0x55555555);
*dest++ = val >> 24;
*dest++ = val >> 16;
@@ -148,7 +151,8 @@ bool adf_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
*dest++ = val;
}
- io_generic_write(io, sectdata, (track*2 + side)*data_track_size, data_track_size);
+ size_t actual;
+ io.write_at((track*2 + side) * data_track_size, sectdata, data_track_size, actual);
}
}
}
diff --git a/src/lib/formats/ami_dsk.h b/src/lib/formats/ami_dsk.h
index d25fd45a210..595beb1bcd3 100644
--- a/src/lib/formats/ami_dsk.h
+++ b/src/lib/formats/ami_dsk.h
@@ -19,9 +19,9 @@ class adf_format : public floppy_image_format_t
public:
adf_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/ap2_dsk.cpp b/src/lib/formats/ap2_dsk.cpp
index 50b071d6432..8adc13d69d3 100644
--- a/src/lib/formats/ap2_dsk.cpp
+++ b/src/lib/formats/ap2_dsk.cpp
@@ -8,13 +8,15 @@
*********************************************************************/
-#include <cstdlib>
-#include <cstring>
-#include <cassert>
-
#include "ap2_dsk.h"
#include "basicdsk.h"
+#include "ioprocs.h"
+
+#include <cassert>
+#include <cstdlib>
+#include <cstring>
+
#define APPLE2_IMAGE_DO 0
#define APPLE2_IMAGE_PO 1
@@ -559,9 +561,12 @@ bool a2_16sect_format::supports_save() const
return true;
}
-int a2_16sect_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int a2_16sect_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return 0;
+
//uint32_t expected_size = 35 * 16 * 256;
uint32_t expected_size = APPLE2_TRACK_COUNT * 16 * 256;
@@ -574,9 +579,11 @@ int a2_16sect_format::identify(io_generic *io, uint32_t form_factor, const std::
return 0;
}
-bool a2_16sect_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool a2_16sect_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return false;
image->set_form_variant(floppy_image::FF_525, floppy_image::SSSD);
@@ -595,7 +602,8 @@ bool a2_16sect_format::load(io_generic *io, uint32_t form_factor, const std::vec
static const unsigned char cpm22_block1[8] = { 0xa2, 0x55, 0xa9, 0x00, 0x9d, 0x00, 0x0d, 0xca };
static const unsigned char subnod_block1[8] = { 0x63, 0xaa, 0xf0, 0x76, 0x8d, 0x63, 0xaa, 0x8e };
- io_generic_read(io, sector_data, fpos, 256*16);
+ size_t actual;
+ io.read_at(fpos, sector_data, 256*16, actual);
if (track == 0 && fpos == 0)
{
@@ -740,7 +748,7 @@ void a2_16sect_format::update_chk(const uint8_t *data, int size, uint32_t &chk)
//#define VERBOSE_SAVE
-bool a2_16sect_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool a2_16sect_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int g_tracks, g_heads;
int visualgrid[16][APPLE2_TRACK_COUNT]; // visualizer grid, cleared/initialized below
@@ -938,8 +946,9 @@ bool a2_16sect_format::save(io_generic *io, const std::vector<uint32_t> &variant
}
for(int i=0; i<nsect; i++) {
//if(nsect>0) printf("t%d,", track);
- uint8_t *data = sectdata + (256)*i;
- io_generic_write(io, data, pos_data, 256);
+ uint8_t const *const data = sectdata + (256)*i;
+ size_t actual;
+ io.write_at(pos_data, data, 256, actual);
pos_data += 256;
}
//printf("\n");
@@ -952,11 +961,11 @@ bool a2_16sect_format::save(io_generic *io, const std::vector<uint32_t> &variant
for (int i = 0; i < 16; i++) {
if (visualgrid[i][j] == NOTFOUND) printf("-NF- ");
else {
- if (visualgrid[i][j] & ADDRFOUND) printf("a"); else printf(" ");
- if (visualgrid[i][j] & ADDRGOOD) printf("A"); else printf(" ");
- if (visualgrid[i][j] & DATAFOUND) printf("d"); else printf(" ");
- if (visualgrid[i][j] & DATAGOOD) { printf("D"); total_good++; } else printf(" ");
- if (visualgrid[i][j] & DATAPOST) printf("."); else printf(" ");
+ if (visualgrid[i][j] & ADDRFOUND) printf("a"); else printf(" ");
+ if (visualgrid[i][j] & ADDRGOOD) printf("A"); else printf(" ");
+ if (visualgrid[i][j] & DATAFOUND) printf("d"); else printf(" ");
+ if (visualgrid[i][j] & DATAGOOD) { printf("D"); total_good++; } else printf(" ");
+ if (visualgrid[i][j] & DATAPOST) printf("."); else printf(" ");
}
}
printf("\n");
@@ -1019,14 +1028,16 @@ bool a2_rwts18_format::supports_save() const
return true;
}
-int a2_rwts18_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int a2_rwts18_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
- uint32_t expected_size = APPLE2_TRACK_COUNT * 16 * 256;
+ uint64_t size;
+ if(io.length(size))
+ return 0;
+ uint32_t const expected_size = APPLE2_TRACK_COUNT * 16 * 256;
return size == expected_size;
}
-bool a2_rwts18_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool a2_rwts18_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
/* TODO: rewrite me properly
uint8_t sector_data[(256)*16];
@@ -1046,7 +1057,8 @@ bool a2_rwts18_format::load(io_generic *io, uint32_t form_factor, const std::vec
sectors[si].size = 256;
sectors[si].sector_id = si;
sectors[si].sector_info = format;
- io_generic_read(io, data, pos_data, 256);
+ size_t actual;
+ io.read_at(pos_data, data, 256, actual);
pos_data += 256;
}
generate_track(mac_gcr, track, head, sectors, 16, 3104*16, image);
@@ -1075,7 +1087,7 @@ void a2_rwts18_format::update_chk(const uint8_t *data, int size, uint32_t &chk)
{
}
-bool a2_rwts18_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool a2_rwts18_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int g_tracks, g_heads;
int visualgrid[18][APPLE2_TRACK_COUNT]; // visualizer grid, cleared/initialized below
@@ -1266,8 +1278,9 @@ bool a2_rwts18_format::save(io_generic *io, const std::vector<uint32_t> &variant
}
for(int i=0; i<nsect; i++) {
//if(nsect>0) printf("t%d,", track);
- uint8_t *data = sectdata + (256)*i;
- io_generic_write(io, data, pos_data, 256);
+ uint8_t const *const data = sectdata + (256)*i;
+ size_t actual;
+ io.write_at(pos_data, data, 256, actual);
pos_data += 256;
}
@@ -1447,8 +1460,9 @@ bool a2_rwts18_format::save(io_generic *io, const std::vector<uint32_t> &variant
}
for(int i=0; i<nsect; i++) {
//if(nsect>0) printf("t%d,", track);
- uint8_t *data = sectdata + (256)*i;
- io_generic_write(io, data, pos_data, 256);
+ uint8_t const *const data = sectdata + (256)*i;
+ size_t actual;
+ io.write_at(pos_data, data, 256, actual);
pos_data += 256;
}
//printf("\n");
@@ -1500,9 +1514,12 @@ bool a2_edd_format::supports_save() const
return false;
}
-int a2_edd_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int a2_edd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- return ((io_generic_size(io) == 2244608) || (io_generic_size(io) == 2310144)) ? 50 : 0;
+ uint64_t size;
+ if (io.length(size))
+ return 0;
+ return ((size == 2244608) || (size == 2310144)) ? 50 : 0;
}
uint8_t a2_edd_format::pick(const uint8_t *data, int pos)
@@ -1510,23 +1527,20 @@ uint8_t a2_edd_format::pick(const uint8_t *data, int pos)
return ((data[pos>>3] << 8) | data[(pos>>3)+1]) >> (8-(pos & 7));
}
-bool a2_edd_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool a2_edd_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint8_t *img;
uint8_t nibble[16384], stream[16384];
int npos[16384];
- img = (uint8_t *) malloc(2244608);
-
+ std::unique_ptr<uint8_t []> img(new (std::nothrow) uint8_t[2244608]);
if (!img)
- {
return false;
- }
- io_generic_read(io, img, 0, 2244608);
+ size_t actual;
+ io.read_at(0, img.get(), 2244608, actual);
for(int i=0; i<137; i++) {
- const uint8_t *trk = img + 16384*i;
+ uint8_t const *const trk = &img[16384*i];
int pos = 0;
int wpos = 0;
while(pos < 16383*8) {
@@ -1590,7 +1604,7 @@ bool a2_edd_format::load(io_generic *io, uint32_t form_factor, const std::vector
generate_track_from_bitstream(i >> 2, 0, stream, len, image, i & 3);
image->set_write_splice_position(i >> 2, 0, uint32_t(uint64_t(200'000'000)*splice/len), i & 3);
}
- free(img);
+ img.reset();
image->set_form_variant(floppy_image::FF_525, floppy_image::SSSD);
@@ -1627,26 +1641,31 @@ bool a2_woz_format::supports_save() const
const uint8_t a2_woz_format::signature[8] = { 0x57, 0x4f, 0x5a, 0x31, 0xff, 0x0a, 0x0d, 0x0a };
const uint8_t a2_woz_format::signature2[8] = { 0x57, 0x4f, 0x5a, 0x32, 0xff, 0x0a, 0x0d, 0x0a };
-int a2_woz_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int a2_woz_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t header[8];
- io_generic_read(io, header, 0, 8);
+ size_t actual;
+ io.read_at(0, header, 8, actual);
if (!memcmp(header, signature, 8)) return 100;
if (!memcmp(header, signature2, 8)) return 100;
return 0;
}
-bool a2_woz_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool a2_woz_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- std::vector<uint8_t> img(io_generic_size(io));
- io_generic_read(io, &img[0], 0, img.size());
+ uint64_t image_size;
+ if(io.length(image_size))
+ return false;
+ std::vector<uint8_t> img(image_size);
+ size_t actual;
+ io.read_at(0, &img[0], img.size(), actual);
// Check signature
- if ((memcmp(&img[0], signature, 8)) && (memcmp(&img[0], signature2, 8)))
+ if((memcmp(&img[0], signature, 8)) && (memcmp(&img[0], signature2, 8)))
return false;
uint32_t woz_vers = 1;
- if (!memcmp(&img[0], signature2, 8)) woz_vers = 2;
+ if(!memcmp(&img[0], signature2, 8)) woz_vers = 2;
// Check integrity
uint32_t crc = crc32r(&img[12], img.size() - 12);
@@ -1663,7 +1682,7 @@ bool a2_woz_format::load(io_generic *io, uint32_t form_factor, const std::vector
uint32_t info_vers = r8(img, off_info + 0);
- if ((info_vers != 1) && (info_vers != 2))
+ if((info_vers != 1) && (info_vers != 2))
return false;
bool is_35 = r8(img, off_info + 1) == 2;
@@ -1721,7 +1740,7 @@ bool a2_woz_format::load(io_generic *io, uint32_t form_factor, const std::vector
return true;
}
-bool a2_woz_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool a2_woz_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
std::vector<std::vector<bool>> tracks(160);
bool twosided = false;
@@ -1823,7 +1842,8 @@ bool a2_woz_format::save(io_generic *io, const std::vector<uint32_t> &variants,
w32(data, 8, crc32r(&data[12], data.size() - 12));
- io_generic_write(io, data.data(), 0, data.size());
+ size_t actual;
+ io.write_at(0, data.data(), data.size(), actual);
return true;
}
@@ -1911,12 +1931,15 @@ bool a2_nib_format::supports_save() const
return false;
}
-int a2_nib_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int a2_nib_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- const auto size = io_generic_size(io);
- if (size == expected_size_35t || size == expected_size_40t) {
+ uint64_t size;
+ if (io.length(size))
+ return 0;
+
+ if (size == expected_size_35t || size == expected_size_40t)
return 50;
- }
+
return 0;
}
@@ -2031,18 +2054,20 @@ std::vector<uint32_t> a2_nib_format::generate_levels_from_nibbles(const std::vec
return levels;
}
-bool a2_nib_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool a2_nib_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- auto size = io_generic_size(io);
- if (size != expected_size_35t && size != expected_size_40t) {
+ uint64_t size;
+ if (io.length(size))
return false;
- }
+ if (size != expected_size_35t && size != expected_size_40t)
+ return false;
+
const auto nr_tracks = size == expected_size_35t? 35 : 40;
std::vector<uint8_t> nibbles(nibbles_per_track);
for (unsigned track = 0; track < nr_tracks; ++track) {
- io_generic_read(io, &nibbles[0],
- track * nibbles_per_track, nibbles_per_track);
+ size_t actual;
+ io.read_at(track * nibbles_per_track, &nibbles[0], nibbles_per_track, actual);
auto levels = generate_levels_from_nibbles(nibbles);
generate_track_from_levels(track, 0,
levels,
diff --git a/src/lib/formats/ap2_dsk.h b/src/lib/formats/ap2_dsk.h
index 7420d72d818..bab61cf96b8 100644
--- a/src/lib/formats/ap2_dsk.h
+++ b/src/lib/formats/ap2_dsk.h
@@ -41,9 +41,9 @@ class a2_16sect_format : public floppy_image_format_t
public:
a2_16sect_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -68,9 +68,9 @@ class a2_rwts18_format : public floppy_image_format_t
public:
a2_rwts18_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -92,8 +92,8 @@ class a2_edd_format : public floppy_image_format_t
public:
a2_edd_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override;
virtual const char *name() const override;
@@ -111,9 +111,9 @@ class a2_woz_format : public floppy_image_format_t
public:
a2_woz_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override;
virtual const char *name() const override;
@@ -141,8 +141,8 @@ class a2_nib_format : public floppy_image_format_t
public:
a2_nib_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override;
virtual const char *name() const override;
diff --git a/src/lib/formats/ap_dsk35.cpp b/src/lib/formats/ap_dsk35.cpp
index 9819406183c..6a3fa5d742b 100644
--- a/src/lib/formats/ap_dsk35.cpp
+++ b/src/lib/formats/ap_dsk35.cpp
@@ -100,6 +100,8 @@
#include "ap_dsk35.h"
+#include "ioprocs.h"
+
#include <cassert>
#include <cstdio>
@@ -1233,14 +1235,15 @@ bool dc42_format::supports_save() const
return true;
}
-int dc42_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int dc42_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint8_t h[0x54];
- uint64_t size = io_generic_size(io);
- if(size < 0x54)
+ uint64_t size;
+ if(io.length(size) || (size < 0x54))
return 0;
- io_generic_read(io, h, 0, 0x54);
+ uint8_t h[0x54];
+ size_t actual;
+ io.read_at(0, h, 0x54, actual);
uint32_t dsize = (h[0x40] << 24) | (h[0x41] << 16) | (h[0x42] << 8) | h[0x43];
uint32_t tsize = (h[0x44] << 24) | (h[0x45] << 16) | (h[0x46] << 8) | h[0x47];
@@ -1252,13 +1255,14 @@ int dc42_format::identify(io_generic *io, uint32_t form_factor, const std::vecto
return 0;
}
- return size == 0x54+tsize+dsize && h[0] < 64 && h[0x52] == 1 && h[0x53] == 0 ? 100 : 0;
+ return (size == 0x54+tsize+dsize && h[0] < 64 && h[0x52] == 1 && h[0x53] == 0) ? 100 : 0;
}
-bool dc42_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool dc42_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
uint8_t h[0x54];
- io_generic_read(io, h, 0, 0x54);
+ io.read_at(0, h, 0x54, actual);
int dsize = (h[0x40] << 24) | (h[0x41] << 16) | (h[0x42] << 8) | h[0x43];
int tsize = (h[0x44] << 24) | (h[0x45] << 16) | (h[0x46] << 8) | h[0x47];
@@ -1270,8 +1274,7 @@ bool dc42_format::load(io_generic *io, uint32_t form_factor, const std::vector<u
return false;
}
- switch (dsize)
- {
+ switch(dsize) {
case 409600: // Mac 400K
image->set_form_variant(floppy_image::FF_35, floppy_image::SSDD);
break;
@@ -1315,13 +1318,14 @@ bool dc42_format::load(io_generic *io, uint32_t form_factor, const std::vector<u
sectors[si].sector = i;
sectors[si].info = format;
if(tsize) {
- io_generic_read(io, data, pos_tag, 12);
+ io.read_at(pos_tag, data, 12, actual);
sectors[si].tag = data;
pos_tag += 12;
- } else
+ } else {
sectors[si].tag = nullptr;
+ }
sectors[si].data = data+12;
- io_generic_read(io, data+12, pos_data, 512);
+ io.read_at(pos_data, data+12, 512, actual);
pos_data += 512;
si = (si + 2) % ns;
if(si == 0)
@@ -1341,7 +1345,7 @@ void dc42_format::update_chk(const uint8_t *data, int size, uint32_t &chk)
}
}
-bool dc42_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool dc42_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int g_tracks, g_heads;
image->get_actual_geometry(g_tracks, g_heads);
@@ -1381,8 +1385,9 @@ bool dc42_format::save(io_generic *io, const std::vector<uint32_t> &variants, fl
for(unsigned int i=0; i < sectors.size(); i++) {
auto &sdata = sectors[i];
sdata.resize(512+12);
- io_generic_write(io, &sdata[0], pos_tag, 12);
- io_generic_write(io, &sdata[12], pos_data, 512);
+ size_t actual;
+ io.write_at(pos_tag, &sdata[0], 12, actual);
+ io.write_at(pos_data, &sdata[12], 512, actual);
pos_tag += 12;
pos_data += 512;
if(track || head || i)
@@ -1401,7 +1406,8 @@ bool dc42_format::save(io_generic *io, const std::vector<uint32_t> &variants, fl
h[0x4e] = tchk >> 8;
h[0x4f] = tchk;
- io_generic_write(io, h, 0, 0x54);
+ size_t actual;
+ io.write_at(0, h, 0x54, actual);
return true;
}
@@ -1432,26 +1438,32 @@ bool apple_gcr_format::supports_save() const
return true;
}
-int apple_gcr_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int apple_gcr_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return 0;
+
if(size == 409600 || (size == 819200 && (variants.empty() || has_variant(variants, floppy_image::DSDD))))
return 50;
return 0;
}
-bool apple_gcr_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool apple_gcr_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
desc_gcr_sector sectors[12];
uint8_t sdata[512*12];
int pos_data = 0;
uint8_t header[64];
- io_generic_read(io, header, 0, 64);
+ io.read_at(0, header, 64, actual);
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return false;
int head_count = size == 409600 ? 1 : size == 819200 ? 2 : 0;
image->set_form_variant(floppy_image::FF_35, head_count == 2 ? floppy_image::DSDD : floppy_image::SSDD);
@@ -1461,7 +1473,7 @@ bool apple_gcr_format::load(io_generic *io, uint32_t form_factor, const std::vec
for(int track=0; track < 80; track++) {
for(int head=0; head < head_count; head++) {
int ns = 12 - (track/16);
- io_generic_read(io, sdata, pos_data, 512*ns);
+ io.read_at(pos_data, sdata, 512*ns, actual);
pos_data += 512*ns;
int si = 0;
@@ -1482,7 +1494,7 @@ bool apple_gcr_format::load(io_generic *io, uint32_t form_factor, const std::vec
return true;
}
-bool apple_gcr_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool apple_gcr_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int g_tracks, g_heads;
image->get_actual_geometry(g_tracks, g_heads);
@@ -1498,7 +1510,8 @@ bool apple_gcr_format::save(io_generic *io, const std::vector<uint32_t> &variant
for(unsigned int i=0; i < sectors.size(); i++) {
auto &sdata = sectors[i];
sdata.resize(512+12);
- io_generic_write(io, &sdata[12], pos_data, 512);
+ size_t actual;
+ io.write_at(pos_data, &sdata[12], 512, actual);
pos_data += 512;
}
}
@@ -1534,10 +1547,11 @@ bool apple_2mg_format::supports_save() const
return true;
}
-int apple_2mg_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int apple_2mg_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t signature[4];
- io_generic_read(io, signature, 0, 4);
+ size_t actual;
+ io.read_at(0, signature, 4, actual);
if (!strncmp(reinterpret_cast<char *>(signature), "2IMG", 4))
{
return 100;
@@ -1552,11 +1566,12 @@ int apple_2mg_format::identify(io_generic *io, uint32_t form_factor, const std::
return 0;
}
-bool apple_2mg_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool apple_2mg_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
desc_gcr_sector sectors[12];
uint8_t sdata[512*12], header[64];
- io_generic_read(io, header, 0, 64);
+ io.read_at(0, header, 64, actual);
uint32_t blocks = header[0x14] | (header[0x15] << 8) | (header[0x16] << 16) | (header[0x17] << 24);
uint32_t pos_data = header[0x18] | (header[0x19] << 8) | (header[0x1a] << 16) | (header[0x1b] << 24);
@@ -1568,7 +1583,7 @@ bool apple_2mg_format::load(io_generic *io, uint32_t form_factor, const std::vec
for(int track=0; track < 80; track++) {
for(int head=0; head < 2; head++) {
int ns = 12 - (track/16);
- io_generic_read(io, sdata, pos_data, 512*ns);
+ io.read_at(pos_data, sdata, 512*ns, actual);
pos_data += 512*ns;
int si = 0;
@@ -1589,8 +1604,10 @@ bool apple_2mg_format::load(io_generic *io, uint32_t form_factor, const std::vec
return true;
}
-bool apple_2mg_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool apple_2mg_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
+
uint8_t header[0x40];
int pos_data = 0x40;
@@ -1611,7 +1628,7 @@ bool apple_2mg_format::save(io_generic *io, const std::vector<uint32_t> &variant
header[0x18] = 0x40;
// bytes of disk data
header[0x1c] = 0x00; header[0x1d] = 0x80; header[0x1e] = 0x0c; // 0xC8000 (819200)
- io_generic_write(io, header, 0, 0x40);
+ io.write_at(0, header, 0x40, actual);
for(int track=0; track < 80; track++) {
for(int head=0; head < 2; head++) {
@@ -1619,7 +1636,7 @@ bool apple_2mg_format::save(io_generic *io, const std::vector<uint32_t> &variant
for(unsigned int i=0; i < sectors.size(); i++) {
auto &sdata = sectors[i];
sdata.resize(512+12);
- io_generic_write(io, &sdata[12], pos_data, 512);
+ io.write_at(pos_data, &sdata[12], 512, actual);
pos_data += 512;
}
}
diff --git a/src/lib/formats/ap_dsk35.h b/src/lib/formats/ap_dsk35.h
index def1cb86856..f4a8ec7bff8 100644
--- a/src/lib/formats/ap_dsk35.h
+++ b/src/lib/formats/ap_dsk35.h
@@ -29,9 +29,9 @@ class dc42_format : public floppy_image_format_t
public:
dc42_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -49,9 +49,9 @@ class apple_gcr_format : public floppy_image_format_t
public:
apple_gcr_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -66,9 +66,9 @@ class apple_2mg_format : public floppy_image_format_t
public:
apple_2mg_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/apd_dsk.cpp b/src/lib/formats/apd_dsk.cpp
index 45d385a0800..f882d90fe23 100644
--- a/src/lib/formats/apd_dsk.cpp
+++ b/src/lib/formats/apd_dsk.cpp
@@ -60,9 +60,13 @@
*********************************************************************/
-#include <zlib.h>
#include "formats/apd_dsk.h"
+#include "ioprocs.h"
+
+#include <zlib.h>
+
+
static const uint8_t APD_HEADER[8] = { 'A', 'P', 'D', 'X', '0', '0', '0', '1' };
static const uint8_t GZ_HEADER[2] = { 0x1f, 0x8b };
@@ -85,11 +89,15 @@ const char *apd_format::extensions() const
return "apd";
}
-int apd_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int apd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return 0;
+
std::vector<uint8_t> img(size);
- io_generic_read(io, &img[0], 0, size);
+ size_t actual;
+ io.read_at(0, &img[0], size, actual);
int err;
std::vector<uint8_t> gz_ptr(8);
@@ -123,11 +131,15 @@ int apd_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool apd_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool apd_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return false;
+
std::vector<uint8_t> img(size);
- io_generic_read(io, &img[0], 0, size);
+ size_t actual;
+ io.read_at(0, &img[0], size, actual);
int err;
std::vector<uint8_t> gz_ptr;
diff --git a/src/lib/formats/apd_dsk.h b/src/lib/formats/apd_dsk.h
index bc551973c4a..8c3ac6f0d42 100644
--- a/src/lib/formats/apd_dsk.h
+++ b/src/lib/formats/apd_dsk.h
@@ -23,8 +23,8 @@ public:
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override;
};
diff --git a/src/lib/formats/apollo_dsk.cpp b/src/lib/formats/apollo_dsk.cpp
index 75c31cfe7f8..a1159ac68c8 100644
--- a/src/lib/formats/apollo_dsk.cpp
+++ b/src/lib/formats/apollo_dsk.cpp
@@ -8,10 +8,11 @@
*********************************************************************/
-#include <cassert>
-
#include "formats/apollo_dsk.h"
+#include "ioprocs.h"
+
+
apollo_format::apollo_format() : upd765_format(formats)
{
}
@@ -46,10 +47,13 @@ const apollo_format::format apollo_format::formats[] = {
const floppy_format_type FLOPPY_APOLLO_FORMAT = &floppy_image_format_creator<apollo_format>;
-int apollo_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int apollo_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
- uint32_t expected_size = 77*2*8*1024;
+ uint64_t size;
+ if (io.length(size))
+ return 0;
+
+ constexpr uint32_t expected_size = 77*2*8*1024;
return ((size == expected_size) || (size == 0)) ? 1 : 0;
}
diff --git a/src/lib/formats/apollo_dsk.h b/src/lib/formats/apollo_dsk.h
index 6376c77b067..1c2c6d81030 100644
--- a/src/lib/formats/apollo_dsk.h
+++ b/src/lib/formats/apollo_dsk.h
@@ -19,7 +19,7 @@ class apollo_format : public upd765_format
public:
apollo_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual const char *name() const override;
virtual const char *description() const override;
virtual const char *extensions() const override;
diff --git a/src/lib/formats/apridisk.cpp b/src/lib/formats/apridisk.cpp
index 388d358f6f8..1560c199149 100644
--- a/src/lib/formats/apridisk.cpp
+++ b/src/lib/formats/apridisk.cpp
@@ -12,6 +12,8 @@
#include "imageutl.h"
+#include "ioprocs.h"
+
apridisk_format::apridisk_format()
{
@@ -32,10 +34,11 @@ const char *apridisk_format::extensions() const
return "dsk";
}
-int apridisk_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int apridisk_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t header[APR_HEADER_SIZE];
- io_generic_read(io, header, 0, APR_HEADER_SIZE);
+ size_t actual;
+ io.read_at(0, header, APR_HEADER_SIZE, actual);
const char magic[] = "ACT Apricot disk image\x1a\x04";
@@ -45,21 +48,26 @@ int apridisk_format::identify(io_generic *io, uint32_t form_factor, const std::v
return 0;
}
-bool apridisk_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool apridisk_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
desc_pc_sector sectors[80][2][18];
std::unique_ptr<uint8_t []> sector_data(new uint8_t [MAX_SECTORS * SECTOR_SIZE]);
uint8_t *data_ptr = sector_data.get();
int track_count = 0, head_count = 0, sector_count = 0;
- uint64_t file_size = io_generic_size(io);
+ uint64_t file_size;
+ if (io.length(file_size))
+ return false;
+
uint64_t file_offset = APR_HEADER_SIZE;
while (file_offset < file_size)
{
+ size_t actual;
+
// read sector header
uint8_t sector_header[16];
- io_generic_read(io, sector_header, file_offset, 16);
+ io.read_at(file_offset, sector_header, 16, actual);
uint32_t type = pick_integer_le(&sector_header, 0, 4);
uint16_t compression = pick_integer_le(&sector_header, 4, 2);
@@ -94,7 +102,7 @@ bool apridisk_format::load(io_generic *io, uint32_t form_factor, const std::vect
case APR_COMPRESSED:
{
uint8_t comp[3];
- io_generic_read(io, comp, file_offset, 3);
+ io.read_at(file_offset, comp, 3, actual);
uint16_t length = pick_integer_le(comp, 0, 2);
if (length != SECTOR_SIZE)
@@ -108,7 +116,7 @@ bool apridisk_format::load(io_generic *io, uint32_t form_factor, const std::vect
break;
case APR_UNCOMPRESSED:
- io_generic_read(io, data_ptr, file_offset, SECTOR_SIZE);
+ io.read_at(file_offset, data_ptr, SECTOR_SIZE, actual);
break;
default:
@@ -140,7 +148,7 @@ bool apridisk_format::load(io_generic *io, uint32_t form_factor, const std::vect
return true;
}
-bool apridisk_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool apridisk_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
return false;
}
diff --git a/src/lib/formats/apridisk.h b/src/lib/formats/apridisk.h
index 3e751f8d6ec..5cc8a1403fb 100644
--- a/src/lib/formats/apridisk.h
+++ b/src/lib/formats/apridisk.h
@@ -23,9 +23,9 @@ public:
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override;
private:
diff --git a/src/lib/formats/cassimg.cpp b/src/lib/formats/cassimg.cpp
index cf5812c67c1..2fab4a1ec8b 100644
--- a/src/lib/formats/cassimg.cpp
+++ b/src/lib/formats/cassimg.cpp
@@ -199,12 +199,15 @@ cassette_image::error cassette_image::lookup_sample(int channel, size_t sample,
-cassette_image::cassette_image(const Format *format, void *file, const io_procs *procs, int flags)
+cassette_image::cassette_image(const Format *format, util::random_read_write::ptr &&io, int flags) :
+ m_format(format),
+ m_io(std::move(io)),
+ m_channels(0),
+ m_flags(flags),
+ m_sample_frequency(0),
+ m_blocks(),
+ m_sample_count(0)
{
- m_format = format;
- m_io.file = file;
- m_io.procs = procs;
- m_flags = flags;
}
@@ -217,17 +220,24 @@ cassette_image::~cassette_image()
-cassette_image::error cassette_image::open(void *file, const io_procs *procs,
- const Format *format, int flags, ptr &outcassette)
+cassette_image::error cassette_image::open(
+ util::random_read_write::ptr &&io,
+ const Format *format,
+ int flags,
+ ptr &outcassette)
{
const Format *const formats[2] = { format, nullptr };
- return open_choices(file, procs, {}, formats, flags, outcassette);
+ return open_choices(std::move(io), { }, formats, flags, outcassette);
}
-cassette_image::error cassette_image::open_choices(void *file, const io_procs *procs, const std::string &extension,
- const Format *const *formats, int flags, ptr &outcassette)
+cassette_image::error cassette_image::open_choices(
+ util::random_read_write::ptr &&io,
+ const std::string &extension,
+ const Format *const *formats,
+ int flags,
+ ptr &outcassette)
{
// if not specified, use the dummy arguments
if (!formats)
@@ -235,7 +245,7 @@ cassette_image::error cassette_image::open_choices(void *file, const io_procs *p
// create the cassette object
ptr cassette;
- try { cassette.reset(new cassette_image(nullptr, file, procs, flags)); }
+ try { cassette.reset(new cassette_image(nullptr, std::move(io), flags)); }
catch (std::bad_alloc const &) { return error::OUT_OF_MEMORY; }
// identify the image
@@ -275,8 +285,12 @@ cassette_image::error cassette_image::open_choices(void *file, const io_procs *p
-cassette_image::error cassette_image::create(void *file, const io_procs *procs, const Format *format,
- const Options *opts, int flags, ptr &outcassette)
+cassette_image::error cassette_image::create(
+ util::random_read_write::ptr &&io,
+ const Format *format,
+ const Options *opts,
+ int flags,
+ ptr &outcassette)
{
static const Options default_options = { 1, 16, 44100 };
@@ -294,7 +308,7 @@ cassette_image::error cassette_image::create(void *file, const io_procs *procs,
// create the cassette object
ptr cassette;
- try { cassette.reset(new cassette_image(format, file, procs, flags)); }
+ try { cassette.reset(new cassette_image(format, std::move(io), flags)); }
catch (std::bad_alloc const &) { return error::OUT_OF_MEMORY; }
// read the options
@@ -334,13 +348,13 @@ cassette_image::Info cassette_image::get_info() const
-void cassette_image::change(void *file, const io_procs *procs, const Format *format, int flags)
+void cassette_image::change(util::random_read_write::ptr &&io, const Format *format, int flags)
{
- if ((flags & FLAG_READONLY) == 0)
+ if (!(flags & FLAG_READONLY))
flags |= CASSETTE_FLAG_DIRTY;
- m_io.file = file;
- m_io.procs = procs;
+
m_format = format;
+ m_io = std::move(io);
m_flags = flags;
}
@@ -352,7 +366,8 @@ void cassette_image::change(void *file, const io_procs *procs, const Format *for
void cassette_image::image_read(void *buffer, uint64_t offset, size_t length)
{
- io_generic_read(&m_io, buffer, offset, length);
+ size_t actual;
+ m_io->read_at(offset, buffer, length, actual);
}
@@ -360,7 +375,7 @@ void cassette_image::image_read(void *buffer, uint64_t offset, size_t length)
uint8_t cassette_image::image_read_byte(uint64_t offset)
{
uint8_t data;
- io_generic_read(&m_io, &data, offset, 1);
+ image_read(&data, offset, 1);
return data;
}
@@ -368,14 +383,17 @@ uint8_t cassette_image::image_read_byte(uint64_t offset)
void cassette_image::image_write(const void *buffer, uint64_t offset, size_t length)
{
- io_generic_write(&m_io, buffer, offset, length);
+ size_t actual;
+ m_io->write_at(offset, buffer, length, actual);
}
uint64_t cassette_image::image_size()
{
- return io_generic_size(&m_io);
+ uint64_t size = 0;
+ m_io->length(size);
+ return size;
}
@@ -900,20 +918,19 @@ done:
void cassette_image::dump(const char *filename)
{
- FILE *f = fopen(filename, "wb");
- if (!f)
+ util::random_read_write::ptr saved_io = util::stdio_read_write(fopen(filename, "wb"), 0);
+ if (!saved_io)
return;
- io_generic saved_io = m_io;
- const Format *saved_format = m_format;
+ Format const *const saved_format = m_format;
- m_io.file = f;
- m_io.procs = &stdio_ioprocs_noclose;
+ using std::swap;
+
+ swap(m_io, saved_io);
m_format = &wavfile_format;
+
perform_save();
- m_io = saved_io;
+ swap(m_io, saved_io);
m_format = saved_format;
-
- fclose(f);
}
diff --git a/src/lib/formats/cassimg.h b/src/lib/formats/cassimg.h
index 3a59870571a..765b860b659 100644
--- a/src/lib/formats/cassimg.h
+++ b/src/lib/formats/cassimg.h
@@ -185,14 +185,14 @@ public:
void dump(const char *filename);
error save();
- void change(void *file, const io_procs *procs, const Format *format, int flags);
+ void change(util::random_read_write::ptr &&io, const Format *format, int flags);
Info get_info() const;
- static error open(void *file, const io_procs *procs,
+ static error open(util::random_read_write::ptr &&io,
const Format *format, int flags, ptr &outcassette);
- static error open_choices(void *file, const io_procs *procs, const std::string &extension,
+ static error open_choices(util::random_read_write::ptr &&io, const std::string &extension,
const Format *const *formats, int flags, ptr &outcassette);
- static error create(void *file, const io_procs *procs, const cassette_image::Format *format,
+ static error create(util::random_read_write::ptr &&io, const cassette_image::Format *format,
const cassette_image::Options *opts, int flags, ptr &outcassette);
// builtin formats
@@ -201,7 +201,7 @@ public:
private:
struct manipulation_ranges;
- cassette_image(const Format *format, void *file, const io_procs *procs, int flags);
+ cassette_image(const Format *format, util::random_read_write::ptr &&io, int flags);
cassette_image(const cassette_image &) = delete;
cassette_image(cassette_image &&) = delete;
cassette_image &operator=(const cassette_image &) = delete;
@@ -212,15 +212,15 @@ private:
error compute_manipulation_ranges(int channel, double time_index, double sample_period, manipulation_ranges &ranges) const;
error lookup_sample(int channel, size_t sample, int32_t *&ptr);
- const Format *m_format = nullptr;
- io_generic m_io;
+ const Format *m_format;
+ util::random_read_write::ptr m_io;
- int m_channels = 0;
- int m_flags = 0;
- uint32_t m_sample_frequency = 0;
+ int m_channels;
+ int m_flags;
+ uint32_t m_sample_frequency;
std::vector<std::unique_ptr<int32_t []> > m_blocks;
- size_t m_sample_count = 0;
+ size_t m_sample_count;
};
/* macros for specifying format lists */
diff --git a/src/lib/formats/ccvf_dsk.cpp b/src/lib/formats/ccvf_dsk.cpp
index bba52d3922a..6ed0c14038a 100644
--- a/src/lib/formats/ccvf_dsk.cpp
+++ b/src/lib/formats/ccvf_dsk.cpp
@@ -11,6 +11,7 @@
#include "formats/ccvf_dsk.h"
#include "coretmpl.h" // BIT
+#include "ioprocs.h"
ccvf_format::ccvf_format()
@@ -46,12 +47,12 @@ const ccvf_format::format ccvf_format::file_formats[] = {
{}
};
-int ccvf_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int ccvf_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
char h[36];
-
- io_generic_read(io, h, 0, 36);
- if(!memcmp(h, "Compucolor Virtual Floppy Disk Image", 36))
+ size_t actual;
+ io.read_at(0, h, 36, actual);
+ if (!memcmp(h, "Compucolor Virtual Floppy Disk Image", 36))
return 100;
return 0;
@@ -87,13 +88,17 @@ floppy_image_format_t::desc_e* ccvf_format::get_desc_8n1(const format &f, int &c
return desc;
}
-bool ccvf_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool ccvf_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
const format &f = formats[0];
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return false;
+
std::vector<uint8_t> img(size);
- io_generic_read(io, &img[0], 0, size);
+ size_t actual;
+ io.read_at(0, &img[0], size, actual);
std::string ccvf = std::string((const char *)&img[0], size);
std::vector<uint8_t> bytes(78720);
diff --git a/src/lib/formats/ccvf_dsk.h b/src/lib/formats/ccvf_dsk.h
index 5895a882550..92f04e03ddd 100644
--- a/src/lib/formats/ccvf_dsk.h
+++ b/src/lib/formats/ccvf_dsk.h
@@ -39,8 +39,8 @@ public:
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override;
protected:
diff --git a/src/lib/formats/concept_dsk.cpp b/src/lib/formats/concept_dsk.cpp
index 67c8562e1c3..7f5edce3363 100644
--- a/src/lib/formats/concept_dsk.cpp
+++ b/src/lib/formats/concept_dsk.cpp
@@ -10,11 +10,11 @@
*********************************************************************/
-#include <cassert>
-
-#include "flopimg.h"
#include "formats/concept_dsk.h"
+#include "ioprocs.h"
+
+
/* 9 sectors / track, 512 bytes per sector */
const floppy_image_format_t::desc_e cc525dsdd_format::cc_9_desc[] = {
{ MFM, 0x4e, 80 },
@@ -72,50 +72,50 @@ bool cc525dsdd_format::supports_save() const
return true;
}
-void cc525dsdd_format::find_size(io_generic *io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count)
+void cc525dsdd_format::find_size(util::random_read &io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count)
{
- uint64_t size = io_generic_size(io);
-
track_count = 77;
head_count = 2;
sector_count = 9;
- uint32_t expected_size = 512 * track_count*head_count*sector_count;
- if (size == expected_size)
- {
+ uint32_t const expected_size = 512 * track_count*head_count*sector_count;
+
+ uint64_t size;
+ if (!io.length(size) && (size == expected_size))
return;
- }
track_count = head_count = sector_count = 0;
}
-int cc525dsdd_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int cc525dsdd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t track_count, head_count, sector_count;
find_size(io, track_count, head_count, sector_count);
- if(track_count)
+ if (track_count)
return 50;
+
return 0;
}
-bool cc525dsdd_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool cc525dsdd_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
uint8_t track_count, head_count, sector_count;
find_size(io, track_count, head_count, sector_count);
uint8_t sectdata[10*512];
desc_s sectors[10];
- for(int i=0; i<sector_count; i++) {
+ for (int i=0; i<sector_count; i++) {
sectors[i+1].data = sectdata + 512*i;
sectors[i+1].size = 512;
sectors[i+1].sector_id = i+1;
}
int track_size = sector_count*512;
- for(int track=0; track < track_count; track++) {
- for(int head=0; head < head_count; head++) {
- io_generic_read(io, sectdata, (track*head_count + head)*track_size, track_size);
+ for (int track=0; track < track_count; track++) {
+ for (int head=0; head < head_count; head++) {
+ size_t actual;
+ io.read_at((track*head_count + head) * track_size, sectdata, track_size, actual);
generate_track(cc_9_desc, track, head, sectors, sector_count, 100000, image);
}
}
@@ -125,28 +125,29 @@ bool cc525dsdd_format::load(io_generic *io, uint32_t form_factor, const std::vec
return true;
}
-bool cc525dsdd_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool cc525dsdd_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int track_count, head_count, sector_count;
get_geometry_mfm_pc(image, 2000, track_count, head_count, sector_count);
- if(track_count != 77)
+ if (track_count != 77)
track_count = 77;
// Happens for a fully unformatted floppy
- if(!head_count)
+ if (!head_count)
head_count = 2;
- if(sector_count != 9)
+ if (sector_count != 9)
sector_count = 9;
uint8_t sectdata[9*512];
int track_size = sector_count*512;
- for(int track=0; track < track_count; track++) {
- for(int head=0; head < head_count; head++) {
+ for (int track=0; track < track_count; track++) {
+ for (int head=0; head < head_count; head++) {
get_track_data_mfm_pc(track, head, image, 2000, 512, sector_count, sectdata);
- io_generic_write(io, sectdata, (track*head_count + head)*track_size, track_size);
+ size_t actual;
+ io.write_at((track*head_count + head)*track_size, sectdata, track_size, actual);
}
}
diff --git a/src/lib/formats/concept_dsk.h b/src/lib/formats/concept_dsk.h
index 58d4e1c52b3..36e3f790a84 100644
--- a/src/lib/formats/concept_dsk.h
+++ b/src/lib/formats/concept_dsk.h
@@ -17,9 +17,9 @@ class cc525dsdd_format : public floppy_image_format_t
public:
cc525dsdd_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -29,7 +29,7 @@ public:
static const desc_e cc_9_desc[];
private:
- void find_size(io_generic *io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count);
+ void find_size(util::random_read &io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count);
};
extern const floppy_format_type FLOPPY_CONCEPT_525DSDD_FORMAT;
diff --git a/src/lib/formats/coupedsk.cpp b/src/lib/formats/coupedsk.cpp
index 16842583855..9400cd41bb6 100644
--- a/src/lib/formats/coupedsk.cpp
+++ b/src/lib/formats/coupedsk.cpp
@@ -8,10 +8,10 @@
**************************************************************************/
-#include <cassert>
+#include "coupedsk.h"
+
+#include "ioprocs.h"
-#include "formats/coupedsk.h"
-#include "flopimg.h"
const floppy_image_format_t::desc_e mgt_format::desc_10[] = {
{ MFM, 0x4e, 60 },
@@ -64,9 +64,11 @@ bool mgt_format::supports_save() const
return true;
}
-int mgt_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int mgt_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return 0;
if(/*size == 737280 || */ size == 819200)
return 50;
@@ -74,10 +76,12 @@ int mgt_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool mgt_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool mgt_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint64_t size = io_generic_size(io);
- int sector_count = size == 737280 ? 9 : 10;
+ uint64_t size;
+ if(io.length(size))
+ return false;
+ int const sector_count = (size == 737280) ? 9 : 10;
uint8_t sectdata[10*512];
desc_s sectors[10];
@@ -90,7 +94,8 @@ bool mgt_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
int track_size = sector_count*512;
for(int head=0; head < 2; head++) {
for(int track=0; track < 80; track++) {
- io_generic_read(io, sectdata, (track*2+head)*track_size, track_size);
+ size_t actual;
+ io.read_at((track*2+head)*track_size, sectdata, track_size, actual);
generate_track(desc_10, track, head, sectors, sector_count+1, 100000, image);
}
}
@@ -99,7 +104,7 @@ bool mgt_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
return true;
}
-bool mgt_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool mgt_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int track_count, head_count, sector_count;
get_geometry_mfm_pc(image, 2000, track_count, head_count, sector_count);
@@ -115,7 +120,8 @@ bool mgt_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
for(int head=0; head < 2; head++) {
for(int track=0; track < 80; track++) {
get_track_data_mfm_pc(track, head, image, 2000, 512, sector_count, sectdata);
- io_generic_write(io, sectdata, (track*2+head)*track_size, track_size);
+ size_t actual;
+ io.write_at((track*2+head)*track_size, sectdata, track_size, actual);
}
}
diff --git a/src/lib/formats/coupedsk.h b/src/lib/formats/coupedsk.h
index 3700d3e9974..e9ef4b118ca 100644
--- a/src/lib/formats/coupedsk.h
+++ b/src/lib/formats/coupedsk.h
@@ -19,9 +19,9 @@ class mgt_format : public floppy_image_format_t
public:
mgt_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/cqm_dsk.cpp b/src/lib/formats/cqm_dsk.cpp
index 5f79a4d3694..6639e50f801 100644
--- a/src/lib/formats/cqm_dsk.cpp
+++ b/src/lib/formats/cqm_dsk.cpp
@@ -8,9 +8,12 @@
*********************************************************************/
+#include "cqm_dsk.h"
+
+#include "ioprocs.h"
+
#include <cstring>
-#include <cassert>
-#include "flopimg.h"
+
#define CQM_HEADER_SIZE 133
@@ -231,17 +234,6 @@ FLOPPY_CONSTRUCT( cqm_dsk_construct )
-
-/*********************************************************************
-
- formats/cqm_dsk.c
-
- CopyQM disk images
-
-*********************************************************************/
-
-#include "cqm_dsk.h"
-
cqm_format::cqm_format()
{
}
@@ -261,10 +253,11 @@ const char *cqm_format::extensions() const
return "cqm,cqi,dsk";
}
-int cqm_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int cqm_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t h[3];
- io_generic_read(io, h, 0, 3);
+ size_t actual;
+ io.read_at(0, h, 3, actual);
if (h[0] == 'C' && h[1] == 'Q' && h[2] == 0x14)
return 100;
@@ -272,12 +265,13 @@ int cqm_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool cqm_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool cqm_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
const int max_size = 4*1024*1024; // 4MB ought to be large enough for any floppy
std::vector<uint8_t> imagebuf(max_size);
uint8_t header[CQM_HEADER_SIZE];
- io_generic_read(io, header, 0, CQM_HEADER_SIZE);
+ io.read_at(0, header, CQM_HEADER_SIZE, actual);
int sector_size = (header[0x04] << 8) | header[0x03];
int sector_per_track = (header[0x11] << 8) | header[0x10];
@@ -318,9 +312,11 @@ bool cqm_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
int rpm = form_factor == floppy_image::FF_8 || (form_factor == floppy_image::FF_525 && rate >= 300000) ? 360 : 300;
int base_cell_count = rate*60/rpm;
- int cqm_size = io_generic_size(io);
+ uint64_t cqm_size;
+ if (io.length(cqm_size))
+ return false;
std::vector<uint8_t> cqmbuf(cqm_size);
- io_generic_read(io, &cqmbuf[0], 0, cqm_size);
+ io.read_at(0, &cqmbuf[0], cqm_size, actual);
// decode the RLE data
for (int s = 0, pos = CQM_HEADER_SIZE + comment_size; pos < cqm_size; )
@@ -369,7 +365,7 @@ bool cqm_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
return true;
}
-bool cqm_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool cqm_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
return false;
}
diff --git a/src/lib/formats/cqm_dsk.h b/src/lib/formats/cqm_dsk.h
index 183c0b83e68..fc8376a2b85 100644
--- a/src/lib/formats/cqm_dsk.h
+++ b/src/lib/formats/cqm_dsk.h
@@ -19,9 +19,9 @@ class cqm_format : public floppy_image_format_t
public:
cqm_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/d64_dsk.cpp b/src/lib/formats/d64_dsk.cpp
index 4819ecc68d2..149130f0b3c 100644
--- a/src/lib/formats/d64_dsk.cpp
+++ b/src/lib/formats/d64_dsk.cpp
@@ -12,6 +12,8 @@
#include "formats/d64_dsk.h"
+#include "ioprocs.h"
+
d64_format::d64_format()
{
@@ -79,9 +81,12 @@ const int d64_format::speed_zone[] =
0, 0 // 41-42
};
-int d64_format::find_size(io_generic *io, uint32_t form_factor) const
+int d64_format::find_size(util::random_read &io, uint32_t form_factor) const
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return 0;
+
for(int i=0; formats[i].sector_count; i++) {
const format &f = formats[i];
if(size == (uint32_t) f.sector_count*f.sector_base_size*f.head_count)
@@ -89,12 +94,13 @@ int d64_format::find_size(io_generic *io, uint32_t form_factor) const
if(size == (uint32_t) (f.sector_count*f.sector_base_size*f.head_count) + f.sector_count)
return i;
}
+
return -1;
}
-int d64_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int d64_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- int type = find_size(io, form_factor);
+ const int type = find_size(io, form_factor);
if (type != -1)
return 50;
@@ -114,10 +120,11 @@ int d64_format::get_disk_id_offset(const format &f)
return 0x165a2;
}
-void d64_format::get_disk_id(const format &f, io_generic *io, uint8_t &id1, uint8_t &id2)
+void d64_format::get_disk_id(const format &f, util::random_read &io, uint8_t &id1, uint8_t &id2)
{
uint8_t id[2];
- io_generic_read(io, id, get_disk_id_offset(f), 2);
+ size_t actual;
+ io.read_at(get_disk_id_offset(f), id, 2, actual);
id1 = id[0];
id2 = id[1];
}
@@ -206,7 +213,7 @@ void d64_format::fix_end_gap(floppy_image_format_t::desc_e* desc, int remaining_
desc[22].p1 >>= remaining_size & 0x01;
}
-bool d64_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool d64_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
int type = find_size(io, form_factor);
if(type == -1)
@@ -214,7 +221,9 @@ bool d64_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
const format &f = formats[type];
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return false;
std::vector<uint8_t> img;
if(size == (uint32_t)f.sector_count*f.sector_base_size) {
@@ -225,7 +234,8 @@ bool d64_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
img.resize(size);
}
- io_generic_read(io, &img[0], 0, size);
+ size_t actual;
+ io.read_at(0, &img[0], size, actual);
int track_offset = 0, error_offset = f.sector_count*f.sector_base_size;
@@ -266,7 +276,7 @@ bool d64_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
return true;
}
-bool d64_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool d64_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
const format &f = formats[0];
@@ -280,7 +290,8 @@ bool d64_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
build_sector_description(f, sectdata, 0, 0, sectors, sector_count);
extract_sectors(image, f, sectors, track, head, sector_count);
- io_generic_write(io, sectdata, offset, track_size);
+ size_t actual;
+ io.write_at(offset, sectdata, track_size, actual);
}
}
diff --git a/src/lib/formats/d64_dsk.h b/src/lib/formats/d64_dsk.h
index 665f6489a81..13f1bd4e91c 100644
--- a/src/lib/formats/d64_dsk.h
+++ b/src/lib/formats/d64_dsk.h
@@ -37,9 +37,9 @@ public:
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override { return true; }
protected:
@@ -61,12 +61,12 @@ protected:
const format *formats;
- int find_size(io_generic *io, uint32_t form_factor) const;
+ int find_size(util::random_read &io, uint32_t form_factor) const;
virtual int get_physical_track(const format &f, int head, int track);
virtual uint32_t get_cell_size(const format &f, int track);
virtual int get_sectors_per_track(const format &f, int track);
virtual int get_disk_id_offset(const format &f);
- void get_disk_id(const format &f, io_generic *io, uint8_t &id1, uint8_t &id2);
+ void get_disk_id(const format &f, util::random_read &io, uint8_t &id1, uint8_t &id2);
virtual int get_image_offset(const format &f, int head, int track);
int compute_track_size(const format &f, int track);
virtual int get_gap2(const format &f, int head, int track) { return f.gap_2; }
diff --git a/src/lib/formats/d80_dsk.cpp b/src/lib/formats/d80_dsk.cpp
index d350411b159..338f00292a9 100644
--- a/src/lib/formats/d80_dsk.cpp
+++ b/src/lib/formats/d80_dsk.cpp
@@ -8,10 +8,11 @@
*********************************************************************/
-#include <cassert>
-
#include "formats/d80_dsk.h"
+#include "ioprocs.h"
+
+
d80_format::d80_format() : d64_format(file_formats), formats(nullptr)
{
}
diff --git a/src/lib/formats/d88_dsk.cpp b/src/lib/formats/d88_dsk.cpp
index 7c4eaa079dc..6e29f10df6a 100644
--- a/src/lib/formats/d88_dsk.cpp
+++ b/src/lib/formats/d88_dsk.cpp
@@ -29,11 +29,12 @@
*
*/
- #include <cassert>
-
#include "flopimg.h"
#include "imageutl.h"
+#include "ioprocs.h"
+
+
#define D88_HEADER_LEN 0x2b0
struct d88_tag
@@ -414,12 +415,15 @@ const char *d88_format::extensions() const
return "d77,d88,1dd";
}
-int d88_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int d88_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
- uint8_t h[32];
+ uint64_t size;
+ if(io.length(size))
+ return 0;
- io_generic_read(io, h, 0, 32);
+ uint8_t h[32];
+ size_t actual;
+ io.read_at(0, h, 32, actual);
if((little_endianize_int32(*(uint32_t *)(h+0x1c)) == size) &&
(h[0x1b] == 0x00 || h[0x1b] == 0x10 || h[0x1b] == 0x20 || h[0x1b] == 0x30 || h[0x1b] == 0x40))
return 100;
@@ -427,11 +431,12 @@ int d88_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool d88_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool d88_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint8_t h[32];
+ size_t actual;
- io_generic_read(io, h, 0, 32);
+ uint8_t h[32];
+ io.read_at(0, h, 32, actual);
int cell_count = 0;
int track_count = 0;
@@ -477,9 +482,11 @@ bool d88_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
return false;
uint32_t track_pos[164];
- io_generic_read(io, track_pos, 32, 164*4);
+ io.read_at(32, track_pos, 164*4, actual);
- uint64_t file_size = io_generic_size(io);
+ uint64_t file_size;
+ if(io.length(file_size))
+ return false;
for(int track=0; track < track_count; track++)
for(int head=0; head < head_count; head++) {
@@ -496,7 +503,7 @@ bool d88_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
return true;
uint8_t hs[16];
- io_generic_read(io, hs, pos, 16);
+ io.read_at(pos, hs, 16, actual);
pos += 16;
uint16_t size = little_endianize_int16(*(uint16_t *)(hs+14));
@@ -521,7 +528,7 @@ bool d88_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
if(size) {
sects[i].data = sect_data + sdatapos;
- io_generic_read(io, sects[i].data, pos, size);
+ io.read_at(pos, sects[i].data, size, actual);
pos += size;
sdatapos += size;
@@ -536,7 +543,7 @@ bool d88_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
}
-bool d88_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool d88_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
return false;
}
diff --git a/src/lib/formats/d88_dsk.h b/src/lib/formats/d88_dsk.h
index c7c85fc1949..aeed5ed16e8 100644
--- a/src/lib/formats/d88_dsk.h
+++ b/src/lib/formats/d88_dsk.h
@@ -20,9 +20,9 @@ class d88_format : public floppy_image_format_t
public:
d88_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/dcp_dsk.cpp b/src/lib/formats/dcp_dsk.cpp
index b3beb40404f..7d419628bdc 100644
--- a/src/lib/formats/dcp_dsk.cpp
+++ b/src/lib/formats/dcp_dsk.cpp
@@ -20,10 +20,11 @@
*********************************************************************/
-#include <cassert>
-
#include "dcp_dsk.h"
+#include "ioprocs.h"
+
+
dcp_format::dcp_format()
{
}
@@ -43,14 +44,18 @@ const char *dcp_format::extensions() const
return "dcp,dcu";
}
-int dcp_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int dcp_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return 0;
+
uint8_t h[0xa2];
int heads, tracks, spt, bps, count_tracks = 0;
bool is_hdb = false;
- io_generic_read(io, h, 0, 0xa2);
+ size_t actual;
+ io.read_at(0, h, 0xa2, actual);
// First byte is the disk format (see below in load() for details)
switch (h[0])
@@ -112,13 +117,14 @@ int dcp_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool dcp_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool dcp_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
uint8_t h[0xa2];
int heads, tracks, spt, bps;
bool is_hdb = false;
- io_generic_read(io, h, 0, 0xa2);
+ io.read_at(0, h, 0xa2, actual);
// First byte is the disk format:
switch (h[0])
@@ -215,7 +221,7 @@ bool dcp_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
for (int track = 0; track < tracks; track++)
for (int head = 0; head < heads; head++)
{
- io_generic_read(io, sect_data, 0xa2 + bps * spt * (track * heads + head), bps * spt);
+ io.read_at(0xa2 + bps * spt * (track * heads + head), sect_data, bps * spt, actual);
for (int i = 0; i < spt; i++)
{
@@ -235,7 +241,7 @@ bool dcp_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
else // FIXME: the code below is untested, because no image was found... there might be some silly mistake in the disk geometry!
{
// Read Head 0 Track 0 is FM with 26 sectors of 128bytes instead of 256
- io_generic_read(io, sect_data, 0xa2, 128 * spt);
+ io.read_at(0xa2, sect_data, 128 * spt, actual);
for (int i = 0; i < spt; i++)
{
@@ -252,7 +258,7 @@ bool dcp_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
build_pc_track_fm(0, 0, image, cell_count, spt, sects, calc_default_pc_gap3_size(form_factor, 128));
// Read Head 1 Track 0 is MFM with 26 sectors of 256bytes
- io_generic_read(io, sect_data, 0xa2 + 128 * spt, bps * spt);
+ io.read_at(0xa2 + 128 * spt, sect_data, bps * spt, actual);
for (int i = 0; i < spt; i++)
{
@@ -273,7 +279,7 @@ bool dcp_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
for (int track = 1; track < tracks; track++)
for (int head = 0; head < heads; head++)
{
- io_generic_read(io, sect_data, data_offs + bps * spt * ((track - 1) * heads + head), bps * spt);
+ io.read_at(data_offs + bps * spt * ((track - 1) * heads + head), sect_data, bps * spt, actual);
for (int i = 0; i < spt; i++)
{
diff --git a/src/lib/formats/dcp_dsk.h b/src/lib/formats/dcp_dsk.h
index c06396d527e..716814ffd48 100644
--- a/src/lib/formats/dcp_dsk.h
+++ b/src/lib/formats/dcp_dsk.h
@@ -20,8 +20,8 @@ class dcp_format : public floppy_image_format_t
public:
dcp_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/dfi_dsk.cpp b/src/lib/formats/dfi_dsk.cpp
index 409797e9583..607be56f741 100644
--- a/src/lib/formats/dfi_dsk.cpp
+++ b/src/lib/formats/dfi_dsk.cpp
@@ -13,7 +13,8 @@
#include "dfi_dsk.h"
-#include <zlib.h>
+#include "ioprocs.h"
+
#define NUMBER_OF_MULTIREADS 3
// thresholds for brickwall windowing
@@ -56,24 +57,28 @@ bool dfi_format::supports_save() const
return false;
}
-int dfi_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int dfi_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
char sign[4];
- io_generic_read(io, sign, 0, 4);
+ size_t actual;
+ io.read_at(0, sign, 4, actual);
return memcmp(sign, "DFE2", 4) ? 0 : 100;
}
-bool dfi_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool dfi_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
char sign[4];
- io_generic_read(io, sign, 0, 4);
- if (memcmp(sign, "DFER", 4) == 0)
- {
+ io.read_at(0, sign, 4, actual);
+ if(memcmp(sign, "DFER", 4) == 0) {
osd_printf_error("dfi_dsk: Old type Discferret image detected; the mess Discferret decoder will not handle this properly, bailing out!\n");
return false;
}
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return false;
+
uint64_t pos = 4;
std::vector<uint8_t> data;
int onerev_time = 0; // time for one revolution, used to guess clock and rpm for DFE2 files
@@ -81,7 +86,7 @@ bool dfi_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
int rpm=360; // drive rpm
while(pos < size) {
uint8_t h[10];
- io_generic_read(io, h, pos, 10);
+ io.read_at(pos, h, 10, actual);
uint16_t track = (h[0] << 8) | h[1];
uint16_t head = (h[2] << 8) | h[3];
// Ignore sector
@@ -97,7 +102,7 @@ bool dfi_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
data.resize(tsize);
pos += 10; // skip the header, we already read it
- io_generic_read(io, &data[0], pos, tsize);
+ io.read_at(pos, &data[0], tsize, actual);
pos += tsize; // for next time we read, increment to the beginning of next header
int index_time = 0; // what point the last index happened
diff --git a/src/lib/formats/dfi_dsk.h b/src/lib/formats/dfi_dsk.h
index d727f1d3c06..71b69c43d70 100644
--- a/src/lib/formats/dfi_dsk.h
+++ b/src/lib/formats/dfi_dsk.h
@@ -12,9 +12,9 @@ class dfi_format : public floppy_image_format_t
public:
dfi_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- // virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image);
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ // virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image);
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/dim_dsk.cpp b/src/lib/formats/dim_dsk.cpp
index 964f19ce028..04f6e3b8995 100644
--- a/src/lib/formats/dim_dsk.cpp
+++ b/src/lib/formats/dim_dsk.cpp
@@ -8,12 +8,14 @@
*********************************************************************/
-#include <cstring>
-#include <cassert>
-
#include "dim_dsk.h"
#include "basicdsk.h"
+#include "ioprocs.h"
+
+#include <cstring>
+
+
FLOPPY_IDENTIFY(dim_dsk_identify)
{
uint8_t dim_header[16];
@@ -132,11 +134,12 @@ const char *dim_format::extensions() const
return "dim";
}
-int dim_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int dim_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t h[16];
- io_generic_read(io, h, 0xab, 16);
+ size_t actual;
+ io.read_at(0xab, h, 16, actual);
if(strncmp((const char *)h, "DIFC HEADER", 11) == 0)
return 100;
@@ -144,14 +147,15 @@ int dim_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool dim_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool dim_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
int offset = 0x100;
uint8_t h;
uint8_t track_total = 77;
int cell_count = form_factor == floppy_image::FF_35 ? 200000 : 166666;
- io_generic_read(io, &h, 0, 1);
+ io.read_at(0, &h, 1, actual);
int spt, gap3, bps, size;
switch(h) {
@@ -211,7 +215,7 @@ bool dim_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
sects[i].deleted = false;
sects[i].bad_crc = false;
sects[i].data = &sect_data[sdatapos];
- io_generic_read(io, sects[i].data, offset, bps);
+ io.read_at(offset, sects[i].data, bps, actual);
offset += bps;
sdatapos += bps;
}
@@ -223,7 +227,7 @@ bool dim_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
}
-bool dim_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool dim_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
return false;
}
diff --git a/src/lib/formats/dim_dsk.h b/src/lib/formats/dim_dsk.h
index e0227e2e221..5c84f329cb6 100644
--- a/src/lib/formats/dim_dsk.h
+++ b/src/lib/formats/dim_dsk.h
@@ -25,9 +25,9 @@ class dim_format : public floppy_image_format_t
public:
dim_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/dip_dsk.cpp b/src/lib/formats/dip_dsk.cpp
index a33d6fe35d6..17a7f856efe 100644
--- a/src/lib/formats/dip_dsk.cpp
+++ b/src/lib/formats/dip_dsk.cpp
@@ -14,10 +14,11 @@
*********************************************************************/
-#include <cassert>
-
#include "dip_dsk.h"
+#include "ioprocs.h"
+
+
dip_format::dip_format()
{
}
@@ -37,9 +38,11 @@ const char *dip_format::extensions() const
return "dip";
}
-int dip_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int dip_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return 0;
if (size == 0x134000 + 0x100)
return 100;
@@ -47,7 +50,7 @@ int dip_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool dip_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool dip_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
int heads, tracks, spt, bps;
@@ -69,7 +72,8 @@ bool dip_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
for (int track = 0; track < tracks; track++)
for (int head = 0; head < heads; head++)
{
- io_generic_read(io, sect_data, 0x100 + bps * spt * (track * heads + head), bps * spt);
+ size_t actual;
+ io.read_at(0x100 + bps * spt * (track * heads + head), sect_data, bps * spt, actual);
for (int i = 0; i < spt; i++)
{
diff --git a/src/lib/formats/dip_dsk.h b/src/lib/formats/dip_dsk.h
index 255e4e6c8a1..e310ef3f655 100644
--- a/src/lib/formats/dip_dsk.h
+++ b/src/lib/formats/dip_dsk.h
@@ -20,8 +20,8 @@ class dip_format : public floppy_image_format_t
public:
dip_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/dmk_dsk.cpp b/src/lib/formats/dmk_dsk.cpp
index 39c23223ec5..6a9e1dc0f0b 100644
--- a/src/lib/formats/dmk_dsk.cpp
+++ b/src/lib/formats/dmk_dsk.cpp
@@ -13,10 +13,10 @@ TODO:
*********************************************************************/
-#include <cassert>
-
#include "dmk_dsk.h"
+#include "ioprocs.h"
+
dmk_format::dmk_format()
{
@@ -41,14 +41,16 @@ const char *dmk_format::extensions() const
}
-int dmk_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int dmk_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
+ uint64_t size;
+ if (io.length(size))
+ return 0;
+
const int header_size = 16;
uint8_t header[header_size];
-
- uint64_t size = io_generic_size(io);
-
- io_generic_read(io, header, 0, header_size);
+ size_t actual;
+ io.read_at(0, header, header_size, actual);
int tracks = header[1];
int track_size = ( header[3] << 8 ) | header[2];
@@ -81,12 +83,13 @@ int dmk_format::identify(io_generic *io, uint32_t form_factor, const std::vector
}
-bool dmk_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool dmk_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
+
const int header_size = 16;
uint8_t header[header_size];
-
- io_generic_read(io, header, 0, header_size);
+ io.read_at(0, header, header_size, actual);
const int tracks = header[1];
const int track_size = ( header[3] << 8 ) | header[2];
@@ -128,7 +131,7 @@ bool dmk_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
int dam_location[64];
// Read track
- io_generic_read(io, &track_data[0], header_size + ( heads * track + head ) * track_size, track_size);
+ io.read_at(header_size + (heads * track + head) * track_size, &track_data[0], track_size, actual);
for (int i = 0; i < 64; i++)
{
@@ -213,7 +216,7 @@ bool dmk_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
}
-bool dmk_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool dmk_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
return false;
}
diff --git a/src/lib/formats/dmk_dsk.h b/src/lib/formats/dmk_dsk.h
index a2e7898dece..5485869b5b6 100644
--- a/src/lib/formats/dmk_dsk.h
+++ b/src/lib/formats/dmk_dsk.h
@@ -21,9 +21,9 @@ class dmk_format : public floppy_image_format_t
public:
dmk_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/ds9_dsk.cpp b/src/lib/formats/ds9_dsk.cpp
index fdf4f5e2299..c97a2cced51 100644
--- a/src/lib/formats/ds9_dsk.cpp
+++ b/src/lib/formats/ds9_dsk.cpp
@@ -14,10 +14,10 @@
************************************************************************/
-#include <cassert>
-
#include "formats/ds9_dsk.h"
+#include "ioprocs.h"
+
static FLOPPY_IDENTIFY(ds9_dsk_identify)
{
@@ -97,33 +97,32 @@ const char *ds9_format::extensions() const
return "ds9";
}
-void ds9_format::find_size(io_generic *io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count)
+void ds9_format::find_size(util::random_read &io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count)
{
- uint32_t expected_size = 0;
- uint64_t size = io_generic_size(io);
-
head_count = 2;
track_count = 80;
sector_count = 21;
- expected_size = 256 * track_count * head_count * sector_count;
+ uint32_t const expected_size = 256 * track_count * head_count * sector_count;
- if (size >= expected_size) // standard format has 860160 bytes
+ uint64_t size;
+ if (!io.length(size) && (size >= expected_size)) // standard format has 860160 bytes
return;
track_count = head_count = sector_count = 0;
}
-int ds9_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int ds9_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t track_count, head_count, sector_count;
find_size(io, track_count, head_count, sector_count);
- if (track_count) return 50;
+ if (track_count)
+ return 50;
return 0;
}
-bool ds9_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool ds9_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
uint8_t track_count, head_count, sector_count;
find_size(io, track_count, head_count, sector_count);
@@ -143,7 +142,8 @@ bool ds9_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
{
for (int head = 0; head < head_count; head++)
{
- io_generic_read(io, sectdata, (track * head_count + head) * track_size, track_size);
+ size_t actual;
+ io.read_at((track * head_count + head) * track_size, sectdata, track_size, actual);
generate_track(ds9_desc, track, head, sectors, sector_count, 104000, image);
}
}
diff --git a/src/lib/formats/ds9_dsk.h b/src/lib/formats/ds9_dsk.h
index 317134eab87..abdf152b2b3 100644
--- a/src/lib/formats/ds9_dsk.h
+++ b/src/lib/formats/ds9_dsk.h
@@ -5,9 +5,10 @@
formats/ds9_dsk.h
*********************************************************************/
+#ifndef MAME_FORMATS_DS9_DSK_H
+#define MAME_FORMATS_DS9_DSK_H
-#ifndef DS9_DSK_H_
-#define DS9_DSK_H_
+#pragma once
#include "flopimg.h"
#include "formats/basicdsk.h"
@@ -19,8 +20,8 @@ class ds9_format : public floppy_image_format_t
public:
ds9_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -30,9 +31,9 @@ public:
static const desc_e ds9_desc[];
private:
- void find_size(io_generic *io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count);
+ void find_size(util::random_read &io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count);
};
extern const floppy_format_type FLOPPY_DS9_FORMAT;
-#endif /* DS9_DSK_H_ */
+#endif // MAME_FORMATS_DS9_DSK_H
diff --git a/src/lib/formats/dsk_dsk.cpp b/src/lib/formats/dsk_dsk.cpp
index dba11347887..fcf967edcb1 100644
--- a/src/lib/formats/dsk_dsk.cpp
+++ b/src/lib/formats/dsk_dsk.cpp
@@ -8,11 +8,12 @@
*********************************************************************/
-#include <cstring>
-#include <cassert>
-
+#include "dsk_dsk.h"
#include "imageutl.h"
-#include "flopimg.h"
+
+#include "ioprocs.h"
+
+#include <cstring>
#define MV_CPC "MV - CPC"
#define EXTENDED "EXTENDED"
@@ -270,7 +271,8 @@ FLOPPY_CONSTRUCT( dsk_dsk_construct )
return FLOPPY_ERROR_SUCCESS;
}
-#include "dsk_dsk.h"
+
+
#define DSK_FORMAT_HEADER "MV - CPC"
#define EXT_FORMAT_HEADER "EXTENDED CPC DSK"
@@ -299,11 +301,12 @@ bool dsk_format::supports_save() const
return false;
}
-int dsk_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int dsk_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t header[16];
- io_generic_read(io, &header, 0, sizeof(header));
+ size_t actual;
+ io.read_at(0, &header, sizeof(header), actual);
if ( memcmp( header, DSK_FORMAT_HEADER, 8 ) ==0) {
return 100;
}
@@ -344,14 +347,18 @@ struct sector_header
#pragma pack()
-bool dsk_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool dsk_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
+
uint8_t header[0x100];
bool extendformat = false;
- uint64_t image_size = io_generic_size(io);
+ uint64_t image_size;
+ if (io.length(image_size))
+ return false;
- io_generic_read(io, &header, 0, sizeof(header));
+ io.read_at(0, &header, sizeof(header), actual);
if ( memcmp( header, EXT_FORMAT_HEADER, 16 ) ==0) {
extendformat = true;
}
@@ -418,7 +425,7 @@ bool dsk_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
if(track_offsets[(track<<1)+side] >= image_size)
continue;
track_header tr;
- io_generic_read(io, &tr,track_offsets[(track<<1)+side],sizeof(tr));
+ io.read_at(track_offsets[(track<<1)+side], &tr, sizeof(tr), actual);
// skip if there are no sectors in this track
if (tr.number_of_sector == 0)
@@ -428,7 +435,7 @@ bool dsk_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
int first_sector_code = -1;
for(int j=0;j<tr.number_of_sector;j++) {
sector_header sector;
- io_generic_read(io, &sector,track_offsets[(track<<1)+side]+sizeof(tr)+(sizeof(sector)*j),sizeof(sector));
+ io.read_at(track_offsets[(track<<1)+side]+sizeof(tr)+(sizeof(sector)*j), &sector, sizeof(sector), actual);
if (j == 0)
first_sector_code = sector.sector_size_code;
@@ -447,7 +454,7 @@ bool dsk_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
for(int j=0;j<tr.number_of_sector;j++) {
sector_header sector;
- io_generic_read(io, &sector,track_offsets[(track<<1)+side]+sizeof(tr)+(sizeof(sector)*j),sizeof(sector));
+ io.read_at(track_offsets[(track<<1)+side]+sizeof(tr)+(sizeof(sector)*j), &sector, sizeof(sector), actual);
sects[j].track = sector.track;
sects[j].head = sector.side;
@@ -470,7 +477,7 @@ bool dsk_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
if(!(sector.fdc_status_reg1 & 0x04)) {
sects[j].data = sect_data + sdatapos;
- io_generic_read(io, sects[j].data, pos, sects[j].actual_size);
+ io.read_at(pos, sects[j].data, sects[j].actual_size, actual);
sdatapos += sects[j].actual_size;
} else
diff --git a/src/lib/formats/dsk_dsk.h b/src/lib/formats/dsk_dsk.h
index a08e3955888..7d6b3bc43dc 100644
--- a/src/lib/formats/dsk_dsk.h
+++ b/src/lib/formats/dsk_dsk.h
@@ -19,8 +19,8 @@ class dsk_format : public floppy_image_format_t
public:
dsk_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/dvk_mx_dsk.cpp b/src/lib/formats/dvk_mx_dsk.cpp
index 07d7a38cf95..08156d29e9c 100644
--- a/src/lib/formats/dvk_mx_dsk.cpp
+++ b/src/lib/formats/dvk_mx_dsk.cpp
@@ -18,11 +18,11 @@
************************************************************************/
-#include <cassert>
-
-#include "flopimg.h"
#include "formats/dvk_mx_dsk.h"
+#include "ioprocs.h"
+
+
const floppy_image_format_t::desc_e dvk_mx_format::dvk_mx_new_desc[] = {
/* 01 */ { FM, 0x00, 8*2 }, // eight 0x0000 words
/* 03 */ { FM, 0x00, 1 },
@@ -81,9 +81,14 @@ bool dvk_mx_format::supports_save() const
return false;
}
-void dvk_mx_format::find_size(io_generic *io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count)
+void dvk_mx_format::find_size(util::random_read &io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ {
+ track_count = head_count = sector_count = 0;
+ return;
+ }
switch (size)
{
@@ -108,7 +113,7 @@ void dvk_mx_format::find_size(io_generic *io, uint8_t &track_count, uint8_t &hea
}
}
-int dvk_mx_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int dvk_mx_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t track_count, head_count, sector_count;
@@ -117,7 +122,8 @@ int dvk_mx_format::identify(io_generic *io, uint32_t form_factor, const std::vec
if (track_count)
{
uint8_t sectdata[512];
- io_generic_read(io, sectdata, 512, 512);
+ size_t actual;
+ io.read_at(512, sectdata, 512, actual);
// check value in RT-11 home block. see src/tools/imgtool/modules/rt11.cpp
if (pick_integer_le(sectdata, 0724, 2) == 6)
return 100;
@@ -129,7 +135,7 @@ int dvk_mx_format::identify(io_generic *io, uint32_t form_factor, const std::vec
return 0;
}
-bool dvk_mx_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool dvk_mx_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
uint8_t track_count, head_count, sector_count;
@@ -150,7 +156,8 @@ bool dvk_mx_format::load(io_generic *io, uint32_t form_factor, const std::vector
{
for (int head = 0; head < head_count; head++)
{
- io_generic_read(io, sectdata, (track * head_count + head) * track_size, track_size);
+ size_t actual;
+ io.read_at((track * head_count + head) * track_size, sectdata, track_size, actual);
generate_track(dvk_mx_new_desc, track, head, sectors, sector_count, 45824, image);
}
}
diff --git a/src/lib/formats/dvk_mx_dsk.h b/src/lib/formats/dvk_mx_dsk.h
index 38fd895d154..e20066fc3ec 100644
--- a/src/lib/formats/dvk_mx_dsk.h
+++ b/src/lib/formats/dvk_mx_dsk.h
@@ -5,9 +5,8 @@
formats/dvk_mx_dsk.h
*********************************************************************/
-
-#ifndef DVK_MX_DSK_H_
-#define DVK_MX_DSK_H_
+#ifndef MAME_FORMATS_DVK_MX_DSK_H
+#define MAME_FORMATS_DVK_MX_DSK_H
#pragma once
@@ -19,8 +18,8 @@ class dvk_mx_format : public floppy_image_format_t
public:
dvk_mx_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -31,9 +30,9 @@ public:
static const desc_e dvk_mx_new_desc[];
private:
- void find_size(io_generic *io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count);
+ void find_size(util::random_read &io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count);
};
extern const floppy_format_type FLOPPY_DVK_MX_FORMAT;
-#endif /* DVK_MX_DSK_H_ */
+#endif // MAME_FORMATS_DVK_MX_DSK_H
diff --git a/src/lib/formats/esq16_dsk.cpp b/src/lib/formats/esq16_dsk.cpp
index 10802d26495..b33e529fef2 100644
--- a/src/lib/formats/esq16_dsk.cpp
+++ b/src/lib/formats/esq16_dsk.cpp
@@ -10,10 +10,10 @@
*********************************************************************/
-#include <cassert>
+#include "esq16_dsk.h"
+
+#include "ioprocs.h"
-#include "flopimg.h"
-#include "formats/esq16_dsk.h"
const floppy_image_format_t::desc_e esqimg_format::esq_10_desc[] = {
{ MFM, 0x4e, 80 },
@@ -71,23 +71,23 @@ bool esqimg_format::supports_save() const
return true;
}
-void esqimg_format::find_size(io_generic *io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count)
+void esqimg_format::find_size(util::random_read &io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count)
{
- uint64_t size = io_generic_size(io);
- track_count = 80;
- head_count = 2;
- sector_count = 10;
-
- uint32_t expected_size = 512 * track_count*head_count*sector_count;
- if (size == expected_size)
- {
- return;
- }
+ uint64_t size;
+ if(!io.length(size)) {
+ track_count = 80;
+ head_count = 2;
+ sector_count = 10;
+ uint32_t expected_size = 512 * track_count*head_count*sector_count;
+ if(size == expected_size) {
+ return;
+ }
+ }
track_count = head_count = sector_count = 0;
}
-int esqimg_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int esqimg_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t track_count, head_count, sector_count;
find_size(io, track_count, head_count, sector_count);
@@ -97,7 +97,7 @@ int esqimg_format::identify(io_generic *io, uint32_t form_factor, const std::vec
return 0;
}
-bool esqimg_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool esqimg_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
uint8_t track_count, head_count, sector_count;
find_size(io, track_count, head_count, sector_count);
@@ -113,7 +113,8 @@ bool esqimg_format::load(io_generic *io, uint32_t form_factor, const std::vector
int track_size = sector_count*512;
for(int track=0; track < track_count; track++) {
for(int head=0; head < head_count; head++) {
- io_generic_read(io, sectdata, (track*head_count + head)*track_size, track_size);
+ size_t actual;
+ io.read_at((track*head_count + head)*track_size, sectdata, track_size, actual);
generate_track(esq_10_desc, track, head, sectors, sector_count, 110528, image);
}
}
@@ -123,7 +124,7 @@ bool esqimg_format::load(io_generic *io, uint32_t form_factor, const std::vector
return true;
}
-bool esqimg_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool esqimg_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int track_count, head_count, sector_count;
get_geometry_mfm_pc(image, 2000, track_count, head_count, sector_count);
@@ -144,7 +145,8 @@ bool esqimg_format::save(io_generic *io, const std::vector<uint32_t> &variants,
for(int track=0; track < track_count; track++) {
for(int head=0; head < head_count; head++) {
get_track_data_mfm_pc(track, head, image, 2000, 512, sector_count, sectdata);
- io_generic_write(io, sectdata, (track*head_count + head)*track_size, track_size);
+ size_t actual;
+ io.write_at((track*head_count + head)*track_size, sectdata, track_size, actual);
}
}
diff --git a/src/lib/formats/esq16_dsk.h b/src/lib/formats/esq16_dsk.h
index 8cc49150d2c..2347d64f59c 100644
--- a/src/lib/formats/esq16_dsk.h
+++ b/src/lib/formats/esq16_dsk.h
@@ -21,9 +21,9 @@ class esqimg_format : public floppy_image_format_t
public:
esqimg_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -33,7 +33,7 @@ public:
static const desc_e esq_10_desc[];
private:
- void find_size(io_generic *io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count);
+ void find_size(util::random_read &io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count);
};
extern const floppy_format_type FLOPPY_ESQIMG_FORMAT;
diff --git a/src/lib/formats/esq8_dsk.cpp b/src/lib/formats/esq8_dsk.cpp
index f9dcb3d0727..952dd16edbd 100644
--- a/src/lib/formats/esq8_dsk.cpp
+++ b/src/lib/formats/esq8_dsk.cpp
@@ -12,10 +12,10 @@
*********************************************************************/
-#include <cassert>
+#include "esq8_dsk.h"
+
+#include "ioprocs.h"
-#include "flopimg.h"
-#include "formats/esq8_dsk.h"
const floppy_image_format_t::desc_e esq8img_format::esq_6_desc[] = {
{ MFM, 0x4e, 80 },
@@ -73,22 +73,24 @@ bool esq8img_format::supports_save() const
return true;
}
-void esq8img_format::find_size(io_generic *io, int &track_count, int &head_count, int &sector_count)
+void esq8img_format::find_size(util::random_read &io, int &track_count, int &head_count, int &sector_count)
{
- uint64_t size = io_generic_size(io);
- track_count = 80;
- head_count = 1;
- sector_count = 6;
-
- if(size == 5632 * 80)
+ uint64_t size;
+ if(!io.length(size))
{
- return;
- }
+ track_count = 80;
+ head_count = 1;
+ sector_count = 6;
+ if(size == 5632 * 80)
+ {
+ return;
+ }
+ }
track_count = head_count = sector_count = 0;
}
-int esq8img_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int esq8img_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
int track_count, head_count, sector_count;
find_size(io, track_count, head_count, sector_count);
@@ -99,7 +101,7 @@ int esq8img_format::identify(io_generic *io, uint32_t form_factor, const std::ve
return 0;
}
-bool esq8img_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool esq8img_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
int track_count, head_count, sector_count;
find_size(io, track_count, head_count, sector_count);
@@ -128,7 +130,8 @@ bool esq8img_format::load(io_generic *io, uint32_t form_factor, const std::vecto
{
for(int head=0; head < head_count; head++)
{
- io_generic_read(io, sectdata, (track*head_count + head)*track_size, track_size);
+ size_t actual;
+ io.read_at((track*head_count + head)*track_size, sectdata, track_size, actual);
generate_track(esq_6_desc, track, head, sectors, sector_count, 109376, image);
}
}
@@ -138,7 +141,7 @@ bool esq8img_format::load(io_generic *io, uint32_t form_factor, const std::vecto
return true;
}
-bool esq8img_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool esq8img_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
uint64_t file_offset = 0;
int track_count, head_count, sector_count;
@@ -175,7 +178,8 @@ bool esq8img_format::save(io_generic *io, const std::vector<uint32_t> &variants,
return false;
}
- io_generic_write(io, sectors[sector].data(), file_offset, sector_expected_size);
+ size_t actual;
+ io.write_at(file_offset, sectors[sector].data(), sector_expected_size, actual);
file_offset += sector_expected_size;
}
}
diff --git a/src/lib/formats/esq8_dsk.h b/src/lib/formats/esq8_dsk.h
index c4fe5a74f1b..aa09fd278a7 100644
--- a/src/lib/formats/esq8_dsk.h
+++ b/src/lib/formats/esq8_dsk.h
@@ -23,9 +23,9 @@ class esq8img_format : public floppy_image_format_t
public:
esq8img_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -35,7 +35,7 @@ public:
static const desc_e esq_6_desc[];
private:
- void find_size(io_generic *io, int &track_count, int &head_count, int &sector_count);
+ void find_size(util::random_read &io, int &track_count, int &head_count, int &sector_count);
};
extern const floppy_format_type FLOPPY_ESQ8IMG_FORMAT;
diff --git a/src/lib/formats/fdd_dsk.cpp b/src/lib/formats/fdd_dsk.cpp
index df5fd3caa8c..8c8249c9452 100644
--- a/src/lib/formats/fdd_dsk.cpp
+++ b/src/lib/formats/fdd_dsk.cpp
@@ -31,10 +31,11 @@
*********************************************************************/
-#include <cassert>
-
#include "fdd_dsk.h"
+#include "ioprocs.h"
+
+
fdd_format::fdd_format()
{
}
@@ -54,10 +55,11 @@ const char *fdd_format::extensions() const
return "fdd";
}
-int fdd_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int fdd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t h[7];
- io_generic_read(io, h, 0, 7);
+ size_t actual;
+ io.read_at(0, h, 7, actual);
if (strncmp((const char *)h, "VFD1.0", 6) == 0)
return 100;
@@ -65,7 +67,7 @@ int fdd_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool fdd_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool fdd_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
uint8_t hsec[0x0c];
@@ -86,7 +88,8 @@ bool fdd_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
for (int sect = 0; sect < 26; sect++)
{
// read sector map for this sector
- io_generic_read(io, hsec, pos, 0x0c);
+ size_t actual;
+ io.read_at(pos, hsec, 0x0c, actual);
pos += 0x0c;
if (hsec[0] == 0xff) // unformatted/unused sector
@@ -118,10 +121,11 @@ bool fdd_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
cur_sec_map = track * 26 + i;
sector_size = 128 << sec_sizes[cur_sec_map];
+ size_t actual;
if (sec_offs[cur_sec_map] == 0xffffffff)
memset(sect_data + cur_pos, fill_vals[cur_sec_map], sector_size);
else
- io_generic_read(io, sect_data + cur_pos, sec_offs[cur_sec_map], sector_size);
+ io.read_at(sec_offs[cur_sec_map], sect_data + cur_pos, sector_size, actual);
sects[i].track = tracks[cur_sec_map];
sects[i].head = heads[cur_sec_map];
diff --git a/src/lib/formats/fdd_dsk.h b/src/lib/formats/fdd_dsk.h
index ec013c58571..c1a3ae8a29b 100644
--- a/src/lib/formats/fdd_dsk.h
+++ b/src/lib/formats/fdd_dsk.h
@@ -20,8 +20,8 @@ class fdd_format : public floppy_image_format_t
public:
fdd_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/flex_dsk.cpp b/src/lib/formats/flex_dsk.cpp
index 692cc4bdc9d..4989a25e707 100644
--- a/src/lib/formats/flex_dsk.cpp
+++ b/src/lib/formats/flex_dsk.cpp
@@ -50,7 +50,11 @@
*/
#include "flex_dsk.h"
-#include "formats/imageutl.h"
+
+#include "imageutl.h"
+
+#include "ioprocs.h"
+
flex_format::flex_format() : wd177x_format(formats)
{
@@ -71,7 +75,7 @@ const char *flex_format::extensions() const
return "dsk";
}
-int flex_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int flex_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
int type = find_size(io, form_factor, variants);
@@ -80,17 +84,21 @@ int flex_format::identify(io_generic *io, uint32_t form_factor, const std::vecto
return 0;
}
-int flex_format::find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int flex_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return -1;
+
uint8_t boot0[256], boot1[256];
+ size_t actual;
// Look at the boot sector.
// Density, sides, link??
- io_generic_read(io, &boot0, 256 * 0, sizeof(boot0));
- io_generic_read(io, &boot1, 256 * 1, sizeof(boot1));
+ io.read_at(256 * 0, &boot0, sizeof(boot0), actual);
+ io.read_at(256 * 1, &boot1, sizeof(boot1), actual);
// Look at the system information sector.
- io_generic_read(io, &info, 256 * 2, sizeof(struct sysinfo_sector));
+ io.read_at(256 * 2, &info, sizeof(struct sysinfo_sector), actual);
LOG_FORMATS("FLEX floppy dsk: size %d bytes, %d total sectors, %d remaining bytes, expected form factor %x\n", (uint32_t)size, (uint32_t)size / 256, (uint32_t)size % 256, form_factor);
diff --git a/src/lib/formats/flex_dsk.h b/src/lib/formats/flex_dsk.h
index 094c6854b24..0048e4e088f 100644
--- a/src/lib/formats/flex_dsk.h
+++ b/src/lib/formats/flex_dsk.h
@@ -21,8 +21,8 @@ public:
virtual const char *name() const override;
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual int find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual const wd177x_format::format &get_track_format(const format &f, int head, int track) override;
private:
diff --git a/src/lib/formats/flopimg.cpp b/src/lib/formats/flopimg.cpp
index 48c2fa1b610..55d00d1bb83 100644
--- a/src/lib/formats/flopimg.cpp
+++ b/src/lib/formats/flopimg.cpp
@@ -11,9 +11,10 @@
#include "flopimg.h"
#include "imageutl.h"
-#include "osdcore.h"
#include "ioprocs.h"
+#include "osdcore.h"
+
#include <cassert>
#include <cctype>
#include <climits>
@@ -30,7 +31,7 @@ using util::BIT;
struct floppy_image_legacy
{
- struct io_generic io = { 0 };
+ util::random_read_write::ptr io = nullptr;
const struct FloppyFormat *floppy_option = nullptr;
struct FloppyCallbacks format = { 0 };
@@ -69,22 +70,20 @@ OPTION_GUIDE_START(floppy_option_guide)
OPTION_GUIDE_END
-static void floppy_close_internal(floppy_image_legacy *floppy, bool close_file);
+static void floppy_close_internal(floppy_image_legacy *floppy);
/*********************************************************************
opening, closing and creating of floppy images
*********************************************************************/
/* basic floppy_image_legacy initialization common to floppy_open() and floppy_create() */
-static floppy_image_legacy *floppy_init(void *fp, const struct io_procs *procs, int flags)
+static floppy_image_legacy *floppy_init(util::random_read_write::ptr &&io, int flags)
{
floppy_image_legacy *floppy;
floppy = new floppy_image_legacy;
- floppy->io.file = fp;
- floppy->io.procs = procs;
- floppy->io.filler = 0xFF;
+ floppy->io = std::move(io);
floppy->flags = (uint8_t) flags;
return floppy;
}
@@ -93,7 +92,7 @@ static floppy_image_legacy *floppy_init(void *fp, const struct io_procs *procs,
/* main code for identifying and maybe opening a disk image; not exposed
* directly because this function is big and hideous */
-static floperr_t floppy_open_internal(void *fp, const struct io_procs *procs, const std::string &extension,
+static floperr_t floppy_open_internal(util::random_read_write::ptr &&io, const std::string &extension,
const struct FloppyFormat *floppy_options, int max_options, int flags, floppy_image_legacy **outfloppy,
int *outoption)
{
@@ -104,7 +103,7 @@ static floperr_t floppy_open_internal(void *fp, const struct io_procs *procs, co
int vote;
size_t i;
- floppy = floppy_init(fp, procs, flags);
+ floppy = floppy_init(std::move(io), flags);
if (!floppy)
{
err = FLOPPY_ERROR_OUTOFMEMORY;
@@ -163,7 +162,7 @@ done:
/* if we have a floppy disk and we either errored or are not keeping it, close it */
if (floppy && (!outfloppy || err))
{
- floppy_close_internal(floppy, false);
+ floppy_close_internal(floppy);
floppy = nullptr;
}
@@ -176,31 +175,31 @@ done:
-floperr_t floppy_identify(void *fp, const struct io_procs *procs, const char *extension,
+floperr_t floppy_identify(util::random_read_write::ptr &&io, const char *extension,
const struct FloppyFormat *formats, int *identified_format)
{
- return floppy_open_internal(fp, procs, extension, formats, INT_MAX, FLOPPY_FLAGS_READONLY, nullptr, identified_format);
+ return floppy_open_internal(std::move(io), extension, formats, INT_MAX, FLOPPY_FLAGS_READONLY, nullptr, identified_format);
}
-floperr_t floppy_open(void *fp, const struct io_procs *procs, const std::string &extension,
+floperr_t floppy_open(util::random_read_write::ptr &&io, const std::string &extension,
const struct FloppyFormat *format, int flags, floppy_image_legacy **outfloppy)
{
- return floppy_open_internal(fp, procs, extension, format, 1, flags, outfloppy, nullptr);
+ return floppy_open_internal(std::move(io), extension, format, 1, flags, outfloppy, nullptr);
}
-floperr_t floppy_open_choices(void *fp, const struct io_procs *procs, const std::string &extension,
+floperr_t floppy_open_choices(util::random_read_write::ptr &&io, const std::string &extension,
const struct FloppyFormat *formats, int flags, floppy_image_legacy **outfloppy)
{
- return floppy_open_internal(fp, procs, extension, formats, INT_MAX, flags, outfloppy, nullptr);
+ return floppy_open_internal(std::move(io), extension, formats, INT_MAX, flags, outfloppy, nullptr);
}
-floperr_t floppy_create(void *fp, const struct io_procs *procs, const struct FloppyFormat *format, util::option_resolution *parameters, floppy_image_legacy **outfloppy)
+floperr_t floppy_create(util::random_read_write::ptr &&io, const struct FloppyFormat *format, util::option_resolution *parameters, floppy_image_legacy **outfloppy)
{
floppy_image_legacy *floppy = nullptr;
floperr_t err;
@@ -210,7 +209,7 @@ floperr_t floppy_create(void *fp, const struct io_procs *procs, const struct Flo
assert(format);
/* create the new image */
- floppy = floppy_init(fp, procs, 0);
+ floppy = floppy_init(std::move(io), 0);
if (!floppy)
{
err = FLOPPY_ERROR_OUTOFMEMORY;
@@ -266,28 +265,26 @@ floperr_t floppy_create(void *fp, const struct io_procs *procs, const struct Flo
done:
if (err && floppy)
{
- floppy_close_internal(floppy, false);
+ floppy_close_internal(floppy);
floppy = nullptr;
}
if (outfloppy)
*outfloppy = floppy;
else if (floppy)
- floppy_close_internal(floppy, false);
+ floppy_close_internal(floppy);
return err;
}
-static void floppy_close_internal(floppy_image_legacy *floppy, bool close_file)
+static void floppy_close_internal(floppy_image_legacy *floppy)
{
if (floppy) {
floppy_track_unload(floppy);
if(floppy->floppy_option && floppy->floppy_option->destruct)
floppy->floppy_option->destruct(floppy, floppy->floppy_option);
- if (close_file)
- io_generic_close(&floppy->io);
delete floppy;
}
@@ -297,7 +294,7 @@ static void floppy_close_internal(floppy_image_legacy *floppy, bool close_file)
void floppy_close(floppy_image_legacy *floppy)
{
- floppy_close_internal(floppy, true);
+ floppy_close_internal(floppy);
}
@@ -332,14 +329,16 @@ void *floppy_create_tag(floppy_image_legacy *floppy, size_t tagsize)
uint8_t floppy_get_filler(floppy_image_legacy *floppy)
{
- return floppy->io.filler;
+ // FIXME: remove this function, it's here for legacy reasons
+ // the caller actually sets the filler byte - in practice it's always 0xff but there's no actual guarantee
+ return 0xff;
}
-void floppy_set_filler(floppy_image_legacy *floppy, uint8_t filler)
+util::random_read_write &floppy_get_io(floppy_image_legacy *floppy)
{
- floppy->io.filler = filler;
+ return *floppy->io;
}
@@ -350,28 +349,42 @@ void floppy_set_filler(floppy_image_legacy *floppy, uint8_t filler)
void floppy_image_read(floppy_image_legacy *floppy, void *buffer, uint64_t offset, size_t length)
{
- io_generic_read(&floppy->io, buffer, offset, length);
+ size_t actual;
+ floppy->io->read_at(offset, buffer, length, actual);
}
void floppy_image_write(floppy_image_legacy *floppy, const void *buffer, uint64_t offset, size_t length)
{
- io_generic_write(&floppy->io, buffer, offset, length);
+ size_t actual;
+ floppy->io->write_at(offset, buffer, length, actual);
}
void floppy_image_write_filler(floppy_image_legacy *floppy, uint8_t filler, uint64_t offset, size_t length)
{
- io_generic_write_filler(&floppy->io, filler, offset, length);
+ uint8_t buffer[512];
+ memset(buffer, filler, std::min(sizeof(buffer), length));
+
+ while (length)
+ {
+ size_t const block = std::min(sizeof(buffer), length);
+ size_t actual;
+ floppy->io->write_at(offset, buffer, block, actual);
+ offset += block;
+ length -= block;
+ }
}
uint64_t floppy_image_size(floppy_image_legacy *floppy)
{
- return io_generic_size(&floppy->io);
+ uint64_t result;
+ floppy->io->length(result);
+ return result;
}
@@ -976,7 +989,7 @@ bool floppy_image_format_t::has_variant(const std::vector<uint32_t> &variants, u
return false;
}
-bool floppy_image_format_t::save(io_generic *, const std::vector<uint32_t> &, floppy_image *)
+bool floppy_image_format_t::save(util::random_read_write &io, const std::vector<uint32_t> &, floppy_image *)
{
return false;
}
diff --git a/src/lib/formats/flopimg.h b/src/lib/formats/flopimg.h
index 101d9bd86bd..550c9a62fa8 100644
--- a/src/lib/formats/flopimg.h
+++ b/src/lib/formats/flopimg.h
@@ -12,11 +12,13 @@
#pragma once
-#include "osdcore.h"
-#include "ioprocs.h"
-#include "opresolv.h"
#include "coretmpl.h"
+#include "opresolv.h"
+#include "utilfwd.h"
+
+#include "osdcore.h"
+#include <memory>
#include <vector>
#ifndef LOG_FORMATS
@@ -166,20 +168,20 @@ LEGACY_FLOPPY_OPTIONS_EXTERN(default);
OPTION_GUIDE_EXTERN(floppy_option_guide);
/* opening, closing and creating of floppy images */
-floperr_t floppy_open(void *fp, const struct io_procs *procs, const std::string &extension, const struct FloppyFormat *format, int flags, floppy_image_legacy **outfloppy);
-floperr_t floppy_open_choices(void *fp, const struct io_procs *procs, const std::string &extension, const struct FloppyFormat *formats, int flags, floppy_image_legacy **outfloppy);
-floperr_t floppy_create(void *fp, const struct io_procs *procs, const struct FloppyFormat *format, util::option_resolution *parameters, floppy_image_legacy **outfloppy);
+floperr_t floppy_open(std::unique_ptr<util::random_read_write> &&io, const std::string &extension, const struct FloppyFormat *format, int flags, floppy_image_legacy **outfloppy);
+floperr_t floppy_open_choices(std::unique_ptr<util::random_read_write> &&io, const std::string &extension, const struct FloppyFormat *formats, int flags, floppy_image_legacy **outfloppy);
+floperr_t floppy_create(std::unique_ptr<util::random_read_write> &&io, const struct FloppyFormat *format, util::option_resolution *parameters, floppy_image_legacy **outfloppy);
void floppy_close(floppy_image_legacy *floppy);
/* useful for identifying a floppy image */
-floperr_t floppy_identify(void *fp, const struct io_procs *procs, const char *extension, const struct FloppyFormat *formats, int *identified_format);
+floperr_t floppy_identify(std::unique_ptr<util::random_read_write> &&io, const char *extension, const struct FloppyFormat *formats, int *identified_format);
/* functions useful within format constructors */
void *floppy_tag(floppy_image_legacy *floppy);
void *floppy_create_tag(floppy_image_legacy *floppy, size_t tagsize);
struct FloppyCallbacks *floppy_callbacks(floppy_image_legacy *floppy);
uint8_t floppy_get_filler(floppy_image_legacy *floppy);
-void floppy_set_filler(floppy_image_legacy *floppy, uint8_t filler);
+util::random_read_write &floppy_get_io(floppy_image_legacy *floppy);
/* calls for accessing disk image data */
floperr_t floppy_read_sector(floppy_image_legacy *floppy, int head, int track, int sector, int offset, void *buffer, size_t buffer_len);
@@ -235,7 +237,7 @@ public:
@param variants the variants from floppy_image the drive can handle
@return 1 if image valid, 0 otherwise.
*/
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) = 0;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) = 0;
/*! @brief Load an image.
The load function opens an image file and converts it to the
@@ -247,7 +249,7 @@ public:
@param image output buffer for data in MESS internal format.
@return true on success, false otherwise.
*/
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) = 0;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) = 0;
/*! @brief Save an image.
The save function writes back an image from the MESS internal
@@ -257,7 +259,7 @@ public:
@param image source buffer containing data in MESS internal format.
@return true on success, false otherwise.
*/
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image);
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image);
//! @returns string containing name of format.
virtual const char *name() const = 0;
@@ -732,9 +734,9 @@ public:
//! floppy_image constructor
/*!
- @param _tracks number of tracks.
- @param _heads number of heads.
- @param _form_factor form factor of drive (from enum)
+ @param tracks number of tracks.
+ @param heads number of heads.
+ @param form_factor form factor of drive (from enum)
*/
floppy_image(int tracks, int heads, uint32_t form_factor);
virtual ~floppy_image();
@@ -786,7 +788,7 @@ public:
//! Returns the variant name for the particular disk form factor/variant
//! @param form_factor
//! @param variant
- //! @param returns a string containing the variant name.
+ //! @return a string containing the variant name.
static const char *get_variant_name(uint32_t form_factor, uint32_t variant);
private:
diff --git a/src/lib/formats/fsd_dsk.cpp b/src/lib/formats/fsd_dsk.cpp
index c5ebd243875..ffb23035420 100644
--- a/src/lib/formats/fsd_dsk.cpp
+++ b/src/lib/formats/fsd_dsk.cpp
@@ -10,6 +10,8 @@
#include "fsd_dsk.h"
+#include "ioprocs.h"
+
/*********************************************************************
@@ -83,11 +85,12 @@ bool fsd_format::supports_save() const
return false;
}
-int fsd_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int fsd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t h[3];
- io_generic_read(io, h, 0, 3);
+ size_t actual;
+ io.read_at(0, h, 3, actual);
if (memcmp(h, "FSD", 3) == 0) {
return 100;
}
@@ -95,16 +98,19 @@ int fsd_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool fsd_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool fsd_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
const char* result[255];
result[0x00] = "OK";
result[0x0e] = "Data CRC Error";
result[0x20] = "Deleted Data";
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return false;
std::vector<uint8_t> img(size);
- io_generic_read(io, &img[0], 0, size);
+ size_t actual;
+ io.read_at(0, &img[0], size, actual);
uint64_t pos;
std::string title;
diff --git a/src/lib/formats/fsd_dsk.h b/src/lib/formats/fsd_dsk.h
index ee2c4aa466c..779ee28ec02 100644
--- a/src/lib/formats/fsd_dsk.h
+++ b/src/lib/formats/fsd_dsk.h
@@ -33,8 +33,8 @@ public:
virtual const char *extensions() const override;
virtual bool supports_save() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
};
extern const floppy_format_type FLOPPY_FSD_FORMAT;
diff --git a/src/lib/formats/g64_dsk.cpp b/src/lib/formats/g64_dsk.cpp
index 02098db88e0..8e6b9c75e44 100644
--- a/src/lib/formats/g64_dsk.cpp
+++ b/src/lib/formats/g64_dsk.cpp
@@ -12,6 +12,8 @@
#include "formats/g64_dsk.h"
+#include "ioprocs.h"
+
#define G64_FORMAT_HEADER "GCR-1541"
@@ -27,22 +29,27 @@ const uint32_t g64_format::c1541_cell_size[] =
3250 // 16MHz/13/4
};
-int g64_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int g64_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
char h[8];
- io_generic_read(io, h, 0, 8);
+ size_t actual;
+ io.read_at(0, h, 8, actual);
if (!memcmp(h, G64_FORMAT_HEADER, 8))
return 100;
return 0;
}
-bool g64_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool g64_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return false;
+
std::vector<uint8_t> img(size);
- io_generic_read(io, &img[0], 0, size);
+ size_t actual;
+ io.read_at(0, &img[0], size, actual);
if (img[POS_VERSION])
{
@@ -109,15 +116,19 @@ int g64_format::generate_bitstream(int track, int head, int speed_zone, std::vec
return ((actual_cell_size >= cell_size-10) && (actual_cell_size <= cell_size+10)) ? speed_zone : -1;
}
-bool g64_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool g64_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ uint8_t const zerofill[] = { 0x00, 0x00, 0x00, 0x00 };
+ std::vector<uint8_t> const prefill(TRACK_LENGTH, 0xff);
+ size_t actual;
+
int tracks, heads;
image->get_actual_geometry(tracks, heads);
tracks = TRACK_COUNT * heads;
// write header
uint8_t header[] = { 'G', 'C', 'R', '-', '1', '5', '4', '1', 0x00, static_cast<uint8_t>(tracks), TRACK_LENGTH & 0xff, TRACK_LENGTH >> 8 };
- io_generic_write(io, header, POS_SIGNATURE, sizeof(header));
+ io.write_at(POS_SIGNATURE, header, sizeof(header), actual);
// write tracks
for (int head = 0; head < heads; head++) {
@@ -126,12 +137,12 @@ bool g64_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
std::vector<bool> trackbuf;
for (int track = 0; track < TRACK_COUNT; track++) {
- uint32_t tpos = POS_TRACK_OFFSET + (track * 4);
- uint32_t spos = tpos + (tracks * 4);
- uint32_t dpos = POS_TRACK_OFFSET + (tracks * 4 * 2) + (tracks_written * TRACK_LENGTH);
+ uint32_t const tpos = POS_TRACK_OFFSET + (track * 4);
+ uint32_t const spos = tpos + (tracks * 4);
+ uint32_t const dpos = POS_TRACK_OFFSET + (tracks * 4 * 2) + (tracks_written * TRACK_LENGTH);
- io_generic_write_filler(io, 0x00, tpos, 4);
- io_generic_write_filler(io, 0x00, spos, 4);
+ io.write_at(tpos, zerofill, 4, actual);
+ io.write_at(spos, zerofill, 4, actual);
if (image->get_buffer(track, head).size() <= 1)
continue;
@@ -163,11 +174,11 @@ bool g64_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
place_integer_le(speed_offset, 0, 4, speed_zone);
place_integer_le(track_length, 0, 2, packed.size());
- io_generic_write(io, track_offset, tpos, 4);
- io_generic_write(io, speed_offset, spos, 4);
- io_generic_write_filler(io, 0xff, dpos, TRACK_LENGTH);
- io_generic_write(io, track_length, dpos, 2);
- io_generic_write(io, packed.data(), dpos + 2, packed.size());
+ io.write_at(tpos, track_offset, 4, actual);
+ io.write_at(spos, speed_offset, 4, actual);
+ io.write_at(dpos, prefill.data(), TRACK_LENGTH, actual);
+ io.write_at(dpos, track_length, 2, actual);
+ io.write_at(dpos + 2, packed.data(), packed.size(), actual);
tracks_written++;
}
diff --git a/src/lib/formats/g64_dsk.h b/src/lib/formats/g64_dsk.h
index 6691146c70e..fcd48d96796 100644
--- a/src/lib/formats/g64_dsk.h
+++ b/src/lib/formats/g64_dsk.h
@@ -20,9 +20,9 @@ class g64_format : public floppy_image_format_t
public:
g64_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/hpi_dsk.cpp b/src/lib/formats/hpi_dsk.cpp
index d9fc788fd45..bdccc66803d 100644
--- a/src/lib/formats/hpi_dsk.cpp
+++ b/src/lib/formats/hpi_dsk.cpp
@@ -48,6 +48,7 @@
#include "hpi_dsk.h"
#include "coretmpl.h" // BIT
+#include "ioprocs.h"
// Debugging
@@ -78,9 +79,12 @@ hpi_format::hpi_format()
(void)HPI_RED_IMAGE_SIZE;
}
-int hpi_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int hpi_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size)) {
+ return 0;
+ }
// we try to stay back and give only 50 points, since another image
// format may also have images of the same size (there is no header and no
@@ -142,12 +146,15 @@ bool hpi_format::geometry_from_size(uint64_t image_size , unsigned& heads , unsi
}
}
-bool hpi_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool hpi_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
unsigned heads;
unsigned cylinders;
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size)) {
+ return false;
+ }
if (!geometry_from_size(size, heads, cylinders)) {
return false;
}
@@ -161,7 +168,8 @@ bool hpi_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
// Suck in the whole image
std::vector<uint8_t> image_data(size);
- io_generic_read(io, (void *)image_data.data(), 0, size);
+ size_t actual;
+ io.read_at(0, image_data.data(), size, actual);
// Get interleave factor from image
unsigned il = (unsigned)image_data[ IL_OFFSET ] * 256 + image_data[ IL_OFFSET + 1 ];
@@ -191,7 +199,7 @@ bool hpi_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
return true;
}
-bool hpi_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool hpi_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int tracks;
int heads;
@@ -206,7 +214,8 @@ bool hpi_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
while (get_next_sector(bitstream , pos , track_no , head_no , sector_no , sector_data)) {
if (track_no == cyl && head_no == head && sector_no < HPI_SECTORS) {
unsigned offset_in_image = chs_to_lba(cyl, head, sector_no, heads) * HPI_SECTOR_SIZE;
- io_generic_write(io, sector_data, offset_in_image, HPI_SECTOR_SIZE);
+ size_t actual;
+ io.write_at(offset_in_image, sector_data, HPI_SECTOR_SIZE, actual);
}
}
}
diff --git a/src/lib/formats/hpi_dsk.h b/src/lib/formats/hpi_dsk.h
index 38c70e91c33..ca8aa1ffe11 100644
--- a/src/lib/formats/hpi_dsk.h
+++ b/src/lib/formats/hpi_dsk.h
@@ -28,9 +28,9 @@ class hpi_format : public floppy_image_format_t
public:
hpi_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
virtual const char *extensions() const override;
diff --git a/src/lib/formats/hti_tape.cpp b/src/lib/formats/hti_tape.cpp
index 7f77e3f99df..8fbaeef91cc 100644
--- a/src/lib/formats/hti_tape.cpp
+++ b/src/lib/formats/hti_tape.cpp
@@ -10,6 +10,8 @@
#include "imageutl.h"
+#include "ioprocs.h"
+
static constexpr uint32_t OLD_FILE_MAGIC = 0x5441434f; // Magic value at start of old-format image file: "TACO"
static constexpr uint32_t FILE_MAGIC_DELTA = 0x48544930; // Magic value at start of delta-modulation image file: "HTI0"
@@ -47,22 +49,25 @@ hti_format_t::hti_format_t()
clear_tape();
}
-bool hti_format_t::load_tape(io_generic *io)
+bool hti_format_t::load_tape(util::random_read &io)
{
+ if (io.seek(0, SEEK_SET)) {
+ return false;
+ }
+
+ size_t actual;
uint8_t tmp[ 4 ];
- io_generic_read(io, tmp, 0, 4);
+ io.read(tmp, 4, actual);
auto magic = pick_integer_be(tmp , 0 , 4);
if (((m_img_format == HTI_DELTA_MOD_16_BITS || m_img_format == HTI_DELTA_MOD_17_BITS) && magic != FILE_MAGIC_DELTA && magic != OLD_FILE_MAGIC) ||
(m_img_format == HTI_MANCHESTER_MOD && magic != FILE_MAGIC_MANCHESTER)) {
return false;
}
- uint64_t offset = 4;
-
for (unsigned i = 0; i < no_of_tracks(); i++) {
tape_track_t& track = m_tracks[ i ];
- if (!load_track(io , offset , track , magic == OLD_FILE_MAGIC)) {
+ if (!load_track(io, track, magic == OLD_FILE_MAGIC)) {
clear_tape();
return false;
}
@@ -71,14 +76,15 @@ bool hti_format_t::load_tape(io_generic *io)
return true;
}
-void hti_format_t::save_tape(io_generic *io)
+void hti_format_t::save_tape(util::random_read_write &io)
{
+ io.seek(0, SEEK_SET);
+
+ size_t actual;
uint8_t tmp[ 4 ];
place_integer_be(tmp, 0, 4, m_img_format == HTI_MANCHESTER_MOD ? FILE_MAGIC_MANCHESTER : FILE_MAGIC_DELTA);
- io_generic_write(io, tmp, 0, 4);
-
- uint64_t offset = 4;
+ io.write(tmp, 4, actual);
for (unsigned i = 0; i < no_of_tracks(); i++) {
const tape_track_t& track = m_tracks[ i ];
@@ -87,18 +93,17 @@ void hti_format_t::save_tape(io_generic *io)
tape_track_t::const_iterator it_start;
for (tape_track_t::const_iterator it = track.cbegin(); it != track.cend(); ++it) {
if (it->first != next_pos) {
- dump_sequence(io , offset , it_start , n_words);
+ dump_sequence(io, it_start, n_words);
it_start = it;
n_words = 0;
}
next_pos = it->first + word_length(it->second);
n_words++;
}
- dump_sequence(io , offset , it_start , n_words);
+ dump_sequence(io, it_start, n_words);
// End of track
place_integer_le(tmp, 0, 4, (uint32_t)-1);
- io_generic_write(io, tmp, offset, 4);
- offset += 4;
+ io.write(tmp, 4, actual);
}
}
@@ -374,8 +379,9 @@ bool hti_format_t::next_gap(unsigned track_no , tape_pos_t& pos , bool forward ,
return n_gaps == 0;
}
-bool hti_format_t::load_track(io_generic *io , uint64_t& offset , tape_track_t& track , bool old_format)
+bool hti_format_t::load_track(util::random_read &io , tape_track_t& track , bool old_format)
{
+ size_t actual;
uint8_t tmp[ 4 ];
uint32_t tmp32;
tape_pos_t delta_pos = 0;
@@ -385,8 +391,7 @@ bool hti_format_t::load_track(io_generic *io , uint64_t& offset , tape_track_t&
while (1) {
// Read no. of words to follow
- io_generic_read(io, tmp, offset, 4);
- offset += 4;
+ io.read(tmp, 4, actual);
tmp32 = pick_integer_le(tmp, 0, 4);
@@ -398,8 +403,7 @@ bool hti_format_t::load_track(io_generic *io , uint64_t& offset , tape_track_t&
unsigned n_words = tmp32;
// Read tape position of block
- io_generic_read(io, tmp, offset, 4);
- offset += 4;
+ io.read(tmp, 4, actual);
tmp32 = pick_integer_le(tmp, 0, 4);
@@ -411,8 +415,7 @@ bool hti_format_t::load_track(io_generic *io , uint64_t& offset , tape_track_t&
for (unsigned i = 0; i < n_words; i++) {
uint16_t tmp16;
- io_generic_read(io, tmp, offset, 2);
- offset += 2;
+ io.read(tmp, 2, actual);
tmp16 = pick_integer_le(tmp, 0, 2);
if (!old_format) {
@@ -469,19 +472,18 @@ bool hti_format_t::load_track(io_generic *io , uint64_t& offset , tape_track_t&
}
}
-void hti_format_t::dump_sequence(io_generic *io , uint64_t& offset , tape_track_t::const_iterator it_start , unsigned n_words)
+void hti_format_t::dump_sequence(util::random_read_write &io , tape_track_t::const_iterator it_start , unsigned n_words)
{
if (n_words) {
+ size_t actual;
uint8_t tmp[ 8 ];
place_integer_le(tmp, 0, 4, n_words);
place_integer_le(tmp, 4, 4, it_start->first);
- io_generic_write(io, tmp, offset, 8);
- offset += 8;
+ io.write(tmp, 8, actual);
for (unsigned i = 0; i < n_words; i++) {
place_integer_le(tmp, 0, 2, it_start->second);
- io_generic_write(io, tmp, offset, 2);
- offset += 2;
+ io.write(tmp, 2, actual);
++it_start;
}
}
diff --git a/src/lib/formats/hti_tape.h b/src/lib/formats/hti_tape.h
index 7725b87fa2a..373c971d174 100644
--- a/src/lib/formats/hti_tape.h
+++ b/src/lib/formats/hti_tape.h
@@ -13,10 +13,12 @@
#pragma once
-#include "ioprocs.h"
+#include "utilfwd.h"
+#include <cstdint>
#include <map>
+
class hti_format_t
{
public:
@@ -71,8 +73,8 @@ public:
// Return number of tracks
unsigned no_of_tracks() const { return m_img_format == HTI_MANCHESTER_MOD ? 1 : 2; }
- bool load_tape(io_generic *io);
- void save_tape(io_generic *io);
+ bool load_tape(util::random_read &io);
+ void save_tape(util::random_read_write &io);
void clear_tape();
// Return physical length of a bit on tape
@@ -127,8 +129,8 @@ private:
// Image format
image_format_t m_img_format;
- bool load_track(io_generic *io , uint64_t& offset , tape_track_t& track , bool old_format);
- static void dump_sequence(io_generic *io , uint64_t& offset , tape_track_t::const_iterator it_start , unsigned n_words);
+ bool load_track(util::random_read &io , tape_track_t& track , bool old_format);
+ static void dump_sequence(util::random_read_write &io , tape_track_t::const_iterator it_start , unsigned n_words);
tape_pos_t word_end_pos(const track_iterator_t& it) const;
void adjust_it(tape_track_t& track , track_iterator_t& it , tape_pos_t pos) const;
diff --git a/src/lib/formats/hxchfe_dsk.cpp b/src/lib/formats/hxchfe_dsk.cpp
index 68360f4e9bb..15598bbd746 100644
--- a/src/lib/formats/hxchfe_dsk.cpp
+++ b/src/lib/formats/hxchfe_dsk.cpp
@@ -101,6 +101,9 @@
#include "hxchfe_dsk.h"
+#include "ioprocs.h"
+
+
#define HFE_FORMAT_HEADER "HXCPICFE"
#define HEADER_LENGTH 512
@@ -144,19 +147,21 @@ bool hfe_format::supports_save() const
return true;
}
-int hfe_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int hfe_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t header[8];
- io_generic_read(io, &header, 0, sizeof(header));
+ size_t actual;
+ io.read_at(0, &header, sizeof(header), actual);
if ( memcmp( header, HFE_FORMAT_HEADER, 8 ) ==0) {
return 100;
}
return 0;
}
-bool hfe_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool hfe_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
uint8_t header[HEADER_LENGTH];
uint8_t track_table[TRACK_TABLE_LENGTH];
@@ -164,7 +169,7 @@ bool hfe_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
image->get_maximal_geometry(drivecyl, driveheads);
// read header
- io_generic_read(io, header, 0, HEADER_LENGTH);
+ io.read_at(0, header, HEADER_LENGTH, actual);
// get values
// Format revision must be 0
@@ -236,7 +241,7 @@ bool hfe_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
// read track lookup table (multiple of 512)
int table_offset = (header[18] & 0xff) | ((header[19] & 0xff)<<8);
- io_generic_read(io, track_table, table_offset<<9, TRACK_TABLE_LENGTH);
+ io.read_at(table_offset<<9, track_table, TRACK_TABLE_LENGTH, actual);
for (int i=0; i < m_cylinders; i++)
{
@@ -252,7 +257,7 @@ bool hfe_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
// The HFE format defines an interleave of the two sides per cylinder
// at every 256 bytes
cylinder_buffer.resize(m_cyl_length[cyl]);
- io_generic_read(io, &cylinder_buffer[0], m_cyl_offset[cyl]<<9, m_cyl_length[cyl]);
+ io.read_at(m_cyl_offset[cyl]<<9, &cylinder_buffer[0], m_cyl_length[cyl], actual);
generate_track_from_hfe_bitstream(cyl, 0, samplelength, &cylinder_buffer[0], m_cyl_length[cyl], image);
if (m_heads == 2)
@@ -412,8 +417,9 @@ void hfe_format::generate_track_from_hfe_bitstream(int cyl, int head, int sample
image->set_write_splice_position(cyl, head, 0, 0);
}
-bool hfe_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool hfe_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
std::vector<uint8_t> cylbuf;
// Create a buffer that is big enough to handle HD formats. We don't
@@ -484,7 +490,7 @@ bool hfe_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
header[13] = (m_bit_rate >> 8) & 0xff;
// Now write the header
- io_generic_write(io, header, 0, HEADER_LENGTH);
+ io.write_at(0, header, HEADER_LENGTH, actual);
// Set up the track lookup table
// We need the encoding value to be sure about the track length
@@ -505,10 +511,10 @@ bool hfe_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
for (int i=m_cylinders*4; i < TRACK_TABLE_LENGTH; i++)
track_table[i] = 0xff;
- io_generic_write(io, track_table, 0x200, TRACK_TABLE_LENGTH);
+ io.write_at(0x200, track_table, TRACK_TABLE_LENGTH, actual);
}
// Write the current cylinder
- io_generic_write(io, &cylbuf[0], m_cyl_offset[cyl]<<9, (m_cyl_length[cyl] + 0x1ff) & 0xfe00);
+ io.write_at(m_cyl_offset[cyl]<<9, &cylbuf[0], (m_cyl_length[cyl] + 0x1ff) & 0xfe00, actual);
}
return true;
}
diff --git a/src/lib/formats/hxchfe_dsk.h b/src/lib/formats/hxchfe_dsk.h
index 9d2dbdeae77..4ea98ed861c 100644
--- a/src/lib/formats/hxchfe_dsk.h
+++ b/src/lib/formats/hxchfe_dsk.h
@@ -47,9 +47,9 @@ public:
hfe_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/hxcmfm_dsk.cpp b/src/lib/formats/hxcmfm_dsk.cpp
index b6845b28e4a..e7bf03acd2f 100644
--- a/src/lib/formats/hxcmfm_dsk.cpp
+++ b/src/lib/formats/hxcmfm_dsk.cpp
@@ -1,10 +1,11 @@
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert
-#include <cassert>
-
#include "hxcmfm_dsk.h"
+#include "ioprocs.h"
+
+
#define MFM_FORMAT_HEADER "HXCMFM"
#pragma pack(1)
@@ -57,24 +58,26 @@ bool mfm_format::supports_save() const
return true;
}
-int mfm_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int mfm_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t header[7];
- io_generic_read(io, &header, 0, sizeof(header));
+ size_t actual;
+ io.read_at(0, &header, sizeof(header), actual);
if ( memcmp( header, MFM_FORMAT_HEADER, 6 ) ==0) {
return 100;
}
return 0;
}
-bool mfm_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool mfm_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
MFMIMG header;
MFMTRACKIMG trackdesc;
// read header
- io_generic_read(io, &header, 0, sizeof(header));
+ io.read_at(0, &header, sizeof(header), actual);
int drivecyl, driveheads;
image->get_maximal_geometry(drivecyl, driveheads);
@@ -86,12 +89,12 @@ bool mfm_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
for(int side=0; side < header.number_of_side; side++) {
if (!skip_odd || track%2 == 0) {
// read location of
- io_generic_read(io, &trackdesc,(header.mfmtracklistoffset)+( counter *sizeof(trackdesc)),sizeof(trackdesc));
+ io.read_at((header.mfmtracklistoffset)+( counter *sizeof(trackdesc)), &trackdesc, sizeof(trackdesc), actual);
trackbuf.resize(trackdesc.mfmtracksize);
// actual data read
- io_generic_read(io, &trackbuf[0], trackdesc.mfmtrackoffset, trackdesc.mfmtracksize);
+ io.read_at(trackdesc.mfmtrackoffset, &trackbuf[0], trackdesc.mfmtracksize, actual);
if (skip_odd) {
generate_track_from_bitstream(track/2, side, &trackbuf[0], trackdesc.mfmtracksize*8, image);
@@ -109,9 +112,10 @@ bool mfm_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
return true;
}
-bool mfm_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool mfm_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
// TODO: HD support
+ size_t actual;
MFMIMG header;
int track_count, head_count;
image->get_actual_geometry(track_count, head_count);
@@ -124,7 +128,7 @@ bool mfm_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
header.floppyiftype = 4;
header.mfmtracklistoffset = sizeof(MFMIMG);
- io_generic_write(io, &header, 0, sizeof(MFMIMG));
+ io.write_at(0, &header, sizeof(MFMIMG), actual);
int tpos = sizeof(MFMIMG);
int dpos = tpos + track_count*head_count*sizeof(MFMTRACKIMG);
@@ -143,8 +147,8 @@ bool mfm_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
trackdesc.mfmtracksize = packed.size();
trackdesc.mfmtrackoffset = dpos;
- io_generic_write(io, &trackdesc, tpos, sizeof(MFMTRACKIMG));
- io_generic_write(io, packed.data(), dpos, packed.size());
+ io.write_at(tpos, &trackdesc, sizeof(MFMTRACKIMG), actual);
+ io.write_at(dpos, packed.data(), packed.size(), actual);
tpos += sizeof(MFMTRACKIMG);
dpos += packed.size();
diff --git a/src/lib/formats/hxcmfm_dsk.h b/src/lib/formats/hxcmfm_dsk.h
index a6f884ab03e..c42190f3aae 100644
--- a/src/lib/formats/hxcmfm_dsk.h
+++ b/src/lib/formats/hxcmfm_dsk.h
@@ -19,9 +19,9 @@ class mfm_format : public floppy_image_format_t
public:
mfm_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/ibmxdf_dsk.cpp b/src/lib/formats/ibmxdf_dsk.cpp
index b18ffad63dc..5a44290a337 100644
--- a/src/lib/formats/ibmxdf_dsk.cpp
+++ b/src/lib/formats/ibmxdf_dsk.cpp
@@ -32,6 +32,8 @@
#include "ibmxdf_dsk.h"
+#include "ioprocs.h"
+
ibmxdf_format::ibmxdf_format() : wd177x_format(formats)
{
@@ -52,7 +54,7 @@ const char *ibmxdf_format::extensions() const
return "xdf,img";
}
-int ibmxdf_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int ibmxdf_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
int type = find_size(io, form_factor, variants);
@@ -61,9 +63,11 @@ int ibmxdf_format::identify(io_generic *io, uint32_t form_factor, const std::vec
return 0;
}
-int ibmxdf_format::find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int ibmxdf_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return -1;
if (size != 1884160)
return -1;
@@ -173,7 +177,7 @@ const ibmxdf_format::format ibmxdf_format::formats_head1_track0[] = {
{}
};
-bool ibmxdf_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool ibmxdf_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
int type = find_size(io, form_factor, variants);
if(type == -1)
@@ -207,8 +211,9 @@ bool ibmxdf_format::load(io_generic *io, uint32_t form_factor, const std::vector
desc[16].p1 = get_track_dam_mfm(tf, head, track);
build_sector_description(tf, sectdata, sectors, track, head);
- int track_size = compute_track_size(f) * 2; // read both sides at once
- io_generic_read(io, sectdata, get_image_offset(f, head, track), track_size);
+ int const track_size = compute_track_size(f) * 2; // read both sides at once
+ size_t actual;
+ io.read_at(get_image_offset(f, head, track), sectdata, track_size, actual);
generate_track(desc, track, head, sectors, tf.sector_count, total_size, image);
}
diff --git a/src/lib/formats/ibmxdf_dsk.h b/src/lib/formats/ibmxdf_dsk.h
index 6d37142ac30..dbb448f8ad3 100644
--- a/src/lib/formats/ibmxdf_dsk.h
+++ b/src/lib/formats/ibmxdf_dsk.h
@@ -23,11 +23,11 @@ public:
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override { return false; }
- virtual int find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual int get_image_offset(const format &f, int head, int track) override;
virtual const wd177x_format::format &get_track_format(const format &f, int head, int track) override;
diff --git a/src/lib/formats/imd_dsk.cpp b/src/lib/formats/imd_dsk.cpp
index b3d4eac8229..b0e9a4159d9 100644
--- a/src/lib/formats/imd_dsk.cpp
+++ b/src/lib/formats/imd_dsk.cpp
@@ -10,7 +10,8 @@
#include "imd_dsk.h"
-#include <cassert>
+#include "ioprocs.h"
+
#include <cstring>
@@ -409,25 +410,29 @@ void imd_format::fixnum(char *start, char *end) const
};
}
-int imd_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int imd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
char h[4];
- io_generic_read(io, h, 0, 4);
+ size_t actual;
+ io.read_at(0, h, 4, actual);
if(!memcmp(h, "IMD ", 4))
return 100;
return 0;
}
-bool imd_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool imd_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return false;
std::vector<uint8_t> img(size);
- io_generic_read(io, &img[0], 0, size);
+ size_t actual;
+ io.read_at(0, &img[0], size, actual);
uint64_t pos, savepos;
- for(pos=0; pos < size && img[pos] != 0x1a; pos++) {};
+ for(pos=0; pos < size && img[pos] != 0x1a; pos++) { }
pos++;
m_comment.resize(pos);
@@ -627,39 +632,34 @@ bool can_compress(const uint8_t* buffer, uint8_t ptrn, uint64_t size)
return true;
}
-bool imd_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool imd_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint64_t pos = 0;
- io_generic_write(io, &m_comment[0], pos, m_comment.size());
- pos += m_comment.size();
+ if(io.seek(0, SEEK_SET))
+ return false;
+
+ size_t written;
+ io.write(&m_comment[0], m_comment.size(), written);
for (int i = 0; i < m_mode.size(); i++)
{
- io_generic_write(io, &m_mode[i], pos++, 1);
- io_generic_write(io, &m_track[i], pos++, 1);
- io_generic_write(io, &m_head[i], pos++, 1);
- io_generic_write(io, &m_sector_count[i], pos++, 1);
- io_generic_write(io, &m_ssize[i], pos++, 1);
+ io.write(&m_mode[i], 1, written);
+ io.write(&m_track[i], 1, written);
+ io.write(&m_head[i], 1, written);
+ io.write(&m_sector_count[i], 1, written);
+ io.write(&m_ssize[i], 1, written);
- io_generic_write(io, &m_snum[i][0], pos, m_sector_count[i]);
- pos += m_sector_count[i];
+ io.write(&m_snum[i][0], m_sector_count[i], written);
if (m_tnum[i].size())
- {
- io_generic_write(io, &m_tnum[i][0], pos, m_sector_count[i]);
- pos += m_sector_count[i];
- }
+ io.write(&m_tnum[i][0], m_sector_count[i], written);
if (m_hnum[i].size())
- {
- io_generic_write(io, &m_hnum[i][0], pos, m_sector_count[i]);
- pos += m_sector_count[i];
- }
+ io.write(&m_hnum[i][0], m_sector_count[i], written);
- uint32_t actual_size = m_ssize[i] < 7 ? 128 << m_ssize[i] : 8192;
- uint8_t head = m_head[i] & 0x3f;
+ uint32_t const actual_size = m_ssize[i] < 7 ? 128 << m_ssize[i] : 8192;
+ uint8_t const head = m_head[i] & 0x3f;
- bool fm = m_mode[i]< 3;
+ bool const fm = m_mode[i]< 3;
auto bitstream = generate_bitstream_from_track(m_track[i]*m_trackmult, head, fm ? 4000 : 2000, image);
std::vector<std::vector<uint8_t>> sectors;
@@ -674,11 +674,10 @@ bool imd_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
const auto &data = sectors[m_snum[i][j]];
- uint8_t mode;
if (data.empty())
{
- mode = 0;
- io_generic_write(io, &mode, pos++, 1);
+ uint8_t const mode = 0;
+ io.write(&mode, 1, written);
continue;
}
else if (data.size() < actual_size) {
@@ -690,16 +689,15 @@ bool imd_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
if (can_compress(sdata, sdata[0], actual_size))
{
- mode = 2;
- io_generic_write(io, &mode, pos++, 1);
- io_generic_write(io, &sdata[0], pos++, 1);
+ uint8_t const mode = 2;
+ io.write(&mode, 1, written);
+ io.write(&sdata[0], 1, written);
}
else
{
- mode = 1;
- io_generic_write(io, &mode, pos++, 1);
- io_generic_write(io, &sdata, pos, actual_size);
- pos += actual_size;
+ uint8_t const mode = 1;
+ io.write(&mode, 1, written);
+ io.write(&sdata, actual_size, written);
}
}
}
diff --git a/src/lib/formats/imd_dsk.h b/src/lib/formats/imd_dsk.h
index ba04a0c09e7..acf7da9b892 100644
--- a/src/lib/formats/imd_dsk.h
+++ b/src/lib/formats/imd_dsk.h
@@ -17,9 +17,9 @@ class imd_format : public floppy_image_format_t
public:
imd_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image* image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image* image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/img_dsk.cpp b/src/lib/formats/img_dsk.cpp
index 757f695d923..73ae499c764 100644
--- a/src/lib/formats/img_dsk.cpp
+++ b/src/lib/formats/img_dsk.cpp
@@ -17,6 +17,7 @@
#include "img_dsk.h"
#include "coretmpl.h" // BIT
+#include "ioprocs.h"
// Debugging
@@ -40,9 +41,12 @@ img_format::img_format()
{
}
-int img_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int img_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size)) {
+ return 0;
+ }
if (((form_factor == floppy_image::FF_8) || (form_factor == floppy_image::FF_UNKNOWN)) &&
size == IMG_IMAGE_SIZE) {
@@ -52,17 +56,18 @@ int img_format::identify(io_generic *io, uint32_t form_factor, const std::vector
}
}
-bool img_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool img_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint64_t size = io_generic_size(io);
- if (size != IMG_IMAGE_SIZE) {
+ uint64_t size;
+ if (io.length(size) || (size != IMG_IMAGE_SIZE)) {
return false;
}
image->set_variant(floppy_image::SSDD);
// Suck in the whole image
std::vector<uint8_t> image_data(size);
- io_generic_read(io, (void *)image_data.data(), 0, size);
+ size_t actual;
+ io.read_at(0, image_data.data(), size, actual);
for (unsigned cyl = 0; cyl < TRACKS; cyl++) {
std::vector<uint32_t> track_data;
@@ -96,7 +101,7 @@ bool img_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
return true;
}
-bool img_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool img_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
for (int cyl = 0; cyl < TRACKS; cyl++) {
auto bitstream = generate_bitstream_from_track(cyl , 0 , CELL_SIZE , image , 0);
@@ -106,7 +111,8 @@ bool img_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
while (get_next_sector(bitstream , pos , track_no , sector_no , sector_data)) {
if (track_no == cyl && sector_no >= 1 && sector_no <= SECTORS) {
unsigned offset_in_image = (cyl * SECTORS + sector_no - 1) * SECTOR_SIZE;
- io_generic_write(io, sector_data, offset_in_image, SECTOR_SIZE);
+ size_t actual;
+ io.write_at(offset_in_image, sector_data, SECTOR_SIZE, actual);
}
}
}
diff --git a/src/lib/formats/img_dsk.h b/src/lib/formats/img_dsk.h
index af9a2d62466..bbd7a0fc03e 100644
--- a/src/lib/formats/img_dsk.h
+++ b/src/lib/formats/img_dsk.h
@@ -27,9 +27,9 @@ public:
img_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
virtual const char *extensions() const override;
diff --git a/src/lib/formats/ioprocs.cpp b/src/lib/formats/ioprocs.cpp
deleted file mode 100644
index 78e009aa112..00000000000
--- a/src/lib/formats/ioprocs.cpp
+++ /dev/null
@@ -1,214 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Nathan Woods
-#include <cstdio>
-#include <cstring>
-#include <cassert>
-#include "ioprocs.h"
-#include "corefile.h"
-
-
-/*********************************************************************
- ioprocs implementation on stdio
-*********************************************************************/
-
-static void stdio_closeproc(void *file)
-{
- fclose((FILE*)file);
-}
-
-static int stdio_seekproc(void *file, int64_t offset, int whence)
-{
- return fseek((FILE*)file, (long) offset, whence);
-}
-
-static size_t stdio_readproc(void *file, void *buffer, size_t length)
-{
- return fread(buffer, 1, length, (FILE*)file);
-}
-
-static size_t stdio_writeproc(void *file, const void *buffer, size_t length)
-{
- return fwrite(buffer, 1, length, (FILE*)file);
-}
-
-static uint64_t stdio_filesizeproc(void *file)
-{
- long l, sz;
- l = ftell((FILE*)file);
- if (fseek((FILE*)file, 0, SEEK_END))
- return (size_t) -1;
- sz = ftell((FILE*)file);
- if (fseek((FILE*)file, l, SEEK_SET))
- return (size_t) -1;
- return (size_t) sz;
-}
-
-const struct io_procs stdio_ioprocs =
-{
- stdio_closeproc,
- stdio_seekproc,
- stdio_readproc,
- stdio_writeproc,
- stdio_filesizeproc
-};
-
-const struct io_procs stdio_ioprocs_noclose =
-{
- nullptr,
- stdio_seekproc,
- stdio_readproc,
- stdio_writeproc,
- stdio_filesizeproc
-};
-
-/*********************************************************************
- ioprocs implementation on corefile
-*********************************************************************/
-
-static void corefile_closeproc(void *file)
-{
- delete (util::core_file*)file;
-}
-
-static int corefile_seekproc(void *file, int64_t offset, int whence)
-{
- return ((util::core_file*)file)->seek(offset, whence);
-}
-
-static size_t corefile_readproc(void *file, void *buffer, size_t length)
-{
- return ((util::core_file*)file)->read(buffer, length);
-}
-
-static size_t corefile_writeproc(void *file, const void *buffer, size_t length)
-{
- return ((util::core_file*)file)->write(buffer, length);
-}
-
-static uint64_t corefile_filesizeproc(void *file)
-{
- const auto l = ((util::core_file*)file)->tell();
- if (((util::core_file*)file)->seek(0, SEEK_END))
- return (size_t) -1;
- const auto sz = ((util::core_file*)file)->tell();
- if (((util::core_file*)file)->seek(l, SEEK_SET))
- return uint64_t(-1);
- return uint64_t(sz);
-}
-
-const struct io_procs corefile_ioprocs =
-{
- corefile_closeproc,
- corefile_seekproc,
- corefile_readproc,
- corefile_writeproc,
- corefile_filesizeproc
-};
-
-const struct io_procs corefile_ioprocs_noclose =
-{
- nullptr,
- corefile_seekproc,
- corefile_readproc,
- corefile_writeproc,
- corefile_filesizeproc
-};
-
-
-
-/*********************************************************************
- calls for accessing generic IO
-*********************************************************************/
-
-static void io_generic_seek(struct io_generic *genio, uint64_t offset)
-{
- genio->procs->seekproc(genio->file, offset, SEEK_SET);
-}
-
-
-
-void io_generic_close(struct io_generic *genio)
-{
- if (genio->procs->closeproc)
- genio->procs->closeproc(genio->file);
-}
-
-
-
-void io_generic_read(struct io_generic *genio, void *buffer, uint64_t offset, size_t length)
-{
- uint64_t size;
- size_t bytes_read;
-
- size = io_generic_size(genio);
- if (size <= offset)
- {
- bytes_read = 0;
- }
- else
- {
- io_generic_seek(genio, offset);
- bytes_read = genio->procs->readproc(genio->file, buffer, length);
- }
- memset(((uint8_t *) buffer) + bytes_read, genio->filler, length - bytes_read);
-}
-
-
-
-void io_generic_write(struct io_generic *genio, const void *buffer, uint64_t offset, size_t length)
-{
- uint64_t filler_size = 0;
- char filler_buffer[1024];
- size_t bytes_to_write;
- uint64_t size;
-
- size = io_generic_size(genio);
-
- if (size < offset)
- {
- filler_size = offset - size;
- offset = size;
- }
-
- io_generic_seek(genio, offset);
-
- if (filler_size)
- {
- memset(filler_buffer, genio->filler, sizeof(filler_buffer));
- do
- {
- bytes_to_write = (filler_size > sizeof(filler_buffer)) ? sizeof(filler_buffer) : (size_t) filler_size;
- genio->procs->writeproc(genio->file, filler_buffer, bytes_to_write);
- filler_size -= bytes_to_write;
- }
- while(filler_size > 0);
- }
-
- if (length > 0)
- genio->procs->writeproc(genio->file, buffer, length);
-}
-
-
-
-void io_generic_write_filler(struct io_generic *genio, uint8_t filler, uint64_t offset, size_t length)
-{
- uint8_t buffer[512];
- size_t this_length;
-
- memset(buffer, filler, std::min(length, sizeof(buffer)));
-
- while(length > 0)
- {
- this_length = std::min(length, sizeof(buffer));
- io_generic_write(genio, buffer, offset, this_length);
- offset += this_length;
- length -= this_length;
- }
-}
-
-
-
-uint64_t io_generic_size(struct io_generic *genio)
-{
- return genio->procs->filesizeproc(genio->file);
-}
diff --git a/src/lib/formats/ioprocs.h b/src/lib/formats/ioprocs.h
deleted file mode 100644
index 1244873f14c..00000000000
--- a/src/lib/formats/ioprocs.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Nathan Woods
-/*********************************************************************
-
- ioprocs.h
-
- File IO abstraction layer
-
-*********************************************************************/
-#ifndef MAME_FORMATS_IOPROCS_H
-#define MAME_FORMATS_IOPROCS_H
-
-#pragma once
-
-#include <cstdint>
-#include <cstdlib>
-
-
-
-/***************************************************************************
-
- Type definitions
-
-***************************************************************************/
-
-struct io_procs
-{
- void (*closeproc)(void *file) = nullptr;
- int (*seekproc)(void *file, int64_t offset, int whence) = nullptr;
- size_t (*readproc)(void *file, void *buffer, size_t length) = nullptr;
- size_t (*writeproc)(void *file, const void *buffer, size_t length) = nullptr;
- uint64_t (*filesizeproc)(void *file) = nullptr;
-};
-
-
-
-struct io_generic
-{
- const struct io_procs *procs = nullptr;
- void *file = nullptr;
- uint8_t filler = 0;
-};
-
-
-/***************************************************************************
-
- Globals
-
-***************************************************************************/
-
-extern const io_procs stdio_ioprocs;
-extern const io_procs stdio_ioprocs_noclose;
-extern const io_procs corefile_ioprocs;
-extern const io_procs corefile_ioprocs_noclose;
-
-
-
-/***************************************************************************
-
- Prototypes
-
-***************************************************************************/
-
-void io_generic_close(struct io_generic *genio);
-void io_generic_read(struct io_generic *genio, void *buffer, uint64_t offset, size_t length);
-void io_generic_write(struct io_generic *genio, const void *buffer, uint64_t offset, size_t length);
-void io_generic_write_filler(struct io_generic *genio, uint8_t filler, uint64_t offset, size_t length);
-uint64_t io_generic_size(struct io_generic *genio);
-
-#endif // MAME_FORMATS_IOPROCS_H
diff --git a/src/lib/formats/ipf_dsk.cpp b/src/lib/formats/ipf_dsk.cpp
index 0f1725f5c14..10c9ba2c4a9 100644
--- a/src/lib/formats/ipf_dsk.cpp
+++ b/src/lib/formats/ipf_dsk.cpp
@@ -2,6 +2,8 @@
// copyright-holders:Olivier Galibert
#include "ipf_dsk.h"
+#include "ioprocs.h"
+
#include <cassert>
@@ -27,11 +29,12 @@ bool ipf_format::supports_save() const
return false;
}
-int ipf_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int ipf_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
static const uint8_t refh[12] = { 0x43, 0x41, 0x50, 0x53, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0xd5, 0x73, 0xba };
uint8_t h[12];
- io_generic_read(io, h, 0, 12);
+ size_t actual;
+ io.read_at(0, h, 12, actual);
if(!memcmp(h, refh, 12))
return 100;
@@ -39,14 +42,16 @@ int ipf_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool ipf_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool ipf_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- ipf_decode dec;
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return false;
std::vector<uint8_t> data(size);
- io_generic_read(io, &data[0], 0, size);
- bool res = dec.parse(data, image);
- return res;
+ size_t actual;
+ io.read_at(0, &data[0], size, actual);
+ ipf_decode dec;
+ return dec.parse(data, image);
}
uint32_t ipf_format::ipf_decode::r32(const uint8_t *p)
diff --git a/src/lib/formats/ipf_dsk.h b/src/lib/formats/ipf_dsk.h
index d848a5bb3a0..28d552d5812 100644
--- a/src/lib/formats/ipf_dsk.h
+++ b/src/lib/formats/ipf_dsk.h
@@ -12,8 +12,8 @@
class ipf_format : public floppy_image_format_t
{
public:
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/jfd_dsk.cpp b/src/lib/formats/jfd_dsk.cpp
index 947d6ba4022..7a1da472356 100644
--- a/src/lib/formats/jfd_dsk.cpp
+++ b/src/lib/formats/jfd_dsk.cpp
@@ -158,9 +158,13 @@
*********************************************************************/
-#include <zlib.h>
#include "formats/jfd_dsk.h"
+#include "ioprocs.h"
+
+#include <zlib.h>
+
+
static const uint8_t JFD_HEADER[4] = { 'J', 'F', 'D', 'I' };
static const uint8_t GZ_HEADER[2] = { 0x1f, 0x8b };
@@ -183,11 +187,14 @@ const char *jfd_format::extensions() const
return "jfd";
}
-int jfd_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int jfd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return 0;
std::vector<uint8_t> img(size);
- io_generic_read(io, &img[0], 0, size);
+ size_t actual;
+ io.read_at(0, &img[0], size, actual);
int err;
std::vector<uint8_t> gz_ptr(4);
@@ -221,11 +228,15 @@ int jfd_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool jfd_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool jfd_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return false;
+
std::vector<uint8_t> img(size);
- io_generic_read(io, &img[0], 0, size);
+ size_t actual;
+ io.read_at(0, &img[0], size, actual);
int err;
std::vector<uint8_t> gz_ptr;
diff --git a/src/lib/formats/jfd_dsk.h b/src/lib/formats/jfd_dsk.h
index 75b9910c426..7231ccf3460 100644
--- a/src/lib/formats/jfd_dsk.h
+++ b/src/lib/formats/jfd_dsk.h
@@ -23,8 +23,8 @@ public:
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override;
};
diff --git a/src/lib/formats/jvc_dsk.cpp b/src/lib/formats/jvc_dsk.cpp
index 8332f86bace..c71f2c3be06 100644
--- a/src/lib/formats/jvc_dsk.cpp
+++ b/src/lib/formats/jvc_dsk.cpp
@@ -106,6 +106,8 @@
#include "jvc_dsk.h"
+#include "ioprocs.h"
+
jvc_format::jvc_format()
{
@@ -126,19 +128,22 @@ const char *jvc_format::extensions() const
return "jvc,dsk";
}
-bool jvc_format::parse_header(io_generic *io, int &header_size, int &tracks, int &heads, int &sectors, int &sector_size, int &base_sector_id)
+bool jvc_format::parse_header(util::random_read &io, int &header_size, int &tracks, int &heads, int &sectors, int &sector_size, int &base_sector_id)
{
// The JVC format has a header whose size is the size of the image modulo 256. Currently, we only
// handle up to five header bytes
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return false;
header_size = size % 256;
uint8_t header[5];
// if we know that this is a header of a bad size, we can fail immediately; otherwise read the header
+ size_t actual;
if (header_size >= sizeof(header))
return false;
if (header_size > 0)
- io_generic_read(io, header, 0, header_size);
+ io.read_at(0, header, header_size, actual);
// default values
heads = 1;
@@ -168,13 +173,13 @@ bool jvc_format::parse_header(io_generic *io, int &header_size, int &tracks, int
return tracks * heads * sectors * sector_size == (size - header_size);
}
-int jvc_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int jvc_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
int header_size, tracks, heads, sectors, sector_size, sector_base_id;
return parse_header(io, header_size, tracks, heads, sectors, sector_size, sector_base_id) ? 50 : 0;
}
-bool jvc_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool jvc_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
int header_size, track_count, head_count, sector_count, sector_size, sector_base_id;
@@ -210,7 +215,8 @@ bool jvc_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
sectors[interleave[i]].bad_crc = false;
sectors[interleave[i]].data = &sector_data[sector_offset];
- io_generic_read(io, sectors[interleave[i]].data, file_offset, sector_size);
+ size_t actual;
+ io.read_at(file_offset, sectors[interleave[i]].data, sector_size, actual);
sector_offset += sector_size;
file_offset += sector_size;
@@ -223,7 +229,7 @@ bool jvc_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
return true;
}
-bool jvc_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool jvc_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
uint64_t file_offset = 0;
@@ -236,7 +242,8 @@ bool jvc_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
uint8_t header[2];
header[0] = 18;
header[1] = 2;
- io_generic_write(io, header, file_offset, sizeof(header));
+ size_t actual;
+ io.write_at(file_offset, header, sizeof(header), actual);
file_offset += sizeof(header);
}
@@ -256,7 +263,8 @@ bool jvc_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
return false;
}
- io_generic_write(io, sectors[1 + i].data(), file_offset, 256);
+ size_t actual;
+ io.write_at(file_offset, sectors[1 + i].data(), 256, actual);
file_offset += 256;
}
}
diff --git a/src/lib/formats/jvc_dsk.h b/src/lib/formats/jvc_dsk.h
index 7c744a0acb5..1b8b59c725f 100644
--- a/src/lib/formats/jvc_dsk.h
+++ b/src/lib/formats/jvc_dsk.h
@@ -35,13 +35,13 @@ public:
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override;
private:
- bool parse_header(io_generic *io, int &header_size, int &tracks, int &heads, int &sectors, int &sector_size, int &base_sector_id);
+ bool parse_header(util::random_read &io, int &header_size, int &tracks, int &heads, int &sectors, int &sector_size, int &base_sector_id);
};
extern const floppy_format_type FLOPPY_JVC_FORMAT;
diff --git a/src/lib/formats/m20_dsk.cpp b/src/lib/formats/m20_dsk.cpp
index 60b2ae58176..05c52c2f211 100644
--- a/src/lib/formats/m20_dsk.cpp
+++ b/src/lib/formats/m20_dsk.cpp
@@ -16,6 +16,9 @@
#include "m20_dsk.h"
+#include "ioprocs.h"
+
+
m20_format::m20_format()
{
}
@@ -40,21 +43,27 @@ bool m20_format::supports_save() const
return true;
}
-int m20_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int m20_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- if(io_generic_size(io) == 286720)
+ uint64_t size;
+ if (io.length(size))
+ return 0;
+
+ if (size == 286720)
return 50;
+
return 0;
}
-bool m20_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool m20_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
for (int track = 0; track < 35; track++)
for (int head = 0; head < 2; head ++) {
bool mfm = track || head;
desc_pc_sector sects[16];
uint8_t sectdata[16*256];
- io_generic_read(io, sectdata, 16*256*(track*2+head), 16*256);
+ size_t actual;
+ io.read_at(16*256*(track*2+head), sectdata, 16*256, actual);
for (int i = 0; i < 16; i++) {
int j = i/2 + (i & 1 ? 0 : 8);
sects[i].track = track;
@@ -76,7 +85,7 @@ bool m20_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
return true;
}
-bool m20_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool m20_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
uint64_t file_offset = 0;
@@ -87,26 +96,27 @@ bool m20_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
auto bitstream = generate_bitstream_from_track(0, 0, 4000, image);
auto sectors = extract_sectors_from_bitstream_fm_pc(bitstream);
- for (int i = 0; i < 16; i++)
- {
- io_generic_write(io, sectors[i + 1].data(), file_offset, 128);
+ for (int i = 0; i < 16; i++) {
+ size_t actual;
+ io.write_at(file_offset, sectors[i + 1].data(), 128, actual);
file_offset += 256; //128;
}
// rest are mfm tracks
- for (int track = 0; track < track_count; track++)
- {
- for (int head = 0; head < head_count; head++)
- {
+ for (int track = 0; track < track_count; track++) {
+ for (int head = 0; head < head_count; head++) {
// skip track 0, head 0
- if (track == 0) { if (head_count == 1) break; else head++; }
+ if (track == 0) {
+ if (head_count == 1) break;
+ else head++;
+ }
bitstream = generate_bitstream_from_track(track, head, 2000, image);
sectors = extract_sectors_from_bitstream_mfm_pc(bitstream);
- for (int i = 0; i < 16; i++)
- {
- io_generic_write(io, sectors[i + 1].data(), file_offset, 256);
+ for (int i = 0; i < 16; i++) {
+ size_t actual;
+ io.write_at(file_offset, sectors[i + 1].data(), 256, actual);
file_offset += 256;
}
}
diff --git a/src/lib/formats/m20_dsk.h b/src/lib/formats/m20_dsk.h
index ed8a7bc4517..d9bd7a45425 100644
--- a/src/lib/formats/m20_dsk.h
+++ b/src/lib/formats/m20_dsk.h
@@ -18,9 +18,9 @@ class m20_format : public floppy_image_format_t {
public:
m20_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/mdos_dsk.cpp b/src/lib/formats/mdos_dsk.cpp
index b96be2f327e..e49d825ea9a 100644
--- a/src/lib/formats/mdos_dsk.cpp
+++ b/src/lib/formats/mdos_dsk.cpp
@@ -50,7 +50,9 @@
*/
#include "mdos_dsk.h"
-#include "formats/imageutl.h"
+#include "imageutl.h"
+
+#include "ioprocs.h"
mdos_format::mdos_format() : wd177x_format(formats)
@@ -72,12 +74,13 @@ const char *mdos_format::extensions() const
return "dsk";
}
-int mdos_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int mdos_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- int type = find_size(io, form_factor, variants);
+ int type = find_size(io, form_factor, variants);
if (type != -1)
return 75;
+
return 0;
}
@@ -109,12 +112,15 @@ int mdos_format::parse_date_field(uint8_t *str)
return (high - 0x30) * 10 + (low - 0x30);
}
-int mdos_format::find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int mdos_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ size_t actual;
+ uint64_t size;
+ if (io.length(size))
+ return -1;
// Look at the disk id sector.
- io_generic_read(io, &info, 0, sizeof(struct disk_id_sector));
+ io.read_at(0, &info, sizeof(struct disk_id_sector), actual);
LOG_FORMATS("MDOS floppy dsk: size %d bytes, %d total sectors, %d remaining bytes, expected form factor %x\n", (uint32_t)size, (uint32_t)size / 128, (uint32_t)size % 128, form_factor);
@@ -176,8 +182,8 @@ int mdos_format::find_size(io_generic *io, uint32_t form_factor, const std::vect
// the extent of the disk are free or available.
uint8_t cluster_allocation[128], cluster_available[128];
- io_generic_read(io, &cluster_allocation, 1 * 128, sizeof(cluster_allocation));
- io_generic_read(io, &cluster_available, 2 * 128, sizeof(cluster_available));
+ io.read_at(1 * 128, &cluster_allocation, sizeof(cluster_allocation), actual);
+ io.read_at(2 * 128, &cluster_available, sizeof(cluster_available), actual);
for (int cluster = 0; cluster < sizeof(cluster_allocation) * 8; cluster++) {
if (cluster * 4 * 128 + 4 * 128 > size) {
diff --git a/src/lib/formats/mdos_dsk.h b/src/lib/formats/mdos_dsk.h
index 65e7bca9f14..56dd29c9954 100644
--- a/src/lib/formats/mdos_dsk.h
+++ b/src/lib/formats/mdos_dsk.h
@@ -19,8 +19,8 @@ public:
virtual const char *name() const override;
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual int find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual const wd177x_format::format &get_track_format(const format &f, int head, int track) override;
private:
diff --git a/src/lib/formats/mfi_dsk.cpp b/src/lib/formats/mfi_dsk.cpp
index 7670bf6bfb9..8272253c36a 100644
--- a/src/lib/formats/mfi_dsk.cpp
+++ b/src/lib/formats/mfi_dsk.cpp
@@ -1,10 +1,12 @@
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert
-#include <cassert>
-
#include "mfi_dsk.h"
+
+#include "ioprocs.h"
+
#include <zlib.h>
+
/*
Mess floppy image structure:
@@ -94,11 +96,12 @@ bool mfi_format::supports_save() const
return true;
}
-int mfi_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int mfi_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
header h;
- io_generic_read(io, &h, 0, sizeof(header));
+ size_t actual;
+ io.read_at(0, &h, sizeof(header), actual);
if(memcmp( h.sign, sign, 16 ) == 0 &&
(h.cyl_count & CYLINDER_MASK) <= 84 &&
(h.cyl_count >> RESOLUTION_SHIFT) < 3 &&
@@ -108,15 +111,16 @@ int mfi_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool mfi_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool mfi_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
header h;
entry entries[84*2*4];
- io_generic_read(io, &h, 0, sizeof(header));
+ io.read_at(0, &h, sizeof(header), actual);
int resolution = h.cyl_count >> RESOLUTION_SHIFT;
h.cyl_count &= CYLINDER_MASK;
- io_generic_read(io, &entries, sizeof(header), (h.cyl_count << resolution)*h.head_count*sizeof(entry));
+ io.read_at(sizeof(header), &entries, (h.cyl_count << resolution)*h.head_count*sizeof(entry), actual);
image->set_form_variant(h.form_factor, h.variant);
@@ -139,7 +143,7 @@ bool mfi_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
compressed.resize(ent->compressed_size);
- io_generic_read(io, &compressed[0], ent->offset, ent->compressed_size);
+ io.read_at(ent->offset, &compressed[0], ent->compressed_size, actual);
unsigned int cell_count = ent->uncompressed_size/4;
std::vector<uint32_t> &trackbuf = image->get_buffer(cyl >> 2, head, cyl & 3);;
@@ -169,8 +173,9 @@ bool mfi_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
return true;
}
-bool mfi_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool mfi_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
int tracks, heads;
image->get_actual_geometry(tracks, heads);
int resolution = image->get_resolution();
@@ -190,7 +195,7 @@ bool mfi_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
h.form_factor = image->get_form_factor();
h.variant = image->get_variant();
- io_generic_write(io, &h, 0, sizeof(header));
+ io.write_at(0, &h, sizeof(header), actual);
memset(entries, 0, sizeof(entries));
@@ -226,11 +231,11 @@ bool mfi_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
entries[epos].write_splice = image->get_write_splice_position(track >> 2, head, track & 3);
epos++;
- io_generic_write(io, postcomp.get(), pos, csize);
+ io.write_at(pos, postcomp.get(), csize, actual);
pos += csize;
}
- io_generic_write(io, entries, sizeof(header), (tracks << resolution)*heads*sizeof(entry));
+ io.write_at(sizeof(header), entries, (tracks << resolution)*heads*sizeof(entry), actual);
return true;
}
diff --git a/src/lib/formats/mfi_dsk.h b/src/lib/formats/mfi_dsk.h
index 129a9ee599e..d0dd36c3d68 100644
--- a/src/lib/formats/mfi_dsk.h
+++ b/src/lib/formats/mfi_dsk.h
@@ -12,9 +12,9 @@ class mfi_format : public floppy_image_format_t
public:
mfi_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/mfm_hd.cpp b/src/lib/formats/mfm_hd.cpp
index 98d8079443c..738f0999863 100644
--- a/src/lib/formats/mfm_hd.cpp
+++ b/src/lib/formats/mfm_hd.cpp
@@ -294,9 +294,9 @@ int mfmhd_generic_format::chs_to_lba(int cylinder, int head, int sector)
else return -1;
}
-chd_error mfmhd_generic_format::load(chd_file* chdfile, uint16_t* trackimage, int tracksize, int cylinder, int head)
+std::error_condition mfmhd_generic_format::load(chd_file* chdfile, uint16_t* trackimage, int tracksize, int cylinder, int head)
{
- chd_error state = CHDERR_NONE;
+ std::error_condition state;
uint8_t sector_content[16384];
int sectorcount = m_param.sectors_per_track;
@@ -382,8 +382,9 @@ chd_error mfmhd_generic_format::load(chd_file* chdfile, uint16_t* trackimage, in
int lbaposition = chs_to_lba(cylinder, head, sec_number);
if (lbaposition>=0)
{
- chd_error state = chdfile->read_units(lbaposition, sector_content);
- if (state != CHDERR_NONE) break;
+ state = chdfile->read_units(lbaposition, sector_content);
+ if (state)
+ break;
}
else
{
@@ -413,7 +414,7 @@ chd_error mfmhd_generic_format::load(chd_file* chdfile, uint16_t* trackimage, in
if (TRACE_LAYOUT) osd_printf_verbose("\n");
// Gap 4
- if (state == CHDERR_NONE)
+ if (!state)
{
// Fill the rest with 0x4e
mfm_encode(trackimage, position, 0x4e, tracksize-position);
@@ -433,7 +434,7 @@ enum
CHECK_CRC
};
-chd_error mfmhd_generic_format::save(chd_file* chdfile, uint16_t* trackimage, int tracksize, int current_cylinder, int current_head)
+std::error_condition mfmhd_generic_format::save(chd_file* chdfile, uint16_t* trackimage, int tracksize, int current_cylinder, int current_head)
{
if (TRACE_RWTRACK) osd_printf_verbose("%s: write back (c=%d,h=%d) to CHD\n", tag(), current_cylinder, current_head);
@@ -490,7 +491,7 @@ chd_error mfmhd_generic_format::save(chd_file* chdfile, uint16_t* trackimage, in
bool countgap3 = false;
bool countsync = false;
- chd_error chdstate = CHDERR_NONE;
+ std::error_condition chdstate;
if (TRACE_IMAGE)
{
@@ -643,7 +644,7 @@ chd_error mfmhd_generic_format::save(chd_file* chdfile, uint16_t* trackimage, in
if (TRACE_DETAIL) osd_printf_verbose("%s: Writing sector chs=(%d,%d,%d) to CHD\n", tag(), current_cylinder, current_head, sector);
chdstate = chdfile->write_units(chs_to_lba(current_cylinder, current_head, sector), buffer);
- if (chdstate != CHDERR_NONE)
+ if (chdstate)
{
osd_printf_verbose("%s: Write error while writing sector chs=(%d,%d,%d)\n", tag(), cylinder, head, sector);
}
diff --git a/src/lib/formats/mfm_hd.h b/src/lib/formats/mfm_hd.h
index 7d28adc518d..472062d1440 100644
--- a/src/lib/formats/mfm_hd.h
+++ b/src/lib/formats/mfm_hd.h
@@ -151,10 +151,10 @@ public:
virtual ~mfmhd_image_format_t() {};
// Load the image.
- virtual chd_error load(chd_file* chdfile, uint16_t* trackimage, int tracksize, int cylinder, int head) = 0;
+ virtual std::error_condition load(chd_file* chdfile, uint16_t* trackimage, int tracksize, int cylinder, int head) = 0;
// Save the image.
- virtual chd_error save(chd_file* chdfile, uint16_t* trackimage, int tracksize, int cylinder, int head) = 0;
+ virtual std::error_condition save(chd_file* chdfile, uint16_t* trackimage, int tracksize, int cylinder, int head) = 0;
// Return the original parameters of the image
mfmhd_layout_params* get_initial_params() { return &m_param_old; }
@@ -196,8 +196,8 @@ class mfmhd_generic_format : public mfmhd_image_format_t
{
public:
mfmhd_generic_format() { m_devtag = std::string("mfmhd_generic_format"); };
- chd_error load(chd_file* chdfile, uint16_t* trackimage, int tracksize, int cylinder, int head) override;
- chd_error save(chd_file* chdfile, uint16_t* trackimage, int tracksize, int cylinder, int head) override;
+ std::error_condition load(chd_file* chdfile, uint16_t* trackimage, int tracksize, int cylinder, int head) override;
+ std::error_condition save(chd_file* chdfile, uint16_t* trackimage, int tracksize, int cylinder, int head) override;
// Yes, we want to save all parameters
virtual bool save_param(mfmhd_param_t type) override { return true; }
diff --git a/src/lib/formats/nfd_dsk.cpp b/src/lib/formats/nfd_dsk.cpp
index 1a0430f9af1..4a51e0db54c 100644
--- a/src/lib/formats/nfd_dsk.cpp
+++ b/src/lib/formats/nfd_dsk.cpp
@@ -77,10 +77,11 @@
*********************************************************************/
- #include <cassert>
-
#include "nfd_dsk.h"
+#include "ioprocs.h"
+
+
nfd_format::nfd_format()
{
}
@@ -100,10 +101,11 @@ const char *nfd_format::extensions() const
return "nfd";
}
-int nfd_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int nfd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t h[16];
- io_generic_read(io, h, 0, 16);
+ size_t actual;
+ io.read_at(0, h, 16, actual);
if (strncmp((const char *)h, "T98FDDIMAGE.R0", 14) == 0 || strncmp((const char *)h, "T98FDDIMAGE.R1", 14) == 0)
return 100;
@@ -111,11 +113,14 @@ int nfd_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool nfd_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool nfd_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint64_t size = io_generic_size(io);
+ size_t actual;
+ uint64_t size;
+ if (io.length(size))
+ return false;
uint8_t h[0x120], hsec[0x10];
- io_generic_read(io, h, 0, 0x120);
+ io.read_at(0, h, 0x120, actual);
int format_version = !strncmp((const char *)h, "T98FDDIMAGE.R0", 14) ? 0 : 1;
// sector map (the 164th entry is only used by rev.1 format, loops with track < 163 are correct for rev.0)
@@ -140,7 +145,7 @@ bool nfd_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
{
int curr_track_size = 0;
// read sector map absolute location
- io_generic_read(io, hsec, pos, 4);
+ io.read_at(pos, hsec, 4, actual);
pos += 4;
uint32_t secmap_addr = little_endianize_int32(*(uint32_t *)(hsec));
@@ -149,14 +154,14 @@ bool nfd_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
// read actual sector map for the sectors of this track
// for rev.1 format the first 0x10 are a track summary:
// first WORD is # of sectors, second WORD is # of special data sectors
- io_generic_read(io, hsec, secmap_addr, 0x10);
+ io.read_at(secmap_addr, hsec, 0x10, actual);
secmap_addr += 0x10;
num_secs[track] = little_endianize_int16(*(uint16_t *)(hsec));
num_specials[track] = little_endianize_int16(*(uint16_t *)(hsec + 0x2));
for (int sect = 0; sect < num_secs[track]; sect++)
{
- io_generic_read(io, hsec, secmap_addr, 0x10);
+ io.read_at(secmap_addr, hsec, 0x10, actual);
if (track == 0 && sect == 0)
disk_type = hsec[0xb]; // can this change across the disk? I don't think so...
@@ -175,7 +180,7 @@ bool nfd_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
{
for (int sect = 0; sect < num_specials[track]; sect++)
{
- io_generic_read(io, hsec, secmap_addr, 0x10);
+ io.read_at(secmap_addr, hsec, 0x10, actual);
secmap_addr += 0x10;
curr_track_size += (hsec[9] + 1) * little_endianize_int32(*(uint32_t *)(hsec + 0x0a));
}
@@ -198,7 +203,7 @@ bool nfd_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
{
// read sector map for this sector
// for rev.0 format each sector uses 0x10 bytes
- io_generic_read(io, hsec, pos, 0x10);
+ io.read_at(pos, hsec, 0x10, actual);
if (track == 0 && sect == 0)
disk_type = hsec[0xa]; // can this change across the disk? I don't think so...
@@ -245,7 +250,7 @@ bool nfd_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
for (int track = 0; track < 163 && pos < size; track++)
{
- io_generic_read(io, sect_data, pos, track_sizes[track]);
+ io.read_at(pos, sect_data, track_sizes[track], actual);
for (int i = 0; i < num_secs[track]; i++)
{
diff --git a/src/lib/formats/nfd_dsk.h b/src/lib/formats/nfd_dsk.h
index 5eb41893c5f..c0030b073a5 100644
--- a/src/lib/formats/nfd_dsk.h
+++ b/src/lib/formats/nfd_dsk.h
@@ -20,8 +20,8 @@ class nfd_format : public floppy_image_format_t
public:
nfd_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/opd_dsk.cpp b/src/lib/formats/opd_dsk.cpp
index e105d53d678..964b30b75a0 100644
--- a/src/lib/formats/opd_dsk.cpp
+++ b/src/lib/formats/opd_dsk.cpp
@@ -30,12 +30,13 @@ const char *opd_format::extensions() const
return "opd,opu";
}
-int opd_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int opd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- int type = find_size(io, form_factor, variants);
+ int const type = find_size(io, form_factor, variants);
if (type != -1)
return 90;
+
return 0;
}
diff --git a/src/lib/formats/opd_dsk.h b/src/lib/formats/opd_dsk.h
index 9a4205314ec..9236320f154 100644
--- a/src/lib/formats/opd_dsk.h
+++ b/src/lib/formats/opd_dsk.h
@@ -21,7 +21,7 @@ class opd_format : public wd177x_format
public:
opd_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual int get_image_offset(const format &f, int head, int track) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/oric_dsk.cpp b/src/lib/formats/oric_dsk.cpp
index 22d70124572..f5b0783a112 100644
--- a/src/lib/formats/oric_dsk.cpp
+++ b/src/lib/formats/oric_dsk.cpp
@@ -8,7 +8,9 @@
*********************************************************************/
-#include "formats/oric_dsk.h"
+#include "oric_dsk.h"
+
+#include "ioprocs.h"
const char *oric_dsk_format::name() const
@@ -31,10 +33,11 @@ bool oric_dsk_format::supports_save() const
return true;
}
-int oric_dsk_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int oric_dsk_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t h[256];
- io_generic_read(io, h, 0, 256);
+ size_t actual;
+ io.read_at(0, h, 256, actual);
if(memcmp(h, "MFM_DISK", 8))
return 0;
@@ -43,27 +46,30 @@ int oric_dsk_format::identify(io_generic *io, uint32_t form_factor, const std::v
int tracks = (h[15] << 24) | (h[14] << 16) | (h[13] << 8) | h[12];
int geom = (h[19] << 24) | (h[18] << 16) | (h[17] << 8) | h[16];
- int size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return 0;
if(sides < 0 || sides > 2 || geom != 1 || size != 256+6400*sides*tracks)
return 0;
return 100;
}
-bool oric_dsk_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool oric_dsk_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
uint8_t h[256];
uint8_t t[6250+3];
t[6250] = t[6251] = t[6252] = 0;
- io_generic_read(io, h, 0, 256);
+ io.read_at(0, h, 256, actual);
int sides = (h[11] << 24) | (h[10] << 16) | (h[ 9] << 8) | h[ 8];
int tracks = (h[15] << 24) | (h[14] << 16) | (h[13] << 8) | h[12];
for(int side=0; side<sides; side++)
for(int track=0; track<tracks; track++) {
- io_generic_read(io, t, 256+6400*(tracks*side + track), 6250);
+ io.read_at(256+6400*(tracks*side + track), t, 6250, actual);
std::vector<uint32_t> stream;
int sector_size = 128;
for(int i=0; i<6250; i++) {
@@ -99,8 +105,9 @@ bool oric_dsk_format::load(io_generic *io, uint32_t form_factor, const std::vect
return true;
}
-bool oric_dsk_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool oric_dsk_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ // FIXME: surely this should return false, since it does't actually save anything?
return true;
}
@@ -127,28 +134,35 @@ bool oric_jasmin_format::supports_save() const
return true;
}
-int oric_jasmin_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int oric_jasmin_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- int size = io_generic_size(io);
- bool can_ds = variants.empty() || has_variant(variants, floppy_image::DSDD);
+ uint64_t size;
+ if(io.length(size))
+ return 0;
+
+ bool const can_ds = variants.empty() || has_variant(variants, floppy_image::DSDD);
if(size == 41*17*256 || (can_ds && size == 41*17*256*2))
return 50;
return 0;
}
-bool oric_jasmin_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool oric_jasmin_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- int size = io_generic_size(io);
- bool can_ds = variants.empty() || has_variant(variants, floppy_image::DSDD);
+ uint64_t size;
+ if(io.length(size))
+ return false;
+
+ bool const can_ds = variants.empty() || has_variant(variants, floppy_image::DSDD);
if(size != 41*17*256 && (!can_ds || size != 41*17*256*2))
return false;
- int heads = size == 41*17*256 ? 1 : 2;
+ int const heads = size == 41*17*256 ? 1 : 2;
std::vector<uint8_t> data(size);
- io_generic_read(io, data.data(), 0, size);
+ size_t actual;
+ io.read_at(0, data.data(), size, actual);
for(int head = 0; head != heads; head++)
for(int track = 0; track != 41; track++) {
@@ -173,7 +187,7 @@ bool oric_jasmin_format::load(io_generic *io, uint32_t form_factor, const std::v
return true;
}
-bool oric_jasmin_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool oric_jasmin_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int tracks, heads;
image->get_actual_geometry(tracks, heads);
@@ -191,8 +205,9 @@ bool oric_jasmin_format::save(io_generic *io, const std::vector<uint32_t> &varia
for(int track = 0; track != 41; track++) {
auto sectors = extract_sectors_from_bitstream_mfm_pc(generate_bitstream_from_track(track, head, 2000, image));
for(unsigned int sector = 0; sector != 17; sector ++) {
- const uint8_t *data = sector+1 < sectors.size() && !sectors[sector+1].empty() ? sectors[sector+1].data() : zero;
- io_generic_write(io, data, 256 * (sector + track*17 + head*17*41), 256);
+ uint8_t const *const data = (sector+1 < sectors.size() && !sectors[sector+1].empty()) ? sectors[sector+1].data() : zero;
+ size_t actual;
+ io.write_at(256 * (sector + track*17 + head*17*41), data, 256, actual);
}
}
return true;
diff --git a/src/lib/formats/oric_dsk.h b/src/lib/formats/oric_dsk.h
index e42b876e52f..6fd1021384b 100644
--- a/src/lib/formats/oric_dsk.h
+++ b/src/lib/formats/oric_dsk.h
@@ -18,9 +18,9 @@ class oric_dsk_format : public floppy_image_format_t
{
public:
oric_dsk_format() = default;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -35,9 +35,9 @@ class oric_jasmin_format : public floppy_image_format_t
public:
oric_jasmin_format() = default;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/os9_dsk.cpp b/src/lib/formats/os9_dsk.cpp
index b28e4f8d293..ba1b2427811 100644
--- a/src/lib/formats/os9_dsk.cpp
+++ b/src/lib/formats/os9_dsk.cpp
@@ -48,6 +48,7 @@
#include "imageutl.h"
#include "coretmpl.h" // BIT
+#include "ioprocs.h"
os9_format::os9_format() : wd177x_format(formats)
@@ -69,21 +70,25 @@ const char *os9_format::extensions() const
return "dsk,os9";
}
-int os9_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int os9_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- int type = find_size(io, form_factor, variants);
+ int const type = find_size(io, form_factor, variants);
if (type != -1)
return 75;
+
return 0;
}
-int os9_format::find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int os9_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return -1;
uint8_t os9_header[0x60];
- io_generic_read(io, os9_header, 0, sizeof(os9_header));
+ size_t actual;
+ io.read_at(0, os9_header, sizeof(os9_header), actual);
int os9_total_sectors = pick_integer_be(os9_header, 0x00, 3);
int os9_heads = util::BIT(os9_header[0x10], 0) ? 2 : 1;
diff --git a/src/lib/formats/os9_dsk.h b/src/lib/formats/os9_dsk.h
index 57dfbfc9ab5..124c019d155 100644
--- a/src/lib/formats/os9_dsk.h
+++ b/src/lib/formats/os9_dsk.h
@@ -21,8 +21,8 @@ public:
virtual const char *name() const override;
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual int find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual const wd177x_format::format &get_track_format(const format &f, int head, int track) override;
private:
diff --git a/src/lib/formats/pasti_dsk.cpp b/src/lib/formats/pasti_dsk.cpp
index 0ab6dc2f064..1a418096cd3 100644
--- a/src/lib/formats/pasti_dsk.cpp
+++ b/src/lib/formats/pasti_dsk.cpp
@@ -2,6 +2,8 @@
// copyright-holders:Olivier Galibert
#include "pasti_dsk.h"
+#include "ioprocs.h"
+
// Pasti format supported using the documentation at
// http://www.sarnau.info/atari:pasti_file_format
@@ -36,10 +38,11 @@ bool pasti_format::supports_save() const
return false;
}
-int pasti_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int pasti_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t h[16];
- io_generic_read(io, h, 0, 16);
+ size_t actual;
+ io.read_at(0, h, 16, actual);
if(!memcmp(h, "RSY\0\3\0", 6) &&
(1 || (h[10] >= 80 && h[10] <= 82) || (h[10] >= 160 && h[10] <= 164)))
@@ -58,10 +61,11 @@ static void hexdump(const uint8_t *d, int s)
}
}
-bool pasti_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool pasti_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
uint8_t fh[16];
- io_generic_read(io, fh, 0, 16);
+ io.read_at(0, fh, 16, actual);
std::vector<uint8_t> raw_track;
@@ -76,7 +80,7 @@ bool pasti_format::load(io_generic *io, uint32_t form_factor, const std::vector<
for(int track=0; track < tracks; track++) {
for(int head=0; head < heads; head++) {
uint8_t th[16];
- io_generic_read(io, th, pos, 16);
+ io.read_at(pos, th, 16, actual);
int entry_len = th[0] | (th[1] << 8) | (th[2] << 16) | (th[3] << 24);
int fuzz_len = th[4] | (th[5] << 8) | (th[6] << 16) | (th[7] << 24);
int sect = th[8] | (th[9] << 8);
@@ -87,7 +91,7 @@ bool pasti_format::load(io_generic *io, uint32_t form_factor, const std::vector<
raw_track.resize(entry_len-16);
- io_generic_read(io, &raw_track[0], pos+16, entry_len-16);
+ io.read_at(pos+16, &raw_track[0], entry_len-16, actual);
uint8_t *fuzz = fuzz_len ? &raw_track[16*sect] : nullptr;
uint8_t *bdata = fuzz ? fuzz+fuzz_len : &raw_track[16*sect];
diff --git a/src/lib/formats/pasti_dsk.h b/src/lib/formats/pasti_dsk.h
index b3fc869da4d..2575c12eeb4 100644
--- a/src/lib/formats/pasti_dsk.h
+++ b/src/lib/formats/pasti_dsk.h
@@ -12,8 +12,8 @@ class pasti_format : public floppy_image_format_t
public:
pasti_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/pc98fdi_dsk.cpp b/src/lib/formats/pc98fdi_dsk.cpp
index 2d503acebe4..61fb8fb8fe3 100644
--- a/src/lib/formats/pc98fdi_dsk.cpp
+++ b/src/lib/formats/pc98fdi_dsk.cpp
@@ -8,9 +8,11 @@
*********************************************************************/
-#include <cassert>
#include "pc98fdi_dsk.h"
+#include "ioprocs.h"
+
+
pc98fdi_format::pc98fdi_format()
{
}
@@ -30,47 +32,53 @@ const char *pc98fdi_format::extensions() const
return "fdi";
}
-int pc98fdi_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int pc98fdi_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
- uint8_t h[32];
+ uint64_t size;
+ if(io.length(size))
+ return 0;
- io_generic_read(io, h, 0, 32);
- uint32_t hsize = little_endianize_int32(*(uint32_t *) (h + 0x8));
- uint32_t psize = little_endianize_int32(*(uint32_t *) (h + 0xc));
- uint32_t ssize = little_endianize_int32(*(uint32_t *) (h + 0x10));
- uint32_t scnt = little_endianize_int32(*(uint32_t *) (h + 0x14));
- uint32_t sides = little_endianize_int32(*(uint32_t *) (h + 0x18));
- uint32_t ntrk = little_endianize_int32(*(uint32_t *) (h + 0x1c));
+ uint8_t h[32];
+ size_t actual;
+ io.read_at(0, h, 32, actual);
+
+ uint32_t const hsize = little_endianize_int32(*(uint32_t *) (h + 0x8));
+ uint32_t const psize = little_endianize_int32(*(uint32_t *) (h + 0xc));
+ uint32_t const ssize = little_endianize_int32(*(uint32_t *) (h + 0x10));
+ uint32_t const scnt = little_endianize_int32(*(uint32_t *) (h + 0x14));
+ uint32_t const sides = little_endianize_int32(*(uint32_t *) (h + 0x18));
+ uint32_t const ntrk = little_endianize_int32(*(uint32_t *) (h + 0x1c));
if(size == hsize + psize && psize == ssize*scnt*sides*ntrk)
return 100;
return 0;
}
-bool pc98fdi_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool pc98fdi_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint8_t h[32];
+ size_t actual;
- io_generic_read(io, h, 0, 32);
+ uint8_t h[32];
+ io.read_at(0, h, 32, actual);
- uint32_t hsize = little_endianize_int32(*(uint32_t *)(h+0x8));
- uint32_t sector_size = little_endianize_int32(*(uint32_t *)(h+0x10));
- uint32_t sector_count = little_endianize_int32(*(uint32_t *)(h+0x14));
- uint32_t head_count = little_endianize_int32(*(uint32_t *)(h+0x18));
- uint32_t track_count = little_endianize_int32(*(uint32_t *)(h+0x1c));
+ uint32_t const hsize = little_endianize_int32(*(uint32_t *)(h+0x8));
+ uint32_t const sector_size = little_endianize_int32(*(uint32_t *)(h+0x10));
+ uint32_t const sector_count = little_endianize_int32(*(uint32_t *)(h+0x14));
+ uint32_t const head_count = little_endianize_int32(*(uint32_t *)(h+0x18));
+ uint32_t const track_count = little_endianize_int32(*(uint32_t *)(h+0x1c));
- int cell_count = form_factor == floppy_image::FF_35 ? 200000 : 166666;
+ int const cell_count = form_factor == floppy_image::FF_35 ? 200000 : 166666;
- int ssize;
- for(ssize=0; (128 << ssize) < sector_size; ssize++) {};
+ int ssize = 0;
+ while ((128 << ssize) < sector_size)
+ ssize++;
desc_pc_sector sects[256];
uint8_t sect_data[65536];
for(int track=0; track < track_count; track++)
for(int head=0; head < head_count; head++) {
- io_generic_read(io, sect_data, hsize + sector_size*sector_count*(track*head_count + head), sector_size*sector_count);
+ io.read_at(hsize + sector_size*sector_count*(track*head_count + head), sect_data, sector_size*sector_count, actual);
for(int i=0; i<sector_count; i++) {
sects[i].track = track;
diff --git a/src/lib/formats/pc98fdi_dsk.h b/src/lib/formats/pc98fdi_dsk.h
index 1c60f059cbe..1c539f06094 100644
--- a/src/lib/formats/pc98fdi_dsk.h
+++ b/src/lib/formats/pc98fdi_dsk.h
@@ -20,8 +20,8 @@ class pc98fdi_format : public floppy_image_format_t
public:
pc98fdi_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/pc_dsk.cpp b/src/lib/formats/pc_dsk.cpp
index c814afbe6dc..6fe2a82196a 100644
--- a/src/lib/formats/pc_dsk.cpp
+++ b/src/lib/formats/pc_dsk.cpp
@@ -8,10 +8,12 @@
*********************************************************************/
+#include "formats/pc_dsk.h"
+
+#include "ioprocs.h"
+
#include <cstring>
-#include <cassert>
-#include "formats/pc_dsk.h"
pc_format::pc_format() : upd765_format(formats)
{
@@ -32,9 +34,12 @@ const char *pc_format::extensions() const
return "dsk,ima,img,ufi,360";
}
-int pc_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int pc_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size)) {
+ return 0;
+ }
/* some 360K images have a 512-byte header */
if (size == 368640 + 0x200) {
diff --git a/src/lib/formats/pc_dsk.h b/src/lib/formats/pc_dsk.h
index d53879611b9..8c99a35457f 100644
--- a/src/lib/formats/pc_dsk.h
+++ b/src/lib/formats/pc_dsk.h
@@ -20,7 +20,7 @@ class pc_format : public upd765_format
public:
pc_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/poly_dsk.cpp b/src/lib/formats/poly_dsk.cpp
index a865729864e..8845643eb72 100644
--- a/src/lib/formats/poly_dsk.cpp
+++ b/src/lib/formats/poly_dsk.cpp
@@ -10,6 +10,9 @@
#include "poly_dsk.h"
+#include "ioprocs.h"
+
+
poly_cpm_format::poly_cpm_format()
{
}
@@ -34,30 +37,35 @@ bool poly_cpm_format::supports_save() const
return true;
}
-int poly_cpm_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int poly_cpm_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint8_t boot[16];
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return 0;
// check for valid sizes
if (size == 630784 || size == 622592 || size == 256256)
{
// check for Poly CP/M boot sector
- io_generic_read(io, boot, 0, 16);
+ uint8_t boot[16];
+ size_t actual;
+ io.read_at(0, boot, 16, actual);
if (memcmp(boot, "\x86\xc3\xb7\x00\x00\x8e\x10\xc0\xbf\x00\x01\xbf\xe0\x60\x00\x00", 16) == 0)
{
return 100;
}
}
+
return 0;
}
-bool poly_cpm_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool poly_cpm_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- int total_tracks, spt, bps, head_num;
-
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size) || io.seek(0, SEEK_SET))
+ return false;
+ int total_tracks, spt, bps, head_num;
switch (size)
{
case 622592:
@@ -83,8 +91,7 @@ bool poly_cpm_format::load(io_generic *io, uint32_t form_factor, const std::vect
break;
}
- int cell_count = (form_factor == floppy_image::FF_525) ? 50000 : 100000;
- int offset = 0;
+ int const cell_count = (form_factor == floppy_image::FF_525) ? 50000 : 100000;
for (int track = 0; track < total_tracks; track++)
for (int head = 0; head < head_num; head++)
@@ -105,8 +112,8 @@ bool poly_cpm_format::load(io_generic *io, uint32_t form_factor, const std::vect
sects[i].deleted = false;
sects[i].bad_crc = false;
sects[i].data = &sect_data[sdatapos];
- io_generic_read(io, sects[i].data, offset, bps);
- offset += bps;
+ size_t actual;
+ io.read(sects[i].data, bps, actual);
sdatapos += bps;
}
// gap sizes unverified
diff --git a/src/lib/formats/poly_dsk.h b/src/lib/formats/poly_dsk.h
index 8fd3c9be4a5..8afb6836302 100644
--- a/src/lib/formats/poly_dsk.h
+++ b/src/lib/formats/poly_dsk.h
@@ -20,8 +20,8 @@ public:
virtual const char *name() const override;
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override;
};
diff --git a/src/lib/formats/rpk.cpp b/src/lib/formats/rpk.cpp
new file mode 100644
index 00000000000..a5b146d74aa
--- /dev/null
+++ b/src/lib/formats/rpk.cpp
@@ -0,0 +1,474 @@
+// license:LGPL-2.1+
+// copyright-holders:Michael Zapf
+/***************************************************************************
+
+ rpk.cpp
+
+ RPK format support
+
+ A RPK file ("rompack") contains a collection of dump files and a layout
+ file that defines the kind of circuit board (PCB) used in the cartridge
+ and the mapping of dumps to sockets on the board.
+
+Example:
+ <?xml version="1.0" encoding="utf-8"?>
+ <romset>
+ <resources>
+ <rom id="gromimage" file="ed-assmg.bin" />
+ </resources>
+ <configuration>
+ <pcb type="standard">
+ <socket id="grom_socket" uses="gromimage"/>
+ </pcb>
+ </configuration>
+ </romset>
+
+DTD:
+ <!ELEMENT romset (resources, configuration)>
+ <!ELEMENT resources (rom|ram)+>
+ <!ELEMENT rom EMPTY>
+ <!ELEMENT ram EMPTY>
+ <!ELEMENT configuration (pcb)>
+ <!ELEMENT pcb (socket)+>
+ <!ELEMENT socket EMPTY>
+ <!ATTLIST romset version CDATA #IMPLIED>
+ <!ATTLIST rom id ID #REQUIRED
+ <!ATTLIST rom file CDATA #REQUIRED>
+ <!ATTLIST rom crc CDATA #IMPLIED>
+ <!ATTLIST rom sha1 CDATA #IMPLIED>
+ <!ATTLIST ram id ID #REQUIRED>
+ <!ATTLIST ram type (volatile|persistent) #IMPLIED>
+ <!ATTLIST ram store (internal|external) #IMPLIED>
+ <!ATTLIST ram file CDATA #IMPLIED>
+ <!ATTLIST ram length CDATA #REQUIRED>
+ <!ATTLIST pcb type CDATA #REQUIRED>
+ <!ATTLIST socket id ID #REQUIRED>
+ <!ATTLIST socket uses IDREF #REQUIRED>
+
+***************************************************************************/
+
+#include "rpk.h"
+#include "xmlfile.h"
+
+
+namespace
+{
+
+/***************************************************************************
+ TYPE DEFINITIONS
+***************************************************************************/
+
+class rpk_category_impl : public std::error_category
+{
+public:
+ virtual char const *name() const noexcept override { return "rpk"; }
+ virtual std::string message(int condition) const override;
+};
+
+
+/***************************************************************************
+ GLOBAL VARIABLES
+***************************************************************************/
+
+rpk_category_impl const f_rpk_category_instance;
+};
+
+
+/***************************************************************************
+ RPK READER
+***************************************************************************/
+
+//-------------------------------------------------
+// ctor
+//-------------------------------------------------
+
+rpk_reader::rpk_reader(char const *const *pcb_types, bool supports_ram)
+ : m_pcb_types(pcb_types)
+ , m_supports_ram(supports_ram)
+{
+}
+
+
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+std::error_condition rpk_reader::read(std::unique_ptr<util::random_read> &&stream, rpk_file::ptr &result) const
+{
+ // open the RPK (as a zip file)
+ util::archive_file::ptr zipfile;
+ std::error_condition ziperr = util::archive_file::open_zip(std::move(stream), zipfile);
+ if (ziperr)
+ return ziperr;
+
+ // open the layout XML
+ if (zipfile->search("layout.xml", false) < 0)
+ return error::MISSING_LAYOUT;
+
+ // determine the uncompressed length
+ uint64_t uncompressed_length_uint64 = zipfile->current_uncompressed_length();
+ size_t uncompressed_length = (size_t)uncompressed_length_uint64;
+ if (uncompressed_length != uncompressed_length_uint64)
+ return std::errc::not_enough_memory;
+
+ // prepare a buffer for the layout XML
+ std::unique_ptr<char[]> layout_xml_text(new (std::nothrow) char[uncompressed_length + 1]);
+ if (!layout_xml_text)
+ return std::errc::not_enough_memory;
+
+ // and decompress it
+ ziperr = zipfile->decompress(&layout_xml_text[0], uncompressed_length);
+ if (ziperr)
+ return ziperr;
+ layout_xml_text[uncompressed_length] = 0;
+
+ // parse the layout text
+ util::xml::file::ptr const layout_xml = util::xml::file::string_read(&layout_xml_text[0], nullptr);
+ if (!layout_xml)
+ return error::XML_ERROR;
+ layout_xml_text.reset();
+
+ // now we work within the XML tree
+
+ // romset is the root node
+ util::xml::data_node const *const romset_node = layout_xml->get_child("romset");
+ if (!romset_node)
+ return error::INVALID_LAYOUT; // document element must be <romset>
+
+ // resources is a child of romset
+ util::xml::data_node const *const resources_node = romset_node->get_child("resources");
+ if (!resources_node)
+ return error::INVALID_LAYOUT; // <romset> must have a <resources> child
+
+ // configuration is a child of romset; we're actually interested in ...
+ util::xml::data_node const *const configuration_node = romset_node->get_child("configuration");
+ if (!configuration_node)
+ return error::INVALID_LAYOUT; // <romset> must have a <configuration> child
+
+ // ... pcb, which is a child of configuration
+ util::xml::data_node const *const pcb_node = configuration_node->get_child("pcb");
+ if (!pcb_node)
+ return error::INVALID_LAYOUT; // <configuration> must have a <pcb> child
+
+ // we'll try to find the PCB type on the provided type list.
+ std::string const *const pcb_type_string = pcb_node->get_attribute_string_ptr("type");
+ if (!pcb_type_string)
+ return error::INVALID_LAYOUT; // <pcb> must have a 'type' attribute";
+ int pcb_type = 0;
+ while (m_pcb_types[pcb_type] && strcmp(m_pcb_types[pcb_type], pcb_type_string->c_str()))
+ pcb_type++;
+ if (!m_pcb_types[pcb_type])
+ return error::UNKNOWN_PCB_TYPE;
+
+ // create the rpk_file object
+ rpk_file::ptr file = std::make_unique<rpk_file>(std::move(zipfile), pcb_type);
+
+ // find the sockets and load their respective resource
+ for (util::xml::data_node const *socket_node = pcb_node->get_first_child(); socket_node; socket_node = socket_node->get_next_sibling())
+ {
+ if (strcmp(socket_node->get_name(), "socket") != 0)
+ return error::INVALID_LAYOUT; // <pcb> element has only <socket> children
+
+ std::string const *const id = socket_node->get_attribute_string_ptr("id");
+ if (!id)
+ return error::INVALID_LAYOUT; // <socket> must have an 'id' attribute
+
+ std::string const *const uses_name = socket_node->get_attribute_string_ptr("uses");
+ if (!uses_name)
+ return error::INVALID_LAYOUT; // <socket> must have a 'uses' attribute"
+
+ // locate the resource node
+ util::xml::data_node const *resource_node = nullptr;
+ for (util::xml::data_node const *this_resource_node = resources_node->get_first_child(); this_resource_node; this_resource_node = this_resource_node->get_next_sibling())
+ {
+ std::string const *const resource_name = this_resource_node->get_attribute_string_ptr("id");
+ if (!resource_name)
+ return error::INVALID_LAYOUT; // resource node must have an 'id' attribute
+
+ if (*resource_name == *uses_name)
+ {
+ resource_node = this_resource_node;
+ break;
+ }
+ }
+ if (!resource_node)
+ return error::INVALID_RESOURCE_REF; // *uses_name
+
+ // process the resource
+ if (!strcmp(resource_node->get_name(), "rom"))
+ {
+ std::error_condition err = file->add_rom_socket(std::string(*id), *resource_node);
+ if (err)
+ return err;
+ }
+ else if (!strcmp(resource_node->get_name(), "ram"))
+ {
+ if (!m_supports_ram)
+ return error::UNSUPPORTED_RPK_FEATURE; // <ram> is not supported by this system
+ std::error_condition err = file->add_ram_socket(std::string(*id), *resource_node);
+ if (err)
+ return err;
+ }
+ else
+ return error::INVALID_LAYOUT; // resource node must be <rom> or <ram>
+ }
+
+ // and we're done!
+ result = std::move(file);
+ return std::error_condition();
+}
+
+
+/***************************************************************************
+ RPK FILE
+***************************************************************************/
+
+//-------------------------------------------------
+// ctor
+//-------------------------------------------------
+
+rpk_file::rpk_file(util::archive_file::ptr &&zipfile, int pcb_type)
+ : m_zipfile(std::move(zipfile))
+ , m_pcb_type(pcb_type)
+{
+}
+
+
+
+//-------------------------------------------------
+// dtor
+//-------------------------------------------------
+
+rpk_file::~rpk_file()
+{
+}
+
+
+//-------------------------------------------------
+// add_rom_socket
+//-------------------------------------------------
+
+std::error_condition rpk_file::add_rom_socket(std::string &&id, const util::xml::data_node &rom_resource_node)
+{
+ // find the file attribute (required)
+ std::string const *const file = rom_resource_node.get_attribute_string_ptr("file");
+ if (!file)
+ return rpk_reader::error::INVALID_LAYOUT; // <rom> must have a 'file' attribute
+
+ // check for crc (optional)
+ std::optional<util::hash_collection> hashes;
+ std::string const *const crcstr = rom_resource_node.get_attribute_string_ptr("crc");
+ if (crcstr)
+ {
+ if (!hashes)
+ hashes.emplace();
+ hashes->add_from_string(util::hash_collection::HASH_CRC, *crcstr);
+ }
+
+ // check for sha1 (optional)
+ std::string const *const sha1 = rom_resource_node.get_attribute_string_ptr("sha1");
+ if (sha1)
+ {
+ if (!hashes.has_value())
+ hashes.emplace();
+ hashes->add_from_string(util::hash_collection::HASH_SHA1, *sha1);
+ }
+
+ // finally add the socket
+ m_sockets.emplace_back(*this, std::move(id), rpk_socket::socket_type::ROM, std::string(*file), std::move(hashes));
+ return std::error_condition();
+}
+
+
+//-------------------------------------------------
+// add_ram_socket
+//-------------------------------------------------
+
+std::error_condition rpk_file::add_ram_socket(std::string &&id, const util::xml::data_node &ram_resource_node)
+{
+ // find the length attribute
+ std::string const *const length_string = ram_resource_node.get_attribute_string_ptr("length");
+ if (!length_string)
+ return rpk_reader::error::MISSING_RAM_LENGTH;
+
+ // parse it
+ unsigned int length;
+ char suffix;
+ switch (sscanf(length_string->c_str(), "%u%c", &length, &suffix))
+ {
+ case 1:
+ // fall through
+ break;
+
+ case 2:
+ switch (tolower(suffix))
+ {
+ case 'k':
+ // kilobytes
+ length *= 1024;
+ break;
+
+ case 'm':
+ // megabytes
+ length *= 1024 * 1024;
+ break;
+
+ default: // failed
+ return rpk_reader::error::INVALID_RAM_SPEC;
+ }
+ break;
+
+ default:
+ return rpk_reader::error::INVALID_RAM_SPEC;
+ }
+
+ // determine the type of RAM
+ rpk_socket::socket_type type;
+ std::string const *const ram_type = ram_resource_node.get_attribute_string_ptr("type");
+ if (ram_type && *ram_type == "persistent")
+ type = rpk_socket::socket_type::PERSISTENT_RAM;
+ else
+ type = rpk_socket::socket_type::RAM;
+
+ // persistent RAM needs a file name
+ std::string file;
+ if (type == rpk_socket::socket_type::PERSISTENT_RAM)
+ {
+ std::string const *const ram_filename = ram_resource_node.get_attribute_string_ptr("file");
+ if (ram_filename == nullptr)
+ return rpk_reader::error::INVALID_RAM_SPEC; // <ram type='persistent'> must have a 'file' attribute
+ file = *ram_filename;
+ }
+
+ // finally add the socket
+ m_sockets.emplace_back(*this, std::move(id), type, std::move(file), std::nullopt, length);
+ return std::error_condition();
+}
+
+
+/***************************************************************************
+ RPK SOCKET
+***************************************************************************/
+
+//-------------------------------------------------
+// ctor
+//-------------------------------------------------
+
+rpk_socket::rpk_socket(rpk_file &rpk, std::string &&id, socket_type type, std::string &&filename, std::optional<util::hash_collection> &&hashes, std::uint32_t length)
+ : m_rpk(rpk)
+ , m_id(id)
+ , m_type(type)
+ , m_filename(filename)
+ , m_hashes(std::move(hashes))
+ , m_length(length)
+{
+}
+
+
+//-------------------------------------------------
+// dtor
+//-------------------------------------------------
+
+rpk_socket::~rpk_socket()
+{
+}
+
+
+//-------------------------------------------------
+// read_file
+//-------------------------------------------------
+
+std::error_condition rpk_socket::read_file(std::vector<std::uint8_t> &result) const
+{
+ // find the file
+ if (m_rpk.zipfile().search(m_filename, false) < 0)
+ return rpk_reader::error::INVALID_FILE_REF;
+
+ // prepare a buffer
+ result.clear();
+ try
+ {
+ result.resize(m_rpk.zipfile().current_uncompressed_length());
+ }
+ catch (std::bad_alloc const &)
+ {
+ return std::errc::not_enough_memory;
+ }
+
+ // read the file
+ std::error_condition const ziperr = m_rpk.zipfile().decompress(&result[0], m_rpk.zipfile().current_uncompressed_length());
+ if (ziperr)
+ return ziperr;
+
+ // perform hash checks, if appropriate
+ if (m_hashes.has_value())
+ {
+ util::hash_collection actual_hashes;
+ actual_hashes.compute(&result[0], result.size(), m_hashes->hash_types().c_str());
+
+ if (actual_hashes != m_hashes)
+ return rpk_reader::error::INVALID_FILE_REF; // Hash check failed
+ }
+
+ // success!
+ return std::error_condition();
+}
+
+
+/***************************************************************************
+ RPK EXCEPTION HANDLING
+***************************************************************************/
+
+//-------------------------------------------------
+// rpk_category - gets the RPK error category instance
+//-------------------------------------------------
+
+std::error_category const &rpk_category() noexcept
+{
+ return f_rpk_category_instance;
+}
+
+//-------------------------------------------------
+// error_message
+//-------------------------------------------------
+
+std::string rpk_category_impl::message(int condition) const
+{
+ using namespace std::literals;
+
+ std::string result;
+ switch ( condition)
+ {
+ case 0:
+ result = "No error"s;
+ break;
+ case (int)rpk_reader::error::XML_ERROR:
+ result = "XML format error"s;
+ break;
+ case (int)rpk_reader::error::MISSING_RAM_LENGTH:
+ result = "Missing RAM length"s;
+ break;
+ case (int)rpk_reader::error::INVALID_RAM_SPEC:
+ result = "Invalid RAM specification"s;
+ break;
+ case (int)rpk_reader::error::INVALID_RESOURCE_REF:
+ result = "Invalid resource reference"s;
+ break;
+ case (int)rpk_reader::error::INVALID_LAYOUT:
+ result = "layout.xml not valid"s;
+ break;
+ case (int)rpk_reader::error::MISSING_LAYOUT:
+ result = "Missing layout"s;
+ break;
+ case (int)rpk_reader::error::UNKNOWN_PCB_TYPE:
+ result = "Unknown pcb type"s;
+ break;
+ case (int)rpk_reader::error::UNSUPPORTED_RPK_FEATURE:
+ result = "RPK feature not supported"s;
+ break;
+ default:
+ result = "Unknown error"s;
+ break;
+ }
+ return result;
+}
diff --git a/src/lib/formats/rpk.h b/src/lib/formats/rpk.h
new file mode 100644
index 00000000000..55b6f0a4839
--- /dev/null
+++ b/src/lib/formats/rpk.h
@@ -0,0 +1,143 @@
+// license:LGPL-2.1+
+// copyright-holders:Michael Zapf
+/***************************************************************************
+
+ rpk.h
+
+ RPK format support
+
+***************************************************************************/
+
+#ifndef MAME_FORMATS_RPK_H
+#define MAME_FORMATS_RPK_H
+
+#pragma once
+
+#include "hash.h"
+#include "unzip.h"
+
+#include <cassert>
+#include <list>
+#include <optional>
+
+
+/***************************************************************************
+ TYPE DEFINITIONS
+***************************************************************************/
+
+class rpk_reader;
+class rpk_file;
+
+// ======================> rpk_socket
+
+class rpk_socket
+{
+ friend class rpk_reader;
+public:
+ enum class socket_type
+ {
+ ROM,
+ RAM,
+ PERSISTENT_RAM
+ };
+
+ // ctor/dtor
+ rpk_socket(rpk_file &rpk, std::string &&id, socket_type type, std::string &&filename, std::optional<util::hash_collection> &&hashes, std::uint32_t length = ~0);
+ rpk_socket(const rpk_socket &) = delete;
+ rpk_socket(rpk_socket &&) = delete;
+ ~rpk_socket();
+
+ // accessors
+ const std::string &id() const noexcept { return m_id; }
+ socket_type type() const noexcept { return m_type; }
+ const std::string &filename() const noexcept { return m_filename; }
+ std::uint32_t length() const noexcept { assert(m_type == socket_type::RAM || m_type == socket_type::PERSISTENT_RAM); return m_length; }
+
+ // methods
+ std::error_condition read_file(std::vector<std::uint8_t> &result) const;
+
+private:
+ rpk_file & m_rpk;
+ std::string m_id;
+ socket_type m_type;
+ std::string m_filename;
+ std::optional<util::hash_collection> m_hashes;
+ std::uint32_t m_length;
+};
+
+
+// ======================> rpk_file
+
+class rpk_file
+{
+ friend class rpk_reader;
+ friend class rpk_socket;
+
+public:
+ typedef std::unique_ptr<rpk_file> ptr;
+
+ // ctor/dtor
+ rpk_file(util::archive_file::ptr &&zipfile, int pcb_type);
+ rpk_file(const rpk_file &) = delete;
+ rpk_file(rpk_file &&) = delete;
+ ~rpk_file();
+
+ // accessors
+ int pcb_type() const { return m_pcb_type; }
+ const std::list<rpk_socket> &sockets() const { return m_sockets; }
+
+private:
+ util::archive_file::ptr m_zipfile;
+ int m_pcb_type;
+ std::list<rpk_socket> m_sockets;
+
+ // accesors
+ util::archive_file &zipfile() { return *m_zipfile; }
+
+ // methods
+ std::error_condition add_rom_socket(std::string &&id, const util::xml::data_node &rom_resource_node);
+ std::error_condition add_ram_socket(std::string &&id, const util::xml::data_node &ram_resource_node);
+};
+
+
+// ======================> rpk_reader
+
+class rpk_reader
+{
+public:
+ enum class error
+ {
+ XML_ERROR = 1,
+ INVALID_FILE_REF,
+ MISSING_RAM_LENGTH,
+ INVALID_RAM_SPEC,
+ INVALID_RESOURCE_REF,
+ INVALID_LAYOUT,
+ MISSING_LAYOUT,
+ UNKNOWN_PCB_TYPE,
+ UNSUPPORTED_RPK_FEATURE
+ };
+
+ // ctor/dtor
+ rpk_reader(char const *const *pcb_types, bool supports_ram);
+ rpk_reader(const rpk_reader &) = delete;
+ rpk_reader(rpk_reader &&) = delete;
+
+ // methods
+ std::error_condition read(std::unique_ptr<util::random_read> &&stream, rpk_file::ptr &result) const;
+
+private:
+ char const *const * m_pcb_types;
+ bool m_supports_ram;
+};
+
+
+// error category for RPK errors
+std::error_category const &rpk_category() noexcept;
+inline std::error_condition make_error_condition(rpk_reader::error err) noexcept { return std::error_condition(int(err), rpk_category()); }
+
+namespace std {
+ template <> struct is_error_condition_enum<rpk_reader::error> : public std::true_type { };
+} // namespace std
+
+#endif // MAME_FORMATS_RPK_H
diff --git a/src/lib/formats/rx50_dsk.cpp b/src/lib/formats/rx50_dsk.cpp
index d0d8f270c56..f81e2fa5b67 100644
--- a/src/lib/formats/rx50_dsk.cpp
+++ b/src/lib/formats/rx50_dsk.cpp
@@ -29,11 +29,11 @@
FORMAT A: /F:160 on DOS; turn MEDIACHK ON
************************************************************************/
-#include <cassert>
-
-#include "flopimg.h"
#include "formats/rx50_dsk.h"
+#include "ioprocs.h"
+
+
// Controller: WD1793
// TRACK LAYOUT IS UNVERIFED. SEE SOURCES:
// - 'esq_dsk16' (uses WD 1772)
@@ -95,12 +95,17 @@ bool rx50img_format::supports_save() const
return true;
}
-void rx50img_format::find_size(io_generic *io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count)
+void rx50img_format::find_size(util::random_read &io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count)
{
head_count = 1;
uint32_t expected_size = 0;
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ {
+ track_count = head_count = sector_count = 0;
+ return;
+ }
track_count = 80;
sector_count = 10;
@@ -124,7 +129,7 @@ void rx50img_format::find_size(io_generic *io, uint8_t &track_count, uint8_t &he
track_count = head_count = sector_count = 0;
}
-int rx50img_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int rx50img_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t track_count, head_count, sector_count;
find_size(io, track_count, head_count, sector_count);
@@ -135,7 +140,7 @@ int rx50img_format::identify(io_generic *io, uint32_t form_factor, const std::ve
}
// /* Sectors are numbered 1 to 10 */
-bool rx50img_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool rx50img_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
uint8_t track_count, head_count, sector_count;
find_size(io, track_count, head_count, sector_count);
@@ -153,7 +158,8 @@ bool rx50img_format::load(io_generic *io, uint32_t form_factor, const std::vecto
int track_size = sector_count*512;
for(int track=0; track < track_count; track++) {
for(int head=0; head < head_count; head++) {
- io_generic_read(io, sectdata, (track*head_count + head)*track_size, track_size);
+ size_t actual;
+ io.read_at((track*head_count + head)*track_size, sectdata, track_size, actual);
generate_track(rx50_10_desc, track, head, sectors, sector_count, 102064, image); // 98480
}
}
@@ -163,7 +169,7 @@ bool rx50img_format::load(io_generic *io, uint32_t form_factor, const std::vecto
return true;
}
-bool rx50img_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool rx50img_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int track_count, head_count, sector_count;
get_geometry_mfm_pc(image, 2000, track_count, head_count, sector_count);
@@ -199,7 +205,8 @@ bool rx50img_format::save(io_generic *io, const std::vector<uint32_t> &variants,
for(int track=0; track < track_count; track++) {
for(int head=0; head < head_count; head++) {
get_track_data_mfm_pc(track, head, image, 2000, 512, sector_count, sectdata);
- io_generic_write(io, sectdata, (track*head_count + head)*track_size, track_size);
+ size_t actual;
+ io.write_at((track*head_count + head)*track_size, sectdata, track_size, actual);
}
}
return true;
diff --git a/src/lib/formats/rx50_dsk.h b/src/lib/formats/rx50_dsk.h
index 9cac83bd67f..d28ea398d30 100644
--- a/src/lib/formats/rx50_dsk.h
+++ b/src/lib/formats/rx50_dsk.h
@@ -23,9 +23,9 @@ class rx50img_format : public floppy_image_format_t
public:
rx50img_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -35,7 +35,7 @@ public:
static const desc_e rx50_10_desc[];
private:
- void find_size(io_generic *io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count);
+ void find_size(util::random_read &io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count);
};
extern const floppy_format_type FLOPPY_RX50IMG_FORMAT;
diff --git a/src/lib/formats/sdd_dsk.cpp b/src/lib/formats/sdd_dsk.cpp
index cac33948db0..f3e8df51bda 100644
--- a/src/lib/formats/sdd_dsk.cpp
+++ b/src/lib/formats/sdd_dsk.cpp
@@ -8,10 +8,11 @@
*********************************************************************/
-#include <cassert>
-
#include "formats/sdd_dsk.h"
+#include "ioprocs.h"
+
+
sdd_format::sdd_format() : wd177x_format(formats)
{
}
diff --git a/src/lib/formats/sdf_dsk.cpp b/src/lib/formats/sdf_dsk.cpp
index 223b6dc8d8a..f57540f3c35 100644
--- a/src/lib/formats/sdf_dsk.cpp
+++ b/src/lib/formats/sdf_dsk.cpp
@@ -12,7 +12,9 @@
*********************************************************************/
#include "sdf_dsk.h"
-#include <cassert>
+
+#include "ioprocs.h"
+
sdf_format::sdf_format()
{
@@ -37,18 +39,18 @@ const char *sdf_format::extensions() const
}
-int sdf_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int sdf_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t header[HEADER_SIZE];
- uint64_t size = io_generic_size(io);
-
- if (size < HEADER_SIZE)
+ uint64_t size;
+ if (io.length(size) || (size < HEADER_SIZE))
{
return 0;
}
- io_generic_read(io, header, 0, HEADER_SIZE);
+ size_t actual;
+ io.read_at(0, header, HEADER_SIZE, actual);
int tracks = header[4];
int heads = header[5];
@@ -74,13 +76,14 @@ int sdf_format::identify(io_generic *io, uint32_t form_factor, const std::vector
}
-bool sdf_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool sdf_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
uint8_t header[HEADER_SIZE];
std::vector<uint8_t> track_data(TOTAL_TRACK_SIZE);
std::vector<uint32_t> raw_track_data;
- io_generic_read(io, header, 0, HEADER_SIZE);
+ io.read_at(0, header, HEADER_SIZE, actual);
const int tracks = header[4];
const int heads = header[5];
@@ -104,7 +107,7 @@ bool sdf_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
raw_track_data.clear();
// Read track
- io_generic_read(io, &track_data[0], HEADER_SIZE + ( heads * track + head ) * TOTAL_TRACK_SIZE, TOTAL_TRACK_SIZE);
+ io.read_at(HEADER_SIZE + (heads * track + head) * TOTAL_TRACK_SIZE, &track_data[0], TOTAL_TRACK_SIZE, actual);
int sector_count = track_data[0];
@@ -181,7 +184,7 @@ bool sdf_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
}
-bool sdf_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool sdf_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
return false;
}
diff --git a/src/lib/formats/sdf_dsk.h b/src/lib/formats/sdf_dsk.h
index fe3f6eb7a98..b86692f618a 100644
--- a/src/lib/formats/sdf_dsk.h
+++ b/src/lib/formats/sdf_dsk.h
@@ -22,9 +22,9 @@ class sdf_format : public floppy_image_format_t
public:
sdf_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/st_dsk.cpp b/src/lib/formats/st_dsk.cpp
index cb363cbe3e3..d044bc5bdac 100644
--- a/src/lib/formats/st_dsk.cpp
+++ b/src/lib/formats/st_dsk.cpp
@@ -8,10 +8,11 @@
*********************************************************************/
-#include <cassert>
-
#include "formats/st_dsk.h"
+#include "ioprocs.h"
+
+
st_format::st_format()
{
}
@@ -36,18 +37,20 @@ bool st_format::supports_save() const
return true;
}
-void st_format::find_size(io_generic *io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count)
+void st_format::find_size(util::random_read &io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count)
{
- uint64_t size = io_generic_size(io);
- for(track_count=80; track_count <= 82; track_count++)
- for(head_count=1; head_count <= 2; head_count++)
- for(sector_count=9; sector_count <= 11; sector_count++)
- if(size == (uint32_t)512*track_count*head_count*sector_count)
- return;
+ uint64_t size;
+ if(!io.length(size)) {
+ for(track_count=80; track_count <= 82; track_count++)
+ for(head_count=1; head_count <= 2; head_count++)
+ for(sector_count=9; sector_count <= 11; sector_count++)
+ if(size == (uint32_t)512*track_count*head_count*sector_count)
+ return;
+ }
track_count = head_count = sector_count = 0;
}
-int st_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int st_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint8_t track_count, head_count, sector_count;
find_size(io, track_count, head_count, sector_count);
@@ -57,7 +60,7 @@ int st_format::identify(io_generic *io, uint32_t form_factor, const std::vector<
return 0;
}
-bool st_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool st_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
uint8_t track_count, head_count, sector_count;
find_size(io, track_count, head_count, sector_count);
@@ -73,7 +76,8 @@ bool st_format::load(io_generic *io, uint32_t form_factor, const std::vector<uin
int track_size = sector_count*512;
for(int track=0; track < track_count; track++) {
for(int head=0; head < head_count; head++) {
- io_generic_read(io, sectdata, (track*head_count + head)*track_size, track_size);
+ size_t actual;
+ io.read_at((track*head_count + head)*track_size, sectdata, track_size, actual);
generate_track(atari_st_fcp_get_desc(track, head, head_count, sector_count),
track, head, sectors, sector_count, 100000, image);
}
@@ -84,7 +88,7 @@ bool st_format::load(io_generic *io, uint32_t form_factor, const std::vector<uin
return true;
}
-bool st_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool st_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int track_count, head_count, sector_count;
get_geometry_mfm_pc(image, 2000, track_count, head_count, sector_count);
@@ -109,7 +113,8 @@ bool st_format::save(io_generic *io, const std::vector<uint32_t> &variants, flop
for(int track=0; track < track_count; track++) {
for(int head=0; head < head_count; head++) {
get_track_data_mfm_pc(track, head, image, 2000, 512, sector_count, sectdata);
- io_generic_write(io, sectdata, (track*head_count + head)*track_size, track_size);
+ size_t actual;
+ io.write_at((track*head_count + head)*track_size, sectdata, track_size, actual);
}
}
@@ -141,10 +146,11 @@ bool msa_format::supports_save() const
return true;
}
-void msa_format::read_header(io_generic *io, uint16_t &sign, uint16_t &sect, uint16_t &head, uint16_t &strack, uint16_t &etrack)
+void msa_format::read_header(util::random_read &io, uint16_t &sign, uint16_t &sect, uint16_t &head, uint16_t &strack, uint16_t &etrack)
{
uint8_t h[10];
- io_generic_read(io, h, 0, 10);
+ size_t actual;
+ io.read_at(0, h, 10, actual);
sign = (h[0] << 8) | h[1];
sect = (h[2] << 8) | h[3];
head = (h[4] << 8) | h[5];
@@ -206,7 +212,7 @@ bool msa_format::compress(const uint8_t *buffer, int usize, uint8_t *dest, int &
return dst < usize;
}
-int msa_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int msa_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
uint16_t sign, sect, head, strack, etrack;
read_header(io, sign, sect, head, strack, etrack);
@@ -220,7 +226,7 @@ int msa_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool msa_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool msa_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
uint16_t sign, sect, heads, strack, etrack;
read_header(io, sign, sect, heads, strack, etrack);
@@ -238,11 +244,12 @@ bool msa_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
for(int track=strack; track <= etrack; track++) {
for(int head=0; head <= heads; head++) {
+ size_t actual;
uint8_t th[2];
- io_generic_read(io, th, pos, 2);
+ io.read_at(pos, th, 2, actual);
pos += 2;
int tsize = (th[0] << 8) | th[1];
- io_generic_read(io, sectdata, pos, tsize);
+ io.read_at(pos, sectdata, tsize, actual);
pos += tsize;
if(tsize < track_size) {
if(!uncompress(sectdata, tsize, track_size))
@@ -258,7 +265,7 @@ bool msa_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
}
-bool msa_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool msa_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int track_count, head_count, sector_count;
get_geometry_mfm_pc(image, 2000, track_count, head_count, sector_count);
@@ -289,9 +296,10 @@ bool msa_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
header[8] = 0;
header[9] = track_count-1;
- io_generic_write(io, header, 0, 10);
-
- int pos = 10;
+ if(io.seek(0, SEEK_SET))
+ return false;
+ size_t actual;
+ io.write(header, 10, actual);
uint8_t sectdata[11*512];
uint8_t compdata[11*512];
@@ -305,16 +313,14 @@ bool msa_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
uint8_t th[2];
th[0] = csize >> 8;
th[1] = csize;
- io_generic_write(io, th, pos, 2);
- io_generic_write(io, compdata, pos+2, csize);
- pos += 2+csize;
+ io.write(th, 2, actual);
+ io.write(compdata, csize, actual);
} else {
uint8_t th[2];
th[0] = track_size >> 8;
th[1] = track_size;
- io_generic_write(io, th, pos, 2);
- io_generic_write(io, sectdata, pos+2, track_size);
- pos += 2+track_size;
+ io.write(th, 2, actual);
+ io.write(sectdata, track_size, actual);
}
}
}
diff --git a/src/lib/formats/st_dsk.h b/src/lib/formats/st_dsk.h
index ce501a9f516..34f303bb1ae 100644
--- a/src/lib/formats/st_dsk.h
+++ b/src/lib/formats/st_dsk.h
@@ -19,9 +19,9 @@ class st_format : public floppy_image_format_t
public:
st_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -29,7 +29,7 @@ public:
virtual bool supports_save() const override;
private:
- void find_size(io_generic *io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count);
+ void find_size(util::random_read &io, uint8_t &track_count, uint8_t &head_count, uint8_t &sector_count);
};
class msa_format : public floppy_image_format_t
@@ -37,9 +37,9 @@ class msa_format : public floppy_image_format_t
public:
msa_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
@@ -49,7 +49,7 @@ public:
private:
bool uncompress(uint8_t *buffer, int csize, int usize);
bool compress(const uint8_t *src, int usize, uint8_t *dest, int &csize);
- void read_header(io_generic *io, uint16_t &sign, uint16_t &sect, uint16_t &head, uint16_t &strack, uint16_t &etrack);
+ void read_header(util::random_read &io, uint16_t &sign, uint16_t &sect, uint16_t &head, uint16_t &strack, uint16_t &etrack);
};
extern const floppy_format_type FLOPPY_ST_FORMAT;
diff --git a/src/lib/formats/svi_dsk.cpp b/src/lib/formats/svi_dsk.cpp
index e3cfa294fcb..0a05bd15c80 100644
--- a/src/lib/formats/svi_dsk.cpp
+++ b/src/lib/formats/svi_dsk.cpp
@@ -10,6 +10,9 @@
#include "svi_dsk.h"
+#include "ioprocs.h"
+
+
svi_format::svi_format()
{
}
@@ -29,9 +32,11 @@ const char *svi_format::extensions() const
return "dsk";
}
-int svi_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int svi_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return 0;
if (size == 172032 || size == 346112)
return 50;
@@ -39,11 +44,13 @@ int svi_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool svi_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool svi_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint64_t size = io_generic_size(io);
- int head_count;
+ uint64_t size;
+ if (io.length(size))
+ return false;
+ int head_count;
switch (size)
{
case 172032: head_count = 1; break;
@@ -51,7 +58,8 @@ bool svi_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
default: return false;
}
- int file_offset = 0;
+ if (io.seek(0, SEEK_SET))
+ return false;
for (int track = 0; track < 40; track++)
{
@@ -75,10 +83,10 @@ bool svi_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
sectors[i].bad_crc = false;
sectors[i].data = &sector_data[sector_offset];
- io_generic_read(io, sectors[i].data, file_offset, sector_size);
+ size_t actual;
+ io.read(sectors[i].data, sector_size, actual);
sector_offset += sector_size;
- file_offset += sector_size;
}
if (track == 0 && head == 0)
@@ -91,9 +99,10 @@ bool svi_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
return true;
}
-bool svi_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool svi_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint64_t file_offset = 0;
+ if (io.seek(0, SEEK_SET))
+ return false;
int track_count, head_count;
image->get_actual_geometry(track_count, head_count);
@@ -104,8 +113,8 @@ bool svi_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
for (int i = 0; i < 18; i++)
{
- io_generic_write(io, sectors[i + 1].data(), file_offset, 128);
- file_offset += 128;
+ size_t actual;
+ io.write(sectors[i + 1].data(), 128, actual);
}
// rest are mfm tracks
@@ -121,8 +130,8 @@ bool svi_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
for (int i = 0; i < 17; i++)
{
- io_generic_write(io, sectors[i + 1].data(), file_offset, 256);
- file_offset += 256;
+ size_t actual;
+ io.write(sectors[i + 1].data(), 256, actual);
}
}
}
diff --git a/src/lib/formats/svi_dsk.h b/src/lib/formats/svi_dsk.h
index 57f4f89ccca..a631bdf498c 100644
--- a/src/lib/formats/svi_dsk.h
+++ b/src/lib/formats/svi_dsk.h
@@ -23,9 +23,9 @@ public:
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override;
};
diff --git a/src/lib/formats/td0_dsk.cpp b/src/lib/formats/td0_dsk.cpp
index edac0aae010..345a242c86b 100644
--- a/src/lib/formats/td0_dsk.cpp
+++ b/src/lib/formats/td0_dsk.cpp
@@ -16,9 +16,11 @@
#include "flopimg.h"
-#include <cassert>
+#include "ioprocs.h"
+
#include <cstring>
+
#define BUFSZ 512 // new input buffer
/* LZSS Parameters */
@@ -59,7 +61,16 @@ struct tdlzhuf {
struct td0dsk_t
{
- io_generic *floppy_file;
+public:
+ td0dsk_t(util::random_read &f) : floppy_file(f) { }
+
+ void set_floppy_file_offset(uint64_t o) { floppy_file_offset = o; }
+
+ void init_Decode();
+ int Decode(uint8_t *buf, int len);
+
+private:
+ util::random_read &floppy_file;
uint64_t floppy_file_offset;
struct tdlzhuf tdctl;
@@ -87,29 +98,10 @@ struct td0dsk_t
void update(int c);
int16_t DecodeChar();
int16_t DecodePosition();
- void init_Decode();
- int Decode(uint8_t *buf, int len);
};
//static td0dsk_t td0dsk;
-struct floppy_image_legacy
-{
- struct io_generic io;
-
- const struct FloppyFormat *floppy_option;
- struct FloppyCallbacks format;
-
- /* loaded track stuff */
- int loaded_track_head;
- int loaded_track_index;
- uint32_t loaded_track_size;
- void *loaded_track_data;
- uint8_t loaded_track_status;
- uint8_t flags;
-};
-
-
static struct td0dsk_tag *get_tag(floppy_image_legacy *floppy)
{
struct td0dsk_tag *tag;
@@ -332,11 +324,13 @@ static floperr_t td0_get_indexed_sector_info(floppy_image_legacy *floppy, int he
int td0dsk_t::data_read(uint8_t *buf, uint16_t size)
{
- uint64_t image_size = io_generic_size(floppy_file);
+ uint64_t image_size = 0;
+ floppy_file.length(image_size);
if (size > image_size - floppy_file_offset) {
size = image_size - floppy_file_offset;
}
- io_generic_read(floppy_file,buf,floppy_file_offset,size);
+ size_t actual;
+ floppy_file.read_at(floppy_file_offset, buf, size, actual);
floppy_file_offset += size;
return size;
}
@@ -675,7 +669,6 @@ int td0dsk_t::Decode(uint8_t *buf, int len) /* Decoding/Uncompressing */
FLOPPY_CONSTRUCT( td0_dsk_construct )
{
- td0dsk_t state;
struct FloppyCallbacks *callbacks;
struct td0dsk_tag *tag;
uint8_t *header;
@@ -706,9 +699,9 @@ FLOPPY_CONSTRUCT( td0_dsk_construct )
int rd;
int off = 12;
int size = 0;
- state.floppy_file = &(floppy->io);
+ td0dsk_t state(floppy_get_io(floppy));
state.init_Decode();
- state.floppy_file_offset = 12;
+ state.set_floppy_file_offset(12);
do
{
if((rd = state.Decode(obuf, BUFSZ)) > 0) size += rd;
@@ -720,7 +713,7 @@ FLOPPY_CONSTRUCT( td0_dsk_construct )
return FLOPPY_ERROR_OUTOFMEMORY;
}
memcpy(tag->data,obuf,12);
- state.floppy_file_offset = 12;
+ state.set_floppy_file_offset(12);
state.init_Decode();
do
{
@@ -815,20 +808,22 @@ const char *td0_format::extensions() const
return "td0";
}
-int td0_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int td0_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
+ size_t actual;
uint8_t h[7];
- io_generic_read(io, h, 0, 7);
+ io.read_at(0, h, 7, actual);
if(((h[0] == 'T') && (h[1] == 'D')) || ((h[0] == 't') && (h[1] == 'd')))
{
- return 100;
+ return 100;
}
return 0;
}
-bool td0_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool td0_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
int track_count = 0;
int head_count = 0;
int track_spt;
@@ -837,20 +832,24 @@ bool td0_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
std::vector<uint8_t> imagebuf(max_size);
uint8_t header[12];
- io_generic_read(io, header, 0, 12);
+ io.read_at(0, header, 12, actual);
head_count = header[9];
if(header[0] == 't')
{
- td0dsk_t disk_decode;
+ td0dsk_t disk_decode(io);
- disk_decode.floppy_file = io;
disk_decode.init_Decode();
- disk_decode.floppy_file_offset = 12;
+ disk_decode.set_floppy_file_offset(12);
disk_decode.Decode(&imagebuf[0], max_size);
}
else
- io_generic_read(io, &imagebuf[0], 12, io_generic_size(io));
+ {
+ uint64_t image_size;
+ if(io.length(image_size))
+ return false;
+ io.read_at(12, &imagebuf[0], image_size, actual);
+ }
if(header[7] & 0x80)
offset = 10 + imagebuf[2] + (imagebuf[3] << 8);
@@ -1024,7 +1023,7 @@ bool td0_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
}
-bool td0_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool td0_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
return false;
}
diff --git a/src/lib/formats/td0_dsk.h b/src/lib/formats/td0_dsk.h
index b4656305920..cf625374130 100644
--- a/src/lib/formats/td0_dsk.h
+++ b/src/lib/formats/td0_dsk.h
@@ -13,9 +13,9 @@ class td0_format : public floppy_image_format_t
public:
td0_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/ti99_dsk.cpp b/src/lib/formats/ti99_dsk.cpp
index 06ce98dfda0..507d7dc0ae0 100644
--- a/src/lib/formats/ti99_dsk.cpp
+++ b/src/lib/formats/ti99_dsk.cpp
@@ -43,6 +43,8 @@
#include "ti99_dsk.h"
#include "imageutl.h"
+#include "ioprocs.h"
+
#include "osdcore.h" // osd_printf_* (in osdcore.h)
#include <cstring>
@@ -80,13 +82,16 @@ int ti99_floppy_format::get_encoding(int cell_size)
/*
Load the image from disk and convert it into a sequence of flux levels.
*/
-bool ti99_floppy_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool ti99_floppy_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ uint64_t file_size;
+ if (io.length(file_size))
+ return false;
+
int cell_size = 0;
int sector_count = 0;
int heads = 0;
int log_track_count = 0;
- int file_size = io_generic_size(io);
bool img_high_tpi = false;
bool drive_high_tpi = false;
@@ -211,7 +216,7 @@ bool ti99_floppy_format::load(io_generic *io, uint32_t form_factor, const std::v
/*
Save all tracks to the image file.
*/
-bool ti99_floppy_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool ti99_floppy_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
uint8_t sectordata[9216]; // max size (36*256)
@@ -916,9 +921,12 @@ const char *ti99_sdf_format::extensions() const
return "dsk";
}
-int ti99_sdf_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int ti99_sdf_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t file_size = io_generic_size(io);
+ uint64_t file_size;
+ if (io.length(file_size))
+ return 0;
+
int vote = 0;
// Adding support for another sector image format which adds 768 bytes
@@ -947,7 +955,8 @@ int ti99_sdf_format::identify(io_generic *io, uint32_t form_factor, const std::v
{
// Read first sector (Volume Information Block)
ti99vib vib;
- io_generic_read(io, &vib, 0, sizeof(ti99vib));
+ size_t actual;
+ io.read_at(0, &vib, sizeof(ti99vib), actual);
// Check from contents
if ((vib.id[0]=='D')&&(vib.id[1]=='S')&&(vib.id[2]=='K'))
@@ -964,10 +973,14 @@ int ti99_sdf_format::identify(io_generic *io, uint32_t form_factor, const std::v
return vote;
}
-void ti99_sdf_format::determine_sizes(io_generic *io, int& cell_size, int& sector_count, int& heads, int& tracks)
+void ti99_sdf_format::determine_sizes(util::random_read &io, int& cell_size, int& sector_count, int& heads, int& tracks)
{
- uint64_t file_size = io_generic_size(io);
- ti99vib vib;
+ uint64_t file_size;
+ if (io.length(file_size))
+ {
+ cell_size = sector_count = heads = tracks = 0;
+ return;
+ }
cell_size = 0;
sector_count = 0;
@@ -980,7 +993,9 @@ void ti99_sdf_format::determine_sizes(io_generic *io, int& cell_size, int& secto
file_size -= 768;
// Read first sector
- io_generic_read(io, &vib, 0, sizeof(ti99vib));
+ ti99vib vib;
+ size_t actual;
+ io.read_at(0, &vib, sizeof(ti99vib), actual);
// Check from contents
if ((vib.id[0]=='D')&&(vib.id[1]=='S')&&(vib.id[2]=='K'))
@@ -1059,13 +1074,14 @@ int ti99_sdf_format::get_track_size(int sector_count)
return sector_count * SECTOR_SIZE;
}
-void ti99_sdf_format::load_track(io_generic *io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sectorcount, int trackcount)
+void ti99_sdf_format::load_track(util::random_read &io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sectorcount, int trackcount)
{
// Calculate the track offset from the beginning of the image file
int logicaltrack = (head==0)? track : (2*trackcount - track - 1);
int position = logicaltrack * get_track_size(sectorcount);
- io_generic_read(io, sectordata, position, sectorcount*SECTOR_SIZE);
+ size_t actual;
+ io.read_at(position, sectordata, sectorcount*SECTOR_SIZE, actual);
// Interleave and skew
int interleave = 7;
@@ -1133,19 +1149,18 @@ std::string ti99_floppy_format::dumpline(uint8_t* line, int address) const
Write the data to the disk. We have a list of sector positions, so we
just need to go through that list and save each sector in the sector data.
*/
-void ti99_sdf_format::write_track(io_generic *io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count)
+void ti99_sdf_format::write_track(util::random_read_write &io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count)
{
- uint8_t* buf;
-
int logicaltrack = head * track_count;
logicaltrack += ((head&1)==0)? track : (track_count - 1 - track);
int trackoffset = logicaltrack * sector_count * SECTOR_SIZE;
for (int i=0; i < sector_count; i++)
{
- buf = sectordata + i * SECTOR_SIZE;
+ uint8_t const *const buf = sectordata + i * SECTOR_SIZE;
LOGMASKED(LOG_DETAIL, "[ti99_dsk] Writing sector %d (offset %06x)\n", sector[i], sector[i] * SECTOR_SIZE);
- io_generic_write(io, buf, trackoffset + sector[i] * SECTOR_SIZE, SECTOR_SIZE);
+ size_t actual;
+ io.write_at(trackoffset + sector[i] * SECTOR_SIZE, buf, SECTOR_SIZE, actual);
}
}
@@ -1209,7 +1224,7 @@ const char *ti99_tdf_format::extensions() const
/*
Determine whether the image file can be interpreted as a track dump
*/
-int ti99_tdf_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int ti99_tdf_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
int vote = 0;
uint8_t fulltrack[6872];
@@ -1232,7 +1247,8 @@ int ti99_tdf_format::identify(io_generic *io, uint32_t form_factor, const std::v
LOGMASKED(LOG_INFO, "[ti99_dsk] Image file length matches TDF\n");
// Fetch track 0
- io_generic_read(io, fulltrack, 0, get_track_size(sector_count));
+ size_t actual;
+ io.read_at(0, fulltrack, get_track_size(sector_count), actual);
if (sector_count == 9)
{
@@ -1279,9 +1295,14 @@ int ti99_tdf_format::identify(io_generic *io, uint32_t form_factor, const std::v
Find the proper format for a given image file. Tracks are counted per side.
Note that only two formats are actually compatible with the PC99 emulator.
*/
-void ti99_tdf_format::determine_sizes(io_generic *io, int& cell_size, int& sector_count, int& heads, int& tracks)
+void ti99_tdf_format::determine_sizes(util::random_read &io, int& cell_size, int& sector_count, int& heads, int& tracks)
{
- uint64_t file_size = io_generic_size(io);
+ uint64_t file_size;
+ if (io.length(file_size))
+ {
+ cell_size = sector_count = heads = tracks = 0;
+ return;
+ }
// LOGMASKED(LOG_INFO, "[ti99_dsk] Image size = %ld\n", file_size); // doesn't compile
switch (file_size)
@@ -1336,13 +1357,14 @@ void ti99_tdf_format::determine_sizes(io_generic *io, int& cell_size, int& secto
track from scratch. TDF is not as flexible as it suggests, it does not
allow different gap lengths and so on.
*/
-void ti99_tdf_format::load_track(io_generic *io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sectorcount, int trackcount)
+void ti99_tdf_format::load_track(util::random_read &io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sectorcount, int trackcount)
{
+ size_t actual;
uint8_t fulltrack[12544]; // space for a full TDF track
// Read beginning of track 0. We need this to get the first gap, according
// to the format
- io_generic_read(io, fulltrack, 0, 100);
+ io.read_at(0, fulltrack, 100, actual);
int offset = 0;
int tracksize = get_track_size(sectorcount);
@@ -1383,7 +1405,7 @@ void ti99_tdf_format::load_track(io_generic *io, uint8_t *sectordata, int *secto
int base = (head * trackcount + track) * tracksize;
int position = 0;
- io_generic_read(io, fulltrack, base, tracksize);
+ io.read_at(base, fulltrack, tracksize, actual);
for (int i=0; i < sectorcount; i++)
{
@@ -1431,7 +1453,7 @@ void ti99_tdf_format::load_track(io_generic *io, uint8_t *sectordata, int *secto
need the sector contents and the sector sequence, which are passed via
sectordata, sector, and sector_count.
*/
-void ti99_tdf_format::write_track(io_generic *io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count)
+void ti99_tdf_format::write_track(util::random_read_write &io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count)
{
uint8_t trackdata[12544];
int offset = ((track_count * head) + track) * get_track_size(sector_count);
@@ -1485,7 +1507,8 @@ void ti99_tdf_format::write_track(io_generic *io, uint8_t *sectordata, int *sect
for (int i=0; i < param[WGAP3]; i++) trackdata[pos++] = param[WGAPBYTE];
}
for (int i=0; i < param[WGAP4]; i++) trackdata[pos++] = param[WGAPBYTE];
- io_generic_write(io, trackdata, offset, get_track_size(sector_count));
+ size_t actual;
+ io.write_at(offset, trackdata, get_track_size(sector_count), actual);
}
int ti99_tdf_format::get_track_size(int sector_count)
diff --git a/src/lib/formats/ti99_dsk.h b/src/lib/formats/ti99_dsk.h
index 5b59b164344..6590d1e7dd2 100644
--- a/src/lib/formats/ti99_dsk.h
+++ b/src/lib/formats/ti99_dsk.h
@@ -23,8 +23,8 @@ class ti99_floppy_format : public floppy_image_format_t
{
public:
bool supports_save() const override { return true; }
- bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
protected:
uint8_t get_data_from_encoding(uint16_t raw);
@@ -32,10 +32,10 @@ protected:
virtual int min_heads() =0;
- virtual void determine_sizes(io_generic *io, int& cell_size, int& sector_count, int& heads, int& tracks) =0;
+ virtual void determine_sizes(util::random_read &io, int& cell_size, int& sector_count, int& heads, int& tracks) =0;
virtual int get_track_size(int sector_count) =0;
- virtual void load_track(io_generic *io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sectorcount, int trackcount) =0;
- virtual void write_track(io_generic *io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count) =0;
+ virtual void load_track(util::random_read &io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sectorcount, int trackcount) =0;
+ virtual void write_track(util::random_read_write &io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count) =0;
int get_encoding(int cell_size);
@@ -53,16 +53,16 @@ protected:
class ti99_sdf_format : public ti99_floppy_format
{
public:
- int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
const char *name() const override;
const char *description() const override;
const char *extensions() const override;
private:
- void determine_sizes(io_generic *io, int& cell_size, int& sector_count, int& heads, int& tracks) override;
+ void determine_sizes(util::random_read &io, int& cell_size, int& sector_count, int& heads, int& tracks) override;
int get_track_size(int sector_count) override;
- void write_track(io_generic *io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count) override;
- void load_track(io_generic *io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sector_count, int track_count) override;
+ void write_track(util::random_read_write &io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count) override;
+ void load_track(util::random_read &io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sector_count, int track_count) override;
// This format supports single-sided images
int min_heads() override { return 1; }
@@ -92,15 +92,15 @@ extern const floppy_format_type FLOPPY_TI99_SDF_FORMAT;
class ti99_tdf_format : public ti99_floppy_format
{
public:
- int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
const char *name() const override;
const char *description() const override;
const char *extensions() const override;
private:
- void determine_sizes(io_generic *io, int& cell_size, int& sector_count, int& heads, int& tracks) override;
- void load_track(io_generic *io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sectorcount, int trackcount) override;
- void write_track(io_generic *io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count) override;
+ void determine_sizes(util::random_read &io, int& cell_size, int& sector_count, int& heads, int& tracks) override;
+ void load_track(util::random_read &io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sectorcount, int trackcount) override;
+ void write_track(util::random_read_write &io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count) override;
int get_track_size(int sector_count) override;
// This format only supports double-sided images
diff --git a/src/lib/formats/trd_dsk.cpp b/src/lib/formats/trd_dsk.cpp
index 26b6ce5b6a5..4236259cca5 100644
--- a/src/lib/formats/trd_dsk.cpp
+++ b/src/lib/formats/trd_dsk.cpp
@@ -8,10 +8,11 @@
*********************************************************************/
-#include <cassert>
-
#include "formats/trd_dsk.h"
+#include "ioprocs.h"
+
+
trd_format::trd_format() : wd177x_format(formats)
{
}
@@ -31,10 +32,13 @@ const char *trd_format::extensions() const
return "trd";
}
-int trd_format::find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int trd_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
+ uint64_t size;
+ if (io.length(size))
+ return -1;
+
int index = -1;
- uint64_t size = io_generic_size(io);
for (int i = 0; formats[i].form_factor; i++)
{
const format &f = formats[i];
@@ -47,12 +51,13 @@ int trd_format::find_size(io_generic *io, uint32_t form_factor, const std::vecto
{
index = i; // at least size match, save it for the case if there will be no exact matches
+ size_t actual;
uint8_t sectdata[0x100];
if (f.encoding == floppy_image::MFM)
- io_generic_read(io, sectdata, 0x800, 0x100);
+ io.read_at(0x800, sectdata, 0x100, actual);
else
{
- io_generic_read(io, sectdata, 0x100, 0x100);
+ io.read_at(0x100, sectdata, 0x100, actual);
for (int i = 0; i < 0x100; i++)
sectdata[i] ^= 0xff;
}
diff --git a/src/lib/formats/trd_dsk.h b/src/lib/formats/trd_dsk.h
index 6f19f9976a5..c5a411c60bb 100644
--- a/src/lib/formats/trd_dsk.h
+++ b/src/lib/formats/trd_dsk.h
@@ -24,7 +24,7 @@ public:
private:
static const format formats[];
- virtual int find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
};
extern const floppy_format_type FLOPPY_TRD_FORMAT;
diff --git a/src/lib/formats/trs80_dsk.cpp b/src/lib/formats/trs80_dsk.cpp
index f010a24e570..acd48368239 100644
--- a/src/lib/formats/trs80_dsk.cpp
+++ b/src/lib/formats/trs80_dsk.cpp
@@ -66,6 +66,9 @@ Description of JV3:
#include "trs80_dsk.h"
+#include "ioprocs.h"
+
+
jv1_format::jv1_format() : wd177x_format(formats)
{
}
@@ -132,15 +135,18 @@ const char *jv3_format::extensions() const
return "jv3,dsk";
}
-int jv3_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int jv3_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint32_t image_size = io_generic_size(io);
+ uint64_t image_size;
+ if (io.length(image_size))
+ return 0;
if (image_size < 0x2200)
return 0; // too small, silent return
std::vector<uint8_t> data(image_size);
- io_generic_read(io, data.data(), 0, image_size);
+ size_t actual;
+ io.read_at(0, data.data(), image_size, actual);
const uint32_t entries = 2901;
const uint32_t header_size = entries *3 +1;
@@ -181,20 +187,20 @@ int jv3_format::identify(io_generic *io, uint32_t form_factor, const std::vector
// validate so we don't overrun the array
if (track >= MAX_TRACKS)
{
- printf("jv3_format::identify - track %d exceeds maximum allowed (%d)\n",track,MAX_TRACKS-1);
+ osd_printf_info("jv3_format::identify - track %d exceeds maximum allowed (%d)\n",track,MAX_TRACKS-1);
return 0;
}
if (sector >= MAX_SECTORS)
{
- printf("jv3_format::identify - sector %d exceeds maximum allowed (%d)\n",sector,MAX_SECTORS-1);
+ osd_printf_info("jv3_format::identify - sector %d exceeds maximum allowed (%d)\n",sector,MAX_SECTORS-1);
return 0;
}
// check if sector already exists
if (sector_array[flag_side][track][sector])
{
- printf("jv3_format::identify - side %d track %d sector %d is duplicated\n",flag_side,track,sector);
+ osd_printf_info("jv3_format::identify - side %d track %d sector %d is duplicated\n",flag_side,track,sector);
return 0;
}
@@ -214,21 +220,25 @@ int jv3_format::identify(io_generic *io, uint32_t form_factor, const std::vector
// Is all data in the image? (unused tracks at the end are optional)
if (last_data > image_size)
{
- printf("jv3_format::identify - disk is missing some data. Expected 0x%X, Actual = 0x%X\n",last_data,image_size);
+ osd_printf_info("jv3_format::identify - disk is missing some data. Expected 0x%X, Actual = 0x%X\n",last_data,image_size);
return 0;
}
return 80;
}
-bool jv3_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool jv3_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
// disk has already been validated in every way except if it exceeds drive tracks, we do that below
- printf("Disk detected as JV3\n");fflush(stdout);
+ osd_printf_info("Disk detected as JV3\n");
int drive_tracks, drive_sides;
image->get_maximal_geometry(drive_tracks, drive_sides);
- std::vector<uint8_t> data(io_generic_size(io));
- io_generic_read(io, data.data(), 0, data.size());
+ uint64_t image_size;
+ if (io.length(image_size))
+ return false;
+ std::vector<uint8_t> data(image_size);
+ size_t actual;
+ io.read_at(0, data.data(), data.size(), actual);
const uint32_t entries = 2901;
const uint32_t header_size = entries *3 +1;
bool is_dd = false, is_ds = false;
@@ -313,7 +323,7 @@ bool jv3_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
data_ptr += sector_size;
}
- //printf("Side %d, Track %d, %s density\n",curr_side,curr_track,ddensity ? "Double" : "Single");
+ //osd_printf_verbose("Side %d, Track %d, %s density\n",curr_side,curr_track,ddensity ? "Double" : "Single");
if (ddensity)
{
is_dd = true;
@@ -344,7 +354,7 @@ bool jv3_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
return true;
}
-bool jv3_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool jv3_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int track_count, head_count;
image->get_actual_geometry(track_count, head_count);
@@ -352,10 +362,15 @@ bool jv3_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
if (track_count)
{
// If the disk already exists, find out if it's writable
- std::vector<uint8_t> data(io_generic_size(io));
- io_generic_read(io, data.data(), 0, data.size());
- if ((data.size() >= 0x2200) && (data[0x21ff] == 0))
- return false; // disk is readonly
+ uint64_t image_size;
+ if (!io.length(image_size))
+ {
+ std::vector<uint8_t> data(image_size);
+ size_t actual;
+ io.read_at(0, data.data(), data.size(), actual);
+ if ((data.size() >= 0x2200) && (data[0x21ff] == 0))
+ return false; // disk is readonly
+ }
}
uint32_t data_ptr = 0x2200, sect_ptr = 0;
@@ -396,7 +411,8 @@ bool jv3_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
header[sect_ptr++] = track;
header[sect_ptr++] = i;
header[sect_ptr++] = head ? 0x10 : 0;
- io_generic_write(io, &dummy[0], data_ptr, 256);
+ size_t actual;
+ io.write_at(data_ptr, &dummy[0], 256, actual);
data_ptr += 256;
}
}
@@ -417,14 +433,16 @@ bool jv3_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
flags |= (sectors[i].size() >> 8) ^1;
flags |= head ? 0x10 : 0;
header[sect_ptr++] = flags;
- io_generic_write(io, sectors[i].data(), data_ptr, sectors[i].size());
+ size_t actual;
+ io.write_at(data_ptr, sectors[i].data(), sectors[i].size(), actual);
data_ptr += sectors[i].size();
}
}
}
}
// Save the header
- io_generic_write(io, header, 0, 0x2200);
+ size_t actual;
+ io.write_at(0, header, 0x2200, actual);
return true;
}
diff --git a/src/lib/formats/trs80_dsk.h b/src/lib/formats/trs80_dsk.h
index 60618a93693..31955fe4a5e 100644
--- a/src/lib/formats/trs80_dsk.h
+++ b/src/lib/formats/trs80_dsk.h
@@ -35,9 +35,9 @@ class jv3_format : public floppy_image_format_t
public:
jv3_format();
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual const char *name() const override;
virtual const char *description() const override;
diff --git a/src/lib/formats/uniflex_dsk.cpp b/src/lib/formats/uniflex_dsk.cpp
index fa5d9b50acc..f85da09b75e 100644
--- a/src/lib/formats/uniflex_dsk.cpp
+++ b/src/lib/formats/uniflex_dsk.cpp
@@ -10,7 +10,10 @@
*/
#include "uniflex_dsk.h"
-#include "formats/imageutl.h"
+#include "imageutl.h"
+
+#include "ioprocs.h"
+
uniflex_format::uniflex_format() : wd177x_format(formats)
{
@@ -31,22 +34,26 @@ const char *uniflex_format::extensions() const
return "dsk";
}
-int uniflex_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int uniflex_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- int type = find_size(io, form_factor, variants);
+ int const type = find_size(io, form_factor, variants);
if (type != -1)
return 75;
+
return 0;
}
-int uniflex_format::find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int uniflex_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
- uint8_t sir[192];
+ uint64_t size;
+ if (io.length(size))
+ return -1;
// Look at the SIR sector, the second sector.
- io_generic_read(io, sir, 1 * 512, sizeof(sir));
+ uint8_t sir[192];
+ size_t actual;
+ io.read_at(1 * 512, sir, sizeof(sir), actual);
uint16_t fdn_block_count = pick_integer_be(sir, 0x10, 2);
uint32_t last_block_number = pick_integer_be(sir, 0x12, 3);
diff --git a/src/lib/formats/uniflex_dsk.h b/src/lib/formats/uniflex_dsk.h
index fad6741f533..af39a09678e 100644
--- a/src/lib/formats/uniflex_dsk.h
+++ b/src/lib/formats/uniflex_dsk.h
@@ -19,8 +19,8 @@ public:
virtual const char *name() const override;
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual int find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual int find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
void build_sector_description(const format &f, uint8_t *sectdata, desc_s *sectors, int track, int head) const override;
private:
diff --git a/src/lib/formats/upd765_dsk.cpp b/src/lib/formats/upd765_dsk.cpp
index e7118dde236..d0afab39352 100644
--- a/src/lib/formats/upd765_dsk.cpp
+++ b/src/lib/formats/upd765_dsk.cpp
@@ -10,14 +10,19 @@
#include "formats/upd765_dsk.h"
+#include "ioprocs.h"
+
upd765_format::upd765_format(const format *_formats) : file_header_skip_bytes(0), file_footer_skip_bytes(0), formats(_formats)
{
}
-int upd765_format::find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) const
+int upd765_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return -1;
+
for(int i=0; formats[i].form_factor; i++) {
const format &f = formats[i];
if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
@@ -31,7 +36,7 @@ int upd765_format::find_size(io_generic *io, uint32_t form_factor, const std::ve
return -1;
}
-int upd765_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int upd765_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
int type = find_size(io, form_factor, variants);
@@ -175,7 +180,7 @@ floppy_image_format_t::desc_e* upd765_format::get_desc_mfm(const format &f, int
return desc;
}
-bool upd765_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool upd765_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
int type = find_size(io, form_factor, variants);
if(type == -1)
@@ -222,7 +227,8 @@ bool upd765_format::load(io_generic *io, uint32_t form_factor, const std::vector
for(int track=0; track < f.track_count; track++)
for(int head=0; head < f.head_count; head++) {
build_sector_description(f, sectdata, sectors, track, head);
- io_generic_read(io, sectdata, file_header_skip_bytes + (track*f.head_count + head)*track_size, track_size);
+ size_t actual;
+ io.read_at(file_header_skip_bytes + (track*f.head_count + head)*track_size, sectdata, track_size, actual);
generate_track(desc, track, head, sectors, f.sector_count, total_size, image);
}
@@ -236,7 +242,7 @@ bool upd765_format::supports_save() const
return true;
}
-bool upd765_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool upd765_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
// Count the number of formats
int formats_count;
@@ -346,7 +352,8 @@ bool upd765_format::save(io_generic *io, const std::vector<uint32_t> &variants,
for(int head=0; head < f.head_count; head++) {
build_sector_description(f, sectdata, sectors, track, head);
extract_sectors(image, f, sectors, track, head);
- io_generic_write(io, sectdata, (track*f.head_count + head)*track_size, track_size);
+ size_t actual;
+ io.write_at((track*f.head_count + head)*track_size, sectdata, track_size, actual);
}
return true;
diff --git a/src/lib/formats/upd765_dsk.h b/src/lib/formats/upd765_dsk.h
index e93a0f24326..48acfc02a88 100644
--- a/src/lib/formats/upd765_dsk.h
+++ b/src/lib/formats/upd765_dsk.h
@@ -39,9 +39,9 @@ public:
// End the array with {}
upd765_format(const format *formats);
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override;
protected:
@@ -50,7 +50,7 @@ protected:
floppy_image_format_t::desc_e* get_desc_fm(const format &f, int &current_size, int &end_gap_index);
floppy_image_format_t::desc_e* get_desc_mfm(const format &f, int &current_size, int &end_gap_index);
- int find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) const;
+ int find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const;
int compute_track_size(const format &f) const;
virtual void build_sector_description(const format &d, uint8_t *sectdata, desc_s *sectors, int track, int head) const;
void check_compatibility(floppy_image *image, std::vector<int> &candidates);
diff --git a/src/lib/formats/vdk_dsk.cpp b/src/lib/formats/vdk_dsk.cpp
index 57c44f8bb29..759697f852f 100644
--- a/src/lib/formats/vdk_dsk.cpp
+++ b/src/lib/formats/vdk_dsk.cpp
@@ -12,6 +12,9 @@
#include "vdk_dsk.h"
+#include "ioprocs.h"
+
+
vdk_format::vdk_format()
{
}
@@ -31,10 +34,11 @@ const char *vdk_format::extensions() const
return "vdk";
}
-int vdk_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int vdk_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
+ size_t actual;
uint8_t id[2];
- io_generic_read(io, id, 0, 2);
+ io.read_at(0, id, 2, actual);
if (id[0] == 'd' && id[1] == 'k')
return 50;
@@ -42,16 +46,21 @@ int vdk_format::identify(io_generic *io, uint32_t form_factor, const std::vector
return 0;
}
-bool vdk_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool vdk_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ size_t actual;
+ if (io.seek(0, SEEK_SET))
+ return false;
+
uint8_t header[0x100];
- io_generic_read(io, header, 0, 0x100);
+ io.read(header, 0x100, actual);
- int header_size = header[3] * 0x100 + header[2];
- int track_count = header[8];
- int head_count = header[9];
+ int const header_size = header[3] * 0x100 + header[2];
+ int const track_count = header[8];
+ int const head_count = header[9];
- int file_offset = header_size;
+ if (io.seek(header_size, SEEK_SET))
+ return false;
for (int track = 0; track < track_count; track++)
{
@@ -72,10 +81,9 @@ bool vdk_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
sectors[i].bad_crc = false;
sectors[i].data = &sector_data[sector_offset];
- io_generic_read(io, sectors[i].data, file_offset, SECTOR_SIZE);
+ io.read(sectors[i].data, SECTOR_SIZE, actual);
sector_offset += SECTOR_SIZE;
- file_offset += SECTOR_SIZE;
}
build_wd_track_mfm(track, head, image, 100000, SECTOR_COUNT, sectors, 22, 32, 24);
@@ -85,9 +93,11 @@ bool vdk_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui
return true;
}
-bool vdk_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool vdk_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
- uint64_t file_offset = 0;
+ size_t actual;
+ if (io.seek(0, SEEK_SET))
+ return false;
int track_count, head_count;
image->get_actual_geometry(track_count, head_count);
@@ -108,8 +118,7 @@ bool vdk_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
header[10] = 0;
header[11] = 0;
- io_generic_write(io, header, file_offset, sizeof(header));
- file_offset += sizeof(header);
+ io.write(header, sizeof(header), actual);
// write disk data
for (int track = 0; track < track_count; track++)
@@ -120,10 +129,7 @@ bool vdk_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo
auto sectors = extract_sectors_from_bitstream_mfm_pc(bitstream);
for (int i = 0; i < SECTOR_COUNT; i++)
- {
- io_generic_write(io, sectors[FIRST_SECTOR_ID + i].data(), file_offset, SECTOR_SIZE);
- file_offset += SECTOR_SIZE;
- }
+ io.write(sectors[FIRST_SECTOR_ID + i].data(), SECTOR_SIZE, actual);
}
}
diff --git a/src/lib/formats/vdk_dsk.h b/src/lib/formats/vdk_dsk.h
index 94347b326f6..797d2644972 100644
--- a/src/lib/formats/vdk_dsk.h
+++ b/src/lib/formats/vdk_dsk.h
@@ -25,9 +25,9 @@ public:
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override;
private:
diff --git a/src/lib/formats/victor9k_dsk.cpp b/src/lib/formats/victor9k_dsk.cpp
index ace1ec50933..3a142629726 100644
--- a/src/lib/formats/victor9k_dsk.cpp
+++ b/src/lib/formats/victor9k_dsk.cpp
@@ -99,6 +99,8 @@
#include "formats/victor9k_dsk.h"
+#include "ioprocs.h"
+
victor9k_format::victor9k_format()
{
@@ -119,18 +121,22 @@ const char *victor9k_format::extensions() const
return "img";
}
-int victor9k_format::find_size(io_generic *io, uint32_t form_factor)
+int victor9k_format::find_size(util::random_read &io, uint32_t form_factor)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return -1;
+
for(int i=0; formats[i].sector_count; i++) {
const format &f = formats[i];
if(size == (uint32_t) f.sector_count*f.sector_base_size*f.head_count)
return i;
}
+
return -1;
}
-int victor9k_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int victor9k_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
int type = find_size(io, form_factor);
@@ -248,19 +254,24 @@ void victor9k_format::build_sector_description(const format &f, uint8_t *sectdat
}
}
-bool victor9k_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool victor9k_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- int type = find_size(io, form_factor);
+ int const type = find_size(io, form_factor);
if(type == -1)
return false;
const format &f = formats[type];
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return false;
+
std::vector<uint8_t> img;
- img.resize(size);
+ try { img.resize(size); }
+ catch (...) { return false; }
- io_generic_read(io, &img[0], 0, size);
+ size_t actual;
+ io.read_at(0, &img[0], size, actual);
log_boot_sector(&img[0]);
@@ -392,7 +403,7 @@ const int victor9k_format::rpm[9] =
252, 267, 283, 300, 321, 342, 368, 401, 417
};
-bool victor9k_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool victor9k_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
const format &f = formats[0];
@@ -406,7 +417,8 @@ bool victor9k_format::save(io_generic *io, const std::vector<uint32_t> &variants
build_sector_description(f, sectdata, 0, sectors, sector_count);
extract_sectors(image, f, sectors, track, head, sector_count);
- io_generic_write(io, sectdata, offset, track_size);
+ size_t actual;
+ io.write_at(offset, sectdata, track_size, actual);
}
}
diff --git a/src/lib/formats/victor9k_dsk.h b/src/lib/formats/victor9k_dsk.h
index 92d1c664a5f..aafd8fdcb14 100644
--- a/src/lib/formats/victor9k_dsk.h
+++ b/src/lib/formats/victor9k_dsk.h
@@ -34,9 +34,9 @@ public:
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override { return true; }
static int get_rpm(int head, int track);
@@ -49,7 +49,7 @@ protected:
static const int speed_zone[2][80];
static const int rpm[9];
- int find_size(io_generic *io, uint32_t form_factor);
+ int find_size(util::random_read &io, uint32_t form_factor);
void log_boot_sector(uint8_t *data);
floppy_image_format_t::desc_e* get_sector_desc(const format &f, int &current_size, int sector_count);
void build_sector_description(const format &f, uint8_t *sectdata, uint32_t sect_offs, desc_s *sectors, int sector_count) const;
diff --git a/src/lib/formats/vt_dsk.cpp b/src/lib/formats/vt_dsk.cpp
index d6cc3da4521..15c6955bfcc 100644
--- a/src/lib/formats/vt_dsk.cpp
+++ b/src/lib/formats/vt_dsk.cpp
@@ -10,6 +10,9 @@
#include "formats/vt_dsk.h"
+#include "ioprocs.h"
+
+
// Zero = | 9187 |
// One = | 2237 | 6950 |
// 0.5us ~= 143
@@ -213,9 +216,11 @@ const char *vtech_dsk_format::extensions() const
return "dsk";
}
-int vtech_bin_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int vtech_bin_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- int size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return 0;
if(size == 40*16*256)
return 50;
@@ -223,14 +228,18 @@ int vtech_bin_format::identify(io_generic *io, uint32_t form_factor, const std::
return 0;
}
-int vtech_dsk_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int vtech_dsk_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- int size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return 0;
+
if(size < 256)
return 0;
std::vector<uint8_t> bdata(size);
- io_generic_read(io, bdata.data(), 0, size);
+ size_t actual;
+ io.read_at(0, bdata.data(), size, actual);
// Structurally validate the presence of sector headers and data
int count_sh = 0, count_sd = 0;
@@ -246,25 +255,29 @@ int vtech_dsk_format::identify(io_generic *io, uint32_t form_factor, const std::
return count_sh >= 30*16 && count_sd >= 30*16 ? 100 : 0;
}
-bool vtech_bin_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool vtech_bin_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- int size = io_generic_size(io);
- if(size != 40*16*256)
+ uint64_t size;
+ if(io.length(size) || (size != 40*16*256))
return false;
std::vector<uint8_t> bdata(size);
- io_generic_read(io, bdata.data(), 0, size);
+ size_t actual;
+ io.read_at(0, bdata.data(), size, actual);
image_to_flux(bdata, image);
image->set_form_variant(floppy_image::FF_525, floppy_image::SSSD);
return true;
}
-bool vtech_dsk_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool vtech_dsk_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- int size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return false;
std::vector<uint8_t> bdata(size);
- io_generic_read(io, bdata.data(), 0, size);
+ size_t actual;
+ io.read_at(0, bdata.data(), size, actual);
std::vector<uint8_t> bdatax(128*16*40, 0);
@@ -327,7 +340,7 @@ bool vtech_dsk_format::load(io_generic *io, uint32_t form_factor, const std::vec
return true;
}
-bool vtech_bin_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool vtech_bin_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int tracks, heads;
image->get_maximal_geometry(tracks, heads);
@@ -335,11 +348,12 @@ bool vtech_bin_format::save(io_generic *io, const std::vector<uint32_t> &variant
return false;
auto bdata = flux_to_image(image);
- io_generic_write(io, bdata.data(), 0, bdata.size());
+ size_t actual;
+ io.write_at(0, bdata.data(), bdata.size(), actual);
return true;
}
-bool vtech_dsk_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool vtech_dsk_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
int tracks, heads;
image->get_maximal_geometry(tracks, heads);
@@ -387,7 +401,8 @@ bool vtech_dsk_format::save(io_generic *io, const std::vector<uint32_t> &variant
}
}
- io_generic_write(io, bdatax.data(), 0, bdatax.size());
+ size_t actual;
+ io.write_at(0, bdatax.data(), bdatax.size(), actual);
return true;
}
diff --git a/src/lib/formats/vt_dsk.h b/src/lib/formats/vt_dsk.h
index 739e5234a3f..4bc46871e7e 100644
--- a/src/lib/formats/vt_dsk.h
+++ b/src/lib/formats/vt_dsk.h
@@ -34,9 +34,9 @@ public:
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
};
class vtech_dsk_format : public vtech_common_format {
@@ -47,9 +47,9 @@ public:
virtual const char *description() const override;
virtual const char *extensions() const override;
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
};
extern const floppy_format_type FLOPPY_VTECH_BIN_FORMAT;
diff --git a/src/lib/formats/wd177x_dsk.cpp b/src/lib/formats/wd177x_dsk.cpp
index 22309f32a12..75f3396020f 100644
--- a/src/lib/formats/wd177x_dsk.cpp
+++ b/src/lib/formats/wd177x_dsk.cpp
@@ -10,6 +10,8 @@
#include "formats/wd177x_dsk.h"
+#include "ioprocs.h"
+
wd177x_format::wd177x_format(const format *_formats)
{
@@ -29,9 +31,12 @@ const wd177x_format::format &wd177x_format::get_track_format(const format &f, in
/*
Default implementation for find_size. May be overwritten by subclasses.
*/
-int wd177x_format::find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int wd177x_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if(io.length(size))
+ return -1;
+
for(int i=0; formats[i].form_factor; i++) {
const format &f = formats[i];
if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
@@ -49,15 +54,17 @@ int wd177x_format::find_size(io_generic *io, uint32_t form_factor, const std::ve
if(size == format_size)
return i;
}
+
return -1;
}
-int wd177x_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int wd177x_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
{
- int type = find_size(io, form_factor, variants);
+ int const type = find_size(io, form_factor, variants);
if(type != -1)
return 50;
+
return 0;
}
@@ -197,9 +204,9 @@ floppy_image_format_t::desc_e* wd177x_format::get_desc_mfm(const format &f, int
return desc;
}
-bool wd177x_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool wd177x_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
- int type = find_size(io, form_factor, variants);
+ int const type = find_size(io, form_factor, variants);
if(type == -1)
return false;
@@ -251,7 +258,8 @@ bool wd177x_format::load(io_generic *io, uint32_t form_factor, const std::vector
build_sector_description(tf, sectdata, sectors, track, head);
int track_size = compute_track_size(tf);
- io_generic_read(io, sectdata, get_image_offset(f, head, track), track_size);
+ size_t actual;
+ io.read_at(get_image_offset(f, head, track), sectdata, track_size, actual);
generate_track(desc, track, head, sectors, tf.sector_count, total_size, image);
}
@@ -265,7 +273,7 @@ bool wd177x_format::supports_save() const
return true;
}
-bool wd177x_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool wd177x_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
{
// Count the number of formats
int formats_count;
@@ -377,7 +385,8 @@ bool wd177x_format::save(io_generic *io, const std::vector<uint32_t> &variants,
build_sector_description(tf, sectdata, sectors, track, head);
extract_sectors(image, tf, sectors, track, head);
int track_size = compute_track_size(tf);
- io_generic_write(io, sectdata, get_image_offset(f, head, track), track_size);
+ size_t actual;
+ io.write_at(get_image_offset(f, head, track), sectdata, track_size, actual);
}
}
@@ -432,8 +441,8 @@ void wd177x_format::check_compatibility(floppy_image *image, std::vector<int> &c
int max_tracks, max_heads;
image->get_maximal_geometry(max_tracks, max_heads);
- // Fail if floppy drive can't handle track count
- if(f.track_count > max_tracks) {
+ // Fail if floppy drive can't handle track or head count
+ if(f.track_count > max_tracks || f.head_count > max_heads) {
goto fail;
}
diff --git a/src/lib/formats/wd177x_dsk.h b/src/lib/formats/wd177x_dsk.h
index 4cae9ffa754..a7bd92994e6 100644
--- a/src/lib/formats/wd177x_dsk.h
+++ b/src/lib/formats/wd177x_dsk.h
@@ -38,9 +38,9 @@ public:
// End the array with {}
wd177x_format(const format *formats);
- virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
- virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
+ virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
+ virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override;
virtual bool supports_save() const override;
protected:
@@ -51,7 +51,7 @@ protected:
virtual const wd177x_format::format &get_track_format(const format &f, int head, int track);
virtual floppy_image_format_t::desc_e* get_desc_fm(const format &f, int &current_size, int &end_gap_index);
virtual floppy_image_format_t::desc_e* get_desc_mfm(const format &f, int &current_size, int &end_gap_index);
- virtual int find_size(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants);
+ virtual int find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants);
virtual int get_image_offset(const format &f, int head, int track);
virtual int get_track_dam_fm(const format &f, int head, int track);
virtual int get_track_dam_mfm(const format &f, int head, int track);
diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h
index 76d1d40d530..8dad2b36cc2 100644
--- a/src/lib/netlist/nl_config.h
+++ b/src/lib/netlist/nl_config.h
@@ -192,8 +192,8 @@ namespace netlist
///
/// This is the recommended clock to be used in fixed clock applications limited
/// to 32 bit clock resolution. The MAME code (netlist.cpp) contains code
- /// illustrating how to deal with remainders if \ref NETLIST_INTERNAL_RES is
- /// bigger than NETLIST_CLOCK.
+ /// illustrating how to deal with remainders if \ref INTERNAL_RES is bigger than
+ /// NETLIST_CLOCK.
using DEFAULT_CLOCK = std::integral_constant<int, 1'000'000'000>; // NOLINT
/// \brief Default logic family
diff --git a/src/lib/netlist/plib/pfunction.cpp b/src/lib/netlist/plib/pfunction.cpp
index f6b17941e0c..362615468e5 100644
--- a/src/lib/netlist/plib/pfunction.cpp
+++ b/src/lib/netlist/plib/pfunction.cpp
@@ -11,7 +11,6 @@
#include <array>
#include <map>
-#include <map>
#include <stack>
#include <type_traits>
#include <utility>
diff --git a/src/lib/netlist/tests/test_pfunction.cpp b/src/lib/netlist/tests/test_pfunction.cpp
index 3d251d620d0..c87671d8c7a 100644
--- a/src/lib/netlist/tests/test_pfunction.cpp
+++ b/src/lib/netlist/tests/test_pfunction.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Couriersud
///
-/// \file pfunction_test.cpp
+/// \file test_pfunction.cpp
///
/// tests for pfunction
///
diff --git a/src/lib/util/avhuff.cpp b/src/lib/util/avhuff.cpp
index ac5cea71526..0689fe25b80 100644
--- a/src/lib/util/avhuff.cpp
+++ b/src/lib/util/avhuff.cpp
@@ -896,9 +896,9 @@ avhuff_error avhuff_decoder::decode_audio(int channels, int samples, const uint8
{
// reset and decode
if (!m_flac_decoder.reset(48000, 1, samples, source, size))
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
if (!m_flac_decoder.decode_interleaved(reinterpret_cast<int16_t *>(curdest), samples, swap_endian))
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
// finish up
m_flac_decoder.finish();
diff --git a/src/lib/util/aviio.cpp b/src/lib/util/aviio.cpp
index 03014611873..3a3a1a412f6 100644
--- a/src/lib/util/aviio.cpp
+++ b/src/lib/util/aviio.cpp
@@ -1710,8 +1710,8 @@ avi_file::error avi_file_impl::read_uncompressed_video_frame(std::uint32_t frame
/* read in the data */
std::uint32_t bytes_read;
- osd_file::error const filerr = m_file->read(&m_tempbuffer[0], stream->chunk(framenum).offset, stream->chunk(framenum).length, bytes_read);
- if (filerr != osd_file::error::NONE || bytes_read != stream->chunk(framenum).length)
+ std::error_condition const filerr = m_file->read(&m_tempbuffer[0], stream->chunk(framenum).offset, stream->chunk(framenum).length, bytes_read);
+ if (filerr || bytes_read != stream->chunk(framenum).length)
return error::READ_ERROR;
/* validate this is good data */
@@ -1765,8 +1765,8 @@ avi_file::error avi_file_impl::read_video_frame(std::uint32_t framenum, bitmap_y
/* read in the data */
std::uint32_t bytes_read;
- osd_file::error const filerr = m_file->read(&m_tempbuffer[0], stream->chunk(framenum).offset, stream->chunk(framenum).length, bytes_read);
- if (filerr != osd_file::error::NONE || bytes_read != stream->chunk(framenum).length)
+ std::error_condition const filerr = m_file->read(&m_tempbuffer[0], stream->chunk(framenum).offset, stream->chunk(framenum).length, bytes_read);
+ if (filerr || bytes_read != stream->chunk(framenum).length)
return error::READ_ERROR;
/* validate this is good data */
@@ -1857,8 +1857,8 @@ avi_file::error avi_file_impl::read_sound_samples(int channel, std::uint32_t fir
return avierr;
/* read in the data */
- auto const filerr = m_file->read(&m_tempbuffer[0], stream->chunk(chunknum).offset, stream->chunk(chunknum).length, bytes_read);
- if (filerr != osd_file::error::NONE || bytes_read != stream->chunk(chunknum).length)
+ std::error_condition const filerr = m_file->read(&m_tempbuffer[0], stream->chunk(chunknum).offset, stream->chunk(chunknum).length, bytes_read);
+ if (filerr || bytes_read != stream->chunk(chunknum).length)
return error::READ_ERROR;
/* validate this is good data */
@@ -2085,14 +2085,15 @@ avi_file::error avi_file_impl::append_sound_samples(int channel, const std::int1
avi_file::error avi_file_impl::read_chunk_data(avi_chunk const &chunk, std::unique_ptr<std::uint8_t []> &buffer)
{
- /* allocate memory for the data */
- try { buffer.reset(new std::uint8_t[chunk.size]); }
- catch (...) { return error::NO_MEMORY; }
+ // allocate memory for the data
+ buffer.reset(new (std::nothrow) std::uint8_t[chunk.size]);
+ if (!buffer)
+ return error::NO_MEMORY;
- /* read from the file */
+ // read from the file
std::uint32_t bytes_read;
- osd_file::error const filerr = m_file->read(&buffer[0], chunk.offset + 8, chunk.size, bytes_read);
- if (filerr != osd_file::error::NONE || bytes_read != chunk.size)
+ std::error_condition const filerr = m_file->read(&buffer[0], chunk.offset + 8, chunk.size, bytes_read);
+ if (filerr || bytes_read != chunk.size)
{
buffer.reset();
return error::READ_ERROR;
@@ -2292,35 +2293,33 @@ avi_file::error avi_file_impl::find_next_list(std::uint32_t findme, const avi_ch
avi_file::error avi_file_impl::get_next_chunk_internal(const avi_chunk *parent, avi_chunk &newchunk, std::uint64_t offset)
{
- osd_file::error filerr;
- std::uint8_t buffer[12];
- std::uint32_t bytesread;
-
- /* nullptr parent implies the root */
- if (parent == nullptr)
+ // nullptr parent implies the root
+ if (!parent)
parent = &m_rootchunk;
- /* start at the current offset */
+ // start at the current offset
newchunk.offset = offset;
- /* if we're past the bounds of the parent, bail */
+ // if we're past the bounds of the parent, bail
if (newchunk.offset + 8 >= parent->offset + 8 + parent->size)
return error::END;
- /* read the header */
- filerr = m_file->read(buffer, newchunk.offset, 8, bytesread);
- if (filerr != osd_file::error::NONE || bytesread != 8)
+ // read the header
+ std::uint8_t buffer[12];
+ std::uint32_t bytesread;
+ std::error_condition filerr = m_file->read(buffer, newchunk.offset, 8, bytesread);
+ if (filerr || bytesread != 8)
return error::INVALID_DATA;
- /* fill in the new chunk */
+ // fill in the new chunk
newchunk.type = fetch_32bits(&buffer[0]);
newchunk.size = fetch_32bits(&buffer[4]);
- /* if we are a list, fetch the list type */
+ // if we are a list, fetch the list type
if (newchunk.type == CHUNKTYPE_LIST || newchunk.type == CHUNKTYPE_RIFF)
{
filerr = m_file->read(&buffer[8], newchunk.offset + 8, 4, bytesread);
- if (filerr != osd_file::error::NONE || bytesread != 4)
+ if (filerr || bytesread != 4)
return error::INVALID_DATA;
newchunk.listtype = fetch_32bits(&buffer[8]);
}
@@ -2643,16 +2642,15 @@ avi_file::error avi_file_impl::parse_indx_chunk(avi_stream &stream, avi_chunk co
/* loop over entries and create subchunks for each */
for (std::uint32_t entry = 0; entry < entries; entry++)
{
- const std::uint8_t *base = &chunkdata[24 + entry * 16];
- osd_file::error filerr;
+ std::uint8_t const *const base = &chunkdata[24 + entry * 16];
avi_chunk subchunk;
- std::uint32_t bytes_read;
- std::uint8_t buffer[8];
/* go read the subchunk */
subchunk.offset = fetch_64bits(&base[0]);
- filerr = m_file->read(buffer, subchunk.offset, sizeof(buffer), bytes_read);
- if (filerr != osd_file::error::NONE || bytes_read != sizeof(buffer))
+ std::uint32_t bytes_read;
+ std::uint8_t buffer[8];
+ std::error_condition const filerr = m_file->read(buffer, subchunk.offset, sizeof(buffer), bytes_read);
+ if (filerr || bytes_read != sizeof(buffer))
{
avierr = error::READ_ERROR;
break;
@@ -2788,8 +2786,8 @@ avi_file::error avi_file_impl::chunk_open(std::uint32_t type, std::uint32_t list
/* write the header */
std::uint32_t written;
- osd_file::error const filerr = m_file->write(buffer, m_writeoffs, sizeof(buffer), written);
- if (filerr != osd_file::error::NONE || written != sizeof(buffer))
+ std::error_condition const filerr = m_file->write(buffer, m_writeoffs, sizeof(buffer), written);
+ if (filerr || written != sizeof(buffer))
return error::WRITE_ERROR;
m_writeoffs += written;
}
@@ -2806,8 +2804,8 @@ avi_file::error avi_file_impl::chunk_open(std::uint32_t type, std::uint32_t list
/* write the header */
std::uint32_t written;
- osd_file::error const filerr = m_file->write(buffer, m_writeoffs, sizeof(buffer), written);
- if (filerr != osd_file::error::NONE || written != sizeof(buffer))
+ std::error_condition const filerr = m_file->write(buffer, m_writeoffs, sizeof(buffer), written);
+ if (filerr || written != sizeof(buffer))
return error::WRITE_ERROR;
m_writeoffs += written;
}
@@ -2846,8 +2844,8 @@ avi_file::error avi_file_impl::chunk_close()
put_32bits(&buffer[0], std::uint32_t(chunksize));
std::uint32_t written;
- osd_file::error const filerr = m_file->write(buffer, chunk.offset + 4, sizeof(buffer), written);
- if (filerr != osd_file::error::NONE || written != sizeof(buffer))
+ std::error_condition const filerr = m_file->write(buffer, chunk.offset + 4, sizeof(buffer), written);
+ if (filerr || written != sizeof(buffer))
return error::WRITE_ERROR;
}
@@ -2925,8 +2923,8 @@ avi_file::error avi_file_impl::chunk_write(std::uint32_t type, const void *data,
/* write the data */
std::uint32_t written;
- osd_file::error const filerr = m_file->write(data, m_writeoffs, length, written);
- if (filerr != osd_file::error::NONE || written != length)
+ std::error_condition const filerr = m_file->write(data, m_writeoffs, length, written);
+ if (filerr || written != length)
return error::WRITE_ERROR;
m_writeoffs += written;
@@ -3678,7 +3676,7 @@ avi_file::error avi_file::open(std::string const &filename, ptr &file)
/* open the file */
osd_file::ptr f;
std::uint64_t length;
- if (osd_file::open(filename, OPEN_FLAG_READ, f, length) != osd_file::error::NONE)
+ if (osd_file::open(filename, OPEN_FLAG_READ, f, length))
return error::CANT_OPEN_FILE;
/* allocate the file */
@@ -3731,8 +3729,8 @@ avi_file::error avi_file::create(std::string const &filename, movie_info const &
/* open the file */
osd_file::ptr f;
std::uint64_t length;
- osd_file::error const filerr = osd_file::open(filename, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS, f, length);
- if (filerr != osd_file::error::NONE)
+ std::error_condition const filerr = osd_file::open(filename, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS, f, length);
+ if (filerr)
return error::CANT_OPEN_FILE;
/* allocate the file */
diff --git a/src/lib/util/bitmap.cpp b/src/lib/util/bitmap.cpp
index 9722fea7218..8757d928fff 100644
--- a/src/lib/util/bitmap.cpp
+++ b/src/lib/util/bitmap.cpp
@@ -415,7 +415,7 @@ void bitmap_t::set_palette(palette_t *palette)
* -------------------------------------------------.
*
* @param color The color.
- * @param cliprect The cliprect.
+ * @param bounds The bounds.
*/
void bitmap_t::fill(uint64_t color, const rectangle &bounds)
diff --git a/src/lib/util/cdrom.cpp b/src/lib/util/cdrom.cpp
index 4ac1ab6e865..7510a1f9b47 100644
--- a/src/lib/util/cdrom.cpp
+++ b/src/lib/util/cdrom.cpp
@@ -19,6 +19,7 @@
#include "cdrom.h"
#include "chdcd.h"
+#include "corefile.h"
#include <cassert>
#include <cstdlib>
@@ -223,10 +224,10 @@ cdrom_file *cdrom_open(const char *inputfile)
return nullptr;
// set up the CD-ROM module and get the disc info
- chd_error err = chdcd_parse_toc(inputfile, file->cdtoc, file->track_info);
- if (err != CHDERR_NONE)
+ std::error_condition err = chdcd_parse_toc(inputfile, file->cdtoc, file->track_info);
+ if (err)
{
- fprintf(stderr, "Error reading input file: %s\n", chd_file::error_string(err));
+ fprintf(stderr, "Error reading input file: %s\n", err.message().c_str());
delete file;
return nullptr;
}
@@ -238,14 +239,15 @@ cdrom_file *cdrom_open(const char *inputfile)
for (i = 0; i < file->cdtoc.numtrks; i++)
{
- osd_file::error filerr = util::core_file::open(file->track_info.track[i].fname, OPEN_FLAG_READ, file->fhandle[i]);
- if (filerr != osd_file::error::NONE)
+ std::error_condition const filerr = util::core_file::open(file->track_info.track[i].fname, OPEN_FLAG_READ, file->fhandle[i]);
+ if (filerr)
{
fprintf(stderr, "Unable to open file: %s\n", file->track_info.track[i].fname.c_str());
cdrom_close(file);
return nullptr;
}
}
+
/* calculate the starting frame for each track, keeping in mind that CHDMAN
pads tracks out with extra frames to fit 4-frame size boundries
*/
@@ -336,8 +338,8 @@ cdrom_file *cdrom_open(chd_file *chd)
file->chd = chd;
/* read the CD-ROM metadata */
- chd_error err = cdrom_parse_metadata(chd, &file->cdtoc);
- if (err != CHDERR_NONE)
+ std::error_condition err = cdrom_parse_metadata(chd, &file->cdtoc);
+ if (err)
{
delete file;
return nullptr;
@@ -446,7 +448,7 @@ void cdrom_close(cdrom_file *file)
***************************************************************************/
/**
- * @fn chd_error read_partial_sector(cdrom_file *file, void *dest, uint32_t lbasector, uint32_t chdsector, uint32_t tracknum, uint32_t startoffs, uint32_t length)
+ * @fn std::error_condition read_partial_sector(cdrom_file *file, void *dest, uint32_t lbasector, uint32_t chdsector, uint32_t tracknum, uint32_t startoffs, uint32_t length)
*
* @brief Reads partial sector.
*
@@ -461,9 +463,9 @@ void cdrom_close(cdrom_file *file)
* @return The partial sector.
*/
-chd_error read_partial_sector(cdrom_file *file, void *dest, uint32_t lbasector, uint32_t chdsector, uint32_t tracknum, uint32_t startoffs, uint32_t length, bool phys=false)
+std::error_condition read_partial_sector(cdrom_file *file, void *dest, uint32_t lbasector, uint32_t chdsector, uint32_t tracknum, uint32_t startoffs, uint32_t length, bool phys=false)
{
- chd_error result = CHDERR_NONE;
+ std::error_condition result;
bool needswap = false;
// if this is pregap info that isn't actually in the file, just return blank data
@@ -570,14 +572,14 @@ uint32_t cdrom_read_data(cdrom_file *file, uint32_t lbasector, void *buffer, uin
if ((datatype == tracktype) || (datatype == CD_TRACK_RAW_DONTCARE))
{
- return (read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 0, file->cdtoc.tracks[tracknum].datasize, phys) == CHDERR_NONE);
+ return !read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 0, file->cdtoc.tracks[tracknum].datasize, phys);
}
else
{
// return 2048 bytes of mode 1 data from a 2352 byte mode 1 raw sector
if ((datatype == CD_TRACK_MODE1) && (tracktype == CD_TRACK_MODE1_RAW))
{
- return (read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 16, 2048, phys) == CHDERR_NONE);
+ return !read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 16, 2048, phys);
}
// return 2352 byte mode 1 raw sector from 2048 bytes of mode 1 data
@@ -593,25 +595,25 @@ uint32_t cdrom_read_data(cdrom_file *file, uint32_t lbasector, void *buffer, uin
bufptr[14] = msf&0xff;
bufptr[15] = 1; // mode 1
LOG(("CDROM: promotion of mode1/form1 sector to mode1 raw is not complete!\n"));
- return (read_partial_sector(file, bufptr+16, lbasector, chdsector, tracknum, 0, 2048, phys) == CHDERR_NONE);
+ return !read_partial_sector(file, bufptr+16, lbasector, chdsector, tracknum, 0, 2048, phys);
}
// return 2048 bytes of mode 1 data from a mode2 form1 or raw sector
if ((datatype == CD_TRACK_MODE1) && ((tracktype == CD_TRACK_MODE2_FORM1)||(tracktype == CD_TRACK_MODE2_RAW)))
{
- return (read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 24, 2048, phys) == CHDERR_NONE);
+ return !read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 24, 2048, phys);
}
// return 2048 bytes of mode 1 data from a mode2 form2 or XA sector
if ((datatype == CD_TRACK_MODE1) && (tracktype == CD_TRACK_MODE2_FORM_MIX))
{
- return (read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 8, 2048, phys) == CHDERR_NONE);
+ return !read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 8, 2048, phys);
}
// return mode 2 2336 byte data from a 2352 byte mode 1 or 2 raw sector (skip the header)
if ((datatype == CD_TRACK_MODE2) && ((tracktype == CD_TRACK_MODE1_RAW) || (tracktype == CD_TRACK_MODE2_RAW)))
{
- return (read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 16, 2336, phys) == CHDERR_NONE);
+ return !read_partial_sector(file, buffer, lbasector, chdsector, tracknum, 16, 2336, phys);
}
LOG(("CDROM: Conversion from type %d to type %d not supported!\n", tracktype, datatype));
@@ -660,8 +662,8 @@ uint32_t cdrom_read_subcode(cdrom_file *file, uint32_t lbasector, void *buffer,
return 0;
// read the data
- chd_error err = read_partial_sector(file, buffer, lbasector, chdsector, tracknum, file->cdtoc.tracks[tracknum].datasize, file->cdtoc.tracks[tracknum].subsize);
- return (err == CHDERR_NONE);
+ std::error_condition err = read_partial_sector(file, buffer, lbasector, chdsector, tracknum, file->cdtoc.tracks[tracknum].datasize, file->cdtoc.tracks[tracknum].subsize);
+ return !err;
}
@@ -1139,21 +1141,20 @@ const char *cdrom_get_subtype_string(uint32_t subtype)
-------------------------------------------------*/
/**
- * @fn chd_error cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc)
+ * @fn std::error_condition cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc)
*
* @brief Cdrom parse metadata.
*
* @param [in,out] chd If non-null, the chd.
* @param [in,out] toc If non-null, the TOC.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc)
+std::error_condition cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc)
{
std::string metadata;
- chd_error err;
- int i;
+ std::error_condition err;
toc->flags = 0;
@@ -1168,49 +1169,49 @@ chd_error cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc)
/* fetch the metadata for this track */
err = chd->read_metadata(CDROM_TRACK_METADATA_TAG, toc->numtrks, metadata);
- if (err == CHDERR_NONE)
+ if (!err)
{
/* parse the metadata */
type[0] = subtype[0] = 0;
pgtype[0] = pgsub[0] = 0;
if (sscanf(metadata.c_str(), CDROM_TRACK_METADATA_FORMAT, &tracknum, type, subtype, &frames) != 4)
- return CHDERR_INVALID_DATA;
+ return chd_file::error::INVALID_DATA;
if (tracknum == 0 || tracknum > CD_MAX_TRACKS)
- return CHDERR_INVALID_DATA;
+ return chd_file::error::INVALID_DATA;
track = &toc->tracks[tracknum - 1];
}
else
{
err = chd->read_metadata(CDROM_TRACK_METADATA2_TAG, toc->numtrks, metadata);
- if (err == CHDERR_NONE)
+ if (!err)
{
/* parse the metadata */
type[0] = subtype[0] = 0;
pregap = postgap = 0;
if (sscanf(metadata.c_str(), CDROM_TRACK_METADATA2_FORMAT, &tracknum, type, subtype, &frames, &pregap, pgtype, pgsub, &postgap) != 8)
- return CHDERR_INVALID_DATA;
+ return chd_file::error::INVALID_DATA;
if (tracknum == 0 || tracknum > CD_MAX_TRACKS)
- return CHDERR_INVALID_DATA;
+ return chd_file::error::INVALID_DATA;
track = &toc->tracks[tracknum - 1];
}
else
{
err = chd->read_metadata(GDROM_OLD_METADATA_TAG, toc->numtrks, metadata);
- if (err == CHDERR_NONE)
+ if (!err)
/* legacy GDROM track was detected */
toc->flags |= CD_FLAG_GDROMLE;
else
err = chd->read_metadata(GDROM_TRACK_METADATA_TAG, toc->numtrks, metadata);
- if (err == CHDERR_NONE)
+ if (!err)
{
/* parse the metadata */
type[0] = subtype[0] = 0;
pregap = postgap = 0;
if (sscanf(metadata.c_str(), GDROM_TRACK_METADATA_FORMAT, &tracknum, type, subtype, &frames, &padframes, &pregap, pgtype, pgsub, &postgap) != 9)
- return CHDERR_INVALID_DATA;
+ return chd_file::error::INVALID_DATA;
if (tracknum == 0 || tracknum > CD_MAX_TRACKS)
- return CHDERR_INVALID_DATA;
+ return chd_file::error::INVALID_DATA;
track = &toc->tracks[tracknum - 1];
toc->flags |= CD_FLAG_GDROM;
}
@@ -1226,7 +1227,7 @@ chd_error cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc)
track->datasize = 0;
cdrom_convert_type_string_to_track_info(type, track);
if (track->datasize == 0)
- return CHDERR_INVALID_DATA;
+ return chd_file::error::INVALID_DATA;
/* extract the subtype and determine the subcode data size */
track->subtype = CD_SUB_NONE;
@@ -1261,21 +1262,21 @@ chd_error cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc)
/* if we got any tracks this way, we're done */
if (toc->numtrks > 0)
- return CHDERR_NONE;
+ return std::error_condition();
printf("toc->numtrks = %u?!\n", toc->numtrks);
/* look for old-style metadata */
std::vector<uint8_t> oldmetadata;
err = chd->read_metadata(CDROM_OLD_METADATA_TAG, 0, oldmetadata);
- if (err != CHDERR_NONE)
+ if (err)
return err;
/* reconstruct the TOC from it */
auto *mrp = reinterpret_cast<uint32_t *>(&oldmetadata[0]);
toc->numtrks = *mrp++;
- for (i = 0; i < CD_MAX_TRACKS; i++)
+ for (int i = 0; i < CD_MAX_TRACKS; i++)
{
toc->tracks[i].trktype = *mrp++;
toc->tracks[i].subtype = *mrp++;
@@ -1295,7 +1296,7 @@ chd_error cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc)
if (toc->numtrks > CD_MAX_TRACKS)
{
toc->numtrks = swapendian_int32(toc->numtrks);
- for (i = 0; i < CD_MAX_TRACKS; i++)
+ for (int i = 0; i < CD_MAX_TRACKS; i++)
{
toc->tracks[i].trktype = swapendian_int32(toc->tracks[i].trktype);
toc->tracks[i].subtype = swapendian_int32(toc->tracks[i].subtype);
@@ -1307,7 +1308,7 @@ chd_error cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc)
}
}
- return CHDERR_NONE;
+ return std::error_condition();
}
@@ -1316,19 +1317,19 @@ chd_error cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc)
-------------------------------------------------*/
/**
- * @fn chd_error cdrom_write_metadata(chd_file *chd, const cdrom_toc *toc)
+ * @fn std::error_condition cdrom_write_metadata(chd_file *chd, const cdrom_toc *toc)
*
* @brief Cdrom write metadata.
*
* @param [in,out] chd If non-null, the chd.
* @param toc The TOC.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error cdrom_write_metadata(chd_file *chd, const cdrom_toc *toc)
+std::error_condition cdrom_write_metadata(chd_file *chd, const cdrom_toc *toc)
{
- chd_error err;
+ std::error_condition err;
/* write the metadata */
for (int i = 0; i < toc->numtrks; i++)
@@ -1363,10 +1364,10 @@ chd_error cdrom_write_metadata(chd_file *chd, const cdrom_toc *toc)
err = chd->write_metadata(GDROM_TRACK_METADATA_TAG, i, metadata);
}
- if (err != CHDERR_NONE)
+ if (err)
return err;
}
- return CHDERR_NONE;
+ return std::error_condition();
}
/**
diff --git a/src/lib/util/cdrom.h b/src/lib/util/cdrom.h
index 27d41da845e..1847a1db83a 100644
--- a/src/lib/util/cdrom.h
+++ b/src/lib/util/cdrom.h
@@ -7,15 +7,15 @@
Generic MAME cd-rom implementation
***************************************************************************/
-
-#ifndef MAME_UTIL_CDROM_H
-#define MAME_UTIL_CDROM_H
+#ifndef MAME_LIB_UTIL_CDROM_H
+#define MAME_LIB_UTIL_CDROM_H
#pragma once
-#include "osdcore.h"
#include "chd.h"
+#include "osdcore.h"
+
/***************************************************************************
@@ -137,8 +137,8 @@ void cdrom_convert_subtype_string_to_track_info(const char *typestring, cdrom_tr
void cdrom_convert_subtype_string_to_pregap_info(const char *typestring, cdrom_track_info *info);
const char *cdrom_get_type_string(uint32_t trktype);
const char *cdrom_get_subtype_string(uint32_t subtype);
-chd_error cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc);
-chd_error cdrom_write_metadata(chd_file *chd, const cdrom_toc *toc);
+std::error_condition cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc);
+std::error_condition cdrom_write_metadata(chd_file *chd, const cdrom_toc *toc);
// ECC utilities
bool ecc_verify(const uint8_t *sector);
@@ -184,4 +184,4 @@ static inline uint32_t lba_to_msf_alt(int lba)
return ret;
}
-#endif // MAME_UTIL_CDROM_H
+#endif // MAME_LIB_UTIL_CDROM_H
diff --git a/src/lib/util/chd.cpp b/src/lib/util/chd.cpp
index 0de05849cdd..29792fc36df 100644
--- a/src/lib/util/chd.cpp
+++ b/src/lib/util/chd.cpp
@@ -8,20 +8,24 @@
***************************************************************************/
-#include <cassert>
-
#include "chd.h"
+
#include "avhuff.h"
-#include "hashing.h"
-#include "flac.h"
#include "cdrom.h"
+#include "corefile.h"
#include "coretmpl.h"
+#include "flac.h"
+#include "hashing.h"
+
+#include "eminline.h"
+
#include <zlib.h>
-#include <ctime>
+
+#include <cassert>
#include <cstddef>
#include <cstdlib>
+#include <ctime>
#include <new>
-#include "eminline.h"
//**************************************************************************
@@ -186,14 +190,17 @@ inline void chd_file::be_write_sha1(uint8_t *base, util::sha1_t value)
inline void chd_file::file_read(uint64_t offset, void *dest, uint32_t length)
{
// no file = failure
- if (m_file == nullptr)
- throw CHDERR_NOT_OPEN;
+ if (!m_file)
+ throw std::error_condition(error::NOT_OPEN);
// seek and read
m_file->seek(offset, SEEK_SET);
- uint32_t count = m_file->read(dest, length);
- if (count != length)
- throw CHDERR_READ_ERROR;
+ size_t count;
+ std::error_condition err = m_file->read(dest, length, count);
+ if (err)
+ throw err;
+ else if (count != length)
+ throw std::error_condition(std::errc::io_error); // TODO: revisit this error code (happens if file is cut off)
}
@@ -205,14 +212,17 @@ inline void chd_file::file_read(uint64_t offset, void *dest, uint32_t length)
inline void chd_file::file_write(uint64_t offset, const void *source, uint32_t length)
{
// no file = failure
- if (m_file == nullptr)
- throw CHDERR_NOT_OPEN;
+ if (!m_file)
+ throw std::error_condition(error::NOT_OPEN);
// seek and write
m_file->seek(offset, SEEK_SET);
- uint32_t count = m_file->write(source, length);
- if (count != length)
- throw CHDERR_WRITE_ERROR;
+ size_t count;
+ std::error_condition err = m_file->write(source, length, count);
+ if (err)
+ throw err;
+ else if (count != length)
+ throw std::error_condition(std::errc::interrupted); // can theoretically happen if write is inuterrupted by a signal
}
@@ -224,15 +234,22 @@ inline void chd_file::file_write(uint64_t offset, const void *source, uint32_t l
inline uint64_t chd_file::file_append(const void *source, uint32_t length, uint32_t alignment)
{
+ std::error_condition err;
+
// no file = failure
- if (m_file == nullptr)
- throw CHDERR_NOT_OPEN;
+ if (!m_file)
+ throw std::error_condition(error::NOT_OPEN);
// seek to the end and align if necessary
- m_file->seek(0, SEEK_END);
+ err = m_file->seek(0, SEEK_END);
+ if (err)
+ throw err;
if (alignment != 0)
{
- uint64_t offset = m_file->tell();
+ uint64_t offset;
+ err = m_file->tell(offset);
+ if (err)
+ throw err;
uint32_t delta = offset % alignment;
if (delta != 0)
{
@@ -242,20 +259,27 @@ inline uint64_t chd_file::file_append(const void *source, uint32_t length, uint3
delta = alignment - delta;
while (delta != 0)
{
- uint32_t bytes_to_write = (std::min<std::size_t>)(sizeof(buffer), delta);
- uint32_t count = m_file->write(buffer, bytes_to_write);
- if (count != bytes_to_write)
- throw CHDERR_WRITE_ERROR;
- delta -= bytes_to_write;
+ uint32_t bytes_to_write = std::min<std::size_t>(sizeof(buffer), delta);
+ size_t count;
+ err = m_file->write(buffer, bytes_to_write, count);
+ if (err)
+ throw err;
+ delta -= count;
}
}
}
// write the real data
- uint64_t offset = m_file->tell();
- uint32_t count = m_file->write(source, length);
- if (count != length)
- throw CHDERR_READ_ERROR;
+ uint64_t offset;
+ err = m_file->tell(offset);
+ if (err)
+ throw err;
+ size_t count;
+ err = m_file->write(source, length, count);
+ if (err)
+ throw err;
+ else if (count != length)
+ throw std::error_condition(std::errc::interrupted); // can theoretically happen if write is interrupted by a signal
return offset;
}
@@ -288,11 +312,8 @@ inline uint8_t chd_file::bits_for_value(uint64_t value)
*/
chd_file::chd_file()
- : m_file(nullptr),
- m_owns_file(false)
{
// reset state
- memset(m_decompressor, 0, sizeof(m_decompressor));
close();
}
@@ -311,6 +332,22 @@ chd_file::~chd_file()
}
/**
+ * @fn util::random_read chd_file::file()
+ *
+ * @brief -------------------------------------------------
+ * file - return our underlying file
+ * -------------------------------------------------.
+ *
+ * @return A random_read.
+ */
+
+util::random_read &chd_file::file()
+{
+ assert(m_file);
+ return *m_file;
+}
+
+/**
* @fn util::sha1_t chd_file::sha1()
*
* @brief -------------------------------------------------
@@ -329,7 +366,7 @@ util::sha1_t chd_file::sha1()
file_read(m_sha1_offset, rawbuf, sizeof(rawbuf));
return be_read_sha1(rawbuf);
}
- catch (chd_error &)
+ catch (std::error_condition const &)
{
// on failure, return nullptr
return util::sha1_t::null;
@@ -354,15 +391,15 @@ util::sha1_t chd_file::raw_sha1()
try
{
// determine offset within the file for data-only
- if (m_rawsha1_offset == 0)
- throw CHDERR_UNSUPPORTED_VERSION;
+ if (!m_rawsha1_offset)
+ throw std::error_condition(error::UNSUPPORTED_VERSION);
// read the big-endian version
uint8_t rawbuf[sizeof(util::sha1_t)];
file_read(m_rawsha1_offset, rawbuf, sizeof(rawbuf));
return be_read_sha1(rawbuf);
}
- catch (chd_error &)
+ catch (std::error_condition const &)
{
// on failure, return nullptr
return util::sha1_t::null;
@@ -387,15 +424,15 @@ util::sha1_t chd_file::parent_sha1()
try
{
// determine offset within the file
- if (m_parentsha1_offset == 0)
- throw CHDERR_UNSUPPORTED_VERSION;
+ if (!m_parentsha1_offset)
+ throw std::error_condition(error::UNSUPPORTED_VERSION);
// read the big-endian version
uint8_t rawbuf[sizeof(util::sha1_t)];
file_read(m_parentsha1_offset, rawbuf, sizeof(rawbuf));
return be_read_sha1(rawbuf);
}
- catch (chd_error &)
+ catch (std::error_condition const &)
{
// on failure, return nullptr
return util::sha1_t::null;
@@ -403,7 +440,7 @@ util::sha1_t chd_file::parent_sha1()
}
/**
- * @fn chd_error chd_file::hunk_info(uint32_t hunknum, chd_codec_type &compressor, uint32_t &compbytes)
+ * @fn std::error_condition chd_file::hunk_info(uint32_t hunknum, chd_codec_type &compressor, uint32_t &compbytes)
*
* @brief -------------------------------------------------
* hunk_info - return information about this hunk
@@ -413,14 +450,14 @@ util::sha1_t chd_file::parent_sha1()
* @param [in,out] compressor The compressor.
* @param [in,out] compbytes The compbytes.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::hunk_info(uint32_t hunknum, chd_codec_type &compressor, uint32_t &compbytes)
+std::error_condition chd_file::hunk_info(uint32_t hunknum, chd_codec_type &compressor, uint32_t &compbytes)
{
// error if invalid
if (hunknum >= m_hunkcount)
- return CHDERR_HUNK_OUT_OF_RANGE;
+ return std::error_condition(error::HUNK_OUT_OF_RANGE);
// get the map pointer
uint8_t *rawmap;
@@ -506,11 +543,11 @@ chd_error chd_file::hunk_info(uint32_t hunknum, chd_codec_type &compressor, uint
break;
default:
- return CHDERR_UNKNOWN_COMPRESSION;
+ return error::UNKNOWN_COMPRESSION;
}
break;
}
- return CHDERR_NONE;
+ return std::error_condition();
}
/**
@@ -554,8 +591,8 @@ void chd_file::set_raw_sha1(util::sha1_t rawdata)
void chd_file::set_parent_sha1(util::sha1_t parent)
{
// if no file, fail
- if (m_file == nullptr)
- throw CHDERR_INVALID_FILE;
+ if (!m_file)
+ throw std::error_condition(error::INVALID_FILE);
// create a big-endian version
uint8_t rawbuf[sizeof(util::sha1_t)];
@@ -567,7 +604,7 @@ void chd_file::set_parent_sha1(util::sha1_t parent)
}
/**
- * @fn chd_error chd_file::create(util::core_file &file, uint64_t logicalbytes, uint32_t hunkbytes, uint32_t unitbytes, chd_codec_type compression[4])
+ * @fn std::error_condition chd_file::create(util::random_read_write::ptr &&file, uint64_t logicalbytes, uint32_t hunkbytes, uint32_t unitbytes, chd_codec_type compression[4])
*
* @brief -------------------------------------------------
* create - create a new file with no parent using an existing opened file handle
@@ -579,14 +616,16 @@ void chd_file::set_parent_sha1(util::sha1_t parent)
* @param unitbytes The unitbytes.
* @param compression The compression.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::create(util::core_file &file, uint64_t logicalbytes, uint32_t hunkbytes, uint32_t unitbytes, chd_codec_type compression[4])
+std::error_condition chd_file::create(util::random_read_write::ptr &&file, uint64_t logicalbytes, uint32_t hunkbytes, uint32_t unitbytes, chd_codec_type compression[4])
{
// make sure we don't already have a file open
- if (m_file != nullptr)
- return CHDERR_ALREADY_OPEN;
+ if (m_file)
+ return error::ALREADY_OPEN;
+ else if (!file)
+ return std::errc::invalid_argument;
// set the header parameters
m_logicalbytes = logicalbytes;
@@ -596,13 +635,12 @@ chd_error chd_file::create(util::core_file &file, uint64_t logicalbytes, uint32_
m_parent = nullptr;
// take ownership of the file
- m_file = &file;
- m_owns_file = false;
+ m_file = std::move(file);
return create_common();
}
/**
- * @fn chd_error chd_file::create(util::core_file &file, uint64_t logicalbytes, uint32_t hunkbytes, chd_codec_type compression[4], chd_file &parent)
+ * @fn std::error_condition chd_file::create(util::random_read_write::ptr &&file, uint64_t logicalbytes, uint32_t hunkbytes, chd_codec_type compression[4], chd_file &parent)
*
* @brief -------------------------------------------------
* create - create a new file with a parent using an existing opened file handle
@@ -614,14 +652,16 @@ chd_error chd_file::create(util::core_file &file, uint64_t logicalbytes, uint32_
* @param compression The compression.
* @param [in,out] parent The parent.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::create(util::core_file &file, uint64_t logicalbytes, uint32_t hunkbytes, chd_codec_type compression[4], chd_file &parent)
+std::error_condition chd_file::create(util::random_read_write::ptr &&file, uint64_t logicalbytes, uint32_t hunkbytes, chd_codec_type compression[4], chd_file &parent)
{
// make sure we don't already have a file open
- if (m_file != nullptr)
- return CHDERR_ALREADY_OPEN;
+ if (m_file)
+ return error::ALREADY_OPEN;
+ else if (!file)
+ return std::errc::invalid_argument;
// set the header parameters
m_logicalbytes = logicalbytes;
@@ -631,13 +671,12 @@ chd_error chd_file::create(util::core_file &file, uint64_t logicalbytes, uint32_
m_parent = &parent;
// take ownership of the file
- m_file = &file;
- m_owns_file = false;
+ m_file = std::move(file);
return create_common();
}
/**
- * @fn chd_error chd_file::create(const char *filename, uint64_t logicalbytes, uint32_t hunkbytes, uint32_t unitbytes, chd_codec_type compression[4])
+ * @fn std::error_condition chd_file::create(std::string_view filename, uint64_t logicalbytes, uint32_t hunkbytes, uint32_t unitbytes, chd_codec_type compression[4])
*
* @brief -------------------------------------------------
* create - create a new file with no parent using a filename
@@ -649,40 +688,38 @@ chd_error chd_file::create(util::core_file &file, uint64_t logicalbytes, uint32_
* @param unitbytes The unitbytes.
* @param compression The compression.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::create(const char *filename, uint64_t logicalbytes, uint32_t hunkbytes, uint32_t unitbytes, chd_codec_type compression[4])
+std::error_condition chd_file::create(std::string_view filename, uint64_t logicalbytes, uint32_t hunkbytes, uint32_t unitbytes, chd_codec_type compression[4])
{
// make sure we don't already have a file open
- if (m_file != nullptr)
- return CHDERR_ALREADY_OPEN;
+ if (m_file)
+ return error::ALREADY_OPEN;
// create the new file
util::core_file::ptr file;
- const osd_file::error filerr = util::core_file::open(filename, OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, file);
- if (filerr != osd_file::error::NONE)
- return CHDERR_FILE_NOT_FOUND;
+ std::error_condition filerr = util::core_file::open(filename, OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, file);
+ if (filerr)
+ return filerr;
+ util::random_read_write::ptr io = util::core_file_read_write(std::move(file));
+ if (!io)
+ return std::errc::not_enough_memory;
// create the file normally, then claim the file
- const chd_error chderr = create(*file, logicalbytes, hunkbytes, unitbytes, compression);
- m_owns_file = true;
+ std::error_condition chderr = create(std::move(io), logicalbytes, hunkbytes, unitbytes, compression);
// if an error happened, close and delete the file
- if (chderr != CHDERR_NONE)
+ if (chderr)
{
- file.reset();
- osd_file::remove(filename);
- }
- else
- {
- file.release();
+ io.reset();
+ osd_file::remove(std::string(filename)); // FIXME: allow osd_file to use std::string_view
}
return chderr;
}
/**
- * @fn chd_error chd_file::create(const char *filename, uint64_t logicalbytes, uint32_t hunkbytes, chd_codec_type compression[4], chd_file &parent)
+ * @fn std::error_condition chd_file::create(std::string_view filename, uint64_t logicalbytes, uint32_t hunkbytes, chd_codec_type compression[4], chd_file &parent)
*
* @brief -------------------------------------------------
* create - create a new file with a parent using a filename
@@ -694,40 +731,38 @@ chd_error chd_file::create(const char *filename, uint64_t logicalbytes, uint32_t
* @param compression The compression.
* @param [in,out] parent The parent.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::create(const char *filename, uint64_t logicalbytes, uint32_t hunkbytes, chd_codec_type compression[4], chd_file &parent)
+std::error_condition chd_file::create(std::string_view filename, uint64_t logicalbytes, uint32_t hunkbytes, chd_codec_type compression[4], chd_file &parent)
{
// make sure we don't already have a file open
- if (m_file != nullptr)
- return CHDERR_ALREADY_OPEN;
+ if (m_file)
+ return error::ALREADY_OPEN;
// create the new file
util::core_file::ptr file;
- const osd_file::error filerr = util::core_file::open(filename, OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, file);
- if (filerr != osd_file::error::NONE)
- return CHDERR_FILE_NOT_FOUND;
+ std::error_condition filerr = util::core_file::open(filename, OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, file);
+ if (filerr)
+ return filerr;
+ util::random_read_write::ptr io = util::core_file_read_write(std::move(file));
+ if (!io)
+ return std::errc::not_enough_memory;
// create the file normally, then claim the file
- const chd_error chderr = create(*file, logicalbytes, hunkbytes, compression, parent);
- m_owns_file = true;
+ std::error_condition chderr = create(std::move(io), logicalbytes, hunkbytes, compression, parent);
// if an error happened, close and delete the file
- if (chderr != CHDERR_NONE)
- {
- file.reset();
- osd_file::remove(filename);
- }
- else
+ if (chderr)
{
- file.release();
+ io.reset();
+ osd_file::remove(std::string(filename)); // FIXME: allow osd_file to use std::string_view
}
return chderr;
}
/**
- * @fn chd_error chd_file::open(const char *filename, bool writeable, chd_file *parent)
+ * @fn std::error_condition chd_file::open(std::string_view filename, bool writeable, chd_file *parent)
*
* @brief -------------------------------------------------
* open - open an existing file for read or read/write
@@ -737,35 +772,36 @@ chd_error chd_file::create(const char *filename, uint64_t logicalbytes, uint32_t
* @param writeable true if writeable.
* @param [in,out] parent If non-null, the parent.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::open(const char *filename, bool writeable, chd_file *parent)
+std::error_condition chd_file::open(std::string_view filename, bool writeable, chd_file *parent)
{
// make sure we don't already have a file open
- if (m_file != nullptr)
- return CHDERR_ALREADY_OPEN;
+ if (m_file)
+ return error::ALREADY_OPEN;
// open the file
const uint32_t openflags = writeable ? (OPEN_FLAG_READ | OPEN_FLAG_WRITE) : OPEN_FLAG_READ;
util::core_file::ptr file;
- const osd_file::error filerr = util::core_file::open(filename, openflags, file);
- if (filerr != osd_file::error::NONE)
- return CHDERR_FILE_NOT_FOUND;
+ std::error_condition filerr = util::core_file::open(filename, openflags, file);
+ if (filerr)
+ return filerr;
+ util::random_read_write::ptr io = util::core_file_read_write(std::move(file));
+ if (!io)
+ return std::errc::not_enough_memory;
// now open the CHD
- chd_error err = open(*file, writeable, parent);
- if (err != CHDERR_NONE)
+ std::error_condition err = open(std::move(io), writeable, parent);
+ if (err)
return err;
// we now own this file
- file.release();
- m_owns_file = true;
return err;
}
/**
- * @fn chd_error chd_file::open(util::core_file &file, bool writeable, chd_file *parent)
+ * @fn std::error_condition chd_file::open(util::random_read_write::ptr &&file, bool writeable, chd_file *parent)
*
* @brief -------------------------------------------------
* open - open an existing file for read or read/write
@@ -775,18 +811,19 @@ chd_error chd_file::open(const char *filename, bool writeable, chd_file *parent)
* @param writeable true if writeable.
* @param [in,out] parent If non-null, the parent.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::open(util::core_file &file, bool writeable, chd_file *parent)
+std::error_condition chd_file::open(util::random_read_write::ptr &&file, bool writeable, chd_file *parent)
{
// make sure we don't already have a file open
- if (m_file != nullptr)
- return CHDERR_ALREADY_OPEN;
+ if (m_file)
+ return error::ALREADY_OPEN;
+ else if (!file)
+ return std::errc::invalid_argument;
// open the file
- m_file = &file;
- m_owns_file = false;
+ m_file = std::move(file);
m_parent = parent;
m_cachehunk = ~0;
return open_common(writeable);
@@ -803,10 +840,7 @@ chd_error chd_file::open(util::core_file &file, bool writeable, chd_file *parent
void chd_file::close()
{
// reset file characteristics
- if (m_owns_file && m_file)
- delete m_file;
- m_file = nullptr;
- m_owns_file = false;
+ m_file.reset();
m_allow_reads = false;
m_allow_writes = false;
@@ -836,10 +870,7 @@ void chd_file::close()
// reset compression management
for (auto & elem : m_decompressor)
- {
- delete elem;
- elem = nullptr;
- }
+ elem.reset();
m_compressed.clear();
// reset caching
@@ -848,7 +879,7 @@ void chd_file::close()
}
/**
- * @fn chd_error chd_file::read_hunk(uint32_t hunknum, void *buffer)
+ * @fn std::error_condition chd_file::read_hunk(uint32_t hunknum, void *buffer)
*
* @brief -------------------------------------------------
* read - read a single hunk from the CHD file
@@ -870,18 +901,18 @@ void chd_file::close()
* @return The hunk.
*/
-chd_error chd_file::read_hunk(uint32_t hunknum, void *buffer)
+std::error_condition chd_file::read_hunk(uint32_t hunknum, void *buffer)
{
// wrap this for clean reporting
try
{
// punt if no file
- if (m_file == nullptr)
- throw CHDERR_NOT_OPEN;
+ if (!m_file)
+ throw std::error_condition(error::NOT_OPEN);
// return an error if out of range
if (hunknum >= m_hunkcount)
- throw CHDERR_HUNK_OUT_OF_RANGE;
+ throw std::error_condition(error::HUNK_OUT_OF_RANGE);
// get a pointer to the map entry
uint64_t blockoffs;
@@ -904,29 +935,29 @@ chd_error chd_file::read_hunk(uint32_t hunknum, void *buffer)
file_read(blockoffs, &m_compressed[0], blocklen);
m_decompressor[0]->decompress(&m_compressed[0], blocklen, dest, m_hunkbytes);
if (!(rawmap[15] & V34_MAP_ENTRY_FLAG_NO_CRC) && dest != nullptr && util::crc32_creator::simple(dest, m_hunkbytes) != blockcrc)
- throw CHDERR_DECOMPRESSION_ERROR;
- return CHDERR_NONE;
+ throw std::error_condition(error::DECOMPRESSION_ERROR);
+ return std::error_condition();
case V34_MAP_ENTRY_TYPE_UNCOMPRESSED:
file_read(blockoffs, dest, m_hunkbytes);
if (!(rawmap[15] & V34_MAP_ENTRY_FLAG_NO_CRC) && util::crc32_creator::simple(dest, m_hunkbytes) != blockcrc)
- throw CHDERR_DECOMPRESSION_ERROR;
- return CHDERR_NONE;
+ throw std::error_condition(error::DECOMPRESSION_ERROR);
+ return std::error_condition();
case V34_MAP_ENTRY_TYPE_MINI:
be_write(dest, blockoffs, 8);
for (uint32_t bytes = 8; bytes < m_hunkbytes; bytes++)
dest[bytes] = dest[bytes - 8];
if (!(rawmap[15] & V34_MAP_ENTRY_FLAG_NO_CRC) && util::crc32_creator::simple(dest, m_hunkbytes) != blockcrc)
- throw CHDERR_DECOMPRESSION_ERROR;
- return CHDERR_NONE;
+ throw std::error_condition(error::DECOMPRESSION_ERROR);
+ return std::error_condition();
case V34_MAP_ENTRY_TYPE_SELF_HUNK:
return read_hunk(blockoffs, dest);
case V34_MAP_ENTRY_TYPE_PARENT_HUNK:
if (m_parent_missing)
- throw CHDERR_REQUIRES_PARENT;
+ throw std::error_condition(error::REQUIRES_PARENT);
return m_parent->read_hunk(blockoffs, dest);
}
break;
@@ -942,12 +973,12 @@ chd_error chd_file::read_hunk(uint32_t hunknum, void *buffer)
if (blockoffs != 0)
file_read(blockoffs, dest, m_hunkbytes);
else if (m_parent_missing)
- throw CHDERR_REQUIRES_PARENT;
+ throw std::error_condition(error::REQUIRES_PARENT);
else if (m_parent != nullptr)
m_parent->read_hunk(hunknum, dest);
else
memset(dest, 0, m_hunkbytes);
- return CHDERR_NONE;
+ return std::error_condition();
}
// compressed case
@@ -963,41 +994,40 @@ chd_error chd_file::read_hunk(uint32_t hunknum, void *buffer)
file_read(blockoffs, &m_compressed[0], blocklen);
m_decompressor[rawmap[0]]->decompress(&m_compressed[0], blocklen, dest, m_hunkbytes);
if (!m_decompressor[rawmap[0]]->lossy() && dest != nullptr && util::crc16_creator::simple(dest, m_hunkbytes) != blockcrc)
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(error::DECOMPRESSION_ERROR);
if (m_decompressor[rawmap[0]]->lossy() && util::crc16_creator::simple(&m_compressed[0], blocklen) != blockcrc)
- throw CHDERR_DECOMPRESSION_ERROR;
- return CHDERR_NONE;
+ throw std::error_condition(error::DECOMPRESSION_ERROR);
+ return std::error_condition();
case COMPRESSION_NONE:
file_read(blockoffs, dest, m_hunkbytes);
if (util::crc16_creator::simple(dest, m_hunkbytes) != blockcrc)
- throw CHDERR_DECOMPRESSION_ERROR;
- return CHDERR_NONE;
+ throw std::error_condition(error::DECOMPRESSION_ERROR);
+ return std::error_condition();
case COMPRESSION_SELF:
return read_hunk(blockoffs, dest);
case COMPRESSION_PARENT:
if (m_parent_missing)
- throw CHDERR_REQUIRES_PARENT;
+ throw std::error_condition(error::REQUIRES_PARENT);
return m_parent->read_bytes(uint64_t(blockoffs) * uint64_t(m_parent->unit_bytes()), dest, m_hunkbytes);
}
break;
}
// if we get here, something was wrong
- throw CHDERR_READ_ERROR;
+ throw std::error_condition(std::errc::io_error);
}
-
- // just return errors
- catch (chd_error &err)
+ catch (std::error_condition const &err)
{
+ // just return errors
return err;
}
}
/**
- * @fn chd_error chd_file::write_hunk(uint32_t hunknum, const void *buffer)
+ * @fn std::error_condition chd_file::write_hunk(uint32_t hunknum, const void *buffer)
*
* @brief -------------------------------------------------
* write - write a single hunk to the CHD file
@@ -1012,29 +1042,29 @@ chd_error chd_file::read_hunk(uint32_t hunknum, void *buffer)
* @param hunknum The hunknum.
* @param buffer The buffer.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::write_hunk(uint32_t hunknum, const void *buffer)
+std::error_condition chd_file::write_hunk(uint32_t hunknum, const void *buffer)
{
// wrap this for clean reporting
try
{
// punt if no file
- if (m_file == nullptr)
- throw CHDERR_NOT_OPEN;
+ if (!m_file)
+ throw std::error_condition(error::NOT_OPEN);
// return an error if out of range
if (hunknum >= m_hunkcount)
- throw CHDERR_HUNK_OUT_OF_RANGE;
+ throw std::error_condition(error::HUNK_OUT_OF_RANGE);
// if not writeable, fail
if (!m_allow_writes)
- throw CHDERR_FILE_NOT_WRITEABLE;
+ throw std::error_condition(error::FILE_NOT_WRITEABLE);
// uncompressed writes only via this interface
if (compressed())
- throw CHDERR_FILE_NOT_WRITEABLE;
+ throw std::error_condition(error::FILE_NOT_WRITEABLE);
// see if we have allocated the space on disk for this hunk
uint8_t *rawmap = &m_rawmap[hunknum * 4];
@@ -1055,7 +1085,7 @@ chd_error chd_file::write_hunk(uint32_t hunknum, const void *buffer)
// if it's all zeros, do nothing more
if (all_zeros)
- return CHDERR_NONE;
+ return std::error_condition();
// append new data to the end of the file, aligning the first chunk
rawentry = file_append(buffer, m_hunkbytes, m_hunkbytes) / m_hunkbytes;
@@ -1068,22 +1098,22 @@ chd_error chd_file::write_hunk(uint32_t hunknum, const void *buffer)
if (hunknum == m_cachehunk && buffer != &m_cache[0])
memcpy(&m_cache[0], buffer, m_hunkbytes);
}
-
- // otherwise, just overwrite
else
+ {
+ // otherwise, just overwrite
file_write(uint64_t(rawentry) * uint64_t(m_hunkbytes), buffer, m_hunkbytes);
- return CHDERR_NONE;
+ }
+ return std::error_condition();
}
-
- // just return errors
- catch (chd_error &err)
+ catch (std::error_condition const &err)
{
+ // just return errors
return err;
}
}
/**
- * @fn chd_error chd_file::read_units(uint64_t unitnum, void *buffer, uint32_t count)
+ * @fn std::error_condition chd_file::read_units(uint64_t unitnum, void *buffer, uint32_t count)
*
* @brief -------------------------------------------------
* read_units - read the given number of units from the CHD
@@ -1096,13 +1126,13 @@ chd_error chd_file::write_hunk(uint32_t hunknum, const void *buffer)
* @return The units.
*/
-chd_error chd_file::read_units(uint64_t unitnum, void *buffer, uint32_t count)
+std::error_condition chd_file::read_units(uint64_t unitnum, void *buffer, uint32_t count)
{
return read_bytes(unitnum * uint64_t(m_unitbytes), buffer, count * m_unitbytes);
}
/**
- * @fn chd_error chd_file::write_units(uint64_t unitnum, const void *buffer, uint32_t count)
+ * @fn std::error_condition chd_file::write_units(uint64_t unitnum, const void *buffer, uint32_t count)
*
* @brief -------------------------------------------------
* write_units - write the given number of units to the CHD
@@ -1112,16 +1142,16 @@ chd_error chd_file::read_units(uint64_t unitnum, void *buffer, uint32_t count)
* @param buffer The buffer.
* @param count Number of.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::write_units(uint64_t unitnum, const void *buffer, uint32_t count)
+std::error_condition chd_file::write_units(uint64_t unitnum, const void *buffer, uint32_t count)
{
return write_bytes(unitnum * uint64_t(m_unitbytes), buffer, count * m_unitbytes);
}
/**
- * @fn chd_error chd_file::read_bytes(uint64_t offset, void *buffer, uint32_t bytes)
+ * @fn std::error_condition chd_file::read_bytes(uint64_t offset, void *buffer, uint32_t bytes)
*
* @brief -------------------------------------------------
* read_bytes - read from the CHD at a byte level, using the cache to handle partial
@@ -1135,7 +1165,7 @@ chd_error chd_file::write_units(uint64_t unitnum, const void *buffer, uint32_t c
* @return The bytes.
*/
-chd_error chd_file::read_bytes(uint64_t offset, void *buffer, uint32_t bytes)
+std::error_condition chd_file::read_bytes(uint64_t offset, void *buffer, uint32_t bytes)
{
// iterate over hunks
uint32_t first_hunk = offset / m_hunkbytes;
@@ -1148,7 +1178,7 @@ chd_error chd_file::read_bytes(uint64_t offset, void *buffer, uint32_t bytes)
uint32_t endoffs = (curhunk == last_hunk) ? ((offset + bytes - 1) % m_hunkbytes) : (m_hunkbytes - 1);
// if it's a full block, just read directly from disk unless it's the cached hunk
- chd_error err = CHDERR_NONE;
+ std::error_condition err;
if (startoffs == 0 && endoffs == m_hunkbytes - 1 && curhunk != m_cachehunk)
err = read_hunk(curhunk, dest);
@@ -1158,7 +1188,7 @@ chd_error chd_file::read_bytes(uint64_t offset, void *buffer, uint32_t bytes)
if (curhunk != m_cachehunk)
{
err = read_hunk(curhunk, &m_cache[0]);
- if (err != CHDERR_NONE)
+ if (err)
return err;
m_cachehunk = curhunk;
}
@@ -1166,15 +1196,15 @@ chd_error chd_file::read_bytes(uint64_t offset, void *buffer, uint32_t bytes)
}
// handle errors and advance
- if (err != CHDERR_NONE)
+ if (err)
return err;
dest += endoffs + 1 - startoffs;
}
- return CHDERR_NONE;
+ return std::error_condition();
}
/**
- * @fn chd_error chd_file::write_bytes(uint64_t offset, const void *buffer, uint32_t bytes)
+ * @fn std::error_condition chd_file::write_bytes(uint64_t offset, const void *buffer, uint32_t bytes)
*
* @brief -------------------------------------------------
* write_bytes - write to the CHD at a byte level, using the cache to handle partial
@@ -1185,10 +1215,10 @@ chd_error chd_file::read_bytes(uint64_t offset, void *buffer, uint32_t bytes)
* @param buffer The buffer.
* @param bytes The bytes.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::write_bytes(uint64_t offset, const void *buffer, uint32_t bytes)
+std::error_condition chd_file::write_bytes(uint64_t offset, const void *buffer, uint32_t bytes)
{
// iterate over hunks
uint32_t first_hunk = offset / m_hunkbytes;
@@ -1201,7 +1231,7 @@ chd_error chd_file::write_bytes(uint64_t offset, const void *buffer, uint32_t by
uint32_t endoffs = (curhunk == last_hunk) ? ((offset + bytes - 1) % m_hunkbytes) : (m_hunkbytes - 1);
// if it's a full block, just write directly to disk unless it's the cached hunk
- chd_error err = CHDERR_NONE;
+ std::error_condition err;
if (startoffs == 0 && endoffs == m_hunkbytes - 1 && curhunk != m_cachehunk)
err = write_hunk(curhunk, source);
@@ -1211,7 +1241,7 @@ chd_error chd_file::write_bytes(uint64_t offset, const void *buffer, uint32_t by
if (curhunk != m_cachehunk)
{
err = read_hunk(curhunk, &m_cache[0]);
- if (err != CHDERR_NONE)
+ if (err)
return err;
m_cachehunk = curhunk;
}
@@ -1220,15 +1250,15 @@ chd_error chd_file::write_bytes(uint64_t offset, const void *buffer, uint32_t by
}
// handle errors and advance
- if (err != CHDERR_NONE)
+ if (err)
return err;
source += endoffs + 1 - startoffs;
}
- return CHDERR_NONE;
+ return std::error_condition();
}
/**
- * @fn chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::string &output)
+ * @fn std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::string &output)
*
* @brief -------------------------------------------------
* read_metadata - read the indexed metadata of the given type
@@ -1244,7 +1274,7 @@ chd_error chd_file::write_bytes(uint64_t offset, const void *buffer, uint32_t by
* @return The metadata.
*/
-chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::string &output)
+std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::string &output)
{
// wrap this for clean reporting
try
@@ -1252,23 +1282,22 @@ chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchind
// if we didn't find it, just return
metadata_entry metaentry;
if (!metadata_find(searchtag, searchindex, metaentry))
- throw CHDERR_METADATA_NOT_FOUND;
+ throw std::error_condition(error::METADATA_NOT_FOUND);
// read the metadata
output.assign(metaentry.length, '\0');
file_read(metaentry.offset + METADATA_HEADER_SIZE, &output[0], metaentry.length);
- return CHDERR_NONE;
+ return std::error_condition();
}
-
- // just return errors
- catch (chd_error &err)
+ catch (std::error_condition const &err)
{
+ // just return errors
return err;
}
}
/**
- * @fn chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::vector<uint8_t> &output)
+ * @fn std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::vector<uint8_t> &output)
*
* @brief Reads a metadata.
*
@@ -1282,7 +1311,7 @@ chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchind
* @return The metadata.
*/
-chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::vector<uint8_t> &output)
+std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::vector<uint8_t> &output)
{
// wrap this for clean reporting
try
@@ -1290,23 +1319,22 @@ chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchind
// if we didn't find it, just return
metadata_entry metaentry;
if (!metadata_find(searchtag, searchindex, metaentry))
- throw CHDERR_METADATA_NOT_FOUND;
+ throw std::error_condition(error::METADATA_NOT_FOUND);
// read the metadata
output.resize(metaentry.length);
file_read(metaentry.offset + METADATA_HEADER_SIZE, &output[0], metaentry.length);
- return CHDERR_NONE;
+ return std::error_condition();
}
-
- // just return errors
- catch (chd_error &err)
+ catch (std::error_condition const &err)
{
+ // just return errors
return err;
}
}
/**
- * @fn chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, void *output, uint32_t outputlen, uint32_t &resultlen)
+ * @fn std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, void *output, uint32_t outputlen, uint32_t &resultlen)
*
* @brief Reads a metadata.
*
@@ -1322,7 +1350,7 @@ chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchind
* @return The metadata.
*/
-chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, void *output, uint32_t outputlen, uint32_t &resultlen)
+std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, void *output, uint32_t outputlen, uint32_t &resultlen)
{
// wrap this for clean reporting
try
@@ -1330,23 +1358,22 @@ chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchind
// if we didn't find it, just return
metadata_entry metaentry;
if (!metadata_find(searchtag, searchindex, metaentry))
- throw CHDERR_METADATA_NOT_FOUND;
+ throw std::error_condition(error::METADATA_NOT_FOUND);
// read the metadata
resultlen = metaentry.length;
file_read(metaentry.offset + METADATA_HEADER_SIZE, output, std::min(outputlen, resultlen));
- return CHDERR_NONE;
+ return std::error_condition();
}
-
- // just return errors
- catch (chd_error &err)
+ catch (std::error_condition const &err)
{
+ // just return errors
return err;
}
}
/**
- * @fn chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::vector<uint8_t> &output, chd_metadata_tag &resulttag, uint8_t &resultflags)
+ * @fn std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::vector<uint8_t> &output, chd_metadata_tag &resulttag, uint8_t &resultflags)
*
* @brief Reads a metadata.
*
@@ -1362,7 +1389,7 @@ chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchind
* @return The metadata.
*/
-chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::vector<uint8_t> &output, chd_metadata_tag &resulttag, uint8_t &resultflags)
+std::error_condition chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::vector<uint8_t> &output, chd_metadata_tag &resulttag, uint8_t &resultflags)
{
// wrap this for clean reporting
try
@@ -1370,25 +1397,24 @@ chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchind
// if we didn't find it, just return
metadata_entry metaentry;
if (!metadata_find(searchtag, searchindex, metaentry))
- throw CHDERR_METADATA_NOT_FOUND;
+ throw std::error_condition(error::METADATA_NOT_FOUND);
// read the metadata
output.resize(metaentry.length);
file_read(metaentry.offset + METADATA_HEADER_SIZE, &output[0], metaentry.length);
resulttag = metaentry.metatag;
resultflags = metaentry.flags;
- return CHDERR_NONE;
+ return std::error_condition();
}
-
- // just return errors
- catch (chd_error &err)
+ catch (std::error_condition const &err)
{
+ // just return errors
return err;
}
}
/**
- * @fn chd_error chd_file::write_metadata(chd_metadata_tag metatag, uint32_t metaindex, const void *inputbuf, uint32_t inputlen, uint8_t flags)
+ * @fn std::error_condition chd_file::write_metadata(chd_metadata_tag metatag, uint32_t metaindex, const void *inputbuf, uint32_t inputlen, uint8_t flags)
*
* @brief -------------------------------------------------
* write_metadata - write the indexed metadata of the given type
@@ -1400,17 +1426,17 @@ chd_error chd_file::read_metadata(chd_metadata_tag searchtag, uint32_t searchind
* @param inputlen The inputlen.
* @param flags The flags.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::write_metadata(chd_metadata_tag metatag, uint32_t metaindex, const void *inputbuf, uint32_t inputlen, uint8_t flags)
+std::error_condition chd_file::write_metadata(chd_metadata_tag metatag, uint32_t metaindex, const void *inputbuf, uint32_t inputlen, uint8_t flags)
{
// wrap this for clean reporting
try
{
// must write at least 1 byte and no more than 16MB
if (inputlen < 1 || inputlen >= 16 * 1024 * 1024)
- return CHDERR_INVALID_PARAMETER;
+ return std::error_condition(std::errc::invalid_argument);
// find the entry if it already exists
metadata_entry metaentry;
@@ -1459,18 +1485,17 @@ chd_error chd_file::write_metadata(chd_metadata_tag metatag, uint32_t metaindex,
// update the hash
metadata_update_hash();
- return CHDERR_NONE;
+ return std::error_condition();
}
-
- // return any errors
- catch (chd_error &err)
+ catch (std::error_condition const &err)
{
+ // return any errors
return err;
}
}
/**
- * @fn chd_error chd_file::delete_metadata(chd_metadata_tag metatag, uint32_t metaindex)
+ * @fn std::error_condition chd_file::delete_metadata(chd_metadata_tag metatag, uint32_t metaindex)
*
* @brief -------------------------------------------------
* delete_metadata - remove the given metadata from the list
@@ -1482,10 +1507,10 @@ chd_error chd_file::write_metadata(chd_metadata_tag metatag, uint32_t metaindex,
* @param metatag The metatag.
* @param metaindex The metaindex.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::delete_metadata(chd_metadata_tag metatag, uint32_t metaindex)
+std::error_condition chd_file::delete_metadata(chd_metadata_tag metatag, uint32_t metaindex)
{
// wrap this for clean reporting
try
@@ -1493,22 +1518,21 @@ chd_error chd_file::delete_metadata(chd_metadata_tag metatag, uint32_t metaindex
// find the entry
metadata_entry metaentry;
if (!metadata_find(metatag, metaindex, metaentry))
- throw CHDERR_METADATA_NOT_FOUND;
+ throw std::error_condition(error::METADATA_NOT_FOUND);
// point the previous to the next, unlinking us
metadata_set_previous_next(metaentry.prev, metaentry.next);
- return CHDERR_NONE;
+ return std::error_condition();
}
-
- // return any errors
- catch (chd_error &err)
+ catch (std::error_condition const &err)
{
+ // return any errors
return err;
}
}
/**
- * @fn chd_error chd_file::clone_all_metadata(chd_file &source)
+ * @fn std::error_condition chd_file::clone_all_metadata(chd_file &source)
*
* @brief -------------------------------------------------
* clone_all_metadata - clone the metadata from one CHD to a second
@@ -1518,10 +1542,10 @@ chd_error chd_file::delete_metadata(chd_metadata_tag metatag, uint32_t metaindex
*
* @param [in,out] source Another instance to copy.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::clone_all_metadata(chd_file &source)
+std::error_condition chd_file::clone_all_metadata(chd_file &source)
{
// wrap this for clean reporting
try
@@ -1540,16 +1564,15 @@ chd_error chd_file::clone_all_metadata(chd_file &source)
source.file_read(metaentry.offset + METADATA_HEADER_SIZE, &filedata[0], metaentry.length);
// write it to the destination
- chd_error err = write_metadata(metaentry.metatag, (uint32_t)-1, &filedata[0], metaentry.length, metaentry.flags);
- if (err != CHDERR_NONE)
+ std::error_condition err = write_metadata(metaentry.metatag, (uint32_t)-1, &filedata[0], metaentry.length, metaentry.flags);
+ if (err)
throw err;
}
- return CHDERR_NONE;
+ return std::error_condition();
}
-
- // return any errors
- catch (chd_error &err)
+ catch (std::error_condition const &err)
{
+ // return any errors
return err;
}
}
@@ -1607,7 +1630,7 @@ util::sha1_t chd_file::compute_overall_sha1(util::sha1_t rawsha1)
}
/**
- * @fn chd_error chd_file::codec_configure(chd_codec_type codec, int param, void *config)
+ * @fn std::error_condition chd_file::codec_configure(chd_codec_type codec, int param, void *config)
*
* @brief -------------------------------------------------
* codec_config - set internal codec parameters
@@ -1617,10 +1640,10 @@ util::sha1_t chd_file::compute_overall_sha1(util::sha1_t rawsha1)
* @param param The parameter.
* @param [in,out] config If non-null, the configuration.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::codec_configure(chd_codec_type codec, int param, void *config)
+std::error_condition chd_file::codec_configure(chd_codec_type codec, int param, void *config)
{
// wrap this for clean reporting
try
@@ -1630,14 +1653,13 @@ chd_error chd_file::codec_configure(chd_codec_type codec, int param, void *confi
if (m_compression[codecnum] == codec)
{
m_decompressor[codecnum]->configure(param, config);
- return CHDERR_NONE;
+ return std::error_condition();
}
- return CHDERR_INVALID_PARAMETER;
+ return std::errc::invalid_argument;
}
-
- // return any errors
- catch (chd_error &err)
+ catch (std::error_condition const &err)
{
+ // return any errors
return err;
}
}
@@ -1654,44 +1676,49 @@ chd_error chd_file::codec_configure(chd_codec_type codec, int param, void *confi
* @return null if it fails, else a char*.
*/
-const char *chd_file::error_string(chd_error err)
+std::error_category const &chd_category() noexcept
{
- switch (err)
+ class chd_category_impl : public std::error_category
{
- case CHDERR_NONE: return "no error";
- case CHDERR_NO_INTERFACE: return "no drive interface";
- case CHDERR_OUT_OF_MEMORY: return "out of memory";
- case CHDERR_NOT_OPEN: return "file not open";
- case CHDERR_ALREADY_OPEN: return "file already open";
- case CHDERR_INVALID_FILE: return "invalid file";
- case CHDERR_INVALID_PARAMETER: return "invalid parameter";
- case CHDERR_INVALID_DATA: return "invalid data";
- case CHDERR_FILE_NOT_FOUND: return "file not found";
- case CHDERR_REQUIRES_PARENT: return "requires parent";
- case CHDERR_FILE_NOT_WRITEABLE: return "file not writeable";
- case CHDERR_READ_ERROR: return "read error";
- case CHDERR_WRITE_ERROR: return "write error";
- case CHDERR_CODEC_ERROR: return "codec error";
- case CHDERR_INVALID_PARENT: return "invalid parent";
- case CHDERR_HUNK_OUT_OF_RANGE: return "hunk out of range";
- case CHDERR_DECOMPRESSION_ERROR: return "decompression error";
- case CHDERR_COMPRESSION_ERROR: return "compression error";
- case CHDERR_CANT_CREATE_FILE: return "can't create file";
- case CHDERR_CANT_VERIFY: return "can't verify file";
- case CHDERR_NOT_SUPPORTED: return "operation not supported";
- case CHDERR_METADATA_NOT_FOUND: return "can't find metadata";
- case CHDERR_INVALID_METADATA_SIZE: return "invalid metadata size";
- case CHDERR_UNSUPPORTED_VERSION: return "mismatched DIFF and CHD or unsupported CHD version";
- case CHDERR_VERIFY_INCOMPLETE: return "incomplete verify";
- case CHDERR_INVALID_METADATA: return "invalid metadata";
- case CHDERR_INVALID_STATE: return "invalid state";
- case CHDERR_OPERATION_PENDING: return "operation pending";
- case CHDERR_UNSUPPORTED_FORMAT: return "unsupported format";
- case CHDERR_UNKNOWN_COMPRESSION: return "unknown compression type";
- case CHDERR_WALKING_PARENT: return "currently examining parent";
- case CHDERR_COMPRESSING: return "currently compressing";
- default: return "undocumented error";
- }
+ virtual char const *name() const noexcept override { return "chd"; }
+
+ virtual std::string message(int condition) const override
+ {
+ using namespace std::literals;
+ static std::string_view const s_messages[] = {
+ "No error"sv,
+ "No drive interface"sv,
+ "File not open"sv,
+ "File already open"sv,
+ "Invalid file"sv,
+ "Invalid data"sv,
+ "Requires parent"sv,
+ "File not writeable"sv,
+ "Codec error"sv,
+ "Invalid parent"sv,
+ "Hunk out of range"sv,
+ "Decompression error"sv,
+ "Compression error"sv,
+ "Can't verify file"sv,
+ "Can't find metadata"sv,
+ "Invalid metadata size"sv,
+ "Mismatched DIFF and CHD or unsupported CHD version"sv,
+ "Incomplete verify"sv,
+ "Invalid metadata"sv,
+ "Invalid state"sv,
+ "Operation pending"sv,
+ "Unsupported format"sv,
+ "Unknown compression type"sv,
+ "Currently examining parent"sv,
+ "Currently compressing"sv };
+ if ((0 <= condition) && (std::size(s_messages) > condition))
+ return std::string(s_messages[condition]);
+ else
+ return "Unknown error"s;
+ }
+ };
+ static chd_category_impl const s_chd_category_instance;
+ return s_chd_category_instance;
}
@@ -1716,15 +1743,15 @@ uint32_t chd_file::guess_unitbytes()
// look for hard disk metadata; if found, then the unit size == sector size
std::string metadata;
int i0, i1, i2, i3;
- if (read_metadata(HARD_DISK_METADATA_TAG, 0, metadata) == CHDERR_NONE && sscanf(metadata.c_str(), HARD_DISK_METADATA_FORMAT, &i0, &i1, &i2, &i3) == 4)
+ if (!read_metadata(HARD_DISK_METADATA_TAG, 0, metadata) && sscanf(metadata.c_str(), HARD_DISK_METADATA_FORMAT, &i0, &i1, &i2, &i3) == 4)
return i3;
// look for CD-ROM metadata; if found, then the unit size == CD frame size
- if (read_metadata(CDROM_OLD_METADATA_TAG, 0, metadata) == CHDERR_NONE ||
- read_metadata(CDROM_TRACK_METADATA_TAG, 0, metadata) == CHDERR_NONE ||
- read_metadata(CDROM_TRACK_METADATA2_TAG, 0, metadata) == CHDERR_NONE ||
- read_metadata(GDROM_OLD_METADATA_TAG, 0, metadata) == CHDERR_NONE ||
- read_metadata(GDROM_TRACK_METADATA_TAG, 0, metadata) == CHDERR_NONE)
+ if (!read_metadata(CDROM_OLD_METADATA_TAG, 0, metadata) ||
+ !read_metadata(CDROM_TRACK_METADATA_TAG, 0, metadata) ||
+ !read_metadata(CDROM_TRACK_METADATA2_TAG, 0, metadata) ||
+ !read_metadata(GDROM_OLD_METADATA_TAG, 0, metadata) ||
+ !read_metadata(GDROM_TRACK_METADATA_TAG, 0, metadata))
return CD_FRAME_SIZE;
// otherwise, just map 1:1 with the hunk size
@@ -1751,7 +1778,7 @@ void chd_file::parse_v3_header(uint8_t *rawheader, util::sha1_t &parentsha1)
{
// verify header length
if (be_read(&rawheader[8], 4) != V3_HEADER_SIZE)
- throw CHDERR_INVALID_FILE;
+ throw std::error_condition(error::INVALID_FILE);
// extract core info
m_logicalbytes = be_read(&rawheader[28], 8);
@@ -1771,7 +1798,7 @@ void chd_file::parse_v3_header(uint8_t *rawheader, util::sha1_t &parentsha1)
case 1: m_compression[0] = CHD_CODEC_ZLIB; break;
case 2: m_compression[0] = CHD_CODEC_ZLIB; break;
case 3: m_compression[0] = CHD_CODEC_AVHUFF; break;
- default: throw CHDERR_UNKNOWN_COMPRESSION;
+ default: throw std::error_condition(error::UNKNOWN_COMPRESSION);
}
m_compression[1] = m_compression[2] = m_compression[3] = CHD_CODEC_NONE;
@@ -1814,7 +1841,7 @@ void chd_file::parse_v4_header(uint8_t *rawheader, util::sha1_t &parentsha1)
{
// verify header length
if (be_read(&rawheader[8], 4) != V4_HEADER_SIZE)
- throw CHDERR_INVALID_FILE;
+ throw std::error_condition(error::INVALID_FILE);
// extract core info
m_logicalbytes = be_read(&rawheader[28], 8);
@@ -1834,7 +1861,7 @@ void chd_file::parse_v4_header(uint8_t *rawheader, util::sha1_t &parentsha1)
case 1: m_compression[0] = CHD_CODEC_ZLIB; break;
case 2: m_compression[0] = CHD_CODEC_ZLIB; break;
case 3: m_compression[0] = CHD_CODEC_AVHUFF; break;
- default: throw CHDERR_UNKNOWN_COMPRESSION;
+ default: throw std::error_condition(error::UNKNOWN_COMPRESSION);
}
m_compression[1] = m_compression[2] = m_compression[3] = CHD_CODEC_NONE;
@@ -1874,7 +1901,7 @@ void chd_file::parse_v5_header(uint8_t *rawheader, util::sha1_t &parentsha1)
{
// verify header length
if (be_read(&rawheader[8], 4) != V5_HEADER_SIZE)
- throw CHDERR_INVALID_FILE;
+ throw std::error_condition(error::INVALID_FILE);
// extract core info
m_logicalbytes = be_read(&rawheader[32], 8);
@@ -1908,7 +1935,7 @@ void chd_file::parse_v5_header(uint8_t *rawheader, util::sha1_t &parentsha1)
}
/**
- * @fn chd_error chd_file::compress_v5_map()
+ * @fn std::error_condition chd_file::compress_v5_map()
*
* @brief -------------------------------------------------
* compress_v5_map - compress the v5 map and write it to the end of the file
@@ -1917,10 +1944,10 @@ void chd_file::parse_v5_header(uint8_t *rawheader, util::sha1_t &parentsha1)
* @exception CHDERR_COMPRESSION_ERROR Thrown when a chderr compression error error
* condition occurs.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::compress_v5_map()
+std::error_condition chd_file::compress_v5_map()
{
try
{
@@ -2015,10 +2042,10 @@ chd_error chd_file::compress_v5_map()
bitstream_out bitbuf(&compressed[16], compressed.size() - 16);
huffman_error err = encoder.compute_tree_from_histo();
if (err != HUFFERR_NONE)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(error::COMPRESSION_ERROR);
err = encoder.export_tree_rle(bitbuf);
if (err != HUFFERR_NONE)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(error::COMPRESSION_ERROR);
// encode the data
for (uint8_t *src = &compression_rle[0]; src < dest; src++)
@@ -2113,9 +2140,9 @@ chd_error chd_file::compress_v5_map()
uint8_t rawbuf[sizeof(uint64_t)];
be_write(rawbuf, m_mapoffset, 8);
file_write(m_mapoffset_offset, rawbuf, sizeof(rawbuf));
- return CHDERR_NONE;
+ return std::error_condition();
}
- catch (chd_error &err)
+ catch (std::error_condition const &err)
{
return err;
}
@@ -2160,7 +2187,7 @@ void chd_file::decompress_v5_map()
huffman_decoder<16, 8> decoder;
huffman_error err = decoder.import_tree_rle(bitbuf);
if (err != HUFFERR_NONE)
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(error::DECOMPRESSION_ERROR);
uint8_t lastcomp = 0;
int repcount = 0;
for (int hunknum = 0; hunknum < m_hunkcount; hunknum++)
@@ -2244,11 +2271,11 @@ void chd_file::decompress_v5_map()
// verify the final CRC
if (util::crc16_creator::simple(&m_rawmap[0], m_hunkcount * 12) != mapcrc)
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(error::DECOMPRESSION_ERROR);
}
/**
- * @fn chd_error chd_file::create_common()
+ * @fn std::error_condition chd_file::create_common()
*
* @brief -------------------------------------------------
* create_common - command path when creating a new CHD file
@@ -2264,7 +2291,7 @@ void chd_file::decompress_v5_map()
* @return The new common.
*/
-chd_error chd_file::create_common()
+std::error_condition chd_file::create_common()
{
// wrap in try for proper error handling
try
@@ -2273,14 +2300,14 @@ chd_error chd_file::create_common()
m_metaoffset = 0;
// if we have a parent, it must be V3 or later
- if (m_parent != nullptr && m_parent->version() < 3)
- throw CHDERR_UNSUPPORTED_VERSION;
+ if (m_parent && m_parent->version() < 3)
+ throw std::error_condition(error::UNSUPPORTED_VERSION);
// must be an even number of units per hunk
if (m_hunkbytes % m_unitbytes != 0)
- throw CHDERR_INVALID_PARAMETER;
- if (m_parent != nullptr && m_unitbytes != m_parent->unit_bytes())
- throw CHDERR_INVALID_PARAMETER;
+ throw std::error_condition(std::errc::invalid_argument);
+ if (m_parent && m_unitbytes != m_parent->unit_bytes())
+ throw std::error_condition(std::errc::invalid_argument);
// verify the compression types
bool found_zero = false;
@@ -2290,9 +2317,9 @@ chd_error chd_file::create_common()
if (elem == CHD_CODEC_NONE)
found_zero = true;
else if (found_zero)
- throw CHDERR_INVALID_PARAMETER;
+ throw std::error_condition(std::errc::invalid_argument);
else if (!chd_codec_list::codec_exists(elem))
- throw CHDERR_UNKNOWN_COMPRESSION;
+ throw std::error_condition(error::UNKNOWN_COMPRESSION);
}
// create our V5 header
@@ -2342,10 +2369,9 @@ chd_error chd_file::create_common()
// finish opening the file
create_open_common();
}
-
- // handle errors by closing ourself
- catch (chd_error &err)
+ catch (std::error_condition const &err)
{
+ // handle errors by closing ourself
close();
return err;
}
@@ -2354,11 +2380,11 @@ chd_error chd_file::create_common()
close();
throw;
}
- return CHDERR_NONE;
+ return std::error_condition();
}
/**
- * @fn chd_error chd_file::open_common(bool writeable)
+ * @fn std::error_condition chd_file::open_common(bool writeable)
*
* @brief -------------------------------------------------
* open_common - common path when opening an existing CHD file for input
@@ -2377,10 +2403,10 @@ chd_error chd_file::create_common()
*
* @param writeable true if writeable.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file::open_common(bool writeable)
+std::error_condition chd_file::open_common(bool writeable)
{
// wrap in try for proper error handling
try
@@ -2394,7 +2420,7 @@ chd_error chd_file::open_common(bool writeable)
// verify the signature
if (memcmp(rawheader, "MComprHD", 8) != 0)
- throw CHDERR_INVALID_FILE;
+ throw std::error_condition(error::INVALID_FILE);
m_version = be_read(&rawheader[12], 4);
@@ -2405,7 +2431,7 @@ chd_error chd_file::open_common(bool writeable)
case 3: parse_v3_header(rawheader, parentsha1); break;
case 4: parse_v4_header(rawheader, parentsha1); break;
case 5: parse_v5_header(rawheader, parentsha1); break;
- default: throw CHDERR_UNSUPPORTED_VERSION;
+ default: throw std::error_condition(error::UNSUPPORTED_VERSION);
}
// only allow writes to the most recent version
@@ -2413,27 +2439,26 @@ chd_error chd_file::open_common(bool writeable)
m_allow_writes = false;
if (writeable && !m_allow_writes)
- throw CHDERR_FILE_NOT_WRITEABLE;
+ throw std::error_condition(error::FILE_NOT_WRITEABLE);
// make sure we have a parent if we need one (and don't if we don't)
if (parentsha1 != util::sha1_t::null)
{
- if (m_parent == nullptr)
+ if (!m_parent)
m_parent_missing = true;
else if (m_parent->sha1() != parentsha1)
- throw CHDERR_INVALID_PARENT;
+ throw std::error_condition(error::INVALID_PARENT);
}
- else if (m_parent != nullptr)
- throw CHDERR_INVALID_PARAMETER;
+ else if (m_parent)
+ throw std::error_condition(std::errc::invalid_argument);
// finish opening the file
create_open_common();
- return CHDERR_NONE;
+ return std::error_condition();
}
-
- // handle errors by closing ourself
- catch (chd_error &err)
+ catch (std::error_condition const &err)
{
+ // handle errors by closing ourself
close();
return err;
}
@@ -2457,7 +2482,7 @@ void chd_file::create_open_common()
{
m_decompressor[decompnum] = chd_codec_list::new_decompressor(m_compression[decompnum], *this);
if (m_decompressor[decompnum] == nullptr && m_compression[decompnum] != 0)
- throw CHDERR_UNKNOWN_COMPRESSION;
+ throw std::error_condition(error::UNKNOWN_COMPRESSION);
}
// read the map; v5+ compressed drives need to read and decompress their map
@@ -2494,30 +2519,30 @@ void chd_file::create_open_common()
void chd_file::verify_proper_compression_append(uint32_t hunknum)
{
// punt if no file
- if (m_file == nullptr)
- throw CHDERR_NOT_OPEN;
+ if (!m_file)
+ throw std::error_condition(error::NOT_OPEN);
// return an error if out of range
if (hunknum >= m_hunkcount)
- throw CHDERR_HUNK_OUT_OF_RANGE;
+ throw std::error_condition(error::HUNK_OUT_OF_RANGE);
// if not writeable, fail
if (!m_allow_writes)
- throw CHDERR_FILE_NOT_WRITEABLE;
+ throw std::error_condition(error::FILE_NOT_WRITEABLE);
// compressed writes only via this interface
if (!compressed())
- throw CHDERR_FILE_NOT_WRITEABLE;
+ throw std::error_condition(error::FILE_NOT_WRITEABLE);
// only permitted to write new blocks
uint8_t *rawmap = &m_rawmap[hunknum * 12];
if (rawmap[0] != 0xff)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(error::COMPRESSION_ERROR);
// if this isn't the first block, only permitted to write immediately
// after the previous one
if (hunknum != 0 && rawmap[-12] == 0xff)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(error::COMPRESSION_ERROR);
}
/**
@@ -2572,7 +2597,7 @@ void chd_file::hunk_copy_from_self(uint32_t hunknum, uint32_t otherhunk)
// only permitted to reference prior hunks
if (otherhunk >= hunknum)
- throw CHDERR_INVALID_PARAMETER;
+ throw std::error_condition(std::errc::invalid_argument);
// update the map entry
uint8_t *rawmap = &m_rawmap[hunknum * 12];
@@ -2841,7 +2866,7 @@ void chd_file_compressor::compress_begin()
}
/**
- * @fn chd_error chd_file_compressor::compress_continue(double &progress, double &ratio)
+ * @fn std::error_condition chd_file_compressor::compress_continue(double &progress, double &ratio)
*
* @brief -------------------------------------------------
* compress_continue - continue compression
@@ -2850,14 +2875,14 @@ void chd_file_compressor::compress_begin()
* @param [in,out] progress The progress.
* @param [in,out] ratio The ratio.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chd_file_compressor::compress_continue(double &progress, double &ratio)
+std::error_condition chd_file_compressor::compress_continue(double &progress, double &ratio)
{
// if we got an error, return an error
if (m_read_error)
- return CHDERR_READ_ERROR;
+ return std::errc::io_error;
// if done reading, queue some more
while (m_read_queue_offset < m_logicalbytes && osd_work_queue_items(m_read_queue) < 2)
@@ -2911,8 +2936,8 @@ chd_error chd_file_compressor::compress_continue(double &progress, double &ratio
// if we're uncompressed, use regular writes
else if (!compressed())
{
- chd_error err = write_hunk(item.m_hunknum, item.m_data);
- if (err != CHDERR_NONE)
+ std::error_condition err = write_hunk(item.m_hunknum, item.m_data);
+ if (err)
return err;
// writes of all-0 data don't actually take space, so see if we count this
@@ -2973,7 +2998,7 @@ chd_error chd_file_compressor::compress_continue(double &progress, double &ratio
{
osd_work_queue_wait(m_read_queue, 30 * osd_ticks_per_second());
if (!compressed())
- return CHDERR_NONE;
+ return std::error_condition();
set_raw_sha1(m_compsha1.finish());
return compress_v5_map();
}
@@ -2994,7 +3019,7 @@ chd_error chd_file_compressor::compress_continue(double &progress, double &ratio
m_work_item[m_write_hunk % WORK_BUFFER_HUNKS].m_osd != nullptr)
osd_work_item_wait(m_work_item[m_write_hunk % WORK_BUFFER_HUNKS].m_osd, osd_ticks_per_second());
- return m_walking_parent ? CHDERR_WALKING_PARENT : CHDERR_COMPRESSING;
+ return m_walking_parent ? error::WALKING_PARENT : error::COMPRESSING;
}
/**
@@ -3171,12 +3196,12 @@ void chd_file_compressor::async_read()
// advance the read pointer
m_read_done_offset += numbytes;
}
- catch (chd_error& err)
+ catch (std::error_condition const &err)
{
- fprintf(stderr, "CHD error occurred: %s\n", chd_file::error_string(err));
+ fprintf(stderr, "CHD error occurred: %s\n", err.message().c_str());
m_read_error = true;
}
- catch (std::exception& ex)
+ catch (std::exception const &ex)
{
fprintf(stderr, "exception occurred: %s\n", ex.what());
m_read_error = true;
diff --git a/src/lib/util/chd.h b/src/lib/util/chd.h
index 705967d3dda..8d3e639438b 100644
--- a/src/lib/util/chd.h
+++ b/src/lib/util/chd.h
@@ -7,18 +7,22 @@
MAME Compressed Hunks of Data file format
***************************************************************************/
-
-#ifndef MAME_UTIL_CHD_H
-#define MAME_UTIL_CHD_H
+#ifndef MAME_LIB_UTIL_CHD_H
+#define MAME_LIB_UTIL_CHD_H
#pragma once
-#include "osdcore.h"
-#include <string>
-#include "corefile.h"
-#include "hashing.h"
#include "chdcodec.h"
+#include "hashing.h"
+#include "ioprocs.h"
+
+#include "osdcore.h"
+
#include <atomic>
+#include <string>
+#include <string_view>
+#include <system_error>
+
/***************************************************************************
@@ -190,86 +194,49 @@
//**************************************************************************
// pseudo-codecs returned by hunk_info
-const chd_codec_type CHD_CODEC_SELF = 1; // copy of another hunk
-const chd_codec_type CHD_CODEC_PARENT = 2; // copy of a parent's hunk
-const chd_codec_type CHD_CODEC_MINI = 3; // legacy "mini" 8-byte repeat
+constexpr chd_codec_type CHD_CODEC_SELF = 1; // copy of another hunk
+constexpr chd_codec_type CHD_CODEC_PARENT = 2; // copy of a parent's hunk
+constexpr chd_codec_type CHD_CODEC_MINI = 3; // legacy "mini" 8-byte repeat
// core types
typedef uint32_t chd_metadata_tag;
// metadata parameters
-const chd_metadata_tag CHDMETATAG_WILDCARD = 0;
-const uint32_t CHDMETAINDEX_APPEND = ~0;
+constexpr chd_metadata_tag CHDMETATAG_WILDCARD = 0;
+constexpr uint32_t CHDMETAINDEX_APPEND = ~0;
// metadata flags
-const uint8_t CHD_MDFLAGS_CHECKSUM = 0x01; // indicates data is checksummed
+constexpr uint8_t CHD_MDFLAGS_CHECKSUM = 0x01; // indicates data is checksummed
// standard hard disk metadata
-const chd_metadata_tag HARD_DISK_METADATA_TAG = CHD_MAKE_TAG('G','D','D','D');
+constexpr chd_metadata_tag HARD_DISK_METADATA_TAG = CHD_MAKE_TAG('G','D','D','D');
extern const char *HARD_DISK_METADATA_FORMAT;
// hard disk identify information
-const chd_metadata_tag HARD_DISK_IDENT_METADATA_TAG = CHD_MAKE_TAG('I','D','N','T');
+constexpr chd_metadata_tag HARD_DISK_IDENT_METADATA_TAG = CHD_MAKE_TAG('I','D','N','T');
// hard disk key information
-const chd_metadata_tag HARD_DISK_KEY_METADATA_TAG = CHD_MAKE_TAG('K','E','Y',' ');
+constexpr chd_metadata_tag HARD_DISK_KEY_METADATA_TAG = CHD_MAKE_TAG('K','E','Y',' ');
// pcmcia CIS information
-const chd_metadata_tag PCMCIA_CIS_METADATA_TAG = CHD_MAKE_TAG('C','I','S',' ');
+constexpr chd_metadata_tag PCMCIA_CIS_METADATA_TAG = CHD_MAKE_TAG('C','I','S',' ');
// standard CD-ROM metadata
-const chd_metadata_tag CDROM_OLD_METADATA_TAG = CHD_MAKE_TAG('C','H','C','D');
-const chd_metadata_tag CDROM_TRACK_METADATA_TAG = CHD_MAKE_TAG('C','H','T','R');
+constexpr chd_metadata_tag CDROM_OLD_METADATA_TAG = CHD_MAKE_TAG('C','H','C','D');
+constexpr chd_metadata_tag CDROM_TRACK_METADATA_TAG = CHD_MAKE_TAG('C','H','T','R');
extern const char *CDROM_TRACK_METADATA_FORMAT;
-const chd_metadata_tag CDROM_TRACK_METADATA2_TAG = CHD_MAKE_TAG('C','H','T','2');
+constexpr chd_metadata_tag CDROM_TRACK_METADATA2_TAG = CHD_MAKE_TAG('C','H','T','2');
extern const char *CDROM_TRACK_METADATA2_FORMAT;
-const chd_metadata_tag GDROM_OLD_METADATA_TAG = CHD_MAKE_TAG('C','H','G','T');
-const chd_metadata_tag GDROM_TRACK_METADATA_TAG = CHD_MAKE_TAG('C', 'H', 'G', 'D');
+constexpr chd_metadata_tag GDROM_OLD_METADATA_TAG = CHD_MAKE_TAG('C','H','G','T');
+constexpr chd_metadata_tag GDROM_TRACK_METADATA_TAG = CHD_MAKE_TAG('C', 'H', 'G', 'D');
extern const char *GDROM_TRACK_METADATA_FORMAT;
// standard A/V metadata
-const chd_metadata_tag AV_METADATA_TAG = CHD_MAKE_TAG('A','V','A','V');
+constexpr chd_metadata_tag AV_METADATA_TAG = CHD_MAKE_TAG('A','V','A','V');
extern const char *AV_METADATA_FORMAT;
// A/V laserdisc frame metadata
-const chd_metadata_tag AV_LD_METADATA_TAG = CHD_MAKE_TAG('A','V','L','D');
-
-// error types
-enum chd_error
-{
- CHDERR_NONE,
- CHDERR_NO_INTERFACE,
- CHDERR_OUT_OF_MEMORY,
- CHDERR_NOT_OPEN,
- CHDERR_ALREADY_OPEN,
- CHDERR_INVALID_FILE,
- CHDERR_INVALID_PARAMETER,
- CHDERR_INVALID_DATA,
- CHDERR_FILE_NOT_FOUND,
- CHDERR_REQUIRES_PARENT,
- CHDERR_FILE_NOT_WRITEABLE,
- CHDERR_READ_ERROR,
- CHDERR_WRITE_ERROR,
- CHDERR_CODEC_ERROR,
- CHDERR_INVALID_PARENT,
- CHDERR_HUNK_OUT_OF_RANGE,
- CHDERR_DECOMPRESSION_ERROR,
- CHDERR_COMPRESSION_ERROR,
- CHDERR_CANT_CREATE_FILE,
- CHDERR_CANT_VERIFY,
- CHDERR_NOT_SUPPORTED,
- CHDERR_METADATA_NOT_FOUND,
- CHDERR_INVALID_METADATA_SIZE,
- CHDERR_UNSUPPORTED_VERSION,
- CHDERR_VERIFY_INCOMPLETE,
- CHDERR_INVALID_METADATA,
- CHDERR_INVALID_STATE,
- CHDERR_OPERATION_PENDING,
- CHDERR_UNSUPPORTED_FORMAT,
- CHDERR_UNKNOWN_COMPRESSION,
- CHDERR_WALKING_PARENT,
- CHDERR_COMPRESSING
-};
+constexpr chd_metadata_tag AV_LD_METADATA_TAG = CHD_MAKE_TAG('A','V','L','D');
@@ -277,9 +244,6 @@ enum chd_error
// TYPE DEFINITIONS
//**************************************************************************
-class chd_codec;
-
-
// ======================> chd_file
// core file class
@@ -289,22 +253,49 @@ class chd_file
friend class chd_verifier;
// constants
- static const uint32_t HEADER_VERSION = 5;
- static const uint32_t V3_HEADER_SIZE = 120;
- static const uint32_t V4_HEADER_SIZE = 108;
- static const uint32_t V5_HEADER_SIZE = 124;
- static const uint32_t MAX_HEADER_SIZE = V5_HEADER_SIZE;
+ static constexpr uint32_t HEADER_VERSION = 5;
+ static constexpr uint32_t V3_HEADER_SIZE = 120;
+ static constexpr uint32_t V4_HEADER_SIZE = 108;
+ static constexpr uint32_t V5_HEADER_SIZE = 124;
+ static constexpr uint32_t MAX_HEADER_SIZE = V5_HEADER_SIZE;
public:
+ // error types
+ enum class error
+ {
+ NO_INTERFACE = 1,
+ NOT_OPEN,
+ ALREADY_OPEN,
+ INVALID_FILE,
+ INVALID_DATA,
+ REQUIRES_PARENT,
+ FILE_NOT_WRITEABLE,
+ CODEC_ERROR,
+ INVALID_PARENT,
+ HUNK_OUT_OF_RANGE,
+ DECOMPRESSION_ERROR,
+ COMPRESSION_ERROR,
+ CANT_VERIFY,
+ METADATA_NOT_FOUND,
+ INVALID_METADATA_SIZE,
+ UNSUPPORTED_VERSION,
+ VERIFY_INCOMPLETE,
+ INVALID_METADATA,
+ INVALID_STATE,
+ OPERATION_PENDING,
+ UNSUPPORTED_FORMAT,
+ UNKNOWN_COMPRESSION,
+ WALKING_PARENT,
+ COMPRESSING
+ };
+
// construction/destruction
chd_file();
virtual ~chd_file();
- // operators
- operator util::core_file &() { return *m_file; }
-
// getters
- bool opened() const { return (m_file != nullptr); }
+ util::random_read &file();
+ bool opened() const { return bool(m_file); }
uint32_t version() const { return m_version; }
uint64_t logical_bytes() const { return m_logicalbytes; }
uint32_t hunk_bytes() const { return m_hunkbytes; }
@@ -317,52 +308,49 @@ public:
util::sha1_t sha1();
util::sha1_t raw_sha1();
util::sha1_t parent_sha1();
- chd_error hunk_info(uint32_t hunknum, chd_codec_type &compressor, uint32_t &compbytes);
+ std::error_condition hunk_info(uint32_t hunknum, chd_codec_type &compressor, uint32_t &compbytes);
// setters
void set_raw_sha1(util::sha1_t rawdata);
void set_parent_sha1(util::sha1_t parent);
// file create
- chd_error create(const char *filename, uint64_t logicalbytes, uint32_t hunkbytes, uint32_t unitbytes, chd_codec_type compression[4]);
- chd_error create(util::core_file &file, uint64_t logicalbytes, uint32_t hunkbytes, uint32_t unitbytes, chd_codec_type compression[4]);
- chd_error create(const char *filename, uint64_t logicalbytes, uint32_t hunkbytes, chd_codec_type compression[4], chd_file &parent);
- chd_error create(util::core_file &file, uint64_t logicalbytes, uint32_t hunkbytes, chd_codec_type compression[4], chd_file &parent);
+ std::error_condition create(std::string_view filename, uint64_t logicalbytes, uint32_t hunkbytes, uint32_t unitbytes, chd_codec_type compression[4]);
+ std::error_condition create(util::random_read_write::ptr &&file, uint64_t logicalbytes, uint32_t hunkbytes, uint32_t unitbytes, chd_codec_type compression[4]);
+ std::error_condition create(std::string_view filename, uint64_t logicalbytes, uint32_t hunkbytes, chd_codec_type compression[4], chd_file &parent);
+ std::error_condition create(util::random_read_write::ptr &&file, uint64_t logicalbytes, uint32_t hunkbytes, chd_codec_type compression[4], chd_file &parent);
// file open
- chd_error open(const char *filename, bool writeable = false, chd_file *parent = nullptr);
- chd_error open(util::core_file &file, bool writeable = false, chd_file *parent = nullptr);
+ std::error_condition open(std::string_view filename, bool writeable = false, chd_file *parent = nullptr);
+ std::error_condition open(util::random_read_write::ptr &&file, bool writeable = false, chd_file *parent = nullptr);
// file close
void close();
// read/write
- chd_error read_hunk(uint32_t hunknum, void *buffer);
- chd_error write_hunk(uint32_t hunknum, const void *buffer);
- chd_error read_units(uint64_t unitnum, void *buffer, uint32_t count = 1);
- chd_error write_units(uint64_t unitnum, const void *buffer, uint32_t count = 1);
- chd_error read_bytes(uint64_t offset, void *buffer, uint32_t bytes);
- chd_error write_bytes(uint64_t offset, const void *buffer, uint32_t bytes);
+ std::error_condition read_hunk(uint32_t hunknum, void *buffer);
+ std::error_condition write_hunk(uint32_t hunknum, const void *buffer);
+ std::error_condition read_units(uint64_t unitnum, void *buffer, uint32_t count = 1);
+ std::error_condition write_units(uint64_t unitnum, const void *buffer, uint32_t count = 1);
+ std::error_condition read_bytes(uint64_t offset, void *buffer, uint32_t bytes);
+ std::error_condition write_bytes(uint64_t offset, const void *buffer, uint32_t bytes);
// metadata management
- chd_error read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::string &output);
- chd_error read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::vector<uint8_t> &output);
- chd_error read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, void *output, uint32_t outputlen, uint32_t &resultlen);
- chd_error read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::vector<uint8_t> &output, chd_metadata_tag &resulttag, uint8_t &resultflags);
- chd_error write_metadata(chd_metadata_tag metatag, uint32_t metaindex, const void *inputbuf, uint32_t inputlen, uint8_t flags = CHD_MDFLAGS_CHECKSUM);
- chd_error write_metadata(chd_metadata_tag metatag, uint32_t metaindex, const std::string &input, uint8_t flags = CHD_MDFLAGS_CHECKSUM) { return write_metadata(metatag, metaindex, input.c_str(), input.length() + 1, flags); }
- chd_error write_metadata(chd_metadata_tag metatag, uint32_t metaindex, const std::vector<uint8_t> &input, uint8_t flags = CHD_MDFLAGS_CHECKSUM) { return write_metadata(metatag, metaindex, &input[0], input.size(), flags); }
- chd_error delete_metadata(chd_metadata_tag metatag, uint32_t metaindex);
- chd_error clone_all_metadata(chd_file &source);
+ std::error_condition read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::string &output);
+ std::error_condition read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::vector<uint8_t> &output);
+ std::error_condition read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, void *output, uint32_t outputlen, uint32_t &resultlen);
+ std::error_condition read_metadata(chd_metadata_tag searchtag, uint32_t searchindex, std::vector<uint8_t> &output, chd_metadata_tag &resulttag, uint8_t &resultflags);
+ std::error_condition write_metadata(chd_metadata_tag metatag, uint32_t metaindex, const void *inputbuf, uint32_t inputlen, uint8_t flags = CHD_MDFLAGS_CHECKSUM);
+ std::error_condition write_metadata(chd_metadata_tag metatag, uint32_t metaindex, const std::string &input, uint8_t flags = CHD_MDFLAGS_CHECKSUM) { return write_metadata(metatag, metaindex, input.c_str(), input.length() + 1, flags); }
+ std::error_condition write_metadata(chd_metadata_tag metatag, uint32_t metaindex, const std::vector<uint8_t> &input, uint8_t flags = CHD_MDFLAGS_CHECKSUM) { return write_metadata(metatag, metaindex, &input[0], input.size(), flags); }
+ std::error_condition delete_metadata(chd_metadata_tag metatag, uint32_t metaindex);
+ std::error_condition clone_all_metadata(chd_file &source);
// hashing helper
util::sha1_t compute_overall_sha1(util::sha1_t rawsha1);
// codec interfaces
- chd_error codec_configure(chd_codec_type codec, int param, void *config);
-
- // static helpers
- static const char *error_string(chd_error err);
+ std::error_condition codec_configure(chd_codec_type codec, int param, void *config);
private:
struct metadata_entry;
@@ -383,10 +371,10 @@ private:
void parse_v3_header(uint8_t *rawheader, util::sha1_t &parentsha1);
void parse_v4_header(uint8_t *rawheader, util::sha1_t &parentsha1);
void parse_v5_header(uint8_t *rawheader, util::sha1_t &parentsha1);
- chd_error compress_v5_map();
+ std::error_condition compress_v5_map();
void decompress_v5_map();
- chd_error create_common();
- chd_error open_common(bool writeable);
+ std::error_condition create_common();
+ std::error_condition open_common(bool writeable);
void create_open_common();
void verify_proper_compression_append(uint32_t hunknum);
void hunk_write_compressed(uint32_t hunknum, int8_t compression, const uint8_t *compressed, uint32_t complength, util::crc16_t crc16);
@@ -398,42 +386,41 @@ private:
static int CLIB_DECL metadata_hash_compare(const void *elem1, const void *elem2);
// file characteristics
- util::core_file * m_file; // handle to the open core file
- bool m_owns_file; // flag indicating if this file should be closed on chd_close()
+ util::random_read_write::ptr m_file; // handle to the open core file
bool m_allow_reads; // permit reads from this CHD?
bool m_allow_writes; // permit writes to this CHD?
// core parameters from the header
- uint32_t m_version; // version of the header
- uint64_t m_logicalbytes; // logical size of the raw CHD data in bytes
- uint64_t m_mapoffset; // offset of map
- uint64_t m_metaoffset; // offset to first metadata bit
- uint32_t m_hunkbytes; // size of each raw hunk in bytes
- uint32_t m_hunkcount; // number of hunks represented
- uint32_t m_unitbytes; // size of each unit in bytes
- uint64_t m_unitcount; // number of units represented
+ uint32_t m_version; // version of the header
+ uint64_t m_logicalbytes; // logical size of the raw CHD data in bytes
+ uint64_t m_mapoffset; // offset of map
+ uint64_t m_metaoffset; // offset to first metadata bit
+ uint32_t m_hunkbytes; // size of each raw hunk in bytes
+ uint32_t m_hunkcount; // number of hunks represented
+ uint32_t m_unitbytes; // size of each unit in bytes
+ uint64_t m_unitcount; // number of units represented
chd_codec_type m_compression[4]; // array of compression types used
chd_file * m_parent; // pointer to parent file, or nullptr if none
bool m_parent_missing; // are we missing our parent?
// key offsets within the header
- uint64_t m_mapoffset_offset; // offset of map offset field
- uint64_t m_metaoffset_offset;// offset of metaoffset field
- uint64_t m_sha1_offset; // offset of SHA1 field
- uint64_t m_rawsha1_offset; // offset of raw SHA1 field
- uint64_t m_parentsha1_offset;// offset of paren SHA1 field
+ uint64_t m_mapoffset_offset; // offset of map offset field
+ uint64_t m_metaoffset_offset;// offset of metaoffset field
+ uint64_t m_sha1_offset; // offset of SHA1 field
+ uint64_t m_rawsha1_offset; // offset of raw SHA1 field
+ uint64_t m_parentsha1_offset;// offset of paren SHA1 field
// map information
- uint32_t m_mapentrybytes; // length of each entry in a map
- std::vector<uint8_t> m_rawmap; // raw map data
+ uint32_t m_mapentrybytes; // length of each entry in a map
+ std::vector<uint8_t> m_rawmap; // raw map data
// compression management
- chd_decompressor * m_decompressor[4]; // array of decompression codecs
- std::vector<uint8_t> m_compressed; // temporary buffer for compressed data
+ chd_decompressor::ptr m_decompressor[4]; // array of decompression codecs
+ std::vector<uint8_t> m_compressed; // temporary buffer for compressed data
// caching
- std::vector<uint8_t> m_cache; // single-hunk cache for partial reads/writes
- uint32_t m_cachehunk; // which hunk is in the cache?
+ std::vector<uint8_t> m_cache; // single-hunk cache for partial reads/writes
+ uint32_t m_cachehunk; // which hunk is in the cache?
};
@@ -449,7 +436,7 @@ public:
// compression management
void compress_begin();
- chd_error compress_continue(double &progress, double &ratio);
+ std::error_condition compress_continue(double &progress, double &ratio);
protected:
// required override: read more data
@@ -470,24 +457,24 @@ private:
void add(uint64_t itemnum, util::crc16_t crc16, util::sha1_t sha1);
// constants
- static const uint64_t NOT_FOUND = ~uint64_t(0);
+ static constexpr uint64_t NOT_FOUND = ~uint64_t(0);
+
private:
// internal entry
struct entry_t
{
entry_t * m_next; // next entry in list
- uint64_t m_itemnum; // item number
+ uint64_t m_itemnum; // item number
util::sha1_t m_sha1; // SHA-1 of the block
};
// block of entries
struct entry_block
{
- entry_block(entry_block *prev)
- : m_next(prev), m_nextalloc(0) { }
+ entry_block(entry_block *prev) : m_next(prev), m_nextalloc(0) { }
entry_block * m_next; // next block in list
- uint32_t m_nextalloc; // next to be allocated
+ uint32_t m_nextalloc; // next to be allocated
entry_t m_array[16384]; // array of entries
};
@@ -551,8 +538,8 @@ private:
// current compression status
bool m_walking_parent; // are we building the parent map?
- uint64_t m_total_in; // total bytes in
- uint64_t m_total_out; // total bytes out
+ uint64_t m_total_in; // total bytes in
+ uint64_t m_total_out; // total bytes out
util::sha1_creator m_compsha1; // running SHA-1 on raw data
// hash lookup maps
@@ -561,20 +548,31 @@ private:
// read I/O thread
osd_work_queue * m_read_queue; // work queue for reading
- uint64_t m_read_queue_offset;// next offset to enqueue
- uint64_t m_read_done_offset; // next offset that will complete
+ uint64_t m_read_queue_offset;// next offset to enqueue
+ uint64_t m_read_done_offset; // next offset that will complete
bool m_read_error; // error during reading?
// work item thread
- static const int WORK_BUFFER_HUNKS = 256;
+ static constexpr int WORK_BUFFER_HUNKS = 256;
osd_work_queue * m_work_queue; // queue for doing work on other threads
- std::vector<uint8_t> m_work_buffer; // buffer containing hunk data to work on
- std::vector<uint8_t> m_compressed_buffer;// buffer containing compressed data
+ std::vector<uint8_t> m_work_buffer; // buffer containing hunk data to work on
+ std::vector<uint8_t> m_compressed_buffer;// buffer containing compressed data
work_item m_work_item[WORK_BUFFER_HUNKS]; // status of each hunk
chd_compressor_group * m_codecs[WORK_MAX_THREADS]; // codecs to use
// output state
- uint32_t m_write_hunk; // next hunk to write
+ uint32_t m_write_hunk; // next hunk to write
};
-#endif // MAME_UTIL_CHD_H
+
+// error category for CHD errors
+std::error_category const &chd_category() noexcept;
+inline std::error_condition make_error_condition(chd_file::error err) noexcept { return std::error_condition(int(err), chd_category()); }
+
+namespace std {
+
+template <> struct is_error_condition_enum<chd_file::error> : public std::true_type { };
+
+} // namespace std
+
+#endif // MAME_LIB_UTIL_CHD_H
diff --git a/src/lib/util/chdcd.cpp b/src/lib/util/chdcd.cpp
index ef013b41f48..63b633536bf 100644
--- a/src/lib/util/chdcd.cpp
+++ b/src/lib/util/chdcd.cpp
@@ -7,15 +7,19 @@
***************************************************************************/
-#include <cctype>
-#include <cstdlib>
-#include <cassert>
-#include "osdcore.h"
-#include "chd.h"
#include "chdcd.h"
+
+#include "chd.h"
#include "corefile.h"
#include "corestr.h"
+#include "osdcore.h"
+
+#include <cassert>
+#include <cctype>
+#include <cerrno>
+#include <cstdlib>
+
/***************************************************************************
@@ -230,8 +234,8 @@ static uint32_t parse_wav_sample(const char *filename, uint32_t *dataoffs)
uint64_t fsize = 0;
std::uint32_t actual;
- osd_file::error filerr = osd_file::open(filename, OPEN_FLAG_READ, file, fsize);
- if (filerr != osd_file::error::NONE)
+ std::error_condition const filerr = osd_file::open(filename, OPEN_FLAG_READ, file, fsize);
+ if (filerr)
{
printf("ERROR: could not open (%s)\n", filename);
return 0;
@@ -449,7 +453,7 @@ uint64_t read_uint64(FILE *infile)
-------------------------------------------------*/
/**
- * @fn chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
+ * @fn std::error_condition chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
*
* @brief Chdcd parse nero.
*
@@ -457,26 +461,25 @@ uint64_t read_uint64(FILE *infile)
* @param [in,out] outtoc The outtoc.
* @param [in,out] outinfo The outinfo.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
+std::error_condition chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
{
- FILE *infile;
unsigned char buffer[12];
uint32_t chain_offs, chunk_size;
int done = 0;
std::string path = std::string(tocfname);
- infile = fopen(tocfname, "rb");
- path = get_file_path(path);
-
- if (infile == (FILE *)nullptr)
+ FILE *infile = fopen(tocfname, "rb");
+ if (!infile)
{
- return CHDERR_FILE_NOT_FOUND;
+ return std::error_condition(errno, std::generic_category());
}
+ path = get_file_path(path);
+
/* clear structures */
memset(&outtoc, 0, sizeof(outtoc));
outinfo.reset();
@@ -489,7 +492,7 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_
{
printf("ERROR: Not a Nero 5.5 or later image!\n");
fclose(infile);
- return CHDERR_UNSUPPORTED_VERSION;
+ return chd_file::error::UNSUPPORTED_FORMAT;
}
chain_offs = buffer[11] | (buffer[10]<<8) | (buffer[9]<<16) | (buffer[8]<<24);
@@ -498,7 +501,7 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_
{
printf("ERROR: File size is > 4GB, this version of CHDMAN cannot handle it.");
fclose(infile);
- return CHDERR_UNSUPPORTED_FORMAT;
+ return chd_file::error::UNSUPPORTED_FORMAT;
}
// printf("NER5 detected, chain offset: %x\n", chain_offs);
@@ -559,12 +562,12 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_
case 0x0300: // Mode 2 Form 1
printf("ERROR: Mode 2 Form 1 tracks not supported\n");
fclose(infile);
- return CHDERR_UNSUPPORTED_FORMAT;
+ return chd_file::error::UNSUPPORTED_FORMAT;
case 0x0500: // raw data
printf("ERROR: Raw data tracks not supported\n");
fclose(infile);
- return CHDERR_UNSUPPORTED_FORMAT;
+ return chd_file::error::UNSUPPORTED_FORMAT;
case 0x0600: // 2352 byte mode 2 raw
outtoc.tracks[track-1].trktype = CD_TRACK_MODE2_RAW;
@@ -579,22 +582,22 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_
case 0x0f00: // raw data with sub-channel
printf("ERROR: Raw data tracks with sub-channel not supported\n");
fclose(infile);
- return CHDERR_UNSUPPORTED_FORMAT;
+ return chd_file::error::UNSUPPORTED_FORMAT;
case 0x1000: // audio with sub-channel
printf("ERROR: Audio tracks with sub-channel not supported\n");
fclose(infile);
- return CHDERR_UNSUPPORTED_FORMAT;
+ return chd_file::error::UNSUPPORTED_FORMAT;
case 0x1100: // raw Mode 2 Form 1 with sub-channel
printf("ERROR: Raw Mode 2 Form 1 tracks with sub-channel not supported\n");
fclose(infile);
- return CHDERR_UNSUPPORTED_FORMAT;
+ return chd_file::error::UNSUPPORTED_FORMAT;
default:
printf("ERROR: Unknown track type %x, contact MAMEDEV!\n", mode);
fclose(infile);
- return CHDERR_UNSUPPORTED_FORMAT;
+ return chd_file::error::UNSUPPORTED_FORMAT;
}
outtoc.tracks[track-1].datasize = size;
@@ -627,7 +630,7 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_
fclose(infile);
- return CHDERR_NONE;
+ return std::error_condition();
}
/*-------------------------------------------------
@@ -635,7 +638,7 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_
-------------------------------------------------*/
/**
- * @fn chd_error chdcd_parse_iso(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
+ * @fn std::error_condition chdcd_parse_iso(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
*
* @brief Chdcd parse ISO.
*
@@ -643,22 +646,21 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_
* @param [in,out] outtoc The outtoc.
* @param [in,out] outinfo The outinfo.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chdcd_parse_iso(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
+std::error_condition chdcd_parse_iso(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
{
- FILE *infile;
std::string path = std::string(tocfname);
- infile = fopen(tocfname, "rb");
- path = get_file_path(path);
-
- if (infile == (FILE *)nullptr)
+ FILE *infile = fopen(tocfname, "rb");
+ if (!infile)
{
- return CHDERR_FILE_NOT_FOUND;
+ return std::error_condition(errno, std::generic_category());
}
+ path = get_file_path(path);
+
/* clear structures */
memset(&outtoc, 0, sizeof(outtoc));
outinfo.reset();
@@ -693,7 +695,7 @@ chd_error chdcd_parse_iso(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
outinfo.track[0].swap = false;
} else {
printf("ERROR: Unrecognized track type\n");
- return CHDERR_UNSUPPORTED_FORMAT;
+ return chd_file::error::UNSUPPORTED_FORMAT;
}
outtoc.tracks[0].subtype = CD_SUB_NONE;
@@ -709,7 +711,7 @@ chd_error chdcd_parse_iso(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
outtoc.tracks[0].padframes = 0;
- return CHDERR_NONE;
+ return std::error_condition();
}
/*-------------------------------------------------
@@ -717,7 +719,7 @@ chd_error chdcd_parse_iso(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
-------------------------------------------------*/
/**
- * @fn static chd_error chdcd_parse_gdi(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
+ * @fn static std::error_condition chdcd_parse_gdi(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
*
* @brief Chdcd parse GDI.
*
@@ -725,24 +727,23 @@ chd_error chdcd_parse_iso(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
* @param [in,out] outtoc The outtoc.
* @param [in,out] outinfo The outinfo.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-static chd_error chdcd_parse_gdi(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
+static std::error_condition chdcd_parse_gdi(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
{
- FILE *infile;
int i, numtracks;
std::string path = std::string(tocfname);
- infile = fopen(tocfname, "rt");
- path = get_file_path(path);
-
- if (infile == (FILE *)nullptr)
+ FILE *infile = fopen(tocfname, "rt");
+ if (!infile)
{
- return CHDERR_FILE_NOT_FOUND;
+ return std::error_condition(errno, std::generic_category());
}
+ path = get_file_path(path);
+
/* clear structures */
memset(&outtoc, 0, sizeof(outtoc));
outinfo.reset();
@@ -841,7 +842,7 @@ static chd_error chdcd_parse_gdi(const char *tocfname, cdrom_toc &outtoc, chdcd_
/* store the number of tracks found */
outtoc.numtrks = numtracks;
- return CHDERR_NONE;
+ return std::error_condition();
}
/*-------------------------------------------------
@@ -849,7 +850,7 @@ static chd_error chdcd_parse_gdi(const char *tocfname, cdrom_toc &outtoc, chdcd_
-------------------------------------------------*/
/**
- * @fn chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
+ * @fn std::error_condition chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
*
* @brief Chdcd parse cue.
*
@@ -857,25 +858,25 @@ static chd_error chdcd_parse_gdi(const char *tocfname, cdrom_toc &outtoc, chdcd_
* @param [in,out] outtoc The outtoc.
* @param [in,out] outinfo The outinfo.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
+std::error_condition chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
{
- FILE *infile;
int i, trknum;
static char token[512];
std::string lastfname;
uint32_t wavlen, wavoffs;
std::string path = std::string(tocfname);
- infile = fopen(tocfname, "rt");
- path = get_file_path(path);
- if (infile == (FILE *)nullptr)
+ FILE *infile = fopen(tocfname, "rt");
+ if (!infile)
{
- return CHDERR_FILE_NOT_FOUND;
+ return std::error_condition(errno, std::generic_category());
}
+ path = get_file_path(path);
+
/* clear structures */
memset(&outtoc, 0, sizeof(outtoc));
outinfo.reset();
@@ -921,14 +922,14 @@ chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
{
fclose(infile);
printf("ERROR: couldn't read [%s] or not a valid .WAV\n", lastfname.c_str());
- return CHDERR_INVALID_DATA;
+ return chd_file::error::INVALID_DATA;
}
}
else
{
fclose(infile);
printf("ERROR: Unhandled track type %s\n", token);
- return CHDERR_UNSUPPORTED_FORMAT;
+ return chd_file::error::UNSUPPORTED_FORMAT;
}
}
else if (!strcmp(token, "TRACK"))
@@ -970,7 +971,7 @@ chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
{
fclose(infile);
printf("ERROR: Unknown track type [%s]. Contact MAMEDEV.\n", token);
- return CHDERR_UNSUPPORTED_FORMAT;
+ return chd_file::error::UNSUPPORTED_FORMAT;
}
/* next (optional) token on the line is the subcode type */
@@ -1083,7 +1084,7 @@ chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
if (tlen == 0)
{
printf("ERROR: couldn't find bin file [%s]\n", outinfo.track[trknum-1].fname.c_str());
- return CHDERR_FILE_NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
}
outinfo.track[trknum].offset = outinfo.track[trknum-1].offset + outtoc.tracks[trknum-1].frames * (outtoc.tracks[trknum-1].datasize + outtoc.tracks[trknum-1].subsize);
outtoc.tracks[trknum].frames = (tlen - outinfo.track[trknum].offset) / (outtoc.tracks[trknum].datasize + outtoc.tracks[trknum].subsize);
@@ -1094,7 +1095,7 @@ chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
if (tlen == 0)
{
printf("ERROR: couldn't find bin file [%s]\n", outinfo.track[trknum-1].fname.c_str());
- return CHDERR_FILE_NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
}
tlen /= (outtoc.tracks[trknum].datasize + outtoc.tracks[trknum].subsize);
outtoc.tracks[trknum].frames = tlen;
@@ -1120,7 +1121,7 @@ chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
if (!outtoc.tracks[trknum].frames)
{
printf("ERROR: unable to determine size of track %d, missing INDEX 01 markers?\n", trknum+1);
- return CHDERR_INVALID_DATA;
+ return chd_file::error::INVALID_DATA;
}
}
else /* data files are different */
@@ -1129,7 +1130,7 @@ chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
if (tlen == 0)
{
printf("ERROR: couldn't find bin file [%s]\n", outinfo.track[trknum].fname.c_str());
- return CHDERR_FILE_NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
}
tlen /= (outtoc.tracks[trknum].datasize + outtoc.tracks[trknum].subsize);
outtoc.tracks[trknum].frames = tlen;
@@ -1140,7 +1141,7 @@ chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
//printf("trk %d: %d frames @ offset %d\n", trknum+1, outtoc.tracks[trknum].frames, outinfo.track[trknum].offset);
}
- return CHDERR_NONE;
+ return std::error_condition();
}
/*---------------------------------------------------------------------------------------
@@ -1161,18 +1162,18 @@ chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
bool chdcd_is_gdicue(const char *tocfname)
{
- FILE *infile;
bool has_rem_singledensity = false;
bool has_rem_highdensity = false;
std::string path = std::string(tocfname);
- infile = fopen(tocfname, "rt");
- path = get_file_path(path);
- if (infile == (FILE *)nullptr)
+ FILE *infile = fopen(tocfname, "rt");
+ if (!infile)
{
return false;
}
+ path = get_file_path(path);
+
while (!feof(infile))
{
fgets(linebuffer, 511, infile);
@@ -1195,7 +1196,7 @@ bool chdcd_is_gdicue(const char *tocfname)
------------------------------------------------------------------*/
/**
- * @fn chd_error chdcd_parse_gdicue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
+ * @fn std::error_condition chdcd_parse_gdicue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
*
* @brief Chdcd parse cue.
*
@@ -1203,7 +1204,7 @@ bool chdcd_is_gdicue(const char *tocfname)
* @param [in,out] outtoc The outtoc.
* @param [in,out] outinfo The outinfo.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*
* Dreamcast discs have two images on a single disc. The first image is SINGLE-DENSITY and the second image
* is HIGH-DENSITY. The SINGLE-DENSITY area starts 0 LBA and HIGH-DENSITY area starts 45000 LBA.
@@ -1218,9 +1219,8 @@ bool chdcd_is_gdicue(const char *tocfname)
* layout from a TOSEC .gdi.
*/
-chd_error chdcd_parse_gdicue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
+std::error_condition chdcd_parse_gdicue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
{
- FILE *infile;
int i, trknum;
static char token[512];
std::string lastfname;
@@ -1229,13 +1229,14 @@ chd_error chdcd_parse_gdicue(const char *tocfname, cdrom_toc &outtoc, chdcd_trac
enum gdi_area current_area = SINGLE_DENSITY;
enum gdi_pattern disc_pattern = TYPE_UNKNOWN;
- infile = fopen(tocfname, "rt");
- path = get_file_path(path);
- if (infile == (FILE *)nullptr)
+ FILE *infile = fopen(tocfname, "rt");
+ if (!infile)
{
- return CHDERR_FILE_NOT_FOUND;
+ return std::error_condition(errno, std::generic_category());
}
+ path = get_file_path(path);
+
/* clear structures */
memset(&outtoc, 0, sizeof(outtoc));
outinfo.reset();
@@ -1297,14 +1298,14 @@ chd_error chdcd_parse_gdicue(const char *tocfname, cdrom_toc &outtoc, chdcd_trac
{
fclose(infile);
printf("ERROR: couldn't read [%s] or not a valid .WAV\n", lastfname.c_str());
- return CHDERR_INVALID_DATA;
+ return chd_file::error::INVALID_DATA;
}
}
else
{
fclose(infile);
printf("ERROR: Unhandled track type %s\n", token);
- return CHDERR_UNSUPPORTED_FORMAT;
+ return chd_file::error::UNSUPPORTED_FORMAT;
}
}
else if (!strcmp(token, "TRACK"))
@@ -1349,7 +1350,7 @@ chd_error chdcd_parse_gdicue(const char *tocfname, cdrom_toc &outtoc, chdcd_trac
{
fclose(infile);
printf("ERROR: Unknown track type [%s]. Contact MAMEDEV.\n", token);
- return CHDERR_UNSUPPORTED_FORMAT;
+ return chd_file::error::UNSUPPORTED_FORMAT;
}
/* next (optional) token on the line is the subcode type */
@@ -1462,7 +1463,7 @@ chd_error chdcd_parse_gdicue(const char *tocfname, cdrom_toc &outtoc, chdcd_trac
if (tlen == 0)
{
printf("ERROR: couldn't find bin file [%s]\n", outinfo.track[trknum-1].fname.c_str());
- return CHDERR_FILE_NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
}
outinfo.track[trknum].offset = outinfo.track[trknum-1].offset + outtoc.tracks[trknum-1].frames * (outtoc.tracks[trknum-1].datasize + outtoc.tracks[trknum-1].subsize);
outtoc.tracks[trknum].frames = (tlen - outinfo.track[trknum].offset) / (outtoc.tracks[trknum].datasize + outtoc.tracks[trknum].subsize);
@@ -1473,7 +1474,7 @@ chd_error chdcd_parse_gdicue(const char *tocfname, cdrom_toc &outtoc, chdcd_trac
if (tlen == 0)
{
printf("ERROR: couldn't find bin file [%s]\n", outinfo.track[trknum-1].fname.c_str());
- return CHDERR_FILE_NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
}
tlen /= (outtoc.tracks[trknum].datasize + outtoc.tracks[trknum].subsize);
outtoc.tracks[trknum].frames = tlen;
@@ -1499,7 +1500,7 @@ chd_error chdcd_parse_gdicue(const char *tocfname, cdrom_toc &outtoc, chdcd_trac
if (!outtoc.tracks[trknum].frames)
{
printf("ERROR: unable to determine size of track %d, missing INDEX 01 markers?\n", trknum+1);
- return CHDERR_INVALID_DATA;
+ return chd_file::error::INVALID_DATA;
}
}
else /* data files are different */
@@ -1508,7 +1509,7 @@ chd_error chdcd_parse_gdicue(const char *tocfname, cdrom_toc &outtoc, chdcd_trac
if (tlen == 0)
{
printf("ERROR: couldn't find bin file [%s]\n", outinfo.track[trknum].fname.c_str());
- return CHDERR_FILE_NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
}
tlen /= (outtoc.tracks[trknum].datasize + outtoc.tracks[trknum].subsize);
outtoc.tracks[trknum].frames = tlen;
@@ -1638,7 +1639,7 @@ chd_error chdcd_parse_gdicue(const char *tocfname, cdrom_toc &outtoc, chdcd_trac
}
#endif
- return CHDERR_NONE;
+ return std::error_condition();
}
/*-------------------------------------------------
@@ -1646,7 +1647,7 @@ chd_error chdcd_parse_gdicue(const char *tocfname, cdrom_toc &outtoc, chdcd_trac
-------------------------------------------------*/
/**
- * @fn chd_error chdcd_parse_toc(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
+ * @fn std::error_condition chdcd_parse_toc(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
*
* @brief Chdcd parse TOC.
*
@@ -1654,12 +1655,11 @@ chd_error chdcd_parse_gdicue(const char *tocfname, cdrom_toc &outtoc, chdcd_trac
* @param [in,out] outtoc The outtoc.
* @param [in,out] outinfo The outinfo.
*
- * @return A chd_error.
+ * @return A std::error_condition.
*/
-chd_error chdcd_parse_toc(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
+std::error_condition chdcd_parse_toc(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
{
- FILE *infile;
int i, trknum;
static char token[512];
char tocftemp[512];
@@ -1695,14 +1695,14 @@ chd_error chdcd_parse_toc(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
std::string path = std::string(tocfname);
- infile = fopen(tocfname, "rt");
- path = get_file_path(path);
-
- if (infile == (FILE *)nullptr)
+ FILE *infile = fopen(tocfname, "rt");
+ if (!infile)
{
- return CHDERR_FILE_NOT_FOUND;
+ return std::error_condition(errno, std::generic_category());
}
+ path = get_file_path(path);
+
/* clear structures */
memset(&outtoc, 0, sizeof(outtoc));
outinfo.reset();
@@ -1817,7 +1817,7 @@ chd_error chdcd_parse_toc(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
{
fclose(infile);
printf("ERROR: Unknown track type [%s]. Contact MAMEDEV.\n", token);
- return CHDERR_UNSUPPORTED_FORMAT;
+ return chd_file::error::UNSUPPORTED_FORMAT;
}
/* next (optional) token on the line is the subcode type */
@@ -1844,5 +1844,5 @@ chd_error chdcd_parse_toc(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
/* store the number of tracks found */
outtoc.numtrks = trknum + 1;
- return CHDERR_NONE;
+ return std::error_condition();
}
diff --git a/src/lib/util/chdcd.h b/src/lib/util/chdcd.h
index 65e4b943964..95f214e5831 100644
--- a/src/lib/util/chdcd.h
+++ b/src/lib/util/chdcd.h
@@ -5,14 +5,16 @@
CDRDAO TOC parser for CHD compression frontend
***************************************************************************/
-
-#ifndef MAME_UTIL_CHDCD_H
-#define MAME_UTIL_CHDCD_H
+#ifndef MAME_LIB_UTIL_CHDCD_H
+#define MAME_LIB_UTIL_CHDCD_H
#pragma once
#include "cdrom.h"
+#include <system_error>
+
+
struct chdcd_track_input_entry
{
chdcd_track_input_entry() { reset(); }
@@ -33,6 +35,6 @@ struct chdcd_track_input_info
};
-chd_error chdcd_parse_toc(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo);
+std::error_condition chdcd_parse_toc(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo);
-#endif // MAME_UTIL_CHDCD_H
+#endif // MAME_LIB_UTIL_CHDCD_H
diff --git a/src/lib/util/chdcodec.cpp b/src/lib/util/chdcodec.cpp
index 4f5c23b3104..cd708d0f507 100644
--- a/src/lib/util/chdcodec.cpp
+++ b/src/lib/util/chdcodec.cpp
@@ -8,24 +8,29 @@
***************************************************************************/
-#include <cassert>
+#include "chdcodec.h"
-#include "chd.h"
-#include "hashing.h"
#include "avhuff.h"
-#include "flac.h"
#include "cdrom.h"
-#include <zlib.h>
-#include "lzma/C/LzmaEnc.h"
+#include "chd.h"
+#include "flac.h"
+#include "hashing.h"
+
#include "lzma/C/LzmaDec.h"
+#include "lzma/C/LzmaEnc.h"
+
+#include <zlib.h>
+
#include <new>
+namespace {
+
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
-static const uint8_t s_cd_sync_header[12] = { 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00 };
+constexpr uint8_t f_cd_sync_header[12] = { 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00 };
@@ -35,7 +40,7 @@ static const uint8_t s_cd_sync_header[12] = { 0x00,0xff,0xff,0xff,0xff,0xff,0xff
// ======================> chd_zlib_allocator
-// allocation helper clas for zlib
+// allocation helper class for zlib
class chd_zlib_allocator
{
public:
@@ -51,7 +56,8 @@ private:
static voidpf fast_alloc(voidpf opaque, uInt items, uInt size);
static void fast_free(voidpf opaque, voidpf address);
- static const int MAX_ZLIB_ALLOCS = 64;
+ static constexpr int MAX_ZLIB_ALLOCS = 64;
+
uint32_t * m_allocptr[MAX_ZLIB_ALLOCS];
};
@@ -111,7 +117,7 @@ private:
static void *fast_alloc(void *p, size_t size);
static void fast_free(void *p, void *address);
- static const int MAX_LZMA_ALLOCS = 64;
+ static constexpr int MAX_LZMA_ALLOCS = 64;
uint32_t * m_allocptr[MAX_LZMA_ALLOCS];
};
@@ -287,7 +293,7 @@ private:
// ======================> chd_cd_compressor
-template<class _BaseCompressor, class _SubcodeCompressor>
+template<class BaseCompressor, class SubcodeCompressor>
class chd_cd_compressor : public chd_compressor
{
public:
@@ -300,7 +306,7 @@ public:
{
// make sure the CHD's hunk size is an even multiple of the frame size
if (hunkbytes % CD_FRAME_SIZE != 0)
- throw CHDERR_CODEC_ERROR;
+ throw std::error_condition(chd_file::error::CODEC_ERROR);
}
// core functionality
@@ -323,10 +329,10 @@ public:
// clear out ECC data if we can
uint8_t *sector = &m_buffer[framenum * CD_MAX_SECTOR_DATA];
- if (memcmp(sector, s_cd_sync_header, sizeof(s_cd_sync_header)) == 0 && ecc_verify(sector))
+ if (memcmp(sector, f_cd_sync_header, sizeof(f_cd_sync_header)) == 0 && ecc_verify(sector))
{
dest[framenum / 8] |= 1 << (framenum % 8);
- memset(sector, 0, sizeof(s_cd_sync_header));
+ memset(sector, 0, sizeof(f_cd_sync_header));
ecc_clear(sector);
}
}
@@ -334,7 +340,7 @@ public:
// encode the base portion
uint32_t complen = m_base_compressor.compress(&m_buffer[0], frames * CD_MAX_SECTOR_DATA, &dest[header_bytes]);
if (complen >= srclen)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
// write compressed length
dest[ecc_bytes + 0] = complen >> ((complen_bytes - 1) * 8);
@@ -348,15 +354,15 @@ public:
private:
// internal state
- _BaseCompressor m_base_compressor;
- _SubcodeCompressor m_subcode_compressor;
+ BaseCompressor m_base_compressor;
+ SubcodeCompressor m_subcode_compressor;
std::vector<uint8_t> m_buffer;
};
// ======================> chd_cd_decompressor
-template<class _BaseDecompressor, class _SubcodeDecompressor>
+template<class BaseDecompressor, class SubcodeDecompressor>
class chd_cd_decompressor : public chd_decompressor
{
public:
@@ -369,7 +375,7 @@ public:
{
// make sure the CHD's hunk size is an even multiple of the frame size
if (hunkbytes % CD_FRAME_SIZE != 0)
- throw CHDERR_CODEC_ERROR;
+ throw std::error_condition(chd_file::error::CODEC_ERROR);
}
// core functionality
@@ -400,7 +406,7 @@ public:
uint8_t *sector = &dest[framenum * CD_FRAME_SIZE];
if ((src[framenum / 8] & (1 << (framenum % 8))) != 0)
{
- memcpy(sector, s_cd_sync_header, sizeof(s_cd_sync_header));
+ memcpy(sector, f_cd_sync_header, sizeof(f_cd_sync_header));
ecc_generate(sector);
}
}
@@ -408,8 +414,8 @@ public:
private:
// internal state
- _BaseDecompressor m_base_decompressor;
- _SubcodeDecompressor m_subcode_decompressor;
+ BaseDecompressor m_base_decompressor;
+ SubcodeDecompressor m_subcode_decompressor;
std::vector<uint8_t> m_buffer;
};
@@ -460,25 +466,65 @@ private:
// CODEC LIST
//**************************************************************************
+// an entry in the list
+struct codec_entry
+{
+ chd_codec_type m_type;
+ bool m_lossy;
+ const char * m_name;
+ chd_compressor::ptr (*m_construct_compressor)(chd_file &, uint32_t, bool);
+ chd_decompressor::ptr (*m_construct_decompressor)(chd_file &, uint32_t, bool);
+
+ template <class CompressorClass>
+ static chd_compressor::ptr construct_compressor(chd_file &chd, uint32_t hunkbytes, bool lossy)
+ {
+ return std::make_unique<CompressorClass>(chd, hunkbytes, lossy);
+ }
+
+ template <class DecompressorClass>
+ static chd_decompressor::ptr construct_decompressor(chd_file &chd, uint32_t hunkbytes, bool lossy)
+ {
+ return std::make_unique<DecompressorClass>(chd, hunkbytes, lossy);
+ }
+};
+
+
// static list of available known codecs
-const chd_codec_list::codec_entry chd_codec_list::s_codec_list[] =
+const codec_entry f_codec_list[] =
{
// general codecs
- { CHD_CODEC_ZLIB, false, "Deflate", &chd_codec_list::construct_compressor<chd_zlib_compressor>, &chd_codec_list::construct_decompressor<chd_zlib_decompressor> },
- { CHD_CODEC_LZMA, false, "LZMA", &chd_codec_list::construct_compressor<chd_lzma_compressor>, &chd_codec_list::construct_decompressor<chd_lzma_decompressor> },
- { CHD_CODEC_HUFFMAN, false, "Huffman", &chd_codec_list::construct_compressor<chd_huffman_compressor>, &chd_codec_list::construct_decompressor<chd_huffman_decompressor> },
- { CHD_CODEC_FLAC, false, "FLAC", &chd_codec_list::construct_compressor<chd_flac_compressor>, &chd_codec_list::construct_decompressor<chd_flac_decompressor> },
+ { CHD_CODEC_ZLIB, false, "Deflate", &codec_entry::construct_compressor<chd_zlib_compressor>, &codec_entry::construct_decompressor<chd_zlib_decompressor> },
+ { CHD_CODEC_LZMA, false, "LZMA", &codec_entry::construct_compressor<chd_lzma_compressor>, &codec_entry::construct_decompressor<chd_lzma_decompressor> },
+ { CHD_CODEC_HUFFMAN, false, "Huffman", &codec_entry::construct_compressor<chd_huffman_compressor>, &codec_entry::construct_decompressor<chd_huffman_decompressor> },
+ { CHD_CODEC_FLAC, false, "FLAC", &codec_entry::construct_compressor<chd_flac_compressor>, &codec_entry::construct_decompressor<chd_flac_decompressor> },
// general codecs with CD frontend
- { CHD_CODEC_CD_ZLIB, false, "CD Deflate", &chd_codec_list::construct_compressor<chd_cd_compressor<chd_zlib_compressor, chd_zlib_compressor> >, &chd_codec_list::construct_decompressor<chd_cd_decompressor<chd_zlib_decompressor, chd_zlib_decompressor> > },
- { CHD_CODEC_CD_LZMA, false, "CD LZMA", &chd_codec_list::construct_compressor<chd_cd_compressor<chd_lzma_compressor, chd_zlib_compressor> >, &chd_codec_list::construct_decompressor<chd_cd_decompressor<chd_lzma_decompressor, chd_zlib_decompressor> > },
- { CHD_CODEC_CD_FLAC, false, "CD FLAC", &chd_codec_list::construct_compressor<chd_cd_flac_compressor>, &chd_codec_list::construct_decompressor<chd_cd_flac_decompressor> },
+ { CHD_CODEC_CD_ZLIB, false, "CD Deflate", &codec_entry::construct_compressor<chd_cd_compressor<chd_zlib_compressor, chd_zlib_compressor> >, &codec_entry::construct_decompressor<chd_cd_decompressor<chd_zlib_decompressor, chd_zlib_decompressor> > },
+ { CHD_CODEC_CD_LZMA, false, "CD LZMA", &codec_entry::construct_compressor<chd_cd_compressor<chd_lzma_compressor, chd_zlib_compressor> >, &codec_entry::construct_decompressor<chd_cd_decompressor<chd_lzma_decompressor, chd_zlib_decompressor> > },
+ { CHD_CODEC_CD_FLAC, false, "CD FLAC", &codec_entry::construct_compressor<chd_cd_flac_compressor>, &codec_entry::construct_decompressor<chd_cd_flac_decompressor> },
// A/V codecs
- { CHD_CODEC_AVHUFF, false, "A/V Huffman", &chd_codec_list::construct_compressor<chd_avhuff_compressor>, &chd_codec_list::construct_decompressor<chd_avhuff_decompressor> },
+ { CHD_CODEC_AVHUFF, false, "A/V Huffman", &codec_entry::construct_compressor<chd_avhuff_compressor>, &codec_entry::construct_decompressor<chd_avhuff_decompressor> },
};
+//-------------------------------------------------
+// find_in_list - create a new compressor
+// instance of the given type
+//-------------------------------------------------
+
+const codec_entry *find_in_list(chd_codec_type type)
+{
+ // find in the list and construct the class
+ for (auto & elem : f_codec_list)
+ if (elem.m_type == type)
+ return &elem;
+ return nullptr;
+}
+
+} // anonymous namespace
+
+
//**************************************************************************
// CHD CODEC
@@ -512,7 +558,7 @@ chd_codec::~chd_codec()
void chd_codec::configure(int param, void *config)
{
// if not overridden, it is always a failure
- throw CHDERR_INVALID_PARAMETER;
+ throw std::error_condition(std::errc::invalid_argument);
}
@@ -556,11 +602,11 @@ chd_decompressor::chd_decompressor(chd_file &chd, uint32_t hunkbytes, bool lossy
// instance of the given type
//-------------------------------------------------
-chd_compressor *chd_codec_list::new_compressor(chd_codec_type type, chd_file &chd)
+chd_compressor::ptr chd_codec_list::new_compressor(chd_codec_type type, chd_file &chd)
{
// find in the list and construct the class
- const codec_entry *entry = find_in_list(type);
- return (entry == nullptr) ? nullptr : (*entry->m_construct_compressor)(chd, chd.hunk_bytes(), entry->m_lossy);
+ codec_entry const *const entry = find_in_list(type);
+ return entry ? (*entry->m_construct_compressor)(chd, chd.hunk_bytes(), entry->m_lossy) : nullptr;
}
@@ -569,39 +615,36 @@ chd_compressor *chd_codec_list::new_compressor(chd_codec_type type, chd_file &ch
// instance of the given type
//-------------------------------------------------
-chd_decompressor *chd_codec_list::new_decompressor(chd_codec_type type, chd_file &chd)
+chd_decompressor::ptr chd_codec_list::new_decompressor(chd_codec_type type, chd_file &chd)
{
// find in the list and construct the class
const codec_entry *entry = find_in_list(type);
- return (entry == nullptr) ? nullptr : (*entry->m_construct_decompressor)(chd, chd.hunk_bytes(), entry->m_lossy);
+ return entry ? (*entry->m_construct_decompressor)(chd, chd.hunk_bytes(), entry->m_lossy) : nullptr;
}
//-------------------------------------------------
-// codec_name - return the name of the given
-// codec
+// codec_exists - determine whether a codec type
+// corresponds to a supported codec
//-------------------------------------------------
-const char *chd_codec_list::codec_name(chd_codec_type type)
+bool chd_codec_list::codec_exists(chd_codec_type type)
{
// find in the list and construct the class
- const codec_entry *entry = find_in_list(type);
- return (entry == nullptr) ? nullptr : entry->m_name;
+ return bool(find_in_list(type));
}
//-------------------------------------------------
-// find_in_list - create a new compressor
-// instance of the given type
+// codec_name - return the name of the given
+// codec
//-------------------------------------------------
-const chd_codec_list::codec_entry *chd_codec_list::find_in_list(chd_codec_type type)
+const char *chd_codec_list::codec_name(chd_codec_type type)
{
// find in the list and construct the class
- for (auto & elem : s_codec_list)
- if (elem.m_type == type)
- return &elem;
- return nullptr;
+ const codec_entry *entry = find_in_list(type);
+ return entry ? entry->m_name : nullptr;
}
@@ -615,25 +658,24 @@ const chd_codec_list::codec_entry *chd_codec_list::find_in_list(chd_codec_type t
//-------------------------------------------------
chd_compressor_group::chd_compressor_group(chd_file &chd, uint32_t compressor_list[4])
- : m_hunkbytes(chd.hunk_bytes()),
- m_compress_test(m_hunkbytes)
+ : m_hunkbytes(chd.hunk_bytes())
+ , m_compress_test(m_hunkbytes)
#if CHDCODEC_VERIFY_COMPRESSION
- ,m_decompressed(m_hunkbytes)
+ , m_decompressed(m_hunkbytes)
#endif
{
// verify the compression types and initialize the codecs
for (int codecnum = 0; codecnum < std::size(m_compressor); codecnum++)
{
- m_compressor[codecnum] = nullptr;
if (compressor_list[codecnum] != CHD_CODEC_NONE)
{
m_compressor[codecnum] = chd_codec_list::new_compressor(compressor_list[codecnum], chd);
- if (m_compressor[codecnum] == nullptr)
- throw CHDERR_UNKNOWN_COMPRESSION;
+ if (!m_compressor[codecnum])
+ throw std::error_condition(chd_file::error::UNKNOWN_COMPRESSION);
#if CHDCODEC_VERIFY_COMPRESSION
m_decompressor[codecnum] = chd_codec_list::new_decompressor(compressor_list[codecnum], chd);
- if (m_decompressor[codecnum] == nullptr)
- throw CHDERR_UNKNOWN_COMPRESSION;
+ if (!m_decompressor[codecnum])
+ throw std::error_condition(chd_file::error::UNKNOWN_COMPRESSION);
#endif
}
}
@@ -646,9 +688,7 @@ chd_compressor_group::chd_compressor_group(chd_file &chd, uint32_t compressor_li
chd_compressor_group::~chd_compressor_group()
{
- // delete the codecs and the test buffer
- for (auto & elem : m_compressor)
- delete elem;
+ // codecs and test buffer deleted automatically
}
@@ -664,7 +704,7 @@ int8_t chd_compressor_group::find_best_compressor(const uint8_t *src, uint8_t *c
complen = m_hunkbytes;
int8_t compression = -1;
for (int codecnum = 0; codecnum < std::size(m_compressor); codecnum++)
- if (m_compressor[codecnum] != nullptr)
+ if (m_compressor[codecnum])
{
// attempt to compress, swallowing errors
try
@@ -702,7 +742,9 @@ printf(" codec%d=%d bytes \n", codecnum, compbytes);
memcpy(compressed, &m_compress_test[0], compbytes);
}
}
- catch (...) { }
+ catch (...)
+ {
+ }
}
// if the best is none, copy it over
@@ -729,7 +771,7 @@ chd_zlib_allocator::chd_zlib_allocator()
//-------------------------------------------------
-// ~chd_zlib_allocator - constructor
+// ~chd_zlib_allocator - destructor
//-------------------------------------------------
chd_zlib_allocator::~chd_zlib_allocator()
@@ -835,7 +877,7 @@ chd_zlib_compressor::chd_zlib_compressor(chd_file &chd, uint32_t hunkbytes, bool
if (zerr == Z_MEM_ERROR)
throw std::bad_alloc();
else if (zerr != Z_OK)
- throw CHDERR_CODEC_ERROR;
+ throw std::error_condition(chd_file::error::CODEC_ERROR);
}
@@ -864,14 +906,14 @@ uint32_t chd_zlib_compressor::compress(const uint8_t *src, uint32_t srclen, uint
m_deflater.total_out = 0;
int zerr = deflateReset(&m_deflater);
if (zerr != Z_OK)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
// do it
zerr = deflate(&m_deflater, Z_FINISH);
// if we ended up with more data than we started with, return an error
if (zerr != Z_STREAM_END || m_deflater.total_out >= srclen)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
// otherwise, return the length
return m_deflater.total_out;
@@ -900,7 +942,7 @@ chd_zlib_decompressor::chd_zlib_decompressor(chd_file &chd, uint32_t hunkbytes,
if (zerr == Z_MEM_ERROR)
throw std::bad_alloc();
else if (zerr != Z_OK)
- throw CHDERR_CODEC_ERROR;
+ throw std::error_condition(chd_file::error::CODEC_ERROR);
}
@@ -930,14 +972,14 @@ void chd_zlib_decompressor::decompress(const uint8_t *src, uint32_t complen, uin
m_inflater.total_out = 0;
int zerr = inflateReset(&m_inflater);
if (zerr != Z_OK)
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
// do it
zerr = inflate(&m_inflater, Z_FINISH);
if (zerr != Z_STREAM_END)
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
if (m_inflater.total_out != destlen)
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
}
@@ -1071,20 +1113,20 @@ uint32_t chd_lzma_compressor::compress(const uint8_t *src, uint32_t srclen, uint
// allocate the encoder
CLzmaEncHandle encoder = LzmaEnc_Create(&m_allocator);
if (encoder == nullptr)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
try
{
// configure the encoder
SRes res = LzmaEnc_SetProps(encoder, &m_props);
if (res != SZ_OK)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
// run it
SizeT complen = srclen;
res = LzmaEnc_MemEncode(encoder, dest, &complen, src, srclen, 0, nullptr, &m_allocator, &m_allocator);
if (res != SZ_OK)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
// clean up
LzmaEnc_Destroy(encoder, &m_allocator, &m_allocator);
@@ -1140,24 +1182,24 @@ chd_lzma_decompressor::chd_lzma_decompressor(chd_file &chd, uint32_t hunkbytes,
// convert to decoder properties
CLzmaEncHandle enc = LzmaEnc_Create(&m_allocator);
if (!enc)
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
if (LzmaEnc_SetProps(enc, &encoder_props) != SZ_OK)
{
LzmaEnc_Destroy(enc, &m_allocator, &m_allocator);
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
}
Byte decoder_props[LZMA_PROPS_SIZE];
SizeT props_size = sizeof(decoder_props);
if (LzmaEnc_WriteProperties(enc, decoder_props, &props_size) != SZ_OK)
{
LzmaEnc_Destroy(enc, &m_allocator, &m_allocator);
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
}
LzmaEnc_Destroy(enc, &m_allocator, &m_allocator);
// do memory allocations
if (LzmaDec_Allocate(&m_decoder, decoder_props, LZMA_PROPS_SIZE, &m_allocator) != SZ_OK)
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
}
@@ -1188,7 +1230,7 @@ void chd_lzma_decompressor::decompress(const uint8_t *src, uint32_t complen, uin
ELzmaStatus status;
SRes res = LzmaDec_DecodeToBuf(&m_decoder, dest, &decodedlen, src, &consumedlen, LZMA_FINISH_END, &status);
if ((res != SZ_OK && res != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK) || consumedlen != complen || decodedlen != destlen)
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
}
@@ -1216,7 +1258,7 @@ uint32_t chd_huffman_compressor::compress(const uint8_t *src, uint32_t srclen, u
{
uint32_t complen;
if (m_encoder.encode(src, srclen, dest, srclen, complen) != HUFFERR_NONE)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
return complen;
}
@@ -1244,7 +1286,7 @@ chd_huffman_decompressor::chd_huffman_decompressor(chd_file &chd, uint32_t hunkb
void chd_huffman_decompressor::decompress(const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen)
{
if (m_decoder.decode(src, complen, dest, destlen) != HUFFERR_NONE)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
}
@@ -1282,19 +1324,19 @@ uint32_t chd_flac_compressor::compress(const uint8_t *src, uint32_t srclen, uint
// reset and encode big-endian
m_encoder.reset(dest + 1, hunkbytes() - 1);
if (!m_encoder.encode_interleaved(reinterpret_cast<const int16_t *>(src), srclen / 4, !m_big_endian))
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
uint32_t complen_be = m_encoder.finish();
// reset and encode little-endian
m_encoder.reset(dest + 1, hunkbytes() - 1);
if (!m_encoder.encode_interleaved(reinterpret_cast<const int16_t *>(src), srclen / 4, m_big_endian))
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
uint32_t complen_le = m_encoder.finish();
// pick the best one and add a byte
uint32_t complen = std::min(complen_le, complen_be);
if (complen + 1 >= hunkbytes())
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
// if big-endian was better, re-do it
dest[0] = 'L';
@@ -1303,7 +1345,7 @@ uint32_t chd_flac_compressor::compress(const uint8_t *src, uint32_t srclen, uint
dest[0] = 'B';
m_encoder.reset(dest + 1, hunkbytes() - 1);
if (!m_encoder.encode_interleaved(reinterpret_cast<const int16_t *>(src), srclen / 4, !m_big_endian))
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
m_encoder.finish();
}
return complen + 1;
@@ -1358,13 +1400,13 @@ void chd_flac_decompressor::decompress(const uint8_t *src, uint32_t complen, uin
else if (src[0] == 'B')
swap_endian = !m_big_endian;
else
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
// reset and decode
if (!m_decoder.reset(44100, 2, chd_flac_compressor::blocksize(destlen), src + 1, complen - 1))
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
if (!m_decoder.decode_interleaved(reinterpret_cast<int16_t *>(dest), destlen / 4, swap_endian))
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
// finish up
m_decoder.finish();
@@ -1386,7 +1428,7 @@ chd_cd_flac_compressor::chd_cd_flac_compressor(chd_file &chd, uint32_t hunkbytes
{
// make sure the CHD's hunk size is an even multiple of the frame size
if (hunkbytes % CD_FRAME_SIZE != 0)
- throw CHDERR_CODEC_ERROR;
+ throw std::error_condition(chd_file::error::CODEC_ERROR);
// determine whether we want native or swapped samples
uint16_t native_endian = 0;
@@ -1409,7 +1451,7 @@ chd_cd_flac_compressor::chd_cd_flac_compressor(chd_file &chd, uint32_t hunkbytes
if (zerr == Z_MEM_ERROR)
throw std::bad_alloc();
else if (zerr != Z_OK)
- throw CHDERR_CODEC_ERROR;
+ throw std::error_condition(chd_file::error::CODEC_ERROR);
}
@@ -1442,7 +1484,7 @@ uint32_t chd_cd_flac_compressor::compress(const uint8_t *src, uint32_t srclen, u
m_encoder.reset(dest, hunkbytes());
uint8_t *buffer = &m_buffer[0];
if (!m_encoder.encode_interleaved(reinterpret_cast<int16_t *>(buffer), frames * CD_MAX_SECTOR_DATA/4, m_swap_endian))
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
// finish up
uint32_t complen = m_encoder.finish();
@@ -1456,7 +1498,7 @@ uint32_t chd_cd_flac_compressor::compress(const uint8_t *src, uint32_t srclen, u
m_deflater.total_out = 0;
int zerr = deflateReset(&m_deflater);
if (zerr != Z_OK)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
// do it
zerr = deflate(&m_deflater, Z_FINISH);
@@ -1464,7 +1506,7 @@ uint32_t chd_cd_flac_compressor::compress(const uint8_t *src, uint32_t srclen, u
// if we ended up with more data than we started with, return an error
complen += m_deflater.total_out;
if (zerr != Z_STREAM_END || complen >= srclen)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
return complen;
}
@@ -1515,7 +1557,7 @@ chd_cd_flac_decompressor::chd_cd_flac_decompressor(chd_file &chd, uint32_t hunkb
{
// make sure the CHD's hunk size is an even multiple of the frame size
if (hunkbytes % CD_FRAME_SIZE != 0)
- throw CHDERR_CODEC_ERROR;
+ throw std::error_condition(chd_file::error::CODEC_ERROR);
// determine whether we want native or swapped samples
uint16_t native_endian = 0;
@@ -1532,7 +1574,7 @@ chd_cd_flac_decompressor::chd_cd_flac_decompressor(chd_file &chd, uint32_t hunkb
if (zerr == Z_MEM_ERROR)
throw std::bad_alloc();
else if (zerr != Z_OK)
- throw CHDERR_CODEC_ERROR;
+ throw std::error_condition(chd_file::error::CODEC_ERROR);
}
/**
@@ -1569,10 +1611,10 @@ void chd_cd_flac_decompressor::decompress(const uint8_t *src, uint32_t complen,
// reset and decode
uint32_t frames = destlen / CD_FRAME_SIZE;
if (!m_decoder.reset(44100, 2, chd_cd_flac_compressor::blocksize(frames * CD_MAX_SECTOR_DATA), src, complen))
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
uint8_t *buffer = &m_buffer[0];
if (!m_decoder.decode_interleaved(reinterpret_cast<int16_t *>(buffer), frames * CD_MAX_SECTOR_DATA/4, m_swap_endian))
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
// inflate the subcode data
uint32_t offset = m_decoder.finish();
@@ -1584,14 +1626,14 @@ void chd_cd_flac_decompressor::decompress(const uint8_t *src, uint32_t complen,
m_inflater.total_out = 0;
int zerr = inflateReset(&m_inflater);
if (zerr != Z_OK)
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
// do it
zerr = inflate(&m_inflater, Z_FINISH);
if (zerr != Z_STREAM_END)
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
if (m_inflater.total_out != frames * CD_MAX_SUBCODE_DATA)
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
// reassemble the data
for (uint32_t framenum = 0; framenum < frames; framenum++)
@@ -1620,15 +1662,15 @@ void chd_cd_flac_decompressor::decompress(const uint8_t *src, uint32_t complen,
*/
chd_avhuff_compressor::chd_avhuff_compressor(chd_file &chd, uint32_t hunkbytes, bool lossy)
- : chd_compressor(chd, hunkbytes, lossy),
- m_postinit(false)
+ : chd_compressor(chd, hunkbytes, lossy)
+ , m_postinit(false)
{
try
{
// attempt to do a post-init now
postinit();
}
- catch (chd_error &)
+ catch (std::error_condition const &)
{
// if we're creating a new CHD, it won't work but that's ok
}
@@ -1665,14 +1707,14 @@ uint32_t chd_avhuff_compressor::compress(const uint8_t *src, uint32_t srclen, ui
int size = avhuff_encoder::raw_data_size(src);
while (size < srclen)
if (src[size++] != 0)
- throw CHDERR_INVALID_DATA;
+ throw std::error_condition(chd_file::error::INVALID_DATA);
}
// encode the audio and video
uint32_t complen;
avhuff_error averr = m_encoder.encode_data(src, dest, complen);
if (averr != AVHERR_NONE || complen > srclen)
- throw CHDERR_COMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::COMPRESSION_ERROR);
return complen;
}
@@ -1693,21 +1735,21 @@ void chd_avhuff_compressor::postinit()
{
// get the metadata
std::string metadata;
- chd_error err = chd().read_metadata(AV_METADATA_TAG, 0, metadata);
- if (err != CHDERR_NONE)
+ std::error_condition err = chd().read_metadata(AV_METADATA_TAG, 0, metadata);
+ if (err)
throw err;
// extract the info
int fps, fpsfrac, width, height, interlaced, channels, rate;
if (sscanf(metadata.c_str(), AV_METADATA_FORMAT, &fps, &fpsfrac, &width, &height, &interlaced, &channels, &rate) != 7)
- throw CHDERR_INVALID_METADATA;
+ throw std::error_condition(chd_file::error::INVALID_METADATA);
// compute the bytes per frame
uint32_t fps_times_1million = fps * 1000000 + fpsfrac;
uint32_t max_samples_per_frame = (uint64_t(rate) * 1000000 + fps_times_1million - 1) / fps_times_1million;
uint32_t bytes_per_frame = 12 + channels * max_samples_per_frame * 2 + width * height * 2;
if (bytes_per_frame > hunkbytes())
- throw CHDERR_INVALID_METADATA;
+ throw std::error_condition(chd_file::error::INVALID_METADATA);
// done with post-init
m_postinit = true;
@@ -1757,7 +1799,7 @@ void chd_avhuff_decompressor::decompress(const uint8_t *src, uint32_t complen, u
// decode the audio and video
avhuff_error averr = m_decoder.decode_data(src, complen, dest);
if (averr != AVHERR_NONE)
- throw CHDERR_DECOMPRESSION_ERROR;
+ throw std::error_condition(chd_file::error::DECOMPRESSION_ERROR);
// pad short frames with 0
if (dest != nullptr)
@@ -1790,5 +1832,5 @@ void chd_avhuff_decompressor::configure(int param, void *config)
// anything else is invalid
else
- throw CHDERR_INVALID_PARAMETER;
+ throw std::error_condition(std::errc::invalid_argument);
}
diff --git a/src/lib/util/chdcodec.h b/src/lib/util/chdcodec.h
index dc9c074fd37..700ae8f8979 100644
--- a/src/lib/util/chdcodec.h
+++ b/src/lib/util/chdcodec.h
@@ -7,13 +7,15 @@
Codecs used by the CHD format
***************************************************************************/
-
-#ifndef MAME_UTIL_CHDCODEC_H
-#define MAME_UTIL_CHDCODEC_H
+#ifndef MAME_LIB_UTIL_CHDCODEC_H
+#define MAME_LIB_UTIL_CHDCODEC_H
#pragma once
+#include "utilfwd.h"
+
#include <cstdint>
+#include <memory>
#include <vector>
@@ -21,20 +23,9 @@
//**************************************************************************
-// MACROS
-//**************************************************************************
-
-#define CHD_MAKE_TAG(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
-// forward references
-class chd_file;
-
// base types
typedef uint32_t chd_codec_type;
@@ -63,7 +54,7 @@ public:
private:
// internal state
chd_file & m_chd;
- uint32_t m_hunkbytes;
+ uint32_t m_hunkbytes;
bool m_lossy;
};
@@ -78,6 +69,8 @@ protected:
chd_compressor(chd_file &file, uint32_t hunkbytes, bool lossy);
public:
+ using ptr = std::unique_ptr<chd_compressor>;
+
// implementation
virtual uint32_t compress(const uint8_t *src, uint32_t srclen, uint8_t *dest) = 0;
};
@@ -93,6 +86,8 @@ protected:
chd_decompressor(chd_file &file, uint32_t hunkbytes, bool lossy);
public:
+ using ptr = std::unique_ptr<chd_decompressor>;
+
// implementation
virtual void decompress(const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) = 0;
};
@@ -105,35 +100,12 @@ class chd_codec_list
{
public:
// create compressors or decompressors
- static chd_compressor *new_compressor(chd_codec_type type, chd_file &file);
- static chd_decompressor *new_decompressor(chd_codec_type type, chd_file &file);
+ static chd_compressor::ptr new_compressor(chd_codec_type type, chd_file &file);
+ static chd_decompressor::ptr new_decompressor(chd_codec_type type, chd_file &file);
// utilities
- static bool codec_exists(chd_codec_type type) { return (find_in_list(type) != nullptr); }
+ static bool codec_exists(chd_codec_type type);
static const char *codec_name(chd_codec_type type);
-
-private:
- // an entry in the list
- struct codec_entry
- {
- chd_codec_type m_type;
- bool m_lossy;
- const char * m_name;
- chd_compressor * (*m_construct_compressor)(chd_file &, uint32_t, bool);
- chd_decompressor * (*m_construct_decompressor)(chd_file &, uint32_t, bool);
- };
-
- // internal helper functions
- static const codec_entry *find_in_list(chd_codec_type type);
-
- template<class _CompressorClass>
- static chd_compressor *construct_compressor(chd_file &chd, uint32_t hunkbytes, bool lossy) { return new _CompressorClass(chd, hunkbytes, lossy); }
-
- template<class _DecompressorClass>
- static chd_decompressor *construct_decompressor(chd_file &chd, uint32_t hunkbytes, bool lossy) { return new _DecompressorClass(chd, hunkbytes, lossy); }
-
- // the static list
- static const codec_entry s_codec_list[];
};
@@ -152,37 +124,48 @@ public:
private:
// internal state
- uint32_t m_hunkbytes; // number of bytes in a hunk
- chd_compressor * m_compressor[4]; // array of active codecs
- std::vector<uint8_t> m_compress_test; // test buffer for compression
+ uint32_t m_hunkbytes; // number of bytes in a hunk
+ chd_compressor::ptr m_compressor[4]; // array of active codecs
+ std::vector<uint8_t> m_compress_test; // test buffer for compression
#if CHDCODEC_VERIFY_COMPRESSION
- chd_decompressor * m_decompressor[4]; // array of active codecs
- std::vector<uint8_t> m_decompressed; // verification buffer
+ chd_decompressor::ptr m_decompressor[4]; // array of active codecs
+ std::vector<uint8_t> m_decompressed; // verification buffer
#endif
};
//**************************************************************************
+// MACROS
+//**************************************************************************
+
+constexpr chd_codec_type CHD_MAKE_TAG(char a, char b, char c, char d)
+{
+ return (uint32_t(uint8_t(a)) << 24) | uint32_t(uint8_t((b)) << 16) | uint32_t(uint8_t((c)) << 8) | uint32_t(uint8_t(d));
+}
+
+
+
+//**************************************************************************
// CONSTANTS
//**************************************************************************
// currently-defined codecs
-const chd_codec_type CHD_CODEC_NONE = 0;
+constexpr chd_codec_type CHD_CODEC_NONE = 0;
// general codecs
-const chd_codec_type CHD_CODEC_ZLIB = CHD_MAKE_TAG('z','l','i','b');
-const chd_codec_type CHD_CODEC_LZMA = CHD_MAKE_TAG('l','z','m','a');
-const chd_codec_type CHD_CODEC_HUFFMAN = CHD_MAKE_TAG('h','u','f','f');
-const chd_codec_type CHD_CODEC_FLAC = CHD_MAKE_TAG('f','l','a','c');
+constexpr chd_codec_type CHD_CODEC_ZLIB = CHD_MAKE_TAG('z','l','i','b');
+constexpr chd_codec_type CHD_CODEC_LZMA = CHD_MAKE_TAG('l','z','m','a');
+constexpr chd_codec_type CHD_CODEC_HUFFMAN = CHD_MAKE_TAG('h','u','f','f');
+constexpr chd_codec_type CHD_CODEC_FLAC = CHD_MAKE_TAG('f','l','a','c');
// general codecs with CD frontend
-const chd_codec_type CHD_CODEC_CD_ZLIB = CHD_MAKE_TAG('c','d','z','l');
-const chd_codec_type CHD_CODEC_CD_LZMA = CHD_MAKE_TAG('c','d','l','z');
-const chd_codec_type CHD_CODEC_CD_FLAC = CHD_MAKE_TAG('c','d','f','l');
+constexpr chd_codec_type CHD_CODEC_CD_ZLIB = CHD_MAKE_TAG('c','d','z','l');
+constexpr chd_codec_type CHD_CODEC_CD_LZMA = CHD_MAKE_TAG('c','d','l','z');
+constexpr chd_codec_type CHD_CODEC_CD_FLAC = CHD_MAKE_TAG('c','d','f','l');
// A/V codecs
-const chd_codec_type CHD_CODEC_AVHUFF = CHD_MAKE_TAG('a','v','h','u');
+constexpr chd_codec_type CHD_CODEC_AVHUFF = CHD_MAKE_TAG('a','v','h','u');
// A/V codec configuration parameters
enum
@@ -190,4 +173,4 @@ enum
AVHUFF_CODEC_DECOMPRESS_CONFIG = 1
};
-#endif // MAME_UTIL_CHDCODEC_H
+#endif // MAME_LIB_UTIL_CHDCODEC_H
diff --git a/src/lib/util/corefile.cpp b/src/lib/util/corefile.cpp
index e681c0f1fac..0c72e1337be 100644
--- a/src/lib/util/corefile.cpp
+++ b/src/lib/util/corefile.cpp
@@ -12,18 +12,16 @@
#include "coretmpl.h"
#include "osdcore.h"
+#include "path.h"
#include "unicode.h"
#include "vecstream.h"
-#include <zlib.h>
-
#include <algorithm>
#include <cassert>
+#include <cctype>
#include <cstring>
#include <iterator>
-#include <cctype>
-
namespace util {
@@ -43,110 +41,11 @@ namespace {
TYPE DEFINITIONS
***************************************************************************/
-class zlib_data
-{
-public:
- typedef std::unique_ptr<zlib_data> ptr;
-
- static int start_compression(int level, std::uint64_t offset, ptr &data)
- {
- ptr result(new zlib_data(offset));
- result->reset_output();
- auto const zerr = deflateInit(&result->m_stream, level);
- result->m_compress = (Z_OK == zerr);
- if (result->m_compress) data = std::move(result);
- return zerr;
- }
- static int start_decompression(std::uint64_t offset, ptr &data)
- {
- ptr result(new zlib_data(offset));
- auto const zerr = inflateInit(&result->m_stream);
- result->m_decompress = (Z_OK == zerr);
- if (result->m_decompress) data = std::move(result);
- return zerr;
- }
-
- ~zlib_data()
- {
- if (m_compress) deflateEnd(&m_stream);
- else if (m_decompress) inflateEnd(&m_stream);
- }
-
- std::size_t buffer_size() const { return sizeof(m_buffer); }
- void const *buffer_data() const { return m_buffer; }
- void *buffer_data() { return m_buffer; }
-
- // general-purpose output buffer manipulation
- bool output_full() const { return 0 == m_stream.avail_out; }
- std::size_t output_space() const { return m_stream.avail_out; }
- void set_output(void *data, std::uint32_t size)
- {
- m_stream.next_out = reinterpret_cast<Bytef *>(data);
- m_stream.avail_out = size;
- }
-
- // working with output to the internal buffer
- bool has_output() const { return m_stream.avail_out != sizeof(m_buffer); }
- std::size_t output_size() const { return sizeof(m_buffer) - m_stream.avail_out; }
- void reset_output()
- {
- m_stream.next_out = m_buffer;
- m_stream.avail_out = sizeof(m_buffer);
- }
-
- // general-purpose input buffer manipulation
- bool has_input() const { return 0 != m_stream.avail_in; }
- std::size_t input_size() const { return m_stream.avail_in; }
- void set_input(void const *data, std::uint32_t size)
- {
- m_stream.next_in = const_cast<Bytef *>(reinterpret_cast<Bytef const *>(data));
- m_stream.avail_in = size;
- }
-
- // working with input from the internal buffer
- void reset_input(std::uint32_t size)
- {
- m_stream.next_in = m_buffer;
- m_stream.avail_in = size;
- }
-
- int compress() { assert(m_compress); return deflate(&m_stream, Z_NO_FLUSH); }
- int finalise() { assert(m_compress); return deflate(&m_stream, Z_FINISH); }
- int decompress() { assert(m_decompress); return inflate(&m_stream, Z_SYNC_FLUSH); }
-
- std::uint64_t realoffset() const { return m_realoffset; }
- void add_realoffset(std::uint32_t increment) { m_realoffset += increment; }
-
- bool is_nextoffset(std::uint64_t value) const { return m_nextoffset == value; }
- void add_nextoffset(std::uint32_t increment) { m_nextoffset += increment; }
-
-private:
- zlib_data(std::uint64_t offset)
- : m_compress(false)
- , m_decompress(false)
- , m_realoffset(offset)
- , m_nextoffset(offset)
- {
- m_stream.zalloc = Z_NULL;
- m_stream.zfree = Z_NULL;
- m_stream.opaque = Z_NULL;
- m_stream.avail_in = m_stream.avail_out = 0;
- }
-
- bool m_compress, m_decompress;
- z_stream m_stream;
- std::uint8_t m_buffer[1024];
- std::uint64_t m_realoffset;
- std::uint64_t m_nextoffset;
-};
-
-
class core_proxy_file : public core_file
{
public:
- core_proxy_file(core_file &file) : m_file(file) { }
+ core_proxy_file(core_file &file) noexcept : m_file(file) { }
virtual ~core_proxy_file() override { }
- virtual osd_file::error compress(int level) override { return m_file.compress(level); }
virtual int seek(std::int64_t offset, int whence) override { return m_file.seek(offset, whence); }
virtual std::uint64_t tell() const override { return m_file.tell(); }
@@ -162,9 +61,9 @@ public:
virtual std::uint32_t write(const void *buffer, std::uint32_t length) override { return m_file.write(buffer, length); }
virtual int puts(std::string_view s) override { return m_file.puts(s); }
virtual int vprintf(util::format_argument_pack<std::ostream> const &args) override { return m_file.vprintf(args); }
- virtual osd_file::error truncate(std::uint64_t offset) override { return m_file.truncate(offset); }
+ virtual std::error_condition truncate(std::uint64_t offset) override { return m_file.truncate(offset); }
- virtual osd_file::error flush() override { return m_file.flush(); }
+ virtual std::error_condition flush() override { return m_file.flush(); }
private:
core_file &m_file;
@@ -230,12 +129,12 @@ public:
if (copy)
{
void *const buf = allocate();
- if (buf) std::memcpy(buf, data, length);
+ if (buf)
+ std::memcpy(buf, data, length);
}
}
~core_in_memory_file() override { purge(); }
- virtual osd_file::error compress(int level) override { return osd_file::error::INVALID_ACCESS; }
virtual int seek(std::int64_t offset, int whence) override;
virtual std::uint64_t tell() const override { return m_offset; }
@@ -246,8 +145,8 @@ public:
virtual void const *buffer() override { return m_data; }
virtual std::uint32_t write(void const *buffer, std::uint32_t length) override { return 0; }
- virtual osd_file::error truncate(std::uint64_t offset) override;
- virtual osd_file::error flush() override { clear_putback(); return osd_file::error::NONE; }
+ virtual std::error_condition truncate(std::uint64_t offset) override;
+ virtual std::error_condition flush() override { clear_putback(); return std::error_condition(); }
protected:
core_in_memory_file(std::uint32_t openflags, std::uint64_t length)
@@ -262,7 +161,8 @@ protected:
bool is_loaded() const { return nullptr != m_data; }
void *allocate()
{
- if (m_data) return nullptr;
+ if (m_data)
+ return nullptr;
void *data = malloc(m_length);
if (data)
{
@@ -273,7 +173,8 @@ protected:
}
void purge()
{
- if (m_data && m_data_allocated) free(const_cast<void *>(m_data));
+ if (m_data && m_data_allocated)
+ free(const_cast<void *>(m_data));
m_data_allocated = false;
m_data = nullptr;
}
@@ -301,23 +202,18 @@ public:
core_osd_file(std::uint32_t openmode, osd_file::ptr &&file, std::uint64_t length)
: core_in_memory_file(openmode, length)
, m_file(std::move(file))
- , m_zdata()
, m_bufferbase(0)
, m_bufferbytes(0)
{
}
~core_osd_file() override;
- virtual osd_file::error compress(int level) override;
-
- virtual int seek(std::int64_t offset, int whence) override;
-
virtual std::uint32_t read(void *buffer, std::uint32_t length) override;
virtual void const *buffer() override;
virtual std::uint32_t write(void const *buffer, std::uint32_t length) override;
- virtual osd_file::error truncate(std::uint64_t offset) override;
- virtual osd_file::error flush() override;
+ virtual std::error_condition truncate(std::uint64_t offset) override;
+ virtual std::error_condition flush() override;
protected:
@@ -326,11 +222,7 @@ protected:
private:
static constexpr std::size_t FILE_BUFFER_SIZE = 512;
- osd_file::error osd_or_zlib_read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual);
- osd_file::error osd_or_zlib_write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual);
-
osd_file::ptr m_file; // OSD file handle
- zlib_data::ptr m_zdata; // compression data
std::uint64_t m_bufferbase; // base offset of internal buffer
std::uint32_t m_bufferbytes; // bytes currently loaded into buffer
std::uint8_t m_buffer[FILE_BUFFER_SIZE]; // buffer data
@@ -673,14 +565,14 @@ std::uint32_t core_in_memory_file::read(void *buffer, std::uint32_t length)
truncate - truncate a file
-------------------------------------------------*/
-osd_file::error core_in_memory_file::truncate(std::uint64_t offset)
+std::error_condition core_in_memory_file::truncate(std::uint64_t offset)
{
if (m_length < offset)
- return osd_file::error::FAILURE;
+ return std::errc::io_error; // TODO: revisit this error code
// adjust to new length and offset
set_length(offset);
- return osd_file::error::NONE;
+ return std::error_condition();
}
@@ -719,91 +611,6 @@ std::size_t core_in_memory_file::safe_buffer_copy(
core_osd_file::~core_osd_file()
{
// close files and free memory
- if (m_zdata)
- core_osd_file::compress(FCOMPRESS_NONE);
-}
-
-
-/*-------------------------------------------------
- compress - enable/disable streaming file
- compression via zlib; level is 0 to disable
- compression, or up to 9 for max compression
--------------------------------------------------*/
-
-osd_file::error core_osd_file::compress(int level)
-{
- osd_file::error result = osd_file::error::NONE;
-
- // can only do this for read-only and write-only cases
- if (read_access() && write_access())
- return osd_file::error::INVALID_ACCESS;
-
- // if we have been compressing, flush and free the data
- if (m_zdata && (level == FCOMPRESS_NONE))
- {
- int zerr = Z_OK;
-
- // flush any remaining data if we are writing
- while (write_access() && (zerr != Z_STREAM_END))
- {
- // deflate some more
- zerr = m_zdata->finalise();
- if ((zerr != Z_STREAM_END) && (zerr != Z_OK))
- {
- result = osd_file::error::INVALID_DATA;
- break;
- }
-
- // write the data
- if (m_zdata->has_output())
- {
- std::uint32_t actualdata;
- auto const filerr = m_file->write(m_zdata->buffer_data(), m_zdata->realoffset(), m_zdata->output_size(), actualdata);
- if (filerr != osd_file::error::NONE)
- break;
- m_zdata->add_realoffset(actualdata);
- m_zdata->reset_output();
- }
- }
-
- // free memory
- m_zdata.reset();
- }
-
- // if we are just starting to compress, allocate a new buffer
- if (!m_zdata && (level > FCOMPRESS_NONE))
- {
- int zerr;
-
- // initialize the stream and compressor
- if (write_access())
- zerr = zlib_data::start_compression(level, offset(), m_zdata);
- else
- zerr = zlib_data::start_decompression(offset(), m_zdata);
-
- // on error, return an error
- if (zerr != Z_OK)
- return osd_file::error::OUT_OF_MEMORY;
-
- // flush buffers
- m_bufferbytes = 0;
- }
-
- return result;
-}
-
-
-/*-------------------------------------------------
- seek - seek within a file
--------------------------------------------------*/
-
-int core_osd_file::seek(std::int64_t offset, int whence)
-{
- // error if compressing
- if (m_zdata)
- return 1;
- else
- return core_in_memory_file::seek(offset, whence);
}
@@ -833,7 +640,7 @@ std::uint32_t core_osd_file::read(void *buffer, std::uint32_t length)
// read as much as makes sense into the buffer
m_bufferbase = offset() + bytes_read;
m_bufferbytes = 0;
- osd_or_zlib_read(m_buffer, m_bufferbase, sizeof(m_buffer), m_bufferbytes);
+ m_file->read(m_buffer, m_bufferbase, sizeof(m_buffer), m_bufferbytes);
// do a bounded copy from the buffer to the destination
bytes_read += safe_buffer_copy(m_buffer, 0, m_bufferbytes, buffer, bytes_read, length);
@@ -842,7 +649,7 @@ std::uint32_t core_osd_file::read(void *buffer, std::uint32_t length)
{
// read the remainder directly from the file
std::uint32_t new_bytes_read = 0;
- osd_or_zlib_read(reinterpret_cast<std::uint8_t *>(buffer) + bytes_read, offset() + bytes_read, length - bytes_read, new_bytes_read);
+ m_file->read(reinterpret_cast<std::uint8_t *>(buffer) + bytes_read, offset() + bytes_read, length - bytes_read, new_bytes_read);
bytes_read += new_bytes_read;
}
}
@@ -866,18 +673,16 @@ void const *core_osd_file::buffer()
{
// allocate some memory
void *buf = allocate();
- if (!buf) return nullptr;
+ if (!buf)
+ return nullptr;
// read the file
std::uint32_t read_length = 0;
- auto const filerr = osd_or_zlib_read(buf, 0, length(), read_length);
- if ((filerr != osd_file::error::NONE) || (read_length != length()))
+ auto const filerr = m_file->read(buf, 0, length(), read_length);
+ if (filerr || (read_length != length()))
purge();
else
- {
- // close the file because we don't need it anymore
- m_file.reset();
- }
+ m_file.reset(); // close the file because we don't need it anymore
}
return core_in_memory_file::buffer();
}
@@ -901,7 +706,7 @@ std::uint32_t core_osd_file::write(void const *buffer, std::uint32_t length)
// do the write
std::uint32_t bytes_written = 0;
- osd_or_zlib_write(buffer, offset(), length, bytes_written);
+ m_file->write(buffer, offset(), length, bytes_written);
// return the number of bytes written
add_offset(bytes_written);
@@ -913,19 +718,19 @@ std::uint32_t core_osd_file::write(void const *buffer, std::uint32_t length)
truncate - truncate a file
-------------------------------------------------*/
-osd_file::error core_osd_file::truncate(std::uint64_t offset)
+std::error_condition core_osd_file::truncate(std::uint64_t offset)
{
if (is_loaded())
return core_in_memory_file::truncate(offset);
// truncate file
auto const err = m_file->truncate(offset);
- if (err != osd_file::error::NONE)
+ if (err)
return err;
// and adjust to new length and offset
set_length(offset);
- return osd_file::error::NONE;
+ return std::error_condition();
}
@@ -933,7 +738,7 @@ osd_file::error core_osd_file::truncate(std::uint64_t offset)
flush - flush file buffers
-------------------------------------------------*/
-osd_file::error core_osd_file::flush()
+std::error_condition core_osd_file::flush()
{
if (is_loaded())
return core_in_memory_file::flush();
@@ -947,116 +752,6 @@ osd_file::error core_osd_file::flush()
return m_file->flush();
}
-
-/*-------------------------------------------------
- osd_or_zlib_read - wrapper for osd_read that
- handles zlib-compressed data
--------------------------------------------------*/
-
-osd_file::error core_osd_file::osd_or_zlib_read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual)
-{
- // if no compression, just pass through
- if (!m_zdata)
- return m_file->read(buffer, offset, length, actual);
-
- // if the offset doesn't match the next offset, fail
- if (!m_zdata->is_nextoffset(offset))
- return osd_file::error::INVALID_ACCESS;
-
- // set up the destination
- osd_file::error filerr = osd_file::error::NONE;
- m_zdata->set_output(buffer, length);
- while (!m_zdata->output_full())
- {
- // if we didn't make progress, report an error or the end
- if (m_zdata->has_input())
- {
- auto const zerr = m_zdata->decompress();
- if (Z_OK != zerr)
- {
- if (Z_STREAM_END != zerr) filerr = osd_file::error::INVALID_DATA;
- break;
- }
- }
-
- // fetch more data if needed
- if (!m_zdata->has_input())
- {
- std::uint32_t actualdata = 0;
- filerr = m_file->read(m_zdata->buffer_data(), m_zdata->realoffset(), m_zdata->buffer_size(), actualdata);
- if (filerr != osd_file::error::NONE) break;
- m_zdata->add_realoffset(actualdata);
- m_zdata->reset_input(actualdata);
- if (!m_zdata->has_input()) break;
- }
- }
-
- // adjust everything
- actual = length - m_zdata->output_space();
- m_zdata->add_nextoffset(actual);
- return filerr;
-}
-
-
-/*-------------------------------------------------
- osd_or_zlib_write - wrapper for osd_write that
- handles zlib-compressed data
--------------------------------------------------*/
-
-/**
- * @fn osd_file::error osd_or_zlib_write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t actual)
- *
- * @brief OSD or zlib write.
- *
- * @param buffer The buffer.
- * @param offset The offset.
- * @param length The length.
- * @param [in,out] actual The actual.
- *
- * @return A osd_file::error.
- */
-
-osd_file::error core_osd_file::osd_or_zlib_write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual)
-{
- // if no compression, just pass through
- if (!m_zdata)
- return m_file->write(buffer, offset, length, actual);
-
- // if the offset doesn't match the next offset, fail
- if (!m_zdata->is_nextoffset(offset))
- return osd_file::error::INVALID_ACCESS;
-
- // set up the source
- m_zdata->set_input(buffer, length);
- while (m_zdata->has_input())
- {
- // if we didn't make progress, report an error or the end
- auto const zerr = m_zdata->compress();
- if (zerr != Z_OK)
- {
- actual = length - m_zdata->input_size();
- m_zdata->add_nextoffset(actual);
- return osd_file::error::INVALID_DATA;
- }
-
- // write more data if we are full up
- if (m_zdata->output_full())
- {
- std::uint32_t actualdata = 0;
- auto const filerr = m_file->write(m_zdata->buffer_data(), m_zdata->realoffset(), m_zdata->output_size(), actualdata);
- if (filerr != osd_file::error::NONE)
- return filerr;
- m_zdata->add_realoffset(actualdata);
- m_zdata->reset_output();
- }
- }
-
- // we wrote everything
- actual = length;
- m_zdata->add_nextoffset(actual);
- return osd_file::error::NONE;
-}
-
} // anonymous namespace
@@ -1070,23 +765,23 @@ osd_file::error core_osd_file::osd_or_zlib_write(void const *buffer, std::uint64
return an error code
-------------------------------------------------*/
-osd_file::error core_file::open(std::string const &filename, std::uint32_t openflags, ptr &file)
+std::error_condition core_file::open(std::string_view filename, std::uint32_t openflags, ptr &file)
{
try
{
// attempt to open the file
osd_file::ptr f;
std::uint64_t length = 0;
- auto const filerr = osd_file::open(filename, openflags, f, length);
- if (filerr != osd_file::error::NONE)
+ auto const filerr = osd_file::open(std::string(filename), openflags, f, length); // FIXME: allow osd_file to accept std::string_view
+ if (filerr)
return filerr;
file = std::make_unique<core_osd_file>(openflags, std::move(f), length);
- return osd_file::error::NONE;
+ return std::error_condition();
}
catch (...)
{
- return osd_file::error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
}
}
@@ -1096,20 +791,20 @@ osd_file::error core_file::open(std::string const &filename, std::uint32_t openf
like access and return an error code
-------------------------------------------------*/
-osd_file::error core_file::open_ram(void const *data, std::size_t length, std::uint32_t openflags, ptr &file)
+std::error_condition core_file::open_ram(void const *data, std::size_t length, std::uint32_t openflags, ptr &file)
{
// can only do this for read access
if ((openflags & OPEN_FLAG_WRITE) || (openflags & OPEN_FLAG_CREATE))
- return osd_file::error::INVALID_ACCESS;
+ return std::errc::invalid_argument;
try
{
file.reset(new core_in_memory_file(openflags, data, length, false));
- return osd_file::error::NONE;
+ return std::error_condition();
}
catch (...)
{
- return osd_file::error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
}
}
@@ -1120,24 +815,24 @@ osd_file::error core_file::open_ram(void const *data, std::size_t length, std::u
error code
-------------------------------------------------*/
-osd_file::error core_file::open_ram_copy(void const *data, std::size_t length, std::uint32_t openflags, ptr &file)
+std::error_condition core_file::open_ram_copy(void const *data, std::size_t length, std::uint32_t openflags, ptr &file)
{
// can only do this for read access
if ((openflags & OPEN_FLAG_WRITE) || (openflags & OPEN_FLAG_CREATE))
- return osd_file::error::INVALID_ACCESS;
+ return std::errc::invalid_argument;
try
{
ptr result(new core_in_memory_file(openflags, data, length, true));
if (!result->buffer())
- return osd_file::error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
file = std::move(result);
- return osd_file::error::NONE;
+ return std::error_condition();
}
catch (...)
{
- return osd_file::error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
}
}
@@ -1147,17 +842,14 @@ osd_file::error core_file::open_ram_copy(void const *data, std::size_t length, s
object and return an error code
-------------------------------------------------*/
-osd_file::error core_file::open_proxy(core_file &file, ptr &proxy)
+std::error_condition core_file::open_proxy(core_file &file, ptr &proxy)
{
- try
- {
- proxy = std::make_unique<core_proxy_file>(file);
- return osd_file::error::NONE;
- }
- catch (...)
- {
- return osd_file::error::OUT_OF_MEMORY;
- }
+ ptr result(new (std::nothrow) core_proxy_file(file));
+ if (!result)
+ return std::errc::not_enough_memory;
+
+ proxy = std::move(result);
+ return std::error_condition();
}
@@ -1176,61 +868,64 @@ core_file::~core_file()
pointer
-------------------------------------------------*/
-osd_file::error core_file::load(std::string const &filename, void **data, std::uint32_t &length)
+std::error_condition core_file::load(std::string_view filename, void **data, std::uint32_t &length)
{
ptr file;
// attempt to open the file
auto const err = open(filename, OPEN_FLAG_READ, file);
- if (err != osd_file::error::NONE)
+ if (err)
return err;
// get the size
auto const size = file->size();
if (std::uint32_t(size) != size)
- return osd_file::error::OUT_OF_MEMORY;
+ return std::errc::file_too_large;
// allocate memory
*data = malloc(size);
+ if (!*data)
+ return std::errc::not_enough_memory;
length = std::uint32_t(size);
// read the data
if (file->read(*data, size) != size)
{
free(*data);
- return osd_file::error::FAILURE;
+ return std::errc::io_error; // TODO: revisit this error code
}
// close the file and return data
- return osd_file::error::NONE;
+ return std::error_condition();
}
-osd_file::error core_file::load(std::string const &filename, std::vector<uint8_t> &data)
+std::error_condition core_file::load(std::string_view filename, std::vector<uint8_t> &data)
{
ptr file;
// attempt to open the file
auto const err = open(filename, OPEN_FLAG_READ, file);
- if (err != osd_file::error::NONE)
+ if (err)
return err;
// get the size
auto const size = file->size();
if (std::uint32_t(size) != size)
- return osd_file::error::OUT_OF_MEMORY;
+ return std::errc::file_too_large;
// allocate memory
- data.resize(size);
+ try { data.resize(size); }
+ catch (...) { return std::errc::not_enough_memory; }
// read the data
if (file->read(&data[0], size) != size)
{
data.clear();
- return osd_file::error::FAILURE;
+ return std::errc::io_error; // TODO: revisit this error code
}
// close the file and return data
- return osd_file::error::NONE;
+ return std::error_condition();
}
@@ -1256,7 +951,7 @@ core_file::core_file()
// assumptions about path separators
// -------------------------------------------------
-std::string_view core_filename_extract_base(std::string_view name, bool strip_extension)
+std::string_view core_filename_extract_base(std::string_view name, bool strip_extension) noexcept
{
// find the start of the basename
auto const start = std::find_if(name.rbegin(), name.rend(), &util::is_directory_separator);
@@ -1279,7 +974,7 @@ std::string_view core_filename_extract_base(std::string_view name, bool strip_ex
// core_filename_extract_extension
// -------------------------------------------------
-std::string_view core_filename_extract_extension(std::string_view filename, bool strip_period)
+std::string_view core_filename_extract_extension(std::string_view filename, bool strip_period) noexcept
{
auto loc = filename.find_last_of('.');
if (loc != std::string_view::npos)
@@ -1294,7 +989,7 @@ std::string_view core_filename_extract_extension(std::string_view filename, bool
// filename end with the specified extension?
// -------------------------------------------------
-bool core_filename_ends_with(std::string_view filename, std::string_view extension)
+bool core_filename_ends_with(std::string_view filename, std::string_view extension) noexcept
{
auto namelen = filename.length();
auto extlen = extension.length();
diff --git a/src/lib/util/corefile.h b/src/lib/util/corefile.h
index 6aaa8f609e1..19febbb46f1 100644
--- a/src/lib/util/corefile.h
+++ b/src/lib/util/corefile.h
@@ -12,14 +12,13 @@
#pragma once
-
#include "osdfile.h"
#include "strformat.h"
#include <cstdint>
#include <memory>
-#include <string>
#include <string_view>
+#include <system_error>
namespace util {
@@ -30,11 +29,6 @@ namespace util {
#define OPEN_FLAG_NO_BOM 0x0100 /* don't output BOM */
-#define FCOMPRESS_NONE 0 /* no compression */
-#define FCOMPRESS_MIN 1 /* minimal compression */
-#define FCOMPRESS_MEDIUM 6 /* standard compression */
-#define FCOMPRESS_MAX 9 /* maximum compression */
-
/***************************************************************************
TYPE DEFINITIONS
@@ -49,23 +43,20 @@ public:
// ----- file open/close -----
// open a file with the specified filename
- static osd_file::error open(std::string const &filename, std::uint32_t openflags, ptr &file);
+ static std::error_condition open(std::string_view filename, std::uint32_t openflags, ptr &file);
// open a RAM-based "file" using the given data and length (read-only)
- static osd_file::error open_ram(const void *data, std::size_t length, std::uint32_t openflags, ptr &file);
+ static std::error_condition open_ram(const void *data, std::size_t length, std::uint32_t openflags, ptr &file);
// open a RAM-based "file" using the given data and length (read-only), copying the data
- static osd_file::error open_ram_copy(const void *data, std::size_t length, std::uint32_t openflags, ptr &file);
+ static std::error_condition open_ram_copy(const void *data, std::size_t length, std::uint32_t openflags, ptr &file);
// open a proxy "file" that forwards requests to another file object
- static osd_file::error open_proxy(core_file &file, ptr &proxy);
+ static std::error_condition open_proxy(core_file &file, ptr &proxy);
// close an open file
virtual ~core_file();
- // enable/disable streaming file compression via zlib; level is 0 to disable compression, or up to 9 for max compression
- virtual osd_file::error compress(int level) = 0;
-
// ----- file positioning -----
@@ -101,8 +92,8 @@ public:
virtual const void *buffer() = 0;
// open a file with the specified filename, read it into memory, and return a pointer
- static osd_file::error load(std::string const &filename, void **data, std::uint32_t &length);
- static osd_file::error load(std::string const &filename, std::vector<uint8_t> &data);
+ static std::error_condition load(std::string_view filename, void **data, std::uint32_t &length);
+ static std::error_condition load(std::string_view filename, std::vector<uint8_t> &data);
// ----- file write -----
@@ -121,32 +112,16 @@ public:
}
// file truncation
- virtual osd_file::error truncate(std::uint64_t offset) = 0;
+ virtual std::error_condition truncate(std::uint64_t offset) = 0;
// flush file buffers
- virtual osd_file::error flush() = 0;
+ virtual std::error_condition flush() = 0;
protected:
core_file();
};
-
-/***************************************************************************
- INLINE FUNCTIONS
-***************************************************************************/
-
-// is a given character a directory separator?
-
-constexpr bool is_directory_separator(char c)
-{
-#if defined(WIN32)
- return ('\\' == c) || ('/' == c) || (':' == c);
-#else
- return '/' == c;
-#endif
-}
-
} // namespace util
@@ -157,13 +132,13 @@ constexpr bool is_directory_separator(char c)
/* ----- filename utilities ----- */
// extract the base part of a filename (remove extensions and paths)
-std::string_view core_filename_extract_base(std::string_view name, bool strip_extension = false);
+std::string_view core_filename_extract_base(std::string_view name, bool strip_extension = false) noexcept;
// extracts the file extension from a filename
-std::string_view core_filename_extract_extension(std::string_view filename, bool strip_period = false);
+std::string_view core_filename_extract_extension(std::string_view filename, bool strip_period = false) noexcept;
// true if the given filename ends with a particular extension
-bool core_filename_ends_with(std::string_view filename, std::string_view extension);
+bool core_filename_ends_with(std::string_view filename, std::string_view extension) noexcept;
#endif // MAME_LIB_UTIL_COREFILE_H
diff --git a/src/lib/util/coretmpl.h b/src/lib/util/coretmpl.h
index 18b64e7c0ff..9d033f72d26 100644
--- a/src/lib/util/coretmpl.h
+++ b/src/lib/util/coretmpl.h
@@ -610,20 +610,6 @@ template <typename T, typename U, typename V> constexpr T BIT(T x, U n, V w)
}
-/// \brief Extract and right-align a single bit field
-///
-/// This overload is used to terminate a recursive template
-/// implementation. It is functionally equivalent to the BIT
-/// function for extracting a single bit.
-///
-/// \param [in] val The integer to extract the bit from.
-/// \param [in] b The bit to extract, where zero is the least
-/// significant bit of the input.
-/// \return The specified bit of the input extracted to the least
-/// significant position.
-template <typename T, typename U> constexpr T bitswap(T val, U b) noexcept { return BIT(val, b) << 0U; }
-
-
/// \brief Extract bits in arbitrary order
///
/// Extracts bits from an integer. Specify the bits in the order they
@@ -641,7 +627,10 @@ template <typename T, typename U> constexpr T bitswap(T val, U b) noexcept { ret
/// \return The extracted bits packed into a right-aligned field.
template <typename T, typename U, typename... V> constexpr T bitswap(T val, U b, V... c) noexcept
{
- return (BIT(val, b) << sizeof...(c)) | bitswap(val, c...);
+ if constexpr (sizeof...(c) > 0U)
+ return (BIT(val, b) << sizeof...(c)) | bitswap(val, c...);
+ else
+ return BIT(val, b);
}
diff --git a/src/lib/util/endianness.h b/src/lib/util/endianness.h
new file mode 100644
index 00000000000..cef615fcb87
--- /dev/null
+++ b/src/lib/util/endianness.h
@@ -0,0 +1,76 @@
+// license:BSD-3-Clause
+// copyright-holders:Aaron Giles
+/***************************************************************************
+
+ endianness.h
+
+ Endianness types and utility functions.
+
+***************************************************************************/
+
+#ifndef MAME_LIB_UTIL_ENDIANNESS_H
+#define MAME_LIB_UTIL_ENDIANNESS_H
+
+#pragma once
+
+#include <string_view>
+
+
+namespace util {
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// constants for expression endianness
+enum class endianness
+{
+ little,
+ big,
+#ifdef LSB_FIRST
+ native = little
+#else
+ native = big
+#endif
+};
+
+
+//**************************************************************************
+// MACROS AND INLINE FUNCTIONS
+//**************************************************************************
+
+constexpr std::string_view endian_to_string_view(endianness e) { using namespace std::literals; return e == endianness::little ? "little"sv : "big"sv; }
+
+// endian-based value: first value is if native endianness is little-endian, second is if native is big-endian
+#define NATIVE_ENDIAN_VALUE_LE_BE(leval,beval) ((util::endianness::native == util::endianness::little) ? (leval) : (beval))
+
+
+// inline functions for accessing bytes and words within larger chunks
+
+// read/write a byte to a 16-bit space
+template <typename T> constexpr T BYTE_XOR_BE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(1,0); }
+template <typename T> constexpr T BYTE_XOR_LE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(0,1); }
+
+// read/write a byte to a 32-bit space
+template <typename T> constexpr T BYTE4_XOR_BE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(3,0); }
+template <typename T> constexpr T BYTE4_XOR_LE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(0,3); }
+
+// read/write a word to a 32-bit space
+template <typename T> constexpr T WORD_XOR_BE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(2,0); }
+template <typename T> constexpr T WORD_XOR_LE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(0,2); }
+
+// read/write a byte to a 64-bit space
+template <typename T> constexpr T BYTE8_XOR_BE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(7,0); }
+template <typename T> constexpr T BYTE8_XOR_LE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(0,7); }
+
+// read/write a word to a 64-bit space
+template <typename T> constexpr T WORD2_XOR_BE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(6,0); }
+template <typename T> constexpr T WORD2_XOR_LE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(0,6); }
+
+// read/write a dword to a 64-bit space
+template <typename T> constexpr T DWORD_XOR_BE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(4,0); }
+template <typename T> constexpr T DWORD_XOR_LE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(0,4); }
+
+} // namespace util
+
+#endif // MAME_LIB_UTIL_ENDIANNESS_H
diff --git a/src/lib/util/harddisk.cpp b/src/lib/util/harddisk.cpp
index e91759c44f2..2e8d14f9a8a 100644
--- a/src/lib/util/harddisk.cpp
+++ b/src/lib/util/harddisk.cpp
@@ -8,11 +8,13 @@
***************************************************************************/
-#include <cassert>
#include "harddisk.h"
-#include "osdcore.h"
+
+#include "corefile.h"
+
#include <cstdlib>
+
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
@@ -40,7 +42,7 @@ hard_disk_file *hard_disk_open(chd_file *chd)
int cylinders, heads, sectors, sectorbytes;
hard_disk_file *file;
std::string metadata;
- chd_error err;
+ std::error_condition err;
/* punt if no CHD */
if (chd == nullptr)
@@ -48,7 +50,7 @@ hard_disk_file *hard_disk_open(chd_file *chd)
/* read the hard disk metadata */
err = chd->read_metadata(HARD_DISK_METADATA_TAG, 0, metadata);
- if (err != CHDERR_NONE)
+ if (err)
return nullptr;
/* parse the metadata */
@@ -177,8 +179,8 @@ uint32_t hard_disk_read(hard_disk_file *file, uint32_t lbasector, void *buffer)
{
if (file->chd)
{
- chd_error err = file->chd->read_units(lbasector, buffer);
- return (err == CHDERR_NONE);
+ std::error_condition err = file->chd->read_units(lbasector, buffer);
+ return !err;
}
else
{
@@ -211,8 +213,8 @@ uint32_t hard_disk_write(hard_disk_file *file, uint32_t lbasector, const void *b
{
if (file->chd)
{
- chd_error err = file->chd->write_units(lbasector, buffer);
- return (err == CHDERR_NONE);
+ std::error_condition err = file->chd->write_units(lbasector, buffer);
+ return !err;
}
else
{
diff --git a/src/lib/util/harddisk.h b/src/lib/util/harddisk.h
index 2a4b727e7e7..e6fae165f19 100644
--- a/src/lib/util/harddisk.h
+++ b/src/lib/util/harddisk.h
@@ -8,13 +8,15 @@
***************************************************************************/
-#ifndef MAME_UTIL_HARDDISK_H
-#define MAME_UTIL_HARDDISK_H
+#ifndef MAME_LIB_UTIL_HARDDISK_H
+#define MAME_LIB_UTIL_HARDDISK_H
#pragma once
-#include "osdcore.h"
#include "chd.h"
+#include "utilfwd.h"
+
+#include "osdcore.h"
/***************************************************************************
@@ -49,4 +51,4 @@ hard_disk_info *hard_disk_get_info(hard_disk_file *file);
uint32_t hard_disk_read(hard_disk_file *file, uint32_t lbasector, void *buffer);
uint32_t hard_disk_write(hard_disk_file *file, uint32_t lbasector, const void *buffer);
-#endif // MAME_UTIL_HARDDISK_H
+#endif // MAME_LIB_UTIL_HARDDISK_H
diff --git a/src/lib/util/ioprocs.cpp b/src/lib/util/ioprocs.cpp
new file mode 100644
index 00000000000..1f52a3daf97
--- /dev/null
+++ b/src/lib/util/ioprocs.cpp
@@ -0,0 +1,1248 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/***************************************************************************
+
+ ioprocs.h
+
+ I/O interfaces
+
+***************************************************************************/
+
+#include "ioprocs.h"
+
+#include "corefile.h"
+#include "ioprocsfill.h"
+
+#include "osdfile.h"
+
+#include <algorithm>
+#include <cassert>
+#include <cerrno>
+#include <cstring>
+#include <iterator>
+#include <limits>
+#include <type_traits>
+
+
+namespace util {
+
+namespace {
+
+// helper for holding a block of memory and deallocating it (or not) as necessary
+
+template <typename T, bool Owned>
+class ram_adapter_base : public virtual random_access
+{
+public:
+ virtual ~ram_adapter_base()
+ {
+ if constexpr (Owned)
+ std::free(m_data);
+ }
+
+ virtual std::error_condition seek(std::int64_t offset, int whence) noexcept override
+ {
+ switch (whence)
+ {
+ case SEEK_SET:
+ if (0 > offset)
+ return std::errc::invalid_argument;
+ m_pointer = std::uint64_t(offset);
+ return std::error_condition();
+
+ case SEEK_CUR:
+ if (0 > offset)
+ {
+ if (std::uint64_t(-offset) > m_pointer)
+ return std::errc::invalid_argument;
+ }
+ else if ((std::numeric_limits<std::uint64_t>::max() - offset) < m_pointer)
+ {
+ return std::errc::invalid_argument;
+ }
+ m_pointer += offset;
+ return std::error_condition();
+
+ case SEEK_END:
+ if (0 > offset)
+ {
+ if (std::uint64_t(-offset) > m_size)
+ return std::errc::invalid_argument;
+ }
+ else if ((std::numeric_limits<std::uint64_t>::max() - offset) < m_size)
+ {
+ return std::errc::invalid_argument;
+ }
+ m_pointer = std::uint64_t(m_size) + offset;
+ return std::error_condition();
+
+ default:
+ return std::errc::invalid_argument;
+ }
+ }
+
+ virtual std::error_condition tell(std::uint64_t &result) noexcept override
+ {
+ result = m_pointer;
+ return std::error_condition();
+ }
+
+ virtual std::error_condition length(std::uint64_t &result) noexcept override
+ {
+ if (std::numeric_limits<uint64_t>::max() < m_size)
+ return std::errc::file_too_large;
+
+ result = m_size;
+ return std::error_condition();
+ }
+
+protected:
+ template <typename U>
+ ram_adapter_base(U *data, std::size_t size) noexcept : m_data(reinterpret_cast<T>(data)), m_size(size)
+ {
+ static_assert(sizeof(*m_data) == 1U, "Element type must be byte-sized");
+ assert(m_data || !m_size);
+ }
+
+ T m_data;
+ std::uint64_t m_pointer = 0U;
+ std::size_t m_size;
+};
+
+
+// RAM read implementation
+
+template <typename T, bool Owned>
+class ram_read_adapter : public ram_adapter_base<T, Owned>, public virtual random_read
+{
+public:
+ template <typename U>
+ ram_read_adapter(U *data, std::size_t size) noexcept : ram_adapter_base<T, Owned>(data, size)
+ {
+ }
+
+ virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ do_read(this->m_pointer, buffer, length, actual);
+ this->m_pointer += actual;
+ return std::error_condition();
+ }
+
+ virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ do_read(offset, buffer, length, actual);
+ return std::error_condition();
+ }
+
+private:
+ void do_read(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) const noexcept
+ {
+ if ((offset < this->m_size) && length)
+ {
+ actual = std::min(std::size_t(this->m_size - offset), length);
+ if constexpr (Owned)
+ std::memcpy(buffer, this->m_data + offset, actual);
+ else
+ std::memmove(buffer, this->m_data + offset, actual);
+ }
+ else
+ {
+ actual = 0U;
+ }
+ }
+};
+
+
+// helper for holding a stdio FILE and closing it (or not) as necessary
+
+class stdio_adapter_base : public virtual random_access
+{
+public:
+ virtual ~stdio_adapter_base()
+ {
+ if (m_close)
+ std::fclose(m_file);
+ }
+
+ virtual std::error_condition seek(std::int64_t offset, int whence) noexcept override
+ {
+ if ((std::numeric_limits<long>::max() < offset) || (std::numeric_limits<long>::min() > offset))
+ return std::errc::invalid_argument;
+ else if (!std::fseek(m_file, long(offset), whence))
+ return std::error_condition();
+ else
+ return std::error_condition(errno, std::generic_category());
+ }
+
+ virtual std::error_condition tell(std::uint64_t &result) noexcept override
+ {
+ long const pos = std::ftell(m_file);
+ if (0 > pos)
+ return std::error_condition(errno, std::generic_category());
+ result = static_cast<unsigned long>(pos);
+ return std::error_condition();
+ }
+
+ virtual std::error_condition length(std::uint64_t &result) noexcept override
+ {
+ std::fpos_t oldpos;
+ if (std::fgetpos(m_file, &oldpos))
+ return std::error_condition(errno, std::generic_category());
+
+ long endpos = -1;
+ if (!std::fseek(m_file, 0, SEEK_END))
+ {
+ m_dangling_read = m_dangling_write = false;
+ endpos = std::ftell(m_file);
+ }
+ std::error_condition err;
+ if (0 > endpos)
+ err.assign(errno, std::generic_category());
+ else if (std::numeric_limits<std::uint64_t>::max() < static_cast<unsigned long>(endpos))
+ err = std::errc::file_too_large;
+ else
+ result = static_cast<unsigned long>(endpos);
+
+ if (!std::fsetpos(m_file, &oldpos))
+ m_dangling_read = m_dangling_write = false;
+ else if (!err)
+ err.assign(errno, std::generic_category());
+
+ return err;
+ }
+
+protected:
+ stdio_adapter_base(FILE *file, bool close) noexcept : m_file(file), m_close(close)
+ {
+ assert(m_file);
+ }
+
+ FILE *file() noexcept
+ {
+ return m_file;
+ }
+
+private:
+ FILE *const m_file;
+ bool const m_close;
+
+protected:
+ bool m_dangling_read = true, m_dangling_write = true;
+};
+
+
+// stdio read implementation
+
+class stdio_read_adapter : public stdio_adapter_base, public virtual random_read
+{
+public:
+ stdio_read_adapter(FILE *file, bool close) noexcept : stdio_adapter_base(file, close)
+ {
+ }
+
+ virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ if (m_dangling_write)
+ {
+ if (std::fflush(file()))
+ {
+ std::clearerr(file());
+ actual = 0U;
+ return std::error_condition(errno, std::generic_category());
+ }
+ m_dangling_write = false;
+ }
+
+ actual = std::fread(buffer, sizeof(std::uint8_t), length, file());
+ m_dangling_read = true;
+ if (length != actual)
+ {
+ if (std::ferror(file()))
+ {
+ std::clearerr(file());
+ return std::error_condition(errno, std::generic_category());
+ }
+ else if (std::feof(file()))
+ {
+ m_dangling_read = false;
+ }
+ }
+
+ return std::error_condition();
+ }
+
+ virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ actual = 0U;
+
+ if (static_cast<unsigned long>(std::numeric_limits<long>::max()) < offset)
+ return std::errc::invalid_argument;
+
+ std::fpos_t oldpos;
+ if (std::fgetpos(file(), &oldpos))
+ return std::error_condition(errno, std::generic_category());
+
+ std::error_condition err;
+ if (std::fseek(file(), long(static_cast<unsigned long>(offset)), SEEK_SET))
+ {
+ err.assign(errno, std::generic_category());
+ }
+ else
+ {
+ m_dangling_write = false;
+ actual = std::fread(buffer, sizeof(std::uint8_t), length, file());
+ m_dangling_read = true;
+ if (length != actual)
+ {
+ if (std::ferror(file()))
+ {
+ err.assign(errno, std::generic_category());
+ std::clearerr(file());
+ }
+ else if (std::feof(file()))
+ {
+ m_dangling_read = false;
+ }
+ }
+ }
+
+ if (!std::fsetpos(file(), &oldpos))
+ m_dangling_read = m_dangling_write = false;
+ else if (!err)
+ err.assign(errno, std::generic_category());
+
+ return err;
+ }
+};
+
+
+// stdio read/write implementation
+
+class stdio_read_write_adapter : public stdio_read_adapter, public random_read_write
+{
+public:
+ using stdio_read_adapter::stdio_read_adapter;
+
+ virtual std::error_condition finalize() noexcept override
+ {
+ return std::error_condition();
+ }
+
+ virtual std::error_condition flush() noexcept override
+ {
+ if (std::fflush(file()))
+ {
+ std::clearerr(file());
+ return std::error_condition(errno, std::generic_category());
+ }
+ m_dangling_write = false;
+ return std::error_condition();
+ }
+
+ virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ if (m_dangling_read)
+ {
+ if (std::fseek(file(), 0, SEEK_CUR))
+ {
+ actual = 0U;
+ return std::error_condition(errno, std::generic_category());
+ }
+ m_dangling_read = false;
+ }
+
+ actual = std::fwrite(buffer, sizeof(std::uint8_t), length, file());
+ m_dangling_write = true;
+ if (length != actual)
+ {
+ std::clearerr(file());
+ return std::error_condition(errno, std::generic_category());
+ }
+
+ return std::error_condition();
+ }
+
+ virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ actual = 0U;
+
+ if (static_cast<unsigned long>(std::numeric_limits<long>::max()) < offset)
+ return std::errc::invalid_argument;
+
+ std::fpos_t oldpos;
+ if (std::fgetpos(file(), &oldpos))
+ return std::error_condition(errno, std::generic_category());
+
+ std::error_condition err;
+ if (std::fseek(file(), long(static_cast<unsigned long>(offset)), SEEK_SET))
+ {
+ err.assign(errno, std::generic_category());
+ }
+ else
+ {
+ m_dangling_read = false;
+ actual = std::fwrite(buffer, sizeof(std::uint8_t), length, file());
+ m_dangling_write = true;
+ if (length != actual)
+ {
+ err.assign(errno, std::generic_category());
+ std::clearerr(file());
+ }
+ }
+
+ if (!std::fsetpos(file(), &oldpos))
+ m_dangling_read = m_dangling_write = false;
+ else if (!err)
+ err.assign(errno, std::generic_category());
+
+ return err;
+ }
+};
+
+
+// stdio helper that fills space when writing past the end-of-file
+
+class stdio_read_write_filler : public random_read_fill_wrapper<stdio_read_write_adapter>
+{
+public:
+ stdio_read_write_filler(FILE *file, bool close, std::uint8_t fill) noexcept : random_read_fill_wrapper<stdio_read_write_adapter>(file, close)
+ {
+ set_filler(fill);
+ }
+
+ virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ actual = 0U;
+
+ long const offset = std::ftell(file());
+ if (0 > offset)
+ return std::error_condition(errno, std::generic_category());
+
+ if (std::fseek(file(), 0, SEEK_END))
+ {
+ std::error_condition err(errno, std::generic_category());
+ if (!std::fseek(file(), offset, SEEK_SET))
+ m_dangling_read = m_dangling_write = false;
+ return err;
+ }
+ m_dangling_read = m_dangling_write = false;
+ long endpos = std::ftell(file());
+ if (0 > endpos)
+ {
+ std::error_condition err(errno, std::generic_category());
+ std::fseek(file(), offset, SEEK_SET);
+ return err;
+ }
+
+ if (offset > endpos)
+ {
+ std::uint8_t block[1024];
+ std::fill_n(
+ block,
+ std::min<std::common_type_t<std::size_t, std::uint64_t, long> >(std::size(block), offset - endpos),
+ get_filler());
+ do
+ {
+ std::size_t const chunk = std::min<std::common_type_t<std::size_t, std::uint64_t, long> >(std::size(block), offset - endpos);
+ std::size_t const filled = std::fwrite(block, sizeof(block[0]), chunk, file());
+ endpos += filled;
+ m_dangling_write = true;
+ if (chunk != filled)
+ {
+ std::error_condition err(errno, std::generic_category());
+ std::clearerr(file());
+ if (!std::fseek(file(), offset, SEEK_SET))
+ m_dangling_write = false;
+ return err;
+ }
+ }
+ while (static_cast<unsigned long>(endpos) < offset);
+ }
+ else if ((offset < endpos) && std::fseek(file(), offset, SEEK_SET))
+ {
+ return std::error_condition(errno, std::generic_category());
+ }
+
+ actual = std::fwrite(buffer, sizeof(std::uint8_t), length, file());
+ m_dangling_write = true;
+ if (length != actual)
+ {
+ std::clearerr(file());
+ return std::error_condition(errno, std::generic_category());
+ }
+
+ return std::error_condition();
+ }
+
+ virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ actual = 0U;
+
+ if (static_cast<unsigned long>(std::numeric_limits<long>::max()) < offset)
+ return std::errc::invalid_argument;
+
+ std::fpos_t oldpos;
+ if (std::fgetpos(file(), &oldpos))
+ return std::error_condition(errno, std::generic_category());
+
+ std::error_condition err;
+ if (std::fseek(file(), 0, SEEK_END))
+ {
+ err.assign(errno, std::generic_category());
+ }
+ else
+ {
+ m_dangling_read = m_dangling_write = false;
+ long endpos = std::ftell(file());
+ if (0 > endpos)
+ {
+ err.assign(errno, std::generic_category());
+ }
+ else if (static_cast<unsigned long>(endpos) > offset)
+ {
+ if (std::fseek(file(), long(static_cast<unsigned long>(offset)), SEEK_SET))
+ err.assign(errno, std::generic_category());
+ }
+ else if (static_cast<unsigned long>(endpos) < offset)
+ {
+ std::uint8_t block[1024];
+ std::fill_n(
+ block,
+ std::min<std::common_type_t<std::size_t, std::uint64_t, long> >(std::size(block), offset - endpos),
+ get_filler());
+ do
+ {
+ std::size_t const chunk = std::min<std::common_type_t<std::size_t, std::uint64_t, long> >(std::size(block), offset - endpos);
+ std::size_t const filled = std::fwrite(block, sizeof(block[0]), chunk, file());
+ endpos += filled;
+ m_dangling_write = true;
+ if (chunk != filled)
+ {
+ err.assign(errno, std::generic_category());
+ std::clearerr(file());
+ }
+ }
+ while (!err && (static_cast<unsigned long>(endpos) < offset));
+ }
+ }
+
+ if (!err)
+ {
+ actual = std::fwrite(buffer, sizeof(std::uint8_t), length, file());
+ m_dangling_write = true;
+ if (length != actual)
+ {
+ err.assign(errno, std::generic_category());
+ std::clearerr(file());
+ }
+ }
+
+ if (!std::fsetpos(file(), &oldpos))
+ m_dangling_read = m_dangling_write = false;
+ else if (!err)
+ err.assign(errno, std::generic_category());
+
+ return err;
+ }
+};
+
+
+// helper class for holding an osd_file and closing it (or not) as necessary
+
+class osd_file_adapter_base : public virtual random_access
+{
+public:
+ virtual ~osd_file_adapter_base()
+ {
+ if (m_close)
+ delete m_file;
+ }
+
+ virtual std::error_condition seek(std::int64_t offset, int whence) noexcept override
+ {
+ switch (whence)
+ {
+ case SEEK_SET:
+ if (0 > offset)
+ return std::errc::invalid_argument;
+ m_pointer = std::uint64_t(offset);
+ return std::error_condition();
+
+ case SEEK_CUR:
+ if (0 > offset)
+ {
+ if (std::uint64_t(-offset) > m_pointer)
+ return std::errc::invalid_argument;
+ }
+ else if ((std::numeric_limits<std::uint64_t>::max() - offset) < m_pointer)
+ {
+ return std::errc::invalid_argument;
+ }
+ m_pointer += offset;
+ return std::error_condition();
+
+ // TODO: add SEEK_END when osd_file can support it - should it return a different error?
+ default:
+ return std::errc::invalid_argument;
+ }
+ }
+
+ virtual std::error_condition tell(std::uint64_t &result) noexcept override
+ {
+ result = m_pointer;
+ return std::error_condition();
+ }
+
+ virtual std::error_condition length(std::uint64_t &result) noexcept override
+ {
+ // not supported by osd_file
+ return std::errc::not_supported; // TODO: revisit this error code
+ }
+
+protected:
+ osd_file_adapter_base(osd_file::ptr &&file) noexcept : m_file(file.release()), m_close(true)
+ {
+ assert(m_file);
+ }
+
+ osd_file_adapter_base(osd_file &file) noexcept : m_file(&file), m_close(false)
+ {
+ }
+
+ osd_file &file() noexcept
+ {
+ return *m_file;
+ }
+
+ std::uint64_t m_pointer = 0U;
+
+private:
+ osd_file *const m_file;
+ bool const m_close;
+};
+
+
+// osd_file read implementation
+
+class osd_file_read_adapter : public osd_file_adapter_base, public virtual random_read
+{
+public:
+ osd_file_read_adapter(osd_file::ptr &&file) noexcept : osd_file_adapter_base(std::move(file))
+ {
+ }
+
+ osd_file_read_adapter(osd_file &file) noexcept : osd_file_adapter_base(file)
+ {
+ }
+
+ virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ // TODO: should the client have to deal with reading less than expected even if EOF isn't hit?
+ if (std::numeric_limits<std::uint32_t>::max() < length)
+ {
+ actual = 0U;
+ return std::errc::invalid_argument;
+ }
+
+ // actual length not valid on error
+ std::uint32_t count;
+ std::error_condition err = file().read(buffer, m_pointer, std::uint32_t(length), count);
+ if (!err)
+ {
+ m_pointer += count;
+ actual = std::size_t(count);
+ }
+ else
+ {
+ actual = 0U;
+ }
+ return err;
+ }
+
+ virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ // TODO: should the client have to deal with reading less than expected even if EOF isn't hit?
+ if (std::numeric_limits<std::uint32_t>::max() < length)
+ {
+ actual = 0U;
+ return std::errc::invalid_argument;
+ }
+
+ // actual length not valid on error
+ std::uint32_t count;
+ std::error_condition err = file().read(buffer, offset, std::uint32_t(length), count);
+ if (!err)
+ actual = std::size_t(count);
+ else
+ actual = 0U;
+ return err;
+ }
+};
+
+
+// osd_file read/write implementation
+
+class osd_file_read_write_adapter : public osd_file_read_adapter, public random_read_write
+{
+public:
+ using osd_file_read_adapter::osd_file_read_adapter;
+
+ virtual std::error_condition finalize() noexcept override
+ {
+ return std::error_condition();
+ }
+
+ virtual std::error_condition flush() noexcept override
+ {
+ return file().flush();
+ }
+
+ virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ actual = 0U;
+ while (length)
+ {
+ // actual length not valid on error
+ std::uint32_t const chunk = std::min<std::common_type_t<std::uint32_t, std::size_t> >(std::numeric_limits<std::uint32_t>::max(), length);
+ std::uint32_t written;
+ std::error_condition err = file().write(buffer, m_pointer, chunk, written);
+ if (err)
+ return err;
+ m_pointer += written;
+ buffer = reinterpret_cast<std::uint8_t const *>(buffer) + written;
+ length -= written;
+ actual += written;
+ }
+ return std::error_condition();
+ }
+
+ virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ actual = 0U;
+ while (length)
+ {
+ // actual length not valid on error
+ std::uint32_t const chunk = std::min<std::common_type_t<std::uint32_t, std::size_t> >(std::numeric_limits<std::uint32_t>::max(), length);
+ std::uint32_t written;
+ std::error_condition err = file().write(buffer, offset, chunk, written);
+ if (err)
+ return err;
+ offset += written;
+ buffer = reinterpret_cast<std::uint8_t const *>(buffer) + written;
+ length -= written;
+ actual += written;
+ }
+ return std::error_condition();
+ }
+};
+
+
+// helper class for holding a core_file and closing it (or not) as necessary
+
+class core_file_adapter_base : public virtual random_access
+{
+public:
+ virtual ~core_file_adapter_base()
+ {
+ if (m_close)
+ delete m_file;
+ }
+
+ virtual std::error_condition seek(std::int64_t offset, int whence) noexcept override
+ {
+ if (!m_file->seek(offset, whence))
+ return std::error_condition();
+ else
+ return std::errc::invalid_argument; // TODO: better error reporting for core_file
+ }
+
+ virtual std::error_condition tell(std::uint64_t &result) noexcept override
+ {
+ // no error reporting
+ result = m_file->tell();
+ return std::error_condition();
+ }
+
+ virtual std::error_condition length(std::uint64_t &result) noexcept override
+ {
+ // no error reporting
+ result = m_file->size();
+ return std::error_condition();
+ }
+
+protected:
+ core_file_adapter_base(core_file::ptr &&file) noexcept : m_file(file.release()), m_close(true)
+ {
+ assert(m_file);
+ }
+
+ core_file_adapter_base(core_file &file) noexcept : m_file(&file), m_close(false)
+ {
+ }
+
+ core_file &file() noexcept
+ {
+ return *m_file;
+ }
+
+private:
+ core_file *const m_file;
+ bool const m_close;
+};
+
+
+// core_file read implementation
+
+class core_file_read_adapter : public core_file_adapter_base, public virtual random_read
+{
+public:
+ core_file_read_adapter(core_file::ptr &&file) noexcept : core_file_adapter_base(std::move(file))
+ {
+ }
+
+ core_file_read_adapter(core_file &file) noexcept : core_file_adapter_base(file)
+ {
+ }
+
+ virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ // TODO: should the client have to deal with reading less than expected even if EOF isn't hit?
+ if (std::numeric_limits<std::uint32_t>::max() < length)
+ {
+ actual = 0U;
+ return std::errc::invalid_argument;
+ }
+
+ // no way to distinguish between EOF and error
+ actual = file().read(buffer, std::uint32_t(length));
+ return std::error_condition();
+ }
+
+ virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ actual = 0U;
+
+ // TODO: should the client have to deal with reading less than expected even if EOF isn't hit?
+ if (std::numeric_limits<std::uint32_t>::max() < length)
+ return std::errc::invalid_argument;
+
+ // no error reporting for tell
+ std::uint64_t const oldpos = file().tell();
+ if (file().seek(offset, SEEK_SET))
+ {
+ file().seek(oldpos, SEEK_SET);
+ return std::errc::invalid_argument; // TODO: better error reporting for core_file
+ }
+
+ // no way to distinguish between EOF and error
+ actual = file().read(buffer, std::uint32_t(length));
+
+ if (!file().seek(oldpos, SEEK_SET))
+ return std::error_condition();
+ else
+ return std::errc::invalid_argument; // TODO: better error reporting for core_file
+ }
+};
+
+
+// core_file read/write implementation
+
+class core_file_read_write_adapter : public core_file_read_adapter, public random_read_write
+{
+public:
+ using core_file_read_adapter::core_file_read_adapter;
+
+ virtual std::error_condition finalize() noexcept override
+ {
+ return std::error_condition();
+ }
+
+ virtual std::error_condition flush() noexcept override
+ {
+ return file().flush();
+ }
+
+ virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ actual = 0U;
+ while (length)
+ {
+ std::uint32_t const chunk = std::min<std::common_type_t<std::uint32_t, std::size_t> >(std::numeric_limits<std::uint32_t>::max(), length);
+ std::uint32_t const written = file().write(buffer, chunk);
+ actual += written;
+ if (written < chunk)
+ return std::errc::io_error; // TODO: better error reporting for core_file
+ buffer = reinterpret_cast<std::uint8_t const *>(buffer) + written;
+ length -= written;
+ }
+ return std::error_condition();
+ }
+
+ virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ actual = 0U;
+
+ // no error reporting for tell
+ std::uint64_t const oldpos = file().tell();
+ if (file().seek(offset, SEEK_SET))
+ {
+ file().seek(oldpos, SEEK_SET);
+ return std::errc::invalid_argument; // TODO: better error reporting for core_file
+ }
+
+ std::error_condition err;
+ while (!err && length)
+ {
+ std::uint32_t const chunk = std::min<std::common_type_t<std::uint32_t, std::size_t> >(std::numeric_limits<std::uint32_t>::max(), length);
+ std::uint32_t const written = file().write(buffer, chunk);
+ actual += written;
+ if (written < chunk)
+ {
+ err = std::errc::io_error; // TODO: better error reporting for core_file
+ }
+ else
+ {
+ buffer = reinterpret_cast<std::uint8_t const *>(buffer) + written;
+ length -= written;
+ }
+ }
+
+ if (!file().seek(oldpos, SEEK_SET) || err)
+ return err;
+ else
+ return std::errc::invalid_argument; // TODO: better error reporting for core_file
+ }
+};
+
+
+// core_file helper that fills space when writing past the end-of-file
+
+class core_file_read_write_filler : public random_read_fill_wrapper<core_file_read_write_adapter>
+{
+public:
+ core_file_read_write_filler(core_file::ptr &&file, std::uint8_t fill) noexcept : random_read_fill_wrapper<core_file_read_write_adapter>(std::move(file))
+ {
+ set_filler(fill);
+ }
+
+ core_file_read_write_filler(core_file &file, std::uint8_t fill) noexcept : random_read_fill_wrapper<core_file_read_write_adapter>(file)
+ {
+ set_filler(fill);
+ }
+
+ virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ // no error reporting for tell or size
+ std::uint64_t const offset = file().tell();
+ std::uint64_t endpos = file().size();
+ if (endpos < offset)
+ {
+ if (file().seek(endpos, SEEK_SET))
+ {
+ file().seek(offset, SEEK_SET);
+ actual = 0U;
+ return std::errc::invalid_argument; // TODO: better error reporting for core_file
+ }
+ std::uint8_t block[1024];
+ std::fill_n(
+ block,
+ std::min<std::common_type_t<std::size_t, std::uint64_t> >(std::size(block), offset - endpos),
+ get_filler());
+ do
+ {
+ std::uint32_t const chunk = std::min<std::common_type_t<std::size_t, std::uint64_t> >(sizeof(block), offset - endpos);
+ std::uint32_t const filled = file().write(block, chunk);
+ endpos += filled;
+ if (chunk != filled)
+ {
+ file().seek(offset, SEEK_SET);
+ actual = 0U;
+ return std::errc::io_error; // TODO: better error reporting for core_file
+ }
+ }
+ while (endpos < offset);
+ }
+
+ return core_file_read_write_adapter::write(buffer, length, actual);
+ }
+
+ virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ actual = 0U;
+
+ // no error reporting for tell
+ std::uint64_t const oldpos = file().tell();
+ if (file().seek(0, SEEK_END))
+ {
+ file().seek(oldpos, SEEK_SET);
+ return std::errc::invalid_argument; // TODO: better error reporting for core_file
+ }
+ std::uint64_t endpos = file().tell();
+
+ std::error_condition err;
+ if (endpos > offset)
+ {
+ if (file().seek(offset, SEEK_SET))
+ err = std::errc::invalid_argument; // TODO: better error reporting for core_file
+ }
+ else if (endpos < offset)
+ {
+ std::uint8_t block[1024];
+ std::fill_n(
+ block,
+ std::min<std::common_type_t<std::size_t, std::uint64_t> >(std::size(block), offset - endpos),
+ get_filler());
+ do
+ {
+ std::uint32_t const chunk = std::min<std::common_type_t<std::size_t, std::uint64_t> >(sizeof(block), offset - endpos);
+ std::uint32_t const filled = file().write(block, chunk);
+ endpos += filled;
+ if (chunk != filled)
+ err = std::errc::io_error; // TODO: better error reporting for core_file
+ }
+ while (!err && (endpos < offset));
+ }
+
+ while (!err && length)
+ {
+ std::uint32_t const chunk = std::min<std::common_type_t<std::uint32_t, std::size_t> >(std::numeric_limits<std::uint32_t>::max(), length);
+ std::uint32_t const written = file().write(buffer, chunk);
+ actual += written;
+ if (written < chunk)
+ {
+ err = std::errc::io_error; // TODO: better error reporting for core_file
+ }
+ else
+ {
+ buffer = reinterpret_cast<std::uint8_t const *>(buffer) + written;
+ length -= written;
+ }
+ }
+
+ if (!file().seek(oldpos, SEEK_SET) || err)
+ return err;
+ else
+ return std::errc::invalid_argument; // TODO: better error reporting for core_file
+ }
+};
+
+} // anonymous namespace
+
+
+// creating RAM read adapters
+
+random_read::ptr ram_read(void const *data, std::size_t size) noexcept
+{
+ random_read::ptr result;
+ if (data || !size)
+ result.reset(new (std::nothrow) ram_read_adapter<std::uint8_t const *const, false>(data, size));
+ return result;
+}
+
+random_read::ptr ram_read(void const *data, std::size_t size, std::uint8_t filler) noexcept
+{
+ std::unique_ptr<random_read_fill_wrapper<ram_read_adapter<std::uint8_t const *const, false> > > result;
+ if (data || !size)
+ result.reset(new (std::nothrow) decltype(result)::element_type(data, size));
+ if (result)
+ result->set_filler(filler);
+ return result;
+}
+
+random_read::ptr ram_read_copy(void const *data, std::size_t size) noexcept
+{
+ random_read::ptr result;
+ void *const copy = size ? std::malloc(size) : nullptr;
+ if (copy)
+ std::memcpy(copy, data, size);
+ if (copy || !size)
+ result.reset(new (std::nothrow) ram_read_adapter<std::uint8_t *const, true>(copy, size));
+ if (!result)
+ std::free(copy);
+ return result;
+}
+
+random_read::ptr ram_read_copy(void const *data, std::size_t size, std::uint8_t filler) noexcept
+{
+ std::unique_ptr<random_read_fill_wrapper<ram_read_adapter<std::uint8_t *const, true> > > result;
+ void *const copy = size ? std::malloc(size) : nullptr;
+ if (copy)
+ std::memcpy(copy, data, size);
+ if (copy || !size)
+ result.reset(new (std::nothrow) decltype(result)::element_type(copy, size));
+ if (!result)
+ std::free(copy);
+ return result;
+}
+
+
+// creating stdio read adapters
+
+random_read::ptr stdio_read(FILE *file) noexcept
+{
+ random_read::ptr result;
+ if (file)
+ result.reset(new (std::nothrow) stdio_read_adapter(file, true));
+ return result;
+}
+
+random_read::ptr stdio_read(FILE *file, std::uint8_t filler) noexcept
+{
+ std::unique_ptr<random_read_fill_wrapper<stdio_read_adapter> > result;
+ if (file)
+ result.reset(new (std::nothrow) decltype(result)::element_type(file, true));
+ if (result)
+ result->set_filler(filler);
+ return result;
+}
+
+random_read::ptr stdio_read_noclose(FILE *file) noexcept
+{
+ random_read::ptr result;
+ if (file)
+ result.reset(new (std::nothrow) stdio_read_adapter(file, false));
+ return result;
+}
+
+random_read::ptr stdio_read_noclose(FILE *file, std::uint8_t filler) noexcept
+{
+ std::unique_ptr<random_read_fill_wrapper<stdio_read_adapter> > result;
+ if (file)
+ result.reset(new (std::nothrow) decltype(result)::element_type(file, false));
+ if (result)
+ result->set_filler(filler);
+ return result;
+}
+
+
+// creating stdio read/write adapters
+
+random_read_write::ptr stdio_read_write(FILE *file) noexcept
+{
+ random_read_write::ptr result;
+ if (file)
+ result.reset(new (std::nothrow) stdio_read_write_adapter(file, true));
+ return result;
+}
+
+random_read_write::ptr stdio_read_write(FILE *file, std::uint8_t filler) noexcept
+{
+ random_read_write::ptr result;
+ if (file)
+ result.reset(new (std::nothrow) stdio_read_write_filler(file, true, filler));
+ return result;
+}
+
+random_read_write::ptr stdio_read_write_noclose(FILE *file) noexcept
+{
+ random_read_write::ptr result;
+ if (file)
+ result.reset(new (std::nothrow) stdio_read_write_adapter(file, false));
+ return result;
+}
+
+random_read_write::ptr stdio_read_write_noclose(FILE *file, std::uint8_t filler) noexcept
+{
+ random_read_write::ptr result;
+ if (file)
+ result.reset(new (std::nothrow) stdio_read_write_filler(file, false, filler));
+ return result;
+}
+
+
+// creating osd_file read adapters
+
+random_read::ptr osd_file_read(osd_file::ptr &&file) noexcept
+{
+ random_read::ptr result;
+ if (file)
+ result.reset(new (std::nothrow) osd_file_read_adapter(std::move(file)));
+ return result;
+}
+
+random_read::ptr osd_file_read(osd_file &file) noexcept
+{
+ return random_read::ptr(new (std::nothrow) osd_file_read_adapter(file));
+}
+
+
+// creating osd_file read/write adapters
+
+random_read_write::ptr osd_file_read_write(osd_file::ptr &&file) noexcept
+{
+ random_read_write::ptr result;
+ if (file)
+ result.reset(new (std::nothrow) osd_file_read_write_adapter(std::move(file)));
+ return result;
+}
+
+random_read_write::ptr osd_file_read_write(osd_file &file) noexcept
+{
+ return random_read_write::ptr(new (std::nothrow) osd_file_read_write_adapter(file));
+}
+
+
+// creating core_file read adapters
+
+random_read::ptr core_file_read(core_file::ptr &&file) noexcept
+{
+ random_read::ptr result;
+ if (file)
+ result.reset(new (std::nothrow) core_file_read_adapter(std::move(file)));
+ return result;
+}
+
+random_read::ptr core_file_read(core_file::ptr &&file, std::uint8_t filler) noexcept
+{
+ std::unique_ptr<random_read_fill_wrapper<core_file_read_adapter> > result;
+ if (file)
+ result.reset(new (std::nothrow) decltype(result)::element_type(std::move(file)));
+ if (result)
+ result->set_filler(filler);
+ return result;
+}
+
+random_read::ptr core_file_read(core_file &file) noexcept
+{
+ return random_read::ptr(new (std::nothrow) core_file_read_adapter(file));
+}
+
+random_read::ptr core_file_read(core_file &file, std::uint8_t filler) noexcept
+{
+ std::unique_ptr<random_read_fill_wrapper<core_file_read_adapter> > result;
+ result.reset(new (std::nothrow) decltype(result)::element_type(file));
+ if (result)
+ result->set_filler(filler);
+ return result;
+}
+
+
+// creating core_file read/write adapters
+
+random_read_write::ptr core_file_read_write(core_file::ptr &&file) noexcept
+{
+ random_read_write::ptr result;
+ if (file)
+ result.reset(new (std::nothrow) core_file_read_write_adapter(std::move(file)));
+ return result;
+}
+
+random_read_write::ptr core_file_read_write(core_file::ptr &&file, std::uint8_t filler) noexcept
+{
+ random_read_write::ptr result;
+ if (file)
+ result.reset(new (std::nothrow) core_file_read_write_filler(std::move(file), filler));
+ return result;
+}
+
+random_read_write::ptr core_file_read_write(core_file &file) noexcept
+{
+ return random_read_write::ptr(new (std::nothrow) core_file_read_write_adapter(file));
+}
+
+random_read_write::ptr core_file_read_write(core_file &file, std::uint8_t filler) noexcept
+{
+ return random_read_write::ptr(new (std::nothrow) core_file_read_write_filler(file, filler));
+}
+
+} // namespace util
diff --git a/src/lib/util/ioprocs.h b/src/lib/util/ioprocs.h
new file mode 100644
index 00000000000..0a4e5c384f0
--- /dev/null
+++ b/src/lib/util/ioprocs.h
@@ -0,0 +1,268 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/***************************************************************************
+
+ ioprocs.h
+
+ I/O interfaces
+
+***************************************************************************/
+#ifndef MAME_LIB_UTIL_IOPROCS_H
+#define MAME_LIB_UTIL_IOPROCS_H
+
+#pragma once
+
+#include "utilfwd.h"
+
+#include <cstdint>
+#include <cstdio>
+#include <cstdlib>
+#include <memory>
+#include <system_error>
+
+
+// FIXME: make a proper place for OSD forward declarations
+class osd_file;
+
+
+namespace util {
+
+/// \defgroup ioprocs Generic I/O interfaces
+/// \{
+
+/// \brief Interface to an input stream
+///
+/// Represents a stream producing a sequence of bytes with no further
+/// structure.
+/// \sa write_stream read_write_stream random_read
+class read_stream
+{
+public:
+ using ptr = std::unique_ptr<read_stream>;
+
+ virtual ~read_stream() = default;
+
+ /// \brief Read from the current position in the stream
+ ///
+ /// Reads up to the specified number of bytes from the stream into
+ /// the supplied buffer. May read less than the requested number of
+ /// bytes if the end of the stream is reached or an error occurs.
+ /// If the stream supports seeking, reading starts at the current
+ /// position in the stream, and the current position is incremented
+ /// by the number of bytes read.
+ /// \param [out] buffer Destination buffer. Must be large enough to
+ /// hold the requested number of bytes.
+ /// \param [in] length Maximum number of bytes to read.
+ /// \param [out] actual Number of bytes actually read. Will always
+ /// be less than or equal to the requested length.
+ /// \return An error condition if reading stopped due to an error.
+ virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept = 0;
+};
+
+
+/// \brief Interface to an output stream
+///
+/// Represents a stream that accepts a sequence of bytes with no further
+/// structure.
+/// \sa read_stream read_write_stream random_write
+class write_stream
+{
+public:
+ using ptr = std::unique_ptr<write_stream>;
+
+ virtual ~write_stream() = default;
+
+ /// \brief Finish writing data
+ ///
+ /// Performs any tasks necessary to finish writing data to the
+ /// stream and guarantee that the written data can be read in its
+ /// entirety. Further writes may not be possible.
+ /// \return An error condition if the operation fails.
+ virtual std::error_condition finalize() noexcept = 0;
+
+ /// \brief Flush application-side caches
+ ///
+ /// Flushes any caches to the underlying stream. Success does not
+ /// guarantee that data has reached persistent storage.
+ /// \return An error condition if flushing caches fails.
+ virtual std::error_condition flush() noexcept = 0;
+
+ /// \brief Write at the current position in the stream
+ ///
+ /// Writes up to the specified number of bytes from the supplied
+ /// buffer to the stream. May write less than the requested number
+ /// of bytes if an error occurs. If the stream supports seeking,
+ /// writing starts at the current position in the stream, and the
+ /// current position is incremented by the number of bytes written.
+ /// \param [in] buffer Buffer containing the data to write. Must
+ /// contain at least the specified number of bytes.
+ /// \param [in] length Number of bytes to write.
+ /// \param [out] actual Number of bytes actually written. Will
+ /// always be less than or equal to the requested length.
+ /// \return An error condition if writing stopped due to an error.
+ virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept = 0;
+};
+
+
+/// \brief Interface to an I/O stream
+///
+/// Represents an object that acts as both a source of and sink for byte
+/// sequences.
+/// \sa read_stream write_stream random_read_write
+class read_write_stream : public virtual read_stream, public virtual write_stream
+{
+public:
+ using ptr = std::unique_ptr<read_write_stream>;
+};
+
+
+/// \brief Interface to a byte sequence that supports seeking
+///
+/// Provides an interface for controlling the position within a byte
+/// sequence that supports seeking.
+/// \sa random_read random_write random_read_write
+class random_access
+{
+public:
+ virtual ~random_access() = default;
+
+ /// \brief Set the position in the stream
+ ///
+ /// Sets the position for the next read or write operation. It may
+ /// be possible to set the position beyond the end of the stream.
+ /// \param [in] offset The offset in bytes, relative to the position
+ /// specified by the whence parameter.
+ /// \param [in] whence One of SEEK_SET, SEEK_CUR or SEEK_END, to
+ /// interpret the offset parameter relative to the beginning of
+ /// the stream, the current position in the stream, or the end of
+ /// the stream, respectively.
+ /// \return An error condition of the operation failed.
+ virtual std::error_condition seek(std::int64_t offset, int whence) noexcept = 0;
+
+ /// \brief Get the current position in the stream
+ ///
+ /// Gets the position in the stream for the next read or write
+ /// operation. The position may be beyond the end of the stream.
+ /// \param [out] result The position in bytes relative to the
+ /// beginning of the stream. Not valid if the operation fails.
+ /// \return An error condition if the operation failed.
+ virtual std::error_condition tell(std::uint64_t &result) noexcept = 0;
+
+ /// \brief Get the length of the stream
+ ///
+ /// Gets the current length of the stream.
+ /// \param [out] result The lenght of the stream in bytes. Not
+ /// valid if the operation fails.
+ /// \return An error condtion if the operation failed.
+ virtual std::error_condition length(std::uint64_t &result) noexcept = 0;
+};
+
+
+/// \brief Interface to a random-access byte input sequence
+///
+/// Provides an interface for reading from aritrary positions within a
+/// byte sequence. No further structure is provided.
+/// \sa read_stream random_write random_read_write
+class random_read : public virtual read_stream, public virtual random_access
+{
+public:
+ using ptr = std::unique_ptr<random_read>;
+
+ /// \brief Read from specified position
+ ///
+ /// Reads up to the specified number of bytes into the supplied
+ /// buffer. If seeking is supported, reading starts at the
+ /// specified position and the current position is unaffected. May
+ /// read less than the requested number of bytes if the end of the
+ /// stream is encountered or an error occurs.
+ /// \param [in] offset The position to start reading from, specified
+ /// as a number of bytes from the beginning of the stream.
+ /// \param [out] buffer Destination buffer. Must be large enough to
+ /// hold the requested number of bytes.
+ /// \param [in] length Maximum number of bytes to read.
+ /// \param [out] actual Number of bytes actually read. Will always
+ /// be less than or equal to the requested length.
+ /// \return An error condition if seeking failed or reading stopped
+ /// due to an error.
+ virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept = 0;
+};
+
+
+/// \brief Interface to a random-access byte output sequence
+///
+/// Provides an interface for writing to arbitrary positions within a
+/// byte sequence. No further structure is provided.
+/// \sa write_stream random_read random_read_write
+class random_write : public virtual write_stream, public virtual random_access
+{
+public:
+ using ptr = std::unique_ptr<random_write>;
+
+ /// \brief Write at specified position
+ ///
+ /// Writes up to the specified number of bytes from the supplied
+ /// buffer. If seeking is supported, writing starts at the
+ /// specified position and the current position is unaffected. May
+ /// write less than the requested number of bytes if an error
+ /// occurs.
+ /// \param [in] offset The position to start writing at, specified
+ /// as a number of bytes from the beginning of the stream.
+ /// \param [in] buffer Buffer containing the data to write. Must
+ /// contain at least the specified number of bytes.
+ /// \param [in] length Number of bytes to write.
+ /// \param [out] actual Number of bytes actually written. Will
+ /// always be less than or equal to the requested length.
+ /// \return An error condition if seeking failed or writing stopped
+ /// due to an error.
+ virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept = 0;
+};
+
+
+/// \brief Interface to a random-access read/write byte sequence
+///
+/// Provides an interface for reading from and writing to arbitrary
+/// positions within a byte sequence. No further structure is provided.
+/// \sa random_read random_write read_write_stream
+class random_read_write : public read_write_stream, public virtual random_read, public virtual random_write
+{
+public:
+ using ptr = std::unique_ptr<random_read_write>;
+};
+
+/// \}
+
+
+random_read::ptr ram_read(void const *data, std::size_t size) noexcept;
+random_read::ptr ram_read(void const *data, std::size_t size, std::uint8_t filler) noexcept;
+random_read::ptr ram_read_copy(void const *data, std::size_t size) noexcept;
+random_read::ptr ram_read_copy(void const *data, std::size_t size, std::uint8_t filler) noexcept;
+
+random_read::ptr stdio_read(FILE *file) noexcept;
+random_read::ptr stdio_read(FILE *file, std::uint8_t filler) noexcept;
+random_read::ptr stdio_read_noclose(FILE *file) noexcept;
+random_read::ptr stdio_read_noclose(FILE *file, std::uint8_t filler) noexcept;
+
+random_read_write::ptr stdio_read_write(FILE *file) noexcept;
+random_read_write::ptr stdio_read_write(FILE *file, std::uint8_t filler) noexcept;
+random_read_write::ptr stdio_read_write_noclose(FILE *file) noexcept;
+random_read_write::ptr stdio_read_write_noclose(FILE *file, std::uint8_t filler) noexcept;
+
+random_read::ptr osd_file_read(std::unique_ptr<osd_file> &&file) noexcept;
+random_read::ptr osd_file_read(osd_file &file) noexcept;
+
+random_read_write::ptr osd_file_read_write(std::unique_ptr<osd_file> &&file) noexcept;
+random_read_write::ptr osd_file_read_write(osd_file &file) noexcept;
+
+random_read::ptr core_file_read(std::unique_ptr<core_file> &&file) noexcept;
+random_read::ptr core_file_read(std::unique_ptr<core_file> &&file, std::uint8_t filler) noexcept;
+random_read::ptr core_file_read(core_file &file) noexcept;
+random_read::ptr core_file_read(core_file &file, std::uint8_t filler) noexcept;
+
+random_read_write::ptr core_file_read_write(std::unique_ptr<core_file> &&file) noexcept;
+random_read_write::ptr core_file_read_write(std::unique_ptr<core_file> &&file, std::uint8_t filler) noexcept;
+random_read_write::ptr core_file_read_write(core_file &file) noexcept;
+random_read_write::ptr core_file_read_write(core_file &file, std::uint8_t filler) noexcept;
+
+} // namespace util
+
+#endif // MAME_LIB_UTIL_IOPROCS_H
diff --git a/src/lib/util/ioprocsfill.h b/src/lib/util/ioprocsfill.h
new file mode 100644
index 00000000000..e49b10687f0
--- /dev/null
+++ b/src/lib/util/ioprocsfill.h
@@ -0,0 +1,163 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/***************************************************************************
+
+ ioprocsfill.h
+
+ Wrappers that automatically fill extra space
+
+***************************************************************************/
+#ifndef MAME_LIB_UTIL_IOPROCSFILL_H
+#define MAME_LIB_UTIL_IOPROCSFILL_H
+
+#pragma once
+
+#include <algorithm>
+#include <cassert>
+#include <cstdint>
+#include <system_error>
+
+
+namespace util {
+
+template <std::uint8_t DefaultFiller>
+class fill_wrapper_base
+{
+public:
+ std::uint8_t get_filler() const noexcept
+ {
+ return m_filler;
+ }
+
+ void set_filler(std::uint8_t filler) noexcept
+ {
+ m_filler = filler;
+ }
+
+private:
+ std::uint8_t m_filler = DefaultFiller;
+};
+
+
+template <typename Base, std::uint8_t DefaultFiller = 0U>
+class read_stream_fill_wrapper : public Base, public virtual fill_wrapper_base<DefaultFiller>
+{
+public:
+ using Base::Base;
+
+ virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ std::error_condition err = Base::read(buffer, length, actual);
+ assert(length >= actual);
+ std::fill(
+ reinterpret_cast<std::uint8_t *>(buffer) + actual,
+ reinterpret_cast<std::uint8_t *>(buffer) + length,
+ fill_wrapper_base<DefaultFiller>::get_filler());
+ return err;
+ }
+};
+
+
+template <typename Base, std::uint8_t DefaultFiller = 0U>
+class random_read_fill_wrapper : public read_stream_fill_wrapper<Base, DefaultFiller>
+{
+public:
+ using read_stream_fill_wrapper<Base, DefaultFiller>::read_stream_fill_wrapper;
+
+ virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ std::error_condition err = Base::read_at(offset, buffer, length, actual);
+ assert(length >= actual);
+ std::fill(
+ reinterpret_cast<std::uint8_t *>(buffer) + actual,
+ reinterpret_cast<std::uint8_t *>(buffer) + length,
+ fill_wrapper_base<DefaultFiller>::get_filler());
+ return err;
+ }
+};
+
+
+template <typename Base, std::uint8_t DefaultFiller = 0U, std::size_t FillBlock = 1024U>
+class random_write_fill_wrapper : public Base, public virtual fill_wrapper_base<DefaultFiller>
+{
+public:
+ using Base::Base;
+
+ virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ std::error_condition err;
+ actual = 0U;
+
+ std::uint64_t offset;
+ std::uint64_t current;
+ err = Base::tell(offset);
+ if (err)
+ return err;
+ err = Base::length(current);
+ if (err)
+ return err;
+
+ if (current < offset)
+ {
+ std::uint64_t unfilled = offset - current;
+ std::uint8_t fill_buffer[FillBlock];
+ std::fill(
+ fill_buffer,
+ fill_buffer + std::min<std::common_type_t<std::size_t, std::uint64_t> >(FillBlock, unfilled),
+ fill_wrapper_base<DefaultFiller>::get_filler());
+ do
+ {
+ std::size_t const chunk = std::min<std::common_type_t<std::size_t, std::uint64_t> >(FillBlock, unfilled);
+ err = Base::write_at(current, fill_buffer, chunk, actual);
+ if (err)
+ {
+ actual = 0U;
+ return err;
+ }
+ current += chunk;
+ unfilled -= chunk;
+ }
+ while (unfilled);
+ }
+
+ return Base::write(buffer, length, actual);
+ }
+
+ virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ std::error_condition err;
+ std::uint64_t current;
+ err = Base::length(current);
+ if (!err && (current < offset))
+ {
+ std::uint64_t unfilled = offset - current;
+ std::uint8_t fill_buffer[FillBlock];
+ std::fill(
+ fill_buffer,
+ fill_buffer + std::min<std::common_type_t<std::size_t, std::uint64_t> >(FillBlock, unfilled),
+ fill_wrapper_base<DefaultFiller>::get_filler());
+ do
+ {
+ std::size_t const chunk = std::min<std::common_type_t<std::size_t, std::uint64_t> >(FillBlock, unfilled);
+ err = Base::write_at(current, fill_buffer, chunk, actual);
+ current += chunk;
+ unfilled -= chunk;
+ }
+ while (unfilled && !err);
+ }
+ if (err)
+ {
+ actual = 0U;
+ return err;
+ }
+ return Base::write_at(offset, buffer, length, actual);
+ }
+};
+
+
+template <typename Base, std::uint8_t DefaultFiller = 0U, std::size_t FillBlock = 1024U>
+using random_read_write_fill_wrapper = random_write_fill_wrapper<random_read_fill_wrapper<Base, DefaultFiller>, DefaultFiller, FillBlock>;
+
+} // namespace util
+
+#endif // MAME_LIB_UTIL_IOPROCSFILL_H
diff --git a/src/lib/util/ioprocsfilter.cpp b/src/lib/util/ioprocsfilter.cpp
new file mode 100644
index 00000000000..b25c0493ab1
--- /dev/null
+++ b/src/lib/util/ioprocsfilter.cpp
@@ -0,0 +1,600 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/***************************************************************************
+
+ ioprocs.h
+
+ I/O filters
+
+***************************************************************************/
+
+#include "ioprocsfilter.h"
+
+#include "ioprocs.h"
+
+#include <zlib.h>
+
+#include <algorithm>
+#include <cassert>
+#include <cerrno>
+#include <cstdint>
+#include <limits>
+#include <system_error>
+#include <type_traits>
+#include <utility>
+
+
+namespace util {
+
+namespace {
+
+// helper class for holding zlib data
+
+class zlib_data
+{
+protected:
+ zlib_data(std::size_t buffer_size) noexcept :
+ m_buffer_size(std::min<std::common_type_t<uInt, std::size_t> >(std::numeric_limits<uInt>::max(), buffer_size))
+ {
+ assert(buffer_size);
+ }
+
+ z_stream &get_z_stream() noexcept { return m_z_stream; }
+ z_stream const &get_z_stream() const noexcept { return m_z_stream; }
+ Bytef *get_buffer() noexcept { return m_buffer.get(); }
+ Bytef const *get_buffer() const noexcept { return m_buffer.get(); }
+ std::size_t get_buffer_size() const noexcept { return m_buffer_size; }
+
+ bool input_empty() const noexcept { return !m_z_stream.avail_in; }
+ bool output_available() const noexcept { return bool(m_z_stream.avail_out); }
+
+ void initialize_z_stream() noexcept
+ {
+ m_z_stream.zalloc = Z_NULL;
+ m_z_stream.zfree = Z_NULL;
+ m_z_stream.opaque = Z_NULL;
+ }
+
+ std::error_condition allocate_buffer() noexcept
+ {
+ if (!m_buffer)
+ m_buffer.reset(new (std::nothrow) Bytef [m_buffer_size]);
+ return m_buffer ? std::error_condition() : std::errc::not_enough_memory;
+ }
+
+ void release_buffer() noexcept
+ {
+ m_buffer.reset();
+ }
+
+ static std::error_condition convert_z_error(int err) noexcept
+ {
+ switch (err)
+ {
+ case Z_OK:
+ case Z_STREAM_END:
+ return std::error_condition();
+ case Z_NEED_DICT:
+ return std::errc::invalid_argument;
+ case Z_ERRNO:
+ return std::error_condition(errno, std::generic_category());
+ case Z_STREAM_ERROR:
+ return std::errc::invalid_argument;
+ case Z_DATA_ERROR:
+ return std::errc::invalid_argument; // TODO: revisit this error code
+ case Z_MEM_ERROR:
+ return std::errc::not_enough_memory;
+ case Z_BUF_ERROR:
+ return std::errc::operation_would_block; // TODO: revisit this error code (should be handled internally)
+ case Z_VERSION_ERROR:
+ return std::errc::invalid_argument; // TODO: revisit this error code (library ABI mismatch)
+ default:
+ return std::errc::io_error; // TODO: better default error code
+ }
+ }
+
+private:
+ z_stream m_z_stream;
+ std::unique_ptr<Bytef []> m_buffer;
+ std::size_t const m_buffer_size;
+};
+
+
+// helper class for decompressing deflated data
+
+class inflate_data : private zlib_data
+{
+protected:
+ inflate_data(std::size_t buffer_size) noexcept : zlib_data(buffer_size)
+ {
+ }
+
+ ~inflate_data()
+ {
+ if (m_inflate_initialized)
+ inflateEnd(&get_z_stream());
+ }
+
+ using zlib_data::input_empty;
+
+ bool stream_initialized() const noexcept
+ {
+ return m_inflate_initialized;
+ }
+
+ std::error_condition initialize_z_stream() noexcept
+ {
+ if (m_inflate_initialized)
+ return std::errc::invalid_argument;
+ std::error_condition err = allocate_buffer();
+ if (err)
+ return err;
+ zlib_data::initialize_z_stream();
+ int const zerr = inflateInit(&get_z_stream());
+ if (Z_OK == zerr)
+ m_inflate_initialized = true;
+ return convert_z_error(zerr);
+ }
+
+ std::error_condition close_z_stream() noexcept
+ {
+ if (!m_inflate_initialized)
+ return std::errc::invalid_argument;
+ int const zerr = inflateEnd(&get_z_stream());
+ m_inflate_initialized = false;
+ return convert_z_error(zerr);
+ }
+
+ std::error_condition decompress_some(bool &stream_end) noexcept
+ {
+ assert(m_inflate_initialized);
+ int const zerr = inflate(&get_z_stream(), Z_SYNC_FLUSH);
+ if (!get_z_stream().avail_in)
+ reset_input();
+ stream_end = Z_STREAM_END == zerr;
+ return convert_z_error(zerr);
+ }
+
+ std::size_t input_available() const noexcept
+ {
+ return std::size_t(get_z_stream().avail_in);
+ }
+
+ void reset_input() noexcept
+ {
+ get_z_stream().next_in = get_buffer();
+ get_z_stream().avail_in = 0U;
+ }
+
+ std::pair<void *, std::size_t> get_unfilled_input() noexcept
+ {
+ assert(get_buffer());
+ Bytef *const base = get_z_stream().next_in + get_z_stream().avail_in;
+ return std::make_pair(base, get_buffer() + get_buffer_size() - base);
+ }
+
+ void add_input(std::size_t length) noexcept
+ {
+ assert(get_buffer());
+ get_z_stream().avail_in += length;
+ assert((get_buffer() + get_buffer_size()) >= (get_z_stream().next_in + get_z_stream().avail_in));
+ }
+
+ std::size_t output_produced() const noexcept
+ {
+ return m_output_max - get_z_stream().avail_out;
+ }
+
+ void set_output(void *buffer, std::size_t length) noexcept
+ {
+ m_output_max = std::min<std::common_type_t<uInt, std::size_t> >(std::numeric_limits<uInt>::max(), length);
+ get_z_stream().next_out = reinterpret_cast<Bytef *>(buffer);
+ get_z_stream().avail_out = uInt(m_output_max);
+ }
+
+private:
+ std::error_condition allocate_buffer() noexcept
+ {
+ std::error_condition err;
+ if (!get_buffer())
+ {
+ err = zlib_data::allocate_buffer();
+ reset_input();
+ }
+ return err;
+ }
+
+ bool m_inflate_initialized = false;
+ std::size_t m_output_max = 0U;
+};
+
+
+// helper class for deflating data
+
+class deflate_data : private zlib_data
+{
+protected:
+ deflate_data(int level, std::size_t buffer_size) noexcept : zlib_data(buffer_size), m_level(level)
+ {
+ }
+
+ ~deflate_data()
+ {
+ if (m_deflate_initialized)
+ deflateEnd(&get_z_stream());
+ }
+
+ using zlib_data::input_empty;
+ using zlib_data::output_available;
+
+ bool stream_initialized() const noexcept
+ {
+ return m_deflate_initialized;
+ }
+
+ bool compression_finished() const noexcept
+ {
+ return m_compression_finished;
+ }
+
+ std::error_condition initialize_z_stream() noexcept
+ {
+ if (m_deflate_initialized)
+ return std::errc::invalid_argument;
+ std::error_condition err = allocate_buffer();
+ if (err)
+ return err;
+ zlib_data::initialize_z_stream();
+ int const zerr = deflateInit(&get_z_stream(), m_level);
+ reset_output();
+ if (Z_OK == zerr)
+ m_deflate_initialized = true;
+ return convert_z_error(zerr);
+ }
+
+ std::error_condition close_z_stream() noexcept
+ {
+ if (!m_deflate_initialized)
+ return std::errc::invalid_argument;
+ m_deflate_initialized = m_compression_finished = false;
+ return convert_z_error(deflateEnd(&get_z_stream()));
+ }
+
+ std::error_condition reset_z_stream() noexcept
+ {
+ if (!m_deflate_initialized)
+ return std::errc::invalid_argument;
+ assert(get_buffer());
+ reset_output();
+ m_compression_finished = false;
+ return convert_z_error(deflateReset(&get_z_stream()));
+ }
+
+ std::error_condition compress_some() noexcept
+ {
+ assert(m_deflate_initialized);
+ return convert_z_error(deflate(&get_z_stream(), Z_NO_FLUSH));
+ }
+
+ std::error_condition finish_compression() noexcept
+ {
+ assert(m_deflate_initialized);
+ int const zerr = deflate(&get_z_stream(), Z_FINISH);
+ if (Z_STREAM_END == zerr)
+ m_compression_finished = true;
+ return convert_z_error(zerr);
+ }
+
+ std::size_t input_used() const noexcept
+ {
+ return m_input_max - get_z_stream().avail_in;
+ }
+
+ void set_input(void const *data, std::size_t length) noexcept
+ {
+ m_input_max = std::min<std::common_type_t<uInt, std::size_t> >(std::numeric_limits<uInt>::max(), length);
+ get_z_stream().next_in = const_cast<Bytef z_const *>(reinterpret_cast<Bytef const *>(data));
+ get_z_stream().avail_in = uInt(m_input_max);
+ }
+
+ std::pair<void const *, std::size_t> get_output() const noexcept
+ {
+ assert(get_buffer());
+ return std::make_pair(
+ &get_buffer()[m_output_used],
+ get_buffer_size() - get_z_stream().avail_out - m_output_used);
+ }
+
+ void consume_output(std::size_t length) noexcept
+ {
+ m_output_used += length;
+ assert(m_output_used <= (get_buffer_size() - get_z_stream().avail_out));
+ if (m_output_used == (get_buffer_size() - get_z_stream().avail_out))
+ reset_output();
+ }
+
+private:
+ void reset_output() noexcept
+ {
+ assert(get_buffer());
+ m_output_used = 0U;
+ get_z_stream().next_out = get_buffer();
+ get_z_stream().avail_out = uInt(get_buffer_size());
+ }
+
+ int const m_level;
+ bool m_deflate_initialized = false;
+ bool m_compression_finished = false;
+ std::size_t m_output_used = 0U;
+ std::size_t m_input_max = 0U;
+};
+
+
+// helper for holding an object and deleting it (or not) as necessary
+
+template <typename T>
+class filter_base
+{
+protected:
+ filter_base(std::unique_ptr<T> &&object) noexcept : m_object(object.release()), m_owned(true)
+ {
+ assert(m_object);
+ }
+
+ filter_base(T &object) noexcept : m_object(&object), m_owned(false)
+ {
+ }
+
+ ~filter_base()
+ {
+ if (m_owned)
+ delete m_object;
+ }
+
+ T &object() noexcept
+ {
+ return *m_object;
+ }
+
+private:
+ T *const m_object;
+ bool const m_owned;
+};
+
+
+// filter for decompressing deflated data
+
+template <typename Stream>
+class zlib_read_filter : public read_stream, protected filter_base<Stream>, protected inflate_data
+{
+public:
+ zlib_read_filter(std::unique_ptr<Stream> &&stream, std::size_t read_chunk) noexcept :
+ filter_base<Stream>(std::move(stream)),
+ inflate_data(read_chunk)
+ {
+ }
+
+ zlib_read_filter(Stream &stream, std::size_t read_chunk) noexcept :
+ filter_base<Stream>(stream),
+ inflate_data(read_chunk)
+ {
+ }
+
+ virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ std::error_condition err;
+ actual = 0U;
+
+ if (!stream_initialized())
+ err = initialize_z_stream();
+
+ if (!err && (length > actual))
+ {
+ bool short_input = false;
+ do
+ {
+ if (input_empty())
+ {
+ auto const space = get_unfilled_input();
+ std::size_t filled;
+ err = this->object().read(space.first, space.second, filled);
+ add_input(filled);
+ short_input = space.second > filled;
+ }
+
+ if (!err && !input_empty())
+ {
+ set_output(reinterpret_cast<std::uint8_t *>(buffer) + actual, length - actual);
+ bool stream_end;
+ err = decompress_some(stream_end);
+ actual += output_produced();
+
+ if (stream_end)
+ {
+ assert(!err);
+ if constexpr (std::is_base_of_v<random_read, Stream>)
+ {
+ if (!input_empty())
+ {
+ std::int64_t const overshoot = std::uint64_t(input_available());
+ reset_input();
+ return this->object().seek(-overshoot, SEEK_CUR);
+ }
+ }
+ else
+ {
+ return std::error_condition();
+ }
+ }
+ }
+ }
+ while (!err && (length > actual) && !short_input);
+ }
+
+ return err;
+ }
+};
+
+
+// filter for deflating data
+
+class zlib_write_filter : public write_stream, protected filter_base<write_stream>, protected deflate_data
+{
+public:
+ zlib_write_filter(write_stream::ptr &&stream, int level, std::size_t buffer_size) noexcept :
+ filter_base<write_stream>(std::move(stream)),
+ deflate_data(level, buffer_size)
+ {
+ }
+
+ zlib_write_filter(write_stream &stream, int level, std::size_t buffer_size) noexcept :
+ filter_base<write_stream>(stream),
+ deflate_data(level, buffer_size)
+ {
+ }
+
+ ~zlib_write_filter()
+ {
+ finalize();
+ }
+
+ virtual std::error_condition finalize() noexcept override
+ {
+ if (!stream_initialized())
+ return std::error_condition();
+
+ do
+ {
+ if (!compression_finished() && output_available())
+ {
+ std::error_condition err = finish_compression();
+ if (err)
+ return err;
+ }
+
+ while ((compression_finished() && get_output().second) || !output_available())
+ {
+ std::error_condition err = write_some();
+ if (err)
+ return err;
+ }
+ }
+ while (!compression_finished());
+
+ return close_z_stream();
+ }
+
+ virtual std::error_condition flush() noexcept override
+ {
+ if (stream_initialized())
+ {
+ auto const output = get_output();
+ if (output.second)
+ {
+ std::size_t written;
+ std::error_condition err = object().write(output.first, output.second, written);
+ consume_output(written);
+ if (err)
+ {
+ object().flush();
+ return err;
+ }
+ }
+ }
+ return object().flush();
+ }
+
+ virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ std::error_condition err;
+ actual = 0U;
+
+ if (!stream_initialized())
+ {
+ err = initialize_z_stream();
+ }
+ else if (compression_finished())
+ {
+ while (!err && get_output().second)
+ err = write_some();
+ if (!err)
+ err = reset_z_stream();
+ }
+
+ while (!err && (length > actual))
+ {
+ set_input(reinterpret_cast<std::uint8_t const *>(buffer) + actual, length - actual);
+ do
+ {
+ if (output_available())
+ err = compress_some();
+
+ while (!err && !output_available())
+ err = write_some();
+ }
+ while (!err && !input_empty());
+ actual += input_used();
+ }
+
+ return err;
+ }
+
+private:
+ std::error_condition write_some() noexcept
+ {
+ auto const output = get_output();
+ std::size_t written;
+ std::error_condition err = object().write(output.first, output.second, written);
+ consume_output(written);
+ return err;
+ }
+};
+
+} // anonymous namespace
+
+
+// creating decompressing filters
+
+read_stream::ptr zlib_read(read_stream::ptr &&stream, std::size_t read_chunk) noexcept
+{
+ read_stream::ptr result;
+ if (stream)
+ result.reset(new (std::nothrow) zlib_read_filter<read_stream>(std::move(stream), read_chunk));
+ return result;
+}
+
+read_stream::ptr zlib_read(random_read::ptr &&stream, std::size_t read_chunk) noexcept
+{
+ read_stream::ptr result;
+ if (stream)
+ result.reset(new (std::nothrow) zlib_read_filter<random_read>(std::move(stream), read_chunk));
+ return result;
+}
+
+read_stream::ptr zlib_read(read_stream &stream, std::size_t read_chunk) noexcept
+{
+ return read_stream::ptr(new (std::nothrow) zlib_read_filter<read_stream>(stream, read_chunk));
+}
+
+read_stream::ptr zlib_read(random_read &stream, std::size_t read_chunk) noexcept
+{
+ return read_stream::ptr(new (std::nothrow) zlib_read_filter<random_read>(stream, read_chunk));
+}
+
+
+// creating compressing filters
+
+write_stream::ptr zlib_write(write_stream::ptr &&stream, int level, std::size_t buffer_size) noexcept
+{
+ write_stream::ptr result;
+ if (stream)
+ result.reset(new (std::nothrow) zlib_write_filter(std::move(stream), level, buffer_size));
+ return result;
+}
+
+write_stream::ptr zlib_write(write_stream &stream, int level, std::size_t buffer_size) noexcept
+{
+ return write_stream::ptr(new (std::nothrow) zlib_write_filter(stream, level, buffer_size));
+}
+
+} // namespace util
diff --git a/src/lib/util/ioprocsfilter.h b/src/lib/util/ioprocsfilter.h
new file mode 100644
index 00000000000..a146dd737ce
--- /dev/null
+++ b/src/lib/util/ioprocsfilter.h
@@ -0,0 +1,31 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/***************************************************************************
+
+ ioprocs.h
+
+ I/O filters
+
+***************************************************************************/
+#ifndef MAME_LIB_UTIL_IOPROCSFILTER_H
+#define MAME_LIB_UTIL_IOPROCSFILTER_H
+
+#include "utilfwd.h"
+
+#include <cstdlib>
+#include <memory>
+
+
+namespace util {
+
+std::unique_ptr<read_stream> zlib_read(std::unique_ptr<read_stream> &&stream, std::size_t read_chunk) noexcept;
+std::unique_ptr<read_stream> zlib_read(std::unique_ptr<random_read> &&stream, std::size_t read_chunk) noexcept;
+std::unique_ptr<read_stream> zlib_read(read_stream &stream, std::size_t read_chunk) noexcept;
+std::unique_ptr<read_stream> zlib_read(random_read &stream, std::size_t read_chunk) noexcept;
+
+std::unique_ptr<write_stream> zlib_write(std::unique_ptr<write_stream> &&stream, int level, std::size_t buffer_size) noexcept;
+std::unique_ptr<write_stream> zlib_write(write_stream &stream, int level, std::size_t buffer_size) noexcept;
+
+} // namespace util
+
+#endif // MAME_LIB_UTIL_IOPROCSFILTER_H
diff --git a/src/lib/util/ioprocsvec.h b/src/lib/util/ioprocsvec.h
new file mode 100644
index 00000000000..27dda095ad3
--- /dev/null
+++ b/src/lib/util/ioprocsvec.h
@@ -0,0 +1,211 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/***************************************************************************
+
+ ioprocsvec.h
+
+ Helper for using a vector as an in-memory file
+
+***************************************************************************/
+#ifndef MAME_LIB_UTIL_IOPROCSVEC_H
+#define MAME_LIB_UTIL_IOPROCSVEC_H
+
+#include "ioprocs.h"
+
+#include <cstdint>
+#include <cstdlib>
+#include <cstring>
+#include <limits>
+#include <system_error>
+#include <type_traits>
+#include <vector>
+
+
+namespace util {
+
+template <typename T = std::uint8_t>
+class vector_read_write_adapter : public random_read_write
+{
+public:
+ vector_read_write_adapter(std::vector<T> &storage) noexcept : m_storage(storage)
+ {
+ check_resized();
+ }
+
+ virtual std::error_condition seek(std::int64_t offset, int whence) noexcept override
+ {
+ switch (whence)
+ {
+ case SEEK_SET:
+ if (0 > offset)
+ return std::errc::invalid_argument;
+ m_pointer = std::uint64_t(offset);
+ return std::error_condition();
+
+ case SEEK_CUR:
+ if (0 > offset)
+ {
+ if (std::uint64_t(-offset) > m_pointer)
+ return std::errc::invalid_argument;
+ }
+ else if ((std::numeric_limits<std::uint64_t>::max() - offset) < m_pointer)
+ {
+ return std::errc::invalid_argument;
+ }
+ m_pointer += offset;
+ return std::error_condition();
+
+ case SEEK_END:
+ check_resized();
+ if (0 > offset)
+ {
+ if (std::uint64_t(-offset) > m_size)
+ return std::errc::invalid_argument;
+ }
+ else if ((std::numeric_limits<std::uint64_t>::max() - offset) < m_size)
+ {
+ return std::errc::invalid_argument;
+ }
+ m_pointer = std::uint64_t(m_size) + offset;
+ return std::error_condition();
+
+ default:
+ return std::errc::invalid_argument;
+ }
+ }
+
+ virtual std::error_condition tell(std::uint64_t &result) noexcept override
+ {
+ result = m_pointer;
+ return std::error_condition();
+ }
+
+ virtual std::error_condition length(std::uint64_t &result) noexcept override
+ {
+ check_resized();
+ if (std::numeric_limits<uint64_t>::max() < m_size)
+ return std::errc::file_too_large;
+
+ result = m_size;
+ return std::error_condition();
+ }
+
+ virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ do_read(m_pointer, buffer, length, actual);
+ m_pointer += actual;
+ return std::error_condition();
+ }
+
+ virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ do_read(offset, buffer, length, actual);
+ return std::error_condition();
+ }
+
+ virtual std::error_condition finalize() noexcept override
+ {
+ return std::error_condition();
+ }
+
+ virtual std::error_condition flush() noexcept override
+ {
+ return std::error_condition();
+ }
+
+ virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ std::error_condition result = do_write(m_pointer, buffer, length, actual);
+ m_pointer += actual;
+ return result;
+ }
+
+ virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ return do_write(offset, buffer, length, actual);
+ }
+
+private:
+ using elements_type = typename std::vector<T>::size_type;
+ using common_size_type = std::common_type_t<std::uint64_t, std::size_t>;
+
+ void check_resized() noexcept
+ {
+ if (m_storage.size() != m_elements)
+ {
+ m_elements = m_storage.size();
+ m_size = m_elements * sizeof(T);
+ }
+ }
+
+ void do_read(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept
+ {
+ check_resized();
+ if ((offset < m_size) && length)
+ {
+ actual = std::min(std::size_t(m_size - offset), length);
+ std::memmove(buffer, reinterpret_cast<std::uint8_t *>(m_storage.data()) + offset, actual);
+ }
+ else
+ {
+ actual = 0U;
+ }
+ }
+
+ std::error_condition do_write(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept
+ {
+ check_resized();
+ std::size_t allocated = m_elements * sizeof(T);
+ std::uint64_t const target = ((std::numeric_limits<std::uint64_t>::max() - offset) >= length)
+ ? (offset + length)
+ : std::numeric_limits<std::uint64_t>::max();
+
+ std::error_condition result;
+ if (target > allocated)
+ {
+ elements_type const required = std::min<std::common_type_t<elements_type, std::uint64_t> >(
+ std::numeric_limits<elements_type>::max(),
+ (target + sizeof(T) - 1) / sizeof(T)); // technically can overflow but unlikely
+ try { m_storage.resize(required); } // unpredictable if constructing/assigning T can throw
+ catch (...) { result = std::errc::not_enough_memory; }
+ m_elements = m_storage.size();
+ allocated = m_elements * sizeof(T);
+ assert(allocated >= m_size);
+
+ if (offset > m_size)
+ {
+ std::size_t const new_size = std::size_t(std::min<common_size_type>(allocated, offset));
+ std::memset(
+ reinterpret_cast<std::uint8_t *>(m_storage.data()) + m_size,
+ 0x00, // POSIX says unwritten areas of files should read as zero
+ new_size - m_size);
+ m_size = new_size;
+ }
+ }
+
+ std::size_t const limit = std::min<common_size_type>(target, allocated);
+ if (limit > offset)
+ {
+ actual = std::size_t(limit - offset);
+ std::memmove(reinterpret_cast<std::uint8_t *>(m_storage.data()) + offset, buffer, actual);
+ m_size = limit;
+ }
+ else
+ {
+ actual = 0U;
+ }
+ if (!result && (actual < length))
+ result = std::errc::no_space_on_device;
+
+ return result;
+ }
+
+ std::vector<T> &m_storage;
+ std::uint64_t m_pointer = 0U;
+ elements_type m_elements = 0U;
+ std::size_t m_size = 0U;
+};
+
+} // namespace util
+
+#endif // MAME_LIB_UTIL_IOPROCSVEC_H
diff --git a/src/lib/util/path.cpp b/src/lib/util/path.cpp
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/src/lib/util/path.cpp
diff --git a/src/lib/util/path.h b/src/lib/util/path.h
new file mode 100644
index 00000000000..8638bcb332b
--- /dev/null
+++ b/src/lib/util/path.h
@@ -0,0 +1,83 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/***************************************************************************
+
+ path.h
+
+ Filesystem path utilties
+
+***************************************************************************/
+#ifndef MAME_LIB_UTIL_PATH_H
+#define MAME_LIB_UTIL_PATH_H
+
+#include "osdfile.h" // for PATH_SEPARATOR
+
+#include <string>
+#include <utility>
+
+
+namespace util {
+
+/// \defgroup pathutils Filesystem path utilities
+/// \{
+
+/// \brief Is a character a directory separator?
+///
+/// Determine whether a character is used to separate components within
+/// a filesystem path.
+/// \param [in] c A character to test.
+/// \return True if the character is used to separate components in
+/// filesystem paths.
+constexpr bool is_directory_separator(char c)
+{
+#if defined(_WIN32)
+ return ('\\' == c) || ('/' == c) || (':' == c);
+#else
+ return '/' == c;
+#endif
+}
+
+
+/// \brief Append components to a filesystem path
+///
+/// Appends directory components to a filesystem path.
+/// \param [in,out] path The path to append to.
+/// \param [in] next The first directory component to append to the
+/// path.
+/// \param [in] more Additional directory components to append to the
+/// path.
+/// \return A reference to the modified path.
+template <typename T, typename... U>
+inline std::string &path_append(std::string &path, T &&next, U &&... more)
+{
+ if (!path.empty() && !is_directory_separator(path.back()))
+ path.append(PATH_SEPARATOR);
+ path.append(std::forward<T>(next));
+ if constexpr (sizeof...(U))
+ return path_append(std::forward<U>(more)...);
+ else
+ return path;
+}
+
+
+/// \brief Concatenate filsystem paths
+///
+/// Concatenates multiple filesystem paths.
+/// \param [in] first Initial filesystem path.
+/// \param [in] more Additional directory components to append to the
+/// intial path.
+/// \return The concatenated filesystem path.
+template <typename T, typename... U>
+inline std::string path_concat(T &&first, U &&... more)
+{
+ std::string result(std::forward<T>(first));
+ if constexpr (sizeof...(U))
+ path_append(result, std::forward<U>(more)...);
+ return result;
+}
+
+/// \}
+
+} // namespace util
+
+#endif // MAME_LIB_UTIL_PATH_H
diff --git a/src/lib/util/strformat.h b/src/lib/util/strformat.h
index b8c9b4f1a99..a3ba1d11261 100644
--- a/src/lib/util/strformat.h
+++ b/src/lib/util/strformat.h
@@ -578,16 +578,16 @@ template <typename Stream, typename T>
class format_output
{
private:
- template <typename U> struct string_semantics
- { static constexpr bool value = false; };
- template <typename CharT, typename Traits, typename Allocator> struct string_semantics<std::basic_string<CharT, Traits, Allocator> >
- { static constexpr bool value = true; };
- template <typename CharT, typename Traits> struct string_semantics<std::basic_string_view<CharT, Traits> >
- { static constexpr bool value = true; };
- template <typename U> struct signed_integer_semantics
- { static constexpr bool value = std::is_integral_v<U>&& std::is_signed_v<U>; };
- template <typename U> struct unsigned_integer_semantics
- { static constexpr bool value = std::is_integral_v<U>&& !std::is_signed_v<U>; };
+ template <typename U>
+ struct string_semantics : public std::false_type { };
+ template <typename CharT, typename Traits, typename Allocator>
+ struct string_semantics<std::basic_string<CharT, Traits, Allocator> > : public std::true_type { };
+ template <typename CharT, typename Traits>
+ struct string_semantics<std::basic_string_view<CharT, Traits> > : public std::true_type { };
+ template <typename U>
+ using signed_integer_semantics = std::bool_constant<std::is_integral_v<U> && std::is_signed_v<U> >;
+ template <typename U>
+ using unsigned_integer_semantics = std::bool_constant<std::is_integral_v<U> && !std::is_signed_v<U> >;
static void apply_signed(Stream &str, char16_t const &value)
{
@@ -865,8 +865,8 @@ template <typename Stream, typename T>
class format_output<Stream, T *>
{
protected:
- template <typename U> struct string_semantics
- { static constexpr bool value = std::is_same<std::remove_const_t<U>, typename Stream::char_type>::value; };
+ template <typename U>
+ using string_semantics = std::bool_constant<std::is_same_v<std::remove_const_t<U>, typename Stream::char_type> >;
public:
template <typename U>
@@ -940,10 +940,10 @@ template <typename T>
class format_make_integer
{
private:
- template <typename U> struct use_unsigned_cast
- { static constexpr bool value = std::is_convertible<U const, unsigned>::value && std::is_unsigned<U>::value; };
- template <typename U> struct use_signed_cast
- { static constexpr bool value = !use_unsigned_cast<U>::value && std::is_convertible<U const, int>::value; };
+ template <typename U>
+ using use_unsigned_cast = std::bool_constant<std::is_convertible_v<U const, unsigned> && std::is_unsigned_v<U> >;
+ template <typename U>
+ using use_signed_cast = std::bool_constant<!use_unsigned_cast<U>::value && std::is_convertible_v<U const, int> >;
public:
template <typename U> static bool apply(U const &value, int &result)
@@ -974,14 +974,14 @@ template <typename T>
class format_store_integer
{
private:
- template <typename U> struct is_non_const_ptr
- { static constexpr bool value = std::is_pointer<U>::value && !std::is_const<std::remove_pointer_t<U> >::value; };
- template <typename U> struct is_unsigned_ptr
- { static constexpr bool value = std::is_pointer<U>::value && std::is_unsigned<std::remove_pointer_t<U> >::value; };
- template <typename U> struct use_unsigned_cast
- { static constexpr bool value = is_non_const_ptr<U>::value && is_unsigned_ptr<U>::value && std::is_convertible<std::make_unsigned_t<std::streamoff>, std::remove_pointer_t<U> >::value; };
- template <typename U> struct use_signed_cast
- { static constexpr bool value = is_non_const_ptr<U>::value && !use_unsigned_cast<U>::value && std::is_convertible<std::streamoff, std::remove_pointer_t<U> >::value; };
+ template <typename U>
+ using is_non_const_ptr = std::bool_constant<std::is_pointer_v<U> && !std::is_const_v<std::remove_pointer_t<U> > >;
+ template <typename U>
+ using is_unsigned_ptr = std::bool_constant<std::is_pointer_v<U> && std::is_unsigned_v<std::remove_pointer_t<U> > >;
+ template <typename U>
+ using use_unsigned_cast = std::bool_constant<is_non_const_ptr<U>::value && is_unsigned_ptr<U>::value && std::is_convertible_v<std::make_unsigned_t<std::streamoff>, std::remove_pointer_t<U> > >;
+ template <typename U>
+ using use_signed_cast = std::bool_constant<is_non_const_ptr<U>::value && !use_unsigned_cast<U>::value && std::is_convertible_v<std::streamoff, std::remove_pointer_t<U> > >;
public:
template <typename U> static bool apply(U const &value, std::streamoff data)
@@ -1091,11 +1091,11 @@ public:
protected:
template <typename T>
- struct handle_char_ptr { static constexpr bool value = std::is_pointer<T>::value && std::is_same<std::remove_cv_t<std::remove_pointer_t<T> >, char_type>::value; };
+ using handle_char_ptr = std::bool_constant<std::is_pointer_v<T> && std::is_same_v<std::remove_cv_t<std::remove_pointer_t<T> >, char_type> >;
template <typename T>
- struct handle_char_array { static constexpr bool value = std::is_array<T>::value && std::is_same<std::remove_cv_t<std::remove_extent_t<T> >, char_type>::value; };
+ using handle_char_array = std::bool_constant<std::is_array_v<T> && std::is_same_v<std::remove_cv_t<std::remove_extent_t<T> >, char_type> >;
template <typename T>
- struct handle_container { static constexpr bool value = !handle_char_ptr<T>::value && !handle_char_array<T>::value; };
+ using handle_container = std::bool_constant<!handle_char_ptr<T>::value && !handle_char_array<T>::value>;
template <typename Format>
format_argument_pack(
diff --git a/src/lib/util/timeconv.cpp b/src/lib/util/timeconv.cpp
index 99953712003..469b6b592a2 100644
--- a/src/lib/util/timeconv.cpp
+++ b/src/lib/util/timeconv.cpp
@@ -14,42 +14,10 @@
namespace util {
-/***************************************************************************
- PROTOTYPES
-***************************************************************************/
-
-static std::chrono::system_clock::duration calculate_system_clock_adjustment();
-
-
-/***************************************************************************
- GLOBAL VARIABLES
-***************************************************************************/
-
-std::chrono::system_clock::duration system_clock_adjustment(calculate_system_clock_adjustment());
-
-
-/***************************************************************************
- IMPLEMENTATION
-***************************************************************************/
-
-arbitrary_datetime arbitrary_datetime::now()
-{
- time_t sec;
- time(&sec);
- auto t = *localtime(&sec);
-
- arbitrary_datetime dt;
- dt.year = t.tm_year + 1900;
- dt.month = t.tm_mon + 1;
- dt.day_of_month = t.tm_mday;
- dt.hour = t.tm_hour;
- dt.minute = t.tm_min;
- dt.second = t.tm_sec;
- return dt;
-}
+namespace {
-static std::chrono::system_clock::duration calculate_system_clock_adjustment()
+std::chrono::system_clock::duration calculate_system_clock_adjustment()
{
constexpr auto days_in_year(365);
constexpr auto days_in_four_years((days_in_year * 4) + 1);
@@ -84,6 +52,39 @@ static std::chrono::system_clock::duration calculate_system_clock_adjustment()
return result - std::chrono::system_clock::from_time_t(0).time_since_epoch();
}
+} // anonymous namespace
+
+
+
+/***************************************************************************
+ GLOBAL VARIABLES
+***************************************************************************/
+
+std::chrono::system_clock::duration system_clock_adjustment(calculate_system_clock_adjustment());
+
+
+
+/***************************************************************************
+ IMPLEMENTATION
+***************************************************************************/
+
+arbitrary_datetime arbitrary_datetime::now()
+{
+ time_t sec;
+ time(&sec);
+ auto t = *localtime(&sec);
+
+ arbitrary_datetime dt;
+ dt.year = t.tm_year + 1900;
+ dt.month = t.tm_mon + 1;
+ dt.day_of_month = t.tm_mday;
+ dt.hour = t.tm_hour;
+ dt.minute = t.tm_min;
+ dt.second = t.tm_sec;
+
+ return dt;
+}
+
// -------------------------------------------------
diff --git a/src/lib/util/timeconv.h b/src/lib/util/timeconv.h
index 2eb495a70aa..91327dbac16 100644
--- a/src/lib/util/timeconv.h
+++ b/src/lib/util/timeconv.h
@@ -22,6 +22,7 @@
namespace util {
+
/***************************************************************************
GLOBAL VARIABLES
***************************************************************************/
@@ -58,7 +59,7 @@ struct arbitrary_datetime
// date of the epoch's begining
//---------------------------------------------------------
-template<typename Rep, int Y, int M, int D, int H, int N, int S, typename Ratio>
+template <typename Rep, int Y, int M, int D, int H, int N, int S, typename Ratio>
class arbitrary_clock
{
public:
@@ -89,7 +90,7 @@ public:
// with a different scale to this arbitrary_clock's scale
//---------------------------------------------------------
- template<typename Rep2, int YY, int MM, int DD, int HH, int NN, int SS, typename Ratio2>
+ template <typename Rep2, int YY, int MM, int DD, int HH, int NN, int SS, typename Ratio2>
static time_point from_arbitrary_time_point(const std::chrono::time_point<arbitrary_clock<Rep2, YY, MM, DD, HH, NN, SS, Ratio2> > &tp)
{
arbitrary_datetime dt;
@@ -111,7 +112,7 @@ public:
// of this scale to one of different scale
//---------------------------------------------------------
- template<typename Rep2, int YY, int MM, int DD, int HH, int NN, int SS, typename Ratio2>
+ template <typename Rep2, int YY, int MM, int DD, int HH, int NN, int SS, typename Ratio2>
static std::chrono::time_point<arbitrary_clock<Rep2, YY, MM, DD, HH, NN, SS, Ratio2> > to_arbitrary_time_point(const time_point &tp)
{
return arbitrary_clock<Rep2, YY, MM, DD, HH, NN, SS, Ratio2>::from_arbitrary_time_point(tp);
@@ -125,14 +126,14 @@ public:
static struct tm to_tm(const time_point &tp)
{
std::chrono::time_point<tm_conversion_clock> normalized_tp = to_arbitrary_time_point<
- std::int64_t,
- tm_conversion_clock::base_year,
- tm_conversion_clock::base_month,
- tm_conversion_clock::base_day,
- tm_conversion_clock::base_hour,
- tm_conversion_clock::base_minute,
- tm_conversion_clock::base_second,
- tm_conversion_clock::period>(tp);
+ std::int64_t,
+ tm_conversion_clock::base_year,
+ tm_conversion_clock::base_month,
+ tm_conversion_clock::base_day,
+ tm_conversion_clock::base_hour,
+ tm_conversion_clock::base_minute,
+ tm_conversion_clock::base_second,
+ tm_conversion_clock::period>(tp);
return internal_to_tm(normalized_tp.time_since_epoch());
}
@@ -144,14 +145,14 @@ public:
static std::chrono::time_point<std::chrono::system_clock> to_system_clock(const time_point &tp)
{
auto normalized_tp = to_arbitrary_time_point<
- std::int64_t,
- system_conversion_clock::base_year,
- system_conversion_clock::base_month,
- system_conversion_clock::base_day,
- system_conversion_clock::base_hour,
- system_conversion_clock::base_minute,
- system_conversion_clock::base_second,
- system_conversion_clock::period>(tp);
+ std::int64_t,
+ system_conversion_clock::base_year,
+ system_conversion_clock::base_month,
+ system_conversion_clock::base_day,
+ system_conversion_clock::base_hour,
+ system_conversion_clock::base_minute,
+ system_conversion_clock::base_second,
+ system_conversion_clock::period>(tp);
return std::chrono::time_point<std::chrono::system_clock>(normalized_tp.time_since_epoch() + system_clock_adjustment);
}
@@ -181,13 +182,10 @@ private:
static int clamp_or_throw(int value, int minimum, int maximum, bool clamp, const char *out_of_range_message)
{
- if (value < minimum || value > maximum)
- {
- if (clamp)
- value = std::min(std::max(value, minimum), maximum);
- else
- throw std::out_of_range(out_of_range_message);
- }
+ if (clamp)
+ value = std::clamp(value, minimum, maximum);
+ else if (value < minimum || value > maximum)
+ throw std::out_of_range(out_of_range_message);
return value;
}
diff --git a/src/lib/util/un7z.cpp b/src/lib/util/un7z.cpp
index 879da294c69..b35af479d5d 100644
--- a/src/lib/util/un7z.cpp
+++ b/src/lib/util/un7z.cpp
@@ -13,11 +13,13 @@
#include "unzip.h"
#include "corestr.h"
-#include "osdcore.h"
-#include "osdfile.h"
+#include "ioprocs.h"
#include "unicode.h"
#include "timeconv.h"
+#include "osdcore.h"
+#include "osdfile.h"
+
#include "lzma/C/7z.h"
#include "lzma/C/7zAlloc.h"
#include "lzma/C/7zCrc.h"
@@ -38,47 +40,71 @@
namespace util {
+
namespace {
+
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
-struct CSzFile
+struct CFileInStream : public ISeekInStream
{
- CSzFile() : currfpos(0), length(0), osdfile() {}
+ CFileInStream() noexcept
+ {
+ Read = [] (void *pp, void *buf, size_t *size) { return reinterpret_cast<CFileInStream *>(pp)->read(buf, *size); };
+ Seek = [] (void *pp, Int64 *pos, ESzSeek origin) { return reinterpret_cast<CFileInStream *>(pp)->seek(*pos, origin); };
+ }
- std::uint64_t currfpos;
- std::uint64_t length;
- osd_file::ptr osdfile;
+ random_read::ptr file;
+ std::uint64_t currfpos = 0;
+ std::uint64_t length = 0;
- SRes read(void *data, std::size_t &size)
+private:
+ SRes read(void *data, std::size_t &size) noexcept
{
- if (!osdfile)
+ if (!file)
{
- osd_printf_error("un7z: called CSzFile::read without file\n");
+ osd_printf_error("un7z: called CFileInStream::read without file\n");
return SZ_ERROR_READ;
}
if (!size)
return SZ_OK;
- // TODO: this casts a size_t to a uint32_t, so it will fail if >=4GB is requested at once (need a loop)
- std::uint32_t read_length(0);
- auto const err = osdfile->read(data, currfpos, size, read_length);
+ std::size_t read_length(0);
+ std::error_condition const err = file->read_at(currfpos, data, size, read_length);
size = read_length;
currfpos += read_length;
- return (osd_file::error::NONE == err) ? SZ_OK : SZ_ERROR_READ;
+ return !err ? SZ_OK : SZ_ERROR_READ;
}
- SRes seek(Int64 &pos, ESzSeek origin)
+ SRes seek(Int64 &pos, ESzSeek origin) noexcept
{
+ // need to synthesise this because the OSD file wrapper doesn't implement SEEK_END
switch (origin)
{
- case SZ_SEEK_CUR: currfpos += pos; break;
- case SZ_SEEK_SET: currfpos = pos; break;
- case SZ_SEEK_END: currfpos = length + pos; break;
- default: return SZ_ERROR_READ;
+ case SZ_SEEK_CUR:
+ if ((0 > pos) && (-pos > currfpos))
+ {
+ osd_printf_error("un7z: attemped to seek back %d bytes when current offset is %u\n", -pos, currfpos);
+ return SZ_ERROR_READ;
+ }
+ currfpos += pos;
+ break;
+ case SZ_SEEK_SET:
+ currfpos = pos;
+ break;
+ case SZ_SEEK_END:
+ if ((0 > pos) && (-pos > length))
+ {
+ osd_printf_error("un7z: attemped to seek %d bytes before end of file %u\n", -pos, currfpos);
+ return SZ_ERROR_READ;
+ }
+ currfpos = length + pos;
+ break;
+ default:
+ return SZ_ERROR_READ;
}
pos = currfpos;
return SZ_OK;
@@ -86,18 +112,18 @@ struct CSzFile
};
-struct CFileInStream : public ISeekInStream, public CSzFile
-{
- CFileInStream();
-};
-
-
-class m7z_file_impl
+class m7z_file_impl
{
public:
typedef std::unique_ptr<m7z_file_impl> ptr;
- m7z_file_impl(const std::string &filename);
+ m7z_file_impl(std::string &&filename) noexcept;
+
+ m7z_file_impl(random_read::ptr &&file) noexcept
+ : m7z_file_impl(std::string())
+ {
+ m_archive_stream.file = std::move(file);
+ }
virtual ~m7z_file_impl()
{
@@ -107,7 +133,7 @@ public:
SzArEx_Free(&m_db, &m_alloc_imp);
}
- static ptr find_cached(const std::string &filename)
+ static ptr find_cached(std::string_view filename) noexcept
{
std::lock_guard<std::mutex> guard(s_cache_mutex);
for (std::size_t cachenum = 0; cachenum < s_cache.size(); cachenum++)
@@ -115,47 +141,60 @@ public:
// if we have a valid entry and it matches our filename, use it and remove from the cache
if (s_cache[cachenum] && (filename == s_cache[cachenum]->m_filename))
{
+ using std::swap;
ptr result;
- std::swap(s_cache[cachenum], result);
+ swap(s_cache[cachenum], result);
osd_printf_verbose("un7z: found %s in cache\n", filename);
return result;
}
}
return ptr();
}
- static void close(ptr &&archive);
- static void cache_clear()
+
+ static void close(ptr &&archive) noexcept;
+
+ static void cache_clear() noexcept
{
// clear call cache entries
std::lock_guard<std::mutex> guard(s_cache_mutex);
- for (std::size_t cachenum = 0; cachenum < s_cache.size(); s_cache[cachenum++].reset()) { }
+ for (auto &cached : s_cache)
+ cached.reset();
}
- archive_file::error initialize();
+ std::error_condition initialize() noexcept;
- int first_file() { return search(0, 0, std::string(), false, false, false); }
- int next_file() { return (m_curr_file_idx < 0) ? -1 : search(m_curr_file_idx + 1, 0, std::string(), false, false, false); }
+ int first_file() noexcept
+ {
+ return search(0, 0, std::string_view(), false, false, false);
+ }
- int search(std::uint32_t crc)
+ int next_file() noexcept
{
- return search(0, crc, std::string(), true, false, false);
+ return (m_curr_file_idx < 0) ? -1 : search(m_curr_file_idx + 1, 0, std::string_view(), false, false, false);
}
- int search(const std::string &filename, bool partialpath)
+
+ int search(std::uint32_t crc) noexcept
+ {
+ return search(0, crc, std::string_view(), true, false, false);
+ }
+
+ int search(std::string_view filename, bool partialpath) noexcept
{
return search(0, 0, filename, false, true, partialpath);
}
- int search(std::uint32_t crc, const std::string &filename, bool partialpath)
+
+ int search(std::uint32_t crc, std::string_view filename, bool partialpath) noexcept
{
return search(0, crc, filename, true, true, partialpath);
}
- bool current_is_directory() const { return m_curr_is_dir; }
- const std::string &current_name() const { return m_curr_name; }
- std::uint64_t current_uncompressed_length() const { return m_curr_length; }
- virtual std::chrono::system_clock::time_point current_last_modified() const { return m_curr_modified; }
- std::uint32_t current_crc() const { return m_curr_crc; }
+ bool current_is_directory() const noexcept { return m_curr_is_dir; }
+ const std::string &current_name() const noexcept { return m_curr_name; }
+ std::uint64_t current_uncompressed_length() const noexcept { return m_curr_length; }
+ virtual std::chrono::system_clock::time_point current_last_modified() const noexcept { return m_curr_modified; }
+ std::uint32_t current_crc() const noexcept { return m_curr_crc; }
- archive_file::error decompress(void *buffer, std::uint32_t length);
+ std::error_condition decompress(void *buffer, std::size_t length) noexcept;
private:
m7z_file_impl(const m7z_file_impl &) = delete;
@@ -166,12 +205,12 @@ private:
int search(
int i,
std::uint32_t search_crc,
- const std::string &search_filename,
+ std::string_view search_filename,
bool matchcrc,
bool matchname,
- bool partialpath);
+ bool partialpath) noexcept;
void make_utf8_name(int index);
- void set_curr_modified();
+ void set_curr_modified() noexcept;
static constexpr std::size_t CACHE_SIZE = 8;
static std::array<ptr, CACHE_SIZE> s_cache;
@@ -187,7 +226,7 @@ private:
std::uint32_t m_curr_crc; // current file crc
std::vector<UInt16> m_utf16_buf;
- std::vector<char32_t> m_uchar_buf;
+ std::vector<char32_t> m_uchar_buf;
std::vector<char> m_utf8_buf;
CFileInStream m_archive_stream;
@@ -201,39 +240,38 @@ private:
UInt32 m_block_index;
Byte * m_out_buffer;
std::size_t m_out_buffer_size;
-
};
class m7z_file_wrapper : public archive_file
{
public:
- m7z_file_wrapper(m7z_file_impl::ptr &&impl) : m_impl(std::move(impl)) { assert(m_impl); }
+ m7z_file_wrapper(m7z_file_impl::ptr &&impl) noexcept : m_impl(std::move(impl)) { assert(m_impl); }
virtual ~m7z_file_wrapper() override { m7z_file_impl::close(std::move(m_impl)); }
- virtual int first_file() override { return m_impl->first_file(); }
- virtual int next_file() override { return m_impl->next_file(); }
+ virtual int first_file() noexcept override { return m_impl->first_file(); }
+ virtual int next_file() noexcept override { return m_impl->next_file(); }
- virtual int search(std::uint32_t crc) override
+ virtual int search(std::uint32_t crc) noexcept override
{
return m_impl->search(crc);
}
- virtual int search(const std::string &filename, bool partialpath) override
+ virtual int search(std::string_view filename, bool partialpath) noexcept override
{
return m_impl->search(filename, partialpath);
}
- virtual int search(std::uint32_t crc, const std::string &filename, bool partialpath) override
+ virtual int search(std::uint32_t crc, std::string_view filename, bool partialpath) noexcept override
{
return m_impl->search(crc, filename, partialpath);
}
- virtual bool current_is_directory() const override { return m_impl->current_is_directory(); }
- virtual const std::string &current_name() const override { return m_impl->current_name(); }
- virtual std::uint64_t current_uncompressed_length() const override { return m_impl->current_uncompressed_length(); }
- virtual std::chrono::system_clock::time_point current_last_modified() const override { return m_impl->current_last_modified(); }
- virtual std::uint32_t current_crc() const override { return m_impl->current_crc(); }
+ virtual bool current_is_directory() const noexcept override { return m_impl->current_is_directory(); }
+ virtual const std::string &current_name() const noexcept override { return m_impl->current_name(); }
+ virtual std::uint64_t current_uncompressed_length() const noexcept override { return m_impl->current_uncompressed_length(); }
+ virtual std::chrono::system_clock::time_point current_last_modified() const noexcept override { return m_impl->current_last_modified(); }
+ virtual std::uint32_t current_crc() const noexcept override { return m_impl->current_crc(); }
- virtual error decompress(void *buffer, std::uint32_t length) override { return m_impl->decompress(buffer, length); }
+ virtual std::error_condition decompress(void *buffer, std::size_t length) noexcept override { return m_impl->decompress(buffer, length); }
private:
m7z_file_impl::ptr m_impl;
@@ -251,48 +289,20 @@ std::mutex m7z_file_impl::s_cache_mutex;
/***************************************************************************
- 7Zip Memory / File handling (adapted from 7zfile.c/.h and 7zalloc.c/.h)
-***************************************************************************/
-
-/* ---------- FileInStream ---------- */
-
-extern "C" {
-static SRes FileInStream_Read(void *pp, void *buf, size_t *size)
-{
- return (reinterpret_cast<CFileInStream *>(pp)->read(buf, *size) == 0) ? SZ_OK : SZ_ERROR_READ;
-}
-
-static SRes FileInStream_Seek(void *pp, Int64 *pos, ESzSeek origin)
-{
- return reinterpret_cast<CFileInStream *>(pp)->seek(*pos, origin);
-}
-
-} // extern "C"
-
-
-CFileInStream::CFileInStream()
-{
- Read = &FileInStream_Read;
- Seek = &FileInStream_Seek;
-}
-
-
-
-/***************************************************************************
CACHE MANAGEMENT
***************************************************************************/
-m7z_file_impl::m7z_file_impl(const std::string &filename)
- : m_filename(filename)
+m7z_file_impl::m7z_file_impl(std::string &&filename) noexcept
+ : m_filename(std::move(filename))
, m_curr_file_idx(-1)
, m_curr_is_dir(false)
, m_curr_name()
, m_curr_length(0)
, m_curr_modified()
, m_curr_crc(0)
- , m_utf16_buf(128)
- , m_uchar_buf(128)
- , m_utf8_buf(512)
+ , m_utf16_buf()
+ , m_uchar_buf()
+ , m_utf8_buf()
, m_inited(false)
, m_block_index(0)
, m_out_buffer(nullptr)
@@ -310,15 +320,45 @@ m7z_file_impl::m7z_file_impl(const std::string &filename)
}
-archive_file::error m7z_file_impl::initialize()
+std::error_condition m7z_file_impl::initialize() noexcept
{
- osd_file::error const err = osd_file::open(m_filename, OPEN_FLAG_READ, m_archive_stream.osdfile, m_archive_stream.length);
- if (err != osd_file::error::NONE)
- return archive_file::error::FILE_ERROR;
+ try
+ {
+ if (m_utf16_buf.size() < 128)
+ m_utf16_buf.resize(128);
+ if (m_uchar_buf.size() < 128)
+ m_uchar_buf.resize(128);
+ m_utf8_buf.reserve(512);
+ }
+ catch (...)
+ {
+ return std::errc::not_enough_memory;
+ }
- osd_printf_verbose("un7z: opened archive file %s\n", m_filename);
+ if (!m_archive_stream.file)
+ {
+ osd_file::ptr file;
+ std::error_condition const err = osd_file::open(m_filename, OPEN_FLAG_READ, file, m_archive_stream.length);
+ if (err)
+ return err;
+ m_archive_stream.file = osd_file_read(std::move(file));
+ osd_printf_verbose("un7z: opened archive file %s\n", m_filename);
+ }
+ else if (!m_archive_stream.length)
+ {
+ std::error_condition const err = m_archive_stream.file->length(m_archive_stream.length);
+ if (err)
+ {
+ osd_printf_verbose(
+ "un7z: error getting length of archive file %s (%s:%d %s)\n",
+ m_filename, err.category().name(), err.value(), err.message());
+ return err;
+ }
+ }
- CrcGenerateTable(); // FIXME: doesn't belong here - it should be called once statically
+ // TODO: coordinate this with other LZMA users in the codebase?
+ struct crc_table_generator { crc_table_generator() { CrcGenerateTable(); } };
+ static crc_table_generator crc_table;
SzArEx_Init(&m_db);
m_inited = true;
@@ -329,13 +369,13 @@ archive_file::error m7z_file_impl::initialize()
switch (res)
{
case SZ_ERROR_UNSUPPORTED: return archive_file::error::UNSUPPORTED;
- case SZ_ERROR_MEM: return archive_file::error::OUT_OF_MEMORY;
+ case SZ_ERROR_MEM: return std::errc::not_enough_memory;
case SZ_ERROR_INPUT_EOF: return archive_file::error::FILE_TRUNCATED;
- default: return archive_file::error::FILE_ERROR;
+ default: return std::errc::io_error; // TODO: better default error?
}
}
- return archive_file::error::NONE;
+ return std::error_condition();
}
@@ -344,33 +384,38 @@ archive_file::error m7z_file_impl::initialize()
to the cache
-------------------------------------------------*/
-void m7z_file_impl::close(ptr &&archive)
+void m7z_file_impl::close(ptr &&archive) noexcept
{
- if (!archive) return;
+ // if the filename isn't empty, the implementation can be cached
+ if (archive && !archive->m_filename.empty())
+ {
+ // close the open files
+ osd_printf_verbose("un7z: closing archive file %s and sending to cache\n", archive->m_filename);
+ archive->m_archive_stream.file.reset();
- // close the open files
- osd_printf_verbose("un7z: closing archive file %s and sending to cache\n", archive->m_filename);
- archive->m_archive_stream.osdfile.reset();
+ // find the first nullptr entry in the cache
+ std::lock_guard<std::mutex> guard(s_cache_mutex);
+ std::size_t cachenum;
+ for (cachenum = 0; cachenum < s_cache.size(); cachenum++)
+ if (!s_cache[cachenum])
+ break;
- // find the first nullptr entry in the cache
- std::lock_guard<std::mutex> guard(s_cache_mutex);
- std::size_t cachenum;
- for (cachenum = 0; cachenum < s_cache.size(); cachenum++)
- if (!s_cache[cachenum])
- break;
+ // if no room left in the cache, free the bottommost entry
+ if (cachenum == s_cache.size())
+ {
+ cachenum--;
+ osd_printf_verbose("un7z: removing %s from cache to make space\n", s_cache[cachenum]->m_filename);
+ s_cache[cachenum].reset();
+ }
- // if no room left in the cache, free the bottommost entry
- if (cachenum == s_cache.size())
- {
- cachenum--;
- osd_printf_verbose("un7z: removing %s from cache to make space\n", s_cache[cachenum]->m_filename);
- s_cache[cachenum].reset();
+ // move everyone else down and place us at the top
+ for ( ; cachenum > 0; cachenum--)
+ s_cache[cachenum] = std::move(s_cache[cachenum - 1]);
+ s_cache[0] = std::move(archive);
}
- // move everyone else down and place us at the top
- for ( ; cachenum > 0; cachenum--)
- s_cache[cachenum] = std::move(s_cache[cachenum - 1]);
- s_cache[0] = std::move(archive);
+ // make sure it's cleaned up
+ archive.reset();
}
@@ -384,7 +429,7 @@ void m7z_file_impl::close(ptr &&archive)
from a _7Z into the target buffer
-------------------------------------------------*/
-archive_file::error m7z_file_impl::decompress(void *buffer, std::uint32_t length)
+std::error_condition m7z_file_impl::decompress(void *buffer, std::size_t length) noexcept
{
// if we don't have enough buffer, error
if (length < m_curr_length)
@@ -394,15 +439,19 @@ archive_file::error m7z_file_impl::decompress(void *buffer, std::uint32_t length
}
// make sure the file is open..
- if (!m_archive_stream.osdfile)
+ if (!m_archive_stream.file)
{
- m_archive_stream.currfpos = 0;
- osd_file::error const err = osd_file::open(m_filename, OPEN_FLAG_READ, m_archive_stream.osdfile, m_archive_stream.length);
- if (err != osd_file::error::NONE)
+ m_archive_stream.currfpos = 0; // FIXME: should it really be changing the file pointer out from under LZMA?
+ osd_file::ptr file;
+ std::error_condition const err = osd_file::open(m_filename, OPEN_FLAG_READ, file, m_archive_stream.length);
+ if (err)
{
- osd_printf_error("un7z: error reopening archive file %s (%d)\n", m_filename, int(err));
- return archive_file::error::FILE_ERROR;
+ osd_printf_error(
+ "un7z: error reopening archive file %s (%s:%d %s)\n",
+ m_filename, err.category().name(), err.value(), err.message());
+ return err;
}
+ m_archive_stream.file = osd_file_read(std::move(file));
osd_printf_verbose("un7z: reopened archive file %s\n", m_filename);
}
@@ -419,7 +468,7 @@ archive_file::error m7z_file_impl::decompress(void *buffer, std::uint32_t length
switch (res)
{
case SZ_ERROR_UNSUPPORTED: return archive_file::error::UNSUPPORTED;
- case SZ_ERROR_MEM: return archive_file::error::OUT_OF_MEMORY;
+ case SZ_ERROR_MEM: return std::errc::not_enough_memory;
case SZ_ERROR_INPUT_EOF: return archive_file::error::FILE_TRUNCATED;
default: return archive_file::error::DECOMPRESS_ERROR;
}
@@ -427,45 +476,64 @@ archive_file::error m7z_file_impl::decompress(void *buffer, std::uint32_t length
// copy to destination buffer
std::memcpy(buffer, m_out_buffer + offset, (std::min<std::size_t>)(length, out_size_processed));
- return archive_file::error::NONE;
+ return std::error_condition();
}
int m7z_file_impl::search(
int i,
std::uint32_t search_crc,
- const std::string &search_filename,
+ std::string_view search_filename,
bool matchcrc,
bool matchname,
- bool partialpath)
+ bool partialpath) noexcept
{
- for ( ; i < m_db.NumFiles; i++)
- {
- make_utf8_name(i);
- bool const is_dir(SzArEx_IsDir(&m_db, i));
- const std::uint64_t size(SzArEx_GetFileSize(&m_db, i));
- const std::uint32_t crc(m_db.CRCs.Vals[i]);
- const bool crcmatch(SzBitArray_Check(m_db.CRCs.Defs, i) && (crc == search_crc));
- auto const partialoffset(m_utf8_buf.size() - 1 - search_filename.length());
- bool const partialpossible((m_utf8_buf.size() > (search_filename.length() + 1)) && (m_utf8_buf[partialoffset - 1] == '/'));
- const bool namematch(
- !core_stricmp(search_filename.c_str(), &m_utf8_buf[0]) ||
- (partialpath && partialpossible && !core_stricmp(search_filename.c_str(), &m_utf8_buf[partialoffset])));
-
- const bool found = ((!matchcrc && !matchname) || !is_dir) && (!matchcrc || crcmatch) && (!matchname || namematch);
- if (found)
+ try
+ {
+ for ( ; i < m_db.NumFiles; i++)
{
- m_curr_file_idx = i;
- m_curr_is_dir = is_dir;
- m_curr_name = &m_utf8_buf[0];
- m_curr_length = size;
- set_curr_modified();
- m_curr_crc = crc;
-
- return i;
+ make_utf8_name(i);
+ bool const is_dir(SzArEx_IsDir(&m_db, i));
+ const std::uint64_t size(SzArEx_GetFileSize(&m_db, i));
+ const std::uint32_t crc(m_db.CRCs.Vals[i]);
+
+ const bool crcmatch(SzBitArray_Check(m_db.CRCs.Defs, i) && (crc == search_crc));
+ bool found;
+ if (!matchname)
+ {
+ found = !matchcrc || (crcmatch && !is_dir);
+ }
+ else
+ {
+ auto const partialoffset = m_utf8_buf.size() - search_filename.length();
+ const bool namematch =
+ (search_filename.length() == m_utf8_buf.size()) &&
+ (search_filename.empty() || !core_strnicmp(&search_filename[0], &m_utf8_buf[0], search_filename.length()));
+ bool const partialmatch =
+ partialpath &&
+ ((m_utf8_buf.size() > search_filename.length()) && (m_utf8_buf[partialoffset - 1] == '/')) &&
+ (search_filename.empty() || !core_strnicmp(&search_filename[0], &m_utf8_buf[partialoffset], search_filename.length()));
+ found = (!matchcrc || crcmatch) && (namematch || partialmatch);
+ }
+
+ if (found)
+ {
+ // set the name first - resizing it can throw an exception, and we want the state to be consistent
+ m_curr_name.assign(m_utf8_buf.begin(), m_utf8_buf.end());
+ m_curr_file_idx = i;
+ m_curr_is_dir = is_dir;
+ m_curr_length = size;
+ set_curr_modified();
+ m_curr_crc = crc;
+
+ return i;
+ }
}
}
-
+ catch (...)
+ {
+ // allocation error handling name
+ }
return -1;
}
@@ -475,14 +543,14 @@ void m7z_file_impl::make_utf8_name(int index)
std::size_t len, out_pos;
len = SzArEx_GetFileNameUtf16(&m_db, index, nullptr);
- m_utf16_buf.resize((std::max<std::size_t>)(m_utf16_buf.size(), len));
+ m_utf16_buf.resize(std::max<std::size_t>(m_utf16_buf.size(), len));
SzArEx_GetFileNameUtf16(&m_db, index, &m_utf16_buf[0]);
- m_uchar_buf.resize((std::max<std::size_t>)(m_uchar_buf.size(), len));
+ m_uchar_buf.resize(std::max<std::size_t>(m_uchar_buf.size(), len));
out_pos = 0;
for (std::size_t in_pos = 0; in_pos < (len - 1); )
{
- const int used = uchar_from_utf16(&m_uchar_buf[out_pos], (char16_t *)&m_utf16_buf[in_pos], len - in_pos);
+ const int used = uchar_from_utf16(&m_uchar_buf[out_pos], reinterpret_cast<char16_t const *>(&m_utf16_buf[in_pos]), len - in_pos);
if (used < 0)
{
in_pos++;
@@ -497,7 +565,7 @@ void m7z_file_impl::make_utf8_name(int index)
}
len = out_pos;
- m_utf8_buf.resize((std::max<std::size_t>)(m_utf8_buf.size(), 4 * len + 1));
+ m_utf8_buf.resize((std::max<std::size_t>)(m_utf8_buf.size(), 4 * len));
out_pos = 0;
for (std::size_t in_pos = 0; in_pos < len; in_pos++)
{
@@ -508,30 +576,35 @@ void m7z_file_impl::make_utf8_name(int index)
out_pos += produced;
assert(out_pos < m_utf8_buf.size());
}
- m_utf8_buf[out_pos++] = '\0';
m_utf8_buf.resize(out_pos);
}
-void m7z_file_impl::set_curr_modified()
+void m7z_file_impl::set_curr_modified() noexcept
{
if (SzBitWithVals_Check(&m_db.MTime, m_curr_file_idx))
{
CNtfsFileTime const &file_time(m_db.MTime.Vals[m_curr_file_idx]);
- auto ticks = ntfs_duration_from_filetime(file_time.High, file_time.Low);
- m_curr_modified = system_clock_time_point_from_ntfs_duration(ticks);
- }
- else
- {
- // FIXME: what do we do about a lack of time?
+ try
+ {
+ auto ticks = ntfs_duration_from_filetime(file_time.High, file_time.Low);
+ m_curr_modified = system_clock_time_point_from_ntfs_duration(ticks);
+ return;
+ }
+ catch (...)
+ {
+ }
}
+
+ // no modification time available, or out-of-range exception
+ m_curr_modified = std::chrono::system_clock::from_time_t(std::time_t(0));
}
} // anonymous namespace
-archive_file::error archive_file::open_7z(const std::string &filename, ptr &result)
+std::error_condition archive_file::open_7z(std::string_view filename, ptr &result) noexcept
{
// ensure we start with a nullptr result
result.reset();
@@ -542,21 +615,49 @@ archive_file::error archive_file::open_7z(const std::string &filename, ptr &resu
if (!newimpl)
{
// allocate memory for the 7z file structure
- try { newimpl = std::make_unique<m7z_file_impl>(filename); }
- catch (...) { return error::OUT_OF_MEMORY; }
- error const err = newimpl->initialize();
- if (err != error::NONE) return err;
+ try { newimpl = std::make_unique<m7z_file_impl>(std::string(filename)); }
+ catch (...) { return std::errc::not_enough_memory; }
+ auto const err = newimpl->initialize();
+ if (err)
+ return err;
}
- try
+ // allocate the archive API wrapper
+ result.reset(new (std::nothrow) m7z_file_wrapper(std::move(newimpl)));
+ if (result)
{
- result = std::make_unique<m7z_file_wrapper>(std::move(newimpl));
- return error::NONE;
+ return std::error_condition();
}
- catch (...)
+ else
+ {
+ m7z_file_impl::close(std::move(newimpl));
+ return std::errc::not_enough_memory;
+ }
+}
+
+std::error_condition archive_file::open_7z(random_read::ptr &&file, ptr &result) noexcept
+{
+ // ensure we start with a nullptr result
+ result.reset();
+
+ // allocate memory for the zip_file structure
+ m7z_file_impl::ptr newimpl(new (std::nothrow) m7z_file_impl(std::move(file)));
+ if (!newimpl)
+ return std::errc::not_enough_memory;
+ auto const err = newimpl->initialize();
+ if (err)
+ return err;
+
+ // allocate the archive API wrapper
+ result.reset(new (std::nothrow) m7z_file_wrapper(std::move(newimpl)));
+ if (result)
+ {
+ return std::error_condition();
+ }
+ else
{
m7z_file_impl::close(std::move(newimpl));
- return error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
}
}
@@ -566,7 +667,7 @@ archive_file::error archive_file::open_7z(const std::string &filename, ptr &resu
cache and free all memory
-------------------------------------------------*/
-void m7z_file_cache_clear()
+void m7z_file_cache_clear() noexcept
{
// This is a trampoline called from unzip.cpp to avoid the need to have the zip and 7zip code in one file
m7z_file_impl::cache_clear();
diff --git a/src/lib/util/unicode.cpp b/src/lib/util/unicode.cpp
index a375224fd1e..6787db4a501 100644
--- a/src/lib/util/unicode.cpp
+++ b/src/lib/util/unicode.cpp
@@ -457,7 +457,7 @@ int utf16f_from_uchar(char16_t *utf16string, size_t count, char32_t uchar)
std::wstring wstring_from_utf8(const std::string &utf8string)
{
-#ifdef WIN32
+#ifdef _WIN32
// for some reason, using codecvt yields bad results on MinGW (but not MSVC)
return osd::text::to_wstring(utf8string);
#else
@@ -473,7 +473,7 @@ std::wstring wstring_from_utf8(const std::string &utf8string)
std::string utf8_from_wstring(const std::wstring &string)
{
-#ifdef WIN32
+#ifdef _WIN32
// for some reason, using codecvt yields bad results on MinGW (but not MSVC)
return osd::text::from_wstring(string);
#else
diff --git a/src/lib/util/unzip.cpp b/src/lib/util/unzip.cpp
index a275cc7df06..1e18b4c2b7c 100644
--- a/src/lib/util/unzip.cpp
+++ b/src/lib/util/unzip.cpp
@@ -12,9 +12,11 @@
#include "corestr.h"
#include "hashing.h"
+#include "ioprocs.h"
+#include "timeconv.h"
+
#include "osdcore.h"
#include "osdfile.h"
-#include "timeconv.h"
#include "lzma/C/LzmaDec.h"
@@ -23,42 +25,68 @@
#include <algorithm>
#include <array>
#include <cassert>
+#include <cerrno>
#include <chrono>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <mutex>
+#include <optional>
#include <ratio>
#include <utility>
#include <vector>
namespace util {
+
namespace {
+
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
+class archive_category_impl : public std::error_category
+{
+public:
+ virtual char const *name() const noexcept override { return "archive"; }
+
+ virtual std::string message(int condition) const override
+ {
+ using namespace std::literals;
+ static std::string_view const s_messages[] = {
+ "No error"sv,
+ "Bad archive signature"sv,
+ "Decompression error"sv,
+ "Archive file truncated"sv,
+ "Archive file corrupt"sv,
+ "Archive file uses unsupported features"sv,
+ "Buffer too small for data"sv };
+ if ((0 <= condition) && (std::size(s_messages) > condition))
+ return std::string(s_messages[condition]);
+ else
+ return "Unknown error"s;
+ }
+};
+
+
class zip_file_impl
{
public:
- typedef std::unique_ptr<zip_file_impl> ptr;
-
- zip_file_impl(const std::string &filename)
- : m_filename(filename)
- , m_file()
- , m_length(0)
- , m_ecd()
- , m_cd()
- , m_cd_pos(0)
- , m_header()
- , m_curr_is_dir(false)
- , m_buffer()
+ using ptr = std::unique_ptr<zip_file_impl>;
+
+ zip_file_impl(std::string &&filename) noexcept
+ : m_filename(std::move(filename))
{
std::fill(m_buffer.begin(), m_buffer.end(), 0);
}
- static ptr find_cached(const std::string &filename)
+ zip_file_impl(random_read::ptr &&file) noexcept
+ : zip_file_impl(std::string())
+ {
+ m_file = std::move(file);
+ }
+
+ static ptr find_cached(std::string_view filename) noexcept
{
std::lock_guard<std::mutex> guard(s_cache_mutex);
for (std::size_t cachenum = 0; cachenum < s_cache.size(); cachenum++)
@@ -66,27 +94,31 @@ public:
// if we have a valid entry and it matches our filename, use it and remove from the cache
if (s_cache[cachenum] && (filename == s_cache[cachenum]->m_filename))
{
+ using std::swap;
ptr result;
- std::swap(s_cache[cachenum], result);
+ swap(s_cache[cachenum], result);
osd_printf_verbose("unzip: found %s in cache\n", filename);
return result;
}
}
return ptr();
}
- static void close(ptr &&zip);
- static void cache_clear()
+
+ static void close(ptr &&zip) noexcept;
+
+ static void cache_clear() noexcept
{
// clear call cache entries
std::lock_guard<std::mutex> guard(s_cache_mutex);
- for (std::size_t cachenum = 0; cachenum < s_cache.size(); s_cache[cachenum++].reset()) { }
+ for (auto &cached : s_cache)
+ cached.reset();
}
- archive_file::error initialize()
+ std::error_condition initialize() noexcept
{
// read ecd data
auto const ziperr = read_ecd();
- if (ziperr != archive_file::error::NONE)
+ if (ziperr)
return ziperr;
// verify that we can work with this zipfile (no disk spanning allowed)
@@ -111,7 +143,7 @@ public:
catch (...)
{
osd_printf_error("unzip: %s failed to allocate memory for central directory\n", m_filename);
- return archive_file::error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
}
// read the central directory
@@ -119,13 +151,15 @@ public:
std::size_t cd_offs(0);
while (cd_remaining)
{
- std::uint32_t const chunk(std::uint32_t((std::min<std::uint64_t>)(std::numeric_limits<std::uint32_t>::max(), cd_remaining)));
- std::uint32_t read_length(0);
- auto const filerr = m_file->read(&m_cd[cd_offs], m_ecd.cd_start_disk_offset + cd_offs, chunk, read_length);
- if (filerr != osd_file::error::NONE)
+ std::size_t const chunk(std::size_t(std::min<std::uint64_t>(std::numeric_limits<std::size_t>::max(), cd_remaining)));
+ std::size_t read_length(0);
+ std::error_condition const filerr = m_file->read_at(m_ecd.cd_start_disk_offset + cd_offs, &m_cd[cd_offs], chunk, read_length);
+ if (filerr)
{
- osd_printf_error("unzip: %s error reading central directory (%d)\n", m_filename, int(filerr));
- return archive_file::error::FILE_ERROR;
+ osd_printf_error(
+ "unzip: %s error reading central directory (%s:%d %s)\n",
+ m_filename, filerr.category().name(), filerr.value(), filerr.message());
+ return filerr;
}
if (!read_length)
{
@@ -137,50 +171,54 @@ public:
}
osd_printf_verbose("unzip: read %s central directory\n", m_filename);
- return archive_file::error::NONE;
+ return std::error_condition();
}
- int first_file()
+ int first_file() noexcept
{
m_cd_pos = 0;
- return search(0, std::string(), false, false, false);
+ return search(0, std::string_view(), false, false, false);
}
- int next_file()
+
+ int next_file() noexcept
{
- return search(0, std::string(), false, false, false);
+ return search(0, std::string_view(), false, false, false);
}
- int search(std::uint32_t crc)
+ int search(std::uint32_t crc) noexcept
{
m_cd_pos = 0;
- return search(crc, std::string(), true, false, false);
+ return search(crc, std::string_view(), true, false, false);
}
- int search(const std::string &filename, bool partialpath)
+
+ int search(std::string_view filename, bool partialpath) noexcept
{
m_cd_pos = 0;
return search(0, filename, false, true, partialpath);
}
- int search(std::uint32_t crc, const std::string &filename, bool partialpath)
+
+ int search(std::uint32_t crc, std::string_view filename, bool partialpath) noexcept
{
m_cd_pos = 0;
return search(crc, filename, true, true, partialpath);
}
- bool current_is_directory() const { return m_curr_is_dir; }
- const std::string &current_name() const { return m_header.file_name; }
- std::uint64_t current_uncompressed_length() const { return m_header.uncompressed_length; }
- std::chrono::system_clock::time_point current_last_modified() const
+ bool current_is_directory() const noexcept { return m_curr_is_dir; }
+
+ const std::string &current_name() const noexcept { return m_header.file_name; }
+
+ std::uint64_t current_uncompressed_length() const noexcept { return m_header.uncompressed_length; }
+
+ std::chrono::system_clock::time_point current_last_modified() const noexcept
{
- if (!m_header.modified_cached)
- {
+ if (!m_header.modified)
m_header.modified = decode_dos_time(m_header.modified_date, m_header.modified_time);
- m_header.modified_cached = true;
- }
- return m_header.modified;
+ return *m_header.modified;
}
- std::uint32_t current_crc() const { return m_header.crc; }
- archive_file::error decompress(void *buffer, std::uint32_t length);
+ std::uint32_t current_crc() const noexcept { return m_header.crc; }
+
+ std::error_condition decompress(void *buffer, std::size_t length) noexcept;
private:
zip_file_impl(const zip_file_impl &) = delete;
@@ -188,28 +226,43 @@ private:
zip_file_impl &operator=(const zip_file_impl &) = delete;
zip_file_impl &operator=(zip_file_impl &&) = delete;
- int search(std::uint32_t search_crc, const std::string &search_filename, bool matchcrc, bool matchname, bool partialpath);
+ int search(std::uint32_t search_crc, std::string_view search_filename, bool matchcrc, bool matchname, bool partialpath) noexcept;
- archive_file::error reopen()
+ std::error_condition reopen() noexcept
{
if (!m_file)
{
- auto const filerr = osd_file::open(m_filename, OPEN_FLAG_READ, m_file, m_length);
- if (filerr != osd_file::error::NONE)
+ osd_file::ptr file;
+ auto const filerr = osd_file::open(m_filename, OPEN_FLAG_READ, file, m_length);
+ if (filerr)
{
// this would spam every time it looks for a non-existent archive, which is a lot
- //osd_printf_error("unzip: error reopening archive file %s (%d)\n", m_filename, int(filerr));
- return archive_file::error::FILE_ERROR;
+ //osd_printf_error("unzip: error reopening archive file %s (%s:%d %s)\n", m_filename, filerr.category().name(), filerr.value(), filerr.message());
+ return filerr;
}
- else
+ m_file = osd_file_read(std::move(file));
+ if (!m_file)
{
- osd_printf_verbose("unzip: opened archive file %s\n", m_filename);
+ osd_printf_error("unzip: not enough memory to open archive file %s\n", m_filename);
+ return std::errc::not_enough_memory;
}
+ osd_printf_verbose("unzip: opened archive file %s\n", m_filename);
}
- return archive_file::error::NONE;
+ else if (!m_length)
+ {
+ auto const filerr = m_file->length(m_length);
+ if (filerr)
+ {
+ osd_printf_verbose(
+ "unzip: error getting length of archive file %s (%s:%d %s)\n",
+ m_filename, filerr.category().name(), filerr.value(), filerr.message());
+ return filerr;
+ }
+ }
+ return std::error_condition();
}
- static std::chrono::system_clock::time_point decode_dos_time(std::uint16_t date, std::uint16_t time)
+ static std::chrono::system_clock::time_point decode_dos_time(std::uint16_t date, std::uint16_t time) noexcept
{
// FIXME: work out why this doesn't always work
// negative tm_isdst should automatically determine whether DST is in effect for the date,
@@ -228,30 +281,39 @@ private:
}
// ZIP file parsing
- archive_file::error read_ecd();
- archive_file::error get_compressed_data_offset(std::uint64_t &offset);
+ std::error_condition read_ecd() noexcept;
+ std::error_condition get_compressed_data_offset(std::uint64_t &offset) noexcept;
// decompression interfaces
- archive_file::error decompress_data_type_0(std::uint64_t offset, void *buffer, std::uint32_t length);
- archive_file::error decompress_data_type_8(std::uint64_t offset, void *buffer, std::uint32_t length);
- archive_file::error decompress_data_type_14(std::uint64_t offset, void *buffer, std::uint32_t length);
+ std::error_condition decompress_data_type_0(std::uint64_t offset, void *buffer, std::size_t length) noexcept;
+ std::error_condition decompress_data_type_8(std::uint64_t offset, void *buffer, std::size_t length) noexcept;
+ std::error_condition decompress_data_type_14(std::uint64_t offset, void *buffer, std::size_t length) noexcept;
struct file_header
{
- std::uint16_t version_created; // version made by
- std::uint16_t version_needed; // version needed to extract
- std::uint16_t bit_flag; // general purpose bit flag
- std::uint16_t compression; // compression method
- mutable std::chrono::system_clock::time_point modified; // last mod file date/time
- std::uint32_t crc; // crc-32
- std::uint64_t compressed_length; // compressed size
- std::uint64_t uncompressed_length; // uncompressed size
- std::uint32_t start_disk_number; // disk number start
- std::uint64_t local_header_offset; // relative offset of local header
- std::string file_name; // file name
-
- std::uint16_t modified_date, modified_time;
- mutable bool modified_cached;
+ private:
+ using optional_time_point = std::optional<std::chrono::system_clock::time_point>;
+
+ public:
+ file_header() noexcept { }
+ file_header(file_header const &) = default;
+ file_header(file_header &&) noexcept = default;
+ file_header &operator=(file_header const &) = default;
+ file_header &operator=(file_header &&) noexcept = default;
+
+ std::uint16_t version_created; // version made by
+ std::uint16_t version_needed; // version needed to extract
+ std::uint16_t bit_flag; // general purpose bit flag
+ std::uint16_t compression; // compression method
+ mutable optional_time_point modified; // last mod file date/time
+ std::uint32_t crc; // crc-32
+ std::uint64_t compressed_length; // compressed size
+ std::uint64_t uncompressed_length; // uncompressed size
+ std::uint32_t start_disk_number; // disk number start
+ std::uint64_t local_header_offset; // relative offset of local header
+ std::string file_name; // file name
+
+ std::uint16_t modified_date, modified_time;
};
// contains extracted end of central directory information
@@ -271,15 +333,15 @@ private:
static std::mutex s_cache_mutex;
const std::string m_filename; // copy of ZIP filename (for caching)
- osd_file::ptr m_file; // OSD file handle
- std::uint64_t m_length; // length of zip file
+ random_read::ptr m_file; // file handle
+ std::uint64_t m_length = 0; // length of zip file
ecd m_ecd; // end of central directory
std::vector<std::uint8_t> m_cd; // central directory raw data
- std::uint32_t m_cd_pos; // position in central directory
+ std::uint32_t m_cd_pos = 0; // position in central directory
file_header m_header; // current file header
- bool m_curr_is_dir; // current file is directory
+ bool m_curr_is_dir = false; // current file is directory
std::array<std::uint8_t, DECOMPRESS_BUFSIZE> m_buffer; // buffer for decompression
};
@@ -288,32 +350,32 @@ private:
class zip_file_wrapper : public archive_file
{
public:
- zip_file_wrapper(zip_file_impl::ptr &&impl) : m_impl(std::move(impl)) { assert(m_impl); }
+ zip_file_wrapper(zip_file_impl::ptr &&impl) noexcept : m_impl(std::move(impl)) { assert(m_impl); }
virtual ~zip_file_wrapper() { zip_file_impl::close(std::move(m_impl)); }
- virtual int first_file() override { return m_impl->first_file(); }
- virtual int next_file() override { return m_impl->next_file(); }
+ virtual int first_file() noexcept override { return m_impl->first_file(); }
+ virtual int next_file() noexcept override { return m_impl->next_file(); }
- virtual int search(std::uint32_t crc) override
+ virtual int search(std::uint32_t crc) noexcept override
{
return m_impl->search(crc);
}
- virtual int search(const std::string &filename, bool partialpath) override
+ virtual int search(std::string_view filename, bool partialpath) noexcept override
{
return m_impl->search(filename, partialpath);
}
- virtual int search(std::uint32_t crc, const std::string &filename, bool partialpath) override
+ virtual int search(std::uint32_t crc, std::string_view filename, bool partialpath) noexcept override
{
return m_impl->search(crc, filename, partialpath);
}
- virtual bool current_is_directory() const override { return m_impl->current_is_directory(); }
- virtual const std::string &current_name() const override { return m_impl->current_name(); }
- virtual std::uint64_t current_uncompressed_length() const override { return m_impl->current_uncompressed_length(); }
- virtual std::chrono::system_clock::time_point current_last_modified() const override { return m_impl->current_last_modified(); }
- virtual std::uint32_t current_crc() const override { return m_impl->current_crc(); }
+ virtual bool current_is_directory() const noexcept override { return m_impl->current_is_directory(); }
+ virtual const std::string &current_name() const noexcept override { return m_impl->current_name(); }
+ virtual std::uint64_t current_uncompressed_length() const noexcept override { return m_impl->current_uncompressed_length(); }
+ virtual std::chrono::system_clock::time_point current_last_modified() const noexcept override { return m_impl->current_last_modified(); }
+ virtual std::uint32_t current_crc() const noexcept override { return m_impl->current_crc(); }
- virtual error decompress(void *buffer, std::uint32_t length) override { return m_impl->decompress(buffer, length); }
+ virtual std::error_condition decompress(void *buffer, std::size_t length) noexcept override { return m_impl->decompress(buffer, length); }
private:
zip_file_impl::ptr m_impl;
@@ -323,19 +385,19 @@ private:
class reader_base
{
protected:
- reader_base(void const *buf) : m_buffer(reinterpret_cast<std::uint8_t const *>(buf)) { }
+ reader_base(void const *buf) noexcept : m_buffer(reinterpret_cast<std::uint8_t const *>(buf)) { }
- std::uint8_t read_byte(std::size_t offs) const
+ std::uint8_t read_byte(std::size_t offs) const noexcept
{
return m_buffer[offs];
}
- std::uint16_t read_word(std::size_t offs) const
+ std::uint16_t read_word(std::size_t offs) const noexcept
{
return
(std::uint16_t(m_buffer[offs + 1]) << 8) |
(std::uint16_t(m_buffer[offs + 0]) << 0);
}
- std::uint32_t read_dword(std::size_t offs) const
+ std::uint32_t read_dword(std::size_t offs) const noexcept
{
return
(std::uint32_t(m_buffer[offs + 3]) << 24) |
@@ -343,7 +405,7 @@ protected:
(std::uint32_t(m_buffer[offs + 1]) << 8) |
(std::uint32_t(m_buffer[offs + 0]) << 0);
}
- std::uint64_t read_qword(std::size_t offs) const
+ std::uint64_t read_qword(std::size_t offs) const noexcept
{
return
(std::uint64_t(m_buffer[offs + 7]) << 56) |
@@ -371,17 +433,17 @@ protected:
class extra_field_reader : private reader_base
{
public:
- extra_field_reader(void const *buf, std::size_t len) : reader_base(buf), m_length(len) { }
+ extra_field_reader(void const *buf, std::size_t len) noexcept : reader_base(buf), m_length(len) { }
- std::uint16_t header_id() const { return read_word(0x00); }
- std::uint16_t data_size() const { return read_word(0x02); }
- void const * data() const { return m_buffer + 0x04; }
- extra_field_reader next() const { return extra_field_reader(m_buffer + total_length(), m_length - total_length()); }
+ std::uint16_t header_id() const noexcept { return read_word(0x00); }
+ std::uint16_t data_size() const noexcept { return read_word(0x02); }
+ void const * data() const noexcept { return m_buffer + 0x04; }
+ extra_field_reader next() const noexcept { return extra_field_reader(m_buffer + total_length(), m_length - total_length()); }
- bool length_sufficient() const { return (m_length >= minimum_length()) && (m_length >= total_length()); }
+ bool length_sufficient() const noexcept { return (m_length >= minimum_length()) && (m_length >= total_length()); }
- std::size_t total_length() const { return minimum_length() + data_size(); }
- static std::size_t minimum_length() { return 0x04; }
+ std::size_t total_length() const noexcept { return minimum_length() + data_size(); }
+ static constexpr std::size_t minimum_length() { return 0x04; }
private:
std::size_t m_length;
@@ -391,131 +453,131 @@ private:
class local_file_header_reader : private reader_base
{
public:
- local_file_header_reader(void const *buf) : reader_base(buf) { }
-
- std::uint32_t signature() const { return read_dword(0x00); }
- std::uint8_t version_needed() const { return m_buffer[0x04]; }
- std::uint8_t os_needed() const { return m_buffer[0x05]; }
- std::uint16_t general_flag() const { return read_word(0x06); }
- std::uint16_t compression_method() const { return read_word(0x08); }
- std::uint16_t modified_time() const { return read_word(0x0a); }
- std::uint16_t modified_date() const { return read_word(0x0c); }
- std::uint32_t crc32() const { return read_dword(0x0e); }
- std::uint32_t compressed_size() const { return read_dword(0x12); }
- std::uint32_t uncompressed_size() const { return read_dword(0x16); }
- std::uint16_t file_name_length() const { return read_word(0x1a); }
- std::uint16_t extra_field_length() const { return read_word(0x1c); }
+ local_file_header_reader(void const *buf) noexcept : reader_base(buf) { }
+
+ std::uint32_t signature() const noexcept { return read_dword(0x00); }
+ std::uint8_t version_needed() const noexcept { return m_buffer[0x04]; }
+ std::uint8_t os_needed() const noexcept { return m_buffer[0x05]; }
+ std::uint16_t general_flag() const noexcept { return read_word(0x06); }
+ std::uint16_t compression_method() const noexcept { return read_word(0x08); }
+ std::uint16_t modified_time() const noexcept { return read_word(0x0a); }
+ std::uint16_t modified_date() const noexcept { return read_word(0x0c); }
+ std::uint32_t crc32() const noexcept { return read_dword(0x0e); }
+ std::uint32_t compressed_size() const noexcept { return read_dword(0x12); }
+ std::uint32_t uncompressed_size() const noexcept { return read_dword(0x16); }
+ std::uint16_t file_name_length() const noexcept { return read_word(0x1a); }
+ std::uint16_t extra_field_length() const noexcept { return read_word(0x1c); }
std::string file_name() const { return read_string(0x1e, file_name_length()); }
void file_name(std::string &result) const { read_string(result, 0x1e, file_name_length()); }
- extra_field_reader extra_field() const { return extra_field_reader(m_buffer + 0x1e + file_name_length(), extra_field_length()); }
+ extra_field_reader extra_field() const noexcept { return extra_field_reader(m_buffer + 0x1e + file_name_length(), extra_field_length()); }
- bool signature_correct() const { return signature() == 0x04034b50; }
+ bool signature_correct() const noexcept { return signature() == 0x04034b50; }
- std::size_t total_length() const { return minimum_length() + file_name_length() + extra_field_length(); }
- static std::size_t minimum_length() { return 0x1e; }
+ std::size_t total_length() const noexcept { return minimum_length() + file_name_length() + extra_field_length(); }
+ static constexpr std::size_t minimum_length() { return 0x1e; }
};
class central_dir_entry_reader : private reader_base
{
public:
- central_dir_entry_reader(void const *buf) : reader_base(buf) { }
-
- std::uint32_t signature() const { return read_dword(0x00); }
- std::uint8_t version_created() const { return m_buffer[0x04]; }
- std::uint8_t os_created() const { return m_buffer[0x05]; }
- std::uint8_t version_needed() const { return m_buffer[0x06]; }
- std::uint8_t os_needed() const { return m_buffer[0x07]; }
- std::uint16_t general_flag() const { return read_word(0x08); }
- std::uint16_t compression_method() const { return read_word(0x0a); }
- std::uint16_t modified_time() const { return read_word(0x0c); }
- std::uint16_t modified_date() const { return read_word(0x0e); }
- std::uint32_t crc32() const { return read_dword(0x10); }
- std::uint32_t compressed_size() const { return read_dword(0x14); }
- std::uint32_t uncompressed_size() const { return read_dword(0x18); }
- std::uint16_t file_name_length() const { return read_word(0x1c); }
- std::uint16_t extra_field_length() const { return read_word(0x1e); }
- std::uint16_t file_comment_length() const { return read_word(0x20); }
- std::uint16_t start_disk() const { return read_word(0x22); }
- std::uint16_t int_file_attr() const { return read_word(0x24); }
- std::uint32_t ext_file_attr() const { return read_dword(0x26); }
- std::uint32_t header_offset() const { return read_dword(0x2a); }
+ central_dir_entry_reader(void const *buf) noexcept : reader_base(buf) { }
+
+ std::uint32_t signature() const noexcept { return read_dword(0x00); }
+ std::uint8_t version_created() const noexcept { return m_buffer[0x04]; }
+ std::uint8_t os_created() const noexcept { return m_buffer[0x05]; }
+ std::uint8_t version_needed() const noexcept { return m_buffer[0x06]; }
+ std::uint8_t os_needed() const noexcept { return m_buffer[0x07]; }
+ std::uint16_t general_flag() const noexcept { return read_word(0x08); }
+ std::uint16_t compression_method() const noexcept { return read_word(0x0a); }
+ std::uint16_t modified_time() const noexcept { return read_word(0x0c); }
+ std::uint16_t modified_date() const noexcept { return read_word(0x0e); }
+ std::uint32_t crc32() const noexcept { return read_dword(0x10); }
+ std::uint32_t compressed_size() const noexcept { return read_dword(0x14); }
+ std::uint32_t uncompressed_size() const noexcept { return read_dword(0x18); }
+ std::uint16_t file_name_length() const noexcept { return read_word(0x1c); }
+ std::uint16_t extra_field_length() const noexcept { return read_word(0x1e); }
+ std::uint16_t file_comment_length() const noexcept { return read_word(0x20); }
+ std::uint16_t start_disk() const noexcept { return read_word(0x22); }
+ std::uint16_t int_file_attr() const noexcept { return read_word(0x24); }
+ std::uint32_t ext_file_attr() const noexcept { return read_dword(0x26); }
+ std::uint32_t header_offset() const noexcept { return read_dword(0x2a); }
std::string file_name() const { return read_string(0x2e, file_name_length()); }
void file_name(std::string &result) const { read_string(result, 0x2e, file_name_length()); }
- extra_field_reader extra_field() const { return extra_field_reader(m_buffer + 0x2e + file_name_length(), extra_field_length()); }
+ extra_field_reader extra_field() const noexcept { return extra_field_reader(m_buffer + 0x2e + file_name_length(), extra_field_length()); }
std::string file_comment() const { return read_string(0x2e + file_name_length() + extra_field_length(), file_comment_length()); }
void file_comment(std::string &result) const { read_string(result, 0x2e + file_name_length() + extra_field_length(), file_comment_length()); }
- bool signature_correct() const { return signature() == 0x02014b50; }
+ bool signature_correct() const noexcept { return signature() == 0x02014b50; }
- std::size_t total_length() const { return minimum_length() + file_name_length() + extra_field_length() + file_comment_length(); }
- static std::size_t minimum_length() { return 0x2e; }
+ std::size_t total_length() const noexcept { return minimum_length() + file_name_length() + extra_field_length() + file_comment_length(); }
+ static constexpr std::size_t minimum_length() { return 0x2e; }
};
class ecd64_reader : private reader_base
{
public:
- ecd64_reader(void const *buf) : reader_base(buf) { }
-
- std::uint32_t signature() const { return read_dword(0x00); }
- std::uint64_t ecd64_size() const { return read_qword(0x04); }
- std::uint8_t version_created() const { return m_buffer[0x0c]; }
- std::uint8_t os_created() const { return m_buffer[0x0d]; }
- std::uint8_t version_needed() const { return m_buffer[0x0e]; }
- std::uint8_t os_needed() const { return m_buffer[0x0f]; }
- std::uint32_t this_disk_no() const { return read_dword(0x10); }
- std::uint32_t dir_start_disk() const { return read_dword(0x14); }
- std::uint64_t dir_disk_entries() const { return read_qword(0x18); }
- std::uint64_t dir_total_entries() const { return read_qword(0x20); }
- std::uint64_t dir_size() const { return read_qword(0x28); }
- std::uint64_t dir_offset() const { return read_qword(0x30); }
- void const * extensible_data() const { return m_buffer + 0x38; }
-
- bool signature_correct() const { return signature() == 0x06064b50; }
-
- std::size_t total_length() const { return 0x0c + ecd64_size(); }
- static std::size_t minimum_length() { return 0x38; }
+ ecd64_reader(void const *buf) noexcept : reader_base(buf) { }
+
+ std::uint32_t signature() const noexcept { return read_dword(0x00); }
+ std::uint64_t ecd64_size() const noexcept { return read_qword(0x04); }
+ std::uint8_t version_created() const noexcept { return m_buffer[0x0c]; }
+ std::uint8_t os_created() const noexcept { return m_buffer[0x0d]; }
+ std::uint8_t version_needed() const noexcept { return m_buffer[0x0e]; }
+ std::uint8_t os_needed() const noexcept { return m_buffer[0x0f]; }
+ std::uint32_t this_disk_no() const noexcept { return read_dword(0x10); }
+ std::uint32_t dir_start_disk() const noexcept { return read_dword(0x14); }
+ std::uint64_t dir_disk_entries() const noexcept { return read_qword(0x18); }
+ std::uint64_t dir_total_entries() const noexcept { return read_qword(0x20); }
+ std::uint64_t dir_size() const noexcept { return read_qword(0x28); }
+ std::uint64_t dir_offset() const noexcept { return read_qword(0x30); }
+ void const * extensible_data() const noexcept { return m_buffer + 0x38; }
+
+ bool signature_correct() const noexcept { return signature() == 0x06064b50; }
+
+ std::size_t total_length() const noexcept { return 0x0c + ecd64_size(); }
+ static constexpr std::size_t minimum_length() { return 0x38; }
};
class ecd64_locator_reader : private reader_base
{
public:
- ecd64_locator_reader(void const *buf) : reader_base(buf) { }
+ ecd64_locator_reader(void const *buf) noexcept : reader_base(buf) { }
- std::uint32_t signature() const { return read_dword(0x00); }
- std::uint32_t ecd64_disk() const { return read_dword(0x04); }
- std::uint64_t ecd64_offset() const { return read_qword(0x08); }
- std::uint32_t total_disks() const { return read_dword(0x10); }
+ std::uint32_t signature() const noexcept { return read_dword(0x00); }
+ std::uint32_t ecd64_disk() const noexcept { return read_dword(0x04); }
+ std::uint64_t ecd64_offset() const noexcept { return read_qword(0x08); }
+ std::uint32_t total_disks() const noexcept { return read_dword(0x10); }
- bool signature_correct() const { return signature() == 0x07064b50; }
+ bool signature_correct() const noexcept { return signature() == 0x07064b50; }
- std::size_t total_length() const { return minimum_length(); }
- static std::size_t minimum_length() { return 0x14; }
+ std::size_t total_length() const noexcept { return minimum_length(); }
+ static constexpr std::size_t minimum_length() { return 0x14; }
};
class ecd_reader : private reader_base
{
public:
- ecd_reader(void const *buf) : reader_base(buf) { }
-
- std::uint32_t signature() const { return read_dword(0x00); }
- std::uint16_t this_disk_no() const { return read_word(0x04); }
- std::uint16_t dir_start_disk() const { return read_word(0x06); }
- std::uint16_t dir_disk_entries() const { return read_word(0x08); }
- std::uint16_t dir_total_entries() const { return read_word(0x0a); }
- std::uint32_t dir_size() const { return read_dword(0x0c); }
- std::uint32_t dir_offset() const { return read_dword(0x10); }
- std::uint16_t comment_length() const { return read_word(0x14); }
+ ecd_reader(void const *buf) noexcept : reader_base(buf) { }
+
+ std::uint32_t signature() const noexcept { return read_dword(0x00); }
+ std::uint16_t this_disk_no() const noexcept { return read_word(0x04); }
+ std::uint16_t dir_start_disk() const noexcept { return read_word(0x06); }
+ std::uint16_t dir_disk_entries() const noexcept { return read_word(0x08); }
+ std::uint16_t dir_total_entries() const noexcept { return read_word(0x0a); }
+ std::uint32_t dir_size() const noexcept { return read_dword(0x0c); }
+ std::uint32_t dir_offset() const noexcept { return read_dword(0x10); }
+ std::uint16_t comment_length() const noexcept { return read_word(0x14); }
std::string comment() const { return read_string(0x16, comment_length()); }
void comment(std::string &result) const { read_string(result, 0x16, comment_length()); }
- bool signature_correct() const { return signature() == 0x06054b50; }
+ bool signature_correct() const noexcept { return signature() == 0x06054b50; }
- std::size_t total_length() const { return minimum_length() + comment_length(); }
- static std::size_t minimum_length() { return 0x16; }
+ std::size_t total_length() const noexcept { return minimum_length() + comment_length(); }
+ static constexpr std::size_t minimum_length() { return 0x16; }
};
@@ -525,7 +587,7 @@ public:
template <typename T>
zip64_ext_info_reader(
T const &header,
- extra_field_reader const &field)
+ extra_field_reader const &field) noexcept
: reader_base(field.data())
, m_uncompressed_size(header.uncompressed_size())
, m_compressed_size(header.compressed_size())
@@ -538,13 +600,13 @@ public:
{
}
- std::uint64_t uncompressed_size() const { return ~m_uncompressed_size ? m_uncompressed_size : read_qword(0x00); }
- std::uint64_t compressed_size() const { return ~m_compressed_size ? m_compressed_size : read_qword(m_offs_compressed_size); }
- std::uint64_t header_offset() const { return ~m_header_offset ? m_header_offset : read_qword(m_offs_header_offset); }
- std::uint32_t start_disk() const { return ~m_start_disk ? m_start_disk : read_dword(m_offs_start_disk); }
+ std::uint64_t uncompressed_size() const noexcept { return ~m_uncompressed_size ? m_uncompressed_size : read_qword(0x00); }
+ std::uint64_t compressed_size() const noexcept { return ~m_compressed_size ? m_compressed_size : read_qword(m_offs_compressed_size); }
+ std::uint64_t header_offset() const noexcept { return ~m_header_offset ? m_header_offset : read_qword(m_offs_header_offset); }
+ std::uint32_t start_disk() const noexcept { return ~m_start_disk ? m_start_disk : read_dword(m_offs_start_disk); }
- std::size_t total_length() const { return minimum_length() + m_offs_end; }
- static std::size_t minimum_length() { return 0x00; }
+ std::size_t total_length() const noexcept { return minimum_length() + m_offs_end; }
+ static constexpr std::size_t minimum_length() { return 0x00; }
private:
std::uint32_t m_uncompressed_size;
@@ -562,15 +624,15 @@ private:
class utf8_path_reader : private reader_base
{
public:
- utf8_path_reader(extra_field_reader const &field) : reader_base(field.data()), m_length(field.data_size()) { }
+ utf8_path_reader(extra_field_reader const &field) noexcept : reader_base(field.data()), m_length(field.data_size()) { }
- std::uint8_t version() const { return m_buffer[0]; }
- std::uint32_t name_crc32() const { return read_dword(0x01); }
+ std::uint8_t version() const noexcept { return m_buffer[0]; }
+ std::uint32_t name_crc32() const noexcept { return read_dword(0x01); }
std::string unicode_name() const { return read_string(0x05, m_length - 0x05); }
void unicode_name(std::string &result) const { return read_string(result, 0x05, m_length - 0x05); }
- std::size_t total_length() const { return m_length; }
- static std::size_t minimum_length() { return 0x05; }
+ std::size_t total_length() const noexcept { return m_length; }
+ static constexpr std::size_t minimum_length() { return 0x05; }
private:
std::size_t m_length;
@@ -580,17 +642,17 @@ private:
class ntfs_tag_reader : private reader_base
{
public:
- ntfs_tag_reader(void const *buf, std::size_t len) : reader_base(buf), m_length(len) { }
+ ntfs_tag_reader(void const *buf, std::size_t len) noexcept : reader_base(buf), m_length(len) { }
- std::uint16_t tag() const { return read_word(0x00); }
- std::uint16_t size() const { return read_word(0x02); }
- void const * data() const { return m_buffer + 0x04; }
- ntfs_tag_reader next() const { return ntfs_tag_reader(m_buffer + total_length(), m_length - total_length()); }
+ std::uint16_t tag() const noexcept { return read_word(0x00); }
+ std::uint16_t size() const noexcept { return read_word(0x02); }
+ void const * data() const noexcept { return m_buffer + 0x04; }
+ ntfs_tag_reader next() const noexcept { return ntfs_tag_reader(m_buffer + total_length(), m_length - total_length()); }
- bool length_sufficient() const { return (m_length >= minimum_length()) && (m_length >= total_length()); }
+ bool length_sufficient() const noexcept { return (m_length >= minimum_length()) && (m_length >= total_length()); }
- std::size_t total_length() const { return minimum_length() + size(); }
- static std::size_t minimum_length() { return 0x04; }
+ std::size_t total_length() const noexcept { return minimum_length() + size(); }
+ static constexpr std::size_t minimum_length() { return 0x04; }
private:
std::size_t m_length;
@@ -600,13 +662,13 @@ private:
class ntfs_reader : private reader_base
{
public:
- ntfs_reader(extra_field_reader const &field) : reader_base(field.data()), m_length(field.data_size()) { }
+ ntfs_reader(extra_field_reader const &field) noexcept : reader_base(field.data()), m_length(field.data_size()) { }
- std::uint32_t reserved() const { return read_dword(0x00); }
- ntfs_tag_reader tag1() const { return ntfs_tag_reader(m_buffer + 0x04, m_length - 4); }
+ std::uint32_t reserved() const noexcept { return read_dword(0x00); }
+ ntfs_tag_reader tag1() const noexcept { return ntfs_tag_reader(m_buffer + 0x04, m_length - 4); }
- std::size_t total_length() const { return m_length; }
- static std::size_t minimum_length() { return 0x08; }
+ std::size_t total_length() const noexcept { return m_length; }
+ static constexpr std::size_t minimum_length() { return 0x08; }
private:
std::size_t m_length;
@@ -616,14 +678,14 @@ private:
class ntfs_times_reader : private reader_base
{
public:
- ntfs_times_reader(ntfs_tag_reader const &tag) : reader_base(tag.data()) { }
+ ntfs_times_reader(ntfs_tag_reader const &tag) noexcept : reader_base(tag.data()) { }
- std::uint64_t mtime() const { return read_qword(0x00); }
- std::uint64_t atime() const { return read_qword(0x08); }
- std::uint64_t ctime() const { return read_qword(0x10); }
+ std::uint64_t mtime() const noexcept { return read_qword(0x00); }
+ std::uint64_t atime() const noexcept { return read_qword(0x08); }
+ std::uint64_t ctime() const noexcept { return read_qword(0x10); }
- std::size_t total_length() const { return minimum_length(); }
- static std::size_t minimum_length() { return 0x18; }
+ std::size_t total_length() const noexcept { return minimum_length(); }
+ static constexpr std::size_t minimum_length() { return 0x18; }
};
@@ -632,16 +694,16 @@ class general_flag_reader
public:
general_flag_reader(std::uint16_t val) : m_value(val) { }
- bool encrypted() const { return bool(m_value & 0x0001); }
- bool implode_8k_dict() const { return bool(m_value & 0x0002); }
- bool implode_3_trees() const { return bool(m_value & 0x0004); }
- unsigned deflate_option() const { return unsigned((m_value >> 1) & 0x0003); }
- bool lzma_eos_mark() const { return bool(m_value & 0x0002); }
- bool use_descriptor() const { return bool(m_value & 0x0008); }
- bool patch_data() const { return bool(m_value & 0x0020); }
- bool strong_encryption() const { return bool(m_value & 0x0040); }
- bool utf8_encoding() const { return bool(m_value & 0x0800); }
- bool directory_encryption() const { return bool(m_value & 0x2000); }
+ bool encrypted() const noexcept { return bool(m_value & 0x0001); }
+ bool implode_8k_dict() const noexcept { return bool(m_value & 0x0002); }
+ bool implode_3_trees() const noexcept { return bool(m_value & 0x0004); }
+ unsigned deflate_option() const noexcept { return unsigned((m_value >> 1) & 0x0003); }
+ bool lzma_eos_mark() const noexcept { return bool(m_value & 0x0002); }
+ bool use_descriptor() const noexcept { return bool(m_value & 0x0008); }
+ bool patch_data() const noexcept { return bool(m_value & 0x0020); }
+ bool strong_encryption() const noexcept { return bool(m_value & 0x0040); }
+ bool utf8_encoding() const noexcept { return bool(m_value & 0x0800); }
+ bool directory_encryption() const noexcept { return bool(m_value & 0x2000); }
private:
std::uint16_t m_value;
@@ -653,6 +715,8 @@ private:
GLOBAL VARIABLES
***************************************************************************/
+archive_category_impl const f_archive_category_instance;
+
std::array<zip_file_impl::ptr, zip_file_impl::CACHE_SIZE> zip_file_impl::s_cache;
std::mutex zip_file_impl::s_cache_mutex;
@@ -663,33 +727,38 @@ std::mutex zip_file_impl::s_cache_mutex;
to the cache
-------------------------------------------------*/
-void zip_file_impl::close(ptr &&zip)
+void zip_file_impl::close(ptr &&zip) noexcept
{
- if (!zip) return;
+ // if the filename isn't empty, the cached directory can be reused
+ if (zip && !zip->m_filename.empty())
+ {
+ // close the open files
+ osd_printf_verbose("unzip: closing archive file %s and sending to cache\n", zip->m_filename);
+ zip->m_file.reset();
- // close the open files
- osd_printf_verbose("unzip: closing archive file %s and sending to cache\n", zip->m_filename);
- zip->m_file.reset();
+ // find the first nullptr entry in the cache
+ std::lock_guard<std::mutex> guard(s_cache_mutex);
+ std::size_t cachenum;
+ for (cachenum = 0; cachenum < s_cache.size(); cachenum++)
+ if (!s_cache[cachenum])
+ break;
- // find the first nullptr entry in the cache
- std::lock_guard<std::mutex> guard(s_cache_mutex);
- std::size_t cachenum;
- for (cachenum = 0; cachenum < s_cache.size(); cachenum++)
- if (!s_cache[cachenum])
- break;
+ // if no room left in the cache, free the bottommost entry
+ if (cachenum == s_cache.size())
+ {
+ cachenum--;
+ osd_printf_verbose("unzip: removing %s from cache to make space\n", s_cache[cachenum]->m_filename);
+ s_cache[cachenum].reset();
+ }
- // if no room left in the cache, free the bottommost entry
- if (cachenum == s_cache.size())
- {
- cachenum--;
- osd_printf_verbose("unzip: removing %s from cache to make space\n", s_cache[cachenum]->m_filename);
- s_cache[cachenum].reset();
+ // move everyone else down and place us at the top
+ for ( ; cachenum > 0; cachenum--)
+ s_cache[cachenum] = std::move(s_cache[cachenum - 1]);
+ s_cache[0] = std::move(zip);
}
- // move everyone else down and place us at the top
- for ( ; cachenum > 0; cachenum--)
- s_cache[cachenum] = std::move(s_cache[cachenum - 1]);
- s_cache[0] = std::move(zip);
+ // make sure it's cleaned up
+ zip.reset();
}
@@ -702,7 +771,7 @@ void zip_file_impl::close(ptr &&zip)
entry in the ZIP
-------------------------------------------------*/
-int zip_file_impl::search(std::uint32_t search_crc, const std::string &search_filename, bool matchcrc, bool matchname, bool partialpath)
+int zip_file_impl::search(std::uint32_t search_crc, std::string_view search_filename, bool matchcrc, bool matchname, bool partialpath) noexcept
{
// if we're at or past the end, we're done
while ((m_cd_pos + central_dir_entry_reader::minimum_length()) <= m_ecd.cd_size)
@@ -712,98 +781,122 @@ int zip_file_impl::search(std::uint32_t search_crc, const std::string &search_fi
if (!reader.signature_correct() || ((m_cd_pos + reader.total_length()) > m_ecd.cd_size))
break;
- // extract file header info
- m_header.version_created = reader.version_created();
- m_header.version_needed = reader.version_needed();
- m_header.bit_flag = reader.general_flag();
- m_header.compression = reader.compression_method();
- m_header.crc = reader.crc32();
- m_header.compressed_length = reader.compressed_size();
- m_header.uncompressed_length = reader.uncompressed_size();
- m_header.start_disk_number = reader.start_disk();
- m_header.local_header_offset = reader.header_offset();
-
- // don't immediately decode DOS timestamp - it's expensive
- m_header.modified_date = reader.modified_date();
- m_header.modified_time = reader.modified_time();
- m_header.modified_cached = false;
-
- // advance the position
- m_cd_pos += reader.total_length();
-
- // copy the filename
- bool is_utf8(general_flag_reader(m_header.bit_flag).utf8_encoding());
- reader.file_name(m_header.file_name);
-
- // walk the extra data
- for (auto extra = reader.extra_field(); extra.length_sufficient(); extra = extra.next())
+ // setting std::string can raise allocation exceptions
+ try
{
- // look for ZIP64 extended info
- if ((extra.header_id() == 0x0001) && (extra.data_size() >= zip64_ext_info_reader::minimum_length()))
+ // extract file header info
+ file_header header;
+ header.version_created = reader.version_created();
+ header.version_needed = reader.version_needed();
+ header.bit_flag = reader.general_flag();
+ header.compression = reader.compression_method();
+ header.crc = reader.crc32();
+ header.compressed_length = reader.compressed_size();
+ header.uncompressed_length = reader.uncompressed_size();
+ header.start_disk_number = reader.start_disk();
+ header.local_header_offset = reader.header_offset();
+
+ // don't immediately decode DOS timestamp - it's expensive
+ header.modified_date = reader.modified_date();
+ header.modified_time = reader.modified_time();
+ header.modified = std::nullopt;
+
+ // copy the filename
+ bool is_utf8(general_flag_reader(header.bit_flag).utf8_encoding());
+ reader.file_name(header.file_name);
+
+ // walk the extra data
+ for (auto extra = reader.extra_field(); extra.length_sufficient(); extra = extra.next())
{
- zip64_ext_info_reader const ext64(reader, extra);
- if (extra.data_size() >= ext64.total_length())
+ // look for ZIP64 extended info
+ if ((extra.header_id() == 0x0001) && (extra.data_size() >= zip64_ext_info_reader::minimum_length()))
{
- m_header.compressed_length = ext64.compressed_size();
- m_header.uncompressed_length = ext64.uncompressed_size();
- m_header.start_disk_number = ext64.start_disk();
- m_header.local_header_offset = ext64.header_offset();
+ zip64_ext_info_reader const ext64(reader, extra);
+ if (extra.data_size() >= ext64.total_length())
+ {
+ header.compressed_length = ext64.compressed_size();
+ header.uncompressed_length = ext64.uncompressed_size();
+ header.start_disk_number = ext64.start_disk();
+ header.local_header_offset = ext64.header_offset();
+ }
}
- }
- // look for Info-ZIP UTF-8 path
- if (!is_utf8 && (extra.header_id() == 0x7075) && (extra.data_size() >= utf8_path_reader::minimum_length()))
- {
- utf8_path_reader const utf8path(extra);
- if (utf8path.version() == 1)
+ // look for Info-ZIP UTF-8 path
+ if (!is_utf8 && (extra.header_id() == 0x7075) && (extra.data_size() >= utf8_path_reader::minimum_length()))
{
- auto const addr(m_header.file_name.empty() ? nullptr : &m_header.file_name[0]);
- auto const length(m_header.file_name.empty() ? 0 : m_header.file_name.length() * sizeof(m_header.file_name[0]));
- auto const crc(crc32_creator::simple(addr, length));
- if (utf8path.name_crc32() == crc.m_raw)
+ utf8_path_reader const utf8path(extra);
+ if (utf8path.version() == 1)
{
- utf8path.unicode_name(m_header.file_name);
- is_utf8 = true;
+ auto const addr(header.file_name.empty() ? nullptr : &header.file_name[0]);
+ auto const length(header.file_name.empty() ? 0 : header.file_name.length() * sizeof(header.file_name[0]));
+ auto const crc(crc32_creator::simple(addr, length));
+ if (utf8path.name_crc32() == crc.m_raw)
+ {
+ utf8path.unicode_name(header.file_name);
+ is_utf8 = true;
+ }
}
}
- }
- // look for NTFS extra field
- if ((extra.header_id() == 0x000a) && (extra.data_size() >= ntfs_reader::minimum_length()))
- {
- ntfs_reader const ntfs(extra);
- for (auto tag = ntfs.tag1(); tag.length_sufficient(); tag = tag.next())
+ // look for NTFS extra field
+ if ((extra.header_id() == 0x000a) && (extra.data_size() >= ntfs_reader::minimum_length()))
{
- if ((tag.tag() == 0x0001) && (tag.size() >= ntfs_times_reader::minimum_length()))
+ ntfs_reader const ntfs(extra);
+ for (auto tag = ntfs.tag1(); tag.length_sufficient(); tag = tag.next())
{
- ntfs_times_reader const times(tag);
- ntfs_duration const ticks(times.mtime());
- m_header.modified = system_clock_time_point_from_ntfs_duration(ticks);
- m_header.modified_cached = true;
+ if ((tag.tag() == 0x0001) && (tag.size() >= ntfs_times_reader::minimum_length()))
+ {
+ ntfs_times_reader const times(tag);
+ ntfs_duration const ticks(times.mtime());
+ try
+ {
+ header.modified = system_clock_time_point_from_ntfs_duration(ticks);
+ }
+ catch (...)
+ {
+ // out-of-range exception - let it fall back to DOS-style timestamp
+ }
+ }
}
}
}
- }
- // FIXME: if (!is_utf8) convert filename to UTF8 (assume CP437 or something)
+ // FIXME: if (!is_utf8) convert filename to UTF8 (assume CP437 or something)
- // chop off trailing slash for directory entries
- bool const is_dir(!m_header.file_name.empty() && (m_header.file_name.back() == '/'));
- if (is_dir) m_header.file_name.resize(m_header.file_name.length() - 1);
+ // chop off trailing slash for directory entries
+ bool const is_dir(!header.file_name.empty() && (header.file_name.back() == '/'));
+ if (is_dir)
+ header.file_name.resize(header.file_name.length() - 1);
- // check to see if it matches query
- bool const crcmatch(search_crc == m_header.crc);
- auto const partialoffset(m_header.file_name.length() - search_filename.length());
- bool const partialpossible((m_header.file_name.length() > search_filename.length()) && (m_header.file_name[partialoffset - 1] == '/'));
- const bool namematch(
- !core_stricmp(search_filename.c_str(), m_header.file_name.c_str()) ||
- (partialpath && partialpossible && !core_stricmp(search_filename.c_str(), m_header.file_name.c_str() + partialoffset)));
+ // advance the position
+ m_header = std::move(header);
+ m_curr_is_dir = is_dir;
+ m_cd_pos += reader.total_length();
+ }
+ catch (...)
+ {
+ break;
+ }
- bool const found = ((!matchcrc && !matchname) || !is_dir) && (!matchcrc || crcmatch) && (!matchname || namematch);
- if (found)
+ // quick return if not required to match on name
+ if (!matchname)
{
- m_curr_is_dir = is_dir;
- return 0;
+ if (!matchcrc || ((search_crc == m_header.crc) && !m_curr_is_dir))
+ return 0;
+ }
+ else if (!m_curr_is_dir)
+ {
+ // check to see if it matches query
+ auto const partialoffset = m_header.file_name.length() - search_filename.length();
+ const bool namematch =
+ (search_filename.length() == m_header.file_name.length()) &&
+ (search_filename.empty() || !core_strnicmp(&search_filename[0], &m_header.file_name[0], search_filename.length()));
+ bool const partialmatch =
+ partialpath &&
+ ((m_header.file_name.length() > search_filename.length()) && (m_header.file_name[partialoffset - 1] == '/')) &&
+ (search_filename.empty() || !core_strnicmp(&search_filename[0], &m_header.file_name[partialoffset], search_filename.length()));
+ if ((!matchcrc || (search_crc == m_header.crc)) && (namematch || partialmatch))
+ return 0;
}
}
return -1;
@@ -815,11 +908,8 @@ int zip_file_impl::search(std::uint32_t search_crc, const std::string &search_fi
from a ZIP into the target buffer
-------------------------------------------------*/
-archive_file::error zip_file_impl::decompress(void *buffer, std::uint32_t length)
+std::error_condition zip_file_impl::decompress(void *buffer, std::size_t length) noexcept
{
- archive_file::error ziperr;
- std::uint64_t offset;
-
// if we don't have enough buffer, error
if (length < m_header.uncompressed_length)
{
@@ -835,33 +925,29 @@ archive_file::error zip_file_impl::decompress(void *buffer, std::uint32_t length
}
// get the compressed data offset
- ziperr = get_compressed_data_offset(offset);
- if (ziperr != archive_file::error::NONE)
+ std::uint64_t offset;
+ auto const ziperr = get_compressed_data_offset(offset);
+ if (ziperr)
return ziperr;
// handle compression types
switch (m_header.compression)
{
case 0:
- ziperr = decompress_data_type_0(offset, buffer, length);
- break;
+ return decompress_data_type_0(offset, buffer, length);
case 8:
- ziperr = decompress_data_type_8(offset, buffer, length);
- break;
+ return decompress_data_type_8(offset, buffer, length);
case 14:
- ziperr = decompress_data_type_14(offset, buffer, length);
- break;
+ return decompress_data_type_14(offset, buffer, length);
default:
osd_printf_error(
"unzip: %s in %s uses unsupported compression method %u\n",
- m_header.file_name.c_str(), m_filename.c_str(), m_header.compression);
- ziperr = archive_file::error::UNSUPPORTED;
- break;
+ m_header.file_name, m_filename, m_header.compression);
+ return archive_file::error::UNSUPPORTED;
}
- return ziperr;
}
@@ -874,16 +960,16 @@ archive_file::error zip_file_impl::decompress(void *buffer, std::uint32_t length
read_ecd - read the ECD data
-------------------------------------------------*/
-archive_file::error zip_file_impl::read_ecd()
+std::error_condition zip_file_impl::read_ecd() noexcept
{
// make sure the file handle is open
auto const ziperr = reopen();
- if (ziperr != archive_file::error::NONE)
+ if (ziperr)
return ziperr;
// we may need multiple tries
- osd_file::error error;
- std::uint32_t read_length;
+ std::error_condition filerr;
+ std::size_t read_length;
std::uint32_t buflen = 1024;
while (buflen < 65536)
{
@@ -893,19 +979,26 @@ archive_file::error zip_file_impl::read_ecd()
// allocate buffer
std::unique_ptr<std::uint8_t []> buffer;
- try { buffer.reset(new std::uint8_t[buflen + 1]); }
- catch (...)
+ buffer.reset(new (std::nothrow) std::uint8_t[buflen + 1]);
+ if (!buffer)
{
osd_printf_error("unzip: %s failed to allocate memory for ECD search\n", m_filename);
- return archive_file::error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
}
// read in one buffers' worth of data
- error = m_file->read(&buffer[0], m_length - buflen, buflen, read_length);
- if ((error != osd_file::error::NONE) || (read_length != buflen))
+ filerr = m_file->read_at(m_length - buflen, &buffer[0], buflen, read_length);
+ if (filerr)
+ {
+ osd_printf_error(
+ "unzip: error reading %s to search for ECD (%s:%d %s)\n",
+ m_filename, filerr.category().name(), filerr.value(), filerr.message());
+ return filerr;
+ }
+ if (read_length != buflen)
{
- osd_printf_error("unzip: %s error reading file to search for ECD (%d)\n", m_filename, int(error));
- return archive_file::error::FILE_ERROR;
+ osd_printf_error("unzip: unexpectedly reached end-of-file while reading %s to search for ECD\n", m_filename);
+ return archive_file::error::FILE_TRUNCATED;
}
// find the ECD signature
@@ -935,19 +1028,26 @@ archive_file::error zip_file_impl::read_ecd()
if ((m_length - buflen + offset) < ecd64_locator_reader::minimum_length())
{
osd_printf_verbose("unzip: %s too small to contain ZIP64 ECD locator\n", m_filename);
- return archive_file::error::NONE;
+ return std::error_condition();
}
// try to read the ZIP64 ECD locator
- error = m_file->read(
- &buffer[0],
+ filerr = m_file->read_at(
m_length - buflen + offset - ecd64_locator_reader::minimum_length(),
+ &buffer[0],
ecd64_locator_reader::minimum_length(),
read_length);
- if ((error != osd_file::error::NONE) || (read_length != ecd64_locator_reader::minimum_length()))
+ if (filerr)
+ {
+ osd_printf_error(
+ "unzip: error reading %s to search for ZIP64 ECD locator (%s:%d %s)\n",
+ m_filename, filerr.category().name(), filerr.value(), filerr.message());
+ return filerr;
+ }
+ if (read_length != ecd64_locator_reader::minimum_length())
{
- osd_printf_error("unzip: error reading %s to search for ZIP64 ECD locator (%d)\n", m_filename, int(error));
- return archive_file::error::FILE_ERROR;
+ osd_printf_error("unzip: unexpectedly reached end-of-file while reading %s to search for ZIP64 ECD locator\n", m_filename);
+ return archive_file::error::FILE_TRUNCATED;
}
// if the signature isn't correct, it's not a ZIP64 archive
@@ -955,7 +1055,7 @@ archive_file::error zip_file_impl::read_ecd()
if (!ecd64_loc_rd.signature_correct())
{
osd_printf_verbose("unzip: %s has no ZIP64 ECD locator\n", m_filename);
- return archive_file::error::NONE;
+ return std::error_condition();
}
// check that the ZIP64 ECD is in this segment (assuming this segment is the last segment)
@@ -966,11 +1066,13 @@ archive_file::error zip_file_impl::read_ecd()
}
// try to read the ZIP64 ECD
- error = m_file->read(&buffer[0], ecd64_loc_rd.ecd64_offset(), ecd64_reader::minimum_length(), read_length);
- if (error != osd_file::error::NONE)
+ filerr = m_file->read_at(ecd64_loc_rd.ecd64_offset(), &buffer[0], ecd64_reader::minimum_length(), read_length);
+ if (filerr)
{
- osd_printf_error("unzip: error reading %s ZIP64 ECD (%d)\n", m_filename, int(error));
- return archive_file::error::FILE_ERROR;
+ osd_printf_error(
+ "unzip: error reading %s ZIP64 ECD (%s:%d %s)\n",
+ m_filename, filerr.category().name(), filerr.value(), filerr.message());
+ return filerr;
}
if (read_length != ecd64_reader::minimum_length())
{
@@ -983,8 +1085,8 @@ archive_file::error zip_file_impl::read_ecd()
if (!ecd64_rd.signature_correct())
{
osd_printf_error(
- "unzip: %s ZIP64 ECD has incorrect signature 0x%08lx\n",
- m_filename.c_str(), long(ecd64_rd.signature()));
+ "unzip: %s ZIP64 ECD has incorrect signature 0x%08x\n",
+ m_filename, ecd64_rd.signature());
return archive_file::error::BAD_SIGNATURE;
}
if (ecd64_rd.total_length() < ecd64_reader::minimum_length())
@@ -996,7 +1098,7 @@ archive_file::error zip_file_impl::read_ecd()
{
osd_printf_error(
"unzip: %s ZIP64 ECD requires unsupported version %u.%u\n",
- m_filename.c_str(), unsigned(ecd64_rd.version_needed() / 10), unsigned(ecd64_rd.version_needed() % 10));
+ m_filename, ecd64_rd.version_needed() / 10, ecd64_rd.version_needed() % 10);
return archive_file::error::UNSUPPORTED;
}
osd_printf_verbose("unzip: found %s ZIP64 ECD\n", m_filename);
@@ -1009,7 +1111,7 @@ archive_file::error zip_file_impl::read_ecd()
m_ecd.cd_size = ecd64_rd.dir_size();
m_ecd.cd_start_disk_offset = ecd64_rd.dir_offset();
- return archive_file::error::NONE;
+ return std::error_condition();
}
// didn't find it; free this buffer and expand our search
@@ -1024,7 +1126,7 @@ archive_file::error zip_file_impl::read_ecd()
}
}
osd_printf_error("unzip: %s couldn't find ECD in last 64KiB\n", m_filename);
- return archive_file::error::OUT_OF_MEMORY;
+ return archive_file::error::UNSUPPORTED; // TODO: revisit this error code
}
@@ -1033,7 +1135,7 @@ archive_file::error zip_file_impl::read_ecd()
offset of the compressed data
-------------------------------------------------*/
-archive_file::error zip_file_impl::get_compressed_data_offset(std::uint64_t &offset)
+std::error_condition zip_file_impl::get_compressed_data_offset(std::uint64_t &offset) noexcept
{
// don't support a number of features
general_flag_reader const flags(m_header.bit_flag);
@@ -1046,7 +1148,7 @@ archive_file::error zip_file_impl::get_compressed_data_offset(std::uint64_t &off
{
osd_printf_error(
"unzip: %s in %s requires unsupported version %u.%u\n",
- m_header.file_name.c_str(), m_filename.c_str(), unsigned(m_header.version_needed / 10), unsigned(m_header.version_needed % 10));
+ m_header.file_name, m_filename, m_header.version_needed / 10, m_header.version_needed % 10);
return archive_file::error::UNSUPPORTED;
}
if (flags.encrypted() || flags.strong_encryption())
@@ -1062,24 +1164,24 @@ archive_file::error zip_file_impl::get_compressed_data_offset(std::uint64_t &off
// make sure the file handle is open
auto const ziperr = reopen();
- if (ziperr != archive_file::error::NONE)
+ if (ziperr)
return ziperr;
// now go read the fixed-sized part of the local file header
- std::uint32_t read_length;
- auto const error = m_file->read(&m_buffer[0], m_header.local_header_offset, local_file_header_reader::minimum_length(), read_length);
- if (error != osd_file::error::NONE)
+ std::size_t read_length;
+ std::error_condition const filerr = m_file->read_at(m_header.local_header_offset, &m_buffer[0], local_file_header_reader::minimum_length(), read_length);
+ if (filerr)
{
osd_printf_error(
- "unzip: error reading local file header for %s in %s (%d)\n",
- m_header.file_name.c_str(), m_filename.c_str(), int(error));
- return archive_file::error::FILE_ERROR;
+ "unzip: error reading local file header for %s in %s (%s:%d %s)\n",
+ m_header.file_name, m_filename, filerr.category().name(), filerr.value(), filerr.message());
+ return filerr;
}
if (read_length != local_file_header_reader::minimum_length())
{
osd_printf_error(
"unzip: unexpectedly reached end-of-file while reading local file header for %s in %s\n",
- m_header.file_name.c_str(), m_filename.c_str());
+ m_header.file_name, m_filename);
return archive_file::error::FILE_TRUNCATED;
}
@@ -1088,13 +1190,13 @@ archive_file::error zip_file_impl::get_compressed_data_offset(std::uint64_t &off
if (!reader.signature_correct())
{
osd_printf_error(
- "unzip: local file header for %s in %s has incorrect signature %04lx\n",
- m_header.file_name.c_str(), m_filename.c_str(), long(reader.signature()));
+ "unzip: local file header for %s in %s has incorrect signature %04x\n",
+ m_header.file_name, m_filename, reader.signature());
return archive_file::error::BAD_SIGNATURE;
}
offset = m_header.local_header_offset + reader.total_length();
- return archive_file::error::NONE;
+ return std::error_condition();
}
@@ -1108,24 +1210,28 @@ archive_file::error zip_file_impl::get_compressed_data_offset(std::uint64_t &off
type 0 data (which is uncompressed)
-------------------------------------------------*/
-archive_file::error zip_file_impl::decompress_data_type_0(std::uint64_t offset, void *buffer, std::uint32_t length)
+std::error_condition zip_file_impl::decompress_data_type_0(std::uint64_t offset, void *buffer, std::size_t length) noexcept
{
// the data is uncompressed; just read it
- std::uint32_t read_length(0);
- auto const filerr = m_file->read(buffer, offset, m_header.compressed_length, read_length);
- if (filerr != osd_file::error::NONE)
+ std::size_t read_length(0);
+ std::error_condition const filerr = m_file->read_at(offset, buffer, m_header.compressed_length, read_length);
+ if (filerr)
{
- osd_printf_error("unzip: error reading %s from %s (%d)\n", m_header.file_name, m_filename, int(filerr));
- return archive_file::error::FILE_ERROR;
+ osd_printf_error(
+ "unzip: error reading %s from %s (%s:%d %s)\n",
+ m_header.file_name, m_filename, filerr.category().name(), filerr.value(), filerr.message());
+ return filerr;
}
else if (read_length != m_header.compressed_length)
{
- osd_printf_error("unzip: unexpectedly reached end-of-file while reading %s from %s\n", m_header.file_name, m_filename);
+ osd_printf_error(
+ "unzip: unexpectedly reached end-of-file while reading %s from %s\n",
+ m_header.file_name, m_filename);
return archive_file::error::FILE_TRUNCATED;
}
else
{
- return archive_file::error::NONE;
+ return std::error_condition();
}
}
@@ -1135,8 +1241,23 @@ archive_file::error zip_file_impl::decompress_data_type_0(std::uint64_t offset,
type 8 data (which is deflated)
-------------------------------------------------*/
-archive_file::error zip_file_impl::decompress_data_type_8(std::uint64_t offset, void *buffer, std::uint32_t length)
+std::error_condition zip_file_impl::decompress_data_type_8(std::uint64_t offset, void *buffer, std::size_t length) noexcept
{
+ auto const convert_zerr =
+ [] (int e) -> std::error_condition
+ {
+ switch (e)
+ {
+ case Z_OK:
+ return std::error_condition();
+ case Z_ERRNO:
+ return std::error_condition(errno, std::generic_category());
+ case Z_MEM_ERROR:
+ return std::errc::not_enough_memory;
+ default:
+ return archive_file::error::DECOMPRESS_ERROR;
+ }
+ };
std::uint64_t input_remaining = m_header.compressed_length;
int zerr;
@@ -1153,38 +1274,39 @@ archive_file::error zip_file_impl::decompress_data_type_8(std::uint64_t offset,
zerr = inflateInit2(&stream, -MAX_WBITS);
if (zerr != Z_OK)
{
+ auto result = convert_zerr(zerr);
osd_printf_error(
"unzip: error allocating zlib stream to inflate %s from %s (%d)\n",
- m_header.file_name.c_str(), m_filename.c_str(), zerr);
- return archive_file::error::DECOMPRESS_ERROR;
+ m_header.file_name, m_filename, zerr);
+ return result;
}
// loop until we're done
while (true)
{
// read in the next chunk of data
- std::uint32_t read_length(0);
- auto const filerr = m_file->read(
- &m_buffer[0],
+ std::size_t read_length(0);
+ auto const filerr = m_file->read_at(
offset,
- std::uint32_t((std::min<std::uint64_t>)(input_remaining, m_buffer.size())),
+ &m_buffer[0],
+ std::size_t((std::min<std::uint64_t>)(input_remaining, m_buffer.size())),
read_length);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
osd_printf_error(
- "unzip: error reading compressed data for %s in %s (%d)\n",
- m_header.file_name.c_str(), m_filename.c_str(), int(filerr));
+ "unzip: error reading compressed data for %s in %s (%s:%d %s)\n",
+ m_header.file_name, m_filename, filerr.category().name(), filerr.value(), filerr.message());
inflateEnd(&stream);
- return archive_file::error::FILE_ERROR;
+ return filerr;
}
offset += read_length;
// if we read nothing, but still have data left, the file is truncated
- if ((read_length == 0) && (input_remaining > 0))
+ if (!read_length && input_remaining)
{
osd_printf_error(
"unzip: unexpectedly reached end-of-file while reading compressed data for %s in %s\n",
- m_header.file_name.c_str(), m_filename.c_str());
+ m_header.file_name, m_filename);
inflateEnd(&stream);
return archive_file::error::FILE_TRUNCATED;
}
@@ -1206,9 +1328,12 @@ archive_file::error zip_file_impl::decompress_data_type_8(std::uint64_t offset,
}
else if (zerr != Z_OK)
{
- osd_printf_error("unzip: error inflating %s from %s (%d)\n", m_header.file_name, m_filename, zerr);
+ auto result = convert_zerr(zerr);
+ osd_printf_error(
+ "unzip: error inflating %s from %s (%d)\n",
+ m_header.file_name, m_filename, zerr);
inflateEnd(&stream);
- return archive_file::error::DECOMPRESS_ERROR;
+ return result;
}
}
@@ -1216,20 +1341,23 @@ archive_file::error zip_file_impl::decompress_data_type_8(std::uint64_t offset,
zerr = inflateEnd(&stream);
if (zerr != Z_OK)
{
- osd_printf_error("unzip: error finishing inflation of %s from %s (%d)\n", m_header.file_name, m_filename, zerr);
- return archive_file::error::DECOMPRESS_ERROR;
+ auto result = convert_zerr(zerr);
+ osd_printf_error(
+ "unzip: error finishing inflation of %s from %s (%d)\n",
+ m_header.file_name, m_filename, zerr);
+ return result;
}
// if anything looks funny, report an error
- if ((stream.avail_out > 0) || (input_remaining > 0))
+ if (stream.avail_out || input_remaining)
{
osd_printf_error(
"unzip: inflation of %s from %s doesn't appear to have completed correctly\n",
- m_header.file_name.c_str(), m_filename.c_str());
+ m_header.file_name, m_filename);
return archive_file::error::DECOMPRESS_ERROR;
}
- return archive_file::error::NONE;
+ return std::error_condition();
}
@@ -1238,7 +1366,7 @@ archive_file::error zip_file_impl::decompress_data_type_8(std::uint64_t offset,
type 14 data (LZMA)
-------------------------------------------------*/
-archive_file::error zip_file_impl::decompress_data_type_14(std::uint64_t offset, void *buffer, std::uint32_t length)
+std::error_condition zip_file_impl::decompress_data_type_14(std::uint64_t offset, void *buffer, std::size_t length) noexcept
{
// two-byte version
// two-byte properties size (little-endian)
@@ -1253,15 +1381,15 @@ archive_file::error zip_file_impl::decompress_data_type_14(std::uint64_t offset,
SizeT output_remaining(length);
std::uint64_t input_remaining(m_header.compressed_length);
- std::uint32_t read_length;
- osd_file::error filerr;
+ std::size_t read_length;
+ std::error_condition filerr;
SRes lzerr;
ELzmaStatus lzstatus(LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK);
// reset the stream
ISzAlloc alloc_imp;
- alloc_imp.Alloc = [](void *p, std::size_t size) -> void * { return (size == 0) ? nullptr : std::malloc(size); };
- alloc_imp.Free = [](void *p, void *address) -> void { std::free(address); };
+ alloc_imp.Alloc = [] (void *p, std::size_t size) -> void * { return size ? std::malloc(size) : nullptr; };
+ alloc_imp.Free = [] (void *p, void *address) -> void { std::free(address); };
CLzmaDec stream;
LzmaDec_Construct(&stream);
@@ -1270,16 +1398,16 @@ archive_file::error zip_file_impl::decompress_data_type_14(std::uint64_t offset,
{
osd_printf_error(
"unzip:compressed data for %s in %s is too small to hold LZMA properties header\n",
- m_header.file_name.c_str(), m_filename.c_str());
+ m_header.file_name, m_filename);
return archive_file::error::DECOMPRESS_ERROR;
}
- filerr = m_file->read(&m_buffer[0], offset, 4, read_length);
- if (filerr != osd_file::error::NONE)
+ filerr = m_file->read_at(offset, &m_buffer[0], 4, read_length);
+ if (filerr)
{
osd_printf_error(
- "unzip: error reading LZMA properties header for %s in %s (%d)\n",
- m_header.file_name.c_str(), m_filename.c_str(), int(filerr));
- return archive_file::error::FILE_ERROR;
+ "unzip: error reading LZMA properties header for %s in %s (%s:%d %s)\n",
+ m_header.file_name, m_filename, filerr.category().name(), filerr.value(), filerr.message());
+ return filerr;
}
offset += read_length;
input_remaining -= read_length;
@@ -1287,7 +1415,7 @@ archive_file::error zip_file_impl::decompress_data_type_14(std::uint64_t offset,
{
osd_printf_error(
"unzip: unexpectedly reached end-of-file while reading LZMA properties header for %s in %s\n",
- m_header.file_name.c_str(), m_filename.c_str());
+ m_header.file_name, m_filename);
return archive_file::error::FILE_TRUNCATED;
}
std::uint16_t const props_size((std::uint16_t(m_buffer[3]) << 8) | std::uint16_t(m_buffer[2]));
@@ -1295,23 +1423,23 @@ archive_file::error zip_file_impl::decompress_data_type_14(std::uint64_t offset,
{
osd_printf_error(
"unzip: %s in %s has excessively large LZMA properties\n",
- m_header.file_name.c_str(), m_filename.c_str());
+ m_header.file_name, m_filename);
return archive_file::error::UNSUPPORTED;
}
else if (props_size > input_remaining)
{
osd_printf_error(
"unzip:compressed data for %s in %s is too small to hold LZMA properties\n",
- m_header.file_name.c_str(), m_filename.c_str());
+ m_header.file_name, m_filename);
return archive_file::error::DECOMPRESS_ERROR;
}
- filerr = m_file->read(&m_buffer[0], offset, props_size, read_length);
- if (filerr != osd_file::error::NONE)
+ filerr = m_file->read_at(offset, &m_buffer[0], props_size, read_length);
+ if (filerr)
{
osd_printf_error(
- "unzip: error reading LZMA properties for %s in %s (%d)\n",
- m_header.file_name.c_str(), m_filename.c_str(), int(filerr));
- return archive_file::error::FILE_ERROR;
+ "unzip: error reading LZMA properties for %s in %s (%s:%d %s)\n",
+ m_header.file_name, m_filename, filerr.category().name(), filerr.value(), filerr.message());
+ return filerr;
}
offset += read_length;
input_remaining -= read_length;
@@ -1319,7 +1447,7 @@ archive_file::error zip_file_impl::decompress_data_type_14(std::uint64_t offset,
{
osd_printf_error(
"unzip: unexpectedly reached end-of-file while reading LZMA properties for %s in %s\n",
- m_header.file_name.c_str(), m_filename.c_str());
+ m_header.file_name, m_filename);
return archive_file::error::FILE_TRUNCATED;
}
@@ -1329,14 +1457,21 @@ archive_file::error zip_file_impl::decompress_data_type_14(std::uint64_t offset,
{
osd_printf_error(
"unzip: memory error allocating LZMA decoder to decompress %s from %s\n",
- m_header.file_name.c_str(), m_filename.c_str());
- return archive_file::error::OUT_OF_MEMORY;
+ m_header.file_name, m_filename);
+ return std::errc::not_enough_memory;
+ }
+ else if (SZ_ERROR_UNSUPPORTED)
+ {
+ osd_printf_error(
+ "unzip: LZMA decoder does not support properties for %s in %s\n",
+ m_header.file_name, m_filename);
+ return archive_file::error::UNSUPPORTED;
}
else if (SZ_OK != lzerr)
{
osd_printf_error(
"unzip: error allocating LZMA decoder to decompress %s from %s (%d)\n",
- m_header.file_name.c_str(), m_filename.c_str(), int(lzerr));
+ m_header.file_name, m_filename, int(lzerr));
return archive_file::error::DECOMPRESS_ERROR;
}
LzmaDec_Init(&stream);
@@ -1345,28 +1480,28 @@ archive_file::error zip_file_impl::decompress_data_type_14(std::uint64_t offset,
while (0 < input_remaining)
{
// read in the next chunk of data
- filerr = m_file->read(
- &m_buffer[0],
+ filerr = m_file->read_at(
offset,
- std::uint32_t((std::min<std::uint64_t>)(input_remaining, m_buffer.size())),
+ &m_buffer[0],
+ std::size_t((std::min<std::uint64_t>)(input_remaining, m_buffer.size())),
read_length);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
osd_printf_error(
- "unzip: error reading compressed data for %s in %s (%d)\n",
- m_header.file_name.c_str(), m_filename.c_str(), int(filerr));
+ "unzip: error reading compressed data for %s in %s (%s)\n",
+ m_header.file_name, m_filename);
LzmaDec_Free(&stream, &alloc_imp);
- return archive_file::error::FILE_ERROR;
+ return filerr;
}
offset += read_length;
input_remaining -= read_length;
// if we read nothing, but still have data left, the file is truncated
- if ((0 == read_length) && (0 < input_remaining))
+ if (!read_length && input_remaining)
{
osd_printf_error(
"unzip: unexpectedly reached end-of-file while reading compressed data for %s in %s\n",
- m_header.file_name.c_str(), m_filename.c_str());
+ m_header.file_name, m_filename);
LzmaDec_Free(&stream, &alloc_imp);
return archive_file::error::FILE_TRUNCATED;
}
@@ -1381,7 +1516,7 @@ archive_file::error zip_file_impl::decompress_data_type_14(std::uint64_t offset,
&output_remaining,
reinterpret_cast<Byte const *>(&m_buffer[0]),
&len,
- ((0 == input_remaining) && eos_mark) ? LZMA_FINISH_END : LZMA_FINISH_ANY,
+ (!input_remaining && eos_mark) ? LZMA_FINISH_END : LZMA_FINISH_ANY,
&lzstatus);
if (SZ_OK != lzerr)
{
@@ -1397,25 +1532,25 @@ archive_file::error zip_file_impl::decompress_data_type_14(std::uint64_t offset,
// if anything looks funny, report an error
if (LZMA_STATUS_FINISHED_WITH_MARK == lzstatus)
{
- return archive_file::error::NONE;
+ return std::error_condition();
}
else if (eos_mark)
{
osd_printf_error(
"unzip: LZMA end mark not found for %s in %s (%d)\n",
- m_header.file_name.c_str(), m_filename.c_str(), int(lzstatus));
+ m_header.file_name, m_filename, int(lzstatus));
return archive_file::error::DECOMPRESS_ERROR;
}
else if (LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK != lzstatus)
{
osd_printf_error(
"unzip: LZMA decompression of %s from %s doesn't appear to have completed correctly (%d)\n",
- m_header.file_name.c_str(), m_filename.c_str(), int(lzstatus));
+ m_header.file_name, m_filename, int(lzstatus));
return archive_file::error::DECOMPRESS_ERROR;
}
else
{
- return archive_file::error::NONE;
+ return std::error_condition();
}
}
@@ -1427,7 +1562,7 @@ archive_file::error zip_file_impl::decompress_data_type_14(std::uint64_t offset,
un7z.cpp TRAMPOLINES
***************************************************************************/
-void m7z_file_cache_clear();
+void m7z_file_cache_clear() noexcept;
@@ -1439,7 +1574,7 @@ void m7z_file_cache_clear();
zip_file_open - opens a ZIP file for reading
-------------------------------------------------*/
-archive_file::error archive_file::open_zip(const std::string &filename, ptr &result)
+std::error_condition archive_file::open_zip(std::string_view filename, ptr &result) noexcept
{
// ensure we start with a nullptr result
result.reset();
@@ -1450,21 +1585,49 @@ archive_file::error archive_file::open_zip(const std::string &filename, ptr &res
if (!newimpl)
{
// allocate memory for the zip_file structure
- try { newimpl = std::make_unique<zip_file_impl>(filename); }
- catch (...) { return error::OUT_OF_MEMORY; }
- auto const ziperr = newimpl->initialize();
- if (ziperr != error::NONE) return ziperr;
+ try { newimpl = std::make_unique<zip_file_impl>(std::string(filename)); }
+ catch (...) { return std::errc::not_enough_memory; }
+ auto const err = newimpl->initialize();
+ if (err)
+ return err;
+ }
+
+ // allocate the archive API wrapper
+ result.reset(new (std::nothrow) zip_file_wrapper(std::move(newimpl)));
+ if (result)
+ {
+ return std::error_condition();
+ }
+ else
+ {
+ zip_file_impl::close(std::move(newimpl));
+ return std::errc::not_enough_memory;
}
+}
- try
+std::error_condition archive_file::open_zip(random_read::ptr &&file, ptr &result) noexcept
+{
+ // ensure we start with a nullptr result
+ result.reset();
+
+ // allocate memory for the zip_file structure
+ zip_file_impl::ptr newimpl(new (std::nothrow) zip_file_impl(std::move(file)));
+ if (!newimpl)
+ return std::errc::not_enough_memory;
+ auto const err = newimpl->initialize();
+ if (err)
+ return err;
+
+ // allocate the archive API wrapper
+ result.reset(new (std::nothrow) zip_file_wrapper(std::move(newimpl)));
+ if (result)
{
- result = std::make_unique<zip_file_wrapper>(std::move(newimpl));
- return error::NONE;
+ return std::error_condition();
}
- catch (...)
+ else
{
zip_file_impl::close(std::move(newimpl));
- return error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
}
}
@@ -1474,7 +1637,7 @@ archive_file::error archive_file::open_zip(const std::string &filename, ptr &res
cache and free all memory
-------------------------------------------------*/
-void archive_file::cache_clear()
+void archive_file::cache_clear() noexcept
{
zip_file_impl::cache_clear();
m7z_file_cache_clear();
@@ -1485,4 +1648,15 @@ archive_file::~archive_file()
{
}
+
+/*-------------------------------------------------
+ archive_category - gets the archive error
+ category instance
+-------------------------------------------------*/
+
+std::error_category const &archive_category() noexcept
+{
+ return f_archive_category_instance;
+}
+
} // namespace util
diff --git a/src/lib/util/unzip.h b/src/lib/util/unzip.h
index b1ddb7a27d1..2108eadee28 100644
--- a/src/lib/util/unzip.h
+++ b/src/lib/util/unzip.h
@@ -7,19 +7,24 @@
archive file management.
***************************************************************************/
+#ifndef MAME_LIB_UTIL_UNZIP_H
+#define MAME_LIB_UTIL_UNZIP_H
#pragma once
-#ifndef MAME_LIB_UTIL_UNZIP_H
-#define MAME_LIB_UTIL_UNZIP_H
+#include "utilfwd.h"
#include <chrono>
#include <cstdint>
#include <memory>
#include <string>
+#include <string_view>
+#include <system_error>
+#include <type_traits>
namespace util {
+
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
@@ -30,12 +35,9 @@ class archive_file
public:
// Error types
- enum class error
+ enum class error : int
{
- NONE = 0,
- OUT_OF_MEMORY,
- FILE_ERROR,
- BAD_SIGNATURE,
+ BAD_SIGNATURE = 1,
DECOMPRESS_ERROR,
FILE_TRUNCATED,
FILE_CORRUPT,
@@ -49,40 +51,54 @@ public:
/* ----- archive file access ----- */
// open a ZIP file and parse its central directory
- static error open_zip(const std::string &filename, ptr &zip);
+ static std::error_condition open_zip(std::string_view filename, ptr &result) noexcept;
+ static std::error_condition open_zip(std::unique_ptr<random_read> &&file, ptr &result) noexcept;
// open a 7Z file and parse its central directory
- static error open_7z(const std::string &filename, ptr &result);
+ static std::error_condition open_7z(std::string_view filename, ptr &result) noexcept;
+ static std::error_condition open_7z(std::unique_ptr<random_read> &&file, ptr &result) noexcept;
// close an archive file (may actually be left open due to caching)
virtual ~archive_file();
// clear out all open files from the cache
- static void cache_clear();
+ static void cache_clear() noexcept;
/* ----- contained file access ----- */
// iterating over files - returns negative on reaching end
- virtual int first_file() = 0;
- virtual int next_file() = 0;
+ virtual int first_file() noexcept = 0;
+ virtual int next_file() noexcept = 0;
// find a file index by crc, filename or both - returns non-negative on match
- virtual int search(std::uint32_t crc) = 0;
- virtual int search(const std::string &filename, bool partialpath) = 0;
- virtual int search(std::uint32_t crc, const std::string &filename, bool partialpath) = 0;
+ virtual int search(std::uint32_t crc) noexcept = 0;
+ virtual int search(std::string_view filename, bool partialpath) noexcept = 0;
+ virtual int search(std::uint32_t crc, std::string_view filename, bool partialpath) noexcept = 0;
// information on most recently found file
- virtual bool current_is_directory() const = 0;
- virtual const std::string &current_name() const = 0;
- virtual std::uint64_t current_uncompressed_length() const = 0;
- virtual std::chrono::system_clock::time_point current_last_modified() const = 0;
- virtual std::uint32_t current_crc() const = 0;
+ virtual bool current_is_directory() const noexcept = 0;
+ virtual const std::string &current_name() const noexcept = 0;
+ virtual std::uint64_t current_uncompressed_length() const noexcept = 0;
+ virtual std::chrono::system_clock::time_point current_last_modified() const noexcept = 0;
+ virtual std::uint32_t current_crc() const noexcept = 0;
// decompress the most recently found file in the ZIP
- virtual error decompress(void *buffer, std::uint32_t length) = 0;
+ virtual std::error_condition decompress(void *buffer, std::size_t length) noexcept = 0;
};
+
+// error category for archive errors
+std::error_category const &archive_category() noexcept;
+inline std::error_condition make_error_condition(archive_file::error err) noexcept { return std::error_condition(int(err), archive_category()); }
+
} // namespace util
+
+namespace std {
+
+template <> struct is_error_condition_enum<util::archive_file::error> : public std::true_type { };
+
+} // namespace std
+
#endif // MAME_LIB_UTIL_UNZIP_H
diff --git a/src/lib/util/utilfwd.h b/src/lib/util/utilfwd.h
new file mode 100644
index 00000000000..fefe0631c68
--- /dev/null
+++ b/src/lib/util/utilfwd.h
@@ -0,0 +1,45 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/**********************************************************************
+
+ utilfwd.h
+
+ Forward declarations of types
+
+**********************************************************************/
+#ifndef MAME_LIB_UTIL_UTILFWD_H
+#define MAME_LIB_UTIL_UTILFWD_H
+
+// chd.h
+class chd_file;
+
+
+namespace util {
+
+// corefile.h
+class core_file;
+
+// ioprocs.h
+class read_stream;
+class write_stream;
+class read_write_stream;
+class random_access;
+class random_read;
+class random_write;
+class random_read_write;
+
+// unzip.h
+class archive_file;
+
+} // namespace util
+
+
+namespace util::xml {
+
+// xmlfile.h
+class data_node;
+class file;
+
+} // namespace util::xml
+
+#endif // MAME_LIB_UTIL_UTILFWD_H
diff --git a/src/lib/util/zippath.cpp b/src/lib/util/zippath.cpp
index 01d708bf2e1..8c37b3d72ad 100644
--- a/src/lib/util/zippath.cpp
+++ b/src/lib/util/zippath.cpp
@@ -9,13 +9,13 @@
***************************************************************************/
#include "zippath.h"
-#include "unzip.h"
-#include "corestr.h"
-#include <cstdlib>
+#include "corestr.h"
+#include "unzip.h"
#include <cassert>
#include <cctype>
+#include <cstdlib>
#include <forward_list>
#include <new>
@@ -48,7 +48,8 @@ int is_path_separator(char c)
bool is_root(std::string_view path)
{
- // FIXME: get rid of the assumption that paths are DOS-like
+#if defined(_WIN32)
+ // FIXME: don't assume paths are DOS-like - UNC paths, \\?\ long path prefix, etc. complicate this
// skip drive letter
if (path.length() >= 2 && isalpha(path[0]) && (path[1] == ':'))
@@ -56,6 +57,9 @@ bool is_root(std::string_view path)
// skip path separators
return path.find_first_not_of(PATH_SEPARATOR) == std::string_view::npos;
+#else
+ return path.find_first_not_of(PATH_SEPARATOR) == std::string_view::npos;
+#endif
}
@@ -190,7 +194,7 @@ int zippath_find_sub_path(archive_file &zipfile, std::string_view subpath, osd::
// true path and ZIP entry components
// -------------------------------------------------
-osd_file::error zippath_resolve(std::string_view path, osd::directory::entry::entry_type &entry_type, archive_file::ptr &zipfile, std::string &newpath)
+std::error_condition zippath_resolve(std::string_view path, osd::directory::entry::entry_type &entry_type, archive_file::ptr &zipfile, std::string &newpath)
{
newpath.clear();
@@ -207,7 +211,8 @@ osd_file::error zippath_resolve(std::string_view path, osd::directory::entry::en
auto i = apath.find_last_not_of(PATH_SEPARATOR);
if (i == std::string::npos)
break;
- apath = apath.substr(0, i + 1);
+ apath = apath.erase(std::max<decltype(i)>(i + 1, 2)); // don't erase drive letter
+
apath_trimmed = apath;
// stat the path
@@ -232,13 +237,13 @@ osd_file::error zippath_resolve(std::string_view path, osd::directory::entry::en
if (current_entry_type == osd::directory::entry::entry_type::NONE)
{
entry_type = osd::directory::entry::entry_type::NONE;
- return osd_file::error::NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
}
// is this file a ZIP file?
if ((current_entry_type == osd::directory::entry::entry_type::FILE) &&
- ((is_zip_file(apath_trimmed) && (archive_file::open_zip(apath_trimmed, zipfile) == archive_file::error::NONE)) ||
- (is_7z_file(apath_trimmed) && (archive_file::open_7z(apath_trimmed, zipfile) == archive_file::error::NONE))))
+ ((is_zip_file(apath_trimmed) && !archive_file::open_zip(apath_trimmed, zipfile)) ||
+ (is_7z_file(apath_trimmed) && !archive_file::open_7z(apath_trimmed, zipfile))))
{
auto i = path.length() - apath.length();
while ((i > 0) && is_zip_path_separator(path[apath.length() + i - 1]))
@@ -248,53 +253,20 @@ osd_file::error zippath_resolve(std::string_view path, osd::directory::entry::en
// this was a true ZIP path - attempt to identify the type of path
zippath_find_sub_path(*zipfile, newpath, current_entry_type);
if (current_entry_type == osd::directory::entry::entry_type::NONE)
- return osd_file::error::NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
}
else
{
// this was a normal path
if (went_up)
- return osd_file::error::NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
newpath = path;
}
// success!
entry_type = current_entry_type;
- return osd_file::error::NONE;
-}
-
-
-// -------------------------------------------------
-// file_error_from_zip_error - translates a
-// osd_file::error to a zip_error
-// -------------------------------------------------
-
-osd_file::error file_error_from_zip_error(archive_file::error ziperr)
-{
- osd_file::error filerr;
- switch(ziperr)
- {
- case archive_file::error::NONE:
- filerr = osd_file::error::NONE;
- break;
- case archive_file::error::OUT_OF_MEMORY:
- filerr = osd_file::error::OUT_OF_MEMORY;
- break;
- case archive_file::error::BAD_SIGNATURE:
- case archive_file::error::DECOMPRESS_ERROR:
- case archive_file::error::FILE_TRUNCATED:
- case archive_file::error::FILE_CORRUPT:
- case archive_file::error::UNSUPPORTED:
- case archive_file::error::FILE_ERROR:
- filerr = osd_file::error::INVALID_DATA;
- break;
- case archive_file::error::BUFFER_TOO_SMALL:
- default:
- filerr = osd_file::error::FAILURE;
- break;
- }
- return filerr;
+ return std::error_condition();
}
@@ -303,27 +275,24 @@ osd_file::error file_error_from_zip_error(archive_file::error ziperr)
// from a zip file entry
// -------------------------------------------------
-osd_file::error create_core_file_from_zip(archive_file &zip, util::core_file::ptr &file)
+std::error_condition create_core_file_from_zip(archive_file &zip, util::core_file::ptr &file)
{
- osd_file::error filerr;
- archive_file::error ziperr;
+ // TODO: would be more efficient if we could open a memory-based core_file with uninitialised contents and decompress into it
+ std::error_condition filerr;
void *ptr = malloc(zip.current_uncompressed_length());
if (!ptr)
{
- filerr = osd_file::error::OUT_OF_MEMORY;
+ filerr = std::errc::not_enough_memory;
goto done;
}
- ziperr = zip.decompress(ptr, zip.current_uncompressed_length());
- if (ziperr != archive_file::error::NONE)
- {
- filerr = file_error_from_zip_error(ziperr);
+ filerr = zip.decompress(ptr, zip.current_uncompressed_length());
+ if (filerr)
goto done;
- }
filerr = util::core_file::open_ram_copy(ptr, zip.current_uncompressed_length(), OPEN_FLAG_READ, file);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
goto done;
done:
@@ -539,7 +508,7 @@ private:
// zippath_directory::open - opens a directory
// -------------------------------------------------
-osd_file::error zippath_directory::open(std::string_view path, ptr &directory)
+std::error_condition zippath_directory::open(std::string_view path, ptr &directory)
{
try
{
@@ -547,34 +516,34 @@ osd_file::error zippath_directory::open(std::string_view path, ptr &directory)
osd::directory::entry::entry_type entry_type;
archive_file::ptr zipfile;
std::string zipprefix;
- osd_file::error const err = zippath_resolve(path, entry_type, zipfile, zipprefix);
- if (osd_file::error::NONE != err)
+ std::error_condition const err = zippath_resolve(path, entry_type, zipfile, zipprefix);
+ if (err)
return err;
// we have to be a directory
if (osd::directory::entry::entry_type::DIR != entry_type)
- return osd_file::error::NOT_FOUND;
+ return std::errc::not_a_directory;
// was the result a ZIP?
if (zipfile)
{
directory = std::make_unique<archive_directory_impl>(std::move(zipfile), std::move(zipprefix));
- return osd_file::error::NONE;
+ return std::error_condition();
}
else
{
// a conventional directory
std::unique_ptr<filesystem_directory_impl> result(new filesystem_directory_impl(path));
if (!*result)
- return osd_file::error::FAILURE;
+ return std::errc::io_error; // TODO: any way to give a better error here?
directory = std::move(result);
- return osd_file::error::NONE;
+ return std::error_condition();
}
}
catch (std::bad_alloc const &)
{
- return osd_file::error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
}
}
@@ -640,7 +609,7 @@ std::string &zippath_combine(std::string &dst, const std::string &path1, const s
{
dst.assign(path2);
}
- else if (!path1.empty() && !is_path_separator(*path1.rbegin()))
+ else if (!path1.empty() && !is_path_separator(path1.back()))
{
dst.assign(path1).append(PATH_SEPARATOR).append(path2);
}
@@ -675,7 +644,7 @@ std::string zippath_combine(const std::string &path1, const std::string &path2)
// -------------------------------------------------
/**
- * @fn osd_file::error zippath_fopen(std::string_view filename, uint32_t openflags, util::core_file::ptr &file, std::string &revised_path)
+ * @fn std::error_condition zippath_fopen(std::string_view filename, uint32_t openflags, util::core_file::ptr &file, std::string &revised_path)
*
* @brief Zippath fopen.
*
@@ -687,38 +656,35 @@ std::string zippath_combine(const std::string &path1, const std::string &path2)
* @return A osd_file::error.
*/
-osd_file::error zippath_fopen(std::string_view filename, uint32_t openflags, util::core_file::ptr &file, std::string &revised_path)
+std::error_condition zippath_fopen(std::string_view filename, uint32_t openflags, util::core_file::ptr &file, std::string &revised_path)
{
- osd_file::error filerr = osd_file::error::NOT_FOUND;
- archive_file::error ziperr;
+ std::error_condition filerr = std::errc::no_such_file_or_directory;
archive_file::ptr zip;
- int header;
- osd::directory::entry::entry_type entry_type;
- int len;
- /* first, set up the two types of paths */
+ // first, set up the two types of paths
std::string mainpath(filename);
std::string subpath;
file = nullptr;
- /* loop through */
- while((file == nullptr) && (mainpath.length() > 0)
- && ((openflags == OPEN_FLAG_READ) || subpath.empty()))
+ // loop through
+ while (!file && !mainpath.empty() && ((openflags == OPEN_FLAG_READ) || subpath.empty()))
{
- /* is the mainpath a ZIP path? */
+ // is the mainpath a ZIP path?
if (is_zip_file(mainpath) || is_7z_file(mainpath))
{
- /* this file might be a zip file - lets take a look */
- ziperr = is_zip_file(mainpath) ? archive_file::open_zip(mainpath, zip) : archive_file::open_7z(mainpath, zip);
- if (ziperr == archive_file::error::NONE)
+ // this file might be a zip file - lets take a look
+ std::error_condition const ziperr = is_zip_file(mainpath) ? archive_file::open_zip(mainpath, zip) : archive_file::open_7z(mainpath, zip);
+ if (!ziperr)
{
- /* it is a zip file - error if we're not opening for reading */
+ // it is a zip file - error if we're not opening for reading
if (openflags != OPEN_FLAG_READ)
{
- filerr = osd_file::error::ACCESS_DENIED;
+ filerr = std::errc::permission_denied;
goto done;
}
+ osd::directory::entry::entry_type entry_type;
+ int header;
if (!subpath.empty())
header = zippath_find_sub_path(*zip, subpath, entry_type);
else
@@ -726,20 +692,20 @@ osd_file::error zippath_fopen(std::string_view filename, uint32_t openflags, uti
if (header < 0)
{
- filerr = osd_file::error::NOT_FOUND;
+ filerr = std::errc::no_such_file_or_directory;
goto done;
}
- /* attempt to read the file */
+ // attempt to read the file
filerr = create_core_file_from_zip(*zip, file);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
goto done;
- /* update subpath, if appropriate */
+ // update subpath, if appropriate
if (subpath.empty())
subpath.assign(zip->current_name());
- /* we're done */
+ // we're done
goto done;
}
}
@@ -747,15 +713,15 @@ osd_file::error zippath_fopen(std::string_view filename, uint32_t openflags, uti
if (subpath.empty())
filerr = util::core_file::open(std::string(filename), openflags, file);
else
- filerr = osd_file::error::NOT_FOUND;
+ filerr = std::errc::no_such_file_or_directory;
- /* if we errored, then go up a directory */
- if (filerr != osd_file::error::NONE)
+ // if we errored, then go up a directory
+ if (filerr)
{
- /* go up a directory */
+ // go up a directory
auto temp = zippath_parent(mainpath);
- /* append to the sub path */
+ // append to the sub path
if (!subpath.empty())
{
std::string temp2;
@@ -768,8 +734,8 @@ osd_file::error zippath_fopen(std::string_view filename, uint32_t openflags, uti
mainpath = mainpath.substr(temp.length());
subpath.assign(mainpath);
}
- /* get the new main path, truncating path separators */
- len = temp.length();
+ // get the new main path, truncating path separators
+ auto len = temp.length();
while (len > 0 && is_zip_file_separator(temp[len - 1]))
len--;
temp = temp.substr(0, len);
@@ -778,14 +744,14 @@ osd_file::error zippath_fopen(std::string_view filename, uint32_t openflags, uti
}
done:
- /* store the revised path */
+ // store the revised path
revised_path.clear();
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
{
- /* canonicalize mainpath */
+ // canonicalize mainpath
std::string alloc_fullpath;
filerr = osd_get_full_path(alloc_fullpath, mainpath);
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
{
revised_path = alloc_fullpath;
if (!subpath.empty())
diff --git a/src/lib/util/zippath.h b/src/lib/util/zippath.h
index 1eb92aa1c1d..955c75cfc8f 100644
--- a/src/lib/util/zippath.h
+++ b/src/lib/util/zippath.h
@@ -18,6 +18,7 @@
#include <string>
#include <string_view>
+#include <system_error>
namespace util {
@@ -32,7 +33,7 @@ public:
typedef std::unique_ptr<zippath_directory> ptr;
// opens a directory
- static osd_file::error open(std::string_view path, ptr &directory);
+ static std::error_condition open(std::string_view path, ptr &directory);
// closes a directory
virtual ~zippath_directory();
@@ -63,7 +64,7 @@ std::string zippath_combine(const std::string &path1, const std::string &path2);
// ----- file operations -----
// opens a zip path file
-osd_file::error zippath_fopen(std::string_view filename, uint32_t openflags, util::core_file::ptr &file, std::string &revised_path);
+std::error_condition zippath_fopen(std::string_view filename, uint32_t openflags, util::core_file::ptr &file, std::string &revised_path);
} // namespace util
diff --git a/src/mame/arcade.flt b/src/mame/arcade.flt
index cfdbef8c6cc..dc8033dea1b 100644
--- a/src/mame/arcade.flt
+++ b/src/mame/arcade.flt
@@ -925,6 +925,7 @@ olibochu.cpp
omegrace.cpp
oneshot.cpp
onetwo.cpp
+opercoin.cpp
opwolf.cpp
orbit.cpp
othello.cpp
diff --git a/src/mame/audio/ad_sound.cpp b/src/mame/audio/ad_sound.cpp
index 72ff090f38b..003f534ab12 100644
--- a/src/mame/audio/ad_sound.cpp
+++ b/src/mame/audio/ad_sound.cpp
@@ -323,7 +323,7 @@ static const char *const alphamc07_sample_names[] =
};
-#define MSM5232_BASE_VOLUME 1.0
+#define MSM5232_BASE_VOLUME 0.7
//-------------------------------------------------
// device_add_mconfig - add device configuration
@@ -358,22 +358,22 @@ void ad_59mc07_device::device_add_mconfig(machine_config &config)
m_msm->add_route(5, "speaker", MSM5232_BASE_VOLUME/1.5); // pin 35 4'-2 : 15k resistor
m_msm->add_route(6, "speaker", MSM5232_BASE_VOLUME); // pin 34 8'-2 : 10k resistor
m_msm->add_route(7, "speaker", MSM5232_BASE_VOLUME); // pin 33 16'-2 : 10k resistor
- m_msm->add_route(8, "speaker", 1.0); // pin 1 SOLO 8' (this actually feeds an analog section)
- m_msm->add_route(9, "speaker", 1.0); // pin 2 SOLO 16' (this actually feeds an analog section)
- m_msm->add_route(10,"speaker", 0.12); // pin 22 Noise Output (this actually feeds an analog section)
+ m_msm->add_route(8, "speaker", 0.7); // pin 1 SOLO 8' (this actually feeds an analog section)
+ m_msm->add_route(9, "speaker", 0.7); // pin 2 SOLO 16' (this actually feeds an analog section)
+ m_msm->add_route(10,"speaker", 0.084); // pin 22 Noise Output (this actually feeds an analog section)
ay8910_device &aysnd(AY8910(config, "aysnd", 6.144_MHz_XTAL/4)); // verified on pcb
aysnd.port_a_write_callback().set(FUNC(ad_59mc07_device::ay8910_porta_w));
aysnd.port_b_write_callback().set(FUNC(ad_59mc07_device::ay8910_portb_w));
- aysnd.add_route(ALL_OUTPUTS, "speaker", 0.15);
+ aysnd.add_route(ALL_OUTPUTS, "speaker", 0.105);
- DAC_6BIT_R2R(config, m_dac_1, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
- DAC_6BIT_R2R(config, m_dac_2, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ DAC_6BIT_R2R(config, m_dac_1, 0).add_route(ALL_OUTPUTS, "speaker", 0.35); // unknown DAC
+ DAC_6BIT_R2R(config, m_dac_2, 0).add_route(ALL_OUTPUTS, "speaker", 0.35); // unknown DAC
SAMPLES(config, m_samples);
m_samples->set_channels(3);
m_samples->set_samples_names(alphamc07_sample_names);
- m_samples->add_route(ALL_OUTPUTS, "speaker", 0.3);
+ m_samples->add_route(ALL_OUTPUTS, "speaker", 0.21);
}
diff --git a/src/mame/audio/atarijsa.cpp b/src/mame/audio/atarijsa.cpp
index 27112bec3b4..f1687568df8 100644
--- a/src/mame/audio/atarijsa.cpp
+++ b/src/mame/audio/atarijsa.cpp
@@ -203,7 +203,7 @@ INPUT_PORTS_START( jsa_iii_ioports )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_TILT )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE1 )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, atari_jsa_base_device, main_test_read_line) // self test
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("soundcomm", atari_sound_comm_device, sound_to_main_ready) // output buffer full
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("soundcomm", atari_sound_comm_device, main_to_sound_ready) // input buffer full
@@ -988,7 +988,7 @@ uint8_t atari_jsa_iii_device::rdio_r()
// device_add_mconfig - add device configuration
//-------------------------------------------------
- // Fully populated JSA-III
+// Fully populated JSA-III
void atari_jsa_iii_device::device_add_mconfig(machine_config &config)
{
// basic machine hardware
diff --git a/src/mame/audio/bally.cpp b/src/mame/audio/bally.cpp
index d5ba1df2c45..10c0b2025ce 100644
--- a/src/mame/audio/bally.cpp
+++ b/src/mame/audio/bally.cpp
@@ -450,6 +450,28 @@ static INPUT_PORTS_START(cheap_squeak)
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE3 ) PORT_NAME("Sound Test") PORT_CHANGED_MEMBER(DEVICE_SELF, bally_cheap_squeak_device, sw1, 0)
INPUT_PORTS_END
+bally_cheap_squeak_device::bally_cheap_squeak_device(
+ const machine_config &mconfig,
+ const char *tag,
+ device_t *owner,
+ uint32_t clock) :
+ bally_cheap_squeak_device(mconfig, BALLY_CHEAP_SQUEAK, tag, owner, clock)
+{ }
+
+bally_cheap_squeak_device::bally_cheap_squeak_device(
+ const machine_config &mconfig,
+ device_type type,
+ const char *tag,
+ device_t *owner,
+ uint32_t clock) :
+ device_t(mconfig, type, tag, owner, clock),
+ device_mixer_interface(mconfig, *this),
+ m_cpu(*this, "cpu"),
+ m_dac(*this, "dac"),
+ m_sound_ack_w_handler(*this),
+ m_leds(*this, "sound_led%u", 0U)
+{ }
+
ioport_constructor bally_cheap_squeak_device::device_input_ports() const
{
return INPUT_PORTS_NAME(cheap_squeak);
@@ -457,8 +479,7 @@ ioport_constructor bally_cheap_squeak_device::device_input_ports() const
INPUT_CHANGED_MEMBER(bally_cheap_squeak_device::sw1)
{
- if (newval != oldval)
- m_cpu->set_input_line(INPUT_LINE_NMI, (newval ? ASSERT_LINE : CLEAR_LINE));
+ m_cpu->set_input_line(INPUT_LINE_NMI, (newval ? ASSERT_LINE : CLEAR_LINE));
}
//-------------------------------------------------
@@ -523,6 +544,7 @@ void bally_cheap_squeak_device::device_add_mconfig(machine_config &config)
void bally_cheap_squeak_device::device_start()
{
m_sound_ack_w_handler.resolve();
+ m_leds.resolve();
m_sound_select_sync.init(*this, FUNC(bally_cheap_squeak_device::sound_select_sync));
m_sound_int_sync.init(*this, FUNC(bally_cheap_squeak_device::sound_int_sync));
@@ -567,8 +589,7 @@ void bally_cheap_squeak_device::out_p2_cb(uint8_t data)
void bally_cheap_squeak_device::update_led()
{
// Either input or output can pull the led line high
- bool led_state = m_sound_int || m_sound_ack;
- machine().output().set_value("sound_led0", led_state);
+ m_leds[0] = m_sound_int || m_sound_ack;
}
@@ -576,6 +597,41 @@ void bally_cheap_squeak_device::update_led()
// Squawk & Talk
//**************************************************************************
+bally_squawk_n_talk_device::bally_squawk_n_talk_device(
+ const machine_config &mconfig,
+ const char *tag,
+ device_t *owner,
+ uint32_t clock) :
+ bally_squawk_n_talk_device(mconfig, BALLY_SQUAWK_N_TALK, tag, owner, clock)
+{ }
+
+bally_squawk_n_talk_device::bally_squawk_n_talk_device(
+ const machine_config &mconfig,
+ device_type type,
+ const char *tag,
+ device_t *owner,
+ uint32_t clock) :
+ device_t(mconfig, type, tag, owner, clock),
+ device_mixer_interface(mconfig, *this),
+ m_cpu(*this, "cpu"),
+ m_pia1(*this, "pia1"),
+ m_pia2(*this, "pia2"),
+ m_dac_filter(*this, "dac_filter"),
+ m_dac(*this, "dac"),
+ m_speech_filter(*this, "speech_filter"),
+ m_tms5200(*this, "tms5200")
+{ }
+
+bally_squawk_n_talk_ay_device::bally_squawk_n_talk_ay_device(
+ const machine_config &mconfig,
+ const char *tag,
+ device_t *owner,
+ uint32_t clock) :
+ bally_squawk_n_talk_device(mconfig, BALLY_SQUAWK_N_TALK_AY, tag, owner, clock),
+ m_ay_filters(*this, "ay_filter%u", 0),
+ m_ay(*this, "ay")
+{ }
+
//--------------------------------------------------------------------------
// IO ports
//--------------------------------------------------------------------------
@@ -658,7 +714,7 @@ void bally_squawk_n_talk_device::device_add_mconfig(machine_config &config)
PIA6821(config, m_pia2, 0);
m_pia2->readpa_handler().set(FUNC(bally_squawk_n_talk_device::pia2_porta_r));
- m_pia2->ca2_handler().set(FUNC(bally_squawk_n_talk_device::pia2_ca2_w));
+ m_pia2->ca2_handler().set_output("sound_led0");
m_pia2->irqa_handler().set(FUNC(bally_squawk_n_talk_device::pia_irq_w));
m_pia2->irqb_handler().set(FUNC(bally_squawk_n_talk_device::pia_irq_w));
@@ -710,15 +766,6 @@ uint8_t bally_squawk_n_talk_device::pia2_porta_r()
}
//-------------------------------------------------
-// pia2_ca2_w - PIA 2 CA2 writes
-//-------------------------------------------------
-
-WRITE_LINE_MEMBER(bally_squawk_n_talk_device::pia2_ca2_w)
-{
- machine().output().set_value("sound_led0", state);
-}
-
-//-------------------------------------------------
// pia_irq_w - IRQ line state changes
//-------------------------------------------------
WRITE_LINE_MEMBER(bally_squawk_n_talk_device::pia_irq_w)
@@ -739,10 +786,11 @@ void bally_squawk_n_talk_ay_device::device_add_mconfig(machine_config &config)
m_pia2->writepb_handler().set(FUNC(bally_squawk_n_talk_ay_device::pia2_portb_w));
m_pia2->cb2_handler().set(FUNC(bally_squawk_n_talk_ay_device::pia2_cb2_w));
- for (optional_device<filter_rc_device> &filter : m_ay_filters)
- // TODO: Calculate exact filter values. An AC filter is good enough for now
- // and required as the chip likes to output a DC offset at idle.
+ // TODO: Calculate exact filter values. An AC filter is good enough for now
+ // and required as the chip likes to output a DC offset at idle.
+ for (auto &filter : m_ay_filters)
FILTER_RC(config, filter).set_ac().add_route(ALL_OUTPUTS, *this, 1.0);
+
AY8910(config, m_ay, DERIVED_CLOCK(1, 4));
m_ay->add_route(0, "ay_filter0", 0.33);
m_ay->add_route(1, "ay_filter1", 0.33);
diff --git a/src/mame/audio/bally.h b/src/mame/audio/bally.h
index 6dcaf8089f5..4958c29c9bf 100644
--- a/src/mame/audio/bally.h
+++ b/src/mame/audio/bally.h
@@ -209,9 +209,7 @@ public:
const machine_config &mconfig,
const char *tag,
device_t *owner,
- uint32_t clock = 3'579'545) :
- bally_cheap_squeak_device(mconfig, BALLY_CHEAP_SQUEAK, tag, owner, clock)
- { }
+ uint32_t clock = 3'579'545);
auto sound_ack_w_handler() { return m_sound_ack_w_handler.bind(); }
@@ -228,13 +226,7 @@ protected:
device_type type,
const char *tag,
device_t *owner,
- uint32_t clock) :
- device_t(mconfig, type, tag, owner, clock),
- device_mixer_interface(mconfig, *this),
- m_cpu(*this, "cpu"),
- m_dac(*this, "dac"),
- m_sound_ack_w_handler(*this)
- { }
+ uint32_t clock);
// device-level overrides
virtual void device_add_mconfig(machine_config &config) override;
@@ -251,6 +243,7 @@ private:
bool m_sound_ack;
devcb_write_line m_sound_ack_w_handler;
+ output_finder<1> m_leds;
// internal communications
TIMER_CALLBACK_MEMBER(sound_select_sync);
@@ -275,9 +268,7 @@ public:
const machine_config &mconfig,
const char *tag,
device_t *owner,
- uint32_t clock = 3'579'545) :
- bally_squawk_n_talk_device(mconfig, BALLY_SQUAWK_N_TALK, tag, owner, clock)
- { }
+ uint32_t clock = 3'579'545);
// read/write
DECLARE_INPUT_CHANGED_MEMBER(sw1);
@@ -292,19 +283,7 @@ protected:
device_type type,
const char *tag,
device_t *owner,
- uint32_t clock) :
- device_t(mconfig, type, tag, owner, clock),
- device_mixer_interface(mconfig, *this),
- m_cpu(*this, "cpu"),
- m_pia1(*this, "pia1"),
- m_pia2(*this, "pia2"),
- m_dac_filter(*this, "dac_filter"),
- m_dac(*this, "dac"),
- m_speech_filter(*this, "speech_filter"),
- m_tms5200(*this, "tms5200"),
- m_ay_filters(*this, "ay_filter%u", 0),
- m_ay(*this, "ay")
- { }
+ uint32_t clock);
// device-level overrides
virtual void device_add_mconfig(machine_config &config) override;
@@ -319,8 +298,6 @@ protected:
required_device<dac_byte_interface> m_dac;
required_device<filter_rc_device> m_speech_filter;
required_device<tms5200_device> m_tms5200;
- optional_device_array<filter_rc_device, 3> m_ay_filters;
- optional_device<ay8910_device> m_ay;
uint8_t m_sound_select;
@@ -333,7 +310,6 @@ private:
TIMER_CALLBACK_MEMBER(sound_int_sync);
transient_timer_factory m_sound_int_sync;
void pia1_portb_w(uint8_t data);
- DECLARE_WRITE_LINE_MEMBER(pia2_ca2_w);
DECLARE_WRITE_LINE_MEMBER(pia_irq_w);
};
@@ -345,9 +321,7 @@ public:
const machine_config &mconfig,
const char *tag,
device_t *owner,
- uint32_t clock = 3'579'545) :
- bally_squawk_n_talk_device(mconfig, BALLY_SQUAWK_N_TALK_AY, tag, owner, clock)
- { }
+ uint32_t clock = 3'579'545);
protected:
// device-level overrides
@@ -361,6 +335,9 @@ private:
bool m_bdir;
uint8_t m_ay_data;
+ required_device_array<filter_rc_device, 3> m_ay_filters;
+ required_device<ay8910_device> m_ay;
+
void pia2_porta_w(uint8_t data);
void pia2_portb_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(pia2_cb2_w);
diff --git a/src/mame/audio/cchasm.cpp b/src/mame/audio/cchasm.cpp
deleted file mode 100644
index a4549d2092b..00000000000
--- a/src/mame/audio/cchasm.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Mathis Rosenhauer
-/***************************************************************************
-
- Cinematronics Cosmic Chasm hardware
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/z80/z80.h"
-#include "machine/z80ctc.h"
-#include "includes/cchasm.h"
-#include "sound/ay8910.h"
-
-
-void cchasm_state::reset_coin_flag_w(uint8_t data)
-{
- if (m_coin_flag)
- {
- m_coin_flag = 0;
- m_ctc->trg0(m_coin_flag);
- }
-}
-
-INPUT_CHANGED_MEMBER(cchasm_state::set_coin_flag )
-{
- if (!newval && !m_coin_flag)
- {
- m_coin_flag = 1;
- m_ctc->trg0(m_coin_flag);
- }
-}
-
-uint8_t cchasm_state::coin_sound_r()
-{
- uint8_t coin = (ioport("IN3")->read() >> 4) & 0x7;
- return m_sound_flags | (m_coin_flag << 3) | coin;
-}
-
-uint8_t cchasm_state::soundlatch2_r()
-{
- m_sound_flags &= ~0x80;
- m_ctc->trg2(0);
- return m_soundlatch2->read();
-}
-
-void cchasm_state::soundlatch4_w(uint8_t data)
-{
- m_sound_flags |= 0x40;
- m_soundlatch4->write(data);
- m_maincpu->set_input_line(1, HOLD_LINE);
-}
-
-void cchasm_state::io_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- //static int led;
-
- if (ACCESSING_BITS_8_15)
- {
- data >>= 8;
- switch (offset & 0xf)
- {
- case 0:
- m_soundlatch->write(data);
- break;
- case 1:
- m_sound_flags |= 0x80;
- m_soundlatch2->write(data);
- m_ctc->trg2(1);
- m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
- break;
- case 2:
- //led = data;
- break;
- }
- }
-}
-
-uint16_t cchasm_state::io_r(offs_t offset)
-{
- switch (offset & 0xf)
- {
- case 0x0:
- return m_soundlatch3->read() << 8;
- case 0x1:
- m_sound_flags &= ~0x40;
- return m_soundlatch4->read() << 8;
- case 0x2:
- return (m_sound_flags| (ioport("IN3")->read() & 0x07) | 0x08) << 8;
- case 0x5:
- return ioport("IN2")->read() << 8;
- case 0x8:
- return ioport("IN1")->read() << 8;
- default:
- return 0xff << 8;
- }
-}
-
-
-WRITE_LINE_MEMBER(cchasm_state::ctc_timer_1_w)
-{
- if (state) /* rising edge */
- {
- m_output[0] = !m_output[0];
- m_dac1->write(m_output[0]);
- }
-}
-
-WRITE_LINE_MEMBER(cchasm_state::ctc_timer_2_w)
-{
- if (state) /* rising edge */
- {
- m_output[1] = !m_output[1];
- m_dac2->write(m_output[1]);
- }
-}
-
-void cchasm_state::sound_start()
-{
- m_coin_flag = 0;
- m_sound_flags = 0;
- m_output[0] = 0;
- m_output[1] = 0;
-
- save_item(NAME(m_sound_flags));
- save_item(NAME(m_coin_flag));
- save_item(NAME(m_output));
-}
diff --git a/src/mame/audio/cps3.cpp b/src/mame/audio/cps3.cpp
index bbefabf4d50..27a1be1c7ca 100644
--- a/src/mame/audio/cps3.cpp
+++ b/src/mame/audio/cps3.cpp
@@ -135,6 +135,13 @@ void cps3_sound_device::sound_stream_update(sound_stream &stream, std::vector<re
vptr->frac = frac;
}
}
+
+ // clamp the output; unknown what the real chip does
+ for (int sampindex = 0; sampindex < outputs[0].samples(); sampindex++)
+ {
+ outputs[0].put_clamp(sampindex, outputs[0].getraw(sampindex));
+ outputs[1].put_clamp(sampindex, outputs[1].getraw(sampindex));
+ }
}
diff --git a/src/mame/audio/dcs.cpp b/src/mame/audio/dcs.cpp
index a88b6963143..d46df62ff8b 100644
--- a/src/mame/audio/dcs.cpp
+++ b/src/mame/audio/dcs.cpp
@@ -693,9 +693,9 @@ dcs_audio_device::dcs_audio_device(const machine_config &mconfig, device_type ty
m_channels(0),
m_size(0),
m_incs(0),
- m_reg_timer(nullptr),
- m_sport0_timer(nullptr),
- m_internal_timer(nullptr),
+ m_reg_timer(*this, "dcs_reg_timer"),
+ m_sport0_timer(*this, "dcs_sport0_timer"),
+ m_internal_timer(*this, "dcs_int_timer"),
m_ireg(0),
m_ireg_base(0),
m_bootrom(nullptr),
@@ -790,10 +790,6 @@ void dcs_audio_device::device_start()
m_data_bank->configure_entries(0, m_sounddata_banks, m_sounddata, 0x800*2);
}
- /* create the timers */
- m_internal_timer = subdevice<timer_device>("dcs_int_timer");
- m_reg_timer = subdevice<timer_device>("dcs_reg_timer");
-
m_dcs_reset.init(*this, FUNC(dcs_audio_device::dcs_reset));
m_dcs_delayed_data_w.init(*this, FUNC(dcs_audio_device::dcs_delayed_data_w));
m_latch_delayed_w.init(*this, FUNC(dcs_audio_device::latch_delayed_w));
@@ -891,11 +887,6 @@ void dcs2_audio_device::device_start()
/* allocate memory for the SRAM */
m_sram = std::make_unique<uint16_t[]>(0x8000*4/2);
- /* create the timers */
- m_internal_timer = subdevice<timer_device>("dcs_int_timer");
- m_reg_timer = subdevice<timer_device>("dcs_reg_timer");
- m_sport0_timer = subdevice<timer_device>("dcs_sport0_timer");
-
/* we don't do auto-ack by default */
m_auto_ack = false;
@@ -924,14 +915,17 @@ void dcs2_audio_device::device_start()
}
-void dcs_audio_device::install_speedup(void)
+void dcs_audio_device::install_speedup()
{
- if (m_polling_offset) {
- if (m_rev < REV_DSIO) {
+ if (m_polling_offset)
+ {
+ if (m_rev < REV_DSIO)
+ {
m_cpu->space(AS_DATA).install_read_handler(m_polling_offset, m_polling_offset, read16mo_delegate(*this, FUNC(dcs_audio_device::dcs_polling_r)));
m_cpu->space(AS_DATA).install_write_handler(m_polling_offset, m_polling_offset, write16s_delegate(*this, FUNC(dcs_audio_device::dcs_polling_w)));
}
- else {
+ else
+ {
// ADSP 2181 (DSIO and DENVER) use program memory
m_cpu->space(AS_PROGRAM).install_read_handler(m_polling_offset, m_polling_offset, read32mo_delegate(*this, FUNC(dcs_audio_device::dcs_polling32_r)));
m_cpu->space(AS_PROGRAM).install_write_handler(m_polling_offset, m_polling_offset, write32s_delegate(*this, FUNC(dcs_audio_device::dcs_polling32_w)));
@@ -1922,15 +1916,18 @@ void dcs_audio_device:: adsp_control_w(offs_t offset, uint16_t data)
}
// Check SPORT0 enabled
- if (m_sport0_timer != nullptr) {
- if (data & 0x1000) {
+ if (m_sport0_timer)
+ {
+ if (data & 0x1000)
+ {
// Start the SPORT0 timer
// SPORT0 is used as a 1kHz timer
m_sport0_timer->adjust(attotime::from_usec(10), 0, attotime::from_hz(1000));
if (LOG_DCS_IO)
logerror("adsp_control_w: Setting SPORT0 freqency to 1kHz\n");
}
- else {
+ else
+ {
// Stop the SPORT0 timer
m_sport0_timer->reset();
}
@@ -2482,7 +2479,7 @@ int dcs_audio_device::preprocess_write(uint16_t data)
int result;
/* if we're not DCS2, skip */
- if (m_sport0_timer == nullptr)
+ if (!m_sport0_timer)
return 0;
/* state 0 - initialization phase */
@@ -2512,8 +2509,8 @@ void dcs_audio_device::add_mconfig_dcs(machine_config &config)
dcs.set_addrmap(AS_PROGRAM, &dcs_audio_device::dcs_2k_program_map);
dcs.set_addrmap(AS_DATA, &dcs_audio_device::dcs_2k_data_map);
- TIMER(config, "dcs_reg_timer").configure_generic(FUNC(dcs_audio_device::dcs_irq));
- TIMER(config, "dcs_int_timer").configure_generic(FUNC(dcs_audio_device::internal_timer_callback));
+ TIMER(config, m_reg_timer).configure_generic(FUNC(dcs_audio_device::dcs_irq));
+ TIMER(config, m_internal_timer).configure_generic(FUNC(dcs_audio_device::internal_timer_callback));
SPEAKER(config, "mono").front_center();
@@ -2683,9 +2680,9 @@ void dcs2_audio_dsio_device::device_add_mconfig(machine_config &config)
ADDRESS_MAP_BANK(config, "data_map_bank").set_map(&dcs2_audio_dsio_device::dsio_rambank_map).set_options(ENDIANNESS_LITTLE, 16, 14, 0x2000);
- TIMER(config, "dcs_reg_timer").configure_generic(FUNC(dcs_audio_device::dcs_irq));
- TIMER(config, "dcs_int_timer").configure_generic(FUNC(dcs_audio_device::internal_timer_callback));
- TIMER(config, "dcs_sport0_timer").configure_generic(FUNC(dcs_audio_device::sport0_irq)); // roadburn needs this to pass hardware test
+ TIMER(config, m_reg_timer).configure_generic(FUNC(dcs_audio_device::dcs_irq));
+ TIMER(config, m_internal_timer).configure_generic(FUNC(dcs_audio_device::internal_timer_callback));
+ TIMER(config, m_sport0_timer).configure_generic(FUNC(dcs_audio_device::sport0_irq)); // roadburn needs this to pass hardware test
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
@@ -2713,11 +2710,11 @@ void dcs2_audio_denver_device::device_add_mconfig(machine_config &config)
denver.set_addrmap(AS_DATA, &dcs2_audio_denver_device::denver_data_map);
denver.set_addrmap(AS_IO, &dcs2_audio_denver_device::denver_io_map);
- ADDRESS_MAP_BANK(config, "data_map_bank").set_map(&dcs2_audio_denver_device::denver_rambank_map).set_options(ENDIANNESS_LITTLE, 16, 15, 0x2000*2);
+ ADDRESS_MAP_BANK(config, m_ram_map).set_map(&dcs2_audio_denver_device::denver_rambank_map).set_options(ENDIANNESS_LITTLE, 16, 15, 0x2000*2);
- TIMER(config, "dcs_reg_timer").configure_generic(FUNC(dcs_audio_device::dcs_irq));
- TIMER(config, "dcs_int_timer").configure_generic(FUNC(dcs_audio_device::internal_timer_callback));
- TIMER(config, "dcs_sport0_timer").configure_generic(FUNC(dcs_audio_device::sport0_irq)); // Atlantis driver waits for sport0 rx interrupts
+ TIMER(config, m_reg_timer).configure_generic(FUNC(dcs_audio_device::dcs_irq));
+ TIMER(config, m_internal_timer).configure_generic(FUNC(dcs_audio_device::internal_timer_callback));
+ TIMER(config, m_sport0_timer).configure_generic(FUNC(dcs_audio_device::sport0_irq)); // Atlantis driver waits for sport0 rx interrupts
}
dcs2_audio_denver_5ch_device::dcs2_audio_denver_5ch_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
diff --git a/src/mame/audio/dcs.h b/src/mame/audio/dcs.h
index 33f7f0b283a..93c44ee76f1 100644
--- a/src/mame/audio/dcs.h
+++ b/src/mame/audio/dcs.h
@@ -44,8 +44,8 @@ public:
uint32_t dsio_idma_data_r();
void dmovlay_remap_memory();
void dmovlay_callback(uint32_t data);
- void denver_postload(void);
- void install_speedup(void);
+ void denver_postload();
+ void install_speedup();
// non public
void dcs_boot();
@@ -63,7 +63,7 @@ public:
void dsio_reset();
uint16_t dsio_r(offs_t offset);
void dsio_w(offs_t offset, uint16_t data);
- void denver_alloc_dmadac(void);
+ void denver_alloc_dmadac();
void denver_reset();
uint16_t denver_r(offs_t offset);
void denver_w(offs_t offset, uint16_t data);
@@ -179,9 +179,9 @@ protected:
uint16_t m_size;
uint16_t m_incs;
dmadac_sound_device *m_dmadac[6];
- timer_device *m_reg_timer;
- timer_device *m_sport0_timer;
- timer_device *m_internal_timer;
+ required_device<timer_device> m_reg_timer;
+ optional_device<timer_device> m_sport0_timer;
+ required_device<timer_device> m_internal_timer;
int32_t m_ireg;
uint16_t m_ireg_base;
uint16_t m_control_regs[32];
diff --git a/src/mame/audio/decobsmt.cpp b/src/mame/audio/decobsmt.cpp
index 1db69037b3b..5f748800d29 100644
--- a/src/mame/audio/decobsmt.cpp
+++ b/src/mame/audio/decobsmt.cpp
@@ -59,8 +59,8 @@ void decobsmt_device::device_add_mconfig(machine_config &config)
BSMT2000(config, m_bsmt, XTAL(24'000'000));
m_bsmt->set_addrmap(0, &decobsmt_device::bsmt_map);
m_bsmt->set_ready_callback(FUNC(decobsmt_device::bsmt_ready_callback));
- m_bsmt->add_route(0, "lspeaker", 2.0);
- m_bsmt->add_route(1, "rspeaker", 2.0);
+ m_bsmt->add_route(0, "lspeaker", 1.0);
+ m_bsmt->add_route(1, "rspeaker", 1.0);
}
//**************************************************************************
diff --git a/src/mame/audio/dkong.cpp b/src/mame/audio/dkong.cpp
index a2c69a86009..e85b4836bed 100644
--- a/src/mame/audio/dkong.cpp
+++ b/src/mame/audio/dkong.cpp
@@ -1349,7 +1349,7 @@ void dkong_state::dkong2b_audio(machine_config &config)
m_soundcpu->t1_in_cb().set(m_dev_6h, FUNC(latch8_device::bit4_q_r));
SPEAKER(config, "mono").front_center();
- DISCRETE(config, "discrete", dkong2b_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+ DISCRETE(config, "discrete", dkong2b_discrete).add_route(ALL_OUTPUTS, "mono", 0.9);
}
void dkong_state::radarscp_audio(machine_config &config)
@@ -1421,7 +1421,7 @@ void dkong_state::dkongjr_audio(machine_config &config)
SPEAKER(config, "mono").front_center();
- DISCRETE(config, "discrete", dkongjr_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+ DISCRETE(config, "discrete", dkongjr_discrete).add_route(ALL_OUTPUTS, "mono", 0.5);
}
void dkong_state::dkong3_audio(machine_config &config)
diff --git a/src/mame/audio/hng64.cpp b/src/mame/audio/hng64.cpp
index 6cc74d5a9b4..74308bc6dea 100644
--- a/src/mame/audio/hng64.cpp
+++ b/src/mame/audio/hng64.cpp
@@ -405,6 +405,6 @@ void hng64_state::hng64_audio(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
L7A1045(config, m_dsp, 32000000/2); // ??
- m_dsp->add_route(0, "lspeaker", 1.0);
- m_dsp->add_route(1, "rspeaker", 1.0);
+ m_dsp->add_route(0, "lspeaker", 0.1);
+ m_dsp->add_route(1, "rspeaker", 0.1);
}
diff --git a/src/mame/audio/m72.h b/src/mame/audio/m72.h
index be4a31ce2fb..bf6995c10a6 100644
--- a/src/mame/audio/m72.h
+++ b/src/mame/audio/m72.h
@@ -10,9 +10,11 @@
#pragma once
-#include "dirom.h"
#include "sound/dac.h"
+#include "dirom.h"
+
+
class m72_audio_device : public device_t, public device_rom_interface<32> // unknown address bits
{
public:
diff --git a/src/mame/audio/mario.cpp b/src/mame/audio/mario.cpp
index a97abfdcf79..b4feeecbc32 100644
--- a/src/mame/audio/mario.cpp
+++ b/src/mame/audio/mario.cpp
@@ -663,7 +663,7 @@ void mario_state::mario_audio(machine_config &config)
#else
NETLIST_SOUND(config, "snd_nl", 48000)
.set_source(netlist_mario)
- .add_route(ALL_OUTPUTS, "mono", 1.0);
+ .add_route(ALL_OUTPUTS, "mono", 0.5);
NETLIST_LOGIC_INPUT(config, m_audio_snd0, "SOUND0.IN", 0);
NETLIST_LOGIC_INPUT(config, m_audio_snd1, "SOUND1.IN", 0);
diff --git a/src/mame/audio/n8080.cpp b/src/mame/audio/n8080.cpp
index 55cdf194874..76786494006 100644
--- a/src/mame/audio/n8080.cpp
+++ b/src/mame/audio/n8080.cpp
@@ -472,7 +472,7 @@ void helifire_state::sound_io_map(address_map &map)
void spacefev_state::spacefev_sound(machine_config &config)
{
/* basic machine hardware */
- I8035(config, m_audiocpu, 6000000);
+ I8035(config, m_audiocpu, 6_MHz_XTAL);
m_audiocpu->set_addrmap(AS_PROGRAM, &spacefev_state::n8080_sound_cpu_map);
m_audiocpu->t0_in_cb().set(FUNC(spacefev_state::n8080_8035_t0_r));
m_audiocpu->t1_in_cb().set(FUNC(spacefev_state::n8080_8035_t1_r));
@@ -506,7 +506,7 @@ void spacefev_state::spacefev_sound(machine_config &config)
void sheriff_state::sheriff_sound(machine_config &config)
{
/* basic machine hardware */
- I8035(config, m_audiocpu, 6000000);
+ I8035(config, m_audiocpu, 6_MHz_XTAL);
m_audiocpu->set_addrmap(AS_PROGRAM, &sheriff_state::n8080_sound_cpu_map);
m_audiocpu->t0_in_cb().set(FUNC(sheriff_state::n8080_8035_t0_r));
m_audiocpu->t1_in_cb().set(FUNC(sheriff_state::n8080_8035_t1_r));
@@ -538,7 +538,7 @@ void sheriff_state::sheriff_sound(machine_config &config)
void helifire_state::helifire_sound(machine_config &config)
{
/* basic machine hardware */
- I8035(config, m_audiocpu, 6000000);
+ I8035(config, m_audiocpu, 6_MHz_XTAL);
m_audiocpu->set_addrmap(AS_PROGRAM, &helifire_state::n8080_sound_cpu_map);
m_audiocpu->set_addrmap(AS_IO, &helifire_state::sound_io_map);
m_audiocpu->t0_in_cb().set(FUNC(helifire_state::helifire_8035_t0_r));
diff --git a/src/mame/audio/qix.cpp b/src/mame/audio/qix.cpp
index a5f60325f77..8024b2209f5 100644
--- a/src/mame/audio/qix.cpp
+++ b/src/mame/audio/qix.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Derrick Renaud,Couriersud
/*************************************************************************
- audio/qix.c
+ audio/qix.cpp
*************************************************************************/
@@ -103,7 +103,9 @@ DISCRETE_SOUND_END
void qix_state::sndpia_2_warning_w(uint8_t data)
{
- popmessage("PIA 5 write!!");
+ // this PIA is supposedly unused
+ if (machine().phase() > machine_phase::RESET)
+ logerror("PIA 5 write!!\n");
}
diff --git a/src/mame/audio/redalert.cpp b/src/mame/audio/redalert.cpp
index b83990fcf63..d0197dea98a 100644
--- a/src/mame/audio/redalert.cpp
+++ b/src/mame/audio/redalert.cpp
@@ -10,11 +10,13 @@
****************************************************************************/
#include "emu.h"
-#include "includes/redalert.h"
+#include "redalert.h"
#include "cpu/m6800/m6800.h"
#include "cpu/m6502/m6502.h"
#include "machine/rescap.h"
+#include "sound/hc55516.h"
+
#include "speaker.h"
@@ -34,23 +36,73 @@
#define DEMONEYE_AY8910_CLOCK (DEMONEYE_AUDIO_PCB_CLOCK / 2) /* what's the real divisor? */
-TIMER_CALLBACK_MEMBER(redalert_state::audio_irq_on)
+DEFINE_DEVICE_TYPE(IREM_M37B_AUDIO, irem_m37b_audio_device, "irem_m37b_audio", "Irem M37B audio")
+DEFINE_DEVICE_TYPE(PANTHER_AUDIO, panther_audio_device, "panther_audio", "Irem M37B audio (Panther)")
+DEFINE_DEVICE_TYPE(IREM_M37B_UE17B_AUDIO, irem_m37b_ue17b_audio_device, "irem_m37b_ue17b_audio", "Irem M37B/UE17B audio/voice")
+DEFINE_DEVICE_TYPE(DEMONEYE_AUDIO, demoneye_audio_device, "demoneye_audio", "Irem Demoneye-X audio")
+
+
+irem_m37b_audio_device::irem_m37b_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock) :
+ irem_m37b_audio_device(config, IREM_M37B_AUDIO, tag, owner, clock)
+{
+}
+
+irem_m37b_audio_device::irem_m37b_audio_device(const machine_config &config, device_type type, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(config, type, tag, owner, clock),
+ m_audiocpu(*this, "audiocpu"),
+ m_ay8910(*this, "aysnd"),
+ m_soundlatch(*this, "soundlatch")
+{
+}
+
+
+panther_audio_device::panther_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock) :
+ irem_m37b_audio_device(config, PANTHER_AUDIO, tag, owner, clock)
{
- if (m_sndpia.found())
- m_sndpia->cb1_w(0); // guess
- else
- m_audiocpu->set_input_line(m6502_device::IRQ_LINE, ASSERT_LINE);
+}
+
+
+irem_m37b_ue17b_audio_device::irem_m37b_ue17b_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock) :
+ irem_m37b_audio_device(config, IREM_M37B_UE17B_AUDIO, tag, owner, clock),
+ m_voicecpu(*this, "voice"),
+ m_soundlatch2(*this, "soundlatch2")
+{
+}
+
+
+demoneye_audio_device::demoneye_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(config, DEMONEYE_AUDIO, tag, owner, clock),
+ m_audiocpu(*this, "audiocpu"),
+ m_ay(*this, "ay%u", 1U),
+ m_sndpia(*this, "sndpia"),
+ m_soundlatch(*this, "soundlatch")
+{
+}
+
+
+TIMER_CALLBACK_MEMBER(irem_m37b_audio_device::audio_irq_on)
+{
+ m_audiocpu->set_input_line(m6502_device::IRQ_LINE, ASSERT_LINE);
m_audio_irq_off_timer->adjust(REDALERT_AUDIO_CPU_IRQ_TIME);
}
+TIMER_CALLBACK_MEMBER(irem_m37b_audio_device::audio_irq_off)
+{
+ m_audiocpu->set_input_line(m6502_device::IRQ_LINE, CLEAR_LINE);
+}
+
-TIMER_CALLBACK_MEMBER(redalert_state::audio_irq_off)
+TIMER_CALLBACK_MEMBER(demoneye_audio_device::audio_irq_on)
{
- if (m_sndpia.found())
- m_sndpia->cb1_w(1); // guess
- else
- m_audiocpu->set_input_line(m6502_device::IRQ_LINE, CLEAR_LINE);
+ m_sndpia->cb1_w(0); // guess
+
+ m_audio_irq_off_timer->adjust(REDALERT_AUDIO_CPU_IRQ_TIME);
+}
+
+TIMER_CALLBACK_MEMBER(demoneye_audio_device::audio_irq_off)
+{
+ m_sndpia->cb1_w(1); // guess
}
@@ -60,7 +112,7 @@ TIMER_CALLBACK_MEMBER(redalert_state::audio_irq_off)
*
*************************************/
-void redalert_state::redalert_analog_w(uint8_t data)
+void irem_m37b_audio_device::analog_w(uint8_t data)
{
/* this port triggers analog sounds
D0 = Formation Aircraft?
@@ -82,7 +134,14 @@ void redalert_state::redalert_analog_w(uint8_t data)
*
*************************************/
-void redalert_state::redalert_audio_command_w(uint8_t data)
+CUSTOM_INPUT_MEMBER(irem_m37b_audio_device::sound_status_r)
+{
+ // communication handshake between host and sound CPU
+ // at least Panther uses it, unconfirmed for Red Alert and Demoneye-X
+ return m_sound_hs;
+}
+
+void irem_m37b_audio_device::audio_command_w(uint8_t data)
{
/* the byte is connected to port A of the AY8910 */
m_soundlatch->write(data);
@@ -95,7 +154,7 @@ void redalert_state::redalert_audio_command_w(uint8_t data)
}
-void redalert_state::redalert_AY8910_w(uint8_t data)
+void irem_m37b_audio_device::ay8910_w(uint8_t data)
{
/* BC2 is connected to a pull-up resistor, so BC2=1 always */
switch (data & 0x03)
@@ -121,34 +180,35 @@ void redalert_state::redalert_AY8910_w(uint8_t data)
}
-uint8_t redalert_state::redalert_ay8910_latch_1_r()
+uint8_t irem_m37b_audio_device::ay8910_latch_1_r()
{
return m_ay8910_latch_1;
}
-void redalert_state::redalert_ay8910_latch_2_w(uint8_t data)
+void irem_m37b_audio_device::ay8910_latch_2_w(uint8_t data)
{
m_ay8910_latch_2 = data;
}
-void redalert_state::redalert_audio_map(address_map &map)
+void irem_m37b_audio_device::redalert_audio_map(address_map &map)
{
map.global_mask(0x7fff);
map(0x0000, 0x03ff).mirror(0x0c00).ram();
- map(0x1000, 0x1000).mirror(0x0ffe).nopr().w(FUNC(redalert_state::redalert_AY8910_w));
- map(0x1001, 0x1001).mirror(0x0ffe).rw(FUNC(redalert_state::redalert_ay8910_latch_1_r), FUNC(redalert_state::redalert_ay8910_latch_2_w));
+ map(0x1000, 0x1000).mirror(0x0ffe).nopr().w(FUNC(irem_m37b_audio_device::ay8910_w));
+ map(0x1001, 0x1001).mirror(0x0ffe).rw(FUNC(irem_m37b_audio_device::ay8910_latch_1_r), FUNC(irem_m37b_audio_device::ay8910_latch_2_w));
map(0x2000, 0x6fff).noprw();
map(0x7000, 0x77ff).mirror(0x0800).rom();
}
-void redalert_state::panther_audio_map(address_map &map)
+void panther_audio_device::panther_audio_map(address_map &map)
{
redalert_audio_map(map);
+
// Panther maps these two to $2000 while Red Alert to $1000, different PAL addressing?
map(0x1000, 0x1fff).unmaprw();
- map(0x2000, 0x2000).mirror(0x0ffe).nopr().w(FUNC(redalert_state::redalert_AY8910_w));
- map(0x2001, 0x2001).mirror(0x0ffe).rw(FUNC(redalert_state::redalert_ay8910_latch_1_r), FUNC(redalert_state::redalert_ay8910_latch_2_w));
+ map(0x2000, 0x2000).mirror(0x0ffe).nopr().w(FUNC(panther_audio_device::ay8910_w));
+ map(0x2001, 0x2001).mirror(0x0ffe).rw(FUNC(panther_audio_device::ay8910_latch_1_r), FUNC(panther_audio_device::ay8910_latch_2_w));
}
/*************************************
@@ -157,10 +217,10 @@ void redalert_state::panther_audio_map(address_map &map)
*
*************************************/
-void redalert_state::sound_start()
+void irem_m37b_audio_device::device_start()
{
- m_audio_irq_on_timer = timer_alloc(*this, FUNC(redalert_state::audio_irq_on));
- m_audio_irq_off_timer = timer_alloc(*this, FUNC(redalert_state::audio_irq_off));
+ m_audio_irq_on_timer = timer_alloc(*this, FUNC(irem_m37b_audio_device::audio_irq_on));
+ m_audio_irq_off_timer = timer_alloc(*this, FUNC(irem_m37b_audio_device::audio_irq_off));
m_audio_irq_on_timer->adjust(REDALERT_AUDIO_CPU_IRQ_FREQ, 0, REDALERT_AUDIO_CPU_IRQ_FREQ);
@@ -176,26 +236,14 @@ void redalert_state::sound_start()
*
*************************************/
-void redalert_state::redalert_voice_command_w(uint8_t data)
+void irem_m37b_ue17b_audio_device::voice_command_w(uint8_t data)
{
m_soundlatch2->write((data & 0x78) >> 3);
m_voicecpu->set_input_line(I8085_RST75_LINE, (~data & 0x80) ? ASSERT_LINE : CLEAR_LINE);
}
-WRITE_LINE_MEMBER(redalert_state::sod_callback)
-{
- m_cvsd->digit_w(state);
-}
-
-
-READ_LINE_MEMBER(redalert_state::sid_callback)
-{
- return m_cvsd->clock_state_r();
-}
-
-
-void redalert_state::redalert_voice_map(address_map &map)
+void irem_m37b_ue17b_audio_device::redalert_voice_map(address_map &map)
{
map(0x0000, 0x3fff).rom();
map(0x4000, 0x7fff).noprw();
@@ -211,37 +259,42 @@ void redalert_state::redalert_voice_map(address_map &map)
*
*************************************/
-void redalert_state::redalert_audio_m37b(machine_config &config)
+void irem_m37b_audio_device::device_add_mconfig(machine_config &config)
{
M6502(config, m_audiocpu, REDALERT_AUDIO_CPU_CLOCK);
- m_audiocpu->set_addrmap(AS_PROGRAM, &redalert_state::redalert_audio_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &irem_m37b_audio_device::redalert_audio_map);
GENERIC_LATCH_8(config, m_soundlatch);
+ SPEAKER(config, "mono").front_center();
+
AY8910(config, m_ay8910, REDALERT_AY8910_CLOCK);
m_ay8910->port_a_read_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read));
- m_ay8910->port_b_write_callback().set(FUNC(redalert_state::redalert_analog_w));
+ m_ay8910->port_b_write_callback().set(FUNC(irem_m37b_audio_device::analog_w));
m_ay8910->add_route(0, "mono", 0.50);
m_ay8910->add_route(1, "mono", 0.50);
/* channel C is used a noise source and is not connected to a speaker */
}
+
/*************************************
*
* Red Alert voice board (ue17b)
*
*************************************/
-void redalert_state::redalert_audio_voice(machine_config &config)
+void irem_m37b_ue17b_audio_device::device_add_mconfig(machine_config &config)
{
+ irem_m37b_audio_device::device_add_mconfig(config);
+
I8085A(config, m_voicecpu, REDALERT_VOICE_CPU_CLOCK);
- m_voicecpu->set_addrmap(AS_PROGRAM, &redalert_state::redalert_voice_map);
- m_voicecpu->in_sid_func().set(FUNC(redalert_state::sid_callback));
- m_voicecpu->out_sod_func().set(FUNC(redalert_state::sod_callback));
+ m_voicecpu->set_addrmap(AS_PROGRAM, &irem_m37b_ue17b_audio_device::redalert_voice_map);
+ m_voicecpu->in_sid_func().set("cvsd", FUNC(hc55516_device::clock_state_r));
+ m_voicecpu->out_sod_func().set("cvsd", FUNC(hc55516_device::digit_w));
GENERIC_LATCH_8(config, m_soundlatch2);
- HC55516(config, m_cvsd, REDALERT_HC55516_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.50);
+ HC55516(config, "cvsd", REDALERT_HC55516_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.50);
}
/*************************************
@@ -250,43 +303,32 @@ void redalert_state::redalert_audio_voice(machine_config &config)
*
*************************************/
-void redalert_state::redalert_audio(machine_config &config)
+void panther_audio_device::device_add_mconfig(machine_config &config)
{
- SPEAKER(config, "mono").front_center();
+ irem_m37b_audio_device::device_add_mconfig(config);
- redalert_audio_m37b(config);
- redalert_audio_voice(config);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &panther_audio_device::panther_audio_map);
}
/*************************************
*
- * Red Alert
+ * Demoneye-X audio board
*
*************************************/
-void redalert_state::ww3_audio(machine_config &config)
+void demoneye_audio_device::device_start()
{
- SPEAKER(config, "mono").front_center();
-
- redalert_audio_m37b(config);
-}
+ m_audio_irq_on_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(demoneye_audio_device::audio_irq_on), this));
+ m_audio_irq_off_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(demoneye_audio_device::audio_irq_off), this));
-void redalert_state::panther_audio(machine_config &config)
-{
- SPEAKER(config, "mono").front_center();
+ m_audio_irq_on_timer->adjust(REDALERT_AUDIO_CPU_IRQ_FREQ, 0, REDALERT_AUDIO_CPU_IRQ_FREQ);
- redalert_audio_m37b(config);
- m_audiocpu->set_addrmap(AS_PROGRAM, &redalert_state::panther_audio_map);
+ save_item(NAME(m_ay8910_latch_1));
+ save_item(NAME(m_ay8910_latch_2));
}
-/*************************************
- *
- * Demoneye-X audio board
- *
- *************************************/
-
-void redalert_state::demoneye_audio_command_w(uint8_t data)
+void demoneye_audio_device::audio_command_w(uint8_t data)
{
/* the byte is connected to port A of the AY8910 */
m_soundlatch->write(data);
@@ -294,57 +336,51 @@ void redalert_state::demoneye_audio_command_w(uint8_t data)
}
-void redalert_state::demoneye_ay8910_latch_1_w(uint8_t data)
+void demoneye_audio_device::ay8910_latch_1_w(uint8_t data)
{
m_ay8910_latch_1 = data;
}
-uint8_t redalert_state::demoneye_ay8910_latch_2_r()
+uint8_t demoneye_audio_device::ay8910_latch_2_r()
{
return m_ay8910_latch_2;
}
-void redalert_state::demoneye_ay8910_data_w(uint8_t data)
+void demoneye_audio_device::ay8910_data_w(uint8_t data)
{
switch (m_ay8910_latch_1 & 0x03)
{
case 0x00:
if (m_ay8910_latch_1 & 0x10)
m_ay[0]->data_w(data);
-
if (m_ay8910_latch_1 & 0x20)
m_ay[1]->data_w(data);
-
break;
case 0x01:
if (m_ay8910_latch_1 & 0x10)
m_ay8910_latch_2 = m_ay[0]->data_r();
-
if (m_ay8910_latch_1 & 0x20)
m_ay8910_latch_2 = m_ay[1]->data_r();
-
break;
case 0x03:
if (m_ay8910_latch_1 & 0x10)
m_ay[0]->address_w(data);
-
if (m_ay8910_latch_1 & 0x20)
m_ay[1]->address_w(data);
-
break;
default:
- logerror("demoneye_ay8910_data_w called with latch %02X data %02X\n", m_ay8910_latch_1, data);
+ logerror("demoneye_audio_device::ay8910_data_w called with latch %02X data %02X\n", m_ay8910_latch_1, data);
break;
}
}
-void redalert_state::demoneye_audio_map(address_map &map)
+void demoneye_audio_device::demoneye_audio_map(address_map &map)
{
map(0x0500, 0x0503).mirror(0xc000).rw(m_sndpia, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
map(0x2000, 0x3fff).mirror(0xc000).rom();
@@ -358,15 +394,15 @@ void redalert_state::demoneye_audio_map(address_map &map)
*
*************************************/
-void redalert_state::demoneye_audio(machine_config &config)
+void demoneye_audio_device::device_add_mconfig(machine_config &config)
{
M6802(config, m_audiocpu, DEMONEYE_AUDIO_CPU_CLOCK);
- m_audiocpu->set_addrmap(AS_PROGRAM, &redalert_state::demoneye_audio_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &demoneye_audio_device::demoneye_audio_map);
PIA6821(config, m_sndpia);
- m_sndpia->readpa_handler().set(FUNC(redalert_state::demoneye_ay8910_latch_2_r));
- m_sndpia->writepa_handler().set(FUNC(redalert_state::demoneye_ay8910_data_w));
- m_sndpia->writepb_handler().set(FUNC(redalert_state::demoneye_ay8910_latch_1_w));
+ m_sndpia->readpa_handler().set(FUNC(demoneye_audio_device::ay8910_latch_2_r));
+ m_sndpia->writepa_handler().set(FUNC(demoneye_audio_device::ay8910_data_w));
+ m_sndpia->writepb_handler().set(FUNC(demoneye_audio_device::ay8910_latch_1_w));
m_sndpia->irqb_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE);
SPEAKER(config, "mono").front_center();
diff --git a/src/mame/audio/redalert.h b/src/mame/audio/redalert.h
new file mode 100644
index 00000000000..2a621872502
--- /dev/null
+++ b/src/mame/audio/redalert.h
@@ -0,0 +1,127 @@
+// license:BSD-3-Clause
+// copyright-holders:Mike Balfour
+#ifndef MAME_AUDIO_REDALERT_H
+#define MAME_AUDIO_REDALERT_H
+
+#pragma once
+
+#include "cpu/i8085/i8085.h"
+#include "machine/6821pia.h"
+#include "machine/gen_latch.h"
+#include "sound/ay8910.h"
+
+
+DECLARE_DEVICE_TYPE(IREM_M37B_AUDIO, irem_m37b_audio_device)
+DECLARE_DEVICE_TYPE(PANTHER_AUDIO, panther_audio_device)
+DECLARE_DEVICE_TYPE(IREM_M37B_UE17B_AUDIO, irem_m37b_ue17b_audio_device)
+DECLARE_DEVICE_TYPE(DEMONEYE_AUDIO, demoneye_audio_device)
+
+
+class irem_m37b_audio_device : public device_t
+{
+public:
+ static constexpr feature_type imperfect_features() { return feature::SOUND; } // missing analog effects
+
+ irem_m37b_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock = 0U);
+
+ DECLARE_CUSTOM_INPUT_MEMBER(sound_status_r);
+
+ void audio_command_w(uint8_t data);
+
+protected:
+ irem_m37b_audio_device(const machine_config &config, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+
+ void analog_w(uint8_t data);
+ void ay8910_w(uint8_t data);
+ uint8_t ay8910_latch_1_r();
+ void ay8910_latch_2_w(uint8_t data);
+
+ void redalert_audio_map(address_map &map);
+
+ required_device<cpu_device> m_audiocpu;
+ required_device<ay8910_device> m_ay8910;
+ required_device<generic_latch_8_device> m_soundlatch;
+
+private:
+ TIMER_CALLBACK_MEMBER(audio_irq_on);
+ TIMER_CALLBACK_MEMBER(audio_irq_off);
+
+ emu_timer *m_audio_irq_on_timer;
+ emu_timer *m_audio_irq_off_timer;
+
+ uint8_t m_sound_hs;
+ uint8_t m_ay8910_latch_1;
+ uint8_t m_ay8910_latch_2;
+};
+
+
+class panther_audio_device : public irem_m37b_audio_device
+{
+public:
+ panther_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock = 0U);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+
+private:
+ void panther_audio_map(address_map &map);
+};
+
+
+class irem_m37b_ue17b_audio_device : public irem_m37b_audio_device
+{
+public:
+ irem_m37b_ue17b_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock = 0U);
+
+ void voice_command_w(uint8_t data);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+
+private:
+ void redalert_voice_map(address_map &map);
+
+ required_device<i8085a_cpu_device> m_voicecpu;
+ required_device<generic_latch_8_device> m_soundlatch2;
+};
+
+
+class demoneye_audio_device : public device_t
+{
+public:
+ static constexpr feature_type imperfect_features() { return feature::SOUND; }
+
+ demoneye_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock = 0U);
+
+ void audio_command_w(uint8_t data);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+
+private:
+ TIMER_CALLBACK_MEMBER(audio_irq_on);
+ TIMER_CALLBACK_MEMBER(audio_irq_off);
+
+ void ay8910_latch_1_w(uint8_t data);
+ uint8_t ay8910_latch_2_r();
+ void ay8910_data_w(uint8_t data);
+
+ void demoneye_audio_map(address_map &map);
+
+ required_device<cpu_device> m_audiocpu;
+ required_device_array<ay8910_device, 2> m_ay;
+ required_device<pia6821_device> m_sndpia;
+ required_device<generic_latch_8_device> m_soundlatch;
+
+ emu_timer *m_audio_irq_on_timer;
+ emu_timer *m_audio_irq_off_timer;
+
+ uint8_t m_ay8910_latch_1;
+ uint8_t m_ay8910_latch_2;
+};
+
+#endif // MAME_AUDIO_REDALERT_H
diff --git a/src/mame/audio/wiping.cpp b/src/mame/audio/wiping.cpp
index 1a9d487410e..e16ea5c95e8 100644
--- a/src/mame/audio/wiping.cpp
+++ b/src/mame/audio/wiping.cpp
@@ -4,13 +4,13 @@
Wiping sound driver
- Nichibutsu / Woodplace Inc. custom part?
-
+ Nichibutsu / Woodplace Inc. custom part?
+
used by wiping.cpp and clshroad.cpp
- TODO:
- - Identify actual part, sound device was originally based off
- Namco customs (on which involvement seems pretty thin here);
+ TODO:
+ - Identify actual part, sound device was originally based off
+ Namco customs (on which involvement seems pretty thin here);
***************************************************************************/
diff --git a/src/mame/drivers/20pacgal.cpp b/src/mame/drivers/20pacgal.cpp
index 7f9806dcc6b..94ab22a608a 100644
--- a/src/mame/drivers/20pacgal.cpp
+++ b/src/mame/drivers/20pacgal.cpp
@@ -89,7 +89,6 @@ Graphics: CY37256P160-83AC x 2 (Ultra37000 CPLD family - 160 pin TQFP, 256 Macro
#include "cpu/z180/z180.h"
#include "machine/eepromser.h"
#include "machine/watchdog.h"
-#include "sound/dac.h"
#include "speaker.h"
@@ -376,6 +375,9 @@ void _20pacgal_state::machine_start()
m_game_selected = 0;
+ // center the DAC; not all revisions do this
+ m_dac->data_w(0x80);
+
// membank currently used only by 20pacgal
m_mainbank->configure_entry(0, memregion("maincpu")->base() + 0x08000);
m_mainbank->configure_entry(1, m_ram_48000.get());
diff --git a/src/mame/drivers/4enraya.cpp b/src/mame/drivers/4enraya.cpp
index 100d31075e7..5f60d262506 100644
--- a/src/mame/drivers/4enraya.cpp
+++ b/src/mame/drivers/4enraya.cpp
@@ -274,6 +274,14 @@ void unk_gambl_state::unkpacg_main_map(address_map &map)
map(0x8000, 0x9fff).rom();
}
+void unk_gambl_state::unkpacga_main_map(address_map &map)
+{
+ map(0x0000, 0x1fff).rom().region("maincpu", 0x6000);
+ map(0x6000, 0x67ff).ram().share("nvram");
+ map(0x7000, 0x7fff).w(FUNC(_4enraya_state::fenraya_videoram_w));
+ map(0x8000, 0xffff).rom().region("maincpu", 0x8000);
+}
+
void unk_gambl_state::unkpacg_main_portmap(address_map &map)
{
map.global_mask(0xff);
@@ -512,6 +520,13 @@ void unk_gambl_state::unkpacg(machine_config &config)
m_ay->add_route(ALL_OUTPUTS, "mono", 1.0);
}
+void unk_gambl_state::unkpacga(machine_config &config)
+{
+ unkpacg(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_addrmap(AS_PROGRAM, &unk_gambl_state::unkpacga_main_map);
+}
/***********************************
* Rom Load *
@@ -551,8 +566,8 @@ ROM_END
*/
ROM_START(unkpacg)
ROM_REGION(0x10000, "maincpu", 0)
- ROM_LOAD("1.u14", 0x0000, 0x2000, CRC(848c4143) SHA1(3cff26181c58e5f52f1ac81df7d5d43e644585a2))
- ROM_LOAD("2.u46", 0x8000, 0x2000, CRC(9e6e0bd3) SHA1(f502132a0460108dad243632cc13d9116c534291))
+ ROM_LOAD( "1.u14", 0x0000, 0x2000, CRC(848c4143) SHA1(3cff26181c58e5f52f1ac81df7d5d43e644585a2) )
+ ROM_LOAD( "2.u46", 0x8000, 0x2000, CRC(9e6e0bd3) SHA1(f502132a0460108dad243632cc13d9116c534291) )
ROM_REGION( 0x6000, "gfx1", 0 )
ROM_LOAD( "3.u20", 0x2000, 0x2000, CRC(d00b04ea) SHA1(e65901d8586507257d74ab103001207e28fa28af) )
@@ -560,6 +575,40 @@ ROM_START(unkpacg)
ROM_LOAD( "5.u18", 0x0000, 0x2000, CRC(44f272d2) SHA1(b39cbc1f290d9fb2453396906e4da4a682c41ef4) )
ROM_END
+ROM_START(unkpacga)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD( "p1.bin", 0x0000, 0x8000, CRC(386bd2da) SHA1(fa786c25dd5ec1a26ebe021ca701dccebfcbb64f) ) // first 0x5fff are 0xff filled
+ ROM_LOAD( "p2.bin", 0x8000, 0x8000, CRC(7878d7f3) SHA1(cacdd4b8e33a93e2913d0f5d740195ef0f439031) )
+
+ ROM_REGION( 0x6000, "gfx1", 0 )
+ ROM_LOAD( "r.bin", 0x0000, 0x2000, CRC(b0d7b67a) SHA1(87bd150ed46d1346a363dc45c226e72967426f2a) ) // 1ST AND 2ND HALF IDENTICAL
+ ROM_CONTINUE( 0x0000, 0x2000)
+ ROM_IGNORE(0x4000)
+ ROM_LOAD( "b.bin", 0x2000, 0x2000, CRC(5b26dce5) SHA1(d00434ab352169eca3c458917d5d1a04d0d2c2df) ) // 1ST AND 2ND HALF IDENTICAL
+ ROM_CONTINUE( 0x2000, 0x2000)
+ ROM_IGNORE(0x4000)
+ ROM_LOAD( "g.bin", 0x4000, 0x2000, CRC(e12d34e0) SHA1(96790eec9032ca6f513cf0f6a1962d91a21ce2ae) ) // 1ST AND 2ND HALF IDENTICAL
+ ROM_CONTINUE( 0x4000, 0x2000)
+ ROM_IGNORE(0x4000)
+ROM_END
+
+ROM_START(unkpacgb)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD( "p1.bin", 0x0000, 0x8000, CRC(5cc6b5e1) SHA1(80325eef389f7d6a8c78531fdc6e5b73721eb0b1) )
+ ROM_LOAD( "p2.bin", 0x8000, 0x8000, CRC(06b42740) SHA1(0639ec2e31bd81e85a45689929bb67a61599497c) )
+
+ ROM_REGION( 0x6000, "gfx1", 0 )
+ ROM_LOAD( "r.bin", 0x0000, 0x2000, CRC(b0d7b67a) SHA1(87bd150ed46d1346a363dc45c226e72967426f2a) ) // 1ST AND 2ND HALF IDENTICAL
+ ROM_CONTINUE( 0x0000, 0x2000)
+ ROM_IGNORE(0x4000)
+ ROM_LOAD( "b.bin", 0x2000, 0x2000, CRC(5b26dce5) SHA1(d00434ab352169eca3c458917d5d1a04d0d2c2df) ) // 1ST AND 2ND HALF IDENTICAL
+ ROM_CONTINUE( 0x2000, 0x2000)
+ ROM_IGNORE(0x4000)
+ ROM_LOAD( "g.bin", 0x4000, 0x2000, CRC(e12d34e0) SHA1(96790eec9032ca6f513cf0f6a1962d91a21ce2ae) ) // 1ST AND 2ND HALF IDENTICAL
+ ROM_CONTINUE( 0x4000, 0x2000)
+ ROM_IGNORE(0x4000)
+ROM_END
+
/*
Unknown 'Space Invaders' gambling game.
All roms are 0x8000 but only the last 0x2000 of each is used.
@@ -640,7 +689,7 @@ void unk_gambl_state::driver_init()
// descramble rom
uint8_t *rom = memregion("maincpu")->base();
- for (int i = 0x8000; i < 0xa000; i++)
+ for (int i = 0x8000; i < 0x10000; i++)
rom[i] = bitswap<8>(rom[i], 7,6,5,4,3,2,0,1);
}
@@ -649,9 +698,11 @@ void unk_gambl_state::driver_init()
* Game Drivers *
***********************************/
-/* YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS */
+/* YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS */
GAME( 1990, 4enraya, 0, _4enraya, 4enraya, _4enraya_state, empty_init, ROT0, "IDSA", "4 En Raya (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, 4enrayaa, 4enraya, _4enraya, 4enraya, _4enraya_state, empty_init, ROT0, "IDSA", "4 En Raya (set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 199?, unkpacg, 0, unkpacg, unkpacg, unk_gambl_state, empty_init, ROT0, "<unknown>", "unknown 'Pac-Man' gambling game", MACHINE_SUPPORTS_SAVE )
+GAME( 199?, unkpacg, 0, unkpacg, unkpacg, unk_gambl_state, empty_init, ROT0, "<unknown>", "unknown 'Pac-Man' gambling game (set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 199?, unkpacgb, unkpacg, unkpacg, unkpacg, unk_gambl_state, empty_init, ROT0, "<unknown>", "unknown 'Pac-Man' gambling game (set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 199?, unkpacga, unkpacg, unkpacga, unkpacg, unk_gambl_state, empty_init, ROT0, "IDI SRL", "Pucman", MACHINE_SUPPORTS_SAVE )
GAME( 199?, unksig, 0, unkpacg, unkfr, unk_gambl_state, empty_init, ROT0, "<unknown>", "unknown 'Space Invaders' gambling game (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 199?, unksiga, unksig, unkpacg, unkfr, unk_gambl_state, empty_init, ROT0, "<unknown>", "unknown 'Space Invaders' gambling game (set 2)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/agat.cpp b/src/mame/drivers/agat.cpp
index 6a899e085bd..4f7b20828b4 100644
--- a/src/mame/drivers/agat.cpp
+++ b/src/mame/drivers/agat.cpp
@@ -585,10 +585,24 @@ uint8_t agat_base_state::controller_strobe_r()
void agat_base_state::controller_strobe_w(uint8_t data)
{
- m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_joy1x->read();
- m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_joy1y->read();
- m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_joy2x->read();
- m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_joy2y->read();
+ // 555 monostable one-shot timers; a running timer cannot be restarted
+ if (machine().time().as_double() >= m_joystick_x1_time)
+ {
+ m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_joy1x->read();
+ }
+ if (machine().time().as_double() >= m_joystick_y1_time)
+ {
+ m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_joy1y->read();
+ }
+ if (machine().time().as_double() >= m_joystick_x2_time)
+ {
+ m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_joy2x->read();
+ }
+ if (machine().time().as_double() >= m_joystick_y2_time)
+ {
+ m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_joy2y->read();
+ }
+
}
uint8_t agat_base_state::c080_r(offs_t offset)
diff --git a/src/mame/drivers/aim65.cpp b/src/mame/drivers/aim65.cpp
index 15deaf09925..1342d3c36a1 100644
--- a/src/mame/drivers/aim65.cpp
+++ b/src/mame/drivers/aim65.cpp
@@ -184,7 +184,7 @@ image_init_result aim65_state::load_cart(device_image_interface &image, generic_
if (size > 0x1000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported ROM size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported ROM size");
return image_init_result::FAIL;
}
@@ -193,7 +193,7 @@ image_init_result aim65_state::load_cart(device_image_interface &image, generic_
std::string errmsg = string_format(
"Attempted to load file with wrong extension\nSocket '%s' only accepts files with '.%s' extension",
slot_tag, slot_tag);
- image.seterror(IMAGE_ERROR_UNSPECIFIED, errmsg.c_str());
+ image.seterror(image_error::INVALIDIMAGE, errmsg.c_str());
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/airraid.cpp b/src/mame/drivers/airraid.cpp
index b262aca908d..2564f7618e5 100644
--- a/src/mame/drivers/airraid.cpp
+++ b/src/mame/drivers/airraid.cpp
@@ -59,8 +59,8 @@ Stephh's notes (based on the game Z80 code and some tests) :
- Inputs notes :
- * COINx don't work correctly : see "cshooter_coin_r" read handler.
- * In game, bits 3 and 4 of 0xc202 ("START") are tested,
+ * COINx don't work correctly.
+ * In game, bits 3 and 4 of 0xc202 ("START") are tested,
while bits 4 and 5 are tested in the "test mode".
* Pressing STARTx while in game adds lives (depending on the
"Lives" Dip Switch) for player x.
@@ -172,54 +172,54 @@ public:
, m_palette(*this, "palette")
, m_decrypted_opcodes(*this, "decrypted_opcodes")
, m_airraid_video(*this,"airraid_vid")
+ , m_mainbank(*this, "mainbank")
{ }
void airraid(machine_config &config);
- void airraid_crypt(machine_config &config);
void init_cshootere();
void init_cshooter();
private:
required_device<cpu_device> m_maincpu;
- optional_device<seibu_sound_device> m_seibu_sound;
- optional_shared_ptr<uint8_t> m_mainram;
+ required_device<seibu_sound_device> m_seibu_sound;
+ required_shared_ptr<uint8_t> m_mainram;
required_device<palette_device> m_palette;
- optional_shared_ptr<uint8_t> m_decrypted_opcodes;
-
+ required_shared_ptr<uint8_t> m_decrypted_opcodes;
required_device<airraid_video_device> m_airraid_video;
+ required_memory_bank m_mainbank;
- void cshooter_c500_w(uint8_t data);
- void cshooter_c700_w(uint8_t data);
+ void c500_w(uint8_t data);
+ void c700_w(uint8_t data);
void bank_w(uint8_t data);
- TIMER_DEVICE_CALLBACK_MEMBER(cshooter_scanline);
+ TIMER_DEVICE_CALLBACK_MEMBER(scanline);
- void airraid_map(address_map &map);
- void airraid_sound_decrypted_opcodes_map(address_map &map);
- void airraid_sound_map(address_map &map);
+ void main_map(address_map &map);
+ void sound_decrypted_opcodes_map(address_map &map);
+ void sound_map(address_map &map);
void decrypted_opcodes_map(address_map &map);
};
-/* main cpu */
+// main CPU
-TIMER_DEVICE_CALLBACK_MEMBER(airraid_state::cshooter_scanline)
+TIMER_DEVICE_CALLBACK_MEMBER(airraid_state::scanline)
{
int scanline = param;
- if(scanline == 240) // updates scroll resgiters
- m_maincpu->set_input_line_and_vector(0, HOLD_LINE,0xd7); /* Z80 - RST 10h */
+ if (scanline == 240) // updates scroll registers
+ m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xd7); // Z80 - RST 10h
- if(scanline == 250) // vblank-out irq
- m_maincpu->set_input_line_and_vector(0, HOLD_LINE,0xcf); /* Z80 - RST 08h */
+ if (scanline == 250) // vblank-out irq
+ m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xcf); // Z80 - RST 08h
}
-void airraid_state::cshooter_c500_w(uint8_t data)
+void airraid_state::c500_w(uint8_t data)
{
}
-void airraid_state::cshooter_c700_w(uint8_t data)
+void airraid_state::c700_w(uint8_t data)
{
}
@@ -234,28 +234,27 @@ void airraid_state::bank_w(uint8_t data)
// f = fg layer disable
// s = sprite layer enable
- membank("bank1")->set_entry((data>>4)&3);
+ m_mainbank->set_entry((data >> 4) & 3);
m_airraid_video->layer_enable_w(data & 0xcf);
-
}
-void airraid_state::airraid_map(address_map &map)
+void airraid_state::main_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
- map(0x8000, 0xbfff).bankr("bank1").nopw(); // rld result write-back
+ map(0x8000, 0xbfff).bankr(m_mainbank).nopw(); // rld result write-back
map(0xc000, 0xc000).portr("IN0");
map(0xc001, 0xc001).portr("IN1");
map(0xc002, 0xc002).portr("IN2");
map(0xc003, 0xc003).portr("DSW2");
map(0xc004, 0xc004).portr("DSW1");
- map(0xc500, 0xc500).w(FUNC(airraid_state::cshooter_c500_w));
-// map(0xc600, 0xc600).w(FUNC(airraid_state::cshooter_c600_w)); // see notes
- map(0xc700, 0xc700).w(FUNC(airraid_state::cshooter_c700_w));
-// map(0xc801, 0xc801).w(FUNC(airraid_state::cshooter_c801_w)); // see notes
+ map(0xc500, 0xc500).w(FUNC(airraid_state::c500_w));
+// map(0xc600, 0xc600).w(FUNC(airraid_state::c600_w)); // see notes
+ map(0xc700, 0xc700).w(FUNC(airraid_state::c700_w));
+// map(0xc801, 0xc801).w(FUNC(airraid_state::c801_w)); // see notes
map(0xd000, 0xd7ff).ram().w(m_airraid_video, FUNC(airraid_video_device::txram_w)).share("txram");
map(0xd800, 0xd8ff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0xda00, 0xdaff).ram().w(m_palette, FUNC(palette_device::write8_ext)).share("palette_ext");
@@ -266,16 +265,16 @@ void airraid_state::airraid_map(address_map &map)
// map(0xdc1e, 0xdc1e).ram();
// map(0xdc1f, 0xdc1f).ram();
map(0xde00, 0xde0f).rw(m_seibu_sound, FUNC(seibu_sound_device::main_r), FUNC(seibu_sound_device::main_w));
- map(0xe000, 0xfdff).ram().share("mainram");
+ map(0xe000, 0xfdff).ram().share(m_mainram);
map(0xfe00, 0xffff).ram().share("sprite_ram");
}
void airraid_state::decrypted_opcodes_map(address_map &map)
{
- map(0x0000, 0x7fff).rom().share("decrypted_opcodes");
+ map(0x0000, 0x7fff).rom().share(m_decrypted_opcodes);
}
-void airraid_state::airraid_sound_map(address_map &map)
+void airraid_state::sound_map(address_map &map)
{
map(0x0000, 0x1fff).r("sei80bu", FUNC(sei80bu_device::data_r));
map(0x2000, 0x27ff).ram();
@@ -293,7 +292,7 @@ void airraid_state::airraid_sound_map(address_map &map)
map(0x8000, 0xffff).rom();
}
-void airraid_state::airraid_sound_decrypted_opcodes_map(address_map &map)
+void airraid_state::sound_decrypted_opcodes_map(address_map &map)
{
map(0x0000, 0x1fff).r("sei80bu", FUNC(sei80bu_device::opcode_r));
map(0x8000, 0xffff).rom().region("audiocpu", 0x8000);
@@ -301,7 +300,7 @@ void airraid_state::airraid_sound_decrypted_opcodes_map(address_map &map)
static INPUT_PORTS_START( airraid )
- PORT_START("IN0") /* IN0 (0xc200) */
+ PORT_START("IN0") // IN0 (0xc200)
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
@@ -311,7 +310,7 @@ static INPUT_PORTS_START( airraid )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_START("IN1") /* IN1 (0xc201) */
+ PORT_START("IN1") // IN1 (0xc201)
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
@@ -321,7 +320,7 @@ static INPUT_PORTS_START( airraid )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_START("IN2") /* START (0xc202) */
+ PORT_START("IN2") // START (0xc202)
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -331,7 +330,7 @@ static INPUT_PORTS_START( airraid )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_START("DSW2") /* DSW2 (0xc203) */
+ PORT_START("DSW2") // DSW2 (0xc203)
PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2")
PORT_DIPSETTING( 0x03, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x02, DEF_STR( Medium ) )
@@ -350,7 +349,7 @@ static INPUT_PORTS_START( airraid )
PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW2:7" )
PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW2:8" )
- PORT_START("DSW1") /* DSW1 (0xc204) */
+ PORT_START("DSW1") // DSW1 (0xc204)
PORT_DIPNAME( 0x01, 0x01, "Coin Slots" ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x01, "1" )
PORT_DIPSETTING( 0x00, "2" )
@@ -370,7 +369,7 @@ static INPUT_PORTS_START( airraid )
PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW1:7" )
PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW1:8" )
- PORT_START("COIN") /* COIN (0xc205) */
+ PORT_START("COIN") // COIN (0xc205)
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -385,14 +384,15 @@ INPUT_PORTS_END
void airraid_state::airraid(machine_config &config)
{
- /* basic machine hardware */
- Z80(config, m_maincpu, XTAL(12'000'000)/2); /* verified on pcb */
- m_maincpu->set_addrmap(AS_PROGRAM, &airraid_state::airraid_map);
- TIMER(config, "scantimer").configure_scanline(FUNC(airraid_state::cshooter_scanline), "airraid_vid:screen", 0, 1);
-
- z80_device &audiocpu(Z80(config, "audiocpu", XTAL(14'318'181)/4)); /* verified on pcb */
- audiocpu.set_addrmap(AS_PROGRAM, &airraid_state::airraid_sound_map);
- audiocpu.set_addrmap(AS_OPCODES, &airraid_state::airraid_sound_decrypted_opcodes_map);
+ // basic machine hardware
+ Z80(config, m_maincpu, XTAL(12'000'000) / 2); // verified on PCB
+ m_maincpu->set_addrmap(AS_PROGRAM, &airraid_state::main_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &airraid_state::decrypted_opcodes_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(airraid_state::scanline), "airraid_vid:screen", 0, 1);
+
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(14'318'181) / 4)); // verified on PCB
+ audiocpu.set_addrmap(AS_PROGRAM, &airraid_state::sound_map);
+ audiocpu.set_addrmap(AS_OPCODES, &airraid_state::sound_decrypted_opcodes_map);
audiocpu.set_irq_acknowledge_callback("seibu_sound", FUNC(seibu_sound_device::im0_vector_cb));
config.set_perfect_quantum(m_maincpu);
@@ -401,10 +401,10 @@ void airraid_state::airraid(machine_config &config)
AIRRAID_VIDEO(config, m_airraid_video, 0);
- /* sound hardware */
+ // sound hardware
SPEAKER(config, "mono").front_center();
- ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(14'318'181)/4));
+ ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(14'318'181) / 4));
ymsnd.irq_handler().set(m_seibu_sound, FUNC(seibu_sound_device::fm_irqhandler));
ymsnd.add_route(0, "mono", 0.50);
ymsnd.add_route(1, "mono", 0.50);
@@ -419,16 +419,6 @@ void airraid_state::airraid(machine_config &config)
}
-void airraid_state::airraid_crypt(machine_config &config)
-{
- airraid(config);
- m_maincpu->set_addrmap(AS_OPCODES, &airraid_state::decrypted_opcodes_map);
-}
-
-
-
-
-
/*
Air Raid (Seibu 1987)
@@ -462,7 +452,7 @@ ROM_START( airraid )
ROM_LOAD( "5.6f", 0x00000, 0x02000, CRC(30be398c) SHA1(6c61200ee8888d6270c8cec50423b3b5602c2027) )
ROM_LOAD( "4.7f", 0x08000, 0x08000, CRC(3cd715b4) SHA1(da735fb5d262908ddf7ed7dacdea68899f1723ff) )
- ROM_REGION( 0x0200, "proms", 0 ) // this PCB type has different proms when compared to the cshootert hardware PCB where they were dumped
+ ROM_REGION( 0x0200, "proms", 0 ) // this PCB type has different PROMs when compared to the cshootert hardware PCB where they were dumped
ROM_LOAD( "pr.c19", 0x0000, 0x0200, NO_DUMP )
ROM_LOAD( "6308.a13", 0x0000, 0x0100, NO_DUMP )
@@ -472,7 +462,7 @@ ROM_START( airraid )
ROM_REGION( 0x100, "airraid_vid:tx_clut", 0 ) // taken from cshootert, not verified for this PCB
ROM_LOAD( "63s281.d16", 0x0000, 0x0100, CRC(0b8b914b) SHA1(8cf4910b846de79661cc187887171ed8ebfd6719) ) // clut
- /* ### MODULE 1 ### Background generation / graphics */
+ // ### MODULE 1 ### Background generation / graphics
ROM_REGION( 0x40000, "airraid_vid:bg_map", 0 )
ROM_LOAD16_BYTE( "bg_layouts_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "bg_layouts_odd", 0x00001, 0x20000, NO_DUMP )
@@ -482,7 +472,7 @@ ROM_START( airraid )
ROM_REGION( 0x100, "airraid_vid:bg_clut", 0 )
ROM_LOAD( "bg_clut", 0x000, 0x100, NO_DUMP )
- /* ### MODULE 2 ### Foreground generation / graphics */
+ // ### MODULE 2 ### Foreground generation / graphics
ROM_REGION( 0x40000, "airraid_vid:fg_map", 0 )
ROM_LOAD16_BYTE( "fg_layouts_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "fg_layouts_odd", 0x00001, 0x20000, NO_DUMP )
@@ -492,7 +482,7 @@ ROM_START( airraid )
ROM_REGION( 0x100, "airraid_vid:fg_clut", 0 )
ROM_LOAD( "fg_clut", 0x000, 0x100, NO_DUMP )
- /* ### MODULE 3 ### Sprite graphics */
+ // ### MODULE 3 ### Sprite graphics
ROM_REGION( 0x40000, "airraid_vid:spr_gfx", 0 )
ROM_LOAD16_BYTE( "sprite_tiles_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "sprite_tiles_odd", 0x00001, 0x20000, NO_DUMP )
@@ -535,17 +525,17 @@ Note, all ROMs have official sticker, "(C) SEIBU KAIHATSU INC." and a number.
*/
ROM_START( cshooter )
- ROM_REGION( 0x10000, "maincpu", 0 ) // Main CPU
+ ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "1.k19", 0x00000, 0x08000, CRC(71418952) SHA1(9745ca006576381c9e9595d8e42ab276bab80a41) )
- ROM_REGION( 0x10000, "maindata", 0 ) // cpu data
+ ROM_REGION( 0x10000, "maindata", 0 ) // CPU data
ROM_LOAD( "2.k20", 0x00000, 0x10000, CRC(5812fe72) SHA1(3b28bff6b62a411d2195bb228952db62ad32ef3d) )
- ROM_REGION( 0x10000, "audiocpu", 0 ) // Sub/Sound CPU
+ ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "5.6f", 0x00000, 0x02000, CRC(30be398c) SHA1(6c61200ee8888d6270c8cec50423b3b5602c2027) ) // 5.g6
ROM_LOAD( "4.7f", 0x08000, 0x08000, CRC(3cd715b4) SHA1(da735fb5d262908ddf7ed7dacdea68899f1723ff) ) // 4.g8
- ROM_REGION( 0x0200, "proms", 0 ) // this PCB type has different proms when compared to the cshootert hardware PCB where they were dumped
+ ROM_REGION( 0x0200, "proms", 0 ) // this PCB type has different PROMs when compared to the cshootert hardware PCB where they were dumped
ROM_LOAD( "pr.c19", 0x0000, 0x0200, NO_DUMP )
ROM_LOAD( "6308.a13", 0x0000, 0x0100, NO_DUMP )
@@ -556,7 +546,7 @@ ROM_START( cshooter )
ROM_REGION( 0x100, "airraid_vid:tx_clut", 0 ) // taken from cshootert, not verified for this PCB
ROM_LOAD( "63s281.d16", 0x0000, 0x0100, CRC(0b8b914b) SHA1(8cf4910b846de79661cc187887171ed8ebfd6719) ) // clut
- /* ### MODULE 1 ### Background generation / graphics */
+ // ### MODULE 1 ### Background generation / graphics
ROM_REGION( 0x40000, "airraid_vid:bg_map", 0 )
ROM_LOAD16_BYTE( "bg_layouts_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "bg_layouts_odd", 0x00001, 0x20000, NO_DUMP )
@@ -566,7 +556,7 @@ ROM_START( cshooter )
ROM_REGION( 0x100, "airraid_vid:bg_clut", 0 )
ROM_LOAD( "bg_clut", 0x000, 0x100, NO_DUMP )
- /* ### MODULE 2 ### Foreground generation / graphics */
+ // ### MODULE 2 ### Foreground generation / graphics
ROM_REGION( 0x40000, "airraid_vid:fg_map", 0 )
ROM_LOAD16_BYTE( "fg_layouts_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "fg_layouts_odd", 0x00001, 0x20000, NO_DUMP )
@@ -576,7 +566,7 @@ ROM_START( cshooter )
ROM_REGION( 0x100, "airraid_vid:fg_clut", 0 )
ROM_LOAD( "fg_clut", 0x000, 0x100, NO_DUMP )
- /* ### MODULE 3 ### Sprite graphics */
+ // ### MODULE 3 ### Sprite graphics
ROM_REGION( 0x40000, "airraid_vid:spr_gfx", 0 )
ROM_LOAD16_BYTE( "sprite_tiles_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "sprite_tiles_odd", 0x00001, 0x20000, NO_DUMP )
@@ -588,46 +578,44 @@ ROM_END
void airraid_state::init_cshooter()
{
- membank("bank1")->configure_entries(0, 4, memregion("maindata")->base(), 0x4000);
+ m_mainbank->configure_entries(0, 4, memregion("maindata")->base(), 0x4000);
}
void airraid_state::init_cshootere()
{
uint8_t *rom = memregion("maincpu")->base();
- for (int A = 0x0000;A < 0x8000;A++)
+ for (int A = 0x0000; A < 0x8000; A++)
{
- /* decode the opcodes */
+ // decode the opcodes
m_decrypted_opcodes[A] = rom[A];
- if (BIT(A,5) && !BIT(A,3))
+ if (BIT(A, 5) && !BIT(A, 3))
m_decrypted_opcodes[A] ^= 0x40;
- if (BIT(A,10) && !BIT(A,9) && BIT(A,3))
+ if (BIT(A, 10) && !BIT(A, 9) && BIT(A, 3))
m_decrypted_opcodes[A] ^= 0x20;
- if ((BIT(A,10) ^ BIT(A,9)) && BIT(A,1))
+ if ((BIT(A, 10) ^ BIT(A, 9)) && BIT(A, 1))
m_decrypted_opcodes[A] ^= 0x02;
- if (BIT(A,9) || !BIT(A,5) || BIT(A,3))
- m_decrypted_opcodes[A] = bitswap<8>(m_decrypted_opcodes[A],7,6,1,4,3,2,5,0);
+ if (BIT(A, 9) || !BIT(A, 5) || BIT(A, 3))
+ m_decrypted_opcodes[A] = bitswap<8>(m_decrypted_opcodes[A], 7, 6, 1, 4, 3, 2, 5, 0);
- /* decode the data */
- if (BIT(A,5))
+ // decode the data
+ if (BIT(A, 5))
rom[A] ^= 0x40;
- if (BIT(A,9) || !BIT(A,5))
- rom[A] = bitswap<8>(rom[A],7,6,1,4,3,2,5,0);
+ if (BIT(A, 9) || !BIT(A,5))
+ rom[A] = bitswap<8>(rom[A], 7, 6, 1, 4, 3, 2, 5, 0);
}
init_cshooter();
-
}
} // Anonymous namespace
// There's also an undumped International Games version
-GAME( 1987, cshooter, airraid, airraid_crypt, airraid, airraid_state, init_cshootere, ROT270, "Seibu Kaihatsu (J.K.H. license)", "Cross Shooter (Single PCB)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
-GAME( 1987, airraid, 0, airraid_crypt, airraid, airraid_state, init_cshootere, ROT270, "Seibu Kaihatsu", "Air Raid (Single PCB)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
-
+GAME( 1987, cshooter, airraid, airraid, airraid, airraid_state, init_cshootere, ROT270, "Seibu Kaihatsu (J.K.H. license)", "Cross Shooter (Single PCB)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
+GAME( 1987, airraid, 0, airraid, airraid, airraid_state, init_cshootere, ROT270, "Seibu Kaihatsu", "Air Raid (Single PCB)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/alpha68k_n.cpp b/src/mame/drivers/alpha68k_n.cpp
index c7a3313436f..536e5218c4f 100644
--- a/src/mame/drivers/alpha68k_n.cpp
+++ b/src/mame/drivers/alpha68k_n.cpp
@@ -791,15 +791,15 @@ void sstingray_state::sstingry(machine_config &config)
/* sound hardware */
ym2203_device &ym1(YM2203(config, "ym1", 3000000));
- ym1.add_route(ALL_OUTPUTS, "speaker", 0.35);
+ ym1.add_route(ALL_OUTPUTS, "speaker", 0.30);
ym2203_device &ym2(YM2203(config, "ym2", 3000000));
- ym2.add_route(ALL_OUTPUTS, "speaker", 0.35);
+ ym2.add_route(ALL_OUTPUTS, "speaker", 0.30);
ym2203_device &ym3(YM2203(config, "ym3", 3000000));
- ym3.add_route(ALL_OUTPUTS, "speaker", 0.5);
+ ym3.add_route(ALL_OUTPUTS, "speaker", 0.45);
- DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.75); // unknown DAC
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.50); // unknown DAC
}
void kyros_state::kyros(machine_config &config)
@@ -824,15 +824,15 @@ void kyros_state::kyros(machine_config &config)
/* sound hardware */
ym2203_device &ym1(YM2203(config, "ym1", 24_MHz_XTAL / 12)); /* Verified on bootleg PCB */
- ym1.add_route(ALL_OUTPUTS, "speaker", 0.35);
+ ym1.add_route(ALL_OUTPUTS, "speaker", 0.30);
ym2203_device &ym2(YM2203(config, "ym2", 24_MHz_XTAL / 12)); /* Verified on bootleg PCB */
- ym2.add_route(ALL_OUTPUTS, "speaker", 0.35);
+ ym2.add_route(ALL_OUTPUTS, "speaker", 0.30);
ym2203_device &ym3(YM2203(config, "ym3", 24_MHz_XTAL / 12)); /* Verified on bootleg PCB */
- ym3.add_route(ALL_OUTPUTS, "speaker", 0.9);
+ ym3.add_route(ALL_OUTPUTS, "speaker", 0.6);
- DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.75); // unknown DAC
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.50); // unknown DAC
}
void jongbou_state::jongbou(machine_config &config)
diff --git a/src/mame/drivers/alphasma.cpp b/src/mame/drivers/alphasma.cpp
index c73a718f272..a77acb97996 100644
--- a/src/mame/drivers/alphasma.cpp
+++ b/src/mame/drivers/alphasma.cpp
@@ -17,7 +17,6 @@
#include "emu.h"
#include "cpu/mc68hc11/mc68hc11.h"
#include "machine/nvram.h"
-#include "machine/ram.h"
#include "video/hd44780.h"
#include "emupal.h"
#include "screen.h"
@@ -28,10 +27,9 @@ public:
alphasmart_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
- , m_lcdc0(*this, "ks0066_0")
- , m_lcdc1(*this, "ks0066_1")
+ , m_lcdc(*this, "ks0066_%u", 0U)
, m_nvram(*this, "nvram")
- , m_ram(*this, RAM_TAG)
+ , m_nvram_base(*this, "nvram", 0x20000, ENDIANNESS_BIG)
, m_rambank(*this, "rambank")
, m_keyboard(*this, "COL.%u", 0)
, m_battery_status(*this, "BATTERY")
@@ -44,10 +42,9 @@ public:
protected:
required_device<mc68hc11_cpu_device> m_maincpu;
- required_device<hd44780_device> m_lcdc0;
- required_device<hd44780_device> m_lcdc1;
+ required_device_array<hd44780_device, 2> m_lcdc;
required_device<nvram_device> m_nvram;
- required_device<ram_device> m_ram;
+ memory_share_creator<uint8_t> m_nvram_base;
required_memory_bank m_rambank;
required_ioport_array<16> m_keyboard;
required_ioport m_battery_status;
@@ -140,10 +137,10 @@ void alphasmart_state::update_lcdc(bool lcdc0, bool lcdc1)
uint8_t lcdc_data = 0;
if (lcdc0)
- lcdc_data |= m_lcdc0->read(BIT(m_matrix[1], 1));
+ lcdc_data |= m_lcdc[0]->read(BIT(m_matrix[1], 1));
if (lcdc1)
- lcdc_data |= m_lcdc1->read(BIT(m_matrix[1], 1));
+ lcdc_data |= m_lcdc[1]->read(BIT(m_matrix[1], 1));
m_port_d = (m_port_d & 0xc3) | (lcdc_data>>2);
}
@@ -152,10 +149,10 @@ void alphasmart_state::update_lcdc(bool lcdc0, bool lcdc1)
uint8_t lcdc_data = (m_port_d<<2) & 0xf0;
if (lcdc0)
- m_lcdc0->write(BIT(m_matrix[1], 1), lcdc_data);
+ m_lcdc[0]->write(BIT(m_matrix[1], 1), lcdc_data);
if (lcdc1)
- m_lcdc1->write(BIT(m_matrix[1], 1), lcdc_data);
+ m_lcdc[1]->write(BIT(m_matrix[1], 1), lcdc_data);
}
}
@@ -530,19 +527,16 @@ void alphasmart_state::alphasmart_palette(palette_device &palette) const
uint32_t alphasmart_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- m_lcdc0->screen_update(screen, *m_tmp_bitmap, cliprect);
+ m_lcdc[0]->screen_update(screen, *m_tmp_bitmap, cliprect);
copybitmap(bitmap, *m_tmp_bitmap, 0, 0, 0, 0, cliprect);
- m_lcdc1->screen_update(screen, *m_tmp_bitmap, cliprect);
+ m_lcdc[1]->screen_update(screen, *m_tmp_bitmap, cliprect);
copybitmap(bitmap, *m_tmp_bitmap, 0, 0, 0, 18,cliprect);
return 0;
}
void alphasmart_state::machine_start()
{
- uint8_t* ram = m_ram->pointer();
-
- m_rambank->configure_entries(0, 4, ram, 0x8000);
- m_nvram->set_base(ram, 0x8000*4);
+ m_rambank->configure_entries(0, 4, &m_nvram_base[0], 0x8000);
m_tmp_bitmap = std::make_unique<bitmap_ind16>(6 * 40, 9 * 4);
}
@@ -573,12 +567,10 @@ void alphasmart_state::alphasmart(machine_config &config)
m_maincpu->in_pd_callback().set(FUNC(alphasmart_state::port_d_r));
m_maincpu->out_pd_callback().set(FUNC(alphasmart_state::port_d_w));
- KS0066_F05(config, m_lcdc0, 0);
- m_lcdc0->set_lcd_size(2, 40);
- KS0066_F05(config, m_lcdc1, 0);
- m_lcdc1->set_lcd_size(2, 40);
-
- RAM(config, RAM_TAG).set_default_size("128K");
+ KS0066_F05(config, m_lcdc[0], 0);
+ m_lcdc[0]->set_lcd_size(2, 40);
+ KS0066_F05(config, m_lcdc[1], 0);
+ m_lcdc[1]->set_lcd_size(2, 40);
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
diff --git a/src/mame/drivers/alphatro.cpp b/src/mame/drivers/alphatro.cpp
index e07c89a1f3f..d6ec5f4bc9d 100644
--- a/src/mame/drivers/alphatro.cpp
+++ b/src/mame/drivers/alphatro.cpp
@@ -702,7 +702,7 @@ image_init_result alphatro_state::load_cart(device_image_interface &image, gener
if ((size != 0x4000) && (size != 0x2000))
{
- image.seterror(IMAGE_ERROR_UNSUPPORTED, "Invalid size, must be 8 or 16 K" );
+ image.seterror(image_error::INVALIDIMAGE, "Invalid size, must be 8 or 16 K" );
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/amiga.cpp b/src/mame/drivers/amiga.cpp
index cb0a94e4de7..1410b8f8d73 100644
--- a/src/mame/drivers/amiga.cpp
+++ b/src/mame/drivers/amiga.cpp
@@ -1644,6 +1644,11 @@ void amiga_state::amiga_base(machine_config &config)
void a1000_state::a1000(machine_config &config)
{
+ // main cpu
+ M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a1000_state::a1000_mem);
+ m_maincpu->set_cpu_space(AS_PROGRAM);
+
amiga_base(config);
// keyboard
@@ -1655,11 +1660,6 @@ void a1000_state::a1000(machine_config &config)
.set_delays(attotime::from_msec(152), attotime::from_usec(176), attotime::from_msec(704))
.kbrst_cb().set(FUNC(a1000_state::kbreset_w));
- // main cpu
- M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &a1000_state::a1000_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
ADDRESS_MAP_BANK(config, "overlay").set_map(&a1000_state::a1000_overlay_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
ADDRESS_MAP_BANK(config, "bootrom").set_map(&a1000_state::a1000_bootrom_map).set_options(ENDIANNESS_BIG, 16, 19, 0x40000);
@@ -1681,6 +1681,11 @@ void a1000_state::a1000n(machine_config &config)
void a2000_state::a2000(machine_config &config)
{
+ // main cpu
+ M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a2000_state::a2000_mem);
+ m_maincpu->set_cpu_space(AS_PROGRAM);
+
amiga_base(config);
// keyboard
@@ -1692,11 +1697,6 @@ void a2000_state::a2000(machine_config &config)
.set_delays(attotime::from_msec(112), attotime::from_msec(74), attotime::from_msec(1294))
.kbrst_cb().set(FUNC(a2000_state::kbreset_w));
- // main cpu
- M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &a2000_state::a2000_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_512kb_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
// real-time clock
@@ -1733,6 +1733,11 @@ void a2000_state::a2000n(machine_config &config)
void a500_state::a500(machine_config &config)
{
+ // main cpu
+ M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a500_state::a500_mem);
+ m_maincpu->set_cpu_space(AS_PROGRAM);
+
amiga_base(config);
// keyboard
@@ -1741,11 +1746,6 @@ void a500_state::a500(machine_config &config)
kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
kbd.krst_handler().set(FUNC(amiga_state::kbreset_w));
- // main cpu
- M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &a500_state::a500_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_1mb_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
// cpu slot
@@ -1769,6 +1769,11 @@ void a500_state::a500n(machine_config &config)
void cdtv_state::cdtv(machine_config &config)
{
+ // main cpu
+ M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cdtv_state::cdtv_mem);
+ m_maincpu->set_cpu_space(AS_PROGRAM);
+
amiga_base(config);
// keyboard
@@ -1780,11 +1785,6 @@ void cdtv_state::cdtv(machine_config &config)
.set_delays(attotime::from_usec(11238), attotime::from_usec(7432), attotime::from_usec(27539))
.kbrst_cb().set(FUNC(a1000_state::kbreset_w));
- // main cpu
- M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &cdtv_state::cdtv_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
// remote control input converter
m6502_device &u75(M6502(config, "u75", XTAL(3'000'000)));
u75.set_addrmap(AS_PROGRAM, &cdtv_state::cdtv_rc_mem);
@@ -1847,6 +1847,11 @@ void cdtv_state::cdtvn(machine_config &config)
void a3000_state::a3000(machine_config &config)
{
+ // main cpu
+ M68030(config, m_maincpu, XTAL(32'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a3000_state::a3000_mem);
+ m_maincpu->set_cpu_space(AS_PROGRAM);
+
amiga_base(config);
// keyboard
@@ -1854,11 +1859,6 @@ void a3000_state::a3000(machine_config &config)
kbd.kclk_handler().set("cia_0", FUNC(mos8520_device::cnt_w));
kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
- // main cpu
- M68030(config, m_maincpu, XTAL(32'000'000) / 2);
- m_maincpu->set_addrmap(AS_PROGRAM, &a3000_state::a3000_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_1mb_map32).set_options(ENDIANNESS_BIG, 32, 22, 0x200000);
// real-time clock
@@ -1883,6 +1883,11 @@ void a3000_state::a3000n(machine_config &config)
void a500p_state::a500p(machine_config &config)
{
+ // main cpu
+ M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a500p_state::a500p_mem);
+ m_maincpu->set_cpu_space(AS_PROGRAM);
+
amiga_base(config);
// keyboard
@@ -1891,11 +1896,6 @@ void a500p_state::a500p(machine_config &config)
kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
kbd.krst_handler().set(FUNC(amiga_state::kbreset_w));
- // main cpu
- M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &a500p_state::a500p_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_1mb_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
// real-time clock
@@ -1923,6 +1923,11 @@ void a500p_state::a500pn(machine_config &config)
void a600_state::a600(machine_config &config)
{
+ // main cpu
+ M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a600_state::a600_mem);
+ m_maincpu->set_cpu_space(AS_PROGRAM);
+
amiga_base(config);
// keyboard
@@ -1931,11 +1936,6 @@ void a600_state::a600(machine_config &config)
kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
kbd.krst_handler().set(FUNC(amiga_state::kbreset_w));
- // main cpu
- M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &a600_state::a600_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_2mb_map16).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
gayle_device &gayle(GAYLE(config, "gayle", amiga_state::CLK_28M_PAL / 2));
@@ -1971,6 +1971,13 @@ void a600_state::a600n(machine_config &config)
void a1200_state::a1200(machine_config &config)
{
+ // main cpu
+ M68EC020(config, m_maincpu, amiga_state::CLK_28M_PAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a1200_state::a1200_mem);
+ m_maincpu->set_cpu_space(AS_PROGRAM);
+
+ ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_2mb_map32).set_options(ENDIANNESS_BIG, 32, 22, 0x200000);
+
amiga_base(config);
// keyboard
@@ -1979,13 +1986,6 @@ void a1200_state::a1200(machine_config &config)
kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
kbd.krst_handler().set(FUNC(amiga_state::kbreset_w));
- // main cpu
- M68EC020(config, m_maincpu, amiga_state::CLK_28M_PAL / 2);
- m_maincpu->set_addrmap(AS_PROGRAM, &a1200_state::a1200_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
- ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_2mb_map32).set_options(ENDIANNESS_BIG, 32, 22, 0x200000);
-
m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
config.device_remove("palette");
@@ -2032,13 +2032,6 @@ void a1200_state::a1200n(machine_config &config)
void a4000_state::a4000(machine_config &config)
{
- amiga_base(config);
-
- // keyboard
- auto &kbd(AMIGA_KEYBOARD_INTERFACE(config, "kbd", amiga_keyboard_devices, "a2000_us"));
- kbd.kclk_handler().set("cia_0", FUNC(mos8520_device::cnt_w));
- kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
-
// main cpu
M68040(config, m_maincpu, XTAL(50'000'000) / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &a4000_state::a4000_mem);
@@ -2046,6 +2039,13 @@ void a4000_state::a4000(machine_config &config)
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_2mb_map32).set_options(ENDIANNESS_BIG, 32, 22, 0x200000);
+ amiga_base(config);
+
+ // keyboard
+ auto &kbd(AMIGA_KEYBOARD_INTERFACE(config, "kbd", amiga_keyboard_devices, "a2000_us"));
+ kbd.kclk_handler().set("cia_0", FUNC(mos8520_device::cnt_w));
+ kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
+
m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
config.device_remove("palette");
@@ -2105,8 +2105,6 @@ void a4000_state::a400030n(machine_config &config)
void cd32_state::cd32(machine_config &config)
{
- amiga_base(config);
-
// main cpu
M68EC020(config, m_maincpu, amiga_state::CLK_28M_PAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &cd32_state::cd32_mem);
@@ -2114,6 +2112,8 @@ void cd32_state::cd32(machine_config &config)
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_2mb_map32).set_options(ENDIANNESS_BIG, 32, 22, 0x200000);
+ amiga_base(config);
+
I2C_24C08(config, "i2cmem", 0); // AT24C08N
akiko_device &akiko(AKIKO(config, "akiko", 0));
diff --git a/src/mame/drivers/apple2.cpp b/src/mame/drivers/apple2.cpp
index 21cc5fcfc00..d43eb3fa842 100644
--- a/src/mame/drivers/apple2.cpp
+++ b/src/mame/drivers/apple2.cpp
@@ -677,10 +677,24 @@ u8 apple2_state::controller_strobe_r()
void apple2_state::controller_strobe_w(u8 data)
{
- m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl0_r();
- m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl1_r();
- m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl2_r();
- m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl3_r();
+ // 558 monostable one-shot timers; a running timer cannot be restarted
+ if (machine().time().as_double() >= m_joystick_x1_time)
+ {
+ m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl0_r();
+ }
+ if (machine().time().as_double() >= m_joystick_y1_time)
+ {
+ m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl1_r();
+ }
+ if (machine().time().as_double() >= m_joystick_x2_time)
+ {
+ m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl2_r();
+ }
+ if (machine().time().as_double() >= m_joystick_y2_time)
+ {
+ m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl3_r();
+ }
+
}
u8 apple2_state::c080_r(offs_t offset)
diff --git a/src/mame/drivers/apple2e.cpp b/src/mame/drivers/apple2e.cpp
index da3b6038563..ed169af47b9 100644
--- a/src/mame/drivers/apple2e.cpp
+++ b/src/mame/drivers/apple2e.cpp
@@ -159,6 +159,7 @@ MIG RAM page 2 $CE02 is the speaker/slot bitfield and $CE03 is the paddle/accele
#include "bus/a2bus/a2pic.h"
#include "bus/a2bus/a2sam.h"
#include "bus/a2bus/a2scsi.h"
+#include "bus/a2bus/a2sd.h"
#include "bus/a2bus/a2softcard.h"
#include "bus/a2bus/a2ssc.h"
#include "bus/a2bus/a2swyft.h"
@@ -1903,10 +1904,23 @@ void apple2e_state::do_io(int offset, bool is_iic)
accel_normal_speed();
}
- m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl0_r();
- m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl1_r();
- m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl2_r();
- m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl3_r();
+ // 558 monostable one-shot timers; a running timer cannot be restarted
+ if (machine().time().as_double() >= m_joystick_x1_time)
+ {
+ m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl0_r();
+ }
+ if (machine().time().as_double() >= m_joystick_y1_time)
+ {
+ m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl1_r();
+ }
+ if (machine().time().as_double() >= m_joystick_x2_time)
+ {
+ m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl2_r();
+ }
+ if (machine().time().as_double() >= m_joystick_y2_time)
+ {
+ m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl3_r();
+ }
break;
default:
@@ -3209,19 +3223,20 @@ u8 apple2e_state::read_floatingbus()
ADDRESS MAP
***************************************************************************/
-u8 apple2e_state::ram0000_r(offs_t offset) { return m_ram_ptr[offset]; }
+u8 apple2e_state::ram0000_r(offs_t offset) { return m_ram_ptr[offset]; }
void apple2e_state::ram0000_w(offs_t offset, u8 data) { m_ram_ptr[offset] = data; }
-u8 apple2e_state::ram0200_r(offs_t offset) { return m_ram_ptr[offset+0x200]; }
+u8 apple2e_state::ram0200_r(offs_t offset) { return m_ram_ptr[offset+0x200]; }
void apple2e_state::ram0200_w(offs_t offset, u8 data) { m_ram_ptr[offset+0x200] = data; }
-u8 apple2e_state::ram0400_r(offs_t offset) { return m_ram_ptr[offset+0x400]; }
+u8 apple2e_state::ram0400_r(offs_t offset) { return m_ram_ptr[offset+0x400]; }
void apple2e_state::ram0400_w(offs_t offset, u8 data) { m_ram_ptr[offset+0x400] = data; }
-u8 apple2e_state::ram0800_r(offs_t offset) { return m_ram_ptr[offset+0x800]; }
+u8 apple2e_state::ram0800_r(offs_t offset) { return m_ram_ptr[offset+0x800]; }
void apple2e_state::ram0800_w(offs_t offset, u8 data) { m_ram_ptr[offset+0x800] = data; }
-u8 apple2e_state::ram2000_r(offs_t offset) { return m_ram_ptr[offset+0x2000]; }
+u8 apple2e_state::ram2000_r(offs_t offset) { return m_ram_ptr[offset+0x2000]; }
void apple2e_state::ram2000_w(offs_t offset, u8 data) { m_ram_ptr[offset+0x2000] = data; }
-u8 apple2e_state::ram4000_r(offs_t offset) { return m_ram_ptr[offset+0x4000]; }
+u8 apple2e_state::ram4000_r(offs_t offset) { return m_ram_ptr[offset+0x4000]; }
void apple2e_state::ram4000_w(offs_t offset, u8 data) { m_ram_ptr[offset+0x4000] = data; }
void apple2e_state::ram8000_w(offs_t offset, u8 data) { m_ram_ptr[offset+0x8000] = data; }
+
u8 apple2e_state::cec4000_r(offs_t offset)
{
//printf("cec4000_r: ofs %x\n", offset);
@@ -3241,17 +3256,17 @@ u8 apple2e_state::cec8000_r(offs_t offset)
}
}
-u8 apple2e_state::auxram0000_r(offs_t offset) { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset]; } else { return read_floatingbus(); } }
+u8 apple2e_state::auxram0000_r(offs_t offset) { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset]; } else { return read_floatingbus(); } }
void apple2e_state::auxram0000_w(offs_t offset, u8 data) { if (m_aux_bank_ptr) { m_aux_bank_ptr[offset] = data; } }
-u8 apple2e_state::auxram0200_r(offs_t offset) { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x200]; } else { return read_floatingbus(); } }
+u8 apple2e_state::auxram0200_r(offs_t offset) { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x200]; } else { return read_floatingbus(); } }
void apple2e_state::auxram0200_w(offs_t offset, u8 data) { if (m_aux_bank_ptr) { m_aux_bank_ptr[offset+0x200] = data; } }
-u8 apple2e_state::auxram0400_r(offs_t offset) { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x400]; } else { return read_floatingbus(); } }
+u8 apple2e_state::auxram0400_r(offs_t offset) { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x400]; } else { return read_floatingbus(); } }
void apple2e_state::auxram0400_w(offs_t offset, u8 data) { if (m_aux_bank_ptr) { m_aux_bank_ptr[offset+0x400] = data; } }
-u8 apple2e_state::auxram0800_r(offs_t offset) { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x800]; } else { return read_floatingbus(); } }
+u8 apple2e_state::auxram0800_r(offs_t offset) { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x800]; } else { return read_floatingbus(); } }
void apple2e_state::auxram0800_w(offs_t offset, u8 data) { if (m_aux_bank_ptr) { m_aux_bank_ptr[offset+0x800] = data; } }
-u8 apple2e_state::auxram2000_r(offs_t offset) { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x2000]; } else { return read_floatingbus(); } }
+u8 apple2e_state::auxram2000_r(offs_t offset) { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x2000]; } else { return read_floatingbus(); } }
void apple2e_state::auxram2000_w(offs_t offset, u8 data) { if (m_aux_bank_ptr) { m_aux_bank_ptr[offset+0x2000] = data; } }
-u8 apple2e_state::auxram4000_r(offs_t offset) { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x4000]; } else { return read_floatingbus(); } }
+u8 apple2e_state::auxram4000_r(offs_t offset) { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x4000]; } else { return read_floatingbus(); } }
void apple2e_state::auxram4000_w(offs_t offset, u8 data) { if (m_aux_bank_ptr) { m_aux_bank_ptr[offset+0x4000] = data; } }
void apple2e_state::apple2e_map(address_map &map)
@@ -4705,6 +4720,7 @@ static void apple2_cards(device_slot_interface &device)
device.option_add("lancegs", A2BUS_LANCEGS); /* ///SHH SYSTEME LANceGS Card */
device.option_add("q68", A2BUS_Q68); /* Stellation Q68 68000 card */
device.option_add("q68plus", A2BUS_Q68PLUS); /* Stellation Q68 Plus 68000 card */
+ device.option_add("a2sd", A2BUS_A2SD); /* Florian Reitz AppleIISD */
}
static void apple2eaux_cards(device_slot_interface &device)
diff --git a/src/mame/drivers/apple2gs.cpp b/src/mame/drivers/apple2gs.cpp
index 4705bfe199c..78eec88dd59 100644
--- a/src/mame/drivers/apple2gs.cpp
+++ b/src/mame/drivers/apple2gs.cpp
@@ -2187,10 +2187,23 @@ void apple2gs_state::do_io(int offset)
accel_normal_speed();
}
- m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl0_r();
- m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl1_r();
- m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl2_r();
- m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl3_r();
+ // 558 monostable one-shot timers; a running timer cannot be restarted
+ if (machine().time().as_double() >= m_joystick_x1_time)
+ {
+ m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl0_r();
+ }
+ if (machine().time().as_double() >= m_joystick_y1_time)
+ {
+ m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl1_r();
+ }
+ if (machine().time().as_double() >= m_joystick_x2_time)
+ {
+ m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl2_r();
+ }
+ if (machine().time().as_double() >= m_joystick_y2_time)
+ {
+ m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl3_r();
+ }
break;
default:
@@ -2619,10 +2632,32 @@ u8 apple2gs_state::c000_r(offs_t offset)
// todo: does reading these on the IIgs also trigger the joysticks?
if (!machine().side_effects_disabled())
{
- m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl0_r();
- m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl1_r();
- m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl2_r();
- m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl3_r();
+ // Zip paddle slowdown (does ZipGS also use the old Zip flag?)
+ if ((m_accel_present) && !BIT(m_accel_gsxsettings, 6))
+ {
+ m_accel_temp_slowdown = true;
+ m_acceltimer->adjust(attotime::from_msec(5));
+ accel_normal_speed();
+ }
+
+ // 558 monostable one-shot timers; a running timer cannot be restarted
+ if (machine().time().as_double() >= m_joystick_x1_time)
+ {
+ m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl0_r();
+ }
+ if (machine().time().as_double() >= m_joystick_y1_time)
+ {
+ m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl1_r();
+ }
+ if (machine().time().as_double() >= m_joystick_x2_time)
+ {
+ m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl2_r();
+ }
+ if (machine().time().as_double() >= m_joystick_y2_time)
+ {
+ m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl3_r();
+ }
+
}
return m_rom[offset + 0x3c000];
diff --git a/src/mame/drivers/applix.cpp b/src/mame/drivers/applix.cpp
index b0405daf17d..41c05b465fd 100644
--- a/src/mame/drivers/applix.cpp
+++ b/src/mame/drivers/applix.cpp
@@ -462,7 +462,7 @@ void applix_state::main_mem(address_map &map)
map(0x500000, 0x51ffff).rom().region("maincpu", 0);
map(0x600000, 0x60007f).w(FUNC(applix_state::palette_w));
map(0x600080, 0x6000ff).w(FUNC(applix_state::dac_latch_w));
- map(0x600100, 0x60017f).w(FUNC(applix_state::video_latch_w)); //video latch (=border colour, high nibble; video base, low nibble) (odd)
+ map(0x600100, 0x60017f).w(FUNC(applix_state::video_latch_w)); //video latch (=border colour, high nybble; video base, low nybble) (odd)
map(0x600180, 0x6001ff).w(FUNC(applix_state::analog_latch_w));
map(0x700000, 0x700007).mirror(0x78).rw("scc", FUNC(scc8530_device::ab_dc_r), FUNC(scc8530_device::ab_dc_w)).umask16(0xff00).cswidth(16);
map(0x700080, 0x7000ff).r(FUNC(applix_state::applix_inputs_r));
diff --git a/src/mame/drivers/apxen.cpp b/src/mame/drivers/apxen.cpp
index 7b963e5ab3d..6b883a3b88d 100644
--- a/src/mame/drivers/apxen.cpp
+++ b/src/mame/drivers/apxen.cpp
@@ -13,15 +13,18 @@
- XEN WS (1 MB RAM, no drives)
TODO:
- - Boot ROM disable, wrap around mode
+ - Boot ROM disable, wrap around mode
- Floppy
- - DMA
- - Harddisk
- - Keyboard
- - RS232
- - Printer
- - Colour graphics board
- - Make xen_daisy_device generic?
+ * FDC is slightly too slow (or CPU too fast), causing Error 28 on boot
+ can be fixed by setting delay_register_commit to 12 in wd_fdc.cpp
+ * Issues accessing the second drive
+ - DMA (verify, seems to fast)
+ - Harddisk
+ - XEN keyboard (currently using the Apricot Xi keyboard)
+ - RS232
+ - Printer
+ - Colour graphics board
+ - Make xen_daisy_device generic?
Notes:
- Two graphics cards: Mono and colour boards
@@ -260,15 +263,15 @@ uint16_t apxen_state::mem_r(offs_t offset, uint16_t mem_mask)
// pc/xi compatible mode vram
if ((offset << 1) < 0x10000 && !m_apvid)
m_video->mem_r(offset & (0xffff >> 1), data, mem_mask);
-
+
// pc/xi video pointer mirror
else if ((offset << 1) >= 0xf0000 && (offset << 1) <= 0xf0fff && !m_apvid)
m_video->mem_r((offset & (0xffff >> 1)) | (0x0e000 >> 1), data, mem_mask);
-
+
// xen mode vram
else if ((offset << 1) >= 0xe0000 && (offset << 1) <= 0xeffff && m_apvid)
m_video->mem_r(offset & (0xffff >> 1), data, mem_mask);
-
+
// normal access
else
data &= m_mem->read16(offset, mem_mask);
@@ -281,15 +284,15 @@ void apxen_state::mem_w(offs_t offset, uint16_t data, uint16_t mem_mask)
// pc/xi compatible mode vram
if ((offset << 1) < 0x10000 && !m_apvid)
m_video->mem_w(offset & (0xffff >> 1), data, mem_mask);
-
+
// pc/xi video pointer mirror
else if ((offset << 1) >= 0xf0000 && (offset << 1) <= 0xf0fff && !m_apvid)
m_video->mem_w((offset & (0xffff >> 1)) | (0x0e000 >> 1), data, mem_mask);
-
+
// xen mode vram
else if ((offset << 1) >= 0xe0000 && (offset << 1) <= 0xeffff && m_apvid)
m_video->mem_w(offset & (0xffff >> 1), data, mem_mask);
-
+
// normal access
else
m_mem->write16(offset, data, mem_mask);
@@ -382,7 +385,7 @@ void apxen_state::cpu_control_w(uint8_t data)
void apxen_state::cpu_reset_w(uint8_t data)
{
logerror("cpu_reset_w: %02x\n", data);
-
+
// data written doesn't matter
m_maincpu->reset();
}
@@ -391,7 +394,7 @@ uint8_t apxen_state::cio_porta_r()
{
uint8_t data = 0x00;
- data |= m_cur_floppy ? m_cur_floppy->dskchg_r() : 0;
+ data |= m_cur_floppy ? (m_cur_floppy->dskchg_r() << 3) : 0;
logerror("cio_porta_r: %02x\n", data);
@@ -530,6 +533,8 @@ void apxen_state::apxen(machine_config &config)
FLOPPY_CONNECTOR(config, "fdc:0", apricot_floppies, "d32w", apxen_state::floppy_formats);
FLOPPY_CONNECTOR(config, "fdc:1", apricot_floppies, "d32w", apxen_state::floppy_formats);
+ SOFTWARE_LIST(config, "flop_list").set_original("apxen_flop");
+
// video hardware
APRICOT_VIDEO_SLOT(config, m_video, apricot_video_cards, "mono");
m_video->apvid_handler().set(FUNC(apxen_state::apvid_w));
@@ -554,6 +559,10 @@ ROM_START( apxen )
// HI-XEN 3.1.3 9BF0 (checksum matches)
ROM_LOAD16_BYTE("hi-xen_313.ic37", 0x0001, 0x8000, CRC(72ee2f09) SHA1(da11043d40a694802f6d3d27a4359067dd19c8e6))
+ // default eeprom configured with 2 floppy drives and serial no. 123456
+ ROM_REGION16_LE(0x20, "eeprom", 0)
+ ROM_LOAD("eeprom.nv", 0x00, 0x20, CRC(c26d455e) SHA1(ff2d7af6ca21b2fba4c5a9e90926b5049a9fdc86))
+
// should probably be moved elsewhere
ROM_REGION(0x2000, "hdd", 0)
ROM_LOAD("rodime_ro3055.bin", 0x0000, 0x2000, CRC(61d1544a) SHA1(2177a4c6409c0ee3d3e3e6c659085adf236f8726))
diff --git a/src/mame/drivers/aristmk6.cpp b/src/mame/drivers/aristmk6.cpp
index a0d824cbd58..633bff609cc 100644
--- a/src/mame/drivers/aristmk6.cpp
+++ b/src/mame/drivers/aristmk6.cpp
@@ -6,37 +6,63 @@ Aristocrat MK6 (2000)
Product numbers: 410480, 410481, 410556, 410557
Hitachi SH4 7750
-NEC PowerVR Neon 250 (PMX1-LC)
+NEC PowerVR 250 (PMX1-LC)
Altera FLEX EPF10K100E
PCI PLX9054
16C554 4xUART
-Aristocrat MK6 XP (2002)
+
+Aristocrat MK6-XP (2002)
Product numbers: 410540, 410541
same as above except:
- Altera APEX instead of FLEX
- doesn't have PCI controller
+
+MK6 XP 72-pin SIMM
+Product number: 410748
+Same form factor as PC EDO DRAM (but not RAM)
+
+2x NXP MC145406D L0A3S202 UnG020F
+
+
System EPROM Board
Product number: 410485
+
Storage Expansion Board
Product number: 410663
+
+SPC 2.0 Board (Serial Protocol Converter)
+
+Intel i386EX KU80386EX33
+66.6666 MHz XTAL
+Analog Devices ADM691AR
+Lattice GAL16V8D
+Samsung K6T4016C38-TB55
+CR2032 battery
+
+
SPC 2.5 Type II Board
Product number: 432825
+
+PMC Video Board (used for dual-screen software)
+Product number: 410535
+
+
notes:
0x0001CA1E - critical error handler in BIOS, R4 - pointer to error message
Comms protocols:
The "Malaysian" games are actually casino versions and may be generic to all regions, however the region for the 15011025 system software is currently unknown.
-These games use the ASP1000 protocol.
+These games use ASP1000 (Aristocrat Serial Protocol).
The reason the region is currently called Malaysia is that there seems to be code for RM (ringgit) denominations in the system software.
-Queensland games use the QCOM protocol.
+Queensland and New Zealand games use the QCOM protocol.
The South Australian system set and game (only one dumped so far) uses the VLC (Video Lottery Consultants) protocol.
@@ -393,10 +419,86 @@ void aristmk6_state::aristmk6(machine_config &config)
ROMX_LOAD(name, offset, length, hash, ROM_GROUPWORD | ROM_SKIP(6) | ROM_BIOS(bios))
/*
+EPROM labels all look basically the same between games
+
+Standard platform:
+
+ +--------------------------------------------------+
+ | 20151911 NSW |
+ | INDIAN DREAMING- LL |
+ | 742 4MB 6 eproms |
+ | Aristocrat © 2005 P U72 |
+ +--------------------------------------------------+
+
+"ID string" + "Region" + "Game Name" + "Combination No." + "ROM size"
++ "Number of EPROMs" + "Copyright" + "Board location"
+
+USA platform:
+
+ +--------------------------------------------------+
+ | 0251312-U86 Series:01 M27V322 Mk6USA |
+ | Diamond Eyes |
+ | E6A2D2DA |
+ | 4B5B-B5BF / 1E6C64C8 / 6FC8B9B6 |
+ | Copyright © 2003 Aristocrat Technologies, Inc. |
+ +--------------------------------------------------+
+
+"ID string" + "Board location" + "Series" + "EPROM type" + "Platform"
++ "Game Name" + "Checksums" + "Copyright"
+
+We reduce this to "ID string"."Location" in the filenames for simplicity, also for games which we don't have pictures for.
+
+Decoding the game ID:
+On the standard or "Australian" platform, the ID is split into four parts: Version number, Manufacturer, Game ID with the last two digits serving an unknown purpose (usually 11 but sometimes 21, 31 or 41 etc.)
+In the case of the above game, this would be 2 (version), 0 (Aristocrat), 1519, 11.
+For Jubilee games, the second digit is a J rather than a zero.
+
+Note that in the Machine Identification menu, the last two digits of the ID are replaced with AV (standard software) or AD (demo software aka show program).
+
+On the USA platform, the ID format is different:
+The game ID seems to be split into three parts: Version number, manufacturer and Game ID, for example 0151178 (adonisa6).
+In this case, the version number would be 01, followed by manufacturer (seems to always be 5), then 1178 for the game ID.
+US games also show the ROM checksum on the label.
+
+Game EPROMs are M27V322 (4MB), system/setchip EPROMs are M27V800 (1MB) or M27V160 (2MB). All three types have 42 pins.
+
+Currently there are no dumps of the SPC (serial protocol converter) boards.
+On the SPC2 PCB there is a 32-pin EPROM located at U3.
+On SPC2.5 boards, the chip is a 32-pin PLCC rather than DIP, and is located at U19.
+
+SPC2:
+
+ +------------------------------------------------+
+ | GAMBS2M 01.06.17 U3 |
+ | V. 01.06.17 |
+ | 8H37 / 3B68 / 00DF3B68 |
+ | |
+ | Copyright © 2011 Aristocrat Technologies, Inc. |
+ +------------------------------------------------+
+
+SPC2.5:
+U19 (program chip)
+ +--------------+
+ | |
+ |GAMBS2.5M |
+ |V. 02.06.28 |
+ |69P1 |
+ | |
+ +--------------+
+
+U14 (configuration chip)
+ +----------+
+ | U14 |
+ | SPC2.5 |
+ | 1.3.3(0) |
+ +----------+
+
BIOS/set chips are known to be in 3 locations depending on the PCB used:
-"System Right" is at u83 on MK6 and MK6XP boards, u2 on MK6 System EPROM board and u20 on storage expansion board
-"System Left" is at u70 on MK6 and MK6XP boards, u3 on MK6 System EPROM board and u10 on storage expansion board
-The earliest BIOSes used 4 chips, leaving room for only 4 game EPROMs on a standard MK6 board
+"System Right" is at u83 on MK6 and MK6-XP boards, u2 on MK6 System EPROM board and u10 on Storage Expansion board
+"System Left" is at u70 on MK6 and MK6-XP boards, u3 on MK6 System EPROM board and u20 on Storage Expansion board
+
+The earliest BIOSes, designed for the first-generation (non-XP) MK6 boards, use four 1MB chips, leaving room for only four game EPROM sockets on the board.
+Later BIOSes, designed for the later MK6-XP system, use two 2MB chips, and MK6-XP boards have six game EPROM sockets instead of four.
Earlier BIOSes are usually not compatible with later games.
@@ -431,7 +533,7 @@ typically at around 0x3100-0x3200, 0x3600-0x3700 for Left/Right BIOS dumps (2 fi
ROM_LOAD32_WORD_BIOS( 7, "09011001_right.u83", 0x0000000, 0x0200000, CRC(8a853f80) SHA1(9a75498f7b02c81a483b4e1c158f35f0ee4c0112) ) \
ROM_LOAD32_WORD_BIOS( 7, "09011001_left.u70", 0x0000002, 0x0200000, CRC(229c2e63) SHA1(91fd2b1acb69efe073647e93db9f11042add2feb) ) \
ROM_SYSTEM_BIOS( 8, "au-nsw9", "Aristocrat MK6 Base (07010801, NSW/ACT)" ) \
- ROM_LOAD32_WORD_BIOS( 8, "07010801_right.u83", 0x0000000, 0x0200000, CRC(8c148c11) SHA1(5ff3be18455b4f04675fec8d5b9d881295c65e23) ) /* From Jailbreak */ \
+ ROM_LOAD32_WORD_BIOS( 8, "07010801_right.u83", 0x0000000, 0x0200000, CRC(8c148c11) SHA1(5ff3be18455b4f04675fec8d5b9d881295c65e23) ) /* From Jailbreak & Wizard Ways */ \
ROM_LOAD32_WORD_BIOS( 8, "07010801_left.u70", 0x0000002, 0x0200000, CRC(8e92af68) SHA1(00d2bb655b7964a9652896741210ec534df0b0d2) ) \
ROM_SYSTEM_BIOS( 9, "au-nsw10", "Aristocrat MK6 Base (05010601, NSW/ACT)" ) \
ROM_LOAD32_WORD_BIOS( 9, "05010601_right.u83", 0x0000000, 0x0100000, CRC(c12eac11) SHA1(683b9ddc323865ace7dca37d13b55de6e42759a5) ) /* From Thai Princess & Venetian Nights */ \
@@ -493,8 +595,8 @@ typically at around 0x3100-0x3200, 0x3600-0x3700 for Left/Right BIOS dumps (2 fi
ROM_LOAD32_WORD_BIOS( 25, "01.04.10_right.u83", 0x0000000, 0x0200000, CRC(82ce2fcc) SHA1(4c8fb3db084a67e99d1420b3f895a06ce9ef5ec2) ) \
ROM_LOAD32_WORD_BIOS( 25, "01.04.10_left.u70", 0x0000002, 0x0200000, CRC(9d9d52c1) SHA1(b957220cdbedd516c219d1bfc28807ce466df93f) ) \
ROM_SYSTEM_BIOS( 26, "us3", "Aristocrat MK6 Base (01.04.08, US)" ) \
- ROM_LOAD32_WORD_BIOS( 26, "01.04.08_right.u83", 0x0000000, 0x0200000, CRC(95333304) SHA1(7afe49d6c5e4d6820f349778557daa88c5366a51) ) /* From Bob and Dolly, also u20 on EPROM expansion board */ \
- ROM_LOAD32_WORD_BIOS( 26, "01.04.08_left.u70", 0x0000002, 0x0200000, CRC(0dfcad10) SHA1(53798be000304aed38909f5fd8470a68bedd8229) ) /* also u10 on EPROM expansion board */ \
+ ROM_LOAD32_WORD_BIOS( 26, "01.04.08_right.u83", 0x0000000, 0x0200000, CRC(95333304) SHA1(7afe49d6c5e4d6820f349778557daa88c5366a51) ) /* From Bob and Dolly, also u10 on EPROM expansion board */ \
+ ROM_LOAD32_WORD_BIOS( 26, "01.04.08_left.u70", 0x0000002, 0x0200000, CRC(0dfcad10) SHA1(53798be000304aed38909f5fd8470a68bedd8229) ) /* also u20 on EPROM expansion board */ \
ROM_SYSTEM_BIOS( 27, "us4", "Aristocrat MK6 Base (01.04.07, US)" ) \
ROM_LOAD32_WORD_BIOS( 27, "01.04.07_right.u83", 0x0000000, 0x0200000, CRC(23c28e22) SHA1(98f24a1f86232b6c2c288a61ec7d60c867f192e5) ) \
ROM_LOAD32_WORD_BIOS( 27, "01.04.07_left.u70", 0x0000002, 0x0200000, CRC(acfb0fe0) SHA1(b1a772d7978e6ff4406a5bb39a71cb3f89608e72) ) \
@@ -538,89 +640,19 @@ typically at around 0x3100-0x3200, 0x3600-0x3700 for Left/Right BIOS dumps (2 fi
ROM_LOAD32_WORD_BIOS( 40, "06.02.04_right.u2", 0x0000000, 0x0100000, CRC(1cf5a853) SHA1(64d17efcce702df7a0b0e151293199478e25226d) ) \
ROM_LOAD32_WORD_BIOS( 40, "06.02.04_left.u3", 0x0000002, 0x0100000, CRC(117b75f2) SHA1(2129286853d3c50b8a943b71334d4ef6b98adc05) )
+
ROM_START( aristmk6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
ROM_END
-/*
-EPROM labels all look basically the same between games
-
-Standard platform:
-
- +--------------------------------------------------+
- | 20151911 NSW |
- | INDIAN DREAMING-LL |
- | 742 4MB 6 eproms |
- | Aristocrat 2005 P U72 |
- +--------------------------------------------------+
-
-"ID string" + "Region" + "Game Name" + "Combination No." + "ROM size"
-+ "Number of EPROMs" + "Copyright" + "Board location"
-
-USA platform:
-
- +--------------------------------------------------+
- | 0251312-U86 Series:01 M27V322 Mk6USA |
- | Diamond Eyes |
- | E6A2D2DA |
- | 4B5B-B5BF / 1E6C64C8 / 6FC8B9B6 |
- | Copyright © 2003 Aristocrat Technologies, Inc. |
- +--------------------------------------------------+
-
-"ID string" + "Board location" + "Series" + "EPROM type" + "Platform"
-+ "Game Name" + "Checksums" + "Copyright"
-
-We reduce this to "ID string"."Location" in the filenames for simplicity, also for games which we don't have pictures for.
-
-Decoding the game ID:
-On the standard or "Australian" platform, the ID is split into four parts: Version number, Manufacturer, Game ID with the last two digits serving an unknown purpose (usually 11 but sometimes 21, 31 or 41 etc.)
-In the case of the above game, this would be 2 (version), 0 (Aristocrat), 1519, 11.
-For Jubilee games, the second digit is a J rather than a zero.
-
-Note that in the Machine Identification menu, the last two digits of the ID are replaced with AV (standard software) or AD (demo software aka show program).
-
-On the USA platform, the ID format is different:
-The game ID seems to be split into three parts: Version number, manufacturer and Game ID, for example 0151178 (adonisa6).
-In this case, the version number would be 01, followed by manufacturer (seems to always be 5), then 1178 for the game ID.
-US games also show the ROM checksum on the label.
-
-Game EPROMs are M27V322 (4MB), system/setchip EPROMs are M27V800 (1MB) or M27V160 (2MB). All three types have 42 pins.
-
-Currently there are no dumps of the SPC (serial protocol converter) boards.
-On the SPC2 PCB there is a 32-pin EPROM located at U3.
-On SPC2.5 boards, the chip is a 32-pin PLCC rather than DIP, and is located at U19.
-
-SPC2:
-
- +------------------------------------------------+
- | GAMBS2M 01.06.17 U3 |
- | V. 01.06.17 |
- | 8H37 / 3B68 / 00DF3B68 |
- | |
- | Copyright © 2011 Aristocrat Technologies, Inc. |
- +------------------------------------------------+
-
-SPC2.5:
-U19 (program chip)
- +--------------+
- | |
- |GAMBS2.5M |
- |V. 02.06.28 |
- |69P1 |
- | |
- +--------------+
-
-U14 (configuration chip)
- +----------+
- | U14 |
- | SPC2.5 |
- | 1.3.3(0) |
- +----------+
-*/
-
-
+// 20161011 / 744
+// 5 Dragons / Local / C - 14/01/04
+// Variations (% and NO):
+// 88.55% 99
+// 87.88% 01
+// 86.88% 02
ROM_START( 5drag )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -631,7 +663,13 @@ ROM_START( 5drag )
ROM_END
-// we had no pics of the ROM labels for the Show Program PCBs
+// 20161011 / 744
+// 5 Dragons / Local / C - 14/01/04
+// SHOW PROGRAM
+// Variations (% and NO):
+// 88.55% 99
+// Identified as 201610AD in the Machine Identification menu, rather than 201610AV from the parent set
+// We had no pics of the ROM labels for the Show Program games
// they probably have some different string in the label but
// we just append a "sp__" prefix for the moment
ROM_START( 5dragsp )
@@ -644,6 +682,15 @@ ROM_START( 5dragsp )
ROM_END
+// 0152309 / US211
+// 5 Dragons / Local / A - 01/09/07
+// Variations (% and NO):
+// 87.899% 99
+// 89.935% 01
+// 91.848% 02
+// 94.886% 03
+// 97.086% 04
+// 82.180% 05 (Hyperlink)
ROM_START( 5dragce )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -656,6 +703,12 @@ ROM_START( 5dragce )
ROM_END
+// 102507 / 744/2
+// 5 Koi / C - 25/10/07
+// Variations (% and NO):
+// 88.54% 99
+// 87.88% 01
+// 86.87% 02
ROM_START( 5koipp )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -668,6 +721,10 @@ ROM_START( 5koipp )
ROM_END
+// 10166211 / 717/3
+// 15 Lions / QCOM / B - 23/03/04
+// Variations (% and NO):
+// 87.67% 99
ROM_START( 15lions )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -676,6 +733,12 @@ ROM_START( 15lions )
ROM_END
+// 10120511 / 717
+// 50 Lions / Local / A - 11/10/02
+// Variations (% and NO):
+// 87.58% 99
+// 90.03% 01
+// 92.11% 02
ROM_START( 50lions )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -684,6 +747,10 @@ ROM_START( 50lions )
ROM_END
+// 10156111 / 717
+// 50 Lions / ASP / D - 20/10/03
+// Variations (% and NO):
+// 87.58% 99
ROM_START( 50lionsm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -692,6 +759,11 @@ ROM_START( 50lionsm )
ROM_END
+// 20301311 / 1049
+// 50 Lions - Roaring Riches / B - 20/08/12
+// Variations (% and NO):
+// 85.03% 05
+// 87.57% 06
ROM_START( 50lionrr )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -704,6 +776,12 @@ ROM_START( 50lionrr )
ROM_END
+// 10219211 / 717/4
+// 100 Lions / Local / B - 13/06/06
+// Variations (% and NO):
+// 87.90% 99
+// 90.07% 01
+// 91.99% 02
ROM_START( 100lions )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -712,6 +790,14 @@ ROM_START( 100lions )
ROM_END
+// 0151178 / US168
+// Adonis / USA / A - 05/26/05
+// Variations (% and NO):
+// 87.928% 99
+// 90.511% 01
+// 92.161% 02
+// 94.941% 03
+// 97.325% 04
ROM_START( adonisa6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -720,6 +806,10 @@ ROM_START( adonisa6 )
ROM_END
+// 20006711 / 665/1
+// AFRICAN DUSK (MR. CASHMAN) / Local / B- 13/07/01
+// Variations (% and NO):
+// 87.84% 99
ROM_START( aduskcm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -730,6 +820,14 @@ ROM_START( aduskcm )
ROM_END
+// 0251071 / US051
+// After Hours / USA / B - 01/20/04
+// Variations (% and NO):
+// 87.493% 99 (9 line) 87.645% 99 (20 line)
+// 90.663% 01 (9 line) 90.640% 01 (20 line)
+// 92.625% 02 (9 line) 92.548% 02 (20 line)
+// 95.538% 03 (9 line) 95.630% 03 (20 line)
+// 97.469% 04 (9 line) 97.494% 04 (20 line)
ROM_START( afterhrs )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -740,6 +838,12 @@ ROM_START( afterhrs )
ROM_END
+// 1J009611 / JB013/2
+// Alchemy / NSW/ACT / A - 30/05/03
+// Variations (% and NO):
+// 87.99% 99
+// 90.10% 01
+// 92.18% 02
ROM_START( alchemy )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -750,9 +854,23 @@ ROM_START( alchemy )
ROM_END
+// 0152152 / US209
+// All The King's Gold / Local / A - 01/08/07
+// Variations (% and NO):
+// 87.938% 99
+// 90.088% 01
+// 92.194% 02
+// 94.961% 03
+// 97.015% 04
ROM_START( atkgld )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ /*
+ 0152152-U86 Series 01 M27v322 MK6USA ALL THE KINGS GOLD BP00AFAC B329-B00D-/ 1E63786A / 3F861679 Copyright © 2001-2007 Aristocrat Technologies Australia Pty Ltd
+ 0152152-U73 Series 01 M27v322 MK6USA ALL THE KINGS GOLD 8860DCF6 0622-ECC9 / 1E09FBAB / 2D898187 Copyright © 2001-2007 Aristocrat Technologies Australia Pty Ltd
+ 0152152-U85 Series 01 M27v322 MK6USA ALL THE KINGS GOLD 17D91490 540B-6C9F / 003E11CB / 1DEF2CE1 Copyright © 2001-2007 Aristocrat Technologies Australia Pty Ltd
+ 0152152-U72 Series 01 M27v322 MK6USA ALL THE KINGS GOLD EC2CF383 952C-3725 / 00378188 / 1ABC1654 Copyright © 2001-2007 Aristocrat Technologies Australia Pty Ltd
+ */
ROM_LOAD32_WORD("0152152.u86", 0x0000000, 0x0400000, CRC(dfd90fc4) SHA1(8881ae3102d87435585d04abd791f3f710cf5ed2) )
ROM_LOAD32_WORD("0152152.u73", 0x0000002, 0x0400000, CRC(01d8e945) SHA1(ed0568a599fe514a8dcba762835831388fede679) )
ROM_LOAD32_WORD("0152152.u85", 0x0800000, 0x0400000, CRC(81f8c412) SHA1(15ace6c1fc36cb7004e7767aea5e30fe8b9acf8b) )
@@ -760,6 +878,12 @@ ROM_START( atkgld )
ROM_END
+// 1005511 / 669
+// Amazon Queen / Local / A - 02/05/01
+// Variations (% and NO):
+// 87.51% 99
+// 89.98% 01
+// 92.03% 02
ROM_START( amzqueen )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -770,6 +894,13 @@ ROM_START( amzqueen )
ROM_END
+// 10299811 / 906
+// Amazon Temple / A - 29/04/09
+// Variations (% and NO):
+// 87.83% 99
+// 90.09% 01
+// 91.89% 02
+// 88.64% 07
ROM_START( amztempl )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -782,6 +913,12 @@ ROM_START( amztempl )
ROM_END
+// 10163211 / 754
+// Antony and Cleopatra / Local / A - 15/01/04
+// Variations (% and NO):
+// 87.93% 99
+// 90.12% 01
+// 91.93% 02
ROM_START( antcleo )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -792,6 +929,10 @@ ROM_START( antcleo )
ROM_END
+// 10177211 / 754
+// Antony and Cleopatra / ASP / B - 12/07/04
+// Variations (% and NO):
+// 87.93% 99
ROM_START( antcleom )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -802,6 +943,15 @@ ROM_START( antcleom )
ROM_END
+// 0151105 / US083
+// Apollo Coffee / USA / A - 11/10/03
+// 'Apollo Coffee Company' on artwork, 'Apollo Coffee' in ROM
+// Variations (% and NO):
+// 87.500% 99
+// 90.202% 01
+// 92.604% 02
+// 94.712% 03
+// 97.414% 04
ROM_START( apocof )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -812,6 +962,12 @@ ROM_START( apocof )
ROM_END
+// 2J008211 / JB009/1
+// Arabian Nights / NSW/ACT / E - 10/12/01
+// Variations (% and NO):
+// 87.99% 99
+// 90.04% 01
+// 92.17% 02
ROM_START( arabnga6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -822,6 +978,14 @@ ROM_START( arabnga6 )
ROM_END
+// 0151356 / JB016/21
+// Arabian Nights / Local / E - 07/06/04
+// Variations (% and NO):
+// 87.938% 99
+// 90.088% 01
+// 92.194% 02
+// 94.961% 03
+// 97.015% 04
ROM_START( arabnga6u )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -832,6 +996,10 @@ ROM_START( arabnga6u )
ROM_END
+// 0151065 / US029
+// ARCTIC WINS CASHMAN / Local / E- 01/27/03
+// Variations (% and NO):
+// 92.378% 99
ROM_START( arwincm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -842,6 +1010,13 @@ ROM_START( arwincm )
ROM_END
+// 0151087 / US057
+// Arishinko / Local / E - 05/28/03
+// Variations (% and NO):
+// 87.455% 99
+// 90.085% 01
+// 92.507% 02
+// 95.433% 03
ROM_START( arish )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -852,6 +1027,13 @@ ROM_START( arish )
ROM_END
+// 0352502 / MV4208
+// Asian Princess / Local / C - 09/13/04
+// Variations (% and NO):
+// 87.536% 99
+// 90.007% 01
+// 92.000% 02
+// 94.797% 03
ROM_START( asnprinc )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -862,6 +1044,11 @@ ROM_START( asnprinc )
ROM_END
+// 20255111 / 850
+// Beaver Bucks / C - 23/01/08
+// Variations (% and NO):
+// 87.74% 99
+// 90.03% 01
ROM_START( beavbuk )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -870,6 +1057,10 @@ ROM_START( beavbuk )
ROM_END
+// 0251064 / US037
+// BETTING ZOO CM / Local / B- 1/28/03
+// Variations (% and NO):
+// 92.411% 99
ROM_START( betzoo )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -880,6 +1071,13 @@ ROM_START( betzoo )
ROM_END
+// 30126911 / 710
+// Big Ben / Local / B - 17/07/03
+// Same date string as earlier version
+// Variations (% and NO):
+// 87.99% 99
+// 90.09% 01
+// 91.90% 02
ROM_START( bigben )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -890,6 +1088,13 @@ ROM_START( bigben )
ROM_END
+// 20126911 / 710
+// Big Ben / Local / B - 17/07/03
+// Early version, has 'Underground' symbol instead of 'Light'
+// Variations (% and NO):
+// 87.99% 99
+// 90.09% 01
+// 91.90% 02
ROM_START( bigbena )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -899,6 +1104,11 @@ ROM_START( bigbena )
ROM_LOAD32_WORD("20126911.u72", 0x0800002, 0x0400000, CRC(d59c8c69) SHA1(b37a3d3061e6209a93e0a5de4a59ea073eedbbb7) )
ROM_END
+
+// 20201111 / 710/3
+// Big Ben / QCOM / C - 09/08/05
+// Variations (% and NO):
+// 87.91% 99
ROM_START( bigbenq )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -908,6 +1118,13 @@ ROM_START( bigbenq )
ROM_LOAD32_WORD("20201111.u72", 0x0800002, 0x0400000, CRC(63f90aad) SHA1(2bbec33552cd3c134c4f66c49181a4b875d9daf0) )
ROM_END
+
+// 10000511 / 637
+// Big Hearted / Local / D - 15/11/99
+// Variations (% and NO):
+// 87.70% 99
+// 90.09% 01
+// 92.08% 02
ROM_START( bigheart )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -916,6 +1133,15 @@ ROM_START( bigheart )
ROM_END
+// 2J009211 / JB015
+// Big Red / NSW/ACT / D - 27/09/02
+// Same date string as earlier version
+// Variations (% and NO):
+// 90.64% 99 (3 line) 90.65% 99 (5 line)
+// 92.44% 01 (3 line) 92.38% 01 (5 line)
+// 93.54% 02 (3 line) 93.56% 02 (5 line)
+// 94.95% 03 (3 line) 94.94% 03 (5 line)
+// 87.92% 05 (3 line) 87.96% 05 (5 line)
ROM_START( bigred )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -926,6 +1152,14 @@ ROM_START( bigred )
ROM_END
+// 1J009211 / JB015
+// Big Red / NSW/ACT / D - 27/09/02
+// Variations (% and NO):
+// 90.64% 99 (3 line) 90.65% 99 (5 line)
+// 92.44% 01 (3 line) 92.38% 01 (5 line)
+// 93.54% 02 (3 line) 93.56% 02 (5 line)
+// 94.95% 03 (3 line) 94.94% 03 (5 line)
+// 87.92% 05 (3 line) 87.96% 05 (5 line)
ROM_START( bigreda )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -936,6 +1170,15 @@ ROM_START( bigreda )
ROM_END
+// 5J011311 / JB024
+// Big Red II / NSW/ACT / B - 18/05/05
+// 'Big Red 2' on artwork, 'Big Red II' in ROM
+// Variations (% and NO):
+// 90.67% 99
+// 92.36% 01
+// 93.66% 02
+// 94.97% 03
+// 88.00% 05
ROM_START( bigred2 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -946,6 +1189,12 @@ ROM_START( bigred2 )
ROM_END
+// 1J009111 / JB024
+// Black Brumby / NSW/ACT / C - 14/06/02
+// Variations (% and NO):
+// 88.00% 99 (10 line) 88.00% 99 (25 line)
+// 90.16% 01 (10 line) 90.11% 01 (25 line)
+// 92.13% 02 (10 line) 92.11% 01 (25 line)
ROM_START( blkbrum )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -956,6 +1205,13 @@ ROM_START( blkbrum )
ROM_END
+// 0152584 / JB024/21
+// Black Mustang / Local / N/A
+// Variations (% and NO):
+// 87.982% 99
+// 90.178% 01
+// 92.197% 02
+// 94.967% 03
ROM_START( blkmust )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -966,6 +1222,11 @@ ROM_START( blkmust )
ROM_END
+// 20259511 / 855
+// Blue Tiger / A - 12/12/07
+// Variations (% and NO):
+// 87.91% 99
+// 90.05% 01
ROM_START( bluetigr )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -976,20 +1237,30 @@ ROM_START( bluetigr )
ROM_END
+// 0352298 / US 243
+// Bob and Dolly / Local / A - 10/15/07
+// US241 / A - 09/18/07 (alternate strings)
+// Variations (% and NO):
+// 82.559% 05 (Reel 1) 82.559% 05 (Reels 1-2) 82.663% 05 (Reels 1-3) 82.726% 05 (Reels 1-4) 82.846% 05 (Reels 1-5)
ROM_START( bobdolly )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("0352298.u21", 0x0000000, 0x0400000, CRC(d3657369) SHA1(621fb20238f10e06c486dfbd6460f94047898a42) )
- ROM_LOAD32_WORD("0352298.u11", 0x0000002, 0x0400000, CRC(8e32da10) SHA1(28a49ecc3bab512e5828c96392d6fa4ff9394a0f) )
- ROM_LOAD32_WORD("0352298.u22", 0x0800000, 0x0400000, CRC(47429081) SHA1(23d996aa522c2f9beadf1fdb7c0584ca939917da) )
- ROM_LOAD32_WORD("0352298.u12", 0x0800002, 0x0400000, CRC(4302ae5e) SHA1(fe1d122093ad9234a7a5337b3a4c2de7fe046822) )
- ROM_LOAD32_WORD("0352298.u23", 0x1000000, 0x0400000, CRC(e73883db) SHA1(6382386ac6f576c739c959cbf6b6df2605496845) )
- ROM_LOAD32_WORD("0352298.u13", 0x1000002, 0x0400000, CRC(a9726ec5) SHA1(cdf78adc3ebcd50e503b2587564493a91b73f578) )
- ROM_LOAD32_WORD("0352298.u24", 0x1800000, 0x0400000, CRC(0f1a6b7c) SHA1(17686829a1a64f6d8982e015067f2d08bcb00402) )
- ROM_LOAD32_WORD("0352298.u14", 0x1800002, 0x0400000, CRC(3646c16d) SHA1(c52fab2e11f39c126bcbbb348750bbf30ff96090) )
+ ROM_LOAD32_WORD("0352298.u11", 0x0000000, 0x0400000, CRC(d3657369) SHA1(621fb20238f10e06c486dfbd6460f94047898a42) )
+ ROM_LOAD32_WORD("0352298.u21", 0x0000002, 0x0400000, CRC(8e32da10) SHA1(28a49ecc3bab512e5828c96392d6fa4ff9394a0f) )
+ ROM_LOAD32_WORD("0352298.u12", 0x0800000, 0x0400000, CRC(47429081) SHA1(23d996aa522c2f9beadf1fdb7c0584ca939917da) )
+ ROM_LOAD32_WORD("0352298.u22", 0x0800002, 0x0400000, CRC(4302ae5e) SHA1(fe1d122093ad9234a7a5337b3a4c2de7fe046822) )
+ ROM_LOAD32_WORD("0352298.u13", 0x1000000, 0x0400000, CRC(e73883db) SHA1(6382386ac6f576c739c959cbf6b6df2605496845) )
+ ROM_LOAD32_WORD("0352298.u23", 0x1000002, 0x0400000, CRC(a9726ec5) SHA1(cdf78adc3ebcd50e503b2587564493a91b73f578) )
+ ROM_LOAD32_WORD("0352298.u14", 0x1800000, 0x0400000, CRC(0f1a6b7c) SHA1(17686829a1a64f6d8982e015067f2d08bcb00402) )
+ ROM_LOAD32_WORD("0352298.u24", 0x1800002, 0x0400000, CRC(3646c16d) SHA1(c52fab2e11f39c126bcbbb348750bbf30ff96090) )
ROM_END
+// 20180311 / 783/1 (9 line) / 783 (20 line)
+// Brazil / Local / B - 25/02/05
+// Variations (% and NO):
+// 87.68% 99
+// 90.00% 99
ROM_START( brazil )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -998,6 +1269,11 @@ ROM_START( brazil )
ROM_END
+// 10173011 / 765
+// Buccaneer / Local / A - 05/04/04
+// Variations (% and NO):
+// 87.87% 99
+// 90.14% 01
ROM_START( bucaneer )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1006,6 +1282,13 @@ ROM_START( bucaneer )
ROM_END
+// 0252523 / MV4229
+// Buccaneer / Local / B - 01/07/05
+// Variations (% and NO):
+// 87.869% 99
+// 90.140% 01
+// 92.154% 02
+// 94.953% 03
ROM_START( bucaneeru )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1014,6 +1297,13 @@ ROM_START( bucaneeru )
ROM_END
+// 10294311 / 897/1
+// The Buck Stops Here / A - 22/07/10
+// Variations (% and NO):
+// 87.87% 99
+// 90.09% 01
+// 88.70% 07
+// 87.09% 09
ROM_START( buckstop )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1024,6 +1314,12 @@ ROM_START( buckstop )
ROM_END
+// 10217811 / 806
+// Buffalo / Local / E - 06/10/06
+// Variations (% and NO):
+// 87.75% 99
+// 90.10% 01
+// 91.90% 02
ROM_START( buffalo )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1034,6 +1330,13 @@ ROM_START( buffalo )
ROM_END
+// 0252636 / MV4328
+// Buffalo / Local / N/A
+// Variations (% and NO):
+// 87.748% 99
+// 90.094% 01
+// 91.897% 02
+// 94.898% 03
ROM_START( buffalou )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1044,6 +1347,14 @@ ROM_START( buffalou )
ROM_END
+// 0351180 / US166
+// Bumble Bugs / USA / A - 05/13/05
+// Variations (% and NO):
+// 87.006% 99
+// 89.962% 01
+// 92.691% 02
+// 94.623% 03
+// 97.020% 04
ROM_START( bmbugs )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1052,6 +1363,13 @@ ROM_START( bmbugs )
ROM_END
+// 10006111 / 673
+// Bush Ranger / Local / A - 18/04/01
+// 'Bushranger' on artwork, 'Bush Ranger' in ROM
+// Variations (% and NO):
+// 87.91% 99
+// 90.13% 01
+// 92.08% 02
ROM_START( bushrngr )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1062,6 +1380,11 @@ ROM_START( bushrngr )
ROM_END
+// 10237711 / 818
+// Cactus Corral / D - 24/07/07
+// Variations (% and NO):
+// 87.81% 99
+// 90.03% 01
ROM_START( cactusco )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1072,6 +1395,11 @@ ROM_START( cactusco )
ROM_END
+// 10256611 / 827
+// Call Of The Wild / B - 12/11/07
+// Variations (% and NO):
+// 87.81% 99
+// 90.01% 01
ROM_START( callwld )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1084,6 +1412,12 @@ ROM_START( callwld )
ROM_END
+// 20197111 / 772/1
+// Calypso King / Local / B - 25/07/05
+// Variations (% and NO):
+// 87.81% 99
+// 90.08% 01
+// 91.84% 02
ROM_START( calyking )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1094,6 +1428,12 @@ ROM_START( calyking )
ROM_END
+// 10218211 / 809
+// Canary Riches / Local / A - 30/03/06
+// Variations (% and NO):
+// 87.68% 99
+// 90.06% 01
+// 91.87% 02
ROM_START( canaryrc )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1102,37 +1442,59 @@ ROM_START( canaryrc )
ROM_END
-/*
- Cashman Tonight
- 4-in-1 game containing African Dusk, Arctic Wins, King Galah and Wild Cougar.
- Arctic Wins is a completely new game, it is not the same version as the original MK4 game.
- Wild Cougar is different to the original in that it has stacked symbols e.g. 3 of the same symbol (except Cougar and Wolf) can show up on the same reel.
- Cashman Tonight has a progressive jackpot unlike the original Mr. Cashman games.
-*/
+// 30194711 / MG0007
+// Cashman Tonight / B - 25/05/05
+// 4-in-1 game containing African Dusk, Arctic Wins, King Galah and Wild Cougar
+// Variations (% and NO):
+// 88/93% 99
+// 90/95% 01
+// African Dusk - 1c / 785 / C - 19/05/05
+// African Dusk - 2c / 785/1 / C - 19/05/05
+// Variations (% and NO):
+// 88.13% 99
+// 90.17% 01
+// Arctic Wins - 1c / 786 / C - 19/05/05
+// Arctic Wins - 2c / 786/1 / C - 19/05/05
+// Arctic Wins is not the same game as the original MK4 title
+// Variations (% and NO):
+// 88.11% 99
+// 90.14% 01
+// King Galah - 1c / 787 / C - 19/05/05
+// King Galah - 2c / 787/1 / C - 19/05/05
+// Variations (% and NO):
+// 87.93% 99
+// 90.23% 01
+// Wild Cougar - 1c / 788 / C - 19/05/05
+// Wild Cougar - 2c / 788/1 / C - 19/05/05
+// Wild Cougar is different to the original in that it has stacked symbols e.g. 3 of the same symbol (except Cougar and Wolf) can show up on the same reel
+// The base game is similar to Mr Woo Moonlight Market
+// Variations (% and NO):
+// 88.13% 99
+// 90.17% 01
ROM_START( cmtonig )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("30194711.u21", 0x0000000, 0x0400000, CRC(e39fdd27) SHA1(b5e391740ba695b09e2ecb169760240f39b6a27a) )
- ROM_LOAD32_WORD("30194711.u11", 0x0000002, 0x0400000, CRC(9defed89) SHA1(0496ee9b378b7117a8cea89c7b3fcca1bae20e64) )
- ROM_LOAD32_WORD("30194711.u22", 0x0800000, 0x0400000, CRC(3c93d700) SHA1(f940d3eff2225fa3470372b7cd8b630511d53843) )
- ROM_LOAD32_WORD("30194711.u12", 0x0800002, 0x0400000, CRC(2a9dd5fd) SHA1(ca484bf494b7431baaadaf7df663ffd84ea07120) )
- ROM_LOAD32_WORD("30194711.u23", 0x1000000, 0x0400000, CRC(1bce542e) SHA1(8dfb78d966ee50d866739f86c6da9b33e09cd108) )
- ROM_LOAD32_WORD("30194711.u13", 0x1000002, 0x0400000, CRC(2cbd3ef8) SHA1(c4a830c9bae7c50276ba951128056292ac09e19d) )
- ROM_LOAD32_WORD("30194711.u24", 0x1800000, 0x0400000, CRC(cb1a9281) SHA1(1de3b988336fb930d636f3bad37d3d5dc359713b) )
- ROM_LOAD32_WORD("30194711.u14", 0x1800002, 0x0400000, CRC(1dbc278e) SHA1(ac48fce5256a04eabd8271de96b300fb7c265927) )
- ROM_LOAD32_WORD("30194711.u25", 0x2000000, 0x0400000, CRC(5f7dd3f8) SHA1(23db92025455b7ab089a990b2f2cab3acb9ab3b5) )
- ROM_LOAD32_WORD("30194711.u15", 0x2000002, 0x0400000, CRC(5e28e9cb) SHA1(e45cce804fe014078d399a04ca68f1a79d2d5f41) )
- ROM_LOAD32_WORD("30194711.u26", 0x2800000, 0x0400000, CRC(6ac1430d) SHA1(a782cdcdd80e59f8f7de9a16559609759eaefb78) )
- ROM_LOAD32_WORD("30194711.u16", 0x2800002, 0x0400000, CRC(b9d91cab) SHA1(0e79c9e02068c47a9ffc7ace70adad2b579d559f) )
- ROM_LOAD32_WORD("30194711.u27", 0x3000000, 0x0400000, CRC(9b69c5ca) SHA1(f13c4355319c6c45316a05f74a561964657990b8) )
- ROM_LOAD32_WORD("30194711.u17", 0x3000002, 0x0400000, CRC(1bf2985c) SHA1(7c037b290983b70efe5f72cb8b8b30e012b53860) )
+ ROM_LOAD32_WORD("30194711.u11", 0x0000000, 0x0400000, CRC(e39fdd27) SHA1(b5e391740ba695b09e2ecb169760240f39b6a27a) )
+ ROM_LOAD32_WORD("30194711.u21", 0x0000002, 0x0400000, CRC(9defed89) SHA1(0496ee9b378b7117a8cea89c7b3fcca1bae20e64) )
+ ROM_LOAD32_WORD("30194711.u12", 0x0800000, 0x0400000, CRC(3c93d700) SHA1(f940d3eff2225fa3470372b7cd8b630511d53843) )
+ ROM_LOAD32_WORD("30194711.u22", 0x0800002, 0x0400000, CRC(2a9dd5fd) SHA1(ca484bf494b7431baaadaf7df663ffd84ea07120) )
+ ROM_LOAD32_WORD("30194711.u13", 0x1000000, 0x0400000, CRC(1bce542e) SHA1(8dfb78d966ee50d866739f86c6da9b33e09cd108) )
+ ROM_LOAD32_WORD("30194711.u23", 0x1000002, 0x0400000, CRC(2cbd3ef8) SHA1(c4a830c9bae7c50276ba951128056292ac09e19d) )
+ ROM_LOAD32_WORD("30194711.u14", 0x1800000, 0x0400000, CRC(cb1a9281) SHA1(1de3b988336fb930d636f3bad37d3d5dc359713b) )
+ ROM_LOAD32_WORD("30194711.u24", 0x1800002, 0x0400000, CRC(1dbc278e) SHA1(ac48fce5256a04eabd8271de96b300fb7c265927) )
+ ROM_LOAD32_WORD("30194711.u15", 0x2000000, 0x0400000, CRC(5f7dd3f8) SHA1(23db92025455b7ab089a990b2f2cab3acb9ab3b5) )
+ ROM_LOAD32_WORD("30194711.u25", 0x2000002, 0x0400000, CRC(5e28e9cb) SHA1(e45cce804fe014078d399a04ca68f1a79d2d5f41) )
+ ROM_LOAD32_WORD("30194711.u16", 0x2800000, 0x0400000, CRC(6ac1430d) SHA1(a782cdcdd80e59f8f7de9a16559609759eaefb78) )
+ ROM_LOAD32_WORD("30194711.u26", 0x2800002, 0x0400000, CRC(b9d91cab) SHA1(0e79c9e02068c47a9ffc7ace70adad2b579d559f) )
+ ROM_LOAD32_WORD("30194711.u17", 0x3000000, 0x0400000, CRC(9b69c5ca) SHA1(f13c4355319c6c45316a05f74a561964657990b8) )
+ ROM_LOAD32_WORD("30194711.u27", 0x3000002, 0x0400000, CRC(1bf2985c) SHA1(7c037b290983b70efe5f72cb8b8b30e012b53860) )
ROM_END
-/*
- Chance In Hell - Lil' Lucy
- The Lil' Lucy character was originally called Lucky Devil in Australia.
-*/
+// 0251125 / US119
+// Chance In Hell / Local / A- 06/30/04
+// Variations (% and NO):
+// 92.475% 99
ROM_START( cinhell )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1145,6 +1507,12 @@ ROM_START( cinhell )
ROM_END
+// 10104011 / 688
+// Choy Sun Doa / Local / A - 23/04/02
+// Variations (% and NO):
+// 87.98% 99
+// 89.95% 01
+// 92.00% 02
ROM_START( csd )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1155,16 +1523,28 @@ ROM_START( csd )
ROM_END
+// 20104011 / 688
+// Choy Sun Doa / Local / A - 23/04/02
+// SHOW PROGRAM
+// Variations (% and NO):
+// 87.98% 99
+// We had no pics of the ROM labels for the Show Program games
+// they probably have some different string in the label but
+// we just append a "sp__" prefix for the moment
ROM_START( csdsp )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("20104011.u86", 0x0000000, 0x0400000, CRC(a60deda0) SHA1(d439f3f0b267d94f88f74052068becadc96fd76e) )
- ROM_LOAD32_WORD("20104011.u73", 0x0000002, 0x0400000, CRC(00dcb4e5) SHA1(d7d32c15bdea0e28e936b87ed7b609e979aae460) )
- ROM_LOAD32_WORD("20104011.u85", 0x0800000, 0x0400000, CRC(fdeb3434) SHA1(df306a2443b46c565040307b61ed97242f4b7280) )
- ROM_LOAD32_WORD("20104011.u72", 0x0800002, 0x0400000, CRC(566792bf) SHA1(843ccbc65020ef87ef67b9d81b864c1d8674b1dd) )
+ ROM_LOAD32_WORD("sp__20104011.u86", 0x0000000, 0x0400000, CRC(a60deda0) SHA1(d439f3f0b267d94f88f74052068becadc96fd76e) )
+ ROM_LOAD32_WORD("sp__20104011.u73", 0x0000002, 0x0400000, CRC(00dcb4e5) SHA1(d7d32c15bdea0e28e936b87ed7b609e979aae460) )
+ ROM_LOAD32_WORD("sp__20104011.u85", 0x0800000, 0x0400000, CRC(fdeb3434) SHA1(df306a2443b46c565040307b61ed97242f4b7280) )
+ ROM_LOAD32_WORD("sp__20104011.u72", 0x0800002, 0x0400000, CRC(566792bf) SHA1(843ccbc65020ef87ef67b9d81b864c1d8674b1dd) )
ROM_END
+// 20131511 / 688
+// Choy Sun Doa / ASP / D - 23/01/03
+// Variations (% and NO):
+// 87.98% 99
ROM_START( csdm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1175,6 +1555,10 @@ ROM_START( csdm )
ROM_END
+// 10121111 / 688
+// Choy Sun Doa / QCOM / C - 05/07/02
+// Variations (% and NO):
+// 87.98% 99
ROM_START( csdq )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1185,6 +1569,10 @@ ROM_START( csdq )
ROM_END
+// 30149511 / 688
+// Choy Sun Doa Cash Express / Local / E - 03/02/03
+// Variations (% and NO):
+// 82.00% 05 (Hyperlink)
ROM_START( csdce )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1197,6 +1585,10 @@ ROM_START( csdce )
ROM_END
+// 20156611 / 688
+// Choy Sun Doa - Jackpot Carnival / QCOM / G - 04/12/03
+// Variations (% and NO):
+// 82.00% 05 (Hyperlink)
ROM_START( csdjc )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1209,6 +1601,12 @@ ROM_START( csdjc )
ROM_END
+// 20212211 / 744/2
+// Choy Sun Returns / Local / B - 15/08/06
+// Variations (% and NO):
+// 88.54% 99
+// 87.88% 01
+// 86.87% 02
ROM_START( csret )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1219,6 +1617,12 @@ ROM_START( csret )
ROM_END
+// 30178311 / 771
+// Corrida De Toros / Local / D - 22/03/05
+// Variations (% and NO):
+// 90.15% 99
+// 92.14% 01
+// 94.12% 02
ROM_START( corrida )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1229,6 +1633,12 @@ ROM_START( corrida )
ROM_END
+// 10144411 / 740
+// Crystal Springs / Local / A - 28/5/03
+// Variations (% and NO):
+// 87.98% 99
+// 90.02% 01
+// 91.86% 02
ROM_START( cryspri )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1237,6 +1647,11 @@ ROM_START( cryspri )
ROM_END
+// 10155811 / 740
+// Crystal Springs / ASP / A - 28/5/03
+// Same date string as parent
+// Variations (% and NO):
+// 87.98% 99
ROM_START( crysprim )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1245,6 +1660,13 @@ ROM_START( crysprim )
ROM_END
+// 0352557 / MV4255
+// Crystal Springs / Local / C - 01/16/06
+// Variations (% and NO):
+// 87.987% 99
+// 90.027% 01
+// 91.864% 02
+// 94.957% 03
ROM_START( cryspriu )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1255,6 +1677,12 @@ ROM_START( cryspriu )
ROM_END
+// 10282311 / JB113/2
+// Deep Freeze / A - 27/02/09
+// Variations (% and NO):
+// 87.92% 99
+// 90.17% 01
+// 88.54% 07
ROM_START( deepfrz )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1267,6 +1695,13 @@ ROM_START( deepfrz )
ROM_END
+// 0154081 / JB113/4
+// Deep Freeze / A - 27/07/09
+// Variations (% and NO):
+// 87.922% 99
+// 90.169% 01
+// 91.863% 02
+// 94.919% 03
ROM_START( deepfrzu )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1277,6 +1712,14 @@ ROM_START( deepfrzu )
ROM_END
+// 0252532 / MV4243
+// Delta Belle / Local / B - 04/29/05
+// Variations (% and NO):
+// 87.812% 99
+// 90.026% 01
+// 91.920% 02
+// 94.365% 03
+// 97.431% 04
ROM_START( deltabel )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1287,6 +1730,12 @@ ROM_START( deltabel )
ROM_END
+// 20185211 / 768
+// Delta Queen / Local / A - 13/09/04
+// Variations (% and NO):
+// 87.80% 99
+// 90.05% 01
+// 91.81% 02
ROM_START( deltaqn )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1297,9 +1746,37 @@ ROM_START( deltaqn )
ROM_END
+// 10229311 / 821
+// Diamonds and Hearts - Power Pay / Local / D - 22/02/07
+// 'Diamonds & Hearts' on artwork, 'Diamonds and Hearts' in ROM
+// Variations (% and NO):
+// 87.51% 99
+// 85.54% 01
+ROM_START( diamhrts )
+ ARISTMK6_BIOS
+ ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ ROM_LOAD32_WORD("10229311.u86", 0x0000000, 0x0400000, CRC(6bffd690) SHA1(35d4f3ef58955bef91aef7b2d3a70af264d9d18d) )
+ ROM_LOAD32_WORD("10229311.u73", 0x0000002, 0x0400000, CRC(70c2c9de) SHA1(ef361bc58eb50b47602d96f0655ad08d3049a449) )
+ROM_END
+
+
+// 0251312 / JB012/20
+// Diamond Eyes / Local / J - 01/22/04
+// Variations (% and NO):
+// 87.893% 99
+// 90.139% 01
+// 92.168% 02
+// 94.957% 03
+// 96.939% 04
ROM_START( dimeye )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ /*
+ 0251312-U86 Series:01 M27V322 Mk6USA Diamond Eyes E6A2D2DA 4B5B-B5BF / 1E6C64C8 / 6FC8B9B6 Copyright © 2003 Aristocrat Technologies, Inc.
+ 0251312-U73 Series:01 M27V322 Mk6USA Diamond Eyes 9F7C25E6 2130-F7C0 / 1DF3CEC2 / 4E417192 Copyright © 2003 Aristocrat Technologies, Inc.
+ 0251312-U85 Series:01 M27V322 Mk6USA Diamond Eyes F1DHFH2H EBC0-3E3F / 13A4E259 / 32F9E1DB Copyright © 2003 Aristocrat Technologies, Inc.
+ 0251312-U72 Series:01 M27V322 Mk6USA Diamond Eyes A578F0D2 84C2-4D3F / 13A0484A / 30D3B780 Copyright © 2003 Aristocrat Technologies, Inc.
+ */
ROM_LOAD32_WORD("0251312.u86", 0x0000000, 0x0400000, CRC(dd6cab00) SHA1(27934d1262e91078c0ed3d12510d1157e7d0774f) )
ROM_LOAD32_WORD("0251312.u73", 0x0000002, 0x0400000, CRC(a0c21ad9) SHA1(689c9fb61fc7864be22b22fbdac295ced28340db) )
ROM_LOAD32_WORD("0251312.u85", 0x0800000, 0x0400000, CRC(ca138b5c) SHA1(e0af5ac82b40f40af0438e4f6ce5d1e8d984d34d) )
@@ -1307,6 +1784,16 @@ ROM_START( dimeye )
ROM_END
+// 0152039 / JB012/20
+// Diamond Eyes / Local / J - 01/22/04
+// Same date string as parent
+// Variations (% and NO):
+// 87.893% 99
+// 90.139% 01
+// 92.168% 02
+// 94.957% 03
+// 96.939% 04
+// 82.160% 05 (Hyperlink)
ROM_START( dimeyece )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1319,6 +1806,12 @@ ROM_START( dimeyece )
ROM_END
+// 10105011 / 679
+// DIAMONDS FOREVER / Local / B - 14/03/02
+// Variations (% and NO):
+// 87.63% 99
+// 89.88% 01
+// 92.06% 02
ROM_START( di4ever )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1327,6 +1820,12 @@ ROM_START( di4ever )
ROM_END
+// 10118811 / 731
+// Dinosaur / Local / C - 08/08/03
+// Variations (% and NO):
+// 97.55% 99
+// 95.10% 01
+// 93.62% 02
ROM_START( dinosa6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1337,9 +1836,23 @@ ROM_START( dinosa6 )
ROM_END
+// 0152082 / US180
+// Double Agent / Local / A - 12/09/05
+// Variations (% and NO):
+// 87.659% 99
+// 90.245% 01
+// 92.723% 02
+// 94.639% 03
+// 97.838% 04
ROM_START( dblagent )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ /*
+ 0152082-U86 Series:01 M27V322 Mk6USA Double Agent L06-1336-04 35CPF15F 2C48-003A / 179518B0 / 6C7A8BFA Copyright © 2005 Aristocrat Technologies, Inc.
+ 0152082-U73 Series:01 M27V322 Mk6USA Double Agent L06-1336-02 FF1526DP BC04-1A32 / 1E3CDC90 / 5176A947 Copyright © 2005 Aristocrat Technologies, Inc.
+ 0152082-U85 Series:01 M27V322 Mk6USA Double Agent L06-1336-03 A3848U83 E867-ACF2 / 0058BA18 / 2B15FDEC Copyright © 2005 Aristocrat Technologies, Inc.
+ 0152082-U72 Series:01 M27V322 Mk6USA Double Agent L06-1336-01 DU643UF8 1D98-3854 / 00514957 / 278684BF Copyright © 2005 Aristocrat Technologies, Inc.
+ */
ROM_LOAD32_WORD("0152082.u86", 0x0000000, 0x0400000, CRC(d081a5f3) SHA1(0adfbdc36b70a26f858d353ee4381e5848d6e499) )
ROM_LOAD32_WORD("0152082.u73", 0x0000002, 0x0400000, CRC(235e2cc8) SHA1(aaf1e71f4cdeb039e3c760031b07d7eb54467742) )
ROM_LOAD32_WORD("0152082.u85", 0x0800000, 0x0400000, CRC(4d482f50) SHA1(8105371d582bcc5a7d0e35f110f394fc491550cf) )
@@ -1347,6 +1860,12 @@ ROM_START( dblagent )
ROM_END
+// 20000211 / 647
+// Double Dolphins / Local / C - 18/04/00
+// Variations (% and NO):
+// 87.97% 99
+// 90.12% 01
+// 92.10% 02
ROM_START( dbldolph )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1357,6 +1876,10 @@ ROM_START( dbldolph )
ROM_END
+// 40003211 / 647
+// Double Dolphins / Local / F - 17/11/00
+// Variations (% and NO):
+// 87.97% 99
ROM_START( dbldolphq )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1367,6 +1890,12 @@ ROM_START( dbldolphq )
ROM_END
+// 10173511 / 761
+// Dragon Lord / Local / A - 22/06/04
+// Variations (% and NO):
+// 87.95% 99
+// 90.13% 01
+// 91.95% 02
ROM_START( drgnlord )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1377,6 +1906,13 @@ ROM_START( drgnlord )
ROM_END
+// 2J015711 / JB051
+// Dragon Magic / Local / E - 05/07/06
+// Variations (% and NO):
+// 87.91% 99
+// 90.08% 01
+// 92.00% 02
+// 94.87% 03
ROM_START( drgnmgic )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1389,6 +1925,11 @@ ROM_START( drgnmgic )
ROM_END
+// 10126721 / 704
+// Dream Catcher / Local / F - 23/06/03
+// Variations (% and NO):
+// 87.51% 99
+// 89.86% 01
ROM_START( drmcatch )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1399,6 +1940,12 @@ ROM_START( drmcatch )
ROM_END
+// 10273811 / JB027/2
+// Dream of the Red Chamber / A - 25/8/08
+// Variations (% and NO):
+// 87.87% 99
+// 90.31% 01
+// 92.26% 02
ROM_START( drmred )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1409,6 +1956,15 @@ ROM_START( drmred )
ROM_END
+// 0151126 / US021
+// Eagle Rock CE / Local / C - 5/25/04
+// Variations (% and NO):
+// 87.813% 99
+// 90.115% 01
+// 92.730% 02
+// 94.720% 03
+// 97.302% 04
+// 82.137% 05 (Hyperlink)
ROM_START( eaglrock )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1419,20 +1975,35 @@ ROM_START( eaglrock )
ROM_END
+// 40289711 / 950
+// Eagle Strike / A - 20/07/10
+// Variations (% and NO):
+// 85.18% 99
+// 87.68% 01
+// 89.18% 02
ROM_START( estrike )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("40289711.u21", 0x0000000, 0x0400000, CRC(71c8121b) SHA1(1a4534b8e43dbc173809b5a621d6796a7a8655cf) )
- ROM_LOAD32_WORD("40289711.u11", 0x0000002, 0x0400000, CRC(94ff83d2) SHA1(54a02cdfb205a429d7458ecb51ba20083306011e) )
- ROM_LOAD32_WORD("40289711.u22", 0x0800000, 0x0400000, CRC(c7430ac8) SHA1(e6f7e523ef2c4aad584a08ce9c70e0e535d89890) )
- ROM_LOAD32_WORD("40289711.u12", 0x0800002, 0x0400000, CRC(4d96aef2) SHA1(40860ad6a0f82d79347b65b182f72dfbec23cd74) )
- ROM_LOAD32_WORD("40289711.u23", 0x1000000, 0x0400000, CRC(664c3d45) SHA1(26ce8a7e88eddc94ecce5ada78654e6f30a985d6) )
- ROM_LOAD32_WORD("40289711.u13", 0x1000002, 0x0400000, CRC(7311d99c) SHA1(802abed830ca3204ce50072ac69d0a3cae8f17e5) )
- ROM_LOAD32_WORD("40289711.u24", 0x1800000, 0x0400000, CRC(d70198eb) SHA1(1e4c157deec921386623091b27180c9c53551f44) )
- ROM_LOAD32_WORD("40289711.u14", 0x1800002, 0x0400000, CRC(b899e64b) SHA1(1f1d800df39de444b03ff4cc85bf4cf073f88423) )
+ ROM_LOAD32_WORD("40289711.u11", 0x0000000, 0x0400000, CRC(71c8121b) SHA1(1a4534b8e43dbc173809b5a621d6796a7a8655cf) )
+ ROM_LOAD32_WORD("40289711.u21", 0x0000002, 0x0400000, CRC(94ff83d2) SHA1(54a02cdfb205a429d7458ecb51ba20083306011e) )
+ ROM_LOAD32_WORD("40289711.u12", 0x0800000, 0x0400000, CRC(c7430ac8) SHA1(e6f7e523ef2c4aad584a08ce9c70e0e535d89890) )
+ ROM_LOAD32_WORD("40289711.u22", 0x0800002, 0x0400000, CRC(4d96aef2) SHA1(40860ad6a0f82d79347b65b182f72dfbec23cd74) )
+ ROM_LOAD32_WORD("40289711.u13", 0x1000000, 0x0400000, CRC(664c3d45) SHA1(26ce8a7e88eddc94ecce5ada78654e6f30a985d6) )
+ ROM_LOAD32_WORD("40289711.u23", 0x1000002, 0x0400000, CRC(7311d99c) SHA1(802abed830ca3204ce50072ac69d0a3cae8f17e5) )
+ ROM_LOAD32_WORD("40289711.u14", 0x1800000, 0x0400000, CRC(d70198eb) SHA1(1e4c157deec921386623091b27180c9c53551f44) )
+ ROM_LOAD32_WORD("40289711.u24", 0x1800002, 0x0400000, CRC(b899e64b) SHA1(1f1d800df39de444b03ff4cc85bf4cf073f88423) )
ROM_END
+// 0151117 / US052
+// EASTER ISLAND / Local / B - 02/22/04
+// Variations (% and NO):
+// 87.773% 99
+// 90.693% 01
+// 92.699% 02
+// 94.839% 03
+// 97.349% 04
+// 82.627% 05 (Hyperlink)
ROM_START( eastland )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1443,6 +2014,11 @@ ROM_START( eastland )
ROM_END
+// 0351149 / US144
+// Eggstreme Riches CM / Local / B - 11/3/05
+// Variations (% and NO):
+// 92.378% 99
+// 92.344% 01
ROM_START( eggsrccm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1453,16 +2029,25 @@ ROM_START( eggsrccm )
ROM_END
+// 0151084
+// Enchanted Forest CE
ROM_START( efce )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
ROM_LOAD32_WORD("0151084.u86", 0x0000000, 0x0400000, NO_DUMP )
ROM_LOAD32_WORD("0151084.u73", 0x0000002, 0x0400000, CRC(d5c600ba) SHA1(e2eb729e29d66ba5614fce1f4bd5a4883b50c499) )
- ROM_LOAD32_WORD("0151084.u85", 0x0800000, 0x00c0000, CRC(95cf5a7b) SHA1(ac5fbd83e2d73a1d6d55736d868c44396371e24e) ) // bad? this seems to contains all the necessary data: maybe it was padded up to 0x0400000 and the padding was cut?
+ ROM_LOAD32_WORD("0151084.u85", 0x0800000, 0x00c0000, BAD_DUMP CRC(95cf5a7b) SHA1(ac5fbd83e2d73a1d6d55736d868c44396371e24e) ) // bad? this seems to contains all the necessary data: maybe it was padded up to 0x0400000 and the padding was cut?
ROM_LOAD32_WORD("0151084.u72", 0x0800002, 0x0400000, CRC(f3ec21f4) SHA1(db9d98fe4788f27c33e84b612632feeea6d944c7) )
- ROM_END
+ROM_END
+// 10257011 / JB041
+// Enchanted Spell / F - 01/05/07
+// B - 18/07/07 (alternate string)
+// Variations (% and NO):
+// 88.00% 99
+// 90.13% 01
+// 92.29% 02
ROM_START( encspell )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1475,6 +2060,13 @@ ROM_START( encspell )
ROM_END
+// 20000711 / 633
+// Enchantress / Local / C- 15/01/00
+// A- 15/01/00 (alternate string)
+// Variations (% and NO):
+// 87.18% 99
+// 90.00% 01
+// 92.20% 02
ROM_START( enchantr )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1483,6 +2075,12 @@ ROM_START( enchantr )
ROM_END
+// 10002011 / 658
+// Eyes of the Tiger / Local / B - 01/06/00
+// Variations (% and NO):
+// 87.85% 99 (9 line) 87.85% 99 (20 line)
+// 89.81% 01 (9 line) 90.04% 01 (20 line)
+// 92.02% 02 (9 line) 92.01% 02 (20 line)
ROM_START( eott )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1493,6 +2091,11 @@ ROM_START( eott )
ROM_END
+// 20184911 / 772
+// Fire Dancer / Local / A - 01/10/04
+// Variations (% and NO):
+// 87.81% 99
+// 90.08% 01
ROM_START( firednc )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1503,6 +2106,15 @@ ROM_START( firednc )
ROM_END
+// 0351025 / MV4091/3
+// Flame of Olympus / USA / A - 2/18/02
+// Variations (% and NO):
+// 87.928% 99
+// 90.511% 01
+// 92.161% 02
+// 94.941% 03
+// 97.325% 04
+// 82.070% 05 (Hyperlink)
ROM_START( flamolce )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1513,6 +2125,16 @@ ROM_START( flamolce )
ROM_END
+// 0251048 / MV4091/3
+// Flame of Olympus / USA / A - 2/18/02
+// Same date string as flamolce
+// Variations (% and NO):
+// 87.928% 99
+// 90.511% 01
+// 92.161% 02
+// 94.941% 03
+// 97.325% 04
+// 82.070% 05 (Hyperlink)
ROM_START( flamoljc )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1523,6 +2145,12 @@ ROM_START( flamoljc )
ROM_END
+// 20001411 / 659
+// Follow the Stars / Local / D - 15/09/00
+// Variations (% and NO):
+// 87.20% 99
+// 90.11% 01
+// 92.15% 02
ROM_START( followst )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1531,6 +2159,11 @@ ROM_START( followst )
ROM_END
+// 10248611 / 847
+// Fortune of Athena / C - 08/11/07
+// Variations (% and NO):
+// 87.94% 99
+// 90.18% 01
ROM_START( fortath )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1541,6 +2174,15 @@ ROM_START( fortath )
ROM_END
+// 0251114 / US112
+// Frog Wild / USA / A - 06/03/04
+// 'Frog Wild 2' on artwork, 'Frog Wild' in ROM
+// Variations (% and NO):
+// 87.654% 99
+// 90.520% 01
+// 92.233% 02
+// 95.261% 03
+// 97.041% 04
ROM_START( frogwld )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1551,6 +2193,11 @@ ROM_START( frogwld )
ROM_END
+// 20197211 / 791
+// Gamblin' Jack / Local / D - 23/09/05
+// Variations (% and NO):
+// 87.99% 99
+// 90.10% 01
ROM_START( gambjack )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1559,6 +2206,13 @@ ROM_START( gambjack )
ROM_END
+// 0452501 / MV4210
+// The Game With No Name / Local / C - 09/13/04
+// Variations (% and NO):
+// 87.834% 99
+// 90.000% 01
+// 91.816% 02
+// 94.584% 03
ROM_START( gwnn )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1569,6 +2223,12 @@ ROM_START( gwnn )
ROM_END
+// 10000811 / 602/18
+// Geisha / Local / B- 13/06/00
+// Variations (% and NO):
+// 87.87% 99
+// 90.31% 01
+// 92.26% 02
ROM_START( geishaa6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1579,6 +2239,15 @@ ROM_START( geishaa6 )
ROM_END
+// 0351033 / MV4091/2
+// Geisha / USA / B - 10/18/01
+// Variations (% and NO):
+// 87.928% 99
+// 90.511% 01
+// 92.161% 02
+// 94.941% 03
+// 97.325% 04
+// 82.070% 05 (Hyperlink)
ROM_START( geishajc )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1589,6 +2258,12 @@ ROM_START( geishajc )
ROM_END
+// 10006211 / 661/2
+// Go Ape / Local / B - 14/06/01
+// Variations (% and NO):
+// 87.16% 99
+// 90.08% 01
+// 92.07% 02
ROM_START( goape )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1597,6 +2272,12 @@ ROM_START( goape )
ROM_END
+// 10003411 / 647/1
+// Go For Green / Local / A - 22/02/01
+// Variations (% and NO):
+// 87.97% 99
+// 90.12% 01
+// 92.10% 02
ROM_START( gogreen )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1607,6 +2288,12 @@ ROM_START( gogreen )
ROM_END
+// 10197411 / 770
+// Golden Archer / Local / A - 07/07/05
+// Variations (% and NO):
+// 87.90% 99
+// 90.10% 01
+// 91.91% 02
ROM_START( goldarch )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1617,6 +2304,13 @@ ROM_START( goldarch )
ROM_END
+// 10158311 / 680/2
+// Golden Fleece / Local / A- 07/07/03
+// 'The Golden Fleece' on artwork, 'Golden Fleece' in ROM
+// Variations (% and NO):
+// 87.70% 99
+// 90.08% 01
+// 92.08% 02
ROM_START( gldnflc )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1627,6 +2321,14 @@ ROM_START( gldnflc )
ROM_END
+// 0152558 / MV4258
+// The Golden Gong / Local / C - 08/18/05
+// Variations (% and NO):
+// 87.979% 99
+// 90.160% 01
+// 91.967% 02
+// 94.930% 03
+// 97.022% 04
ROM_START( gldgong )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1637,6 +2339,10 @@ ROM_START( gldgong )
ROM_END
+// 10217411 / 710/3
+// The Golden Gong / QCOM / C - 09/08/05
+// Variations (% and NO):
+// 87.91% 99
ROM_START( gldgongq )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1645,6 +2351,14 @@ ROM_START( gldgongq )
ROM_END
+// 10174011 / 752
+// Golden Incas / Local / A - 07/04/04
+// SHOW PROGRAM
+// Variations (% and NO):
+// 87.82% 99
+// We had no pics of the ROM labels for the Show Program games
+// they probably have some different string in the label but
+// we just append a "sp__" prefix for the moment
ROM_START( goldinc )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1655,6 +2369,14 @@ ROM_START( goldinc )
ROM_END
+// 0252533 / MV4244
+// Golden Incas / Local / A - 03/10/05
+// Variations (% and NO):
+// 87.862% 99
+// 90.052% 01
+// 91.827% 02
+// 94.659% 03
+// 97.228% 04
ROM_START( goldincu )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1665,6 +2387,10 @@ ROM_START( goldincu )
ROM_END
+// 10130811 / 683/1
+// Golden Pyramids Special Edition / Local / A - 21/10/02
+// Variations (% and NO):
+// 82.05% 05 (Hyperlink)
ROM_START( goldpym )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1675,6 +2401,12 @@ ROM_START( goldpym )
ROM_END
+// 10247811 / 832
+// Golden Samurai / A - 31/07/07
+// Variations (% and NO):
+// 90.67% 99
+// 92.10% 01
+// 93.46% 02
ROM_START( goldsam )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1687,6 +2419,15 @@ ROM_START( goldsam )
ROM_END
+// 0351016 / US023
+// Good, Bad, Money / USA / A - 31/07/07
+// 'The Good, The Bad and The Money' on artwork, 'Good, Bad, Money' in ROM
+// Variations (% and NO):
+// 87.545% 99
+// 90.497% 01
+// 92.545% 02
+// 94.617% 03
+// 97.388% 04
ROM_START( gbmoney )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1697,6 +2438,12 @@ ROM_START( gbmoney )
ROM_END
+// 10214711 / 780
+// Grizzly / Local / C - 12/04/06
+// Variations (% and NO):
+// 87.93% 99
+// 90.11% 01
+// 91.83% 02
ROM_START( grizzly )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1709,6 +2456,12 @@ ROM_START( grizzly )
ROM_END
+// 20169511 / 717/2
+// Heart of Gold / Local / A - 15/09/03
+// Variations (% and NO):
+// 87.58% 99
+// 90.03% 01
+// 92.11% 02
ROM_START( heartgld )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1719,6 +2472,11 @@ ROM_START( heartgld )
ROM_END
+// 10232911 / 717/4
+// Heart of Vegas / Local / C - 27/06/06
+// Variations (% and NO):
+// 87.90% 99
+// 90.07% 01
ROM_START( heartveg )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1727,6 +2485,12 @@ ROM_START( heartveg )
ROM_END
+// 1J008311 / JB001/4
+// Helen of Troy / NSW/ACT / G - 21/01/02
+// Variations (% and NO):
+// 87.93% 99
+// 90.05% 01
+// 92.23% 02
ROM_START( hlntroy )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1737,9 +2501,23 @@ ROM_START( hlntroy )
ROM_END
+// 0151336 / JB014/21
+// Helen of Troy / Local / B - 01/16/04
+// Variations (% and NO):
+// 87.982% 99
+// 90.178% 01
+// 92.197% 02
+// 94.967% 03
+// 96.957% 04
ROM_START( hlntroyu )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ /*
+ 0151336-U86 Series:01 M27V322 Mk6USA Helen Of Troy L04-1236-01 C2818H02 1A6B-E271 / 1E5A6BCE / 4E4C29DF Copyright © 2003 Aristocrat Technologies, Inc.
+ 0151336-U73 Series:01 M27V322 Mk6USA Helen Of Troy L04-1236-02 F8DPDAFU 74DC-01AA / 1DEE7249 / 34321C36 Copyright © 2003 Aristocrat Technologies, Inc.
+ 0151336-U85 Series:01 M27V322 Mk6USA Helen Of Troy L04-1236-03 B361D4F0 EB5C-6E4E / 083BEB5D / 1C75EC0A Copyright © 2003 Aristocrat Technologies, Inc.
+ 0151336-U72 Series:01 M27V322 Mk6USA Helen Of Troy L04-1236-04 16DH7PB7 2924-7CB1 / 08295E8C / 16A62338 Copyright © 2003 Aristocrat Technologies, Inc.
+ */
ROM_LOAD32_WORD("0151336.u86", 0x0000000, 0x0400000, CRC(7100841d) SHA1(67fa5616ca0bb2b25ed2951d3decf0126e0bac82) )
ROM_LOAD32_WORD("0151336.u73", 0x0000002, 0x0400000, CRC(aebf8e8e) SHA1(22b28883c4ea365c07b6c4ae2fe3c873be158685) )
ROM_LOAD32_WORD("0151336.u85", 0x0800000, 0x0400000, CRC(4c82ed24) SHA1(455ac96a92b383cb7e2391e92e528c3b4e51f5cc) )
@@ -1747,6 +2525,12 @@ ROM_START( hlntroyu )
ROM_END
+// 20004111 / 671
+// High Noon / Local / B - 28/06/01
+// Variations (% and NO):
+// 87.20% 99
+// 90.00% 01
+// 92.05% 02
ROM_START( highnoon )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1757,6 +2541,12 @@ ROM_START( highnoon )
ROM_END
+// 10100511 / 670/1
+// Hollywood Dreams / Local / A - 31/01/02
+// Variations (% and NO):
+// 87.89% 99
+// 90.14% 01
+// 92.15% 02
ROM_START( holdrma )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1767,6 +2557,11 @@ ROM_START( holdrma )
ROM_END
+// 10200311 / 765
+// HOUSE OF HEARTS / Local / C - 09/11/04
+// Variations (% and NO):
+// 87.87% 99
+// 90.14% 01
ROM_START( househrt )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1775,6 +2570,12 @@ ROM_START( househrt )
ROM_END
+// 20190711 / 784
+// Inca Chief / Local / C - 21/10/05
+// Variations (% and NO):
+// 87.82% 99
+// 90.11% 01
+// 91.84% 02
ROM_START( incachf )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1785,6 +2586,12 @@ ROM_START( incachf )
ROM_END
+// 10004211 / 628/6
+// Indian Dreaming / Local / B - 24/04/01
+// Variations (% and NO):
+// 87.15% 99
+// 90.14% 02
+// 92.32% 03
ROM_START( indream )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1795,6 +2602,10 @@ ROM_START( indream )
ROM_END
+// 20109411 / 628/10
+// Indian Dreaming / Local / A - 12/07/02
+// Variations (% and NO):
+// 82.11% 99 (Hyperlink)
ROM_START( indremce )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1805,9 +2616,24 @@ ROM_START( indremce )
ROM_END
+// 20151911 / 742
+// Indian Dreaming (Lady Luck) / Local / C - 15/10/03
+// Variations (% and NO):
+// 88.61% 99
+// 87.56% 01
+// 86.70% 02
+// 86.03% 03
ROM_START( indremll )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ /*
+ 20151911 NSW INDIAN DREAMING- LL 742 4MB 6 eproms Aristocrat © 2005 P U86
+ 20151911 NSW INDIAN DREAMING- LL 742 4MB 6 eproms Aristocrat © 2005 P U73
+ 20151911 NSW INDIAN DREAMING- LL 742 4MB 6 eproms Aristocrat © 2005 P U85
+ 20151911 NSW INDIAN DREAMING- LL 742 4MB 6 eproms Aristocrat © 2005 P U72
+ 20151911 NSW INDIAN DREAMING- LL 742 4MB 6 eproms Aristocrat © 2005 P U84
+ 20151911 NSW INDIAN DREAMING- LL 742 4MB 6 eproms Aristocrat © 2005 P U71
+ */
ROM_LOAD32_WORD("20151911.u86", 0x0000000, 0x0400000, CRC(81144634) SHA1(3352bc272da29706d3913e65e0eccfd597628239) )
ROM_LOAD32_WORD("20151911.u73", 0x0000002, 0x0400000, CRC(ae6590eb) SHA1(d26d4c1612a466a4d67ca51cf6df2c38da88cd0c) )
ROM_LOAD32_WORD("20151911.u85", 0x0800000, 0x0400000, CRC(d5b64886) SHA1(07b2e2c35e1a71d5c6b5687452f3debee1128632) )
@@ -1817,6 +2643,12 @@ ROM_START( indremll )
ROM_END
+// 10150611 / 753
+// Indian Dreaming 2nd Chance / Local / B - 08/12/03
+// Variations (% and NO):
+// 93.84% 99
+// 91.81% 01
+// 89.82% 02
ROM_START( indrem2c )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1827,6 +2659,10 @@ ROM_START( indrem2c )
ROM_END
+// 10130711 / 628/12
+// Indian Dreaming / Local / A - 17/01/03
+// Variations (% and NO):
+// 82.11% 99 (Hyperlink)
ROM_START( indremmm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1837,6 +2673,10 @@ ROM_START( indremmm )
ROM_END
+// 10102511 / 674/1
+// INDIAN GOLD (MR. CASHMAN) / Local / A- 21/11/01
+// Variations (% and NO):
+// 87.20% 99
ROM_START( indgldcm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1847,6 +2687,12 @@ ROM_START( indgldcm )
ROM_END
+// 10174111 / 764
+// Indian Princess / Local / A - 07/04/04
+// Variations (% and NO):
+// 87.94% 99
+// 90.17% 01
+// 91.98% 02
ROM_START( indprncs )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1857,6 +2703,12 @@ ROM_START( indprncs )
ROM_END
+// 10125611 / 716
+// Jailbreak / Local / A - 14/11/02
+// Variations (% and NO):
+// 87.86% 99
+// 89.84% 01
+// 92.05% 02
ROM_START( jailbrk )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1867,6 +2719,11 @@ ROM_START( jailbrk )
ROM_END
+// 0351068 / US041
+// Foxworthy Redneck / Local / B - 06/13/03
+// 'You Might Be A Redneck If...' on artwork, 'Foxworthy Recneck' in ROM
+// Variations (% and NO):
+// 92.395% 99
ROM_START( jefffox )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1877,6 +2734,11 @@ ROM_START( jefffox )
ROM_END
+// 0151051 / US039
+// Jewel Enchant CM / Local / B- 1/24/03
+// 'Jewel of the Enchantress' on artwork, 'Jewel Enchant CM' in ROM
+// Variations (% and NO):
+// 92.395% 99
ROM_START( jewelcm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1887,6 +2749,12 @@ ROM_START( jewelcm )
ROM_END
+// 20189111 / 789
+// King Neptune / Local / E - 08/08/05
+// Variations (% and NO):
+// 87.99% 99
+// 90.20% 01
+// 91.99% 02
ROM_START( kingnep )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1897,6 +2765,12 @@ ROM_START( kingnep )
ROM_END
+// 30106331 / 687
+// King of The Nile / Local / D - 07/01/03
+// Variations (% and NO):
+// 99.38% 99
+// 97.13% 01
+// 94.36% 02
ROM_START( kingnile )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1907,6 +2781,10 @@ ROM_START( kingnile )
ROM_END
+// 20106321 / 687
+// King of The Nile / Local / C - 27/09/02
+// Variations (% and NO):
+// 87.53% 99
ROM_START( kingnilea )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1917,6 +2795,10 @@ ROM_START( kingnilea )
ROM_END
+// 20109021 / 696
+// King Penguin / Local / D- 02/10/02
+// Variations (% and NO):
+// 87.54% 99
ROM_START( kingpeng )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1927,16 +2809,32 @@ ROM_START( kingpeng )
ROM_END
+// 40109021 / 696
+// King Penguin / Local / E- 26/11/02
+// SHOW PROGRAM
+// Variations (% and NO):
+// 87.54% 99
+// We had no pics of the ROM labels for the Show Program games
+// they probably have some different string in the label but
+// we just append a "sp__" prefix for the moment
ROM_START( kingpengsp )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("40109021.u86", 0x0000000, 0x0400000, CRC(077635b9) SHA1(3d17892df4a068701be1ac649f448e10b8c52ebd) )
- ROM_LOAD32_WORD("40109021.u73", 0x0000002, 0x0400000, CRC(ac8e7dc1) SHA1(b317107cda37c6148e84237fdc76f2c2abf4d743) )
- ROM_LOAD32_WORD("40109021.u85", 0x0800000, 0x0400000, CRC(f81ac65b) SHA1(0833960ce8b1e883c033c92a8121cc89bac6f64c) )
- ROM_LOAD32_WORD("40109021.u72", 0x0800002, 0x0400000, CRC(44854b6b) SHA1(eae87ea7a6d4ade8de5ea7a3614d7e3183ec0af3) )
+ ROM_LOAD32_WORD("sp__40109021.u86", 0x0000000, 0x0400000, CRC(077635b9) SHA1(3d17892df4a068701be1ac649f448e10b8c52ebd) )
+ ROM_LOAD32_WORD("sp__40109021.u73", 0x0000002, 0x0400000, CRC(ac8e7dc1) SHA1(b317107cda37c6148e84237fdc76f2c2abf4d743) )
+ ROM_LOAD32_WORD("sp__40109021.u85", 0x0800000, 0x0400000, CRC(f81ac65b) SHA1(0833960ce8b1e883c033c92a8121cc89bac6f64c) )
+ ROM_LOAD32_WORD("sp__40109021.u72", 0x0800002, 0x0400000, CRC(44854b6b) SHA1(eae87ea7a6d4ade8de5ea7a3614d7e3183ec0af3) )
ROM_END
+// 30001011 / 643/6
+// Koala Mint / Local / A- 01/09/00
+// Variations (% and NO):
+// 90.15% 99
+// 87.71% 01
+// 92.07% 02
+// 94.95% 03
+// 93.56% 04
ROM_START( koalama6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1947,6 +2845,12 @@ ROM_START( koalama6 )
ROM_END
+// 10136711 / 602/21
+// Kohinoor / Local / B - 10/02/03
+// Variations (% and NO):
+// 87.93% 99
+// 90.08% 01
+// 92.09% 02
ROM_START( kohinoor )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1957,6 +2861,11 @@ ROM_START( kohinoor )
ROM_END
+// 10220111 / 756
+// Let's Go Fish'n / Local / E - 23/05/06
+// Variations (% and NO):
+// 87.95% 99
+// 90.08% 01
ROM_START( lgfish )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1969,6 +2878,15 @@ ROM_START( lgfish )
ROM_END
+// 0151115 / US088
+// Let Em Roll / Local / B - 06/24/04
+// 'Let 'em Roll' on artwork, 'Let Em Roll' in ROM
+// Variations (% and NO):
+// 87.581% 99 (9 line) 87.660% 99 (20 line)
+// 90.540% 01 (9 line) 90.494% 01 (20 line)
+// 92.424% 02 (9 line) 92.468% 02 (20 line)
+// 95.368% 03 (9 line) 95.317% 03 (20 line)
+// 97.127% 04 (9 line) 97.300% 04 (20 line)
ROM_START( lemrol )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1979,6 +2897,15 @@ ROM_START( lemrol )
ROM_END
+// 0252534 / MV4245
+// Line King / Local / F - 11/10/05
+// MV4245/1 / E - 11/10/05 (alternate strings)
+// Variations (% and NO):
+// 87.857% 99
+// 90.510% 01
+// 92.110% 02
+// 94.711% 03
+// 97.031% 04
ROM_START( lineking )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1989,6 +2916,12 @@ ROM_START( lineking )
ROM_END
+// 30111211 / 685
+// Lord Leopard / Local / B - 27/05/02
+// Variations (% and NO):
+// 87.78% 99
+// 90.05% 01
+// 92.05% 02
ROM_START( lordleo )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1999,6 +2932,10 @@ ROM_START( lordleo )
ROM_END
+// 20006911 / 674
+// LOUIE'S GOLD (MR. CASHMAN) / Local / C- 13/07/01
+// Variations (% and NO):
+// 87.20% 99
ROM_START( lougcm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2009,6 +2946,13 @@ ROM_START( lougcm )
ROM_END
+// 0152583 / MV4285
+// Love Stuck / Local / N/A
+// Variations (% and NO):
+// 87.666% 99
+// 90.185% 01
+// 91.970% 02
+// 94.972% 03
ROM_START( lovestuk )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2017,6 +2961,13 @@ ROM_START( lovestuk )
ROM_END
+// 10241411 / 840
+// Lucky88 / C - 25/06/07
+// 'Lucky 88' on artwork, 'Lucky88' in ROM
+// Variations (% and NO):
+// 87.01% 99
+// 87.98% 01
+// 86.04% 02
ROM_START( lucky88 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2029,6 +2980,12 @@ ROM_START( lucky88 )
ROM_END
+// 10235411 / 822
+// Luigi's Ball / NSW / D - 19/03/07
+// Variations (% and NO):
+// 87.85% 99
+// 90.01% 01
+// 91.98% 02
ROM_START( luigibal )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2041,6 +2998,14 @@ ROM_START( luigibal )
ROM_END
+// 0151139 / US141
+// Magic Forest / Local / D - 02/01/05
+// Variations (% and NO):
+// 87.660% 99
+// 90.170% 01
+// 91.960% 02
+// 94.850% 03
+// 97.500% 04
ROM_START( magforst )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2051,6 +3016,15 @@ ROM_START( magforst )
ROM_END
+// 0251331 / JB013/20
+// Magic Mermaid / Local / F - 10/13/03
+// JB013/21 / B - 02/04/04 (alternate strings)
+// Variations (% and NO):
+// 87.994% 99
+// 90.099% 01
+// 92.185% 02
+// 94.956% 03
+// 97.001% 04
ROM_START( magmerm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2061,6 +3035,13 @@ ROM_START( magmerm )
ROM_END
+// 20210111 / 801
+// Magician / Local / C - 01/03/06
+// 'The Magician' on artwork, 'Magician' in ROM
+// Variations (% and NO):
+// 88.20% 99
+// 90.16% 01
+// 92.14% 02
ROM_START( magician )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2073,6 +3054,13 @@ ROM_START( magician )
ROM_END
+// 0152162 / US217
+// Meteor Storm / USA / A - 03/19/07
+// Variations (% and NO):
+// 87.977% 99
+// 90.041% 01
+// 92.090% 02
+// 94.905% 03
ROM_START( metestrm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2083,6 +3071,11 @@ ROM_START( metestrm )
ROM_END
+// 10251911 / 816
+// Milkin' It / B - 13/08/07
+// Variations (% and NO):
+// 87.95% 99
+// 90.17% 01
ROM_START( milkin )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2095,6 +3088,11 @@ ROM_START( milkin )
ROM_END
+// 10216611 / 778
+// Miss Kitty / NSW / C - 18/04/05
+// Variations (% and NO):
+// 87.57% 99
+// 90.19% 01
ROM_START( mskitty )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2105,6 +3103,12 @@ ROM_START( mskitty )
ROM_END
+// 10001211 / 657
+// Money Tree / Local / E - 06/11/00
+// Variations (% and NO):
+// 87.88% 99
+// 90.01% 01
+// 92.45% 02
ROM_START( mnytree )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2115,6 +3119,10 @@ ROM_START( mnytree )
ROM_END
+// 30164211 / 628/3
+// Moon Fire Jackpot Carnival / QCOM / E - 27/01/04
+// Variations (% and NO):
+// 82.05% 99 (Hyperlink)
ROM_START( moonfire )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2125,6 +3133,11 @@ ROM_START( moonfire )
ROM_END
+// 10227611 / 814/1
+// Moonlight Waltz / B - 11/01/07
+// Variations (% and NO):
+// 87.99% 99
+// 90.03% 01
ROM_START( moonwalt )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2135,9 +3148,21 @@ ROM_START( moonwalt )
ROM_END
+// 20248711 / 844
+// More Chilli / A - 17/07/07
+// Variations (% and NO):
+// 86.96% 99
+// 87.89% 01
+// 85.95% 02
ROM_START( mchilli )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ /*
+ 20248711 NSW MORE CHILLI 844 4MB 4 eproms Aristocrat © 2007 P U86
+ 20248711 NSW MORE CHILLI 844 4MB 4 eproms Aristocrat © 2007 P U73
+ 20248711 NSW MORE CHILLI 844 4MB 4 eproms Aristocrat © 2007 P U85
+ 20248711 NSW MORE CHILLI 844 4MB 4 eproms Aristocrat © 2007 P U72
+ */
ROM_LOAD32_WORD("20248711.u86", 0x0000000, 0x0400000, CRC(1f5207d7) SHA1(73c3742a94962a66df7af6eff660f90e7e22e344) )
ROM_LOAD32_WORD("20248711.u73", 0x0000002, 0x0400000, CRC(da883738) SHA1(74f5cdb7b388dec17a0e4d8a04c2107bd07c3ad7) )
ROM_LOAD32_WORD("20248711.u85", 0x0800000, 0x0400000, CRC(ac11dab3) SHA1(3a201a5e239b10dcdd23aed3b0d724146f2fcf68) )
@@ -2145,6 +3170,10 @@ ROM_START( mchilli )
ROM_END
+// 20289311 / 844/2
+// More Chilli / B - 14/12/10
+// Variations (% and NO):
+// 86.00% 99
ROM_START( mchilliq )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2155,6 +3184,10 @@ ROM_START( mchilliq )
ROM_END
+// 0252599 / MV4276
+// MR WOO / Local / N/A
+// Variations (% and NO):
+// 80.314% 99
ROM_START( mrwoo )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2169,6 +3202,18 @@ ROM_START( mrwoo )
ROM_END
+// 0151009 / US005
+// Mystic Arrow / Local / A - 01/07/02
+// Variations (% and NO):
+// 87.085% 99 (untested, variations above 04 may not be valid)
+// 90.041% 01
+// 92.081% 02
+// 94.918% 03
+// 97.022% 04
+// 82.070% 05
+// 85.070% 06
+// 88.480% 07
+// 90.510% 08
ROM_START( mystarr )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2179,6 +3224,10 @@ ROM_START( mystarr )
ROM_END
+// 10008111 / 675
+// MYSTIC EYES (MR. CASHMAN) / Local / A- 09/05/01
+// Variations (% and NO):
+// 87.56% 99
ROM_START( mysteycm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2189,6 +3238,10 @@ ROM_START( mysteycm )
ROM_END
+// 0251024 / US020
+// MYSTIC EYES CM / Local / C- 31/05/02
+// Variations (% and NO):
+// 92.395% 99
ROM_START( mysteycmu )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2199,6 +3252,12 @@ ROM_START( mysteycmu )
ROM_END
+// 1J008711 / JB013
+// Mystic Mermaid / NSW/ACT / D - 27/03/02
+// Variations (% and NO):
+// 87.99% 99
+// 90.10% 01
+// 92.18% 02
ROM_START( mystmerm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2209,6 +3268,11 @@ ROM_START( mystmerm )
ROM_END
+// 10197311 / 778
+// Nerds Gone Wild / Local / C - 18/04/05
+// Variations (% and NO):
+// 87.57% 99
+// 90.19% 01
ROM_START( nerdwild )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2217,6 +3281,8 @@ ROM_START( nerdwild )
ROM_END
+// 0351309
+// Open Sesame
ROM_START( opsesam )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2227,6 +3293,12 @@ ROM_START( opsesam )
ROM_END
+// 10213511 / 808
+// Oriental Beauty / Local / A - 07/02/06
+// Variations (% and NO):
+// 87.71% 99
+// 90.17% 01
+// 91.96% 02
ROM_START( orbeaut )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2235,20 +3307,37 @@ ROM_START( orbeaut )
ROM_END
+// 20195211 / 691
+// Outback Jack / Local / J - 02/06/05
+// Variations (% and NO):
+// 87.79% 99
+// 85.72% 01
ROM_START( outbackj )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("20195211.u21", 0x0000000, 0x0400000, CRC(8eea3cea) SHA1(b2353fc953f6daf03c1458e06006de31fdd7a7c3) )
- ROM_LOAD32_WORD("20195211.u11", 0x0000002, 0x0400000, CRC(972eaba2) SHA1(b927aac04e21922b995aa2587a76ef14c35cd2bd) )
- ROM_LOAD32_WORD("20195211.u22", 0x0800000, 0x0400000, CRC(a1853f27) SHA1(cd2bf8674555f6870f0689ca0adbca6890bc9b27) )
- ROM_LOAD32_WORD("20195211.u12", 0x0800002, 0x0400000, CRC(cdd28848) SHA1(0038bb422a1d650beaa0ffd63b7d6de1936a5e32) )
- ROM_LOAD32_WORD("20195211.u23", 0x1000000, 0x0400000, CRC(0cd41b5d) SHA1(a7891da788fe88d2191b2f0686cb9ca2ecfeeb9c) )
- ROM_LOAD32_WORD("20195211.u13", 0x1000002, 0x0400000, CRC(23f1f50c) SHA1(40145b839c2b5fde5c0f20e08f46f5a859b6e20a) )
- ROM_LOAD32_WORD("20195211.u24", 0x1800000, 0x0400000, CRC(79ca67a1) SHA1(68bae23df71c768dc17631f6ccfc7a720c0959ee) )
- ROM_LOAD32_WORD("20195211.u14", 0x1800002, 0x0400000, CRC(3a0ea3ca) SHA1(88513130013b1b18772a5e538da9a8db3a54633e) )
+ ROM_LOAD32_WORD("20195211.u11", 0x0000000, 0x0400000, CRC(8eea3cea) SHA1(b2353fc953f6daf03c1458e06006de31fdd7a7c3) )
+ ROM_LOAD32_WORD("20195211.u21", 0x0000002, 0x0400000, CRC(972eaba2) SHA1(b927aac04e21922b995aa2587a76ef14c35cd2bd) )
+ ROM_LOAD32_WORD("20195211.u12", 0x0800000, 0x0400000, CRC(a1853f27) SHA1(cd2bf8674555f6870f0689ca0adbca6890bc9b27) )
+ ROM_LOAD32_WORD("20195211.u22", 0x0800002, 0x0400000, CRC(cdd28848) SHA1(0038bb422a1d650beaa0ffd63b7d6de1936a5e32) )
+ ROM_LOAD32_WORD("20195211.u13", 0x1000000, 0x0400000, CRC(0cd41b5d) SHA1(a7891da788fe88d2191b2f0686cb9ca2ecfeeb9c) )
+ ROM_LOAD32_WORD("20195211.u23", 0x1000002, 0x0400000, CRC(23f1f50c) SHA1(40145b839c2b5fde5c0f20e08f46f5a859b6e20a) )
+ ROM_LOAD32_WORD("20195211.u14", 0x1800000, 0x0400000, CRC(79ca67a1) SHA1(68bae23df71c768dc17631f6ccfc7a720c0959ee) )
+ ROM_LOAD32_WORD("20195211.u24", 0x1800002, 0x0400000, CRC(3a0ea3ca) SHA1(88513130013b1b18772a5e538da9a8db3a54633e) )
ROM_END
+// 10008711 / 594/9
+// OWL CAPONE / Local / A - 12/06/01
+// SHOW PROGRAM
+// Variations (% and NO):
+// 90.10% 99
+// 92.04% 01
+// 95.03% 02
+// 87.77% 05
+// 93.45% 09
+// We had no pics of the ROM labels for the Show Program games
+// they probably have some different string in the label but
+// we just append a "sp__" prefix for the moment
ROM_START( owlcap )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2259,6 +3348,10 @@ ROM_START( owlcap )
ROM_END
+// 0151109 / US092
+// PANDA PAYS CM / Local / A - 01/27/04
+// Variations (% and NO):
+// 92.397% 99
ROM_START( pandpays )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2269,6 +3362,12 @@ ROM_START( pandpays )
ROM_END
+// 30002611 / 670
+// Paris Lights / Local / A - 03/05/01
+// Variations (% and NO):
+// 87.89% 99
+// 90.14% 01
+// 92.15% 02
ROM_START( parislgt )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2279,6 +3378,15 @@ ROM_START( parislgt )
ROM_END
+// 0251031 / US022
+// Paris Lights JC / Local / A - 07/03/02
+// Variations (% and NO):
+// 87.893% 99
+// 90.143% 01
+// 92.151% 02
+// 94.832% 03
+// 97.180% 04
+// 82.703% 05 (Hyperlink)
ROM_START( parislgtu )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2289,6 +3397,12 @@ ROM_START( parislgtu )
ROM_END
+// 1J008811 / JB014
+// Peacock Magic / NSW/ACT / B - 09/05/02
+// Variations (% and NO):
+// 88.01% 99
+// 90.04% 01
+// 92.18% 02
ROM_START( pcockmag )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2299,6 +3413,14 @@ ROM_START( pcockmag )
ROM_END
+// 0151352 / JB014/20
+// Peacock Magic / Local / C - 07/06/04
+// Variations (% and NO):
+// 87.982% 99
+// 90.178% 01
+// 92.197% 02
+// 94.967% 03
+// 96.957% 04
ROM_START( pcockmagu )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2309,6 +3431,12 @@ ROM_START( pcockmagu )
ROM_END
+// 10177511 / 778
+// Pelican Pete / Local / A - 22/11/04
+// Variations (% and NO):
+// 87.57% 99
+// 90.19% 01
+// 91.83% 02
ROM_START( pelipete )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2319,6 +3447,10 @@ ROM_START( pelipete )
ROM_END
+// 10226711 / 778/2
+// Pelican Pete - Jackpot Carnival / QCOM / E - 23/05/06
+// Variations (% and NO):
+// 82.08% 05 (Hyperlink)
ROM_START( pelipetejc )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2329,9 +3461,24 @@ ROM_START( pelipetejc )
ROM_END
+// 0252555 / MV4251
+// Pelican Pete / Local / C - 11/07/05
+// Variations (% and NO):
+// 87.569% 99 (1 credit buys 2 lines) 87.689% 99 (1 credit buys 1 line)
+// 90.192% 01 (1 credit buys 2 lines) 89.913% 01 (1 credit buys 1 line)
+// 91.832% 02 (1 credit buys 2 lines) 91.657% 02 (1 credit buys 1 line)
+// 95.416% 03 (1 credit buys 2 lines) 94.765% 03 (1 credit buys 1 line)
+// 96.645% 04 (1 credit buys 1 line)
+// Untested variations, verification needed
ROM_START( pelipeteu )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ /*
+ 0252555-U86 Series 01 M27v322 MK6USA PELICAN PETE 4P254783 147F-9E71 / 1F093B1F / 8E6FCEA6 Copyright © 2004-2005 Aristocrat Technologies Inc
+ 0252555-U73 Series 01 M27v322 MK6USA PELICAN PETE 462HAA2P 5871-985A / 1EF0B748 / 89FDD7A0 Copyright © 2004-2005 Aristocrat Technologies Inc
+ 0252555-U85 Series 01 M27v322 MK6USA PELICAN PETE 25F5BC28 C4EC-940A / 12EACB48 / 80709B7B Copyright © 2004-2005 Aristocrat Technologies Inc
+ 0252555-U72 Series 01 M27v322 MK6USA PELICAN PETE 55AF426A 5053-B8C9 / 12C0F94B / 74E69221 Copyright © 2004-2005 Aristocrat Technologies Inc
+ */
ROM_LOAD32_WORD("0252555.u86", 0x0000000, 0x0400000, CRC(dea78964) SHA1(857e5f1deb8db3d861ea7fe78e44a8e17cc791aa) )
ROM_LOAD32_WORD("0252555.u73", 0x0000002, 0x0400000, CRC(44d5e0af) SHA1(1693e641ddc5d4174e4e0dc07cb79e54045aaad3) )
ROM_LOAD32_WORD("0252555.u85", 0x0800000, 0x0400000, CRC(781e076d) SHA1(0c7d2281598822ea45f37b2afd5f12d9afe2d01a) )
@@ -2339,6 +3486,14 @@ ROM_START( pelipeteu )
ROM_END
+// 0251169 / US159
+// Penny Arcade (NGCB) / Local / A - 04/06/05
+// Variations (% and NO):
+// 87.269% 99 (Reel 1) 87.269% 99 (Reels 1-2) 87.804% 99 (Reels 1-3) 87.814% 99 (Reels 1-4) 87.966% 99 (Reels 1-5)
+// 90.059% 01 (Reel 1) 90.141% 01 (Reels 1-2) 90.271% 01 (Reels 1-3) 90.331% 01 (Reels 1-4) 90.441% 01 (Reels 1-5)
+// 92.428% 02 (Reel 1) 92.511% 02 (Reels 1-2) 92.641% 02 (Reels 1-3) 92.846% 02 (Reels 1-4) 92.874% 02 (Reels 1-5)
+// 95.060% 03 (Reel 1) 95.142% 03 (Reels 1-2) 95.560% 03 (Reels 1-3) 95.585% 03 (Reels 1-4) 95.678% 03 (Reels 1-5)
+// 97.200% 04 (Reel 1) 97.282% 04 (Reels 1-2) 97.550% 04 (Reels 1-3) 97.593% 04 (Reels 1-4) 97.676% 04 (Reels 1-5)
ROM_START( pennyar )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2349,6 +3504,16 @@ ROM_START( pennyar )
ROM_END
+// 0151120 / US055
+// Penquin Pays / Local / A- 4/14/03
+// Penguin Pays title is misspelled in the ROM
+// Variations (% and NO):
+// 87.634% 99
+// 90.445% 01
+// 92.130% 02
+// 94.640% 03
+// 97.001% 04
+// 81.980% 05 (Hyperlink)
ROM_START( pengpyce )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2359,6 +3524,12 @@ ROM_START( pengpyce )
ROM_END
+// 40000921 / 656
+// Pharaoh's Fortune / Local / D - 11/01/00
+// Variations (% and NO):
+// 87.93% 99
+// 90.16% 01
+// 92.10% 02
ROM_START( pharfor )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2369,6 +3540,12 @@ ROM_START( pharfor )
ROM_END
+// 20197511 / 793
+// Phoenix Fantasy / Local / A - 21/07/05
+// Variations (% and NO):
+// 87.55% 99
+// 90.02% 01
+// 91.88% 02
ROM_START( phxfant )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2379,6 +3556,12 @@ ROM_START( phxfant )
ROM_END
+// 10001511 / 661/1
+// Pirates / Local / B - 3/11/00
+// Variations (% and NO):
+// 87.16% 99
+// 90.08% 01
+// 92.07% 02
ROM_START( pirata6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2387,28 +3570,94 @@ ROM_START( pirata6 )
ROM_END
-/*
- Player's Choice - By Demand
- 4-in-1 game containing Big Red, Black Panther, Fa Fa Fa and Super Bucks IV.
-*/
+// 10223111 / MG0005
+// Player's Choice - By Demand / D - 25/09/06
+// 4-in-1 game containing Big Red, Black Panther, Fa Fa Fa and Super Bucks IV
+// Variations (% and NO):
+// 90% 99
+// 88% 01
+// 92% 02
+// 95% 03
+// 93.5% 04
+// Big Red / 803 / E - 18/10/06
+// Variations (% and NO):
+// 90.07% 99
+// 87.83% 01
+// 91.93% 02
+// 94.78% 03
+// 93.61% 04
+// Black Panther / 736/1 / B - 28/07/06
+// Variations (% and NO):
+// 90.10% 99
+// 87.77% 01
+// 92.04% 02
+// 94.80% 03
+// 93.54% 04
+// Fa Fa Fa / 802 / B - 26/6/06
+// Variations (% and NO):
+// 90.20% 99
+// 87.95% 01
+// 91.86% 02
+// 94.85% 03
+// 93.69% 04
+// Super Bucks IV / 749 / E - 15/09/06
+// Variations (% and NO):
+// 90.06% 99
+// 87.94% 01
+// 92.17% 02
+// 94.89% 03
+// 93.41% 04
ROM_START( pcbydem )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("10223111.u21", 0x0000000, 0x0400000, CRC(c4f95ab2) SHA1(dd0a3cdaa7b421cbcfa50b94b8bbfb69769343cd) )
- ROM_LOAD32_WORD("10223111.u11", 0x0000002, 0x0400000, CRC(4a729ca3) SHA1(52be1fbf80a06f9959d62376102d96ea8f77f272) )
- ROM_LOAD32_WORD("10223111.u22", 0x0800000, 0x0400000, CRC(a9b81cc4) SHA1(541765e9fe2d67c60f014a8d32866c7b8203766a) )
- ROM_LOAD32_WORD("10223111.u12", 0x0800002, 0x0400000, CRC(81816747) SHA1(c745bc6be35976f4784730ab8b75e07688e49b22) )
- ROM_LOAD32_WORD("10223111.u23", 0x1000000, 0x0400000, CRC(309dbbf7) SHA1(69e44494bba43d001545c4e474ab4f712d1d8015) )
- ROM_LOAD32_WORD("10223111.u13", 0x1000002, 0x0400000, CRC(c71cb0e3) SHA1(c46d017bb26fb990a403cff7659b15a11f947c19) )
- ROM_LOAD32_WORD("10223111.u24", 0x1800000, 0x0400000, CRC(f3aab3c8) SHA1(a4c08d341f6b59b5faa14aa3381be066ecdc692a) )
- ROM_LOAD32_WORD("10223111.u14", 0x1800002, 0x0400000, CRC(adfaa968) SHA1(a1a8329523cbd14c24f8e6997a5be442327f61c7) )
-ROM_END
-
-
-/*
- Player's Choice - Favourites
- 4-in-1 game containing Black Panther, Prize Fight, Return of the Samurai and Super Bucks IV.
-*/
+ ROM_LOAD32_WORD("10223111.u11", 0x0000000, 0x0400000, CRC(c4f95ab2) SHA1(dd0a3cdaa7b421cbcfa50b94b8bbfb69769343cd) )
+ ROM_LOAD32_WORD("10223111.u21", 0x0000002, 0x0400000, CRC(4a729ca3) SHA1(52be1fbf80a06f9959d62376102d96ea8f77f272) )
+ ROM_LOAD32_WORD("10223111.u12", 0x0800000, 0x0400000, CRC(a9b81cc4) SHA1(541765e9fe2d67c60f014a8d32866c7b8203766a) )
+ ROM_LOAD32_WORD("10223111.u22", 0x0800002, 0x0400000, CRC(81816747) SHA1(c745bc6be35976f4784730ab8b75e07688e49b22) )
+ ROM_LOAD32_WORD("10223111.u13", 0x1000000, 0x0400000, CRC(309dbbf7) SHA1(69e44494bba43d001545c4e474ab4f712d1d8015) )
+ ROM_LOAD32_WORD("10223111.u23", 0x1000002, 0x0400000, CRC(c71cb0e3) SHA1(c46d017bb26fb990a403cff7659b15a11f947c19) )
+ ROM_LOAD32_WORD("10223111.u14", 0x1800000, 0x0400000, CRC(f3aab3c8) SHA1(a4c08d341f6b59b5faa14aa3381be066ecdc692a) )
+ ROM_LOAD32_WORD("10223111.u24", 0x1800002, 0x0400000, CRC(adfaa968) SHA1(a1a8329523cbd14c24f8e6997a5be442327f61c7) )
+ROM_END
+
+
+// 20177311 / MG0002
+// Player's Choice-Favourites / D - 04/11/04
+// 4-in-1 game containing Prize Fight, Return of the Samurai, Black Panther and Super Bucks IV
+// Variations (% and NO):
+// 90% 99
+// 88% 01
+// 92% 02
+// 95% 03
+// 93.5% 04
+// Prize Fight / 759 / B - 08/10/04
+// Variations (% and NO):
+// 90.08% 99
+// 87.91% 01
+// 91.87% 02
+// 94.96% 03
+// 93.45% 04
+// Return Of The Samurai / 608/11 / A - 04/11/04
+// Variations (% and NO):
+// 90.11% 99
+// 87.54% 01
+// 92.38% 02
+// 94.79% 03
+// 93.66% 04
+// Black Panther / 736 / B - 12/02/04
+// Variations (% and NO):
+// 90.10% 99
+// 87.77% 01
+// 92.04% 02
+// 94.80% 03
+// 93.54% 04
+// Super Bucks IV / 749 / D - 14/04/04
+// Variations (% and NO):
+// 90.06% 99
+// 87.94% 01
+// 92.17% 02
+// 94.89% 03
+// 93.41% 04
ROM_START( pcfavor )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2421,28 +3670,79 @@ ROM_START( pcfavor )
ROM_END
-/*
- Player's Choice - Gold Edition
- 4-in-1 game containing Adonis, K.G. Bird, Tigress and Wild Goose.
-*/
+// 30291411 / MG0047
+// Player's Choice - Gold Edition / A - 09/04/10
+// 4-in-1 game containing Adonis, K.G. Bird, Tigress and Wild Goose
+// Variations (% and NO):
+// 88% 99
+// 90% 01
+// 92% 02
+// 95% 03
+// 89% 04
+// Adonis / 823 / D - 23/10/07
+// Variations (% and NO):
+// 87.87% 99
+// 90.19% 01
+// 91.83% 02
+// 94.88% 03
+// 88.30% 04
+// KG Bird / 834 / E - 14/04/10
+// Variations (% and NO):
+// 87.84% 99
+// 90.17% 01
+// 92.18% 02
+// 94.98% 03
+// 88.48% 04
+// Tigress / 807 / G - 17/03/09
+// Variations (% and NO):
+// 87.93% 99
+// 90.05% 01
+// 91.96% 02
+// 94.92% 03
+// 88.51% 04
+// Wild Goose / 732 / E - 13/09/04
+// Variations (% and NO):
+// 87.62% 99
+// 90.09% 01
+// 92.15% 02
+// 94.73% 03
+// 88.72% 04
ROM_START( pcgold )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("30291411.u21", 0x0000000, 0x0400000, CRC(bb839c90) SHA1(268008ffeeb867210664928a521051978c7770b3) )
- ROM_LOAD32_WORD("30291411.u11", 0x0000002, 0x0400000, CRC(6072d8d3) SHA1(37ce2a4213024b9ccd1859701c48e76e6c64e6ee) )
- ROM_LOAD32_WORD("30291411.u22", 0x0800000, 0x0400000, CRC(6208432e) SHA1(50006d010dd3d061fef8f4fd8fbbffea1b9b0f3d) )
- ROM_LOAD32_WORD("30291411.u12", 0x0800002, 0x0400000, CRC(db6e9523) SHA1(a4a272af4f5f29d2e612b52a011f9daf7c0b0cd3) )
- ROM_LOAD32_WORD("30291411.u23", 0x1000000, 0x0400000, CRC(5927770a) SHA1(faaec01280a54775e85ae796a7d05170bece3c87) )
- ROM_LOAD32_WORD("30291411.u13", 0x1000002, 0x0400000, CRC(8df4d7da) SHA1(a798424a514201d954519ec0daf0a2b1cbc00082) )
- ROM_LOAD32_WORD("30291411.u24", 0x1800000, 0x0400000, CRC(5709ba3a) SHA1(4fd85b97f434656b3bd0d26ba8573e3cd2c936ce) )
- ROM_LOAD32_WORD("30291411.u14", 0x1800002, 0x0400000, CRC(1d67f455) SHA1(4247d21757522a69184d32434cfa191a026aff19) )
-ROM_END
-
-
-/*
- Player's Choice - Most Wanted
- 4-in-1 game containing Big Red, Black Panther, Choy Sun Doa and Spring Carnival.
-*/
+ ROM_LOAD32_WORD("30291411.u11", 0x0000000, 0x0400000, CRC(bb839c90) SHA1(268008ffeeb867210664928a521051978c7770b3) )
+ ROM_LOAD32_WORD("30291411.u21", 0x0000002, 0x0400000, CRC(6072d8d3) SHA1(37ce2a4213024b9ccd1859701c48e76e6c64e6ee) )
+ ROM_LOAD32_WORD("30291411.u12", 0x0800000, 0x0400000, CRC(6208432e) SHA1(50006d010dd3d061fef8f4fd8fbbffea1b9b0f3d) )
+ ROM_LOAD32_WORD("30291411.u22", 0x0800002, 0x0400000, CRC(db6e9523) SHA1(a4a272af4f5f29d2e612b52a011f9daf7c0b0cd3) )
+ ROM_LOAD32_WORD("30291411.u13", 0x1000000, 0x0400000, CRC(5927770a) SHA1(faaec01280a54775e85ae796a7d05170bece3c87) )
+ ROM_LOAD32_WORD("30291411.u23", 0x1000002, 0x0400000, CRC(8df4d7da) SHA1(a798424a514201d954519ec0daf0a2b1cbc00082) )
+ ROM_LOAD32_WORD("30291411.u14", 0x1800000, 0x0400000, CRC(5709ba3a) SHA1(4fd85b97f434656b3bd0d26ba8573e3cd2c936ce) )
+ ROM_LOAD32_WORD("30291411.u24", 0x1800002, 0x0400000, CRC(1d67f455) SHA1(4247d21757522a69184d32434cfa191a026aff19) )
+ROM_END
+
+
+// 20234911 / MG0010
+// Player's Choice - Most Wanted
+// 4-in-1 game containing Spring Carnival, Choy Sun Doa, Black Panther and Big Red
+// Variations (% and NO):
+// 89.10% 99
+// 90.10% 01
+// Spring Carnival / 642/5 / A - 22/08/02
+// Variations (% and NO):
+// 87.92% 99
+// 90.17% 01
+// Choy Sun Doa / 688/3 / C - 9/11/06
+// Variations (% and NO):
+// 87.96% 99
+// 89.95% 01
+// Black Panther / 736 / E - 21/1/08
+// Variations (% and NO):
+// 90.10% 99
+// 87.77% 01
+// Big Red / 803 / E - 08/10/06
+// Variations (% and NO):
+// 90.07% 99
+// 87.83% 01
ROM_START( pcmostw )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2455,66 +3755,144 @@ ROM_START( pcmostw )
ROM_END
-/*
- Player's Choice - Original
- 4-in-1 game containing 50 Lions, Indian Dreaming II, Pyramid Power and Queen of the Nile II.
- Indian Dreaming II is an updated edition with 30 credit Reel Power bet similar to Dream Catcher, Thai Princess, Indian Dreaming (Lady Luck) etc.
- Queen of the Nile II has a similar feature to Show Me The Money, where the player can choose different free game/feature multiplier combinations.
-*/
+// 30143011 / MG0001
+// Player's Choice/Original / A - 09/04/10
+// 4-in-1 game containing 50 Lions, Indian Dreaming II, Pyramid Power and Queen of the Nile II
+// Indian Dreaming II is an updated edition with 30 credit Reel Power bet similar to Thai Princess
+// Queen of the Nile II has a similar feature to Show Me The Money, where the player can choose different free game/feature multiplier combinations
+// Variations (% and NO):
+// 88% 99
+// 90% 01
+// 92% 02
+// 50 Lions / 717 / D - 20/10/03
+// Variations (% and NO):
+// 87.58% 99
+// 90.03% 01
+// 92.11% 02
+// Indian Dreaming / 737 / B - 02/12/03
+// Called 'Indian Dreaming' in ROM
+// Variations (% and NO):
+// 87.51% 99
+// 89.86% 01
+// 91.80% 02
+// Pyramid Power / 662/2 / F 23/04/04
+// Variations (% and NO):
+// 87.60% 99
+// 90.15% 01
+// 92.06% 02
+// Queen of the Nile II / 735 / B - 02/12/03
+// Variations (% and NO):
+// 88.07% 99
+// 90.09% 01
+// 91.78% 02
ROM_START( pcorig )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("30143011.u21", 0x0000000, 0x0400000, CRC(457aa378) SHA1(248e636e33ea68a724ee074febdd7a3ed1b5d4e7) )
- ROM_LOAD32_WORD("30143011.u11", 0x0000002, 0x0400000, CRC(4caa461b) SHA1(b7b5770e9c0f4c7924f071d59eff94eea950b9c8) )
- ROM_LOAD32_WORD("30143011.u22", 0x0800000, 0x0400000, CRC(6f590385) SHA1(fc6229e1a45eaed819ec87fb1777b4ae508200a9) )
- ROM_LOAD32_WORD("30143011.u12", 0x0800002, 0x0400000, CRC(27941b7b) SHA1(5b5dbc8198b70d2965483e95f073213faa819d2e) )
- ROM_LOAD32_WORD("30143011.u23", 0x1000000, 0x0400000, CRC(17445b58) SHA1(f281b36ef9a72cf3e798993a7a80bf7fda1a6e8b) )
- ROM_LOAD32_WORD("30143011.u13", 0x1000002, 0x0400000, CRC(7eb0f277) SHA1(6a0ede9f64556223f284df4d015e200d98ec97fa) )
- ROM_LOAD32_WORD("30143011.u24", 0x1800000, 0x0400000, CRC(d4f04391) SHA1(3eb4b16518b3980505c8ee08542ae184c829f79d) )
- ROM_LOAD32_WORD("30143011.u14", 0x1800002, 0x0400000, CRC(e3b54c33) SHA1(4f1d22353b1114e476340dbec2d7d96e60d55cc2) )
-ROM_END
-
-
-/*
- Player's Choice - Platinum
- 4-in-1 game containing Antony & Cleopatra, Miss Kitty, Reelin' N Boppin and Show Me The Money.
- This version of Miss Kitty is not a 50 line game unlike the normal version, it has a standard 5 reel, 3 position layout.
-*/
+ ROM_LOAD32_WORD("30143011.u11", 0x0000000, 0x0400000, CRC(457aa378) SHA1(248e636e33ea68a724ee074febdd7a3ed1b5d4e7) )
+ ROM_LOAD32_WORD("30143011.u21", 0x0000002, 0x0400000, CRC(4caa461b) SHA1(b7b5770e9c0f4c7924f071d59eff94eea950b9c8) )
+ ROM_LOAD32_WORD("30143011.u12", 0x0800000, 0x0400000, CRC(6f590385) SHA1(fc6229e1a45eaed819ec87fb1777b4ae508200a9) )
+ ROM_LOAD32_WORD("30143011.u22", 0x0800002, 0x0400000, CRC(27941b7b) SHA1(5b5dbc8198b70d2965483e95f073213faa819d2e) )
+ ROM_LOAD32_WORD("30143011.u13", 0x1000000, 0x0400000, CRC(17445b58) SHA1(f281b36ef9a72cf3e798993a7a80bf7fda1a6e8b) )
+ ROM_LOAD32_WORD("30143011.u23", 0x1000002, 0x0400000, CRC(7eb0f277) SHA1(6a0ede9f64556223f284df4d015e200d98ec97fa) )
+ ROM_LOAD32_WORD("30143011.u14", 0x1800000, 0x0400000, CRC(d4f04391) SHA1(3eb4b16518b3980505c8ee08542ae184c829f79d) )
+ ROM_LOAD32_WORD("30143011.u24", 0x1800002, 0x0400000, CRC(e3b54c33) SHA1(4f1d22353b1114e476340dbec2d7d96e60d55cc2) )
+ROM_END
+
+
+// 20282111 / MG0031
+// PLAYER'S CHOICE PLATINUM / B - 04/02/09
+// 4-in-1 game containing Antony & Cleopatra, Miss Kitty, Reelin' N Boppin and Show Me The Money
+// This version of Miss Kitty is not a 50 line game, it is a standard 5 reel, 3 position layout
+// Variations (% and NO):
+// 88% 99
+// 90% 01
+// 92% 02
+// Antony & Cleopatra / MV4249 / B - 11/05/05
+// Variations (% and NO):
+// 87.93% 99
+// 90.11% 01
+// 91.92% 02
+// Miss Kitty / 778/2 / F - 24/07/07
+// Variations (% and NO):
+// 87.57% 99
+// 90.12% 01
+// 91.92% 02
+// Reelin' N Boppin / MV4121/2 / C - 24/09/08
+// Variations (% and NO):
+// 87.03% 99
+// 90.22% 01
+// 91.95% 02
+// Show Me The Money / MV4126/1 / B - 15/04/02
+// Variations (% and NO):
+// 87.96% 99
+// 90.04% 01
+// 91.73% 02
ROM_START( pcplat )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("20282111.u21", 0x0000000, 0x0400000, CRC(7ada7860) SHA1(4b8681f8ae3f279e38a9dba3b29585d7d0642f8c) )
- ROM_LOAD32_WORD("20282111.u11", 0x0000002, 0x0400000, CRC(44c0462c) SHA1(e6a99ddef5d48149003fa9009dcb9880c420fedf) )
- ROM_LOAD32_WORD("20282111.u22", 0x0800000, 0x0400000, CRC(51d192c5) SHA1(2b42d0ba8eb5b6ed1006ee452ca11ff295ee0a80) )
- ROM_LOAD32_WORD("20282111.u12", 0x0800002, 0x0400000, CRC(a22f17ed) SHA1(e3e6d50707873986b067a216d6dda25201224c53) )
- ROM_LOAD32_WORD("20282111.u23", 0x1000000, 0x0400000, CRC(545289a0) SHA1(af32941fb6c03c6711fc35c453546803aec0c85b) )
- ROM_LOAD32_WORD("20282111.u13", 0x1000002, 0x0400000, CRC(a66e230f) SHA1(712a08d879902d4ee6d1ee5896d0bbff5961a3f2) )
- ROM_LOAD32_WORD("20282111.u24", 0x1800000, 0x0400000, CRC(944b7425) SHA1(a87072edea72902e12dcda2e3ef7a0b35487b2f0) )
- ROM_LOAD32_WORD("20282111.u14", 0x1800002, 0x0400000, CRC(44ee59d6) SHA1(52dbc89c41e2aef844eaf64e734661c5945980d0) )
-ROM_END
-
-
-/*
- Player's World - Super (?)
- This game is currently unknown, the name string inside the ROM is Multigame Xtreme Hyperlink
- 4-in-1 game containing 5 Dragons, Tiki Torch, Turtle Treasure, and Where's The Gold.
-*/
+ /*
+ 20282111 NZCB PLAVER'S CHOICE PLATINUM MG0031 4MB 8 eproms 8/10/09 Aristocrat © 2008 P U86
+ 20282111 NZCB PLAVER'S CHOICE PLATINUM MG0031 4MB 8 eproms 8/10/09 Aristocrat © 2008 P U73
+ 20282111 NZCB PLAVER'S CHOICE PLATINUM MG0031 4MB 8 eproms 8/10/09 Aristocrat © 2008 P U85
+ 20282111 NZCB PLAVER'S CHOICE PLATINUM MG0031 4MB 8 eproms 8/10/09 Aristocrat © 2008 P U72
+ 20282111 NZCB PLAVER'S CHOICE PLATINUM MG0031 4MB 8 eproms 8/10/09 Aristocrat © 2008 P U84
+ 20282111 NZCB PLAVER'S CHOICE PLATINUM MG0031 4MB 8 eproms 8/10/09 Aristocrat © 2008 P U71
+ 20282111 NZCB PLAVER'S CHOICE PLATINUM MG0031 4MB 8 eproms 8/10/09 Aristocrat © 2008 P U83
+ 20282111 NZCB PLAVER'S CHOICE PLATINUM MG0031 4MB 8 eproms 8/10/09 Aristocrat © 2008 P U70
+ 'Player' is misspelled 'Plaver' on the labels
+ */
+ ROM_LOAD32_WORD("20282111.u11", 0x0000000, 0x0400000, CRC(7ada7860) SHA1(4b8681f8ae3f279e38a9dba3b29585d7d0642f8c) )
+ ROM_LOAD32_WORD("20282111.u21", 0x0000002, 0x0400000, CRC(44c0462c) SHA1(e6a99ddef5d48149003fa9009dcb9880c420fedf) )
+ ROM_LOAD32_WORD("20282111.u12", 0x0800000, 0x0400000, CRC(51d192c5) SHA1(2b42d0ba8eb5b6ed1006ee452ca11ff295ee0a80) )
+ ROM_LOAD32_WORD("20282111.u22", 0x0800002, 0x0400000, CRC(a22f17ed) SHA1(e3e6d50707873986b067a216d6dda25201224c53) )
+ ROM_LOAD32_WORD("20282111.u13", 0x1000000, 0x0400000, CRC(545289a0) SHA1(af32941fb6c03c6711fc35c453546803aec0c85b) )
+ ROM_LOAD32_WORD("20282111.u23", 0x1000002, 0x0400000, CRC(a66e230f) SHA1(712a08d879902d4ee6d1ee5896d0bbff5961a3f2) )
+ ROM_LOAD32_WORD("20282111.u14", 0x1800000, 0x0400000, CRC(944b7425) SHA1(a87072edea72902e12dcda2e3ef7a0b35487b2f0) )
+ ROM_LOAD32_WORD("20282111.u24", 0x1800002, 0x0400000, CRC(44ee59d6) SHA1(52dbc89c41e2aef844eaf64e734661c5945980d0) )
+ROM_END
+
+
+// 0154019 / MG0016
+// Multigame XTREME HYPERLINK
+// Conflicting title, 'Player's World - Super', but ROM says 'Multigame XTREME HYPERLINK'
+// No date strings whatsoever
+// 4-in-1 Cash Express game containing 5 Dragons, Tiki Torch, Turtle Treasure, and Where's The Gold
+// Variations (% and NO):
+// 87.194% 05 (Hyperlink)
+// 5 Dragons / MV4280/4
+// Variations (% and NO):
+// 82.007% 05 (Hyperlink)
+// Tiki Torch / MV4313/2
+// Variations (% and NO):
+// 87.57% 05 (Hyperlink)
+// Turtle Treasure / MV4326/2
+// Variations (% and NO):
+// 82.080% 05 (Hyperlink)
+// Where's The Gold / MV4220/2
+// Variations (% and NO):
+// 82.194% 05 (Hyperlink)
ROM_START( pwsuper )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("0154019.u21", 0x0000000, 0x0400000, CRC(48f60a2c) SHA1(0d27d544991b3403672250ff79c5bbbf35cdf175) )
- ROM_LOAD32_WORD("0154019.u11", 0x0000002, 0x0400000, CRC(678b0be2) SHA1(16f5460d67a1e897390e0c03b847511f5c14156a) )
- ROM_LOAD32_WORD("0154019.u22", 0x0800000, 0x0400000, CRC(5354cff5) SHA1(bf818e53a432aa8e7a2578dbb367be2c5f51bb16) )
- ROM_LOAD32_WORD("0154019.u12", 0x0800002, 0x0400000, CRC(9dbdefb7) SHA1(445a24233b435e3812747d8376addf969fea5cd2) )
- ROM_LOAD32_WORD("0154019.u23", 0x1000000, 0x0400000, CRC(43b44f26) SHA1(5410eea0a4911a274a794d6b27e369fb98c6edf7) )
- ROM_LOAD32_WORD("0154019.u13", 0x1000002, 0x0400000, CRC(ae04211a) SHA1(8db4fc936fa6d0e0a372b81f2e9590047522b843) )
- ROM_LOAD32_WORD("0154019.u24", 0x1800000, 0x0400000, CRC(a850af7f) SHA1(8d029de0083aad57ddd8b36153214b40cd388d56) )
- ROM_LOAD32_WORD("0154019.u14", 0x1800002, 0x0400000, CRC(dbb073f1) SHA1(e3a7f14cabab613453baffde3b592889d11578e7) )
- ROM_LOAD32_WORD("0154019.u25", 0x2000000, 0x0400000, CRC(2c7fe966) SHA1(42fc364dded0ce079ce4970b1f951c6a0ebf6c51) )
- ROM_LOAD32_WORD("0154019.u15", 0x2000002, 0x0400000, CRC(5f9b8ef7) SHA1(f0c954d1f448f2061dbe284c78eddcfcb5afdc7c) )
+ ROM_LOAD32_WORD("0154019.u11", 0x0000000, 0x0400000, CRC(48f60a2c) SHA1(0d27d544991b3403672250ff79c5bbbf35cdf175) )
+ ROM_LOAD32_WORD("0154019.u21", 0x0000002, 0x0400000, CRC(678b0be2) SHA1(16f5460d67a1e897390e0c03b847511f5c14156a) )
+ ROM_LOAD32_WORD("0154019.u12", 0x0800000, 0x0400000, CRC(5354cff5) SHA1(bf818e53a432aa8e7a2578dbb367be2c5f51bb16) )
+ ROM_LOAD32_WORD("0154019.u22", 0x0800002, 0x0400000, CRC(9dbdefb7) SHA1(445a24233b435e3812747d8376addf969fea5cd2) )
+ ROM_LOAD32_WORD("0154019.u13", 0x1000000, 0x0400000, CRC(43b44f26) SHA1(5410eea0a4911a274a794d6b27e369fb98c6edf7) )
+ ROM_LOAD32_WORD("0154019.u23", 0x1000002, 0x0400000, CRC(ae04211a) SHA1(8db4fc936fa6d0e0a372b81f2e9590047522b843) )
+ ROM_LOAD32_WORD("0154019.u14", 0x1800000, 0x0400000, CRC(a850af7f) SHA1(8d029de0083aad57ddd8b36153214b40cd388d56) )
+ ROM_LOAD32_WORD("0154019.u24", 0x1800002, 0x0400000, CRC(dbb073f1) SHA1(e3a7f14cabab613453baffde3b592889d11578e7) )
+ ROM_LOAD32_WORD("0154019.u15", 0x2000000, 0x0400000, CRC(2c7fe966) SHA1(42fc364dded0ce079ce4970b1f951c6a0ebf6c51) )
+ ROM_LOAD32_WORD("0154019.u25", 0x2000002, 0x0400000, CRC(5f9b8ef7) SHA1(f0c954d1f448f2061dbe284c78eddcfcb5afdc7c) )
ROM_END
+// 10002211 / 628/5
+// Pompeii / Local / A - 22/01/01
+// Variations (% and NO):
+// 87.15% 99
+// 90.14% 01
+// 92.32% 02
ROM_START( pompeia6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2525,6 +3903,14 @@ ROM_START( pompeia6 )
ROM_END
+// 0251010 / US008
+// Pompeii / Local / A - 04/03/02
+// Variations (% and NO):
+// 87.136% 99
+// 90.013% 01
+// 92.171% 02
+// 94.516% 03
+// 96.999% 04
ROM_START( pompeia6u )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2535,9 +3921,23 @@ ROM_START( pompeia6u )
ROM_END
+// 0151158 / US161
+// Pompeii / Local / A - 04/15/05
+// Variations (% and NO):
+// 87.040% 99 (Reel 1) 87.040% 99 (Reels 1-2) 87.363% 99 (Reels 1-3) 87.876% 99 (Reels 1-4) 87.881% 99 (Reels 1-5)
+// 90.063% 01 (Reel 1) 90.063% 01 (Reels 1-2) 90.155% 01 (Reels 1-3) 90.804% 01 (Reels 1-4) 90.872% 01 (Reels 1-5)
+// 92.123% 02 (Reel 1) 92.123% 02 (Reels 1-2) 92.165% 02 (Reels 1-3) 92.942% 02 (Reels 1-4) 93.047% 02 (Reels 1-5)
+// 95.689% 03 (Reel 1) 95.689% 03 (Reels 1-2) 95.719% 03 (Reels 1-3) 95.965% 03 (Reels 1-4) 95.978% 03 (Reels 1-5)
+// 96.759% 04 (Reel 1) 96.759% 04 (Reels 1-2) 96.851% 04 (Reels 1-3) 97.482% 04 (Reels 1-4) 97.616% 04 (Reels 1-5)
ROM_START( pompeia6ua )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ /*
+ 0251010-U86 Series:01 27V322 Mk6USA Pompeii D2882087 94F3-B50D / 1DE40B32 / 1DD3CE70 Copyright © 2002 Aristocrat Technologies, Inc
+ 0251010-U73 Series:01 27V322 Mk6USA Pompeii FU44BU83 9795-2DCE / 1D999368 / 0DE1EDC6 Copyright © 2002 Aristocrat Technologies, Inc
+ 0251010-U85 Series:01 27V322 Mk6USA Pompeii A9E18HB4 F990-9B49 / 064566E9 / 19B7A225 Copyright © 2002 Aristocrat Technologies, Inc
+ 0251010-U72 Series:01 27V322 Mk6USA Pompeii E9E554E7 2163-9F0F / 063A751A / 16DB02D8 Copyright © 2002 Aristocrat Technologies, Inc
+ */
ROM_LOAD32_WORD("0251010.u86", 0x0000000, 0x0400000, CRC(a68aac55) SHA1(630b1d4cb08d8710b81c6d709182e7c7a52f184a) )
ROM_LOAD32_WORD("0251010.u73", 0x0000002, 0x0400000, CRC(947d3099) SHA1(d5256fc598c2e280f9e92ef6ba0e0152c8cc5d3b) )
ROM_LOAD32_WORD("0251010.u85", 0x0800000, 0x0400000, CRC(901f5a17) SHA1(8a7fd00a68770be23e0164907eae91b963f01091) )
@@ -2545,6 +3945,12 @@ ROM_START( pompeia6ua )
ROM_END
+// 10208511 / 628/9
+// Pride of Africa / NSW / J - 06/12/05
+// Variations (% and NO):
+// 87.05% 99
+// 90.04% 01
+// 92.01% 02
ROM_START( prideaf )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2553,6 +3959,12 @@ ROM_START( prideaf )
ROM_END
+// 20173411 / 734
+// Prophecy / Local / B - 10/08/04
+// Variations (% and NO):
+// 87.98% 99
+// 90.03% 01
+// 91.90% 02
ROM_START( prophecy )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2563,6 +3975,12 @@ ROM_START( prophecy )
ROM_END
+// 3J011111 / JB027
+// Queen of the Nile / Local / C - 16/02/05
+// Variations (% and NO):
+// 87.87% 99
+// 90.31% 01
+// 92.26% 02
ROM_START( qnilea6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2573,6 +3991,10 @@ ROM_START( qnilea6 )
ROM_END
+// 10203811 / 602/23
+// Queen of The Nile Money Train II / QCOM / E - 17/11/05
+// Variations (% and NO):
+// 82.06% 05 (Hyperlink)
ROM_START( qnilemt2 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2583,6 +4005,13 @@ ROM_START( qnilemt2 )
ROM_END
+// 20102811 / 683
+// Queen of The Nile Special Edition / Local / A - 06/12/01
+// Same date string as earlier version
+// Variations (% and NO):
+// 87.87% 99
+// 90.18% 01
+// 92.15% 02
ROM_START( qnilese )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2591,6 +4020,12 @@ ROM_START( qnilese )
ROM_END
+// 10102811 / 683
+// Queen of The Nile Special Edition / Local / A - 06/12/01
+// Variations (% and NO):
+// 87.87% 99
+// 90.18% 01
+// 92.15% 02
ROM_START( qnilesea )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2599,6 +4034,10 @@ ROM_START( qnilesea )
ROM_END
+// 20123911 / 683/1
+// Queen of The Nile Special Edition / Local / A - 21/10/02
+// Variations (% and NO):
+// 82.05% 05 (Hyperlink)
ROM_START( qnilejc )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2609,6 +4048,15 @@ ROM_START( qnilejc )
ROM_END
+// 20123911 / 683/1
+// Queen of The Nile Special Edition / Local / A - 21/10/02
+// SHOW PROGRAM
+// Variations (% and NO):
+// 82.05% 05 (Hyperlink)
+// Identified as 201239AD in the Machine Identification menu, rather than 201239AV from the qnilejc set
+// We had no pics of the ROM labels for the Show Program games
+// they probably have some different string in the label but
+// we just append a "sp__" prefix for the moment
ROM_START( qnilejcsp )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2619,16 +4067,29 @@ ROM_START( qnilejcsp )
ROM_END
+// 10133721 / 687
+// Queen of Sheba / Local / F - 04/03/03
+// Variations (% and NO):
+// 99.38% 99
+// 97.13% 01
+// 94.36% 02
+// 92.92% 03
ROM_START( qsheba )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("10133711.u86", 0x0000000, 0x0400000, CRC(e1313dff) SHA1(536014d8d4f3ff90d93befdcd55d5b3e6eb49e7c) )
- ROM_LOAD32_WORD("10133711.u73", 0x0000002, 0x0400000, CRC(fb26e09a) SHA1(e2debdcea7ee7be90e70c96e3eca593b515dfd2d) )
- ROM_LOAD32_WORD("10133711.u85", 0x0800000, 0x0400000, CRC(6f827f08) SHA1(b3777031c0a8d14557a640572c4dcfa781986b54) )
- ROM_LOAD32_WORD("10133711.u72", 0x0800002, 0x0400000, CRC(befa03be) SHA1(abd4846f29636aff70826b3086a972682c3bffe0) )
+ ROM_LOAD32_WORD("10133721.u86", 0x0000000, 0x0400000, CRC(e1313dff) SHA1(536014d8d4f3ff90d93befdcd55d5b3e6eb49e7c) )
+ ROM_LOAD32_WORD("10133721.u73", 0x0000002, 0x0400000, CRC(fb26e09a) SHA1(e2debdcea7ee7be90e70c96e3eca593b515dfd2d) )
+ ROM_LOAD32_WORD("10133721.u85", 0x0800000, 0x0400000, CRC(6f827f08) SHA1(b3777031c0a8d14557a640572c4dcfa781986b54) )
+ ROM_LOAD32_WORD("10133721.u72", 0x0800002, 0x0400000, CRC(befa03be) SHA1(abd4846f29636aff70826b3086a972682c3bffe0) )
ROM_END
+// 10194211 / 762
+// Rapid Riches / Local / D - 09/03/05
+// Variations (% and NO):
+// 87.81% 99
+// 90.12% 01
+// 91.82% 02
ROM_START( raprichs )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2639,6 +4100,12 @@ ROM_START( raprichs )
ROM_END
+// 10119911 / 709
+// Red Baron / Local / B - 21/11/02
+// Variations (% and NO):
+// 87.85% 99
+// 90.13% 01
+// 92.11% 02
ROM_START( redbara6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2649,6 +4116,10 @@ ROM_START( redbara6 )
ROM_END
+// 10160711 / 709
+// Red Baron / QCOM / E - 04/12/03
+// Variations (% and NO):
+// 82.10% 05 (Hyperlink)
ROM_START( redbarfl )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2659,6 +4130,11 @@ ROM_START( redbarfl )
ROM_END
+// 10160911 / 709
+// Red Baron / QCOM / E - 04/12/03
+// Same date string as redbarfl
+// Variations (% and NO):
+// 82.10% 05 (Hyperlink)
ROM_START( redbarjc )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2671,6 +4147,11 @@ ROM_START( redbarjc )
ROM_END
+// 10298611 / 628/2
+// Reelin-n-Rockin Fast Lane / QCOM / E - 20/12/00
+// Date string unchanged from MK5 version
+// Variations (% and NO):
+// 82.05% 05 (Hyperlink)
ROM_START( reelrkfl )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2681,6 +4162,14 @@ ROM_START( reelrkfl )
ROM_END
+// 10117211 / 608/10
+// Return of the Samurai / Local / A - 26/08/02
+// Variations (% and NO):
+// 90.15% 99
+// 87.57% 01
+// 92.42% 02
+// 94.84% 03
+// 93.69% 04
ROM_START( retsama6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2689,6 +4178,13 @@ ROM_START( retsama6 )
ROM_END
+// 0152539 / MV4238
+// Road Trip / Local / C - 08/18/05
+// Variations (% and NO):
+// 87.926% 99
+// 90.064% 01
+// 92.165% 02
+// 94.898% 03
ROM_START( roadtrip )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2701,6 +4197,12 @@ ROM_START( roadtrip )
ROM_END
+// 10115911 / 642/5
+// Roll Up! Roll Up!! / Local / A - 22/08/02
+// Variations (% and NO):
+// 87.97% 99 (9 line) 87.92% 99 (20 line)
+// 90.19% 01 (9 line) 90.17% 01 (20 line)
+// 92.18% 02 (9 line) 92.19% 02 (20 line)
ROM_START( ruprup )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2711,6 +4213,12 @@ ROM_START( ruprup )
ROM_END
+// 10125711 / 698
+// Ruby Magic / Local / C - 12/11/02
+// Variations (% and NO):
+// 87.52% 99
+// 90.02% 01
+// 92.11% 02
ROM_START( rubymag )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2721,22 +4229,35 @@ ROM_START( rubymag )
ROM_END
+// 20288611 / 949
+// Rumble Reels / B - 04/08/10
+// Variations (% and NO):
+// 87.99% 99
+// 90.19% 01
+// 88.74% 07
ROM_START( rumbreel )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("20288611.u21", 0x0000000, 0x0400000, CRC(cc48bb54) SHA1(6ed7a502deaff0e2fd6d0901d036fcbadf303859) )
- ROM_LOAD32_WORD("20288611.u11", 0x0000002, 0x0400000, CRC(06b37c77) SHA1(e4dad62667a1c1d4948abcd535332975148e952b) )
- ROM_LOAD32_WORD("20288611.u22", 0x0800000, 0x0400000, CRC(3af99e7b) SHA1(93e68056fee9b4f29a066bd6828ff320b7d3ffa4) )
- ROM_LOAD32_WORD("20288611.u12", 0x0800002, 0x0400000, CRC(739c4565) SHA1(bc2cd133dfbfe18916703eacc851f1757a06f345) )
- ROM_LOAD32_WORD("20288611.u23", 0x1000000, 0x0400000, CRC(04b2f09d) SHA1(4090876cf8ef18ed8541f13684b076d7ac1d0d72) )
- ROM_LOAD32_WORD("20288611.u13", 0x1000002, 0x0400000, CRC(2f561bd0) SHA1(9c2f659ec5cdfd335d089389616dac57fbb655df) )
- ROM_LOAD32_WORD("20288611.u24", 0x1800000, 0x0400000, CRC(a117e3ec) SHA1(119d7ac89ee4c2167b853d720eb87498cefab4b9) )
- ROM_LOAD32_WORD("20288611.u14", 0x1800002, 0x0400000, CRC(6bf0442e) SHA1(c83ed68cd0680ebac359824defa51c1942db17f1) )
- ROM_LOAD32_WORD("20288611.u25", 0x2000000, 0x0400000, CRC(2c5baf9f) SHA1(40fb5b22460b9a35ca8ebb8b0643e58665d8643f) )
- ROM_LOAD32_WORD("20288611.u15", 0x2000002, 0x0400000, CRC(3cd5171b) SHA1(fe6e17679f14ae0238c58dd5d801cb0dda3a434b) )
+ ROM_LOAD32_WORD("20288611.u11", 0x0000000, 0x0400000, CRC(cc48bb54) SHA1(6ed7a502deaff0e2fd6d0901d036fcbadf303859) )
+ ROM_LOAD32_WORD("20288611.u21", 0x0000002, 0x0400000, CRC(06b37c77) SHA1(e4dad62667a1c1d4948abcd535332975148e952b) )
+ ROM_LOAD32_WORD("20288611.u12", 0x0800000, 0x0400000, CRC(3af99e7b) SHA1(93e68056fee9b4f29a066bd6828ff320b7d3ffa4) )
+ ROM_LOAD32_WORD("20288611.u22", 0x0800002, 0x0400000, CRC(739c4565) SHA1(bc2cd133dfbfe18916703eacc851f1757a06f345) )
+ ROM_LOAD32_WORD("20288611.u13", 0x1000000, 0x0400000, CRC(04b2f09d) SHA1(4090876cf8ef18ed8541f13684b076d7ac1d0d72) )
+ ROM_LOAD32_WORD("20288611.u23", 0x1000002, 0x0400000, CRC(2f561bd0) SHA1(9c2f659ec5cdfd335d089389616dac57fbb655df) )
+ ROM_LOAD32_WORD("20288611.u14", 0x1800000, 0x0400000, CRC(a117e3ec) SHA1(119d7ac89ee4c2167b853d720eb87498cefab4b9) )
+ ROM_LOAD32_WORD("20288611.u24", 0x1800002, 0x0400000, CRC(6bf0442e) SHA1(c83ed68cd0680ebac359824defa51c1942db17f1) )
+ ROM_LOAD32_WORD("20288611.u15", 0x2000000, 0x0400000, CRC(2c5baf9f) SHA1(40fb5b22460b9a35ca8ebb8b0643e58665d8643f) )
+ ROM_LOAD32_WORD("20288611.u25", 0x2000002, 0x0400000, CRC(3cd5171b) SHA1(fe6e17679f14ae0238c58dd5d801cb0dda3a434b) )
ROM_END
+// 10001311 / 660
+// Scatter Magic 2 / Local / C- 24/08/00
+// 'Scatter Magic II' on artwork, 'Scatter Magic 2' in ROM
+// Variations (% and NO):
+// 87.85% 99 (9 line) 87.80% 99 (20 line)
+// 90.11% 01 (9 line) 89.98% 01 (20 line)
+// 92.03% 02 (9 line) 92.03% 02 (20 line)
ROM_START( scatmag2 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2747,6 +4268,11 @@ ROM_START( scatmag2 )
ROM_END
+// 10102711 / 660
+// Scatter Magic 2 / Local / G - 15/05/01
+// 'Scatter Magic II' on artwork, 'Scatter Magic 2' in ROM
+// Variations (% and NO):
+// 87.85% 99 (9 line) 87.80% 99 (20 line)
ROM_START( scatmag2sa )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2757,6 +4283,14 @@ ROM_START( scatmag2sa )
ROM_END
+// 0452569 / MV4277
+// Scatter Magic III / Local / N/A
+// Variations (% and NO):
+// 87.863% 99
+// 90.074% 01
+// 91.898% 02
+// 94.815% 03
+// 97.291% 04
ROM_START( scatmag3 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2767,6 +4301,15 @@ ROM_START( scatmag3 )
ROM_END
+// 0251029 / US024
+// Seal The Deal / USA / A - 06/20/02
+// Variations (% and NO):
+// 87.508% 99
+// 90.363% 01
+// 92.570% 02
+// 94.623% 03
+// 97.887% 04
+// 82.888% 05 (Hyperlink)
ROM_START( sealdeal )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2777,6 +4320,11 @@ ROM_START( sealdeal )
ROM_END
+// 10225911 / 818
+// Shaman's Magic / Local / C - 14/11/06
+// Variations (% and NO):
+// 87.81% 99
+// 90.03% 01
ROM_START( shamnmg )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2785,6 +4333,13 @@ ROM_START( shamnmg )
ROM_END
+// 0152647 / MV4318/1
+// Shaman's Magic / Local / N/A
+// Variations (% and NO):
+// 87.090% 99
+// 89.887% 01
+// 91.336% 02
+// 93.814% 03
ROM_START( shamnmgu )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2795,9 +4350,23 @@ ROM_START( shamnmgu )
ROM_END
+// 0251088 / US087
+// Shore Thing / Local / B - 1/30/04
+// Variations (% and NO):
+// 86.419% 99 (9 line) 86.475% 99 (20 line)
+// 89.362% 01 (9 line) 89.200% 01 (20 line)
+// 91.497% 02 (9 line) 91.358% 02 (20 line)
+// 94.317% 03 (9 line) 94.091% 03 (20 line)
+// 95.311% 04 (9 line) 95.921% 04 (20 line)
ROM_START( shorthng )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ /*
+ 0251088-U86 Series:01 M27V322 Mk6USA Shore Thing 0HC5F86U 3A3A-E163 / 1E05CAD8 / 1BEF812B Copyright © 2004 Aristocrat Technologies, Inc.
+ 0251088-U73 Series:01 M27V322 Mk6USA Shore Thing 6A5P332F 0627-40DA / 1DAD5A97 / 02D32FA8 Copyright © 2004 Aristocrat Technologies, Inc.
+ 0251088-U85 Series:01 M27V322 Mk6USA Shore Thing 4956FUBH E293-A34F / 09143E44 / 8AA285E8 Copyright © 2004 Aristocrat Technologies, Inc.
+ 0251088-U72 Series:01 M27V322 Mk6USA Shore Thing C53PF655 DE45-0434 / 090B92D7 / 86643B54 Copyright © 2004 Aristocrat Technologies, Inc.
+ */
ROM_LOAD32_WORD("0251088.u86", 0x0000000, 0x0400000, CRC(c3e6f083) SHA1(4ed6b1039f060cd6480a490de28619f5370de805) )
ROM_LOAD32_WORD("0251088.u73", 0x0000002, 0x0400000, CRC(c214d960) SHA1(e5b75e5cb3af3b77f56ccec72833e9243d09c643) )
ROM_LOAD32_WORD("0251088.u85", 0x0800000, 0x0400000, CRC(e721a879) SHA1(0632c1be6c3b671aed4f6dd67b83e966033aba19) )
@@ -2805,6 +4374,12 @@ ROM_START( shorthng )
ROM_END
+// 10001911 / 657/1
+// Show Me The Money / Local / B - 08/01/01
+// Variations (% and NO):
+// 87.88% 99
+// 90.01% 01
+// 92.45% 02
ROM_START( smtma6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2815,6 +4390,10 @@ ROM_START( smtma6 )
ROM_END
+// 10015711 / 657/1
+// Show Me the Money / Qld Clubs and Hotels / D - 31/05/01
+// Variations (% and NO):
+// 87.88% 99
ROM_START( smtma6q )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2825,6 +4404,14 @@ ROM_START( smtma6q )
ROM_END
+// 0152537 / MV4248/4
+// Silk Road / Local / D - 02/09/06
+// Variations (% and NO):
+// 87.040% 99 (Reel 1) 87.040% 99 (Reels 1-2) 87.363% 99 (Reels 1-3) 87.876% 99 (Reels 1-4) 87.881% 99 (Reels 1-5)
+// 90.063% 01 (Reel 1) 90.063% 01 (Reels 1-2) 90.155% 01 (Reels 1-3) 90.804% 01 (Reels 1-4) 90.872% 01 (Reels 1-5)
+// 92.123% 02 (Reel 1) 92.123% 02 (Reels 1-2) 92.165% 02 (Reels 1-3) 92.942% 02 (Reels 1-4) 93.047% 02 (Reels 1-5)
+// 95.689% 03 (Reel 1) 95.689% 03 (Reels 1-2) 95.719% 03 (Reels 1-3) 95.965% 03 (Reels 1-4) 95.978% 03 (Reels 1-5)
+// 96.759% 04 (Reel 1) 96.759% 04 (Reels 1-2) 96.851% 04 (Reels 1-3) 97.482% 04 (Reels 1-4) 97.616% 04 (Reels 1-5)
ROM_START( silkrda6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2835,6 +4422,12 @@ ROM_START( silkrda6 )
ROM_END
+// 20100721 / 672/1
+// SILVER & GOLD / Local / G - 08/07/02
+// Variations (% and NO):
+// 87.91% 99
+// 89.91% 01
+// 92.10% 02
ROM_START( silgola6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2845,6 +4438,12 @@ ROM_START( silgola6 )
ROM_END
+// 10272711 / JB091/2
+// Sky Dancer / A - 28/08/08
+// Variations (% and NO):
+// 87.80% 99
+// 90.09% 01
+// 92.05% 02
ROM_START( skydnca6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2857,6 +4456,12 @@ ROM_START( skydnca6 )
ROM_END
+// 10000311 / 642
+// Spring Carnival / Local / C - 15/11/99
+// Variations (% and NO):
+// 87.93% 99 (9 line) 87.96% 99 (20 line)
+// 90.19% 01 (9 line) 90.17% 01 (20 line)
+// 92.14% 02 (9 line) 92.17% 02 (20 line)
ROM_START( spgcarn )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2865,6 +4470,10 @@ ROM_START( spgcarn )
ROM_END
+// 10008011 / 642
+// Spring Carnival / QLD QCOM / E - 27/02/01
+// Variations (% and NO):
+// 87.93% 99 (9 line) 87.96% 99 (20 line)
ROM_START( spgcarnq )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2875,6 +4484,10 @@ ROM_START( spgcarnq )
ROM_END
+// 20262311 / JB040
+// Spring Festival / Local / C - 03/06/08
+// Variations (% and NO):
+// 87.88% 99
ROM_START( spgfest )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2887,6 +4500,12 @@ ROM_START( spgfest )
ROM_END
+// 20150811 / 717/2
+// Star Drifter / Local / A - 15/09/03
+// Variations (% and NO):
+// 87.58% 99
+// 90.03% 01
+// 92.11% 02
ROM_START( stardrft )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2895,6 +4514,14 @@ ROM_START( stardrft )
ROM_END
+// 0451341 / MV4204/1
+// Star Drifter / Local / A - 02/16/04
+// Variations (% and NO):
+// 87.581% 99
+// 90.033% 01
+// 92.110% 02
+// 94.711% 03
+// 97.031% 04
ROM_START( stardrftu )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2905,6 +4532,14 @@ ROM_START( stardrftu )
ROM_END
+// 10009511 / 659/2
+// Star Quest / Local / B - 29/10/01
+// Variations (% and NO):
+// 90.08% 99
+// 87.72% 01
+// 92.07% 02
+// 94.81% 03
+// 94.05% 04
ROM_START( starqst )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2913,6 +4548,14 @@ ROM_START( starqst )
ROM_END
+// 0251147 / US146
+// Status Symbols / Local / A - 02/10/05
+// Variations (% and NO):
+// 87.546% 99
+// 90.017% 01
+// 92.375% 02
+// 94.984% 03
+// 97.061% 04
ROM_START( statsymb )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2921,6 +4564,15 @@ ROM_START( statsymb )
ROM_END
+// 0251303 / MV4173
+// Sun & Moon / Local / C - 04/01/03
+// Same date string as earlier version
+// Variations (% and NO):
+// 87.974% 99
+// 89.962% 01
+// 92.071% 02
+// 94.981% 03
+// 94.407% 04
ROM_START( sunmoon )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2931,6 +4583,14 @@ ROM_START( sunmoon )
ROM_END
+// 0151303 / MV4173
+// Sun & Moon / Local / C - 04/01/03
+// Variations (% and NO):
+// 87.974% 99
+// 89.962% 01
+// 92.071% 02
+// 94.981% 03
+// 94.407% 04
ROM_START( sunmoona )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2941,20 +4601,40 @@ ROM_START( sunmoona )
ROM_END
+// 0153028 / MV4173/2
+// Sun & Moon (Bank Buster) / Local / N/A
+// Variations (% and NO):
+// 72.868% 99
+// 73.862% 01
+// 74.805% 02
+// 72.868% 03 (same %, different variations)
+// 73.862% 04
+// 74.805% 05
ROM_START( sunmonbb )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("0153028.u21", 0x0000000, 0x0400000, CRC(b6a8df40) SHA1(316e3f98b75c1bdd0e8fc55aee2cf20b8a45ff4c) )
- ROM_LOAD32_WORD("0153028.u11", 0x0000002, 0x0400000, CRC(b0cc922d) SHA1(5a45d0c995c639739176a5aad42e186b122eead1) )
- ROM_LOAD32_WORD("0153028.u22", 0x0800000, 0x0400000, CRC(98cde50e) SHA1(68e60411a8c10b73482a4cc8d3f14ebdedca0ae9) )
- ROM_LOAD32_WORD("0153028.u12", 0x0800002, 0x0400000, CRC(542ec911) SHA1(48988bdefb9ad6a7e0c733eda1f220b0347cab5f) )
- ROM_LOAD32_WORD("0153028.u23", 0x1000000, 0x0400000, CRC(ac9143cc) SHA1(75aeea2ad26044bef9eb31495d67414a416ee6d4) )
- ROM_LOAD32_WORD("0153028.u13", 0x1000002, 0x0400000, BAD_DUMP CRC(0ac455b1) SHA1(3ca4f4a0172f18692c9f82a9a435ffc1ca39ddc2) )
- ROM_LOAD32_WORD("0153028.u24", 0x1800000, 0x0400000, CRC(a5552dd3) SHA1(1bbe24950e19441ca5144cb9b38320803bd5d26e) )
- ROM_LOAD32_WORD("0153028.u14", 0x1800002, 0x0400000, CRC(19e5b7e0) SHA1(cf17a84ba08a2f24725d4ccbe046710c2f3a2459) )
-ROM_END
-
-
+ ROM_LOAD32_WORD("0153028.u11", 0x0000000, 0x0400000, CRC(b6a8df40) SHA1(316e3f98b75c1bdd0e8fc55aee2cf20b8a45ff4c) )
+ ROM_LOAD32_WORD("0153028.u21", 0x0000002, 0x0400000, CRC(b0cc922d) SHA1(5a45d0c995c639739176a5aad42e186b122eead1) )
+ ROM_LOAD32_WORD("0153028.u12", 0x0800000, 0x0400000, CRC(98cde50e) SHA1(68e60411a8c10b73482a4cc8d3f14ebdedca0ae9) )
+ ROM_LOAD32_WORD("0153028.u22", 0x0800002, 0x0400000, CRC(542ec911) SHA1(48988bdefb9ad6a7e0c733eda1f220b0347cab5f) )
+ ROM_LOAD32_WORD("0153028.u13", 0x1000000, 0x0400000, CRC(ac9143cc) SHA1(75aeea2ad26044bef9eb31495d67414a416ee6d4) )
+ ROM_LOAD32_WORD("0153028.u23", 0x1000002, 0x0400000, BAD_DUMP CRC(0ac455b1) SHA1(3ca4f4a0172f18692c9f82a9a435ffc1ca39ddc2) )
+ ROM_LOAD32_WORD("0153028.u14", 0x1800000, 0x0400000, CRC(a5552dd3) SHA1(1bbe24950e19441ca5144cb9b38320803bd5d26e) )
+ ROM_LOAD32_WORD("0153028.u24", 0x1800002, 0x0400000, CRC(19e5b7e0) SHA1(cf17a84ba08a2f24725d4ccbe046710c2f3a2459) )
+ROM_END
+
+
+// 0451327 / MV2070/1
+// Sun Queen / Local / B - 11/24/03
+// Variations (% and NO):
+// 89.993% 99
+// 89.995% 01
+// 91.973% 02
+// 91.995% 03
+// 94.973% 04
+// 94.995% 05
+// 96.723% 06
+// 96.995% 07
ROM_START( sunqndol )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2965,6 +4645,13 @@ ROM_START( sunqndol )
ROM_END
+// 20203611 / 794
+// Super Bucks V / Local / A - 03/08/05
+// Variations (% and NO):
+// 90.11% 99
+// 87.94% 01
+// 91.89% 02
+// 94.86% 03
ROM_START( sbuk5 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2975,6 +4662,14 @@ ROM_START( sbuk5 )
ROM_END
+// 0151183 / US169
+// Sweethearts II / Local / A - 7/5/05
+// Variations (% and NO):
+// 87.181% 99
+// 90.151% 01
+// 92.252% 02
+// 94.972% 03
+// 97.055% 04
ROM_START( swhr2a6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2983,6 +4678,12 @@ ROM_START( swhr2a6 )
ROM_END
+// 10119811 / 712
+// Sweethearts II (Lucky Devil) / Local / C - 16/10/02
+// Variations (% and NO):
+// 87.84% 99
+// 89.81% 01
+// 86.12% 02
ROM_START( swh2ld )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2993,6 +4694,11 @@ ROM_START( swh2ld )
ROM_END
+// 10238911 / 765/2
+// Tahiti Magic / Local / C - 07/12/06
+// Variations (% and NO):
+// 87.90% 99
+// 90.18% 01
ROM_START( tahitim )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3001,6 +4707,12 @@ ROM_START( tahitim )
ROM_END
+// 10119321 / 707
+// Thai Princess / Local / A - 17/09/02
+// Variations (% and NO):
+// 87.51% 99
+// 89.80% 01
+// 92.02% 02
ROM_START( thaiprnc )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3011,6 +4723,14 @@ ROM_START( thaiprnc )
ROM_END
+// 30127721 / 707
+// Thai Princess / Crown / E - 21/03/03
+// Variations (% and NO):
+// 87.51% 99
+// 89.80% 01
+// 92.01% 02
+// 88.23% 03
+// 87.03% 04
ROM_START( thaiprncm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3021,6 +4741,14 @@ ROM_START( thaiprncm )
ROM_END
+// 10173811 / 758
+// Thunder Heart / Local / B - 11/05/04
+// 'Thunderheart' on artwork, 'Thunder Heart' in ROM
+// Variations (% and NO):
+// 90.18% 99
+// 87.85% 01
+// 92.07% 02
+// 94.91% 03
ROM_START( thndrhrt )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3029,6 +4757,12 @@ ROM_START( thndrhrt )
ROM_END
+// 20230111 / 807
+// Tigress / Local / C - 03/04/07
+// Variations (% and NO):
+// 87.93% 99
+// 90.05% 01
+// 91.96% 02
ROM_START( tigress )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3037,6 +4771,11 @@ ROM_START( tigress )
ROM_END
+// 10239111 / 831
+// Tiki Talk / D - 28/03/07
+// Variations (% and NO):
+// 87.95% 99
+// 90.04% 01
ROM_START( tikitalk )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3045,6 +4784,15 @@ ROM_START( tikitalk )
ROM_END
+// 0151003 / MV4130/4
+// Tiki Torch / Local / A - 08/10/01
+// MV4130/5 (alternate string)
+// Variations (% and NO):
+// 87.598% 99 (9 line) 87.546% 99 (20 line)
+// 90.059% 01 (9 line) 90.017% 01 (20 line)
+// 92.087% 02 (9 line) 92.375% 02 (20 line)
+// 94.895% 03 (9 line) 94.984% 03 (20 line)
+// 97.119% 04 (9 line) 97.061% 04 (20 line)
ROM_START( tiktorch )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3055,6 +4803,13 @@ ROM_START( tiktorch )
ROM_END
+// 0154013 / MV4333/1
+// Timber Wolf / N/A
+// Variations (% and NO):
+// 87.432% 99
+// 90.142% 01
+// 91.108% 02
+// 94.427% 03
ROM_START( timbwolf )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3065,6 +4820,14 @@ ROM_START( timbwolf )
ROM_END
+// 30123211 / 714
+// Top Shot / Local / C - 16/12/02
+// Variations (% and NO):
+// 90.01% 99
+// 87.50% 01
+// 92.02% 02
+// 94.53% 03
+// 93.51% 04
ROM_START( topshta6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3073,6 +4836,12 @@ ROM_START( topshta6 )
ROM_END
+// 10000411 / 602/19
+// Torch of the Gods / Local / B - 09/08/00
+// Variations (% and NO):
+// 87.870% 99
+// 90.310% 01
+// 92.260% 02
ROM_START( torgods )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3083,16 +4852,30 @@ ROM_START( torgods )
ROM_END
+// 20007521 / 650/2
+// Touch of Paradice / Local / A - 24/04/01
+// Variations (% and NO):
+// 87.97% 99
+// 90.00% 01
+// 92.06% 02
ROM_START( toprdice )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("20007511.u86", 0x0000000, 0x0400000, CRC(2a3ae479) SHA1(30d5df8eb75775831d4b0792661168288cedbb16) )
- ROM_LOAD32_WORD("20007511.u73", 0x0000002, 0x0400000, CRC(e66f5672) SHA1(9bc92c061fcaf8803878941b9b74a7bc41beb299) )
- ROM_LOAD32_WORD("20007511.u85", 0x0800000, 0x0400000, CRC(9793d2c1) SHA1(50e9d644b6519f941781b726a8d566cae6bb262e) )
- ROM_LOAD32_WORD("20007511.u72", 0x0800002, 0x0400000, CRC(f2ccd55e) SHA1(24738035abc26459d3d06831c907da98aea9c257) )
+ ROM_LOAD32_WORD("20007521.u86", 0x0000000, 0x0400000, CRC(2a3ae479) SHA1(30d5df8eb75775831d4b0792661168288cedbb16) )
+ ROM_LOAD32_WORD("20007521.u73", 0x0000002, 0x0400000, CRC(e66f5672) SHA1(9bc92c061fcaf8803878941b9b74a7bc41beb299) )
+ ROM_LOAD32_WORD("20007521.u85", 0x0800000, 0x0400000, CRC(9793d2c1) SHA1(50e9d644b6519f941781b726a8d566cae6bb262e) )
+ ROM_LOAD32_WORD("20007521.u72", 0x0800002, 0x0400000, CRC(f2ccd55e) SHA1(24738035abc26459d3d06831c907da98aea9c257) )
ROM_END
+// 0152570 / MV4268
+// Treasure King / Local / NA
+// Variations (% and NO):
+// 87.928% 99
+// 90.511% 01
+// 92.161% 02
+// 94.941% 03
+// 97.325% 04
ROM_START( trsking )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3103,6 +4886,12 @@ ROM_START( trsking )
ROM_END
+// 10234711 / 819/1
+// Turtle Treasure / Local / A - 06/10/2006
+// Variations (% and NO):
+// 87.91% 99
+// 90.15% 01
+// 92.20% 02
ROM_START( turtreas )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3113,6 +4902,12 @@ ROM_START( turtreas )
ROM_END
+// 1J008911 / JB016/1
+// Venetian Nights / NSW/ACT / D - 05/08/02
+// Variations (% and NO):
+// 87.99% 99
+// 90.11% 01
+// 92.15% 02
ROM_START( venetian )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3123,6 +4918,14 @@ ROM_START( venetian )
ROM_END
+// 0151355 / JB016/20
+// Venice / Local / F - 07/06/04
+// Variations (% and NO):
+// 87.938% 99
+// 90.088% 01
+// 92.194% 02
+// 94.961% 03
+// 97.015% 04
ROM_START( venice )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3133,6 +4936,13 @@ ROM_START( venice )
ROM_END
+// 10288711 / 939
+// Werewolf Wild / A - 03/12/09
+// Variations (% and NO):
+// 87.76% 99
+// 90.13% 01
+// 88.42% 07
+// 87.12% 09
ROM_START( werewild )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3145,6 +4955,14 @@ ROM_START( werewild )
ROM_END
+// 20290711 / 939
+// Werewolf Wild / C - 14/10/10
+// Variations (% and NO):
+// 87.76% 99
+// 90.13% 01
+// 91.82% 02
+// 94.58% 03
+// 85.53% 04
ROM_START( werewildq )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3157,6 +4975,10 @@ ROM_START( werewildq )
ROM_END
+// 20155711 / 695
+// Whales of Cash / ASP / A - 14/06/02
+// Variations (% and NO):
+// 87.59% 99
ROM_START( whalecsh )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3167,6 +4989,14 @@ ROM_START( whalecsh )
ROM_END
+// 0451311 / MV4174
+// Whales of Cash / Local / A - 03/31/03
+// Variations (% and NO):
+// 87.345% 99
+// 89.923% 01
+// 92.011% 02
+// 94.550% 03
+// 97.010% 04
ROM_START( whalecshu )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3177,6 +5007,14 @@ ROM_START( whalecshu )
ROM_END
+// 0451346 / MV4214
+// Whales of Cash / Local / B - 01/14/05
+// Variations (% and NO):
+// 87.269% 99
+// 90.059% 01
+// 92.428% 02
+// 95.060% 03
+// 97.200% 04
ROM_START( whalecshua )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3187,6 +5025,11 @@ ROM_START( whalecshua )
ROM_END
+// 10124811 / 756
+// Where's The Gold / Local / B - 26/02/04
+// Variations (% and NO):
+// 87.95% 99
+// 90.08% 01
ROM_START( wheregld )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3197,6 +5040,15 @@ ROM_START( wheregld )
ROM_END
+// 10124811 / 756
+// Where's The Gold / Local / B - 26/02/04
+// SHOW PROGRAM
+// Variations (% and NO):
+// 87.95% 99
+// Identified as 101248AD in the Machine Identification menu, rather than 101248AV from the parent set
+// We had no pics of the ROM labels for the Show Program games
+// they probably have some different string in the label but
+// we just append a "sp__" prefix for the moment
ROM_START( wheregldsp )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3207,6 +5059,10 @@ ROM_START( wheregldsp )
ROM_END
+// 20177111 / 756
+// Where's The Gold / Local / C - 17/06/04
+// Variations (% and NO):
+// 87.95% 99
ROM_START( wheregldm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3219,6 +5075,10 @@ ROM_START( wheregldm )
ROM_END
+// 20184811 / 756
+// Where's The Gold / QCOM / D - 21/06/05
+// Variations (% and NO):
+// 87.95% 99
ROM_START( wheregldq )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3229,6 +5089,15 @@ ROM_START( wheregldq )
ROM_END
+// 0151075 / US054
+// WhiteWater / Local / A - 4/11/03
+// 'White Water' on artwork, 'whiteWater' in ROM
+// Variations (% and NO):
+// 87.813% 99
+// 90.115% 01
+// 92.730% 02
+// 94.720% 03
+// 97.302% 04
ROM_START( whtwater )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3239,24 +5108,39 @@ ROM_START( whtwater )
ROM_END
+// 10214011 / 796
+// Wicked Winnings II - Power Pay / Local / A - 28/02/06
+// Variations (% and NO):
+// 85.23% 99
+// 87.50% 01
ROM_START( wikwin2 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
ROM_LOAD32_WORD("10214011.u86", 0x0000000, 0x0400000, CRC(226c8d1c) SHA1(37769691d1b7e308cbd1d857e8695f1e129a6722) )
ROM_LOAD32_WORD("10214011.u73", 0x0000002, 0x0400000, CRC(6662912d) SHA1(017e1684de64308b035b817b6fad954be538b78c) )
- ROM_END
+ROM_END
+// 0351083 / MV4076
+// Wild Africa ML / Local / D - 5/08/02
+// Variations (% and NO):
+// 82.306% 05 (Hyperlink)
+// 82.306% 07 (same RTP, different variation)
ROM_START( wldafr )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
ROM_LOAD32_WORD("0351083.u86", 0x0000000, 0x0400000, CRC(2193094c) SHA1(57d687301a59f36880560a3efc7040e333cb05d3) )
ROM_LOAD32_WORD("0351083.u73", 0x0000002, 0x0400000, CRC(e1e1253e) SHA1(4c15c953b80288df8f97197d70c8076fde9a0d29) )
- ROM_LOAD32_WORD("0351083.u85", 0x0800000, 0x0400000, CRC(7ecbb5ba) SHA1(ab201ad7db848f5c03e3795c63308530b371d354) )
- ROM_LOAD32_WORD("0351083.u72", 0x0800002, 0x0400000, CRC(a55417ca) SHA1(151615f81112b30aff2a2aa26280b7c1bf0d45db) )
+ ROM_LOAD32_WORD("0351083.u85", 0x0800000, 0x0400000, CRC(ca451b30) SHA1(e201c06c45ee376a68bb4260cd99f0575bfac400) )
+ ROM_LOAD32_WORD("0351083.u72", 0x0800002, 0x0400000, CRC(130c5385) SHA1(523b0d57b533b9b3e0fd8c0305c6099219bf2785) )
ROM_END
+// 10237511 / 811
+// Wild Cats / B - 20/6/06
+// Variations (% and NO):
+// 87.82% 99
+// 90.06% 01
ROM_START( wldcata6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3267,6 +5151,11 @@ ROM_START( wldcata6 )
ROM_END
+// 20131911 / 732
+// Wild Goose / Local / B - 02/06/03
+// Variations (% and NO):
+// 87.62% 99
+// 90.09% 01
ROM_START( wldgoos )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3277,6 +5166,11 @@ ROM_START( wldgoos )
ROM_END
+// 20279811 / JB108/2
+// Wild Gorilla / B - 19/06/09
+// Variations (% and NO):
+// 85.17% 99
+// 87.57% 01
ROM_START( wgorilla )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3287,6 +5181,12 @@ ROM_START( wgorilla )
ROM_END
+// 20218411 / 800
+// Wild Panda / Local / E - 07/08/06
+// Variations (% and NO):
+// 87.98% 99
+// 90.10% 01
+// 91.99% 02
ROM_START( wldpanda )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3297,6 +5197,10 @@ ROM_START( wldpanda )
ROM_END
+// 0651310 / MV4187
+// WILD PANTHERS / Local / D- 01/15/04
+// Variations (% and NO):
+// 92.475% 99
ROM_START( wldpanth )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3307,6 +5211,13 @@ ROM_START( wldpanth )
ROM_END
+// 10230811 / 805
+// Wild Stallion / Local / B - 12/09/2006
+// Variations (% and NO):
+// 90.20% 99
+// 87.90% 01
+// 91.84% 02
+// 94.87% 03
ROM_START( wldstall )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3317,16 +5228,27 @@ ROM_START( wldstall )
ROM_END
+// 20230211 / US054
+// Wild Tepee - Power Pay / Local / H - 20/04/07
+// Variations (% and NO):
+// 87.05% 99
+// 85.01% 01
ROM_START( wtepee )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("10230211.u86", 0x0000000, 0x0400000, CRC(8c38fa9c) SHA1(0f64da87271f90309b0945403cc24fdf82c5c5a2) )
- ROM_LOAD32_WORD("10230211.u73", 0x0000002, 0x0400000, CRC(6c0a4268) SHA1(c18ad70332ec300b227edfc684db97d517031ff1) )
- ROM_LOAD32_WORD("10230211.u85", 0x0800000, 0x0400000, CRC(e5492c9b) SHA1(bd71198f24adab2841f177598d1ed8ae07aeb971) )
- ROM_LOAD32_WORD("10230211.u72", 0x0800002, 0x0400000, CRC(0c5c51c2) SHA1(6423e160355ad0380cbb46e7462f913a67e9b29d) )
+ ROM_LOAD32_WORD("20230211.u86", 0x0000000, 0x0400000, CRC(8c38fa9c) SHA1(0f64da87271f90309b0945403cc24fdf82c5c5a2) )
+ ROM_LOAD32_WORD("20230211.u73", 0x0000002, 0x0400000, CRC(6c0a4268) SHA1(c18ad70332ec300b227edfc684db97d517031ff1) )
+ ROM_LOAD32_WORD("20230211.u85", 0x0800000, 0x0400000, CRC(e5492c9b) SHA1(bd71198f24adab2841f177598d1ed8ae07aeb971) )
+ ROM_LOAD32_WORD("20230211.u72", 0x0800002, 0x0400000, CRC(0c5c51c2) SHA1(6423e160355ad0380cbb46e7462f913a67e9b29d) )
ROM_END
+// 10215911 / 811
+// WILD WARATAH / Local / A - 14/02/06
+// Variations (% and NO):
+// 87.82% 99
+// 90.06% 01
+// 91.83% 02
ROM_START( wwaratah )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3337,6 +5259,15 @@ ROM_START( wwaratah )
ROM_END
+// 10215911 / 811
+// WILD WARATAH / Local / A - 14/02/06
+// SHOW PROGRAM
+// Variations (% and NO):
+// 87.82% 99
+// Identified as 102159AD in the Machine Identification menu, rather than 102159AV from the parent set
+// We had no pics of the ROM labels for the Show Program games
+// they probably have some different string in the label but
+// we just append a "sp__" prefix for the moment
ROM_START( wwaratahsp )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3347,6 +5278,12 @@ ROM_START( wwaratahsp )
ROM_END
+// 10106911 / 698
+// Wild Ways / Local / B - 19/06/02
+// Variations (% and NO):
+// 87.52% 99
+// 90.02% 01
+// 92.11% 02
ROM_START( wways )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3357,6 +5294,10 @@ ROM_START( wways )
ROM_END
+// 10130111 / 698/1
+// Wild Ways / Local / A - 25/02/03
+// Variations (% and NO):
+// 87.06% 99
ROM_START( wwaysm )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3367,6 +5308,14 @@ ROM_START( wwaysm )
ROM_END
+// 0252529 / MV4237/1
+// Wings Over Olympus / Local / A - 03/07/05
+// Variations (% and NO):
+// 87.920% 99
+// 90.128% 01
+// 91.921% 02
+// 94.916% 03
+// 97.058% 04
ROM_START( wingoly )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3377,18 +5326,39 @@ ROM_START( wingoly )
ROM_END
+// 20139121 / 698
+// Wizard Ways (Lady Luck) / Local / H - 30/06/03
+// Variations (% and NO):
+// 88.60% 02
+// 87.64% 03
+// 86.91% 04
+// 86.05% 05
ROM_START( wzwaysll )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
- ROM_LOAD32_WORD("20139111.u86", 0x0000000, 0x0400000, CRC(c8dffeef) SHA1(20d710356282c434523c5828fdb56e3da37d3371) )
- ROM_LOAD32_WORD("20139111.u73", 0x0000002, 0x0400000, CRC(5663bb95) SHA1(0df425bb4130079757fbbc6b5532c2f6a1a32920) )
- ROM_LOAD32_WORD("20139111.u85", 0x0800000, 0x0400000, CRC(6a8efdf2) SHA1(38b955755bbc2f2a6c8c987b0cae92d314d727c9) )
- ROM_LOAD32_WORD("20139111.u72", 0x0800002, 0x0400000, CRC(944dc1ec) SHA1(7dd2b14eb0af7babc9de09f247776f4a24d53e6c) )
- ROM_LOAD32_WORD("20139111.u84", 0x1000000, 0x0400000, CRC(0399bc1d) SHA1(19cd298d439dddac482c1d7f1fd7446900b39c46) )
- ROM_LOAD32_WORD("20139111.u71", 0x1000002, 0x0400000, CRC(e8f8ffb1) SHA1(3aa4f8d959e9671ae93c9946b5420d55c45b1bbc) )
-ROM_END
-
-
+ /*
+ 20139121 NSW WIZARD WAYS 702 4MB 6 eproms Aristocrat © 2003 P U86
+ 20139121 NSW WIZARD WAYS 702 4MB 6 eproms Aristocrat © 2003 P U73
+ 20139121 NSW WIZARD WAYS 702 4MB 6 eproms Aristocrat © 2003 P U85
+ 20139121 NSW WIZARD WAYS 702 4MB 6 eproms Aristocrat © 2003 P U72
+ 20139121 NSW WIZARD WAYS 702 4MB 6 eproms Aristocrat © 2003 P U84
+ 20139121 NSW WIZARD WAYS 702 4MB 6 eproms Aristocrat © 2003 P U71
+ */
+ ROM_LOAD32_WORD("20139121.u86", 0x0000000, 0x0400000, CRC(c8dffeef) SHA1(20d710356282c434523c5828fdb56e3da37d3371) )
+ ROM_LOAD32_WORD("20139121.u73", 0x0000002, 0x0400000, CRC(5663bb95) SHA1(0df425bb4130079757fbbc6b5532c2f6a1a32920) )
+ ROM_LOAD32_WORD("20139121.u85", 0x0800000, 0x0400000, CRC(6a8efdf2) SHA1(38b955755bbc2f2a6c8c987b0cae92d314d727c9) )
+ ROM_LOAD32_WORD("20139121.u72", 0x0800002, 0x0400000, CRC(944dc1ec) SHA1(7dd2b14eb0af7babc9de09f247776f4a24d53e6c) )
+ ROM_LOAD32_WORD("20139121.u84", 0x1000000, 0x0400000, CRC(0399bc1d) SHA1(19cd298d439dddac482c1d7f1fd7446900b39c46) )
+ ROM_LOAD32_WORD("20139121.u71", 0x1000002, 0x0400000, CRC(e8f8ffb1) SHA1(3aa4f8d959e9671ae93c9946b5420d55c45b1bbc) )
+ROM_END
+
+
+// 30130611 / 743
+// ZORRO / Local / B - 5/09/2003
+// Variations (% and NO):
+// 87.86% 99
+// 85.11% 01
+// 89.41% 02
ROM_START( zorroa6 )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3399,6 +5369,17 @@ ROM_START( zorroa6 )
ROM_END
+// 0151372 / MV4212
+// ZORRO / Local / F - 05/13/05
+// Variations (% and NO):
+// 88.045% 02
+// 88.044% 03
+// 88.114% 04
+// 88.114% 05
+// 90.045% 06
+// 90.044% 07
+// 90.114% 08
+// 90.114% 09
ROM_START( zorroa6u )
ARISTMK6_BIOS
ROM_REGION64_LE( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3411,10 +5392,10 @@ ROM_START( zorroa6u )
ROM_END
-GAME( 2000, aristmk6, 0, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Aristocrat MK6 System Software", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IS_BIOS_ROOT)
+GAME( 2000, aristmk6, 0, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "MK6 System Software/Setchips", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IS_BIOS_ROOT)
// Dates listed below are for the combination (reel layout), not release dates
-// Hyperlink jackpot versions e.g. Bank Buster, Cash Express, Jackpot Carnival and Maximillions are considered clones if an original set exists
+// Hyperlink jackpot versions e.g. Bank Buster, Cash Express, Fast Lane, Jackpot Carnival and Maximillions are considered clones if an original set exists
GAME( 2004, 5drag, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "5 Dragons (20161011, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 744, C - 14/01/04
GAME( 2004, 5dragsp, 5drag, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "5 Dragons (20161011, NSW/ACT, Show Program)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 744, C - 14/01/04
GAME( 2007, 5dragce, 5drag, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "5 Dragons - Cash Express (0152309, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US211, A - 01/09/07
@@ -3431,9 +5412,7 @@ GAME( 2003, alchemy, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2007, atkgld, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "All the King's Gold (0152152, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US209, A - 01/08/07
GAME( 2001, amzqueen, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Amazon Queen (10005511, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 669, A - 02/05/01
GAME( 2009, amztempl, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Amazon Temple (10299811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 906, A - 29/04/09
-GAME( 2004, antcleo, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Antony and Cleopatra (10163211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 754, A - 15/01/04
GAME( 2004, antcleom, antcleo, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Antony and Cleopatra (10177211, Malaysia)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 754, B - 12/07/04
-GAME( 2003, apocof, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Apollo Coffee (0151105, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US083, A - 11/10/03
GAME( 2001, arabnga6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Arabian Nights (2J008211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB009/1, E - 10/12/01
GAME( 2004, arabnga6u, arabnga6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Arabian Nights (0151356, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB016/21, E - 07/06/04
GAME( 2003, arwincm, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Arctic Wins - Mr. Cashman (0151065, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US029, E- 01/27/03
@@ -3449,7 +5428,7 @@ GAME( 2002, bigred, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2002, bigreda, bigred, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Big Red (1J009211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB015, D - 27/09/02
GAME( 2005, bigred2, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Big Red 2 (5J011311, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB024, B - 18/05/05
GAME( 2002, blkbrum, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Black Brumby (1J009111, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB010, C - 14/06/02
-GAME( 200?, blkmust, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Black Mustang (0152584, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB014/21, (no data)
+GAME( 2006, blkmust, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Black Mustang (0152584, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB014/21, (no data)
GAME( 2007, bluetigr, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Blue Tiger (20259511, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 855, A - 12/12/07
GAME( 2007, bobdolly, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Bob and Dolly (0352298, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US243, A - 10/15/07
GAME( 2005, brazil, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Brazil (20180311, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 783, B - 25/02/05
@@ -3484,6 +5463,7 @@ GAME( 2004, deltaqn, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2004, dimeye, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Diamond Eyes (0251312, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB012/20, J - 01/22/04
GAME( 2004, dimeyece, dimeye, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Diamond Eyes - Cash Express (0152039, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB012/20, J - 01/22/04
GAME( 2002, di4ever, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Diamonds Forever (10105011, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 679, B - 14/03/02
+GAME( 2007, diamhrts, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Diamonds & Hearts - Power Pay (10229311, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 821, D - 22/02/07
GAME( 2003, dinosa6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Dinosaur (10118811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 731, C - 08/08/03
GAME( 2005, dblagent, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Double Agent (0152082, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US180, A - 12/09/05
GAME( 2000, dbldolph, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Double Dolphins (20000211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 647, C - 18/04/00
@@ -3496,7 +5476,6 @@ GAME( 2004, eaglrock, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2010, estrike, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Eagle Strike (40289711, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 950, A - 20/07/10
GAME( 2004, eastland, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Easter Island - Cash Express (0151117, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US052, B - 02/22/04
GAME( 2005, eggsrccm, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Eggstreme Riches - Mr. Cashman (0351149, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US144, B - 11/3/05
-GAME( 200?, efce, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Enchanted Forest - Cash Express (0151084, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // ???, ???
GAME( 2007, encspell, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Enchanted Spell (10257011, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB041, B - 18/07/07
GAME( 2000, enchantr, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Enchantress (20000711, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 633, C- 15/01/00
GAME( 2000, eott, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Eyes of the Tiger (10002011, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 658, B - 01/06/00
@@ -3515,7 +5494,7 @@ GAME( 2001, gogreen, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2005, goldarch, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Golden Archer (10197411, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 770, A - 07/07/05
GAME( 2003, gldnflc, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "The Golden Fleece (10158311, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 680/2, A-07/07/03
GAME( 2005, gldgong, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "The Golden Gong (0152558, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4258, C - 08/18/05
-GAME( 2005, gldgongq, gldgong, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "The Golden Gong (10217411, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 710/3, C - 09/08/05, Identical date string to Big Ben above (the games are identical but with different graphics)
+GAME( 2005, gldgongq, gldgong, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "The Golden Gong (10217411, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 710/3, C - 09/08/05, Identical date string to Big Ben (the games are identical but with different graphics)
GAME( 2004, goldinc, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Golden Incas (10174011, NSW/ACT, Show Program)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 752, A - 07/04/04
GAME( 2005, goldincu, goldinc, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Golden Incas (0252533, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4244, A - 03/10/05
GAME( 2002, goldpym, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Golden Pyramids Special Edition - Maximillions (10130811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 683/1, A - 21/10/02
@@ -3552,27 +5531,25 @@ GAME( 2004, lemrol, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2005, lineking, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Line King (0252534, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4245, F - 11/10/05
GAME( 2002, lordleo, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Lord Leopard (30111211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 685, B - 27/05/02
GAME( 2001, lougcm, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Louie's Gold - Mr. Cashman (20006911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 674, C- 13/07/01
-GAME( 200?, lovestuk, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Love Stuck (0152583, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4285, (no data)
GAME( 2007, lucky88, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Lucky 88 (10241411, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 840, C - 25/06/07
GAME( 2007, luigibal, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Luigi's Ball (10235411, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 822, D - 19/03/07
GAME( 2005, magforst, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Magic Forest (0151139, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US141, D - 02/01/05
GAME( 2003, magmerm, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Magic Mermaid (0251331, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB013/20, F - 10/13/03
GAME( 2006, magician, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "The Magician (20210111, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 801, C - 01/03/06
+GAME( 2008, mchilli, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "More Chilli (20248711, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 844, B - 21/01/08
+GAME( 2010, mchilliq, mchilli, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "More Chilli (20289311, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 844/2, B - 14/12/10
GAME( 2007, metestrm, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Meteor Storm (0152162, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US217, A - 03/19/07
GAME( 2007, milkin, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Milkin' It (10251911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 816, B - 13/08/07
-GAME( 2005, mskitty, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Miss Kitty (10216611, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 778, C - 18/04/05
GAME( 2000, mnytree, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Money Tree (10001211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 657, E - 06/11/00
GAME( 2004, moonfire, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Moon Fire - Jackpot Carnival (30164211, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 628/3, E - 27/01/04
GAME( 2007, moonwalt, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Moonlight Waltz (10227611, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 814/1, B - 11/01/07
-GAME( 2008, mchilli, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "More Chilli (20248711, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 844, B - 21/01/08
-GAME( 2010, mchilliq, mchilli, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "More Chilli (20289311, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 844/2, B - 14/12/10
GAME( 200?, mrwoo, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Mr Woo (0252599, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4276, (no data)
+GAME( 2005, mskitty, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Miss Kitty (10216611, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 778, C - 18/04/05
GAME( 2002, mystarr, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Mystic Arrow (0151009, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US005, A - 01/07/02
GAME( 2001, mysteycm, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Mystic Eyes - Mr. Cashman (10008111, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 675, A- 09/05/01
GAME( 2002, mysteycmu, mysteycm, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Mystic Eyes - Mr. Cashman (0251024, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US020, C- 31/05/02
GAME( 2002, mystmerm, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Mystic Mermaid (1J008711, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB013, D - 27/03/02
GAME( 2005, nerdwild, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Nerds Gone Wild (10197311, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 778, C - 18/04/05
-GAME( 200?, opsesam, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Open Sesame (0351309, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // ???, ???
GAME( 2006, orbeaut, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Oriental Beauty (10213511, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 808, A - 07/02/06
GAME( 2005, outbackj, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Outback Jack (20195211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 691, J - 02/06/05
GAME( 2001, owlcap, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Owl Capone (10008711, NSW/ACT, Show Program)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 594/9, A - 12/06/01
@@ -3584,14 +5561,14 @@ GAME( 2004, pcockmagu, pcockmag, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2004, pelipete, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Pelican Pete (10177511, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 778, A - 22/11/04
GAME( 2006, pelipetejc, pelipete, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Pelican Pete - Jackpot Carnival (10226711, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 778/2, E - 23/05/06
GAME( 2005, pelipeteu, pelipete, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Pelican Pete (0252555, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4251, C - 10/28/05
-GAME( 2005, pennyar, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Penny Arcade (0251169, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US159, A - 04/06/05
GAME( 2003, pengpyce, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Penguin Pays - Cash Express (0151120, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US055, A- 4/14/03
+GAME( 2005, pennyar, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Penny Arcade (0251169, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US159, A - 04/06/05
GAME( 2000, pharfor, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Pharaoh's Fortune (40000921, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 656, D - 11/01/00
GAME( 2005, phxfant, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Phoenix Fantasy (20197511, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 793, A - 21/07/05
GAME( 2000, pirata6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Pirates (10001511, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 661/1, B - 3/11/00
GAME( 2004, pcfavor, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Player's Choice - Favourites (20177311, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MG0002, D - 04/11/04
GAME( 2006, pcbydem, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Player's Choice - By Demand (10223111, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MG0005, D - 25/09/06
-GAME( 2006, pcmostw, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Player's Choice - Most Wanted (20234911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MG0010, C - 09/11/06
+GAME( 2008, pcmostw, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Player's Choice - Most Wanted (20234911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MG0010, C - 09/11/06
GAME( 2010, pcgold, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Player's Choice - Gold Edition (30291411, New Zealand)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MG0047, A - 09/04/10
GAME( 2009, pcplat, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Player's Choice - Platinum (20282111, New Zealand)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MG0031, B - 04/02/09
GAME( 2004, pcorig, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Player's Choice - Original (30143011, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MG001, C - 12/01/04
@@ -3607,15 +5584,14 @@ GAME( 2001, qnilese, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2001, qnilesea, qnilese, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Queen of the Nile Special Edition (10102811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 683, A - 06/12/01
GAME( 2002, qnilejc, qnilese, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Queen of the Nile Special Edition - Jackpot Carnival (20123911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 683/1, A - 21/10/02
GAME( 2002, qnilejcsp, qnilese, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Queen of the Nile Special Edition - Jackpot Carnival (20123911, NSW/ACT, Show Program)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 683/1, A - 21/10/02
-GAME( 2003, qsheba, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Queen of Sheba (10133711, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 687, F - 04/03/03
+GAME( 2003, qsheba, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Queen of Sheba (10133721, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 687, F - 04/03/03
GAME( 2005, raprichs, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Rapid Riches (10194211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 762, D - 09/03/05
GAME( 2002, redbara6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Red Baron (10119911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 709, B - 21/11/02
GAME( 2003, redbarfl, redbara6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Red Baron - Fast Lane (10160711, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 709, E - 04/12/03
GAME( 2003, redbarjc, redbara6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Red Baron - Jackpot Carnival (10160911, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 709, E - 04/12/03, same date string as above
-// The following is clearly not a year 2000 game (an ID of #2986 would be from around 2010, note similar ID number region to buckstop/werewildq), the date string is most likely unchanged from the original MK5 20 line version which actually was released in 2000.
+// The following set is clearly not a year 2000 game (an ID of #2986 would be from around 2010, note similar ID number region to buckstop/werewildq), the date string is unchanged from the original MK5 20 line version which actually was released in 2000.
GAME( 201?, reelrkfl, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Reelin-n-Rockin - Fast Lane (10298611, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 628/2, E - 20/12/00
GAME( 2002, retsama6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Return of the Samurai (10117211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 628/10, A - 26/08/02
-GAME( 2005, roadtrip, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Road Trip (0152539, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4238, C - 08/18/05
GAME( 2002, ruprup, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Roll Up! Roll Up!! (10115911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 642/5, A - 22/08/02
GAME( 2002, rubymag, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Ruby Magic (10125711, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 698, C - 12/11/02
GAME( 2010, rumbreel, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Rumble Reels (20288611, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 949, B - 04/08/10
@@ -3640,14 +5616,12 @@ GAME( 2001, starqst, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2005, statsymb, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Status Symbols (0251147, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US146, A - 02/10/05
GAME( 2003, sunmoon, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Sun & Moon (0251303, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4173, C - 04/01/03
GAME( 2003, sunmoona, sunmoon, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Sun & Moon (0151303, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4173, C - 04/01/03
-GAME( 200?, sunmonbb, sunmoon, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Sun & Moon - Bank Buster (0153028, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4173/2, (no data)
GAME( 2003, sunqndol, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Sun Queen - Dollar Storm (0451327, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV2070/1, B - 11/24/03
GAME( 2005, sbuk5, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Super Bucks V (20203611, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 794, A - 03/08/05
GAME( 2005, swhr2a6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Sweethearts II (0151183, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US169, A - 7/5/05
GAME( 2002, swh2ld, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Sweethearts II - Lucky Devil (10119811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 712, C - 16/10/02
GAME( 2006, tahitim, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Tahiti Magic (10238911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 765/2, C - 07/12/06
GAME( 2002, thaiprnc, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Thai Princess (10119321, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 707, A - 17/09/02
-GAME( 2003, thaiprncm, thaiprnc, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Thai Princess (30127721, Malaysia)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 707, E - 21/03/03
GAME( 2004, thndrhrt, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Thunder Heart (10173811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 758, B - 11/05/04
GAME( 2007, tigress, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Tigress (20230111, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 807, C - 03/04/07
GAME( 2007, tikitalk, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Tiki Talk (10239111, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 831, D - 28/03/07
@@ -3664,7 +5638,6 @@ GAME( 2009, werewild, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2010, werewildq, werewild, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Werewolf Wild (20290711, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 939, C - 14/10/10
GAME( 2002, whalecsh, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Whales of Cash (20155711, Malaysia)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 695, A - 14/06/02
GAME( 2003, whalecshu, whalecsh, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Whales of Cash (0451311, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4174, A - 03/31/03
-GAME( 2005, whalecshua, whalecsh, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Whales of Cash (0451346, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4214, B - 01/14/05
GAME( 2004, wheregld, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Where's The Gold (10124811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 756, B - 26/02/04
GAME( 2004, wheregldsp, wheregld, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Where's The Gold (10124811, NSW/ACT, Show Program)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 756, B - 26/02/04
GAME( 2004, wheregldm, wheregld, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Where's The Gold (20177111, Malaysia)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 756, C - 17/06/04
@@ -3676,14 +5649,26 @@ GAME( 2006, wldcata6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2003, wldgoos, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Goose (20131911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 732, B - 02/06/03
GAME( 2009, wgorilla, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Gorilla - Power Pay (20279811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB108/2, B - 19/06/09
GAME( 2006, wldpanda, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Panda (20218411, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 800, E - 07/08/06
-GAME( 2004, wldpanth, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Panthers - Lil' Lucy (0651310, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4187, D- 01/15/04
GAME( 2006, wldstall, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Stallion (10230811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 805, B - 12/09/06
-GAME( 2007, wtepee, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Tepee - Power Pay (10230211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 820, H - 20/04/07
+GAME( 2007, wtepee, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Tepee - Power Pay (20230211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 820, H - 20/04/07
GAME( 2006, wwaratah, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Waratah (10215911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 811, A - 14/02/06
GAME( 2006, wwaratahsp, wwaratah, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Waratah (10215911, NSW/ACT, Show Program)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 811, A - 14/02/06
GAME( 2002, wways, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Ways (10106911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 698, B - 19/06/02
GAME( 2003, wwaysm, wways, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Ways (10130111, Malaysia)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 698/1, A - 25/02/03
GAME( 2005, wingoly, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wings Over Olympus (0252529, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4237/1, A - 03/07/05
-GAME( 2003, wzwaysll, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wizard Ways - Lady Luck (20139111, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 702, H - 30/06/03
+GAME( 2003, wzwaysll, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wizard Ways - Lady Luck (20139121, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 702, H - 30/06/03
GAME( 2003, zorroa6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Zorro (30130611, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 743, B - 5/09/03
GAME( 2005, zorroa6u, zorroa6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Zorro (0151372, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4212, F - 05/13/05
+
+// The following sets are bad dumps
+
+GAME( 2004, antcleo, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Antony and Cleopatra (10163211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 754, A - 15/01/04
+GAME( 2003, apocof, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Apollo Coffee (0151105, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US083, A - 11/10/03
+GAME( 200?, efce, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Enchanted Forest - Cash Express (0151084, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // ???, ???
+GAME( 200?, lovestuk, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Love Stuck (0152583, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4285, (no data)
+GAME( 200?, opsesam, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Open Sesame (0351309, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // ???, ???
+GAME( 2005, roadtrip, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Road Trip (0152539, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4238, C - 08/18/05
+GAME( 200?, sunmonbb, sunmoon, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Sun & Moon - Bank Buster (0153028, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4173/2, (no data)
+GAME( 2003, thaiprncm, thaiprnc, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Thai Princess (30127721, Malaysia)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 707, E - 21/03/03
+GAME( 2005, whalecshua, whalecsh, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Whales of Cash (0451346, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4214, B - 01/14/05
+GAME( 2004, wldpanth, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Panthers - Lil' Lucy (0651310, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4187, D- 01/15/04
diff --git a/src/mame/drivers/astrcorp.cpp b/src/mame/drivers/astrcorp.cpp
index e6a0b2bc31d..9d2b2570db7 100644
--- a/src/mame/drivers/astrcorp.cpp
+++ b/src/mame/drivers/astrcorp.cpp
@@ -34,11 +34,10 @@ TODO:
- Find source of level 2 interrupt (sprite DMA end?);
- magibomb: fix timings;
-- astoneag, magibombd: currently stop with 'ROM error'. The first few hundred bytes don't decrypt correctly,
+- astoneag, dinodino, magibombd: currently stop with 'ROM error'. The first few hundred bytes don't decrypt correctly,
it is suspected there's a ROM overlay provided by the protection device;
- winbingo and clones, zulu: these should be at the same state of the two above, but don't show anything on screen;
- magibomba, westvent: need a redump of one of the program ROMs;
-- dinodino: decryption should be on par with the others but code jumps early into the weeds after RTE.
*************************************************************************************************************/
@@ -97,6 +96,7 @@ protected:
// memory pointers
required_shared_ptr<u16> m_spriteram;
+ TIMER_DEVICE_CALLBACK_MEMBER(skilldrp_scanline_cb);
void draw_sprites_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void eeprom_w(u8 data);
void showhand_outputs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
@@ -107,7 +107,6 @@ protected:
u8 m_screen_enable;
private:
-
// video-related
bitmap_ind16 m_bitmap;
u16 m_sprite_dma;
@@ -115,7 +114,6 @@ private:
output_finder<7> m_lamps;
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- TIMER_DEVICE_CALLBACK_MEMBER(skilldrp_scanline_cb);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
@@ -152,6 +150,7 @@ public:
{ }
void astoneage(machine_config &config);
+ void dinodino(machine_config &config);
void magibombd(machine_config &config);
void init_astoneage();
void init_dinodino();
@@ -167,6 +166,7 @@ private:
TIMER_DEVICE_CALLBACK_MEMBER(astoneage_scanline_cb);
void astoneage_map(address_map &map);
+ void dinodino_map(address_map &map);
void magibombd_map(address_map &map);
void ramdac_map(address_map &map);
@@ -523,6 +523,23 @@ void astoneage_state::astoneage_map(address_map &map)
map(0xe00001, 0xe00001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
}
+void astoneage_state::dinodino_map(address_map &map)
+{
+ map(0x000000, 0x03ffff).rom().mirror(0x800000); // POST checks for ROM crc at mirror
+ map(0x900000, 0x903fff).ram().share("nvram"); // battery
+ map(0xb00000, 0xb00fff).ram().share("spriteram");
+ map(0xb02000, 0xb02001).w(FUNC(astoneage_state::draw_sprites_w));
+ map(0xb04000, 0xb04001).portr("INPUTS");
+ map(0xb08001, 0xb08001).w(FUNC(astoneage_state::eeprom_w));
+ map(0xb0a000, 0xb0a001).w(FUNC(astoneage_state::skilldrp_outputs_w));
+ map(0xb0e000, 0xb0e001).portr("EEPROMIN");
+ map(0xc80000, 0xc801ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
+ // unknown location
+// map(0x500001, 0x500001).w(FUNC(astoneage_state::screen_enable_w));
+ map(0x580001, 0x580001).w(FUNC(astoneage_state::oki_bank_w));
+ map(0xe00001, 0xe00001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
+}
+
void astoneage_state::magibombd_map(address_map &map) // seems to use old style palette instead of ramdac
{
map(0x000000, 0x03ffff).rom().mirror(0x800000);
@@ -816,6 +833,14 @@ void astoneage_state::magibombd(machine_config &config)
config.device_remove("ramdac");
}
+void astoneage_state::dinodino(machine_config &config)
+{
+ magibombd(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &astoneage_state::dinodino_map);
+ TIMER(config.replace(), "scantimer").configure_scanline(FUNC(astoneage_state::skilldrp_scanline_cb), "screen", 0, 1);
+}
+
/***************************************************************************
ROMs Loading
***************************************************************************/
@@ -1502,7 +1527,7 @@ ROM_START( dinodino )
ROM_LOAD( "dd_rom5.u33", 0x00000, 0x80000, CRC(482e456a) SHA1(c7111522383c4e1fd98b0f759153be98dcbe06c1) )
ROM_REGION16_BE( 0x80, "eeprom", 0 )
- ROM_LOAD( "93c46.u10", 0x0000, 0x0080, CRC(6769bfb8) SHA1(bf6b905805c2c61a89fbc4c046b23069431e4709) )
+ ROM_LOAD16_WORD_SWAP( "93c46.u10", 0x0000, 0x0080, CRC(6769bfb8) SHA1(bf6b905805c2c61a89fbc4c046b23069431e4709) )
ROM_END
@@ -1804,6 +1829,9 @@ void astoneage_state::init_dinodino()
u16 *rom = (u16 *)memregion("maincpu")->base();
rom[0x004/2] = 0x0000;
rom[0x006/2] = 0x0446;
+
+ // enable the patch below to pass ROM checksum, but then it jumps into the weeds after expecting to read something from 0xb80000
+ //rom[0x30b70/2] = 0xe5f5;
}
void magibomb_state::init_magibomb()
@@ -1857,7 +1885,7 @@ GAME( 2001, magibombc, magibomb, magibombb, magibomb, magibomb_state, init_mag
GAME( 2001?, magibombe, magibomb, magibombb, magibomb, magibomb_state, init_magibomb, ROT0, "Astro Corp.", "Magic Bomb (Ver. A3.1A)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
// Heavier encryption
-GAME( 2005, dinodino, 0, magibombd, skilldrp, astoneage_state, init_dinodino, ROT0, "Astro Corp.", "Dino Dino (Ver. A1.1)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // 13/01.2005 10:59
+GAME( 2005, dinodino, 0, dinodino, skilldrp, astoneage_state, init_dinodino, ROT0, "Astro Corp.", "Dino Dino (Ver. A1.1)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // 13/01.2005 10:59
GAME( 2005, astoneag, 0, astoneage, skilldrp, astoneage_state, init_astoneage, ROT0, "Astro Corp.", "Stone Age (Astro, Ver. ENG.03.A)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // 2005/02/21
GAME( 2005, magibombd, magibomb, magibombd, skilldrp, astoneage_state, init_magibombd, ROT0, "Astro Corp.", "Magic Bomb (Ver. AA.72D, 14/11/05)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 2006, winbingo, 0, magibombd, skilldrp, astoneage_state, init_winbingo, ROT0, "Astro Corp.", "Win Win Bingo (set 1)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // 15:47:48 Feb 23 2006
diff --git a/src/mame/drivers/asuka.cpp b/src/mame/drivers/asuka.cpp
index 6abc2719bd6..9ec361cb00d 100644
--- a/src/mame/drivers/asuka.cpp
+++ b/src/mame/drivers/asuka.cpp
@@ -61,6 +61,84 @@ The original title of the game called B68 is unknown.
This PCB is the same as the one that is used with EARTH-JOKER.
<B68 is the verified Taito ROM id# for Asuka & Asuka - B.Troha>
+***************************************************************************
+Bonze Adventure, Taito, 1988
+Hardware info by Guru
+Last Update: 25th August 2021
+
+
+PCB Layout
+----------
+
+MAIN BOARD J1100144A K1100330A
+Sticker: K1100330B JIGOKU MEGURI
+|-------------------------------------------------------------------|
+|MB3735 YM2610 Z0840004PSC B41-03.IC1|
+|VOL B41-04.IC48 B41_13.IC20 |
+| |-------| CXK5864 |
+| 4556 TL074 YM3016F |TAITO | |-------| |
+|Y |TC0140SYT 16MHz | TAITO | |
+| TMM2063 |-------| |TC0100SCN CXK58256 |
+| TL074 TMM2063 |-------| |
+| TC0110PCR CXK58256 |
+| TC0070RGB 26.868MHz |
+|J 2018 |---------| B41-02.IC6|
+|A 2018 | TAITO | |
+|M 2018 | PC0900J | |
+|M PC050CM 2018 | | |
+|A |---------| |
+| |-------------| |
+| | B41_05.IC43 | |
+| |-------------| 12MHz B41-01.IC15 |
+| 48CR-1(x6) |
+| |------------------| B41_12.IC25 B41_10.IC15 |
+| | 68000 | MB3771|
+| |------------------| B41_11-1.IC26 B41_09-1.IC17 |
+| B41-08.IC45 B41-06.IC34 |
+| SWB SWA B41-07.IC46 TMM2064 TMM2064 |
+|-------------------------------------------------------------------|
+Notes:
+ MB3735 - Fujitsu MB3735 20W BTL mono power amplifier
+ MB3771 - Fujitsu MB3771 power supply monitor IC. This is used to provide the power-on reset.
+ SWA/SWB - 8-position DIP switch
+ 4556 - 4556 dual operational amplifier
+ TL074 - Texas Instruments TL074 JFET Low-Noise Quad OP Amp
+ VOL - 5k volume pot
+ CXK58256 - Sony CXK58256 32k x8-bit static RAM
+ CXK5864 - Sony CXK5864 8k x8-bit static RAM
+ TMM2064 - Toshiba TMM2064 8k x8-bit static RAM
+ 2018 - Toshiba TMM2018 2k x8-bit static RAM or equivalent Motorola MCM2016 or HM3-65728 or Sony CXK5816
+ 68000 - Motorola MC68000P12 CPU. Clock input 8.000MHz [16/2]
+ Z0840004PSC - Zilog Z0840006PSC Z80 CPU. Clock input 4.000MHz [16/4]
+ YM2610 - Yamaha YM2610 sound chip. Clock input 8.000MHz [16/2]
+ YM3016-F - Yamaha Y3016-F 2-Channel Serial & Binary Input Floating D/A Converter (SOIC16)
+ Clock input 2.66666MHz (16/2/3, source = pin 64 of YM2610)
+ TC0070RGB - 5-bit RGB Video Mixer/RGB DAC (Ceramic Flat Pack SIL25)
+ PC050CM - Taito PC050CM custom SIL28 ceramic module for coins, coin lockout and coin counters
+ TC0140SYT - Taito custom TC0140SYT sound communication IC
+ TC0110PCR - Taito custom palette generator IC
+ TC0100SCN - Taito custom tilemap generator IC
+ PC0900J - Taito custom sprite generator IC
+ 48CR-1 - Custom resistor array used for inputs
+ Y - 3 pin connector for 2nd speaker output (mono only)
+ HSync - 15.55385kHz
+ VSync - 60.054Hz
+ B41-01.IC15 - MN234000 mask ROM (main program)
+ B41-02.IC6 - MN234000 mask ROM (sprites)
+ B41-03.IC1 - MN234000 mask ROM (tiles)
+ B41-04.IC48 - MN234000 mask ROM (ADPCM samples)
+ B41_05.IC43 - Taito TC0030CMD hybrid custom IC containing uPD78C11 MCU with 4k x8-bit mask ROM, uPD27C64 8k x8-bit EPROM, uPD4464 8k x8-bit static RAM & logic glue.
+ Clock input 12.000MHz. This chip is known as a 'C-Chip'. Only the EPROM differs between different games.
+ B41-06.IC34 - MMI PAL16L8 marked 'B41-06'
+ B41-07.IC46 - MMI PAL16L8 marked 'B41-07'
+ B41-08.IC45 - MMI PAL20L8 marked 'B41-08'
+ B41_09-1.IC17 - Toshiba TMM27512 64k x8-bit EPROM (main program)
+ B41_10.IC15 - Toshiba TMM27512 64k x8-bit EPROM (main program)
+ B41_11-1.IC26 - Toshiba TMM27512 64k x8-bit EPROM (main program)
+ B41_12.IC25 - Toshiba TMM27512 64k x8-bit EPROM (main program)
+ B41_13.IC20 - Toshiba TMM27512 64k x8-bit EPROM (sound program)
+
+***************************************************************************
Use of TC0100SCN
----------------
diff --git a/src/mame/drivers/atari_s1.cpp b/src/mame/drivers/atari_s1.cpp
index 2dfab65b858..15f0f6536bb 100644
--- a/src/mame/drivers/atari_s1.cpp
+++ b/src/mame/drivers/atari_s1.cpp
@@ -75,6 +75,7 @@ public:
, m_dac(*this, "dac")
, m_switch(*this, "SWITCH.%u", 0)
, m_digits(*this, "digit%u", 0U)
+ , m_player_lamps(*this, "text%u", 0U)
{ }
void midearth(machine_config &config);
@@ -82,8 +83,8 @@ public:
void atarians(machine_config &config);
protected:
+ virtual void machine_start() override;
virtual void machine_reset() override;
- virtual void machine_start() override { m_digits.resolve(); }
private:
uint8_t m1080_r();
@@ -121,6 +122,7 @@ private:
required_device<dac_4bit_r2r_device> m_dac;
required_ioport_array<10> m_switch;
output_finder<78> m_digits;
+ output_finder<8> m_player_lamps;
};
void atari_s1_state::atari_s1_map(address_map &map)
@@ -384,26 +386,25 @@ uint8_t atari_s1_state::switch_r(offs_t offset)
TIMER_DEVICE_CALLBACK_MEMBER( atari_s1_state::nmi )
{
static const uint8_t patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0, 0, 0, 0, 0, 0 }; // 4511
+
m_bit6++;
if (m_t_c > 0x40)
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
else
m_t_c++;
- m_out_offs++;
- m_out_offs &= 0x1f;
- if ((m_out_offs & 3) == 3)
+ m_out_offs = (m_out_offs + 1) & 0x1f;
+ uint8_t const p_val = m_p_ram[m_out_offs];
+ if ((m_out_offs & 0x03) == 0x03)
{
// Player number
- char wordnum[8];
- sprintf(wordnum,"text%d",m_out_offs>>2);
- output().set_value(wordnum, !BIT(patterns[m_p_ram[m_out_offs]&15], 6)); // uses 'g' segment
+ m_player_lamps[m_out_offs >> 2] = !BIT(patterns[p_val & 0x0f], 6); // uses 'g' segment
}
else
{
// Digits
- m_digits[m_out_offs << 1] = patterns[m_p_ram[m_out_offs]>>4];
- m_digits[(m_out_offs << 1)+1] = patterns[m_p_ram[m_out_offs]&15];
+ m_digits[(m_out_offs << 1) + 0] = patterns[p_val >> 4];
+ m_digits[(m_out_offs << 1) + 1] = patterns[p_val & 0x0f];
}
}
@@ -445,6 +446,12 @@ void atari_s1_state::audiores_w(uint8_t data)
}
+void atari_s1_state::machine_start()
+{
+ m_digits.resolve();
+ m_player_lamps.resolve();
+}
+
void atari_s1_state::machine_reset()
{
m_vol = 0;
diff --git a/src/mame/drivers/atarig1.cpp b/src/mame/drivers/atarig1.cpp
index 7a8623307fd..507c6a9395b 100644
--- a/src/mame/drivers/atarig1.cpp
+++ b/src/mame/drivers/atarig1.cpp
@@ -382,7 +382,7 @@ void atarig1_state::atarig1(machine_config &config)
ATARI_JSA_II(config, m_jsa, 0);
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_2);
m_jsa->test_read_cb().set_ioport("IN0").bit(14);
- m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_jsa->add_route(ALL_OUTPUTS, "mono", 0.6);
}
diff --git a/src/mame/drivers/atarig42.cpp b/src/mame/drivers/atarig42.cpp
index 2b03429456d..0fd418de9c8 100644
--- a/src/mame/drivers/atarig42.cpp
+++ b/src/mame/drivers/atarig42.cpp
@@ -8,6 +8,7 @@
Games supported:
* Road Riot 4WD (1991)
+ * Danger Express (1992)
* Guardians of the 'Hood (1992)
Known bugs:
@@ -15,10 +16,6 @@
* Missing DSPCOM board for Road Riot 4WD
+or shared ram pcb that bridges both pcbs for the twin cab kind of like in F1: Exhaust Note and Air Rescue from segas32.cpp
-****************************************************************************
-
- Memory map (TBA)
-
***************************************************************************/
#include "emu.h"
@@ -377,6 +374,53 @@ static INPUT_PORTS_START( roadriot )
INPUT_PORTS_END
+INPUT_PORTS_START( dangerex )
+ PORT_START("IN0") /* e00000 */
+ PORT_BIT( 0x000f, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_CUSTOM ) // Toggle 0 - D4
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_CUSTOM ) // Toggle 1 - D5
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_CUSTOM ) // Step SW - D6
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_CUSTOM ) // Freeze - D7
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+
+ PORT_START("IN1") /* e00002 */
+ PORT_BIT( 0x000f, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_CUSTOM ) // Test Yellow - D4
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_CUSTOM ) // Test Blue - D5
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_CUSTOM ) // Test Blue - D6
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_CUSTOM ) // Test Blue - D7
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+
+ PORT_START("IN2") /* e00010 */
+ PORT_BIT( 0x000f, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_ATARI_JSA_SOUND_TO_MAIN_READY("jsa")
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_ATARI_JSA_MAIN_TO_SOUND_READY("jsa")
+ PORT_SERVICE( 0x0040, IP_ACTIVE_LOW )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen")
+ PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("A2D0") /* analog 0 */
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("A2D1") /* analog 1 */
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+
static INPUT_PORTS_START( guardian )
PORT_START("IN0") /* e00000 */
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNUSED )
@@ -548,7 +592,7 @@ void atarig42_state::atarig42(machine_config &config)
ATARI_JSA_III(config, m_jsa, 0);
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_5);
m_jsa->test_read_cb().set_ioport("IN2").bit(6);
- m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_jsa->add_route(ALL_OUTPUTS, "mono", 0.8);
}
void atarig42_0x200_state::atarig42_0x200(machine_config &config)
@@ -575,7 +619,6 @@ void atarig42_0x400_state::atarig42_0x400(machine_config &config)
-
/*************************************
*
* ROM definition(s)
@@ -754,6 +797,65 @@ ROM_START( roadriotb )
ROM_END
+ROM_START( dangerex )
+ ROM_REGION( 0x80004, "maincpu", 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "dx8d-0h.8d", 0x00000, 0x20000, CRC(4957b65d) SHA1(de9f187b6496cf96d29c4b1b29887abc2bdf9bf0) )
+ ROM_LOAD16_BYTE( "dx8c-0l.8c", 0x00001, 0x20000, CRC(aedcb497) SHA1(7e201b7db5c0ff661f782566a6b17299d514c77a) )
+ ROM_LOAD16_BYTE( "dx9d-1h.9d", 0x40000, 0x20000, CRC(2eb943e2) SHA1(87dbf11720e2938bf5755b13231fc668ab3e0e05) )
+ ROM_LOAD16_BYTE( "dx9c-1l.9c", 0x40001, 0x20000, CRC(79de4c91) SHA1(31de5e927aff4efcf4217da3c704ece2d393faf9) )
+
+ ROM_REGION( 0x2000, "asic65:asic65cpu", 0 ) /* ASIC65 TMS32015 code */
+ ROM_LOAD( "136089-1012.3f", 0x00000, 0x0a80, NO_DUMP )
+
+ ROM_REGION( 0x14000, "jsa:cpu", 0 ) /* 6502 code */
+ ROM_LOAD( "dx12c-5.12c", 0x10000, 0x4000, CRC(d72621f7) SHA1(4bf5c98dd2434cc6ed1bddb6baf42f41cf138e1a) )
+ ROM_CONTINUE( 0x04000, 0xc000 )
+
+ ROM_REGION( 0xc0000, "gfx1", 0 )
+ ROM_LOAD( "dxc117-22d.22d", 0x000000, 0x20000, CRC(5532995a) SHA1(21e001c911adb91dbe43e895ae8582df65f2995d) ) /* playfield, planes 0-1 */
+ ROM_LOAD( "dx82-22c.22c", 0x020000, 0x20000, CRC(9548599b) SHA1(d08bae8dabce0175f956631ddfbf091653af035e) )
+ ROM_LOAD( "dxc116-20-21d.21d", 0x040000, 0x20000, CRC(ebbf0fd8) SHA1(4ceb026c4231b675215110c16c8f75551cdfa461) ) /* playfield, planes 2-3 */
+ ROM_LOAD( "dxc81-22-21c.21c", 0x060000, 0x20000, CRC(24cb1d34) SHA1(4fc558c8dee3654abd164e5e4adddf9bfcbca3ae) )
+ ROM_LOAD( "dxc115-20d.20d", 0x080000, 0x20000, CRC(2819ce54) SHA1(9a3c041d9046af41997dc1d9f41bf0e1be9489f9) ) /* playfield, planes 4-5 */
+ ROM_LOAD( "dxc80-20c.20c", 0x0a0000, 0x20000, CRC(a8ffe459) SHA1(92a10694c38a4fbe3022662f4e8e4e214aab31c9) )
+
+ ROM_REGION( 0x020000, "gfx2", 0 )
+ ROM_LOAD( "dxc187-22j.22j", 0x000000, 0x20000, CRC(7231ecc2) SHA1(8b1b0aed3a0d907630e120395b0a97fd9a1ef8cc) ) /* alphanumerics */
+
+ ROM_REGION16_BE( 0x800000, "rle", 0 )
+ ROM_LOAD16_BYTE( "dx2s-0h.2s", 0x000000, 0x80000, CRC(89902ce2) SHA1(f910ad65f3780e28c9920c4185c1ea807ec478aa) )
+ ROM_LOAD16_BYTE( "dx2p-0l.2p", 0x000001, 0x80000, CRC(dabe7e1c) SHA1(1f77bba57b7025333c27ee3d548d08ee960d63d6) )
+ ROM_LOAD16_BYTE( "dx3s-1h.3s", 0x100000, 0x80000, CRC(ffeec3d1) SHA1(de40083ce3862f2b5d37f5f255f93b2b2487ed96) )
+ ROM_LOAD16_BYTE( "dx3p-1l.3p", 0x100001, 0x80000, CRC(40b0a300) SHA1(3ec055bdc30e62c5e95541b15c53f1d439ccb5b4) )
+ ROM_LOAD16_BYTE( "dx4s-2h.4s", 0x200000, 0x80000, CRC(1e4d0c50) SHA1(fbb5422f43e1c4f8787073c1cdaeb75121a67a35) )
+ ROM_LOAD16_BYTE( "dx4p-2l.4p", 0x200001, 0x80000, CRC(00d586e1) SHA1(7e8419a5972a5e0fc372c72b5c5f8f3ff4294a2b) )
+ ROM_LOAD16_BYTE( "dx5s-3h.5s", 0x300000, 0x80000, CRC(98e26315) SHA1(dbc567c3b9d00f827acb8ba2d5a79a7d2acc7ddd) )
+ ROM_LOAD16_BYTE( "dx5p-3l.5p", 0x300001, 0x80000, CRC(e37b1413) SHA1(490911006f0e10319117dae3a87623d8244ea182) )
+ ROM_LOAD16_BYTE( "dx6s-4h.6s", 0x400000, 0x80000, CRC(b2bc538c) SHA1(1bda4a6c40c9389573857879263c0f01b5f029d3) )
+ ROM_LOAD16_BYTE( "dx6p-4l.6p", 0x400001, 0x80000, CRC(5e3aefb8) SHA1(492eb7f42bbeefbc377d3a491fe07b64c1c8a11c) )
+ ROM_LOAD16_BYTE( "dx7s-5h.7s", 0x500000, 0x80000, CRC(396d706e) SHA1(7682287df2ad2283b5999c3df272baa9559b7bd5) )
+ ROM_LOAD16_BYTE( "dx7p-5l.7p", 0x500001, 0x80000, CRC(102c827d) SHA1(6ae405032a07081841a5a3fb48422bd67d37372c) )
+ ROM_LOAD16_BYTE( "dx8s-6h.8s", 0x600000, 0x80000, CRC(af3b1f90) SHA1(d514a7b5e9bb263bbb1164a5174fa6943c4e5fb4) )
+ ROM_LOAD16_BYTE( "dx8p-6l.8p", 0x600001, 0x80000, CRC(a0e7311b) SHA1(9c4d443c727c3bd59f035bf27c4f7e74046d4c45) )
+ ROM_LOAD16_BYTE( "dx9s-7h.7h", 0x700000, 0x80000, CRC(5bf0ce01) SHA1(22f971842371eb36b2dc6ae303ef3955dd9884c2) )
+ ROM_LOAD16_BYTE( "dx9p-7l.7l", 0x700001, 0x80000, CRC(e6f1d9fa) SHA1(160b4c9a90bdc48c990e5d4a24b17a284c9b4da8) )
+
+ ROM_REGION( 0x100000, "jsa:oki1", 0 )
+ ROM_LOAD( "dx19e-0.19e", 0x00000, 0x20000, CRC(e7d9d5fb) SHA1(756b1d59168855a707181dd6c437a59313da5a7c) )
+ ROM_LOAD( "dx17e-1.17e", 0x20000, 0x20000, CRC(ccb73a18) SHA1(3e853f7c7ab32b18fdb6529d37d28eb96c5365dc) )
+ ROM_LOAD( "dx15e-2.15e", 0x40000, 0x20000, CRC(11596234) SHA1(77eab7cb4ad83a50c23127b4fb1bbfd4aa2c6f8d) )
+ ROM_LOAD( "dx12e-3.12e", 0x60000, 0x20000, CRC(c0ffd43c) SHA1(dcd7e3cc5d46db0d0a7fe3806bddbca235492d35) )
+
+ ROM_REGION( 0x800, "eeprom", 0 )
+ ROM_LOAD( "dx-eeprom.5c", 0x0000, 0x800, CRC(d14e813d) SHA1(b206ce85f7a87986d401d34eafa188b5bffae08c) )
+
+ ROM_REGION( 0x0600, "proms", 0 ) /* microcode for growth renderer */
+ ROM_LOAD( "092-1001.20p", 0x0000, 0x0200, NO_DUMP )
+ ROM_LOAD( "092-1002.22p", 0x0200, 0x0200, NO_DUMP )
+ ROM_LOAD( "092-1003.21p", 0x0400, 0x0200, NO_DUMP )
+ROM_END
+
+
ROM_START( guardian )
ROM_REGION( 0x80004, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_BYTE( "136092-2021.8e", 0x00000, 0x20000, CRC(efea1e02) SHA1(f0f1ef300f36953aff73b68ffe6d9950ac575f7d) )
@@ -847,7 +949,13 @@ void atarig42_0x200_state::init_roadriot()
+MO.0 or (mopix == 0)
+AN.VID7 or (alpha)
+!AN.0
-*/
+ */
+}
+
+
+void atarig42_0x400_state::init_dangerex()
+{
+ m_playfield_base = 0x000;
}
@@ -882,7 +990,7 @@ void atarig42_0x400_state::init_guardian()
+MO.0 or (mopix == 0)
+AN.VID7 or (alpha)
+!AN.0
-*/
+ */
}
@@ -896,4 +1004,5 @@ void atarig42_0x400_state::init_guardian()
GAME( 1991, roadriot, 0, atarig42_0x200, roadriot, atarig42_0x200_state, init_roadriot, ROT0, "Atari Games", "Road Riot 4WD (set 1, 04 Dec 1991)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NODEVICE_LAN )
GAME( 1991, roadriota, roadriot, atarig42_0x200, roadriot, atarig42_0x200_state, init_roadriot, ROT0, "Atari Games", "Road Riot 4WD (set 2, 13 Nov 1991)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NODEVICE_LAN )
GAME( 1991, roadriotb, roadriot, atarig42_0x200, roadriot, atarig42_0x200_state, init_roadriot, ROT0, "Atari Games", "Road Riot 4WD (set 3, 04 Jun 1991)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NODEVICE_LAN )
+GAME( 1992, dangerex, 0, atarig42_0x400, dangerex, atarig42_0x400_state, init_dangerex, ROT0, "Atari Games", "Danger Express (prototype)", 0 )
GAME( 1992, guardian, 0, atarig42_0x400, guardian, atarig42_0x400_state, init_guardian, ROT0, "Atari Games", "Guardians of the 'Hood", 0 )
diff --git a/src/mame/drivers/atarigx2.cpp b/src/mame/drivers/atarigx2.cpp
index 7703e968d48..60bd14d901c 100644
--- a/src/mame/drivers/atarigx2.cpp
+++ b/src/mame/drivers/atarigx2.cpp
@@ -1527,8 +1527,8 @@ void atarigx2_state::atarigx2(machine_config &config)
ATARI_JSA_IIIS(config, m_jsa, 0);
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_5);
m_jsa->test_read_cb().set_ioport("SERVICE").bit(6);
- m_jsa->add_route(0, "lspeaker", 1.0);
- m_jsa->add_route(1, "rspeaker", 1.0);
+ m_jsa->add_route(0, "lspeaker", 0.7);
+ m_jsa->add_route(1, "rspeaker", 0.7);
}
void atarigx2_state::atarigx2_0x200(machine_config &config)
diff --git a/src/mame/drivers/atarisy1.cpp b/src/mame/drivers/atarisy1.cpp
index ae88b58b93a..6c5ef11afe4 100644
--- a/src/mame/drivers/atarisy1.cpp
+++ b/src/mame/drivers/atarisy1.cpp
@@ -718,8 +718,8 @@ void atarisy1_state::add_speech(machine_config &config)
m_audiocpu->set_addrmap(AS_PROGRAM, &atarisy1_state::sound_ext_map);
TMS5220C(config, m_tms, 14.318181_MHz_XTAL/2/11);
- m_tms->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
- m_tms->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+ m_tms->add_route(ALL_OUTPUTS, "lspeaker", 0.6);
+ m_tms->add_route(ALL_OUTPUTS, "rspeaker", 0.6);
MOS6522(config, m_via, 14.318181_MHz_XTAL/8);
m_via->readpa_handler().set(m_tms, FUNC(tms5220_device::status_r));
@@ -784,12 +784,12 @@ void atarisy1_state::atarisy1(machine_config &config)
ym2151_device &ymsnd(YM2151(config, "ymsnd", 14.318181_MHz_XTAL/4));
ymsnd.irq_handler().set_inputline(m_audiocpu, m6502_device::IRQ_LINE);
- ymsnd.add_route(0, "lspeaker", 0.80);
- ymsnd.add_route(1, "rspeaker", 0.80);
+ ymsnd.add_route(0, "lspeaker", 0.48);
+ ymsnd.add_route(1, "rspeaker", 0.48);
pokey_device &pokey(POKEY(config, "pokey", 14.318181_MHz_XTAL/8));
- pokey.add_route(ALL_OUTPUTS, "lspeaker", 0.40);
- pokey.add_route(ALL_OUTPUTS, "rspeaker", 0.40);
+ pokey.add_route(ALL_OUTPUTS, "lspeaker", 0.24);
+ pokey.add_route(ALL_OUTPUTS, "rspeaker", 0.24);
}
void atarisy1_state::marble(machine_config &config)
diff --git a/src/mame/drivers/atarisy4.cpp b/src/mame/drivers/atarisy4.cpp
index 3da66c3099e..026a3b40d2a 100644
--- a/src/mame/drivers/atarisy4.cpp
+++ b/src/mame/drivers/atarisy4.cpp
@@ -339,7 +339,7 @@ void atarisy4_state::atarisy4_renderer::draw_polygon(uint16_t color)
{
rectangle clip;
vertex_t v1, v2, v3;
- atarisy4_polydata &extradata = object_data_alloc();
+ atarisy4_polydata &extradata = object_data().next();
render_delegate rd_scan = render_delegate(&atarisy4_renderer::draw_scanline, this);
clip.set(0, 511, 0, 511);
diff --git a/src/mame/drivers/atom.cpp b/src/mame/drivers/atom.cpp
index d5cf875810b..d703f967a70 100644
--- a/src/mame/drivers/atom.cpp
+++ b/src/mame/drivers/atom.cpp
@@ -683,7 +683,7 @@ image_init_result atom_state::load_cart(device_image_interface &image, generic_s
if (size > 0x1000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported ROM size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported ROM size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/ave_arb.cpp b/src/mame/drivers/ave_arb.cpp
index 5d2273d959d..7fb17a2a34d 100644
--- a/src/mame/drivers/ave_arb.cpp
+++ b/src/mame/drivers/ave_arb.cpp
@@ -23,7 +23,7 @@ Known chess modules (*denotes not dumped yet):
- Grand Master Series 4.0
Other games:
-- *Avelan (checkers)
+- Avelan (checkers)
Newer modules included button label stickers for OPTIONS, Verify, Take Back, Clear.
@@ -33,7 +33,7 @@ running at 16MHz.
TODO:
- verify gms40 module memory layout
-- need to add checkers pieces and custom initial position when Avelan gets dumped
+- gms40 and avelan rom labels
******************************************************************************/
@@ -100,6 +100,10 @@ private:
void main_map(address_map &map);
void v2_map(address_map &map);
+ // sensorboard
+ void init_board(int state);
+ bool m_altboard = false;
+
// cartridge
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
u8 cartridge_r(offs_t offset);
@@ -144,6 +148,22 @@ void arb_state::update_reset()
I/O
******************************************************************************/
+// sensorboard
+
+void arb_state::init_board(int state)
+{
+ // different board setup for checkers
+ if (m_altboard)
+ for (int i = 0; i < 12; i++)
+ {
+ m_board->write_piece((i % 4) * 2 + ((i / 4) & 1), i / 4, 13); // white
+ m_board->write_piece((i % 4) * 2 + (~(i / 4) & 1), i / 4 + 5, 14); // black
+ }
+ else
+ m_board->preset_chess(state);
+}
+
+
// cartridge
DEVICE_IMAGE_LOAD_MEMBER(arb_state::cart_load)
@@ -158,6 +178,8 @@ DEVICE_IMAGE_LOAD_MEMBER(arb_state::cart_load)
if (image.get_feature("ram"))
m_maincpu->space(AS_PROGRAM).install_ram(0x0800, 0x0fff, 0x1000, m_extram);
+ m_altboard = bool(image.get_feature("altboard"));
+
return image_init_result::PASS;
}
@@ -279,7 +301,8 @@ void arb_state::v2(machine_config &config)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS);
- m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess));
+ m_board->init_cb().set(FUNC(arb_state::init_board));
+ m_board->set_spawnpoints(12+2); // +2 checkers pieces
m_board->set_delay(attotime::from_msec(100));
/* video hardware */
diff --git a/src/mame/drivers/banprestoms.cpp b/src/mame/drivers/banprestoms.cpp
index 54570e6c0b3..2cc0977cc26 100644
--- a/src/mame/drivers/banprestoms.cpp
+++ b/src/mame/drivers/banprestoms.cpp
@@ -26,24 +26,23 @@ The audio section also has unpopulated spaces marked for a Z80, a YM2203 and a S
TODO:
-- printer or hopper emulation
+- fix printer or hopper emulation (passes check at start but then fails when giving out tickets at game end for marioun,
+ when coining up for tvdenwad)
- the GFX emulation was adapted from other drivers using the Seibu customs, it might need more adjustments
- verify Oki banking (needs someone who understands Japanese to check if speech makes sense when it gets called)
- lamps
- controls / dips need to be completed and better arranged
-- currently stuck at the call assistant screen due to vendor test failing (printer / hopper?), but can enter test mode.
- To test the games, it's possible to get the attract mode running by enabling the hack in the memory map at 0xe0004-0xe0005.
- tvdenwad will go back to the call assistant screen shortly after starting (believed to be because of missing printer or hopper emulation)
*/
#include "emu.h"
+#include "video/seibu_crtc.h"
+
#include "cpu/m68000/m68000.h"
#include "machine/nvram.h"
+#include "machine/ticket.h"
#include "sound/okim6295.h"
-#include "video/seibu_crtc.h"
-
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@@ -60,6 +59,7 @@ public:
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
+ m_ticket(*this, "ticket"),
m_vram(*this, "vram%u", 0U),
m_spriteram(*this, "sprite_ram"),
m_okibank(*this, "okibank")
@@ -77,6 +77,7 @@ private:
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
+ required_device<ticket_dispenser_device> m_ticket;
required_shared_ptr_array<uint16_t, 4> m_vram;
required_shared_ptr<uint16_t> m_spriteram;
@@ -114,6 +115,8 @@ void banprestoms_state::machine_start()
void banprestoms_state::okibank_w(uint16_t data)
{
m_okibank->set_entry(data & 0x03);
+
+ m_ticket->motor_w(BIT(data, 4)); // bit 3 is suspect, too
// TODO: what do the other bits do?
}
@@ -254,7 +257,7 @@ void banprestoms_state::prg_map(address_map &map)
//map(0xc0140, 0xc0141).nopw(); // in marioun bit 3 is lamp according to test mode
map(0xe0000, 0xe0001).portr("DSW1");
map(0xe0002, 0xe0003).portr("IN1");
- map(0xe0004, 0xe0005).portr("IN2"); //.lr16(NAME([this] () -> uint16_t { return (machine().rand() & 0x0004) | (ioport("IN2")->read() & 0xfffb); }));
+ map(0xe0004, 0xe0005).portr("IN2");
}
void banprestoms_state::oki_map(address_map &map)
@@ -285,7 +288,7 @@ static INPUT_PORTS_START( tvdenwad )
PORT_START("IN2")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON13 ) // Card Emp in switch test
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON14 ) // Card Pos in switch test
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON15 ) // Card Pay in switch test
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("ticket", ticket_dispenser_device, line_r) // Card Pay in switch test
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_START )
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNUSED ) // ?
PORT_SERVICE( 0x0020, IP_ACTIVE_LOW )
@@ -302,12 +305,11 @@ static INPUT_PORTS_START( tvdenwad )
PORT_START("DSW1") // marked SW0913 on PCB
- PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:1")
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:2")
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) ) PORT_DIPLOCATION("DSW1:1,2")
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C ) )
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:3")
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
@@ -320,12 +322,11 @@ static INPUT_PORTS_START( tvdenwad )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:6")
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:7")
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:8")
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DSW1:7,8")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, "Every 3rd cycle" ) // 1st 2 cycles mute, then sound, then 2 cycles mute and so on
+ PORT_DIPSETTING( 0x80, "Every 2nd cycle" ) // 1st cycle mute, then sound, then 1 cycle mute and so on
+ PORT_DIPSETTING( 0xc0, DEF_STR( On ) )
PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
@@ -351,7 +352,7 @@ static INPUT_PORTS_START( marioun ) // inputs defined as IPT_UNKNOWN don't show
PORT_START("IN2")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON7 ) // Card Emp
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON8 ) // Card Pos
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON9 ) // Card Pay
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("ticket", ticket_dispenser_device, line_r) // Card Pay
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_SERVICE1 )
@@ -368,13 +369,12 @@ static INPUT_PORTS_START( marioun ) // inputs defined as IPT_UNKNOWN don't show
PORT_START("DSW1") // marked SW0913 on PCB
- PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:1")
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:2")
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:3")
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) ) PORT_DIPLOCATION("DSW1:1,2")
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:3") // some of these are difficulty (i.e. see Bowser being quicker or slower in the 100m dash)
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4")
@@ -386,12 +386,11 @@ static INPUT_PORTS_START( marioun ) // inputs defined as IPT_UNKNOWN don't show
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:6")
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:7")
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:8")
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DSW1:7,8")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, "Every 4th cycle" ) // 1st cycle sound, then 3 cycles mute, then 1 cycle sound and so on
+ PORT_DIPSETTING( 0x80, "Every 2nd cycle" ) // 1st cycle sound, then 1 cycle mute, then 1 cycle sound and so on
+ PORT_DIPSETTING( 0xc0, DEF_STR( On ) )
PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
@@ -438,6 +437,8 @@ void banprestoms_state::banprestoms(machine_config &config)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
+ TICKET_DISPENSER(config, m_ticket, attotime::from_msec(100), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH); // TODO: period is guessed
+
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // TODO: copied from other drivers using the same CRTC
screen.set_refresh_hz(60);
diff --git a/src/mame/drivers/barni.cpp b/src/mame/drivers/barni.cpp
index 47aa413f01a..d47eec28897 100644
--- a/src/mame/drivers/barni.cpp
+++ b/src/mame/drivers/barni.cpp
@@ -1,8 +1,8 @@
// license:BSD-3-Clause
-// copyright-holders:Ivan Vangelista
+// copyright-holders:Robbbert
// PINBALL
// Skeleton driver for Barni pinballs.
-// Known pinballs to be dumped: Shield (1985)
+// Known pinballs to be dumped: Shield (1985) - different electronics
// Hardware listing and ROM definitions from PinMAME.
/*
@@ -13,6 +13,19 @@
1x VIA 6522
DISPLAY: 5x6 digit 7 or 16 segment display
SOUND: basically the same as Bally's Squalk & Talk -61 board but missing AY8912 synth chip
+
+Undumped 16L8 at position U9
+
+TODO:
+- Almost everything
+- Value of crystal on audio cpu
+- Outputs (solenoids, lamps)
+- Inputs (switches, dips)
+- Display needs to be done properly, SDA2131 to be a device.
+- How to trigger sounds?
+- Does speech work? DAC works by poking $5D in audio cpu.
+- Manuals are difficult to read, and don't show everything we need.
+
*/
#include "emu.h"
@@ -22,66 +35,228 @@
#include "machine/6522via.h"
#include "machine/6821pia.h"
#include "sound/tms5220.h"
+#include "sound/dac.h"
+#include "speaker.h"
+#include "barni.lh"
class barni_state : public genpin_class
{
public:
barni_state(const machine_config &mconfig, device_type type, const char *tag)
: genpin_class(mconfig, type, tag)
- , m_maincpu(*this, "maincpu") { }
+ , m_maincpu(*this, "maincpu")
+ , m_subcpu(*this, "subcpu")
+ , m_audiocpu(*this, "audiocpu")
+ , m_pia1(*this, "pia1")
+ , m_pia2(*this, "pia2")
+ , m_pias1(*this, "pias1")
+ , m_pias2(*this, "pias2")
+ , m_via(*this, "via")
+ , m_speech(*this, "tms5220")
+ , m_dac(*this, "dac")
+ , m_dac2(*this, "dac2")
+ , m_digits(*this, "digit%u", 0U)
+ { }
- void barni(machine_config &config);
- void audiocpu_map(address_map &map);
- void maincpu_map(address_map &map);
- void subcpu_map(address_map &map);
+ void barni(machine_config &config);
+ void audiocpu_map(address_map &map);
+ void maincpu_map(address_map &map);
+ void subcpu_map(address_map &map);
private:
- required_device<cpu_device> m_maincpu;
+ u8 soundcmd_r();
+ u8 set_firq();
+ void clear_firq(u8);
+ void via_pa_w(u8);
+ void via_pb_w(u8);
+ void pias1_pb_w(u8);
+ void pias2_pb_w(u8);
+ void showseg(u8, u8);
+ u8 m_via_pa = 0;
+ u8 m_bitcount = 0;
+ u8 m_soundcmd = 0;
+ //void machine_reset() override;
+ void machine_start() override { m_digits.resolve(); }
+ required_device<mc6809e_device> m_maincpu;
+ required_device<mc6809e_device> m_subcpu;
+ required_device<m6802_cpu_device> m_audiocpu;
+ required_device<pia6821_device> m_pia1;
+ required_device<pia6821_device> m_pia2;
+ required_device<pia6821_device> m_pias1;
+ required_device<pia6821_device> m_pias2;
+ required_device<via6522_device> m_via;
+ required_device<tms5220_device> m_speech;
+ required_device<dac_byte_interface> m_dac;
+ required_device<dac_4bit_r2r_device> m_dac2;
+ output_finder<90> m_digits;
};
void barni_state::maincpu_map(address_map &map)
{
map.unmap_value_high();
- map(0x0000, 0x00ff).ram();
- map(0xa100, 0xa7ff).ram();
- map(0xc000, 0xffff).rom();
+ map(0x0000, 0x03ff).mirror(0x1c00).ram().share("common"); // U21,U22 2x 2114
+ map(0x2000, 0x3fff).nopw(); // goes to 16L8
+ map(0x4000, 0x5fff).r(FUNC(barni_state::set_firq)); // set FIRQ
+ map(0x6000, 0x7fff).nopr(); // watchdog
+ map(0x8000, 0x800f).mirror(0x1ff0).m(m_via, FUNC(via6522_device::map)); // U32
+ map(0xa000, 0xa7ff).mirror(0x1800).ram(); // U14 5128 battery-backed
+ map(0xc000, 0xffff).rom().region("maincpu",0); // U15,U16
}
void barni_state::subcpu_map(address_map &map)
{
map.unmap_value_high();
- map(0x0000, 0x03ff).ram();
- map(0xe000, 0xffff).rom();
+ map(0x0000, 0x03ff).mirror(0x1c00).ram().share("common"); // same ram as above
+ map(0x2000, 0x3fff).w(FUNC(barni_state::clear_firq)); // clear FIRQ
+ map(0x4000, 0x5fff); // goes to 16L8
+ map(0x6000, 0x7fff); // goes to 16L8
+ map(0x8000, 0x8003).mirror(0x1ffc).rw(m_pia1, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // U38, also goes to 16L8
+ map(0xa000, 0xa003).mirror(0x1ffc).rw(m_pia2, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // U41, also goes to 16L8
+ map(0xc000, 0xdfff); // ROM not fitted U28
+ map(0xe000, 0xffff).rom().region("subcpu",0); // U27
}
void barni_state::audiocpu_map(address_map &map)
{
- map(0xc000, 0xffff).rom();
+ map.global_mask(0xbfff); // A14 not connected?
+ map(0x0080, 0x0083).mirror(0x0c).rw(m_pias2, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x0090, 0x0093).mirror(0x0c).rw(m_pias1, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x1000, 0x1000).w(m_dac, FUNC(dac_byte_interface::data_w));
+ map(0x2000, 0x2000).r(FUNC(barni_state::soundcmd_r));
+ map(0x8000, 0xbfff).rom().region("audiocpu",0);
}
static INPUT_PORTS_START( barni )
INPUT_PORTS_END
+u8 barni_state::set_firq()
+{
+ m_maincpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
+ return 0xff;
+}
+
+void barni_state::clear_firq(u8 data)
+{
+ m_maincpu->set_input_line(M6809_FIRQ_LINE, CLEAR_LINE);
+}
+
+void barni_state::via_pa_w(u8 data)
+{
+ //printf("VIA PA = %X ",data);
+ m_via_pa = data;
+ m_bitcount = 0;
+}
+
+void barni_state::via_pb_w(u8 data)
+{
+ //printf("VIA PB = %X ",data);
+ switch (BIT(m_via_pa, 4, 4))
+ {
+ case 0:
+ // snd command
+ m_soundcmd = data;
+ m_pias2->cb1_w(1);
+ break;
+ case 1:
+ if (!(m_bitcount % 8))
+ {
+ u8 segnum = 31 - (m_bitcount ? 0 : 1) - (2 * m_via_pa & 15);
+ showseg(segnum, data);
+ }
+ m_bitcount++;
+ break;
+ case 5:
+ // solenoids, lamps
+ break;
+ case 7:
+ // something...
+ break;
+ default:
+ break;
+ }
+}
+
+void barni_state::showseg(u8 segnum, u8 data)
+{
+ u8 seg = 32 + segnum / 6;
+ u8 bit = 1 << (segnum % 6);
+ // player scores
+ m_digits[segnum] = data & 0x7f;
+ // digits in the middle
+ if (BIT(data , 7))
+ m_digits[seg] = m_digits[seg] | bit;
+ else
+ m_digits[seg] = (m_digits[seg] & 0x3f) ^ bit;
+}
+
+void barni_state::pias1_pb_w(u8 data)
+{
+ m_speech->rsq_w(BIT(data, 0));
+ m_speech->wsq_w(BIT(data, 1));
+}
+
+void barni_state::pias2_pb_w(u8 data)
+{
+ m_dac2->write(BIT(data, 4, 4));
+}
+
+u8 barni_state::soundcmd_r()
+{
+ m_pias2->cb1_w(0);
+ return m_soundcmd;
+}
+
void barni_state::barni(machine_config &config)
{
- /* basic machine hardware */
+ // MAIN BOARD
MC6809E(config, m_maincpu, XTAL(4'000'000) / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &barni_state::maincpu_map);
- mc6809e_device &subcpu(MC6809E(config, "subcpu", XTAL(4'000'000) / 4));
- subcpu.set_addrmap(AS_PROGRAM, &barni_state::subcpu_map);
-
- m6802_cpu_device &audiocpu(M6802(config, "audiocpu", 4000000)); // uses own XTAL, but what is the value?
- audiocpu.set_addrmap(AS_PROGRAM, &barni_state::audiocpu_map);
+ MC6809E(config, m_subcpu, XTAL(4'000'000) / 4);
+ m_subcpu->set_addrmap(AS_PROGRAM, &barni_state::subcpu_map);
/* video hardware */
- //config.set_default_layout();
+ config.set_default_layout(layout_barni);
- //6522via
- //6821pia
+ PIA6821(config, m_pia1, 0);
+// m_pia1->writepa_handler().set(FUNC(barni_state::pia1_pa_w));
+// m_pia1->writepb_handler().set(FUNC(barni_state::pia1_pb_w));
+// m_pia1->readpa_handler().set(FUNC(barni_state::pia1_pa_r));
- /* sound hardware */
- //tmms5220
+ PIA6821(config, m_pia2, 0);
+// m_pia2->writepa_handler().set(FUNC(barni_state::pia2_pa_w));
+// m_pia2->writepb_handler().set(FUNC(barni_state::pia2_pb_w));
+// m_pia2->readpa_handler().set(FUNC(barni_state::pia2_pa_r));
+
+ MOS6522(config, m_via, 4'000'000 / 4); // to check
+ m_via->irq_handler().set_inputline(m_maincpu, M6809_IRQ_LINE);
+ m_via->writepa_handler().set(FUNC(barni_state::via_pa_w));
+ m_via->writepb_handler().set(FUNC(barni_state::via_pb_w));
+// m_via->ca2_handler().set(FUNC(barni_state::via_ca2_w));
+// m_via->cb2_handler().set(FUNC(barni_state::via_cb2_w));
+
+ // SOUND BOARD
+ M6802(config, m_audiocpu, 4000000); // guess - crystal value not shown
+ m_audiocpu->set_addrmap(AS_PROGRAM, &barni_state::audiocpu_map);
+
+ PIA6821(config, m_pias1, 0); // U12
+ m_pias1->writepa_handler().set(m_speech, FUNC(tms5200_device::data_w));
+ m_pias1->writepb_handler().set(FUNC(barni_state::pias1_pb_w));
+ m_pias1->irqa_handler().set_inputline(m_maincpu, M6802_IRQ_LINE);
+ m_pias1->irqb_handler().set_inputline(m_maincpu, M6802_IRQ_LINE);
+
+ PIA6821(config, m_pias2, 0); // U17
+ m_pias2->writepb_handler().set(FUNC(barni_state::pias2_pb_w));
+ m_pias2->irqa_handler().set_inputline(m_maincpu, M6802_IRQ_LINE);
+ m_pias2->irqb_handler().set_inputline(m_maincpu, M6802_IRQ_LINE);
+
+ SPEAKER(config, "mono").front_center();
+ TMS5220C(config, m_speech, 640000); // unknown clock
+ m_speech->irq_cb().set(m_pias1, FUNC(pia6821_device::cb1_w));
+ m_speech->ready_cb().set(m_pias1, FUNC(pia6821_device::ca2_w));
+ m_speech->add_route(ALL_OUTPUTS, "mono", 1.0);
//dac
+ MC1408(config, m_dac, 0).add_route(ALL_OUTPUTS, "mono", 0.275);
+ DAC_4BIT_R2R(config, m_dac2, 0).add_route(ALL_OUTPUTS, "mono", 0.5); // discrete parts
genpin_audio(config);
}
@@ -90,18 +265,18 @@ void barni_state::barni(machine_config &config)
/ Champion 85
/-------------------------------*/
ROM_START(champion)
- ROM_REGION(0x10000, "maincpu", 0)
- ROM_LOAD("che.bin", 0xe000, 0x2000, CRC(c5dc9228) SHA1(5306980a9c73118cfb843dbce0d56f516d054220))
- ROM_LOAD("chc.bin", 0xc000, 0x2000, CRC(6ab0f232) SHA1(0638d33f86c62ee93dff924a16a5b9309392d9e8))
-
- ROM_REGION(0x10000, "subcpu", 0)
- ROM_LOAD("chan.bin", 0xe000, 0x2000, CRC(3f148587) SHA1(e44dc9cce15830f522dc781aaa13c659a43371f3))
-
- ROM_REGION(0x10000, "audiocpu", 0)
- ROM_LOAD("voz1.bin", 0xf000, 0x1000, CRC(48665778) SHA1(c295dfe7f4a98756f508391eb326f37a5aac37ff))
- ROM_LOAD("voz2.bin", 0xe000, 0x1000, CRC(30e7da5e) SHA1(3054cf9b09e0f89c242e1ad35bb31d9bd77248e4))
- ROM_LOAD("voz3.bin", 0xd000, 0x1000, CRC(3cd8058e) SHA1(fa4fd0cf4124263d4021c5a86033af9e5aa66eed))
- ROM_LOAD("voz4.bin", 0xc000, 0x1000, CRC(0d00d8cc) SHA1(10f64d2fc3fc3e276bbd0e108815a3b395dcf0c9))
+ ROM_REGION(0x4000, "maincpu", 0)
+ ROM_LOAD("chc.u15", 0x0000, 0x2000, CRC(6ab0f232) SHA1(0638d33f86c62ee93dff924a16a5b9309392d9e8))
+ ROM_LOAD("che.u16", 0x2000, 0x2000, CRC(c5dc9228) SHA1(5306980a9c73118cfb843dbce0d56f516d054220))
+
+ ROM_REGION(0x2000, "subcpu", 0)
+ ROM_LOAD("chan.bin", 0x0000, 0x2000, CRC(3f148587) SHA1(e44dc9cce15830f522dc781aaa13c659a43371f3))
+
+ ROM_REGION(0x4000, "audiocpu", 0)
+ ROM_LOAD("voz1.bin", 0x3000, 0x1000, CRC(48665778) SHA1(c295dfe7f4a98756f508391eb326f37a5aac37ff))
+ ROM_LOAD("voz2.bin", 0x2000, 0x1000, CRC(30e7da5e) SHA1(3054cf9b09e0f89c242e1ad35bb31d9bd77248e4))
+ ROM_LOAD("voz3.bin", 0x1000, 0x1000, CRC(3cd8058e) SHA1(fa4fd0cf4124263d4021c5a86033af9e5aa66eed))
+ ROM_LOAD("voz4.bin", 0x0000, 0x1000, CRC(0d00d8cc) SHA1(10f64d2fc3fc3e276bbd0e108815a3b395dcf0c9))
ROM_END
@@ -109,18 +284,18 @@ ROM_END
/ Red Baron
/-------------------------------*/
ROM_START(redbarnp)
- ROM_REGION(0x10000, "maincpu", 0)
- ROM_LOAD("redbaron.r1", 0xe000, 0x2000, CRC(fd401d3f) SHA1(33c0f178c798e16a9b4489a0e469f0a227882e79))
- ROM_LOAD("redbaron.r2", 0xc000, 0x2000, CRC(0506e53e) SHA1(a1eaa39181cb3e5a1c281d217d680a42e39c856a))
-
- ROM_REGION(0x10000, "subcpu", 0)
- ROM_LOAD("redbaron.r3", 0xe000, 0x2000, CRC(45bca0b8) SHA1(77e2d6b04ea8d6fa7e30b59232696b9aa5307286))
-
- ROM_REGION(0x10000, "audiocpu", 0)
- ROM_LOAD("rbsnd1.732", 0xf000, 0x1000, CRC(674389ce) SHA1(595bbfe51dc3af266f4344e3865c0e48dd96acea))
- ROM_LOAD("rbsnd2.732", 0xe000, 0x1000, CRC(30e7da5e) SHA1(3054cf9b09e0f89c242e1ad35bb31d9bd77248e4))
- ROM_LOAD("rbsnd3.732", 0xd000, 0x1000, CRC(a4ba0f72) SHA1(e46148a2f5125914944973f37e73a62001c76aaa))
- ROM_LOAD("rbsnd4.732", 0xc000, 0x1000, CRC(fd8db899) SHA1(0978213f14f73ccc4a24eb42a39db00d9299c5d0))
+ ROM_REGION(0x4000, "maincpu", 0)
+ ROM_LOAD("redbaron.r2", 0x0000, 0x2000, CRC(0506e53e) SHA1(a1eaa39181cb3e5a1c281d217d680a42e39c856a))
+ ROM_LOAD("redbaron.r1", 0x2000, 0x2000, CRC(fd401d3f) SHA1(33c0f178c798e16a9b4489a0e469f0a227882e79))
+
+ ROM_REGION(0x2000, "subcpu", 0)
+ ROM_LOAD("redbaron.r3", 0x0000, 0x2000, CRC(45bca0b8) SHA1(77e2d6b04ea8d6fa7e30b59232696b9aa5307286))
+
+ ROM_REGION(0x4000, "audiocpu", 0)
+ ROM_LOAD("rbsnd1.732", 0x3000, 0x1000, CRC(674389ce) SHA1(595bbfe51dc3af266f4344e3865c0e48dd96acea))
+ ROM_LOAD("rbsnd2.732", 0x2000, 0x1000, CRC(30e7da5e) SHA1(3054cf9b09e0f89c242e1ad35bb31d9bd77248e4))
+ ROM_LOAD("rbsnd3.732", 0x1000, 0x1000, CRC(a4ba0f72) SHA1(e46148a2f5125914944973f37e73a62001c76aaa))
+ ROM_LOAD("rbsnd4.732", 0x0000, 0x1000, CRC(fd8db899) SHA1(0978213f14f73ccc4a24eb42a39db00d9299c5d0))
ROM_END
diff --git a/src/mame/drivers/beathead.cpp b/src/mame/drivers/beathead.cpp
index f8b06b8c4bf..7713ced9826 100644
--- a/src/mame/drivers/beathead.cpp
+++ b/src/mame/drivers/beathead.cpp
@@ -363,7 +363,7 @@ void beathead_state::beathead(machine_config &config)
ATARI_JSA_III(config, m_jsa, 0);
m_jsa->test_read_cb().set_ioport("IN2").bit(6);
- m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_jsa->add_route(ALL_OUTPUTS, "mono", 0.6);
}
diff --git a/src/mame/drivers/beta.cpp b/src/mame/drivers/beta.cpp
index 9d83c526136..582cdfa7fd1 100644
--- a/src/mame/drivers/beta.cpp
+++ b/src/mame/drivers/beta.cpp
@@ -297,7 +297,7 @@ DEVICE_IMAGE_LOAD_MEMBER(beta_state::load_beta_eprom)
if (size != 0x800)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/bigbord2.cpp b/src/mame/drivers/bigbord2.cpp
index cd01639c220..144cfc293d4 100644
--- a/src/mame/drivers/bigbord2.cpp
+++ b/src/mame/drivers/bigbord2.cpp
@@ -71,6 +71,7 @@ X - change banks
#include "emu.h"
+
#include "cpu/z80/z80.h"
#include "imagedev/floppy.h"
#include "machine/z80daisy.h"
@@ -83,11 +84,14 @@ X - change banks
#include "machine/z80sio.h"
#include "sound/beep.h"
#include "video/mc6845.h"
+
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
+namespace {
+
class bigbord2_state : public driver_device
{
public:
@@ -334,11 +338,11 @@ void bigbord2_state::syslatch2_w(u8 data)
void bigbord2_state::mem_map(address_map &map)
{
map.unmap_value_high();
- map(0x0000, 0x5fff).bankr("bankr").bankw("bankw");
- map(0x6000, 0x67ff).bankrw("bankv");
- map(0x6800, 0x6fff).bankrw("bankv1");
- map(0x7000, 0x77ff).bankrw("banka");
- map(0x7800, 0x7fff).bankrw("banka1");
+ map(0x0000, 0x5fff).bankr(m_bankr).bankw(m_bankw);
+ map(0x6000, 0x67ff).bankrw(m_bankv);
+ map(0x6800, 0x6fff).bankrw(m_bankv1);
+ map(0x7000, 0x77ff).bankrw(m_banka);
+ map(0x7800, 0x7fff).bankrw(m_banka1);
map(0x8000, 0xffff).ram();
}
@@ -627,6 +631,7 @@ void bigbord2_state::bigbord2(machine_config &config)
MB8877(config, m_fdc, 16_MHz_XTAL / 8); // U10 : 2MHz for 8 inch, or 1MHz otherwise (jumper-selectable)
//m_fdc->intrq_wr_callback().set_inputline(m_maincpu, ??); // info missing from schematic
+ m_fdc->drq_wr_callback().set(FUNC(bigbord2_state::fdc_drq_w));
FLOPPY_CONNECTOR(config, "fdc:0", bigbord2_floppies, "8dsdd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, "fdc:1", bigbord2_floppies, "8dsdd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
@@ -670,7 +675,6 @@ void bigbord2_state::bigbord2(machine_config &config)
/* ROMs */
-
ROM_START( bigbord2 )
// for optional roms and eproms
ROM_REGION( 0x6000, "maincpu", ROMREGION_ERASEFF )
@@ -683,6 +687,10 @@ ROM_START( bigbord2 )
ROM_LOAD( "pal16l8.u23", 0x0000, 0x0400, NO_DUMP )
ROM_LOAD( "pal10l8.u34", 0x0400, 0x0400, NO_DUMP )
ROM_END
+
+} // anonymous namespace
+
+
/* System Drivers */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/binbug.cpp b/src/mame/drivers/binbug.cpp
index 1bcba2984a0..3855bc393aa 100644
--- a/src/mame/drivers/binbug.cpp
+++ b/src/mame/drivers/binbug.cpp
@@ -189,12 +189,12 @@ QUICKLOAD_LOAD_MEMBER(binbug_state::quickload_cb)
quick_length = image.length();
if (quick_length < 0x0444)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ image.seterror(image_error::INVALIDIMAGE, "File too short");
image.message(" File too short");
}
else if (quick_length > 0x8000)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too long");
+ image.seterror(image_error::INVALIDIMAGE, "File too long");
image.message(" File too long");
}
else
@@ -203,12 +203,12 @@ QUICKLOAD_LOAD_MEMBER(binbug_state::quickload_cb)
read_ = image.fread( &quick_data[0], quick_length);
if (read_ != quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Cannot read the file");
+ image.seterror(image_error::INVALIDIMAGE, "Cannot read the file");
image.message(" Cannot read the file");
}
else if (quick_data[0] != 0xc4)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid header");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid header");
image.message(" Invalid header");
}
else
@@ -217,7 +217,7 @@ QUICKLOAD_LOAD_MEMBER(binbug_state::quickload_cb)
if (exec_addr >= quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Exec address beyond end of file");
+ image.seterror(image_error::INVALIDIMAGE, "Exec address beyond end of file");
image.message(" Exec address beyond end of file");
}
else
diff --git a/src/mame/drivers/by17.cpp b/src/mame/drivers/by17.cpp
index 33074d0e79b..2df32735d9f 100644
--- a/src/mame/drivers/by17.cpp
+++ b/src/mame/drivers/by17.cpp
@@ -20,13 +20,18 @@ ToDo:
#include "emu.h"
#include "machine/genpin.h"
+
#include "cpu/m6800/m6800.h"
#include "machine/6821pia.h"
#include "machine/timer.h"
+
#include "by17.lh"
#include "by17_pwerplay.lh"
#include "by17_matahari.lh"
+
+namespace {
+
class by17_state : public genpin_class
{
public:
@@ -118,7 +123,6 @@ private:
DECLARE_WRITE_LINE_MEMBER(u10_cb2_w);
DECLARE_READ_LINE_MEMBER(u11_ca1_r);
DECLARE_READ_LINE_MEMBER(u11_cb1_r);
- DECLARE_WRITE_LINE_MEMBER(u11_ca2_w);
DECLARE_WRITE_LINE_MEMBER(u11_cb2_w);
TIMER_DEVICE_CALLBACK_MEMBER(timer_z_freq);
@@ -577,11 +581,6 @@ WRITE_LINE_MEMBER( by17_state::u10_cb2_w )
m_u10_cb2 = state;
}
-WRITE_LINE_MEMBER( by17_state::u11_ca2_w )
-{
- output().set_value("led0", state);
-}
-
READ_LINE_MEMBER( by17_state::u11_ca1_r )
{
return m_u11_ca1;
@@ -1014,8 +1013,8 @@ void by17_state::by17(machine_config &config)
m_pia_u10->readcb1_handler().set(FUNC(by17_state::u10_cb1_r));
m_pia_u10->ca2_handler().set(FUNC(by17_state::u10_ca2_w));
m_pia_u10->cb2_handler().set(FUNC(by17_state::u10_cb2_w));
- m_pia_u10->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- m_pia_u10->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
+ m_pia_u10->irqa_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+ m_pia_u10->irqb_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
TIMER(config, "timer_z_freq").configure_periodic(FUNC(by17_state::timer_z_freq), attotime::from_hz(100)); // Mains Line Frequency * 2
TIMER(config, m_zero_crossing_active_timer).configure_generic(FUNC(by17_state::timer_z_pulse)); // Active pulse length from Zero Crossing detector
@@ -1025,10 +1024,10 @@ void by17_state::by17(machine_config &config)
m_pia_u11->writepb_handler().set(FUNC(by17_state::u11_b_w));
m_pia_u11->readca1_handler().set(FUNC(by17_state::u11_ca1_r));
m_pia_u11->readcb1_handler().set(FUNC(by17_state::u11_cb1_r));
- m_pia_u11->ca2_handler().set(FUNC(by17_state::u11_ca2_w));
+ m_pia_u11->ca2_handler().set_output("led0");
m_pia_u11->cb2_handler().set(FUNC(by17_state::u11_cb2_w));
- m_pia_u11->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- m_pia_u11->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
+ m_pia_u11->irqa_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+ m_pia_u11->irqb_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
TIMER(config, "timer_d_freq").configure_periodic(FUNC(by17_state::u11_timer), attotime::from_hz(317)); // 555 timer
TIMER(config, m_display_refresh_timer).configure_generic(FUNC(by17_state::timer_d_pulse)); // 555 Active pulse length
}
@@ -1149,6 +1148,8 @@ ROM_END
/ Stellar Airship / Geiger-Automatenbau GMBH, of Germany (1981)
/---------------------------------------------------------------*/
+} // anonymous namespace
+
GAME( 1976, bowarrow, 0, by17, by17, by17_state, init_by17, ROT0, "Bally", "Bow & Arrow (Prototype, rev. 23)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1976, bowarrowa, bowarrow, by17, by17, by17_state, init_by17, ROT0, "Bally", "Bow & Arrow (Prototype, rev. 22)", MACHINE_IS_SKELETON_MECHANICAL)
diff --git a/src/mame/drivers/by35.cpp b/src/mame/drivers/by35.cpp
index 70d15834ce1..ca03a9bbf78 100644
--- a/src/mame/drivers/by35.cpp
+++ b/src/mame/drivers/by35.cpp
@@ -82,6 +82,8 @@ ToDo:
#include "by35_playboy.lh"
+namespace {
+
class by35_state : public genpin_class
{
public:
@@ -157,7 +159,6 @@ protected:
DECLARE_WRITE_LINE_MEMBER(u10_cb2_w);
DECLARE_READ_LINE_MEMBER(u11_ca1_r);
DECLARE_READ_LINE_MEMBER(u11_cb1_r);
- DECLARE_WRITE_LINE_MEMBER(u11_ca2_w);
DECLARE_WRITE_LINE_MEMBER(u11_cb2_w);
virtual void machine_start() override;
virtual void machine_reset() override;
@@ -1066,11 +1067,6 @@ WRITE_LINE_MEMBER( by35_state::u10_cb2_w )
m_u10_cb2 = state;
}
-WRITE_LINE_MEMBER( by35_state::u11_ca2_w )
-{
- output().set_value("led0", state);
-}
-
READ_LINE_MEMBER( by35_state::u11_ca1_r )
{
return m_u11_ca1;
@@ -1473,8 +1469,8 @@ void by35_state::by35(machine_config &config)
m_pia_u10->readcb1_handler().set(FUNC(by35_state::u10_cb1_r));
m_pia_u10->ca2_handler().set(FUNC(by35_state::u10_ca2_w));
m_pia_u10->cb2_handler().set(FUNC(by35_state::u10_cb2_w));
- m_pia_u10->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- m_pia_u10->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
+ m_pia_u10->irqa_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+ m_pia_u10->irqb_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
TIMER(config, "timer_z_freq").configure_periodic(FUNC(by35_state::timer_z_freq), attotime::from_hz(100)); // Mains Line Frequency * 2
TIMER(config, m_zero_crossing_active_timer).configure_generic(FUNC(by35_state::timer_z_pulse)); // Active pulse length from Zero Crossing detector
@@ -1484,10 +1480,10 @@ void by35_state::by35(machine_config &config)
m_pia_u11->writepb_handler().set(FUNC(by35_state::u11_b_w));
m_pia_u11->readca1_handler().set(FUNC(by35_state::u11_ca1_r));
m_pia_u11->readcb1_handler().set(FUNC(by35_state::u11_cb1_r));
- m_pia_u11->ca2_handler().set(FUNC(by35_state::u11_ca2_w));
+ m_pia_u11->ca2_handler().set_output("led0");
m_pia_u11->cb2_handler().set(FUNC(by35_state::u11_cb2_w));
- m_pia_u11->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- m_pia_u11->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
+ m_pia_u11->irqa_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+ m_pia_u11->irqb_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
TIMER(config, "timer_d_freq").configure_periodic(FUNC(by35_state::u11_timer), attotime::from_hz(317)); // 555 timer
TIMER(config, m_display_refresh_timer).configure_generic(FUNC(by35_state::timer_d_pulse)); // 555 Active pulse length
}
@@ -2790,6 +2786,9 @@ ROM_START(suprbowl)
ROM_LOAD("suprbowl.snd", 0xf000, 0x1000, CRC(97fc0f7a) SHA1(595aa080a6d2c1ab7e718974c4d01e846e142cc1))
ROM_END
+} // anonymous namespace
+
+
// AS-2888 sound
GAME( 1979, sst, 0, as2888, by35, by35_state, init_by35_6, ROT0, "Bally", "Supersonic", MACHINE_MECHANICAL | MACHINE_NOT_WORKING)
GAMEL(1978, playboy, 0, as2888, playboy, by35_state, init_by35_6, ROT0, "Bally", "Playboy", MACHINE_MECHANICAL | MACHINE_NOT_WORKING, layout_by35_playboy)
diff --git a/src/mame/drivers/by6803.cpp b/src/mame/drivers/by6803.cpp
index 5cea351558d..f79ffe5e45d 100644
--- a/src/mame/drivers/by6803.cpp
+++ b/src/mame/drivers/by6803.cpp
@@ -21,15 +21,19 @@ ToDo:
#include "emu.h"
+//#include "audio/midway.h"
#include "machine/genpin.h"
+
#include "cpu/m6800/m6801.h"
//#include "cpu/m6809/m6809.h"
#include "machine/6821pia.h"
#include "machine/timer.h"
-//#include "audio/midway.h"
+
//#include "by6803.lh"
+namespace {
+
class by6803_state : public genpin_class
{
public:
@@ -39,12 +43,9 @@ public:
, m_pia0(*this, "pia0")
, m_pia1(*this, "pia1")
, m_io_test(*this, "TEST")
- , m_io_x0(*this, "X0")
- , m_io_x1(*this, "X1")
- , m_io_x2(*this, "X2")
- , m_io_x3(*this, "X3")
- , m_io_x4(*this, "X4")
+ , m_io_x(*this, "X%u", 0U)
, m_digits(*this, "digit%u", 0U)
+ , m_leds(*this, "led%u", 0U)
{ }
void init_by6803();
@@ -53,6 +54,10 @@ public:
DECLARE_INPUT_CHANGED_MEMBER(activity_test);
DECLARE_INPUT_CHANGED_MEMBER(self_test);
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
private:
uint8_t port1_r();
void port1_w(uint8_t data);
@@ -81,18 +86,13 @@ private:
uint8_t m_port1, m_port2;
//uint8_t m_digit;
uint8_t m_segment;
- virtual void machine_reset() override;
- virtual void machine_start() override { m_digits.resolve(); }
required_device<m6803_cpu_device> m_maincpu;
required_device<pia6821_device> m_pia0;
required_device<pia6821_device> m_pia1;
required_ioport m_io_test;
- required_ioport m_io_x0;
- required_ioport m_io_x1;
- required_ioport m_io_x2;
- required_ioport m_io_x3;
- required_ioport m_io_x4;
+ required_ioport_array<5> m_io_x;
output_finder<40> m_digits;
+ output_finder<1> m_leds;
};
@@ -193,7 +193,7 @@ uint8_t by6803_state::port2_r()
void by6803_state::port2_w(uint8_t data)
{
m_port2 = data;
- output().set_value("led0", BIT(data, 2)); // P22 drives LED
+ m_leds[0] = BIT(data, 2); // P22 drives LED
}
// display latch strobes; display blanking
@@ -254,20 +254,9 @@ uint8_t by6803_state::pia0_b_r()
{
uint8_t data = 0;
- if (BIT(m_pia0_a, 0))
- data |= m_io_x0->read();
-
- if (BIT(m_pia0_a, 1))
- data |= m_io_x1->read();
-
- if (BIT(m_pia0_a, 2))
- data |= m_io_x2->read();
-
- if (BIT(m_pia0_a, 3))
- data |= m_io_x3->read();
-
- if (BIT(m_pia0_a, 4))
- data |= m_io_x4->read();
+ for (unsigned i = 0; m_io_x.size() > i; ++i)
+ if (BIT(m_pia0_a, i))
+ data |= m_io_x[i]->read();
return data;
}
@@ -342,6 +331,12 @@ void by6803_state::pia1_b_w(uint8_t data)
}
}
+void by6803_state::machine_start()
+{
+ m_digits.resolve();
+ m_leds.resolve();
+}
+
void by6803_state::machine_reset()
{
m_pia0_a = 0;
@@ -750,6 +745,8 @@ ROM_START(trucksp2)
ROM_RELOAD(0x20000 +0x8000, 0x8000)
ROM_END
+} // anonymous namespace
+
GAME( 1985, eballchp, 0, by6803, by6803, by6803_state, init_by6803, ROT0, "Bally", "Eight Ball Champ", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1985, beatclck, 0, by6803, by6803, by6803_state, init_by6803, ROT0, "Bally", "Beat the Clock", MACHINE_IS_SKELETON_MECHANICAL)
diff --git a/src/mame/drivers/calchase.cpp b/src/mame/drivers/calchase.cpp
index d67a94fa8b5..3f2045c0eb2 100644
--- a/src/mame/drivers/calchase.cpp
+++ b/src/mame/drivers/calchase.cpp
@@ -131,6 +131,7 @@ something wrong in the disk geometry reported by calchase.chd (20,255,63) since
#include "emu.h"
+
#include "bus/isa/trident.h"
#include "cpu/i386/i386.h"
#include "machine/lpci.h"
@@ -141,6 +142,7 @@ something wrong in the disk geometry reported by calchase.chd (20,255,63) since
#include "machine/nvram.h"
#include "sound/dac.h"
#include "video/pc_vga.h"
+
#include "screen.h"
#include "speaker.h"
@@ -152,6 +154,7 @@ class calchase_state : public pcat_base_state
public:
calchase_state(const machine_config &mconfig, device_type type, const char *tag)
: pcat_base_state(mconfig, type, tag)
+ , m_iocard(*this, "IOCARD%u", 1U)
{
}
@@ -165,6 +168,7 @@ protected:
virtual void machine_reset() override;
private:
+ required_ioport_array<5> m_iocard;
std::unique_ptr<uint32_t[]> m_bios_ram;
std::unique_ptr<uint32_t[]> m_bios_ext_ram;
std::unique_ptr<uint8_t[]> m_nvram_data;
@@ -176,11 +180,7 @@ private:
void bios_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
uint8_t nvram_r(offs_t offset);
void nvram_w(offs_t offset, uint8_t data);
- uint16_t calchase_iocard1_r();
- uint16_t calchase_iocard2_r();
- uint16_t calchase_iocard3_r();
- uint16_t calchase_iocard4_r();
- uint16_t calchase_iocard5_r();
+ template <unsigned N> uint16_t iocard_r();
uint32_t calchase_idle_skip_r();
void calchase_idle_skip_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
@@ -380,30 +380,10 @@ void calchase_state::nvram_w(offs_t offset, uint8_t data)
m_nvram_data[offset] = data;
}
-uint16_t calchase_state::calchase_iocard1_r()
+template <unsigned N>
+uint16_t calchase_state::iocard_r()
{
- return ioport("IOCARD1")->read();
-}
-
-uint16_t calchase_state::calchase_iocard2_r()
-{
- return ioport("IOCARD2")->read();
-}
-
-uint16_t calchase_state::calchase_iocard3_r()
-{
- return ioport("IOCARD3")->read();
-}
-
-/* These two controls wheel pot or whatever this game uses ... */
-uint16_t calchase_state::calchase_iocard4_r()
-{
- return ioport("IOCARD4")->read();
-}
-
-uint16_t calchase_state::calchase_iocard5_r()
-{
- return ioport("IOCARD5")->read();
+ return m_iocard[N]->read();
}
@@ -414,11 +394,11 @@ void calchase_state::calchase_map(address_map &map)
map(0x000c0000, 0x000c7fff).rom().region("video_bios", 0);
map(0x000c8000, 0x000cffff).noprw();
//map(0x000d0000, 0x000d0003).ram(); // XYLINX - Sincronus serial communication
- map(0x000d0004, 0x000d0005).r(FUNC(calchase_state::calchase_iocard1_r));
- map(0x000d000c, 0x000d000d).r(FUNC(calchase_state::calchase_iocard2_r));
- map(0x000d0032, 0x000d0033).r(FUNC(calchase_state::calchase_iocard3_r));
- map(0x000d0030, 0x000d0031).r(FUNC(calchase_state::calchase_iocard4_r));
- map(0x000d0034, 0x000d0035).r(FUNC(calchase_state::calchase_iocard5_r));
+ map(0x000d0004, 0x000d0005).r(FUNC(calchase_state::iocard_r<0>));
+ map(0x000d000c, 0x000d000d).r(FUNC(calchase_state::iocard_r<1>));
+ map(0x000d0032, 0x000d0033).r(FUNC(calchase_state::iocard_r<2>));
+ map(0x000d0030, 0x000d0031).r(FUNC(calchase_state::iocard_r<3>)); // These two controls wheel pot or whatever this game uses ...
+ map(0x000d0034, 0x000d0035).r(FUNC(calchase_state::iocard_r<4>));
map(0x000d0008, 0x000d000b).nopw(); // ???
map(0x000d0024, 0x000d0025).w("ldac", FUNC(dac_word_interface::data_w));
map(0x000d0028, 0x000d0029).w("rdac", FUNC(dac_word_interface::data_w));
@@ -496,6 +476,7 @@ static INPUT_PORTS_START( calchase )
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
+
PORT_START("IOCARD2")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_SERVICE1 ) // guess
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Reset SW")
@@ -514,6 +495,7 @@ static INPUT_PORTS_START( calchase )
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Turbo")
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) // returns back to MS-DOS (likely to be unmapped and actually used as a lame protection check)
PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
+
PORT_START("IOCARD3")
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen")
PORT_BIT( 0xdfff, IP_ACTIVE_LOW, IPT_UNUSED )
@@ -565,6 +547,7 @@ static INPUT_PORTS_START( calchase )
PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
PORT_START("IOCARD5")
PORT_DIPNAME( 0x01, 0x01, "DSWA" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
diff --git a/src/mame/drivers/cc40.cpp b/src/mame/drivers/cc40.cpp
index d3295909bdc..46602c0e62f 100644
--- a/src/mame/drivers/cc40.cpp
+++ b/src/mame/drivers/cc40.cpp
@@ -196,7 +196,7 @@ DEVICE_IMAGE_LOAD_MEMBER(cc40_state::cart_load)
// max size is 4*32KB
if (size > 0x20000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid file size");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid file size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/cchasm.cpp b/src/mame/drivers/cchasm.cpp
index 48f8214a692..e40fa754d2e 100644
--- a/src/mame/drivers/cchasm.cpp
+++ b/src/mame/drivers/cchasm.cpp
@@ -15,17 +15,102 @@
***************************************************************************/
#include "emu.h"
-#include "includes/cchasm.h"
-#include "machine/z80daisy.h"
#include "cpu/m68000/m68000.h"
+#include "cpu/z80/z80.h"
#include "machine/6840ptm.h"
-#include "machine/z80ctc.h"
+#include "machine/gen_latch.h"
#include "machine/watchdog.h"
+#include "machine/z80ctc.h"
+#include "machine/z80ctc.h"
+#include "machine/z80daisy.h"
#include "sound/ay8910.h"
+#include "sound/dac.h"
+#include "video/vector.h"
+
+#include "screen.h"
#include "speaker.h"
-#define CCHASM_68K_CLOCK (XTAL(8'000'000))
+
+namespace {
+
+class cchasm_state : public driver_device
+{
+public:
+ cchasm_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_ctc(*this, "ctc"),
+ m_audiocpu(*this, "audiocpu"),
+ m_dac1(*this, "dac1"),
+ m_dac2(*this, "dac2"),
+ m_vector(*this, "vector"),
+ m_screen(*this, "screen"),
+ m_soundlatch(*this, "soundlatch"),
+ m_soundlatch2(*this, "soundlatch2"),
+ m_soundlatch3(*this, "soundlatch3"),
+ m_soundlatch4(*this, "soundlatch4"),
+ m_ram(*this, "ram"),
+ m_inputs(*this, "IN%u", 1U)
+ {
+ }
+
+ void cchasm(machine_config &config);
+
+ INPUT_CHANGED_MEMBER(set_coin_flag);
+
+protected:
+ enum
+ {
+ TIMER_REFRESH_END
+ };
+
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ virtual void machine_start() override;
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<z80ctc_device> m_ctc;
+ required_device<z80_device> m_audiocpu;
+ required_device<dac_bit_interface> m_dac1;
+ required_device<dac_bit_interface> m_dac2;
+ required_device<vector_device> m_vector;
+ required_device<screen_device> m_screen;
+ required_device<generic_latch_8_device> m_soundlatch;
+ required_device<generic_latch_8_device> m_soundlatch2;
+ required_device<generic_latch_8_device> m_soundlatch3;
+ required_device<generic_latch_8_device> m_soundlatch4;
+
+ required_shared_ptr<uint16_t> m_ram;
+
+ required_ioport_array<3> m_inputs;
+
+ int m_sound_flags;
+ int m_coin_flag;
+ int m_output[2];
+ int m_xcenter;
+ int m_ycenter;
+ emu_timer *m_refresh_end_timer;
+
+ void led_w(offs_t offset, uint16_t data);
+ void refresh_control_w(offs_t offset, uint8_t data);
+ void reset_coin_flag_w(uint8_t data);
+ uint8_t coin_sound_r();
+ uint8_t soundlatch2_r();
+ void soundlatch4_w(uint8_t data);
+ void io_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+ uint16_t io_r(offs_t offset);
+ DECLARE_WRITE_LINE_MEMBER(ctc_timer_1_w);
+ DECLARE_WRITE_LINE_MEMBER(ctc_timer_2_w);
+
+ void refresh();
+
+ void memmap(address_map &map);
+ void sound_memmap(address_map &map);
+ void sound_portmap(address_map &map);
+};
+
/*************************************
*
@@ -37,11 +122,11 @@ void cchasm_state::memmap(address_map &map)
{
map(0x000000, 0x00ffff).rom();
map(0x040000, 0x04000f).rw("6840ptm", FUNC(ptm6840_device::read), FUNC(ptm6840_device::write)).umask16(0x00ff);
- map(0x050000, 0x050001).w(FUNC(cchasm_state::refresh_control_w));
+ map(0x050000, 0x050000).w(FUNC(cchasm_state::refresh_control_w));
map(0x060000, 0x060001).portr("DSW").w(FUNC(cchasm_state::led_w));
map(0x070000, 0x070001).w("watchdog", FUNC(watchdog_timer_device::reset16_w));
map(0xf80000, 0xf800ff).rw(FUNC(cchasm_state::io_r), FUNC(cchasm_state::io_w));
- map(0xffb000, 0xffffff).ram().share("ram");
+ map(0xffb000, 0xffffff).ram().share(m_ram);
}
/*************************************
@@ -125,6 +210,248 @@ static INPUT_PORTS_START( cchasm )
INPUT_PORTS_END
+
+void cchasm_state::led_w(offs_t offset, uint16_t data)
+{
+ /*logerror("LED write %x to %x\n", data, offset);*/
+}
+
+
+void cchasm_state::reset_coin_flag_w(uint8_t data)
+{
+ if (m_coin_flag)
+ {
+ m_coin_flag = 0;
+ m_ctc->trg0(m_coin_flag);
+ }
+}
+
+INPUT_CHANGED_MEMBER(cchasm_state::set_coin_flag )
+{
+ if (!newval && !m_coin_flag)
+ {
+ m_coin_flag = 1;
+ m_ctc->trg0(m_coin_flag);
+ }
+}
+
+uint8_t cchasm_state::coin_sound_r()
+{
+ uint8_t coin = (m_inputs[2]->read() >> 4) & 0x7;
+ return m_sound_flags | (m_coin_flag << 3) | coin;
+}
+
+uint8_t cchasm_state::soundlatch2_r()
+{
+ m_sound_flags &= ~0x80;
+ m_ctc->trg2(0);
+ return m_soundlatch2->read();
+}
+
+void cchasm_state::soundlatch4_w(uint8_t data)
+{
+ m_sound_flags |= 0x40;
+ m_soundlatch4->write(data);
+ m_maincpu->set_input_line(1, HOLD_LINE);
+}
+
+void cchasm_state::io_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ //static int led;
+
+ if (ACCESSING_BITS_8_15)
+ {
+ data >>= 8;
+ switch (offset & 0xf)
+ {
+ case 0:
+ m_soundlatch->write(data);
+ break;
+ case 1:
+ m_sound_flags |= 0x80;
+ m_soundlatch2->write(data);
+ m_ctc->trg2(1);
+ m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
+ break;
+ case 2:
+ //led = data;
+ break;
+ }
+ }
+}
+
+uint16_t cchasm_state::io_r(offs_t offset)
+{
+ switch (offset & 0xf)
+ {
+ case 0x0:
+ return m_soundlatch3->read() << 8;
+ case 0x1:
+ m_sound_flags &= ~0x40;
+ return m_soundlatch4->read() << 8;
+ case 0x2:
+ return (m_sound_flags| (ioport("IN3")->read() & 0x07) | 0x08) << 8;
+ case 0x5:
+ return m_inputs[1]->read() << 8;
+ case 0x8:
+ return m_inputs[0]->read() << 8;
+ default:
+ return 0xff << 8;
+ }
+}
+
+
+WRITE_LINE_MEMBER(cchasm_state::ctc_timer_1_w)
+{
+ if (state) /* rising edge */
+ {
+ m_output[0] = !m_output[0];
+ m_dac1->write(m_output[0]);
+ }
+}
+
+WRITE_LINE_MEMBER(cchasm_state::ctc_timer_2_w)
+{
+ if (state) /* rising edge */
+ {
+ m_output[1] = !m_output[1];
+ m_dac2->write(m_output[1]);
+ }
+}
+
+
+void cchasm_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_REFRESH_END:
+ m_maincpu->set_input_line(2, ASSERT_LINE);
+ break;
+ default:
+ throw emu_fatalerror("Unknown id in cchasm_state::device_timer");
+ }
+}
+
+
+void cchasm_state::refresh()
+{
+ constexpr int HALT = 0;
+ constexpr int JUMP = 1;
+ constexpr int COLOR = 2;
+ constexpr int SCALEY = 3;
+ constexpr int POSY = 4;
+ constexpr int SCALEX = 5;
+ constexpr int POSX = 6;
+ constexpr int LENGTH = 7;
+
+ int pc = 0;
+ int done = 0;
+ int currentx = 0, currenty = 0;
+ int scalex = 0, scaley = 0;
+ int color = 0;
+ int total_length = 1; /* length of all lines drawn in a frame */
+ int move = 0;
+
+ m_vector->clear_list();
+
+ while (!done)
+ {
+ int data = m_ram[pc];
+ const int opcode = data >> 12;
+ data &= 0xfff;
+ if ((opcode > COLOR) && (data & 0x800))
+ data |= 0xfffff000;
+
+ pc++;
+
+ switch (opcode)
+ {
+ case HALT:
+ done=1;
+ break;
+ case JUMP:
+ pc = data - 0xb00;
+ logerror("JUMP to %x\n", data);
+ break;
+ case COLOR:
+ color = vector_device::color444(data ^ 0xfff);
+ break;
+ case SCALEY:
+ scaley = data << 5;
+ break;
+ case POSY:
+ move = 1;
+ currenty = m_ycenter + (data << 16);
+ break;
+ case SCALEX:
+ scalex = data << 5;
+ break;
+ case POSX:
+ move = 1;
+ currentx = m_xcenter - (data << 16);
+ break;
+ case LENGTH:
+ if (move)
+ {
+ m_vector->add_point (currentx, currenty, 0, 0);
+ move = 0;
+ }
+
+ currentx -= data * scalex;
+ currenty += data * scaley;
+
+ total_length += abs(data);
+
+ if (color)
+ m_vector->add_point (currentx, currenty, color, 0xff);
+ else
+ move = 1;
+ break;
+ default:
+ logerror("Unknown refresh proc opcode %x with data %x at pc = %x\n", opcode, data, pc-2);
+ done = 1;
+ break;
+ }
+ }
+ /* Refresh processor runs with 6 MHz */
+ m_refresh_end_timer->adjust(attotime::from_hz(6000000) * total_length);
+}
+
+
+void cchasm_state::refresh_control_w(offs_t offset, uint8_t data)
+{
+ switch (data)
+ {
+ case 0x37:
+ refresh();
+ break;
+ case 0xf7:
+ m_maincpu->set_input_line(2, CLEAR_LINE);
+ break;
+ }
+}
+
+void cchasm_state::machine_start()
+{
+ const rectangle &visarea = m_screen->visible_area();
+
+ m_xcenter = visarea.xcenter() << 16;
+ m_ycenter = visarea.ycenter() << 16;
+
+ m_refresh_end_timer = timer_alloc(TIMER_REFRESH_END);
+
+ m_coin_flag = 0;
+ m_sound_flags = 0;
+ m_output[0] = 0;
+ m_output[1] = 0;
+
+ save_item(NAME(m_sound_flags));
+ save_item(NAME(m_coin_flag));
+ save_item(NAME(m_output));
+}
+
+
+
/*************************************
*
* CPU config
@@ -147,6 +474,8 @@ static const z80_daisy_config daisy_chain[] =
void cchasm_state::cchasm(machine_config &config)
{
+ constexpr XTAL CCHASM_68K_CLOCK(8'000'000);
+
/* basic machine hardware */
M68000(config, m_maincpu, CCHASM_68K_CLOCK); /* 8 MHz (from schematics) */
m_maincpu->set_addrmap(AS_PROGRAM, &cchasm_state::memmap);
@@ -179,12 +508,12 @@ void cchasm_state::cchasm(machine_config &config)
GENERIC_LATCH_8(config, m_soundlatch3);
GENERIC_LATCH_8(config, m_soundlatch4);
- AY8910(config, "ay1", 1818182).add_route(ALL_OUTPUTS, "speaker", 0.2);
+ AY8910(config, "ay1", 1818182).add_route(ALL_OUTPUTS, "speaker", 0.15);
- AY8910(config, "ay2", 1818182).add_route(ALL_OUTPUTS, "speaker", 0.2);
+ AY8910(config, "ay2", 1818182).add_route(ALL_OUTPUTS, "speaker", 0.15);
- DAC_1BIT(config, m_dac1, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
- DAC_1BIT(config, m_dac2, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ DAC_1BIT(config, m_dac1, 0).add_route(ALL_OUTPUTS, "speaker", 0.375);
+ DAC_1BIT(config, m_dac2, 0).add_route(ALL_OUTPUTS, "speaker", 0.375);
/* 6840 PTM */
ptm6840_device &ptm(PTM6840(config, "6840ptm", CCHASM_68K_CLOCK/10));
@@ -250,6 +579,7 @@ ROM_START( cchasm1 )
ROM_LOAD( "2732.bin", 0x0000, 0x1000, CRC(715adc4a) SHA1(426be4f3334ef7f2e8eb4d533e64276c30812aa3) )
ROM_END
+} // anonymous namespace
diff --git a/src/mame/drivers/ccs2810.cpp b/src/mame/drivers/ccs2810.cpp
index 704d856500c..339ed5f04a5 100644
--- a/src/mame/drivers/ccs2810.cpp
+++ b/src/mame/drivers/ccs2810.cpp
@@ -99,6 +99,8 @@ ToDo:
#include "machine/z80sio.h"
+namespace {
+
class ccs_state : public driver_device
{
public:
@@ -121,6 +123,9 @@ public:
void ccs2422(machine_config &config);
protected:
+ void machine_start() override;
+ void machine_reset() override;
+
u8 port04_r();
u8 port34_r();
void port04_w(u8 data);
@@ -150,9 +155,6 @@ private:
u8 io_read(offs_t offset);
void io_write(offs_t offset, u8 data);
- void machine_start() override;
- void machine_reset() override;
-
void port40_w(u8 data);
void ccs2422_io(address_map &map);
@@ -173,9 +175,11 @@ public:
void ccs300(machine_config &config);
-private:
+protected:
void machine_start() override;
void machine_reset() override;
+
+private:
void ccs300_io(address_map &map);
void ccs300_mem(address_map &map);
void port40_w(u8 data);
@@ -978,6 +982,7 @@ void ccs300_state::machine_start()
{
m_bank1->configure_entry(0, m_ram1);
m_bank1->configure_entry(1, m_rom);
+
save_item(NAME(m_ss));
save_item(NAME(m_dden));
save_item(NAME(m_dsize));
@@ -1139,9 +1144,12 @@ ROM_START( ccs300 )
ROM_LOAD( "ccs300.rom", 0x0000, 0x0800, CRC(6cf22e31) SHA1(9aa3327cd8c23d0eab82cb6519891aff13ebe1d0))
ROM_END
+} // anonymous namespace
+
+
/* Driver */
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1980, ccs2810, 0, 0, ccs2810, ccs2810, ccs_state, empty_init, "California Computer Systems", "CCS Model 2810 CPU card", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
COMP( 1980, ccs2422, ccs2810, 0, ccs2422, ccs2810, ccs_state, empty_init, "California Computer Systems", "CCS Model 2422B FDC card", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
-COMP( 1981, ccs300, ccs2810, 0, ccs300, ccs300, ccs300_state, empty_init, "California Computer Systems", "CCS Model 300", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
+COMP( 1981, ccs300, ccs2810, 0, ccs300, ccs300, ccs300_state, empty_init, "California Computer Systems", "CCS Model 300", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/cd2650.cpp b/src/mame/drivers/cd2650.cpp
index 01760a14fbd..cf8203a25fd 100644
--- a/src/mame/drivers/cd2650.cpp
+++ b/src/mame/drivers/cd2650.cpp
@@ -259,13 +259,13 @@ QUICKLOAD_LOAD_MEMBER(cd2650_state::quickload_cb)
int quick_length = image.length();
if (quick_length < 0x1500)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ image.seterror(image_error::INVALIDIMAGE, "File too short");
image.message(" File too short");
}
else
if (quick_length > 0x8000)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too long");
+ image.seterror(image_error::INVALIDIMAGE, "File too long");
image.message(" File too long");
}
else
@@ -274,13 +274,13 @@ QUICKLOAD_LOAD_MEMBER(cd2650_state::quickload_cb)
int read_ = image.fread( &quick_data[0], quick_length);
if (read_ != quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Cannot read the file");
+ image.seterror(image_error::INVALIDIMAGE, "Cannot read the file");
image.message(" Cannot read the file");
}
else
if (quick_data[0] != 0x40)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid header");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid header");
image.message(" Invalid header");
}
else
@@ -289,7 +289,7 @@ QUICKLOAD_LOAD_MEMBER(cd2650_state::quickload_cb)
if (exec_addr >= quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Exec address beyond end of file");
+ image.seterror(image_error::INVALIDIMAGE, "Exec address beyond end of file");
image.message(" Exec address beyond end of file");
}
else
diff --git a/src/mame/drivers/ceres.cpp b/src/mame/drivers/ceres.cpp
index c55add94f5c..02255ced38d 100644
--- a/src/mame/drivers/ceres.cpp
+++ b/src/mame/drivers/ceres.cpp
@@ -282,7 +282,7 @@ INPUT_CHANGED_MEMBER(ceres1_state::mouse_x)
else if (delta < -0x80)
delta += 0x100;
- m_mouse_x = std::max(0, std::min(m_mouse_x + delta, 1023));
+ m_mouse_x = std::clamp(m_mouse_x + delta, 0, 1023);
}
INPUT_CHANGED_MEMBER(ceres1_state::mouse_y)
@@ -294,7 +294,7 @@ INPUT_CHANGED_MEMBER(ceres1_state::mouse_y)
else if (delta < -0x80)
delta += 0x100;
- m_mouse_y = std::max(0, std::min(m_mouse_y - delta, 799));
+ m_mouse_y = std::clamp(m_mouse_y - delta, 0, 799);
}
static INPUT_PORTS_START(ceres1)
diff --git a/src/mame/drivers/champbas.cpp b/src/mame/drivers/champbas.cpp
index 082ef6625f1..76d74bf4829 100644
--- a/src/mame/drivers/champbas.cpp
+++ b/src/mame/drivers/champbas.cpp
@@ -226,6 +226,8 @@ void champbas_state::champbb2j_map(address_map &map)
void champbas_state::tbasebal_map(address_map &map)
{
champbas_map(map);
+ map(0x6000, 0x63ff).ram();
+ map(0x6800, 0x6fff).rom();
map(0x7800, 0x7fff).rom();
}
@@ -650,7 +652,16 @@ void champbas_state::tbasebal(machine_config &config)
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &champbas_state::tbasebal_map);
- M68705P3(config, "mcu", XTAL(18'432'000)/6); // ?Mhz
+ m_mainlatch->q_out_cb<6>().set([this](int state){ logerror("%s latch bit 6 w: %02x\n", machine().describe_context(), state); }); // to M68705? the code here seems the same as champbb2
+ m_mainlatch->q_out_cb<7>().set([this](int state){ logerror("%s latch bit 7 w: %02x\n", machine().describe_context(), state); }); // "
+
+ m68705p_device &mcu(M68705P3(config, "mcu", XTAL(18'432'000) / 6)); // ?Mhz
+ mcu.porta_r().set_log("MCU port A r");
+ mcu.porta_w().set([this](uint8_t data){ logerror("%s MCU port A w: %02x\n", machine().describe_context(), data); });
+ mcu.portb_r().set_log("MCU port B r");
+ mcu.portb_w().set([this](uint8_t data){ logerror("%s MCU port B w: %02x\n", machine().describe_context(), data); });
+ mcu.portc_r().set_log("MCU port C r");
+ mcu.portc_w().set([this](uint8_t data){ logerror("%s MCU port C w: %02x\n", machine().describe_context(), data); });
}
diff --git a/src/mame/drivers/changela.cpp b/src/mame/drivers/changela.cpp
index c2441d7a261..80ce1225b40 100644
--- a/src/mame/drivers/changela.cpp
+++ b/src/mame/drivers/changela.cpp
@@ -1,6 +1,7 @@
// license:GPL-2.0+
// copyright-holders:Jarek Burczynski, Phil Stroffolino, Tomasz Slanina
/**************************************************************************
+
Change Lanes
(C) Taito 1983
@@ -49,12 +50,11 @@ void changela_state::changela_68705_port_a_w(uint8_t data)
void changela_state::changela_68705_port_c_w(uint8_t data)
{
/* PC3 is connected to the CLOCK input of the LS374, so we latch the data on rising edge */
- if (BIT(data, 3) && ~BIT(m_port_c_out, 3))
+ if (BIT(data, 3) && !BIT(m_port_c_out, 3))
m_mcu_out = m_port_a_out & (BIT(m_port_c_out, 2) ? 0xff : m_mcu_in);
/* PC2 is connected to the /OE input of the LS374 */
- if (BIT(data, 2))
- m_mcu->pa_w(BIT(data, 2) ? 0xff : m_mcu_in);
+ m_mcu->pa_w(BIT(data, 2) ? 0xff : m_mcu_in);
m_port_c_out = data;
}
diff --git a/src/mame/drivers/cking_master.cpp b/src/mame/drivers/cking_master.cpp
index 5cefa52ef89..ce7b3391022 100644
--- a/src/mame/drivers/cking_master.cpp
+++ b/src/mame/drivers/cking_master.cpp
@@ -24,7 +24,7 @@ TODO:
#include "cpu/z80/z80.h"
#include "machine/sensorboard.h"
#include "machine/bankdev.h"
-#include "machine/timer.h"
+#include "machine/clock.h"
#include "sound/dac.h"
#include "video/pwm.h"
@@ -42,7 +42,6 @@ public:
master_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
- m_irq_on(*this, "irq_on"),
m_display(*this, "display"),
m_board(*this, "board"),
m_dac(*this, "dac"),
@@ -61,17 +60,12 @@ protected:
private:
// devices/pointers
required_device<cpu_device> m_maincpu;
- required_device<timer_device> m_irq_on;
required_device<pwm_display_device> m_display;
required_device<sensorboard_device> m_board;
required_device<dac_2bit_binary_weighted_ones_complement_device> m_dac;
required_device<address_map_bank_device> m_mainmap;
required_ioport_array<2> m_inputs;
- // periodic interrupts
- template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); }
- template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); }
-
// address maps
void main_map(address_map &map);
void main_trampoline(address_map &map);
@@ -226,10 +220,9 @@ void master_state::master(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &master_state::main_trampoline);
ADDRESS_MAP_BANK(config, "mainmap").set_map(&master_state::main_map).set_options(ENDIANNESS_LITTLE, 8, 16);
- const attotime irq_period = attotime::from_hz(418); // 555 timer (22nF, 150K, 1K5), measured 418Hz
- TIMER(config, m_irq_on).configure_periodic(FUNC(master_state::irq_on<INPUT_LINE_IRQ0>), irq_period);
- m_irq_on->set_start_delay(irq_period - attotime::from_nsec(22870)); // active for 22.87us
- TIMER(config, "irq_off").configure_periodic(FUNC(master_state::irq_off<INPUT_LINE_IRQ0>), irq_period);
+ auto &irq_clock(CLOCK(config, "irq_clock", 418)); // 555 timer (22nF, 150K, 1K5), measured 418Hz
+ irq_clock.set_pulse_width(attotime::from_nsec(22870)); // active for 22.87us
+ irq_clock.signal_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS);
m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess));
diff --git a/src/mame/drivers/clshroad.cpp b/src/mame/drivers/clshroad.cpp
index 9b4e956536c..75cb73b6845 100644
--- a/src/mame/drivers/clshroad.cpp
+++ b/src/mame/drivers/clshroad.cpp
@@ -35,7 +35,7 @@ TODO:
- $6100 is actually OR-ed with the coinage work RAM buffer setting at $8022;
- $6124 is shifted right once at PC=0x5df and stored to $82e6, which is later
checked at PC=0x187 and must be $01 otherwise game goes into an infinite
- loop after dying (without ROM patch);
+ loop after dying (without ROM patch);
- (more ...)
*******************************************************************************/
diff --git a/src/mame/drivers/cobra.cpp b/src/mame/drivers/cobra.cpp
index 63f42a2db3d..024aaf9b614 100644
--- a/src/mame/drivers/cobra.cpp
+++ b/src/mame/drivers/cobra.cpp
@@ -2517,7 +2517,7 @@ void cobra_renderer::gfx_fifo_exec()
}
- cobra_polydata &extra = object_data_alloc();
+ cobra_polydata &extra = object_data().next();
int texture = (m_gfx_gram[0x400f4/4] >> 29);
diff --git a/src/mame/drivers/cops.cpp b/src/mame/drivers/cops.cpp
index aaff00e225d..8309d1f0eaa 100644
--- a/src/mame/drivers/cops.cpp
+++ b/src/mame/drivers/cops.cpp
@@ -31,12 +31,14 @@
#include "emu.h"
+
#include "cpu/m6502/m6502.h"
#include "machine/6522via.h"
-#include "sound/sn76496.h"
-#include "machine/msm6242.h"
#include "machine/ldp1450.h"
#include "machine/mos6551.h"
+#include "machine/msm6242.h"
+#include "sound/sn76496.h"
+
#include "speaker.h"
#include "cops.lh"
@@ -60,6 +62,9 @@ public:
, m_maincpu(*this, "maincpu")
, m_sn(*this, "snsnd")
, m_ld(*this, "laserdisc")
+ , m_switches(*this, "SW%u", 0U)
+ , m_steer(*this, "STEER")
+ , m_digits(*this, "digit%u", 0U)
, m_irq(0)
{ }
@@ -83,6 +88,9 @@ private:
required_device<cpu_device> m_maincpu;
required_device<sn76489_device> m_sn;
required_device<sony_ldp1450_device> m_ld;
+ required_ioport_array<3> m_switches;
+ optional_ioport m_steer;
+ output_finder<16> m_digits;
// screen updates
[[maybe_unused]] uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@@ -581,11 +589,11 @@ uint8_t cops_state::io1_r(offs_t offset)
switch( offset & 0x0f )
{
case 0x08: /* SW0 */
- return ioport("SW0")->read();
+ return m_switches[0]->read();
case 0x09: /* SW1 */
- return ioport("SW1")->read();
+ return m_switches[1]->read();
case 0x0a: /* SW2 */
- return ioport("SW2")->read();
+ return m_switches[2]->read();
default:
logerror("Unknown io1_r, offset = %03x\n", offset);
return 0;
@@ -599,11 +607,11 @@ uint8_t cops_state::io1_lm_r(offs_t offset)
case 0x07: /* WDI */
return 1;
case 0x08: /* SW0 */
- return ioport("SW0")->read();
+ return m_switches[0]->read();
case 0x09: /* SW1 */
- return ioport("SW1")->read();
+ return m_switches[1]->read();
case 0x0a: /* SW2 */
- return ioport("SW2")->read();
+ return m_switches[2]->read();
default:
logerror("Unknown io1_r, offset = %03x\n", offset);
return 0;
@@ -612,11 +620,7 @@ uint8_t cops_state::io1_lm_r(offs_t offset)
void cops_state::io1_w(offs_t offset, uint8_t data)
{
- int i;
- char output_name[16];
- uint16_t display_data;
-
- switch( offset & 0x0f )
+ switch (offset & 0x0f)
{
case 0x00: /* WOP0 Alpha display*/
m_lcd_addr_l = data;
@@ -625,24 +629,19 @@ void cops_state::io1_w(offs_t offset, uint8_t data)
m_lcd_addr_h = data;
{
// update display
- const uint16_t addrs_table[] = { 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0002, 0x0001, 0x0080,
- 0x1000, 0x0800, 0x0400, 0x2000, 0x4000, 0x0200, 0x0100, 0x8000 };
- uint16_t addr = m_lcd_addr_l | (m_lcd_addr_h << 8);
- for (i = 0; i < 16; i++ )
+ constexpr uint16_t addrs_table[] = {
+ 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0002, 0x0001, 0x0080,
+ 0x1000, 0x0800, 0x0400, 0x2000, 0x4000, 0x0200, 0x0100, 0x8000 };
+ const uint16_t addr = m_lcd_addr_l | (m_lcd_addr_h << 8);
+ for (int i = 0; i < 16; i++)
{
if (addr == addrs_table[i])
{
+ const uint16_t display_data = m_lcd_data_l | (m_lcd_data_h << 8);
+ m_digits[i] = bitswap<16>(display_data, 4, 5, 12, 1, 0, 11, 10, 6, 7, 2, 9, 3, 15, 8, 14, 13);
break;
}
}
-
- if (i < 16)
- {
- sprintf(output_name, "digit%d", i);
- display_data = m_lcd_data_l | (m_lcd_data_h << 8);
- display_data = bitswap<16>(display_data, 4, 5, 12, 1, 0, 11, 10, 6, 7, 2, 9, 3, 15, 8, 14, 13);
- output().set_value(output_name, display_data);
- }
}
break;
case 0x02: /* WOP2 Alpha display*/
@@ -690,7 +689,7 @@ uint8_t cops_state::io2_r(offs_t offset)
switch( offset & 0x0f )
{
case 0x03:
- return ioport("STEER")->read();
+ return m_steer->read();
default:
logerror("Unknown io2_r, offset = %02x\n", offset);
return 0;
@@ -871,13 +870,13 @@ static INPUT_PORTS_START( revlatns )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_CUSTOM )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_CUSTOM )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM )
-
INPUT_PORTS_END
void cops_state::machine_start()
{
- m_ld_timer = timer_alloc(*this, FUNC(cops_state::ld_timer_callback));
+ m_digits.resolve();
+ m_ld_timer = timer_alloc(*this, FUNC(cops_state::ld_timer_callback));
m_ld_timer->adjust(attotime::from_hz(167*5), 0, attotime::from_hz(167*5));
m_dacia_cmpval1 = m_dacia_cmpval2 = 0;
@@ -941,6 +940,7 @@ void cops_state::base(machine_config &config)
void cops_state::cops(machine_config &config)
{
base(config);
+
m_maincpu->set_addrmap(AS_PROGRAM, &cops_state::cops_map);
via6522_device &via2(MOS6522(config, "via6522_2", MAIN_CLOCK/2));
@@ -955,6 +955,7 @@ void cops_state::cops(machine_config &config)
void cops_state::revlatns(machine_config &config)
{
base(config);
+
m_maincpu->set_addrmap(AS_PROGRAM, &cops_state::revlatns_map);
MSM6242(config, "rtc", XTAL(32'768));
diff --git a/src/mame/drivers/cortex.cpp b/src/mame/drivers/cortex.cpp
index e5f2774683f..4b4a7b85d8a 100644
--- a/src/mame/drivers/cortex.cpp
+++ b/src/mame/drivers/cortex.cpp
@@ -44,16 +44,20 @@ packed into a single address-byte (CRU 0 = bit 0, etc). So the address is
****************************************************************************/
-
#include "emu.h"
+
#include "cpu/tms9900/tms9995.h"
#include "machine/74259.h"
-#include "video/tms9928a.h"
-//#include "machine/tms9902.h"
#include "machine/keyboard.h"
+//#include "machine/tms9902.h"
+#include "video/tms9928a.h"
#include "sound/beep.h"
+
#include "speaker.h"
+
+namespace {
+
class cortex_state : public driver_device
{
public:
@@ -69,6 +73,10 @@ public:
void cortex(machine_config &config);
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
private:
void kbd_put(u8 data);
DECLARE_WRITE_LINE_MEMBER(keyboard_ack_w);
@@ -76,13 +84,13 @@ private:
DECLARE_WRITE_LINE_MEMBER(vdp_int_w);
u8 pio_r(offs_t offset);
u8 keyboard_r(offs_t offset);
+
void io_map(address_map &map);
void mem_map(address_map &map);
+
bool m_kbd_ack;
bool m_vdp_int;
u8 m_term_data;
- void machine_reset() override;
- void machine_start() override;
required_device<tms9995_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -93,7 +101,7 @@ private:
void cortex_state::mem_map(address_map &map)
{
- map(0x0000, 0x7fff).ram().share("mainram").bankr("bank1");
+ map(0x0000, 0x7fff).ram().share(m_ram).bankr(m_bank1);
map(0x8000, 0xefff).ram();
map(0xf100, 0xf11f).ram(); // memory mapping unit
map(0xf120, 0xf121).rw("crtc", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
@@ -245,6 +253,9 @@ ROM_START( cortex )
ROMX_LOAD( "forth.ic46", 0x2000, 0x2000, CRC(8eca54cc) SHA1(0f1680e941ef60bb9bde9a4b843b78f30dff3202), ROM_BIOS(1))
ROM_END
+} // anonymous namespace
+
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/cromptons.cpp b/src/mame/drivers/cromptons.cpp
index 51473dd99ad..643004d77c7 100644
--- a/src/mame/drivers/cromptons.cpp
+++ b/src/mame/drivers/cromptons.cpp
@@ -11,6 +11,18 @@
Dips: 2 x 8 dips banks
Video: https://www.youtube.com/watch?v=89XJpor9dSQ
+
+ Other games using the same PCB include:
+ * Casino Nights (coin pusher)
+ * Chuck Rock (coin pusher)
+ * Disco Fever (coin pusher)
+ * Hi Ball (redemption)
+ * Pharaoh's Treasure (coin pusher)
+ * Pirates Treasure (coin pusher)
+ * Rock 'n' Roll II (coin pusher)
+ * Royal Casino (coin pusher)
+ * Summer Time (coin pusher)
+ * Wheel of Fortune (coin pusher)
*/
#include "emu.h"
diff --git a/src/mame/drivers/cv1k.cpp b/src/mame/drivers/cv1k.cpp
index 9f995690560..0c8024d74ee 100644
--- a/src/mame/drivers/cv1k.cpp
+++ b/src/mame/drivers/cv1k.cpp
@@ -35,8 +35,8 @@ CA019B Do-Don-Pachi Dai-Fukkatsu Black Label
CA021 Akai Katana
CMDL01 Medal Mahjong Moukari Bancho
- Pirates of Gappori http://web.archive.org/web/20090907145501/http://www.cave.co.jp/gameonline/gappori/
- Oooku http://web.archive.org/web/20141104001322/http://www.cave.co.jp/gameonline/oooku/
+?????? Pirates of Gappori: http://web.archive.org/web/20090907145501/http://www.cave.co.jp/gameonline/gappori/
+?????? Uhauha Ooku: http://web.archive.org/web/20141104001322/http://www.cave.co.jp/gameonline/oooku/
Note: CA018 - Deathsmiles II: Makai no Merry Christmas on unknown custom platform
CA020 - Do-Don-Pachi Dai-ou-jou Tamashii on PGM2 platform
@@ -131,6 +131,8 @@ Misc:
Note: * The Altera EPM7032 usually stamped / labeled with the Cave game ID number as listed above.
* Actual flash ROMs will vary by manufacturer but will be compatible with flash ROM listed.
+ * There are two known CV1000-B PCB revisions. The newer one uses an updated FPGA firmware
+ and has some minor hardware differences.
* The CV1000-D revision PCB has double the RAM at U1, double the ROM at U4 and no battery.
The CV1000-D is used for Dodonpachi Daifukkatsu and later games. Commonly referred to as SH3B PCB.
@@ -182,13 +184,13 @@ Common game codes:
#include "screen.h"
#include "speaker.h"
-
+namespace {
class cv1k_state : public driver_device
{
public:
- cv1k_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ cv1k_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_blitter(*this, "blitter"),
m_serflash(*this, "game"),
@@ -199,8 +201,23 @@ public:
m_eepromout(*this, "EEPROMOUT"),
m_idleramoffs(0),
m_idlepc(0)
- { }
+ { }
+
+ void cv1k(machine_config &config);
+ void cv1k_d(machine_config &config);
+
+ void init_mushisam();
+ void init_ibara();
+ void init_espgal2();
+ void init_mushitam();
+ void init_pinkswts();
+ void init_deathsml();
+ void init_ddpdfk();
+protected:
+ virtual void machine_reset() override;
+
+private:
required_device<sh34_base_device> m_maincpu;
required_device<epic12_device> m_blitter;
required_device<serflash_device> m_serflash;
@@ -217,26 +234,15 @@ public:
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- virtual void machine_reset() override;
-
- /* game specific */
- uint64_t speedup_r();
- void init_mushisam();
- void init_ibara();
- void init_espgal2();
- void init_mushitam();
- void init_pinkswts();
- void init_deathsml();
- void init_dpddfk();
-
required_ioport m_blitrate;
required_ioport m_eepromout;
uint32_t m_idleramoffs;
uint32_t m_idlepc;
+
+ uint64_t speedup_r();
void install_speedups(uint32_t idleramoff, uint32_t idlepc, bool is_typed);
- void cv1k_d(machine_config &config);
- void cv1k(machine_config &config);
+
void cv1k_d_map(address_map &map);
void cv1k_map(address_map &map);
void cv1k_port(address_map &map);
@@ -274,8 +280,7 @@ uint8_t cv1k_state::flash_io_r(offs_t offset)
case 0x05:
case 0x06:
case 0x07:
-
- // logerror("flash_io_r offset %04x\n", offset);
+ // logerror("flash_io_r offset %04x\n", offset);
return 0xff;
case 0x00:
@@ -448,7 +453,7 @@ INPUT_PORTS_END
void cv1k_state::machine_reset()
{
- m_blitter->set_rambase (reinterpret_cast<uint16_t *>(m_ram.target()));
+ m_blitter->set_rambase(reinterpret_cast<uint16_t *>(m_ram.target()));
m_blitter->set_is_unsafe(machine().root_device().ioport(":BLITCFG")->read());
m_blitter->install_handlers( 0x18000000, 0x18000057 );
m_blitter->reset();
@@ -532,11 +537,11 @@ All roms are flash roms with no labels, so keep the
ROM_START( mushisam )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP("mushisam_u4", 0x000000, 0x200000, CRC(15321b30) SHA1(d2cd714ff2299eeab6f9a7c219dfb559c8f98b45) ) /* (2004/10/12.MASTER VER.) */
+ ROM_LOAD16_WORD_SWAP("mushisam_u4", 0x000000, 0x200000, CRC(15321b30) SHA1(d2cd714ff2299eeab6f9a7c219dfb559c8f98b45) ) // (2004/10/12.MASTER VER.)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD("mushisam_u2", 0x000000, 0x8400000, CRC(4f0a842a) SHA1(33f3550ec676a7088b6348cd72c16cc6594afb84) ) /* (2004/10/12.MASTER VER.) */
+ ROM_LOAD("mushisam_u2", 0x000000, 0x8400000, CRC(4f0a842a) SHA1(33f3550ec676a7088b6348cd72c16cc6594afb84) ) // (2004/10/12.MASTER VER.)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(138e2050) SHA1(9e86489a4e65af5efb5495adf6d4b3e01d5b2816) )
@@ -545,11 +550,11 @@ ROM_END
ROM_START( mushisama )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP("mushisama_u4", 0x000000, 0x200000, CRC(0b5b30b2) SHA1(35fd1bb1561c30b311b4325bc8f4628f2fccd20b) ) /* (2004/10/12 MASTER VER.) */
+ ROM_LOAD16_WORD_SWAP("mushisama_u4", 0x000000, 0x200000, CRC(0b5b30b2) SHA1(35fd1bb1561c30b311b4325bc8f4628f2fccd20b) ) // (2004/10/12 MASTER VER.)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD("mushisam_u2", 0x000000, 0x8400000, CRC(4f0a842a) SHA1(33f3550ec676a7088b6348cd72c16cc6594afb84) ) /* (2004/10/12.MASTER VER.) */
+ ROM_LOAD("mushisam_u2", 0x000000, 0x8400000, CRC(4f0a842a) SHA1(33f3550ec676a7088b6348cd72c16cc6594afb84) ) // (2004/10/12.MASTER VER.)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(138e2050) SHA1(9e86489a4e65af5efb5495adf6d4b3e01d5b2816) )
@@ -558,24 +563,37 @@ ROM_END
ROM_START( mushisamb )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP("mushisamb_u4", 0x000000, 0x200000, CRC(9f1c7f51) SHA1(f82ae72ec03687904ca7516887080be92365a5f3) ) /* (2004/10/12 MASTER VER) */
+ ROM_LOAD16_WORD_SWAP("mushisamb_u4", 0x000000, 0x200000, CRC(9f1c7f51) SHA1(f82ae72ec03687904ca7516887080be92365a5f3) ) // (2004/10/12 MASTER VER)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD("mushisam_u2", 0x000000, 0x8400000, CRC(4f0a842a) SHA1(33f3550ec676a7088b6348cd72c16cc6594afb84) ) /* (2004/10/12.MASTER VER.) */
+ ROM_LOAD("mushisam_u2", 0x000000, 0x8400000, CRC(4f0a842a) SHA1(33f3550ec676a7088b6348cd72c16cc6594afb84) ) // (2004/10/12.MASTER VER.)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(138e2050) SHA1(9e86489a4e65af5efb5495adf6d4b3e01d5b2816) )
ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(e3d05c9f) SHA1(130c3d62317da1729c85bd178bd51500edd73ada) )
ROM_END
-ROM_START( espgal2 )
+ROM_START( espgal2 ) // newer CV1000-B PCB revision, updated FPGA firmware, no changes in game code or data
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
+ ROM_LOAD16_WORD_SWAP( "espgal2_u4", 0x000000, 0x200000, CRC(843608b8) SHA1(2f5fcd38e76df531a923cd9956104cef5185aaa9) ) // (2005/11/14 MASTER VER)
+ ROM_RELOAD(0x200000,0x200000)
+
+ ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
+ ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(222f58c7) SHA1(d47a5085a1debd9cb8c61d88cd39e4f5036d1797) ) // (2005/11/14 MASTER VER)
+
+ ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
+ ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(b9a10c22) SHA1(4561f95c6018c9716077224bfe9660e61fb84681) )
+ ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(c76b1ec4) SHA1(b98a53d41a995d968e0432ed824b0b06d93dcea8) )
+ROM_END
+
+ROM_START( espgal2a )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x200000, CRC(09c908bb) SHA1(7d6031fd3542b3e1d296ff218feb40502fd78694) ) /* (2005/11/14 MASTER VER) */
+ ROM_LOAD16_WORD_SWAP( "espgal2a_u4", 0x000000, 0x200000, CRC(09c908bb) SHA1(7d6031fd3542b3e1d296ff218feb40502fd78694) ) // (2005/11/14 MASTER VER)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(222f58c7) SHA1(d47a5085a1debd9cb8c61d88cd39e4f5036d1797) ) /* (2005/11/14 MASTER VER) */
+ ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(222f58c7) SHA1(d47a5085a1debd9cb8c61d88cd39e4f5036d1797) ) // (2005/11/14 MASTER VER)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(b9a10c22) SHA1(4561f95c6018c9716077224bfe9660e61fb84681) )
@@ -584,11 +602,11 @@ ROM_END
ROM_START( mushitam )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP("mushitam_u4", 0x000000, 0x200000, CRC(c49eb6b1) SHA1(c40ee5de89e3f1cb49ac19687657dd2b42a88d81) ) /* (2005/09/09.MASTER VER) */
+ ROM_LOAD16_WORD_SWAP("mushitam_u4", 0x000000, 0x200000, CRC(c49eb6b1) SHA1(c40ee5de89e3f1cb49ac19687657dd2b42a88d81) ) // (2005/09/09.MASTER VER)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD("mushitam_u2", 0x000000, 0x8400000, CRC(8ba498ab) SHA1(459c0b4ab831bbe019bdd5b0ac56955948b9e3a6) ) /* (2005/09/09.MASTER VER) */
+ ROM_LOAD("mushitam_u2", 0x000000, 0x8400000, CRC(8ba498ab) SHA1(459c0b4ab831bbe019bdd5b0ac56955948b9e3a6) ) // (2005/09/09.MASTER VER)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(701a912a) SHA1(85c198946fb693d99928ea2595c84ba4d9dc8157) )
@@ -597,12 +615,12 @@ ROM_END
ROM_START( mushitama )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP("mushitama_u4", 0x000000, 0x200000, CRC(4a23e6c8) SHA1(d44c287bb88e6d413a8d35d75bc1b4928ad52cdf) ) /* (2005/09/09 MASTER VER) */
+ ROM_LOAD16_WORD_SWAP("mushitama_u4", 0x000000, 0x200000, CRC(4a23e6c8) SHA1(d44c287bb88e6d413a8d35d75bc1b4928ad52cdf) ) // (2005/09/09 MASTER VER)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
// ROM_LOAD("mushitama_u2", 0x000000, 0x8400000, CRC(3f93ff82) SHA1(6f6c250aa7134016ffb288d056bc937ea311f538) ) // recycled ROM - only unused areas differ
- ROM_LOAD("mushitam_u2", 0x000000, 0x8400000, CRC(8ba498ab) SHA1(459c0b4ab831bbe019bdd5b0ac56955948b9e3a6) ) /* (2005/09/09.MASTER VER) */
+ ROM_LOAD("mushitam_u2", 0x000000, 0x8400000, CRC(8ba498ab) SHA1(459c0b4ab831bbe019bdd5b0ac56955948b9e3a6) ) // (2005/09/09.MASTER VER)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(701a912a) SHA1(85c198946fb693d99928ea2595c84ba4d9dc8157) )
@@ -611,11 +629,11 @@ ROM_END
ROM_START( futari15 )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP("futari15_u4", 0x000000, 0x200000, CRC(e8c5f128) SHA1(45fb8066fdbecb83fdc2e14555c460d0c652cd5f) ) /* (2006/12/8.MAST VER. 1.54.) */
+ ROM_LOAD16_WORD_SWAP("futari15_u4", 0x000000, 0x200000, CRC(e8c5f128) SHA1(45fb8066fdbecb83fdc2e14555c460d0c652cd5f) ) // (2006/12/8.MAST VER. 1.54.)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD("futari15_u2", 0x000000, 0x8400000, CRC(b9eae1fc) SHA1(410f8e7cfcbfd271b41fb4f8d049a13a3191a1f9) ) /* (2006/12/8.MAST VER. 1.54.) */
+ ROM_LOAD("futari15_u2", 0x000000, 0x8400000, CRC(b9eae1fc) SHA1(410f8e7cfcbfd271b41fb4f8d049a13a3191a1f9) ) // (2006/12/8.MAST VER. 1.54.)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(39f1e1f4) SHA1(53d12f59a56df35c705408c76e6e02118da656f1) )
@@ -624,12 +642,12 @@ ROM_END
ROM_START( futari15a )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP("futari15a_u4", 0x000000, 0x200000, CRC(a609cf89) SHA1(56752fae9f42fa852af8ee2eae79e25ec7f17953) ) /* (2006/12/8 MAST VER 1.54) */
+ ROM_LOAD16_WORD_SWAP("futari15a_u4", 0x000000, 0x200000, CRC(a609cf89) SHA1(56752fae9f42fa852af8ee2eae79e25ec7f17953) ) // (2006/12/8 MAST VER 1.54)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
// ROM_LOAD("futari15a_u2", 0x000000, 0x8400000, CRC(b9d815f9) SHA1(6b6f668b0bbb087ffac65e4f0d8bd9d5b28eeb28) ) // recycled ROM - only unused areas differ
- ROM_LOAD("futari15_u2", 0x000000, 0x8400000, CRC(b9eae1fc) SHA1(410f8e7cfcbfd271b41fb4f8d049a13a3191a1f9) ) /* (2006/12/8.MAST VER. 1.54.) */
+ ROM_LOAD("futari15_u2", 0x000000, 0x8400000, CRC(b9eae1fc) SHA1(410f8e7cfcbfd271b41fb4f8d049a13a3191a1f9) ) // (2006/12/8.MAST VER. 1.54.)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(39f1e1f4) SHA1(53d12f59a56df35c705408c76e6e02118da656f1) )
@@ -638,20 +656,20 @@ ROM_END
ROM_START( futari10 )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "futari10_u4", 0x000000, 0x200000, CRC(b127dca7) SHA1(e1f518bc72fc1cdf69aefa89eafa4edaf4e84778) ) /* (2006/10/23 MASTER VER.) */
+ ROM_LOAD16_WORD_SWAP( "futari10_u4", 0x000000, 0x200000, CRC(b127dca7) SHA1(e1f518bc72fc1cdf69aefa89eafa4edaf4e84778) ) // (2006/10/23 MASTER VER.)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD( "futari10_u2", 0x000000, 0x8400000, CRC(78ffcd0c) SHA1(0e2937edec15ce3f5741b72ebd3bbaaefffb556e) ) /* (2006/10/23 MASTER VER.) */
+ ROM_LOAD( "futari10_u2", 0x000000, 0x8400000, CRC(78ffcd0c) SHA1(0e2937edec15ce3f5741b72ebd3bbaaefffb556e) ) // (2006/10/23 MASTER VER.)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(39f1e1f4) SHA1(53d12f59a56df35c705408c76e6e02118da656f1) )
ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(c631a766) SHA1(8bb6934a2f5b8a9841c3dcf85192b1743773dd8b) )
ROM_END
-ROM_START( futaribl ) /* Title screen shows (c) 2007 despite the 2009 "master" date - Also prints "Another Ver" to the title screen - reworked & re-released for the Chinese market */
+ROM_START( futaribl ) // Title screen shows (c) 2007 despite the 2009 "master" date - Also prints "Another Ver" to the title screen - reworked & re-released for the Chinese market
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "futaribli_u4", 0x000000, 0x200000, CRC(1971dd16) SHA1(e75993f2978cbaaf925b4b8bb33d094a5a7cebf0) ) /* (2009/11/27 INTERNATIONAL BL) */
+ ROM_LOAD16_WORD_SWAP( "futaribli_u4", 0x000000, 0x200000, CRC(1971dd16) SHA1(e75993f2978cbaaf925b4b8bb33d094a5a7cebf0) ) // (2009/11/27 INTERNATIONAL BL)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
@@ -664,11 +682,11 @@ ROM_END
ROM_START( futariblj )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "futariblk_u4", 0x000000, 0x200000, CRC(b9467b6d) SHA1(64782807fe69acb4ae028e36c5c689d8bd9b7857) ) /* (2007/12/11 BLACK LABEL VER) */
+ ROM_LOAD16_WORD_SWAP( "futariblk_u4", 0x000000, 0x200000, CRC(b9467b6d) SHA1(64782807fe69acb4ae028e36c5c689d8bd9b7857) ) // (2007/12/11 BLACK LABEL VER)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD( "futariblk_u2", 0x000000, 0x8400000, CRC(08c6fd62) SHA1(e1fc386b2b0e41906c724287cbf82304297e0150) ) /* (2007/12/11 BLACK LABEL VER) */
+ ROM_LOAD( "futariblk_u2", 0x000000, 0x8400000, CRC(08c6fd62) SHA1(e1fc386b2b0e41906c724287cbf82304297e0150) ) // (2007/12/11 BLACK LABEL VER)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(39f1e1f4) SHA1(53d12f59a56df35c705408c76e6e02118da656f1) )
@@ -677,50 +695,50 @@ ROM_END
ROM_START( ibara )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x200000, CRC(8e6c155d) SHA1(38ac2107dc7824836e2b4e04c7180d5ae43c9b79) ) /* (2005/03/22 MASTER VER..) */
+ ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x200000, CRC(8e6c155d) SHA1(38ac2107dc7824836e2b4e04c7180d5ae43c9b79) ) // (2005/03/22 MASTER VER..)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(55840976) SHA1(4982bdce84f9603adfed7a618f18bc80359ab81e) ) /* (2005/03/22 MASTER VER..) */
+ ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(55840976) SHA1(4982bdce84f9603adfed7a618f18bc80359ab81e) ) // (2005/03/22 MASTER VER..)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(ee5e585d) SHA1(7eeba4ee693060e927f8c46b16e39227c6a62392) )
ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(f0aa3cb6) SHA1(f9d137cd879e718811b2d21a0af2a9c6b7dca2f9) )
ROM_END
-ROM_START( ibarablk ) /* Title screen shows (c) 2005 despite the 2006 "master" date */
+ROM_START( ibarablk ) // Title screen shows (c) 2005 despite the 2006 "master" date
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "ibarablk_u4", 0x000000, 0x200000, CRC(ee1f1f77) SHA1(ac276f3955aa4dde2544af4912819a7ae6bcf8dd) ) /* (2006/02/06. MASTER VER.) */
+ ROM_LOAD16_WORD_SWAP( "ibarablk_u4", 0x000000, 0x200000, CRC(ee1f1f77) SHA1(ac276f3955aa4dde2544af4912819a7ae6bcf8dd) ) // (2006/02/06. MASTER VER.)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD( "ibarablk_u2", 0x000000, 0x8400000, CRC(5e46be44) SHA1(bed5f1bf452f2cac58747ecabec3c4392566a3a7) ) /* (2006/02/06. MASTER VER.) */
+ ROM_LOAD( "ibarablk_u2", 0x000000, 0x8400000, CRC(5e46be44) SHA1(bed5f1bf452f2cac58747ecabec3c4392566a3a7) ) // (2006/02/06. MASTER VER.)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(a436bb22) SHA1(0556e771cc02638bf8814315ba671c2d442594f1) ) /* (2006/02/06 MASTER VER.) */
- ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(d11ab6b6) SHA1(2132191cbe847e2560423e4545c969f21f8ff825) ) /* (2006/02/06 MASTER VER.) */
+ ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(a436bb22) SHA1(0556e771cc02638bf8814315ba671c2d442594f1) ) // (2006/02/06 MASTER VER.)
+ ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(d11ab6b6) SHA1(2132191cbe847e2560423e4545c969f21f8ff825) ) // (2006/02/06 MASTER VER.)
ROM_END
-ROM_START( ibarablka ) /* Title screen shows (c) 2005 despite the 2006 "master" date */
+ROM_START( ibarablka ) // Title screen shows (c) 2005 despite the 2006 "master" date
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "ibarablka_u4", 0x000000, 0x200000, CRC(a9d43839) SHA1(507696e616608c05893c7ac2814b3365e9cb0720) ) /* (2006/02/06 MASTER VER.) */
+ ROM_LOAD16_WORD_SWAP( "ibarablka_u4", 0x000000, 0x200000, CRC(a9d43839) SHA1(507696e616608c05893c7ac2814b3365e9cb0720) ) // (2006/02/06 MASTER VER.)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD( "ibarablka_u2", 0x000000, 0x8400000, CRC(33400d96) SHA1(09c22b5431ac3726bf88c56efd970f56793f825a) ) /* (2006/02/06 MASTER VER.) */
+ ROM_LOAD( "ibarablka_u2", 0x000000, 0x8400000, CRC(33400d96) SHA1(09c22b5431ac3726bf88c56efd970f56793f825a) ) // (2006/02/06 MASTER VER.)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(a436bb22) SHA1(0556e771cc02638bf8814315ba671c2d442594f1) ) /* (2006/02/06 MASTER VER.) */
- ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(d11ab6b6) SHA1(2132191cbe847e2560423e4545c969f21f8ff825) ) /* (2006/02/06 MASTER VER.) */
+ ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(a436bb22) SHA1(0556e771cc02638bf8814315ba671c2d442594f1) ) // (2006/02/06 MASTER VER.)
+ ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(d11ab6b6) SHA1(2132191cbe847e2560423e4545c969f21f8ff825) ) // (2006/02/06 MASTER VER.)
ROM_END
ROM_START( deathsml )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x200000, CRC(1a7b98bf) SHA1(07798a4a846e5802756396b34df47d106895c1f1) ) /* (2007/10/09 MASTER VER) */
+ ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x200000, CRC(1a7b98bf) SHA1(07798a4a846e5802756396b34df47d106895c1f1) ) // (2007/10/09 MASTER VER)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(59ef5d78) SHA1(426e506b6d88948aa55aec71c0db6e91da3d490d) ) /* (2007/10/09 MASTER VER) */
+ ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(59ef5d78) SHA1(426e506b6d88948aa55aec71c0db6e91da3d490d) ) // (2007/10/09 MASTER VER)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(aab718c8) SHA1(0e636c46d06151abd6f73232bc479dafcafe5327) )
@@ -729,11 +747,11 @@ ROM_END
ROM_START( mmpork )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x200000, CRC(d06cfa42) SHA1(5707feb4b3e5265daf5926f38c38612b24106f1f) ) /* (2007/ 4/17 MASTER VER.) */
+ ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x200000, CRC(d06cfa42) SHA1(5707feb4b3e5265daf5926f38c38612b24106f1f) ) // (2007/ 4/17 MASTER VER.)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(1ee961b8) SHA1(81a2eba704ac1cf7fc44fa7c6a3f50e3570c104f) ) /* (2007/ 4/17 MASTER VER.) */
+ ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(1ee961b8) SHA1(81a2eba704ac1cf7fc44fa7c6a3f50e3570c104f) ) // (2007/ 4/17 MASTER VER.)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4a4b36df) SHA1(5db5ce6fa47e5ca3263d4bd19315890c6d29df66) )
@@ -742,11 +760,11 @@ ROM_END
ROM_START( mmmbanc )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "u4", 0x0000, 0x200000, CRC(5589d8c6) SHA1(43fbdb0effe2bc0e7135698757b6ee50200aecde) ) /* (2007/06/05 MASTER VER.) */
+ ROM_LOAD16_WORD_SWAP( "u4", 0x0000, 0x200000, CRC(5589d8c6) SHA1(43fbdb0effe2bc0e7135698757b6ee50200aecde) ) // (2007/06/05 MASTER VER.)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(2e38965a) SHA1(2b58d1cd1a3dbc261d4a46805d2ea015fe22c444) ) /* (2007/06/05 MASTER VER.) */
+ ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(2e38965a) SHA1(2b58d1cd1a3dbc261d4a46805d2ea015fe22c444) ) // (2007/06/05 MASTER VER.)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4caaa1bf) SHA1(9b92c13eac05601da4d9bb3eb727c156974e9f0c) )
@@ -755,11 +773,11 @@ ROM_END
ROM_START( pinkswts )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "pinkswts_u4", 0x0000, 0x200000, CRC(5d812c9e) SHA1(db821ec3892fd150513749d64a8b60bf147f3275) ) /* (2006/04/06 MASTER VER....) */
+ ROM_LOAD16_WORD_SWAP( "pinkswts_u4", 0x0000, 0x200000, CRC(5d812c9e) SHA1(db821ec3892fd150513749d64a8b60bf147f3275) ) // (2006/04/06 MASTER VER....)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD( "pinkswts_u2", 0x000000, 0x8400000, CRC(a2fa5363) SHA1(5be327534840871592df523ac82ee1927bd79d67) ) /* (2006/04/06 MASTER VER....) */
+ ROM_LOAD( "pinkswts_u2", 0x000000, 0x8400000, CRC(a2fa5363) SHA1(5be327534840871592df523ac82ee1927bd79d67) ) // (2006/04/06 MASTER VER....)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4b82d250) SHA1(ee98dbc3f791efb6d58f3945bcb2044667ae7978) )
@@ -768,11 +786,11 @@ ROM_END
ROM_START( pinkswtsa )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "pnkswtsa_u4", 0x0000, 0x200000, CRC(ee3339b2) SHA1(995988d370731a7074b49ce8752525dadf06a954) ) /* (2006/04/06 MASTER VER...) */
+ ROM_LOAD16_WORD_SWAP( "pnkswtsa_u4", 0x0000, 0x200000, CRC(ee3339b2) SHA1(995988d370731a7074b49ce8752525dadf06a954) ) // (2006/04/06 MASTER VER...)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD( "pnkswtsa_u2", 0x000000, 0x8400000, CRC(829a862e) SHA1(8c0ee2a0eb33b68869252fd68aed74820a904287) ) /* (2006/04/06 MASTER VER...) */
+ ROM_LOAD( "pnkswtsa_u2", 0x000000, 0x8400000, CRC(829a862e) SHA1(8c0ee2a0eb33b68869252fd68aed74820a904287) ) // (2006/04/06 MASTER VER...)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4b82d250) SHA1(ee98dbc3f791efb6d58f3945bcb2044667ae7978) )
@@ -781,11 +799,11 @@ ROM_END
ROM_START( pinkswtsb )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "pnkswtsb_u4", 0x0000, 0x200000, CRC(68bcc009) SHA1(2fef544b93c61161a37365f868b431d8262e4b21) ) /* (2006/04/06 MASTER VER.) */
+ ROM_LOAD16_WORD_SWAP( "pnkswtsb_u4", 0x0000, 0x200000, CRC(68bcc009) SHA1(2fef544b93c61161a37365f868b431d8262e4b21) ) // (2006/04/06 MASTER VER.)
ROM_RELOAD(0x200000,0x200000)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
-// ROM_LOAD( "pnkswtsb_u2", 0x000000, 0x8400000, BAD_DUMP CRC(a5666ed9) SHA1(682e06c84990225bc6bb0c9f38b5f46c4e36b430) ) /* (2006/04/06 MASTER VER.) */
+// ROM_LOAD( "pnkswtsb_u2", 0x000000, 0x8400000, BAD_DUMP CRC(a5666ed9) SHA1(682e06c84990225bc6bb0c9f38b5f46c4e36b430) ) // (2006/04/06 MASTER VER.)
ROM_LOAD( "pnkswtsx_u2", 0x000000, 0x8400000, CRC(91e4deb2) SHA1(893cb10d6f805df7cb4a1bb709a3ea6de147b7e9) ) // (2006/xx/xx MASTER VER.) and (2006/04/06 MASTER VER.)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
@@ -822,10 +840,10 @@ ROM_END
ROM_START( ddpdfk )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "ddpdfk_u4", 0x0000, 0x400000, CRC(9976d699) SHA1(9dfe9d1daf6f638cafce8cdc5230209e2bcb7522) ) /* (2008/06/23 MASTER VER 1.5) */
+ ROM_LOAD16_WORD_SWAP( "ddpdfk_u4", 0x0000, 0x400000, CRC(9976d699) SHA1(9dfe9d1daf6f638cafce8cdc5230209e2bcb7522) ) // (2008/06/23 MASTER VER 1.5)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD( "ddpdfk_u2", 0x000000, 0x8400000, CRC(84a51a4f) SHA1(291a6279c0746d2eb8630e7d6d886043f0cfdd94) ) /* (2008/06/23 MASTER VER 1.5) */
+ ROM_LOAD( "ddpdfk_u2", 0x000000, 0x8400000, CRC(84a51a4f) SHA1(291a6279c0746d2eb8630e7d6d886043f0cfdd94) ) // (2008/06/23 MASTER VER 1.5)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(27032cde) SHA1(5b58d0140d72b91db4e763ca4af93060d36ac74d) )
@@ -834,10 +852,10 @@ ROM_END
ROM_START( ddpdfk10 )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "ddpdfk10_u4", 0x0000, 0x400000, CRC(a3d650b2) SHA1(46a7551760e18c2cecd372c3f4be16f6600efc2c) ) /* (2008/05/16 MASTER VER) */
+ ROM_LOAD16_WORD_SWAP( "ddpdfk10_u4", 0x0000, 0x400000, CRC(a3d650b2) SHA1(46a7551760e18c2cecd372c3f4be16f6600efc2c) ) // (2008/05/16 MASTER VER)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD( "ddpdfk10_u2", 0x000000, 0x8400000, CRC(d349cb2a) SHA1(c364c36b69b93f8f62390f185d044f51056669ff) ) /* (2008/05/16 MASTER VER) */
+ ROM_LOAD( "ddpdfk10_u2", 0x000000, 0x8400000, CRC(d349cb2a) SHA1(c364c36b69b93f8f62390f185d044f51056669ff) ) // (2008/05/16 MASTER VER)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(27032cde) SHA1(5b58d0140d72b91db4e763ca4af93060d36ac74d) )
@@ -846,10 +864,10 @@ ROM_END
ROM_START( dsmbl )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x400000, CRC(77fc5ad1) SHA1(afe044fc16e9494143c876879b033caccd08cf22) ) /* (2008/10/06 MEGABLACK LABEL VER) */
+ ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x400000, CRC(77fc5ad1) SHA1(afe044fc16e9494143c876879b033caccd08cf22) ) // (2008/10/06 MEGABLACK LABEL VER)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
- ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(d6b85b7a) SHA1(4674f6ad07f6a03904ca3d05060816b8fe061add) ) /* (2008/10/06 MEGABLACK LABEL VER) */
+ ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(d6b85b7a) SHA1(4674f6ad07f6a03904ca3d05060816b8fe061add) ) // (2008/10/06 MEGABLACK LABEL VER)
ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF)
ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(a9536a6a) SHA1(4b9dcaf6803b1fcfdf73ae9daabc4508fec71631) )
@@ -858,7 +876,7 @@ ROM_END
ROM_START( dfkbl )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x400000, CRC(8092ca9d) SHA1(75e16cd7c8d0f9c715115ce12da5c245fbcd2416) ) /* (2010/1/18 BLACK LABEL) */
+ ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x400000, CRC(8092ca9d) SHA1(75e16cd7c8d0f9c715115ce12da5c245fbcd2416) ) // (2010/1/18 BLACK LABEL)
ROM_REGION( 0x8400000, "game", ROMREGION_ERASEFF)
ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(29f9d73a) SHA1(ed978ab5e3ad8c05e7778a91bfb5aaa17b0f72d9) )
@@ -900,10 +918,10 @@ void cv1k_state::install_speedups(uint32_t idleramoff, uint32_t idlepc, bool is_
m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000000+m_idleramoffs, 0xc000000+m_idleramoffs+7, read64smo_delegate(*this, FUNC(cv1k_state::speedup_r)));
- m_maincpu->sh2drc_add_fastram(0x00000000, 0x003fffff, true, m_rombase);
+ m_maincpu->sh2drc_add_fastram(0x00000000, 0x003fffff, true, m_rombase);
- m_maincpu->sh2drc_add_fastram(0x0c000000, 0x0c000000+m_idleramoffs-1, false, m_ram);
- m_maincpu->sh2drc_add_fastram(0x0c000000+m_idleramoffs+8, is_typed ? 0x0cffffff : 0x0c7fffff, false, m_ram + ((m_idleramoffs+8)/8));
+ m_maincpu->sh2drc_add_fastram(0x0c000000, 0x0c000000+m_idleramoffs-1, false, m_ram);
+ m_maincpu->sh2drc_add_fastram(0x0c000000+m_idleramoffs+8, is_typed ? 0x0cffffff : 0x0c7fffff, false, m_ram + ((m_idleramoffs+8)/8));
}
@@ -937,68 +955,71 @@ void cv1k_state::init_deathsml()
install_speedups(0x02310, 0xc0519a2, false);
}
-void cv1k_state::init_dpddfk()
+void cv1k_state::init_ddpdfk()
{
install_speedups(0x02310, 0xc1d1346, true);
}
-#define GAME_FLAGS (MACHINE_IMPERFECT_TIMING)
+
+} // anonymous namespace
+
// The black label versions are intentionally not set as clones, they were re-releases with different game codes, not bugfixes.
// CA011 Mushihime-Sama
-GAME( 2004, mushisam, 0, cv1k, cv1k, cv1k_state, init_mushisam, ROT270, "Cave (AMI license)", "Mushihime-Sama (2004/10/12.MASTER VER.)", GAME_FLAGS )
-GAME( 2004, mushisama, mushisam, cv1k, cv1k, cv1k_state, init_ibara, ROT270, "Cave (AMI license)", "Mushihime-Sama (2004/10/12 MASTER VER.)", GAME_FLAGS )
-GAME( 2004, mushisamb, mushisam, cv1k, cv1k, cv1k_state, init_mushisam, ROT270, "Cave (AMI license)", "Mushihime-Sama (2004/10/12 MASTER VER)", GAME_FLAGS )
+GAME( 2004, mushisam, 0, cv1k, cv1k, cv1k_state, init_mushisam, ROT270, "Cave (AMI license)", "Mushihime-Sama (2004/10/12.MASTER VER.)", MACHINE_IMPERFECT_TIMING )
+GAME( 2004, mushisama, mushisam, cv1k, cv1k, cv1k_state, init_ibara, ROT270, "Cave (AMI license)", "Mushihime-Sama (2004/10/12 MASTER VER.)", MACHINE_IMPERFECT_TIMING )
+GAME( 2004, mushisamb, mushisam, cv1k, cv1k, cv1k_state, init_mushisam, ROT270, "Cave (AMI license)", "Mushihime-Sama (2004/10/12 MASTER VER)", MACHINE_IMPERFECT_TIMING )
// CA012 Ibara
-GAME( 2005, ibara, 0, cv1k, cv1ks,cv1k_state, init_ibara, ROT270, "Cave (AMI license)", "Ibara (2005/03/22 MASTER VER..)", GAME_FLAGS )
+GAME( 2005, ibara, 0, cv1k, cv1ks,cv1k_state, init_ibara, ROT270, "Cave (AMI license)", "Ibara (2005/03/22 MASTER VER..)", MACHINE_IMPERFECT_TIMING )
// CA012B Ibara Kuro Black Label
-GAME( 2006, ibarablk, 0, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Ibara Kuro Black Label (2006/02/06. MASTER VER.)", GAME_FLAGS )
-GAME( 2006, ibarablka, ibarablk, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Ibara Kuro Black Label (2006/02/06 MASTER VER.)", GAME_FLAGS )
+GAME( 2006, ibarablk, 0, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Ibara Kuro Black Label (2006/02/06. MASTER VER.)", MACHINE_IMPERFECT_TIMING )
+GAME( 2006, ibarablka, ibarablk, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Ibara Kuro Black Label (2006/02/06 MASTER VER.)", MACHINE_IMPERFECT_TIMING )
// CA013 Espgaluda II
-GAME( 2005, espgal2, 0, cv1k, cv1k, cv1k_state, init_espgal2, ROT270, "Cave (AMI license)", "Espgaluda II (2005/11/14 MASTER VER)", GAME_FLAGS )
+GAME( 2005, espgal2, 0, cv1k, cv1k, cv1k_state, init_espgal2, ROT270, "Cave (AMI license)", "Espgaluda II (2005/11/14 MASTER VER, newer CV1000-B PCB)", MACHINE_IMPERFECT_TIMING )
+GAME( 2005, espgal2a, espgal2, cv1k, cv1k, cv1k_state, init_espgal2, ROT270, "Cave (AMI license)", "Espgaluda II (2005/11/14 MASTER VER, original CV1000-B PCB)", MACHINE_IMPERFECT_TIMING )
// CA??? Puzzle! Mushihime-Tama
-GAME( 2005, mushitam, 0, cv1k, cv1k, cv1k_state, init_mushitam, ROT0, "Cave (AMI license)", "Puzzle! Mushihime-Tama (2005/09/09.MASTER VER)", GAME_FLAGS )
-GAME( 2005, mushitama, mushitam, cv1k, cv1k, cv1k_state, init_mushitam, ROT0, "Cave (AMI license)", "Puzzle! Mushihime-Tama (2005/09/09 MASTER VER)", GAME_FLAGS )
+GAME( 2005, mushitam, 0, cv1k, cv1k, cv1k_state, init_mushitam, ROT0, "Cave (AMI license)", "Puzzle! Mushihime-Tama (2005/09/09.MASTER VER)", MACHINE_IMPERFECT_TIMING )
+GAME( 2005, mushitama, mushitam, cv1k, cv1k, cv1k_state, init_mushitam, ROT0, "Cave (AMI license)", "Puzzle! Mushihime-Tama (2005/09/09 MASTER VER)", MACHINE_IMPERFECT_TIMING )
// CA014 Pink Sweets: Ibara Sorekara
-GAME( 2006, pinkswts, 0, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/04/06 MASTER VER....)", GAME_FLAGS )
-GAME( 2006, pinkswtsa, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/04/06 MASTER VER...)", GAME_FLAGS )
-GAME( 2006, pinkswtsb, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/04/06 MASTER VER.)", GAME_FLAGS )
-GAME( 2006, pinkswtsx, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/xx/xx MASTER VER.)", GAME_FLAGS ) // defaults to freeplay, possibly bootlegged from show/dev version?
-GAME( 2006, pinkswtssc, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "bootleg", "Pink Sweets: Suicide Club (2017/10/31 SUICIDECLUB VER., bootleg)",GAME_FLAGS )
+GAME( 2006, pinkswts, 0, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/04/06 MASTER VER....)", MACHINE_IMPERFECT_TIMING )
+GAME( 2006, pinkswtsa, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/04/06 MASTER VER...)", MACHINE_IMPERFECT_TIMING )
+GAME( 2006, pinkswtsb, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/04/06 MASTER VER.)", MACHINE_IMPERFECT_TIMING )
+GAME( 2006, pinkswtsx, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/xx/xx MASTER VER.)", MACHINE_IMPERFECT_TIMING ) // defaults to freeplay, possibly bootlegged from show/dev version?
+GAME( 2006, pinkswtssc, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "bootleg", "Pink Sweets: Suicide Club (2017/10/31 SUICIDECLUB VER., bootleg)",MACHINE_IMPERFECT_TIMING )
// CA015 Mushihime-Sama Futari
-GAME( 2006, futari15, 0, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Ver 1.5 (2006/12/8.MASTER VER. 1.54.)", GAME_FLAGS )
-GAME( 2006, futari15a, futari15, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Ver 1.5 (2006/12/8 MASTER VER 1.54)", GAME_FLAGS )
-GAME( 2006, futari10, futari15, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Ver 1.0 (2006/10/23 MASTER VER.)", GAME_FLAGS )
+GAME( 2006, futari15, 0, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Ver 1.5 (2006/12/8.MASTER VER. 1.54.)", MACHINE_IMPERFECT_TIMING )
+GAME( 2006, futari15a, futari15, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Ver 1.5 (2006/12/8 MASTER VER 1.54)", MACHINE_IMPERFECT_TIMING )
+GAME( 2006, futari10, futari15, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Ver 1.0 (2006/10/23 MASTER VER.)", MACHINE_IMPERFECT_TIMING )
// CA015B Mushihime-Sama Futari Black Label
-GAME( 2007, futaribl, 0, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Black Label - Another Ver (2009/11/27 INTERNATIONAL BL)", GAME_FLAGS ) // re-released for Chinese market
-GAME( 2007, futariblj, futaribl, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Black Label (2007/12/11 BLACK LABEL VER)", GAME_FLAGS )
+GAME( 2007, futaribl, 0, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Black Label - Another Ver (2009/11/27 INTERNATIONAL BL)", MACHINE_IMPERFECT_TIMING ) // re-released for Chinese market
+GAME( 2007, futariblj, futaribl, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Black Label (2007/12/11 BLACK LABEL VER)", MACHINE_IMPERFECT_TIMING )
// CA016 Muchi Muchi Pork!
-GAME( 2007, mmpork, 0, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Muchi Muchi Pork! (2007/ 4/17 MASTER VER.)", GAME_FLAGS )
+GAME( 2007, mmpork, 0, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Muchi Muchi Pork! (2007/ 4/17 MASTER VER.)", MACHINE_IMPERFECT_TIMING )
// CA017 Deathsmiles
-GAME( 2007, deathsml, 0, cv1k, cv1k, cv1k_state, init_deathsml, ROT0, "Cave (AMI license)", "Deathsmiles (2007/10/09 MASTER VER)", GAME_FLAGS )
+GAME( 2007, deathsml, 0, cv1k, cv1k, cv1k_state, init_deathsml, ROT0, "Cave (AMI license)", "Deathsmiles (2007/10/09 MASTER VER)", MACHINE_IMPERFECT_TIMING )
// CA017B Deathsmiles Black Label
-GAME( 2008, dsmbl, 0, cv1k_d, cv1k, cv1k_state, init_dpddfk, ROT0, "Cave (AMI license)", "Deathsmiles MegaBlack Label (2008/10/06 MEGABLACK LABEL VER)", GAME_FLAGS )
+GAME( 2008, dsmbl, 0, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT0, "Cave (AMI license)", "Deathsmiles MegaBlack Label (2008/10/06 MEGABLACK LABEL VER)", MACHINE_IMPERFECT_TIMING )
// CA019 Do-Don-Pachi Dai-Fukkatsu
-GAME( 2008, ddpdfk, 0, cv1k_d, cv1k, cv1k_state, init_dpddfk, ROT270, "Cave (AMI license)", "DoDonPachi Dai-Fukkatsu Ver 1.5 (2008/06/23 MASTER VER 1.5)", GAME_FLAGS )
-GAME( 2008, ddpdfk10, ddpdfk, cv1k_d, cv1k, cv1k_state, init_dpddfk, ROT270, "Cave (AMI license)", "DoDonPachi Dai-Fukkatsu Ver 1.0 (2008/05/16 MASTER VER)", GAME_FLAGS )
+GAME( 2008, ddpdfk, 0, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT270, "Cave (AMI license)", "DoDonPachi Dai-Fukkatsu Ver 1.5 (2008/06/23 MASTER VER 1.5)", MACHINE_IMPERFECT_TIMING )
+GAME( 2008, ddpdfk10, ddpdfk, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT270, "Cave (AMI license)", "DoDonPachi Dai-Fukkatsu Ver 1.0 (2008/05/16 MASTER VER)", MACHINE_IMPERFECT_TIMING )
// CA019B Do-Don-Pachi Dai-Fukkatsu Black Label
-GAME( 2010, dfkbl, 0, cv1k_d, cv1k, cv1k_state, init_dpddfk, ROT270, "Cave (AMI license)", "DoDonPachi Dai-Fukkatsu Black Label (2010/1/18 BLACK LABEL)", GAME_FLAGS )
+GAME( 2010, dfkbl, 0, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT270, "Cave", "DoDonPachi Dai-Fukkatsu Black Label (2010/1/18 BLACK LABEL)", MACHINE_IMPERFECT_TIMING )
// CA021 Akai Katana
-GAME( 2010, akatana, 0, cv1k_d, cv1k, cv1k_state, init_dpddfk, ROT0, "Cave (AMI license)", "Akai Katana (2010/ 8/13 MASTER VER.)", GAME_FLAGS )
+GAME( 2010, akatana, 0, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT0, "Cave", "Akai Katana (2010/ 8/13 MASTER VER.)", MACHINE_IMPERFECT_TIMING )
// CMDL01 Medal Mahjong Moukari Bancho
GAME( 2007, mmmbanc, 0, cv1k, cv1k, cv1k_state, init_pinkswts, ROT0, "Cave (AMI license)", "Medal Mahjong Moukari Bancho (2007/06/05 MASTER VER.)", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/cvicny.cpp b/src/mame/drivers/cvicny.cpp
index b73d9852482..dc2752e7f16 100644
--- a/src/mame/drivers/cvicny.cpp
+++ b/src/mame/drivers/cvicny.cpp
@@ -34,6 +34,9 @@ Test Paste:
#include "video/pwm.h"
#include "cvicny.lh"
+
+namespace {
+
class cvicny_state : public driver_device
{
public:
@@ -42,16 +45,19 @@ public:
, m_maincpu(*this, "maincpu")
, m_display(*this, "display")
, m_io_keyboard(*this, "X%u", 0U)
- { }
+ { }
void cvicny(machine_config &config);
+protected:
+ virtual void machine_start() override;
+
private:
void cvicny_mem(address_map &map);
- virtual void machine_start() override;
u8 key_r();
void digit_w(u8 data);
void segment_w(u8 data);
+
u8 m_digit;
u8 m_seg;
required_device<cpu_device> m_maincpu;
@@ -155,6 +161,9 @@ ROM_START( cvicny )
ROM_LOAD("cvicny8080.bin", 0x0000, 0x05ea, CRC(e6119052) SHA1(d03c2cbfd047f0d090a787fbbde6353593cc2dd8) )
ROM_END
+} // anonymous namespace
+
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/cvs.cpp b/src/mame/drivers/cvs.cpp
index efb40926e63..2b73edd8905 100644
--- a/src/mame/drivers/cvs.cpp
+++ b/src/mame/drivers/cvs.cpp
@@ -1010,13 +1010,13 @@ void cvs_state::cvs(machine_config &config)
GENERIC_LATCH_8(config, m_soundlatch);
- DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
- DAC_4BIT_R2R(config, m_dac2, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
- DAC_1BIT(config, m_dac3, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ DAC_4BIT_R2R(config, m_dac2, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ DAC_1BIT(config, m_dac3, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
TMS5100(config, m_tms5110, XTAL(640'000));
m_tms5110->data().set(FUNC(cvs_state::speech_rom_read_bit));
- m_tms5110->add_route(ALL_OUTPUTS, "speaker", 1.0);
+ m_tms5110->add_route(ALL_OUTPUTS, "speaker", 0.5);
}
diff --git a/src/mame/drivers/cybstorm.cpp b/src/mame/drivers/cybstorm.cpp
index ecbf9a22c63..216fbad30b6 100644
--- a/src/mame/drivers/cybstorm.cpp
+++ b/src/mame/drivers/cybstorm.cpp
@@ -12,6 +12,9 @@
Known bugs:
* STAIN effect not 100% correct
+ Possible bugs:
+ * Tilemap offsets shifted by 1 pixel?
+
***************************************************************************/
@@ -120,40 +123,56 @@ void cybstorm_state::vadbank_map(address_map &map)
static INPUT_PORTS_START( cybstorm )
PORT_START("9F0000")
- PORT_BIT( 0x0000000f, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
- PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
- PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
- PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2)
+ // are these 8 inputs old debugging inputs no longer used by the game, only tested in test mode?
+ PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNUSED ) // White D0 in test mode
+ PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_UNUSED ) // Red D1 in test mode
+ PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNUSED ) // Freeze D2 in test mode
+ PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_UNUSED ) // Step D3 in test mode
+ PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) // Right
+ PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_UNUSED ) // Left
+ PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_UNUSED ) // Down
+ PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_UNUSED ) // Up
PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_START2 )
- PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2)
- PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2)
- PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Jab Punch")
+ PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Strong Punch")
+ PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Fierce Punch")
PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
- PORT_BIT( 0x000f0000, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
- PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
- PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
- PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1)
+ PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_UNUSED ) // Blue Button in test mode
+ PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Quick Kick")
+ PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Strong Kick")
+ PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("P2 Fierce Kick")
+ PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("P1 Quick Kick")
+ PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("P1 Strong Kick")
+ PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("P1 Fierce Kick")
+ PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_UNUSED ) // Green Button in test mode
PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_START1 )
- PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1)
- PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1)
- PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_PLAYER(1)
+ PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Jab Punch")
+ PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Strong Punch")
+ PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Fierce Punch")
PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
PORT_START("9F0010")
- PORT_BIT( 0x0000ffff, IP_ACTIVE_LOW, IPT_UNUSED )
+ // are these old debug Coin / Service inputs? (coins are read through sound board instead?) still tested in test mode
+ PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNUSED ) // LCOIN
+ PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_UNUSED ) // CLCOIN
+ PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNUSED ) // CRCOIN
+ PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_UNUSED ) // RCOIN
+ PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) // Service
+ PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_UNUSED ) // Service
+ PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_UNUSED ) // Service
+ PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_UNUSED ) // Service
+
+ PORT_BIT( 0x0000ff00, IP_ACTIVE_LOW, IPT_UNUSED ) // not tested
+
PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_HBLANK("screen")
PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_CUSTOM )
PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_VOLUME_DOWN )
@@ -162,7 +181,8 @@ static INPUT_PORTS_START( cybstorm )
PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_ATARI_JSA_MAIN_TO_SOUND_READY("jsa")
PORT_SERVICE( 0x00400000, IP_ACTIVE_LOW )
PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen")
- PORT_BIT( 0xff000000, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_BIT( 0xff000000, IP_ACTIVE_LOW, IPT_UNUSED ) // not tested
INPUT_PORTS_END
@@ -266,8 +286,8 @@ void cybstorm_state::cybstorm(machine_config &config)
ATARI_JSA_IIIS(config, m_jsa, 0);
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_6);
m_jsa->test_read_cb().set_ioport("9F0010").bit(22);
- m_jsa->add_route(0, "lspeaker", 1.0);
- m_jsa->add_route(1, "rspeaker", 1.0);
+ m_jsa->add_route(0, "lspeaker", 0.9);
+ m_jsa->add_route(1, "rspeaker", 0.9);
}
diff --git a/src/mame/drivers/cz101.cpp b/src/mame/drivers/cz101.cpp
index 2d641f3ce05..4c9c647a517 100644
--- a/src/mame/drivers/cz101.cpp
+++ b/src/mame/drivers/cz101.cpp
@@ -25,6 +25,8 @@
#include "cz101.lh"
+namespace {
+
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -266,50 +268,50 @@ HD44780_PIXEL_UPDATE( cz101_state::lcd_pixel_update )
void cz101_state::led_4_w(uint8_t data)
{
- m_leds[0] = BIT(data, 7) ? 0 : 1;
- m_leds[1] = BIT(data, 6) ? 0 : 1;
- m_leds[2] = BIT(data, 5) ? 0 : 1;
- m_leds[3] = BIT(data, 4) ? 0 : 1;
- m_leds[4] = BIT(data, 3) ? 0 : 1;
- m_leds[5] = BIT(data, 2) ? 0 : 1;
- m_leds[6] = BIT(data, 1) ? 0 : 1;
- m_leds[7] = BIT(data, 0) ? 0 : 1;
+ m_leds[0] = BIT(~data, 7);
+ m_leds[1] = BIT(~data, 6);
+ m_leds[2] = BIT(~data, 5);
+ m_leds[3] = BIT(~data, 4);
+ m_leds[4] = BIT(~data, 3);
+ m_leds[5] = BIT(~data, 2);
+ m_leds[6] = BIT(~data, 1);
+ m_leds[7] = BIT(~data, 0);
}
void cz101_state::led_3_w(uint8_t data)
{
- m_leds[8] = BIT(data, 7) ? 0 : 1;
- m_leds[9] = BIT(data, 6) ? 0 : 1;
- m_leds[10] = BIT(data, 5) ? 0 : 1;
- m_leds[11] = BIT(data, 4) ? 0 : 1;
- m_leds[12] = BIT(data, 3) ? 0 : 1;
- m_leds[13] = BIT(data, 2) ? 0 : 1;
- m_leds[14] = BIT(data, 1) ? 0 : 1;
- m_leds[15] = BIT(data, 0) ? 0 : 1;
+ m_leds[8] = BIT(~data, 7);
+ m_leds[9] = BIT(~data, 6);
+ m_leds[10] = BIT(~data, 5);
+ m_leds[11] = BIT(~data, 4);
+ m_leds[12] = BIT(~data, 3);
+ m_leds[13] = BIT(~data, 2);
+ m_leds[14] = BIT(~data, 1);
+ m_leds[15] = BIT(~data, 0);
}
void cz101_state::led_2_w(uint8_t data)
{
- m_leds[16] = BIT(data, 7) ? 0 : 1;
- m_leds[17] = BIT(data, 6) ? 0 : 1;
- m_leds[18] = BIT(data, 5) ? 0 : 1;
- m_leds[19] = BIT(data, 4) ? 0 : 1;
- m_leds[20] = BIT(data, 3) ? 0 : 1;
- m_leds[21] = BIT(data, 2) ? 0 : 1;
- m_leds[22] = BIT(data, 1) ? 0 : 1;
- m_leds[23] = BIT(data, 0) ? 0 : 1;
+ m_leds[16] = BIT(~data, 7);
+ m_leds[17] = BIT(~data, 6);
+ m_leds[18] = BIT(~data, 5);
+ m_leds[19] = BIT(~data, 4);
+ m_leds[20] = BIT(~data, 3);
+ m_leds[21] = BIT(~data, 2);
+ m_leds[22] = BIT(~data, 1);
+ m_leds[23] = BIT(~data, 0);
}
void cz101_state::led_1_w(uint8_t data)
{
- m_leds[24] = BIT(data, 7) ? 0 : 1;
- m_leds[25] = BIT(data, 6) ? 0 : 1;
- m_leds[26] = BIT(data, 5) ? 0 : 1;
- m_leds[27] = BIT(data, 4) ? 0 : 1;
- m_leds[28] = BIT(data, 3) ? 0 : 1;
- m_leds[29] = BIT(data, 2) ? 0 : 1;
- m_leds[30] = BIT(data, 1) ? 0 : 1;
- m_leds[31] = BIT(data, 0) ? 0 : 1;
+ m_leds[24] = BIT(~data, 7);
+ m_leds[25] = BIT(~data, 6);
+ m_leds[26] = BIT(~data, 5);
+ m_leds[27] = BIT(~data, 4);
+ m_leds[28] = BIT(~data, 3);
+ m_leds[29] = BIT(~data, 2);
+ m_leds[30] = BIT(~data, 1);
+ m_leds[31] = BIT(~data, 0);
}
uint8_t cz101_state::keys_r()
@@ -412,6 +414,8 @@ ROM_START( cz101 )
ROM_LOAD("5f3_s40.bin", 0x0000, 0x8000, CRC(c417bc57) SHA1(2aa5bfb76dc0a56797cf5dd547197816cedfa370))
ROM_END
+} // anonymous namespace
+
//**************************************************************************
// SYSTEM DRIVERS
diff --git a/src/mame/drivers/d6800.cpp b/src/mame/drivers/d6800.cpp
index 8ee681fab0a..11c4e4ff75a 100644
--- a/src/mame/drivers/d6800.cpp
+++ b/src/mame/drivers/d6800.cpp
@@ -346,7 +346,7 @@ QUICKLOAD_LOAD_MEMBER(d6800_state::quickload_cb)
u32 quick_length = image.length();
if (quick_length > 0xe00)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File exceeds 3584 bytes");
+ image.seterror(image_error::INVALIDIMAGE, "File exceeds 3584 bytes");
image.message(" File exceeds 3584 bytes");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/d9final.cpp b/src/mame/drivers/d9final.cpp
index 15da8311ca5..c97d94e4b24 100644
--- a/src/mame/drivers/d9final.cpp
+++ b/src/mame/drivers/d9final.cpp
@@ -35,6 +35,8 @@
#include "tilemap.h"
+namespace {
+
class d9final_state : public driver_device
{
public:
@@ -44,11 +46,16 @@ public:
m_gfxdecode(*this, "gfxdecode"),
m_lo_vram(*this, "lo_vram"),
m_hi_vram(*this, "hi_vram"),
- m_cram(*this, "cram")
+ m_cram(*this, "cram"),
+ m_mainbank(*this, "mainbank")
{ }
void d9final(machine_config &config);
+protected:
+ virtual void machine_start() override;
+ virtual void video_start() override;
+
private:
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
@@ -56,6 +63,7 @@ private:
required_shared_ptr<uint8_t> m_lo_vram;
required_shared_ptr<uint8_t> m_hi_vram;
required_shared_ptr<uint8_t> m_cram;
+ required_memory_bank m_mainbank;
tilemap_t *m_sc0_tilemap;
@@ -67,19 +75,16 @@ private:
TILE_GET_INFO_MEMBER(get_sc0_tile_info);
- virtual void machine_start() override;
- virtual void video_start() override;
-
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void d9final_io(address_map &map);
- void d9final_map(address_map &map);
+ void io_map(address_map &map);
+ void prg_map(address_map &map);
};
TILE_GET_INFO_MEMBER(d9final_state::get_sc0_tile_info)
{
- int tile = ((m_hi_vram[tile_index] & 0x3f)<<8) | m_lo_vram[tile_index];
+ int tile = ((m_hi_vram[tile_index] & 0x3f) << 8) | m_lo_vram[tile_index];
int color = m_cram[tile_index] & 0x3f;
tileinfo.set(0,
@@ -90,12 +95,12 @@ TILE_GET_INFO_MEMBER(d9final_state::get_sc0_tile_info)
void d9final_state::video_start()
{
- m_sc0_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(d9final_state::get_sc0_tile_info)), TILEMAP_SCAN_ROWS, 8,8,64,32);
+ m_sc0_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(d9final_state::get_sc0_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
}
uint32_t d9final_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- m_sc0_tilemap->draw(screen, bitmap, cliprect, 0,0);
+ m_sc0_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
@@ -119,10 +124,10 @@ void d9final_state::sc0_cram(offs_t offset, uint8_t data)
void d9final_state::bank_w(uint8_t data)
{
- membank("bank1")->set_entry(data & 0x7);
+ m_mainbank->set_entry(data & 0x7);
}
-/* game checks this after three attract cycles, otherwise coin inputs stop to work. */
+// game checks this after three attract cycles, otherwise coin inputs stop to work.
uint8_t d9final_state::prot_latch_r()
{
// printf("PC=%06x\n",m_maincpu->pc());
@@ -131,21 +136,21 @@ uint8_t d9final_state::prot_latch_r()
}
-void d9final_state::d9final_map(address_map &map)
+void d9final_state::prg_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
- map(0x8000, 0xbfff).bankr("bank1");
+ map(0x8000, 0xbfff).bankr(m_mainbank);
map(0xc000, 0xc7ff).ram().share("nvram");
map(0xc800, 0xcbff).ram().w("palette", FUNC(palette_device::write8)).share("palette");
map(0xcc00, 0xcfff).ram().w("palette", FUNC(palette_device::write8_ext)).share("palette_ext");
- map(0xd000, 0xd7ff).ram().w(FUNC(d9final_state::sc0_lovram)).share("lo_vram");
- map(0xd800, 0xdfff).ram().w(FUNC(d9final_state::sc0_hivram)).share("hi_vram");
- map(0xe000, 0xe7ff).ram().w(FUNC(d9final_state::sc0_cram)).share("cram");
+ map(0xd000, 0xd7ff).ram().w(FUNC(d9final_state::sc0_lovram)).share(m_lo_vram);
+ map(0xd800, 0xdfff).ram().w(FUNC(d9final_state::sc0_hivram)).share(m_hi_vram);
+ map(0xe000, 0xe7ff).ram().w(FUNC(d9final_state::sc0_cram)).share(m_cram);
map(0xf000, 0xf007).r(FUNC(d9final_state::prot_latch_r)); //.rw("essnd", FUNC(es8712_device::read), FUNC(es8712_device::write));
map(0xf800, 0xf80f).rw("rtc", FUNC(rtc62421_device::read), FUNC(rtc62421_device::write));
}
-void d9final_state::d9final_io(address_map &map)
+void d9final_state::io_map(address_map &map)
{
map.global_mask(0xff);
// map(0x00, 0x00).nopw(); //bit 0: irq enable? screen enable?
@@ -194,9 +199,9 @@ static INPUT_PORTS_START( d9final )
PORT_DIPSETTING( 0x12, "5000" )
PORT_DIPSETTING( 0x22, "10000" )
PORT_DIPSETTING( 0x00, "20000" )
+ PORT_DIPSETTING( 0x10, "20000" )
+ PORT_DIPSETTING( 0x30, "20000" )
PORT_DIPSETTING( 0x02, "50000" )
-// 0x10 20000
-// 0x30 20000
PORT_DIPUNUSED_DIPLOC( 0x04, 0x04, "SW1:3" )
PORT_DIPNAME( 0x08, 0x08, "Auto Start" ) PORT_DIPLOCATION("SW1:4")
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
@@ -294,26 +299,26 @@ static const gfx_layout tiles16x8_layout =
};
static GFXDECODE_START( gfx_d9final )
- GFXDECODE_ENTRY( "gfx1", 0, tiles16x8_layout, 0, 16*4 )
+ GFXDECODE_ENTRY( "tiles", 0, tiles16x8_layout, 0, 16 * 4 )
GFXDECODE_END
void d9final_state::machine_start()
{
- membank("bank1")->configure_entries(0, 8, memregion("maincpu")->base() + 0x10000, 0x4000);
- membank("bank1")->set_entry(0);
+ m_mainbank->configure_entries(0, 8, memregion("maincpu")->base() + 0x10000, 0x4000);
+ m_mainbank->set_entry(0);
}
void d9final_state::d9final(machine_config &config)
{
- /* basic machine hardware */
- Z80(config, m_maincpu, 24000000/4); /* ? MHz */
- m_maincpu->set_addrmap(AS_PROGRAM, &d9final_state::d9final_map);
- m_maincpu->set_addrmap(AS_IO, &d9final_state::d9final_io);
+ // basic machine hardware
+ Z80(config, m_maincpu, 24000000 / 4); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &d9final_state::prg_map);
+ m_maincpu->set_addrmap(AS_IO, &d9final_state::io_map);
m_maincpu->set_vblank_int("screen", FUNC(d9final_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // Sharp LH5116D-10 + battery
- /* video hardware */
+ // video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(subseconds::from_usec(0));
@@ -325,11 +330,12 @@ void d9final_state::d9final(machine_config &config)
GFXDECODE(config, m_gfxdecode, "palette", gfx_d9final);
PALETTE(config, "palette", palette_device::BLACK).set_format(palette_device::xBRG_444, 0x400);
+ // sound hardware
SPEAKER(config, "mono").front_center();
YM2413(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 0.5);
- //ES8712(config, "essnd", 24000000/3).add_route(ALL_OUTPUTS, "mono", 1.0); // clock unknown
+ //ES8712(config, "essnd", 24000000 / 3).add_route(ALL_OUTPUTS, "mono", 1.0); // clock unknown
RTC62421(config, "rtc", XTAL(32'768)); // internal oscillator
}
@@ -342,11 +348,12 @@ ROM_START( d9final )
ROM_COPY( "maincpu", 0x10000, 0x18000, 0x08000 ) //or just 0xff
ROM_LOAD( "1.2h", 0x20000, 0x10000, CRC(901281ec) SHA1(7b4cae343f1b025d988a507141c0fa8229a0fea1) )
- ROM_REGION( 0x80000, "gfx1", 0 )
+ ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "3.13h", 0x00001, 0x40000, CRC(a2de0cce) SHA1(d510671b75417c10ce479663f6f21367121384b4) )
ROM_LOAD16_BYTE( "4.15h", 0x00000, 0x40000, CRC(859b7105) SHA1(1b36f84706473afaa50b6546d7373a2ee6602b9a) )
ROM_END
+} // Anonymous namespace
GAME( 1992, d9final, 0, d9final, d9final, d9final_state, empty_init, ROT0, "Excellent System", "Dream 9 Final (v2.24)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/darius.cpp b/src/mame/drivers/darius.cpp
index 060e5c0e181..e6ae896602b 100644
--- a/src/mame/drivers/darius.cpp
+++ b/src/mame/drivers/darius.cpp
@@ -499,7 +499,6 @@ void darius_state::darius_sound2_io_map(address_map &map)
INPUT PORTS, DIPs
***********************************************************/
-
#define TAITO_COINAGE_JAPAN_16 \
PORT_DIPNAME( 0x0030, 0x0030, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:5,6") \
PORT_DIPSETTING( 0x0010, DEF_STR( 2C_1C ) ) \
@@ -544,7 +543,7 @@ static INPUT_PORTS_START( darius )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_START("DSW") /* DSW */
+ PORT_START("DSW")
PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
@@ -589,23 +588,32 @@ static INPUT_PORTS_START( darius )
PORT_DIPSETTING( 0x8000, DEF_STR( Yes ) )
INPUT_PORTS_END
-static INPUT_PORTS_START( dariusu ) /* The US version uses the Japan coinage settings & Extra Version has continue */
+static INPUT_PORTS_START( dariuse )
PORT_INCLUDE( darius )
- PORT_MODIFY("DSW") /* DSW */
+ PORT_MODIFY("DSW")
TAITO_COINAGE_JAPAN_16
INPUT_PORTS_END
-static INPUT_PORTS_START( dariusj )
- PORT_INCLUDE( darius )
+static INPUT_PORTS_START( dariusj ) // No Continue for this version
+ PORT_INCLUDE( dariuse )
- PORT_MODIFY("DSW") /* DSW */
- TAITO_COINAGE_JAPAN_16
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:8") /* No Continue for this version */
+ PORT_MODIFY("DSW")
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:8")
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
INPUT_PORTS_END
+static INPUT_PORTS_START( dariusu ) // US version uses the Japan coinage settings
+ PORT_INCLUDE( dariuse )
+
+ PORT_MODIFY("DSW")
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Continue_Price ) ) PORT_DIPLOCATION("SW2:7")
+ PORT_DIPSETTING( 0x4000, "Discount" )
+ PORT_DIPSETTING( 0x0000, "Same as Start" )
+INPUT_PORTS_END
+
+
/**************************************************************
GFX DECODING
**************************************************************/
@@ -1090,4 +1098,4 @@ GAME( 1986, darius, 0, darius, darius, darius_state, empty_init, ROT0,
GAME( 1986, dariusu, darius, darius, dariusu, darius_state, empty_init, ROT0, "Taito America Corporation", "Darius (US, rev 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, dariusj, darius, darius, dariusj, darius_state, empty_init, ROT0, "Taito Corporation", "Darius (Japan, rev 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, dariuso, darius, darius, dariusj, darius_state, empty_init, ROT0, "Taito Corporation", "Darius (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, dariuse, darius, darius, dariusu, darius_state, empty_init, ROT0, "Taito Corporation", "Darius Extra Version (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, dariuse, darius, darius, dariuse, darius_state, empty_init, ROT0, "Taito Corporation", "Darius Extra Version (Japan)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/dccons.cpp b/src/mame/drivers/dccons.cpp
index cb4e1219630..130efe241d8 100644
--- a/src/mame/drivers/dccons.cpp
+++ b/src/mame/drivers/dccons.cpp
@@ -617,8 +617,8 @@ INPUT_PORTS_END
void dc_cons_state::gdrom_config(device_t *device)
{
cdda_device *cdda = device->subdevice<cdda_device>("cdda");
- cdda->add_route(0, "^^aica", 1.0);
- cdda->add_route(1, "^^aica", 1.0);
+ cdda->add_route(0, "^^aica", 0.4);
+ cdda->add_route(1, "^^aica", 0.4);
}
void dc_cons_state::dc_base(machine_config &config)
@@ -665,8 +665,8 @@ void dc_cons_state::dc_base(machine_config &config)
m_aica->irq().set(FUNC(dc_state::aica_irq));
m_aica->main_irq().set(FUNC(dc_state::sh4_aica_irq));
m_aica->set_addrmap(0, &dc_cons_state::aica_map);
- m_aica->add_route(0, "lspeaker", 1.0);
- m_aica->add_route(1, "rspeaker", 1.0);
+ m_aica->add_route(0, "lspeaker", 0.4);
+ m_aica->add_route(1, "rspeaker", 0.4);
AICARTC(config, "aicartc", XTAL(32'768));
diff --git a/src/mame/drivers/dec0.cpp b/src/mame/drivers/dec0.cpp
index 6d57114166d..f83314cb226 100644
--- a/src/mame/drivers/dec0.cpp
+++ b/src/mame/drivers/dec0.cpp
@@ -1843,18 +1843,18 @@ void dec0_state::dec0(machine_config &config)
SPEAKER(config, "mono").front_center();
ym2203_device &ym1(YM2203(config, "ym1", XTAL(12'000'000) / 8));
- ym1.add_route(0, "mono", 0.90);
- ym1.add_route(1, "mono", 0.90);
- ym1.add_route(2, "mono", 0.90);
- ym1.add_route(3, "mono", 0.35);
+ ym1.add_route(0, "mono", 0.81);
+ ym1.add_route(1, "mono", 0.81);
+ ym1.add_route(2, "mono", 0.81);
+ ym1.add_route(3, "mono", 0.32);
ym1.irq_handler().set_inputline(m_audiocpu, 0); // Schematics show both ym2203 and ym3812 can trigger IRQ, but Bandit is only game to program 2203 to do so
ym3812_device &ym2(YM3812(config, "ym2", XTAL(12'000'000) / 4));
ym2.irq_handler().set_inputline(m_audiocpu, 0);
- ym2.add_route(ALL_OUTPUTS, "mono", 0.80);
+ ym2.add_route(ALL_OUTPUTS, "mono", 0.72);
okim6295_device &oki(OKIM6295(config, "oki", XTAL(20'000'000) / 2 / 10, okim6295_device::PIN7_HIGH));
- oki.add_route(ALL_OUTPUTS, "mono", 0.80);
+ oki.add_route(ALL_OUTPUTS, "mono", 0.72);
}
diff --git a/src/mame/drivers/decmate2.cpp b/src/mame/drivers/decmate2.cpp
index ea7b1420a31..42917992b20 100644
--- a/src/mame/drivers/decmate2.cpp
+++ b/src/mame/drivers/decmate2.cpp
@@ -975,7 +975,7 @@ ROM_START(decmate2)
ROMX_LOAD("23-391e2.e114", 0x1000, 0x0800, CRC(3a09ada1) SHA1(3093bd926d49c2fd62a773e8019e3755aa165ae9), ROM_BIOS(1) | ROM_SKIP(1))
ROMX_LOAD("23-392e2.e115", 0x0001, 0x0800, CRC(19901cb6) SHA1(82a642d2b5b56250611f69321d0251e27fa639fc), ROM_BIOS(1) | ROM_SKIP(1))
ROM_SYSTEM_BIOS(2, "31z", "31Z (3732)") // Regenerated from source code listing
- ROMX_LOAD("23-358e2.e113", 0x0000, 0x0800, BAD_DUMP CRC(e6b9ab4d) SHA1(12533bab586b7bc753fae3ce1959bc5ced3905f5), ROM_BIOS(2) | ROM_SKIP(1))
+ ROMX_LOAD("23-358e2.e113", 0x0000, 0x0800, BAD_DUMP CRC(459231ea) SHA1(608342b7129d54a2a0f4a8e0645dad1ae26fccf4), ROM_BIOS(2) | ROM_SKIP(1))
ROMX_LOAD("23-359e2.e114", 0x1000, 0x0800, BAD_DUMP CRC(3d1825b7) SHA1(753af9657eef1a284801c9765f4899563d3d9a20), ROM_BIOS(2) | ROM_SKIP(1))
ROMX_LOAD("23-360e2.e115", 0x0001, 0x0800, BAD_DUMP CRC(ed8162e6) SHA1(4ab993c00a5afc6465153ca4f52faa76e02a0ef3), ROM_BIOS(2) | ROM_SKIP(1))
diff --git a/src/mame/drivers/dmv.cpp b/src/mame/drivers/dmv.cpp
index 7235a10a386..8ea2ee409e1 100644
--- a/src/mame/drivers/dmv.cpp
+++ b/src/mame/drivers/dmv.cpp
@@ -362,6 +362,9 @@ UPD7220_DRAW_TEXT_LINE_MEMBER( dmv_state::hgdc_draw_text )
{
uint8_t tile_data = m_chargen->base()[(tile*16+yi) & 0x7ff];
+ if((attr & 2) && (m_screen->frame_number() & 0x10)) // FIXME: blink freq
+ tile_data = 0;
+
if(cursor_on && cursor_addr == addr+x) //TODO
tile_data^=0xff;
diff --git a/src/mame/drivers/dooyong.cpp b/src/mame/drivers/dooyong.cpp
index 4b2391e201c..c50b7215fbf 100644
--- a/src/mame/drivers/dooyong.cpp
+++ b/src/mame/drivers/dooyong.cpp
@@ -107,7 +107,7 @@ protected:
{
}
- void sound_2151_4mhz(machine_config &config);
+ void sound_2151(machine_config &config, XTAL ymclk, XTAL okiclk);
void bluehawk_sound_map(address_map &map);
required_device<cpu_device> m_maincpu;
@@ -233,7 +233,6 @@ protected:
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, unsigned extensions = 0);
- void sound_2151(machine_config &config);
void bluehawk_map(address_map &map);
void flytiger_map(address_map &map);
void primella_map(address_map &map);
@@ -296,7 +295,8 @@ protected:
save_item(NAME(m_palette_bank));
}
- void sound_2203(machine_config &config);
+ template <typename T>
+ void sound_2203(machine_config &config, T ymclk);
void lastday_map(address_map &map);
void gulfstrm_map(address_map &map);
@@ -1447,7 +1447,8 @@ u8 dooyong_z80_ym2203_state::unk_r()
***************************************************************************/
-void dooyong_z80_ym2203_state::sound_2203(machine_config &config)
+template <typename T>
+void dooyong_z80_ym2203_state::sound_2203(machine_config &config, T ymclk)
{
INPUT_MERGER_ANY_HIGH(config, "soundirq").output_handler().set_inputline(m_audiocpu, 0);
@@ -1455,43 +1456,29 @@ void dooyong_z80_ym2203_state::sound_2203(machine_config &config)
GENERIC_LATCH_8(config, "soundlatch");
- ym2203_device &ym1(YM2203(config, "ym1", 1500000));
+ ym2203_device &ym1(YM2203(config, "ym1", ymclk));
ym1.irq_handler().set("soundirq", FUNC(input_merger_any_high_device::in_w<0>));
ym1.port_a_read_callback().set(FUNC(dooyong_z80_ym2203_state::unk_r));
ym1.add_route(ALL_OUTPUTS, "mono", 0.40);
- ym2203_device &ym2(YM2203(config, "ym2", 1500000));
+ ym2203_device &ym2(YM2203(config, "ym2", ymclk));
ym2.irq_handler().set("soundirq", FUNC(input_merger_any_high_device::in_w<1>));
ym2.port_a_read_callback().set(FUNC(dooyong_z80_ym2203_state::unk_r));
ym2.add_route(ALL_OUTPUTS, "mono", 0.40);
}
-void dooyong_z80_state::sound_2151(machine_config &config)
+void dooyong_state::sound_2151(machine_config &config, XTAL ymclk, XTAL okiclk)
{
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, "soundlatch");
- ym2151_device &ymsnd(YM2151(config, "ymsnd", 3.579'545_MHz_XTAL));
+ ym2151_device &ymsnd(YM2151(config, "ymsnd", ymclk));
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
- ymsnd.add_route(0, "mono", 0.50);
- ymsnd.add_route(1, "mono", 0.50);
+ ymsnd.add_route(0, "mono", 0.35);
+ ymsnd.add_route(1, "mono", 0.35);
- OKIM6295(config, "oki", 1_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.60);
-}
-
-void dooyong_state::sound_2151_4mhz(machine_config &config)
-{
- SPEAKER(config, "mono").front_center();
-
- GENERIC_LATCH_8(config, "soundlatch");
-
- ym2151_device &ymsnd(YM2151(config, "ymsnd", 16_MHz_XTAL/4)); /* 4MHz (16MHz/4 for most, 8Mhz/2 for Super-X) */
- ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
- ymsnd.add_route(0, "mono", 0.50);
- ymsnd.add_route(1, "mono", 0.50);
-
- OKIM6295(config, "oki", 16_MHz_XTAL/16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.60); /* 1MHz (16MHz/16 for most, 8Mhz/8 for Super-X) */
+ OKIM6295(config, "oki", okiclk, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.42);
}
void dooyong_z80_ym2203_state::lastday(machine_config &config)
@@ -1528,21 +1515,7 @@ void dooyong_z80_ym2203_state::lastday(machine_config &config)
MCFG_VIDEO_START_OVERRIDE(dooyong_z80_ym2203_state, lastday)
/* sound hardware */
- INPUT_MERGER_ANY_HIGH(config, "soundirq").output_handler().set_inputline(m_audiocpu, 0);
-
- SPEAKER(config, "mono").front_center();
-
- GENERIC_LATCH_8(config, "soundlatch");
-
- ym2203_device &ym1(YM2203(config, "ym1", 16_MHz_XTAL/4)); /* 4MHz verified for Last Day / D-day */
- ym1.irq_handler().set("soundirq", FUNC(input_merger_any_high_device::in_w<0>));
- ym1.port_a_read_callback().set(FUNC(dooyong_z80_ym2203_state::unk_r));
- ym1.add_route(ALL_OUTPUTS, "mono", 0.40);
-
- ym2203_device &ym2(YM2203(config, "ym2", 16_MHz_XTAL/4)); /* 4MHz verified for Last Day / D-day */
- ym2.irq_handler().set("soundirq", FUNC(input_merger_any_high_device::in_w<1>));
- ym2.port_a_read_callback().set(FUNC(dooyong_z80_ym2203_state::unk_r));
- ym2.add_route(ALL_OUTPUTS, "mono", 0.40);
+ sound_2203(config, 16_MHz_XTAL/4); /* 4MHz verified for Last Day / D-day */
}
void dooyong_z80_ym2203_state::gulfstrm(machine_config &config)
@@ -1579,7 +1552,7 @@ void dooyong_z80_ym2203_state::gulfstrm(machine_config &config)
MCFG_VIDEO_START_OVERRIDE(dooyong_z80_ym2203_state, gulfstrm)
/* sound hardware */
- sound_2203(config); /* 3.579545MHz */
+ sound_2203(config, 1'500'000); /* 3.579545MHz */
}
void dooyong_z80_ym2203_state::pollux(machine_config &config)
@@ -1616,7 +1589,7 @@ void dooyong_z80_ym2203_state::pollux(machine_config &config)
MCFG_VIDEO_START_OVERRIDE(dooyong_z80_ym2203_state, pollux)
/* sound hardware */
- sound_2203(config); /* 1.5MHz verified */
+ sound_2203(config, 1'500'000); /* 1.5MHz verified */
}
void dooyong_z80_state::bluehawk(machine_config &config)
@@ -1662,7 +1635,7 @@ void dooyong_z80_state::bluehawk(machine_config &config)
MCFG_VIDEO_START_OVERRIDE(dooyong_z80_state, bluehawk)
/* sound hardware */
- sound_2151(config); /* 3.579545MHz or 4Mhz ??? */
+ sound_2151(config, 3.579'545_MHz_XTAL, 1_MHz_XTAL); /* 3.579545MHz or 4Mhz ??? */
}
void dooyong_z80_state::flytiger(machine_config &config)
@@ -1700,7 +1673,7 @@ void dooyong_z80_state::flytiger(machine_config &config)
MCFG_VIDEO_START_OVERRIDE(dooyong_z80_state, flytiger)
/* sound hardware */
- sound_2151(config);
+ sound_2151(config, 3.579'545_MHz_XTAL, 1_MHz_XTAL);
}
void dooyong_z80_state::primella(machine_config &config)
@@ -1739,7 +1712,7 @@ void dooyong_z80_state::primella(machine_config &config)
MCFG_VIDEO_START_OVERRIDE(dooyong_z80_state, primella)
/* sound hardware */
- sound_2151_4mhz(config); /* PCB has only 1 OSC at 16Mhz */
+ sound_2151(config, 16_MHz_XTAL/4, 16_MHz_XTAL/16); /* PCB has only 1 OSC at 16Mhz */
}
@@ -1795,7 +1768,7 @@ void rshark_state::dooyong_68k(machine_config &config)
m_fg[1]->set_tile_callback(FUNC(rshark_state::rshark_tile_callback));
// sound hardware
- sound_2151_4mhz(config);
+ sound_2151(config, 8_MHz_XTAL/2, 8_MHz_XTAL/8);
}
void rshark_state::rshark(machine_config &config)
@@ -1844,7 +1817,7 @@ void popbingo_state::popbingo(machine_config &config)
m_bg[1]->set_tile_callback(FUNC(popbingo_state::popbingo_tile_callback));
// sound hardware
- sound_2151_4mhz(config);
+ sound_2151(config, 16_MHz_XTAL/4, 16_MHz_XTAL/16);
}
} // anonymous namespace
diff --git a/src/mame/drivers/dps1.cpp b/src/mame/drivers/dps1.cpp
index 0b1707f3292..d4a30cde501 100644
--- a/src/mame/drivers/dps1.cpp
+++ b/src/mame/drivers/dps1.cpp
@@ -23,6 +23,9 @@ ToDo:
//#include "bus/s100/s100.h"
#include "softlist.h"
+
+namespace {
+
class dps1_state : public driver_device
{
public:
@@ -39,9 +42,11 @@ public:
void dps1(machine_config &config);
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
private:
- void machine_reset() override;
- void machine_start() override;
void portb2_w(u8 data);
void portb4_w(u8 data);
void portb6_w(u8 data);
@@ -55,6 +60,7 @@ private:
void io_map(address_map &map);
void mem_map(address_map &map);
+
bool m_dma_dir;
u16 m_dma_adr;
required_device<cpu_device> m_maincpu;
@@ -68,8 +74,8 @@ private:
void dps1_state::mem_map(address_map &map)
{
- map(0x0000, 0xffff).ram().share("mainram");
- map(0x0000, 0x03ff).bankr("bank1");
+ map(0x0000, 0xffff).ram().share(m_ram);
+ map(0x0000, 0x03ff).bankr(m_bank1);
}
void dps1_state::io_map(address_map &map)
@@ -176,6 +182,7 @@ void dps1_state::machine_start()
{
m_bank1->configure_entry(0, m_ram);
m_bank1->configure_entry(1, m_rom);
+
save_item(NAME(m_dma_dir));
save_item(NAME(m_dma_adr));
}
@@ -236,4 +243,7 @@ ROM_START( dps1 )
ROM_LOAD( "boot 1280", 0x0000, 0x0400, CRC(9c2e98fa) SHA1(78e6c9d00aa6e8f6c4d3c65984cfdf4e99434c66) ) // actually on the FDC-2 board
ROM_END
+} // anonymous namespace
+
+
COMP( 1979, dps1, 0, 0, dps1, dps1, dps1_state, empty_init, "Ithaca InterSystems", "DPS-1", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/dsb46.cpp b/src/mame/drivers/dsb46.cpp
index 9d97d17a692..554dc62b0a0 100644
--- a/src/mame/drivers/dsb46.cpp
+++ b/src/mame/drivers/dsb46.cpp
@@ -25,15 +25,17 @@ The photos show 3 boards:
********************************************************************************************************************/
-
#include "emu.h"
+
+#include "bus/rs232/rs232.h"
#include "cpu/z80/z80.h"
-#include "machine/z80daisy.h"
#include "machine/z80ctc.h"
+#include "machine/z80daisy.h"
#include "machine/z80sio.h"
-#include "bus/rs232/rs232.h"
+namespace {
+
class dsb46_state : public driver_device
{
public:
@@ -47,9 +49,11 @@ public:
void dsb46(machine_config &config);
+protected:
+ virtual void machine_reset() override;
+ virtual void machine_start() override;
+
private:
- void machine_reset() override;
- void machine_start() override;
void port1a_w(u8 data);
void io_map(address_map &map);
void mem_map(address_map &map);
@@ -61,8 +65,8 @@ private:
void dsb46_state::mem_map(address_map &map)
{
- map(0x0000, 0xffff).ram().share("mainram");
- map(0x0000, 0x07ff).bankr("bank1");
+ map(0x0000, 0xffff).ram().share(m_ram);
+ map(0x0000, 0x07ff).bankr(m_bank1);
}
void dsb46_state::io_map(address_map &map)
@@ -143,4 +147,7 @@ ROM_START( dsb46 )
ROM_LOAD( "ades.bin", 0x0000, 0x4000, CRC(d374abf0) SHA1(331f51a2bb81375aeffbe63c1ebc1d7cd779b9c3) )
ROM_END
+} // anonymous namespace
+
+
COMP( 198?, dsb46, 0, 0, dsb46, dsb46, dsb46_state, empty_init, "Davidge", "DSB-4/6", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/elan_eu3a05.cpp b/src/mame/drivers/elan_eu3a05.cpp
index 68d3f621478..bfbfec8cf6d 100644
--- a/src/mame/drivers/elan_eu3a05.cpp
+++ b/src/mame/drivers/elan_eu3a05.cpp
@@ -360,7 +360,7 @@ DEVICE_IMAGE_LOAD_MEMBER(elan_eu3a05_buzztime_state::cart_load)
if (size != 0x200000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/electron.cpp b/src/mame/drivers/electron.cpp
index 0e971a9e4b5..9f454ef3ae5 100644
--- a/src/mame/drivers/electron.cpp
+++ b/src/mame/drivers/electron.cpp
@@ -67,11 +67,7 @@ ROM/RAM sockets and User Port for a mouse.
******************************************************************************
Emulation notes:
-I don't have a real system to verify the behaviour of the emulation. The things
-that can be done through BASIC programs seem to behave properly (most of the time :).
-
Incomplete:
- - Sound (sound is too high?)
- Graphics (seems to be wrong for several games)
- 1 MHz bus is not emulated
- Bus claiming by ULA is not implemented
@@ -148,63 +144,63 @@ static INPUT_PORTS_START( electron )
PORT_START("LINE.3")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('@')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CHAR('p')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+')
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
PORT_START("LINE.4")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CHAR('o')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CHAR('l')
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
PORT_START("LINE.5")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_CHAR('i')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CHAR('k')
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
PORT_START("LINE.6")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CHAR('u')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_CHAR('j')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CHAR('m')
PORT_START("LINE.7")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CHAR('y')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_CHAR('h')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CHAR('n')
PORT_START("LINE.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_CHAR('t')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('G') PORT_CHAR('g')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_CHAR('b')
PORT_START("LINE.9")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CHAR('r')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_CHAR('f')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_CHAR('v')
PORT_START("LINE.10")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_CHAR('e')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_CHAR('d')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_CHAR('c')
PORT_START("LINE.11")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_CHAR('w')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_CHAR('s')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_CHAR('x')
PORT_START("LINE.12")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_CHAR('q')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_CHAR('a')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_CHAR('z')
PORT_START("LINE.13")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ESCAPE") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
@@ -381,8 +377,8 @@ ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP ( 1983, electron, 0, 0, electron, electron, electron_state, empty_init, "Acorn Computers", "Acorn Electron", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-COMP ( 1983, electront, electron, 0, electron, electron, electron_state, empty_init, "Acorn Computers", "Acorn Electron (Trial)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+COMP ( 1983, electron, 0, 0, electron, electron, electron_state, empty_init, "Acorn Computers", "Acorn Electron", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+COMP ( 1983, electront, electron, 0, electron, electron, electron_state, empty_init, "Acorn Computers", "Acorn Electron (Trial)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
COMP ( 1985, btm2105, electron, 0, btm2105, electron, electron_state, empty_init, "British Telecom Business Systems", "BT Merlin M2105", MACHINE_NOT_WORKING )
-COMP ( 1987, electron64, electron, 0, electron64, electron64, electron_state, empty_init, "Acorn Computers / Slogger", "Acorn Electron (64K Master RAM Board)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-COMP ( 1991, electronsp, electron, 0, electronsp, electronsp, electronsp_state, empty_init, "Acorn Computers / Slogger", "Acorn Electron (Stop Press 64i)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+COMP ( 1987, electron64, electron, 0, electron64, electron64, electron_state, empty_init, "Acorn Computers / Slogger", "Acorn Electron (64K Master RAM Board)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+COMP ( 1991, electronsp, electron, 0, electronsp, electronsp, electronsp_state, empty_init, "Acorn Computers / Slogger", "Acorn Electron (Stop Press 64i)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/enigma2.cpp b/src/mame/drivers/enigma2.cpp
index b828b25c53d..f52d4ace9c1 100644
--- a/src/mame/drivers/enigma2.cpp
+++ b/src/mame/drivers/enigma2.cpp
@@ -19,6 +19,7 @@ enigma2b (1981)
TODO:
- enigma2 - Star blinking frequency
+ - enigma2 - Sound is incorrectly emulated (see MT07777)
- enigma2a + enigma2b - bad sound ROM?
@@ -124,13 +125,16 @@ DIP Switches
*********************************************************************/
#include "emu.h"
-#include "cpu/z80/z80.h"
#include "cpu/i8085/i8085.h"
+#include "cpu/z80/z80.h"
#include "sound/ay8910.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
+
+namespace {
+
#define LOG_PROT (0)
/* these values provide a fairly low refresh rate of around 53Hz, but
@@ -613,25 +617,25 @@ static INPUT_PORTS_START( enigma2 )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("DSW")
- PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("DSW:1,2")
+ PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("DSW:!1,!2")
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x01, "4" )
PORT_DIPSETTING( 0x02, "5" )
PORT_DIPSETTING( 0x03, "6" )
- PORT_DIPNAME( 0x1c, 0x00, "Skill Level" ) PORT_DIPLOCATION("DSW:6,7,8")
+ PORT_DIPNAME( 0x1c, 0x00, "Skill Level" ) PORT_DIPLOCATION("DSW:!6,!7,!8")
PORT_DIPSETTING( 0x00, "1" )
PORT_DIPSETTING( 0x04, "2" )
PORT_DIPSETTING( 0x0c, "3" )
PORT_DIPSETTING( 0x08, "4" )
PORT_DIPSETTING( 0x10, "5" )
PORT_DIPSETTING( 0x14, "6" )
- PORT_DIPNAME( 0x20, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("DSW:3")
+ PORT_DIPNAME( 0x20, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("DSW:!3")
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x20, DEF_STR( Cocktail ) )
- PORT_DIPNAME( 0x40, 0x40, "Number of Invaders" ) PORT_DIPLOCATION("DSW:5")
+ PORT_DIPNAME( 0x40, 0x40, "Number of Invaders" ) PORT_DIPLOCATION("DSW:!5")
PORT_DIPSETTING( 0x40, "16" )
PORT_DIPSETTING( 0x00, "32" )
- PORT_DIPNAME( 0x80, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("DSW:4")
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("DSW:!4")
PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
@@ -818,6 +822,7 @@ void enigma2_state::init_enigma2()
}
}
+} // Anonymous namespace
GAME( 1981, enigma2, 0, enigma2, enigma2, enigma2_state, init_enigma2, ROT270, "Game Plan (Zilec Electronics license)", "Enigma II", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/epos.cpp b/src/mame/drivers/epos.cpp
index 5b40951d209..6147061d5bb 100644
--- a/src/mame/drivers/epos.cpp
+++ b/src/mame/drivers/epos.cpp
@@ -456,8 +456,8 @@ static INPUT_PORTS_START( beastf )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 )
@@ -466,8 +466,8 @@ static INPUT_PORTS_START( beastf )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(2)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(2)
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
INPUT_PORTS_END
diff --git a/src/mame/drivers/eprom.cpp b/src/mame/drivers/eprom.cpp
index f391cf38b49..d1af9ae8ddc 100644
--- a/src/mame/drivers/eprom.cpp
+++ b/src/mame/drivers/eprom.cpp
@@ -411,7 +411,7 @@ void eprom_state::eprom(machine_config &config)
ATARI_JSA_I(config, m_jsa, 0);
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_6);
m_jsa->test_read_cb().set_ioport("260010").bit(1);
- m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_jsa->add_route(ALL_OUTPUTS, "mono", 0.4);
config.device_remove("jsa:pokey");
}
diff --git a/src/mame/drivers/eti660.cpp b/src/mame/drivers/eti660.cpp
index 379cdb2d55b..5ffea04f6d2 100644
--- a/src/mame/drivers/eti660.cpp
+++ b/src/mame/drivers/eti660.cpp
@@ -325,7 +325,7 @@ QUICKLOAD_LOAD_MEMBER(eti660_state::quickload_cb)
read_ = image.fread( &quick_data[0], quick_length);
if (read_ != quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Cannot read the file");
+ image.seterror(image_error::INVALIDIMAGE, "Cannot read the file");
image.message(" Cannot read the file");
}
else
diff --git a/src/mame/drivers/excali64.cpp b/src/mame/drivers/excali64.cpp
index 06a3e53008e..933d9792a45 100644
--- a/src/mame/drivers/excali64.cpp
+++ b/src/mame/drivers/excali64.cpp
@@ -64,6 +64,8 @@ public:
, m_palette(*this, "palette")
, m_maincpu(*this, "maincpu")
, m_p_chargen(*this, "chargen")
+ , m_bankr(*this, "bankr%u", 1U)
+ , m_bankw(*this, "bankw%u", 1U)
, m_cass(*this, "cassette")
, m_crtc(*this, "crtc")
, m_io_keyboard(*this, "KEY.%u", 0)
@@ -119,6 +121,8 @@ private:
required_device<palette_device> m_palette;
required_device<z80_device> m_maincpu;
required_region_ptr<u8> m_p_chargen;
+ required_memory_bank_array<4> m_bankr;
+ required_memory_bank_array<4> m_bankw;
required_device<cassette_image_device> m_cass;
required_device<mc6845_device> m_crtc;
required_ioport_array<8> m_io_keyboard;
@@ -132,11 +136,11 @@ private:
void excali64_state::mem_map(address_map &map)
{
- map(0x0000, 0x1FFF).bankr("bankr1").bankw("bankw1");
- map(0x2000, 0x2FFF).bankr("bankr2").bankw("bankw2");
- map(0x3000, 0x3FFF).bankr("bankr3").bankw("bankw3");
- map(0x4000, 0xBFFF).bankr("bankr4").bankw("bankw4");
- map(0xC000, 0xFFFF).ram();
+ map(0x0000, 0x1fff).bankr(m_bankr[0]).bankw(m_bankw[0]);
+ map(0x2000, 0x2fff).bankr(m_bankr[1]).bankw(m_bankw[1]);
+ map(0x3000, 0x3fff).bankr(m_bankr[2]).bankw(m_bankw[2]);
+ map(0x4000, 0xbfff).bankr(m_bankr[3]).bankw(m_bankw[3]);
+ map(0xc000, 0xffff).ram();
}
void excali64_state::io_map(address_map &map)
@@ -386,52 +390,57 @@ void excali64_state::port70_w(u8 data)
if (BIT(data, 1))
{
// select 64k ram
- membank("bankr1")->set_entry(0);
- membank("bankr2")->set_entry(0);
- membank("bankr3")->set_entry(0);
- membank("bankr4")->set_entry(0);
- membank("bankw2")->set_entry(0);
- membank("bankw3")->set_entry(0);
- membank("bankw4")->set_entry(0);
+ m_bankr[0]->set_entry(0);
+ m_bankr[1]->set_entry(0);
+ m_bankr[2]->set_entry(0);
+ m_bankr[3]->set_entry(0);
+
+ m_bankw[1]->set_entry(0);
+ m_bankw[2]->set_entry(0);
+ m_bankw[3]->set_entry(0);
}
else if (BIT(data, 0))
{
// select videoram and hiresram
- membank("bankr1")->set_entry(1);
- membank("bankr2")->set_entry(2);
- membank("bankr3")->set_entry(2);
- membank("bankw2")->set_entry(2);
- membank("bankw3")->set_entry(2);
- membank("bankr4")->set_entry(2);
- membank("bankw4")->set_entry(2);
+ m_bankr[0]->set_entry(1);
+ m_bankr[1]->set_entry(2);
+ m_bankr[2]->set_entry(2);
+ m_bankr[3]->set_entry(2);
+
+ m_bankw[1]->set_entry(2);
+ m_bankw[2]->set_entry(2);
+ m_bankw[3]->set_entry(2);
}
else
{
// select rom, videoram, and main ram
- membank("bankr1")->set_entry(1);
- membank("bankr2")->set_entry(1);
- membank("bankr3")->set_entry(1);
- membank("bankw2")->set_entry(2);
- membank("bankw3")->set_entry(2);
- membank("bankr4")->set_entry(0);
- membank("bankw4")->set_entry(0);
+ m_bankr[0]->set_entry(1);
+ m_bankr[1]->set_entry(1);
+ m_bankr[2]->set_entry(1);
+ m_bankr[3]->set_entry(0);
+
+ m_bankw[1]->set_entry(2);
+ m_bankw[2]->set_entry(2);
+ m_bankw[3]->set_entry(0);
}
// other half of ROM_1
if ((data & 0x22) == 0x20)
- membank("bankr1")->set_entry(2);
+ m_bankr[0]->set_entry(2);
}
void excali64_state::machine_reset()
{
- membank("bankr1")->set_entry(1); // read from ROM
- membank("bankr2")->set_entry(1); // read from ROM
- membank("bankr3")->set_entry(1); // read from ROM
- membank("bankr4")->set_entry(0); // read from RAM
- membank("bankw1")->set_entry(0); // write to RAM
- membank("bankw2")->set_entry(2); // write to videoram
- membank("bankw3")->set_entry(2); // write to videoram hires pointers
- membank("bankw4")->set_entry(0); // write to RAM
+ m_bankr[0]->set_entry(1); // read from ROM
+ m_bankr[1]->set_entry(1); // read from ROM
+ m_bankr[2]->set_entry(1); // read from ROM
+ m_bankr[3]->set_entry(0); // read from RAM
+
+ m_bankw[0]->set_entry(0); // write to RAM
+ m_bankw[1]->set_entry(2); // write to videoram
+ m_bankw[2]->set_entry(2); // write to videoram hires pointers
+ m_bankw[3]->set_entry(0); // write to RAM
+
m_maincpu->reset();
}
@@ -492,28 +501,28 @@ void excali64_state::excali64_palette(palette_device &palette)
u8 *main = memregion("roms")->base();
// main ram (cp/m mode)
- membank("bankr1")->configure_entry(0, r);
- membank("bankr2")->configure_entry(0, r+0x2000);
- membank("bankr3")->configure_entry(0, r+0x3000);
- membank("bankr4")->configure_entry(0, r+0x4000);//boot
- membank("bankw1")->configure_entry(0, r);//boot
- membank("bankw2")->configure_entry(0, r+0x2000);
- membank("bankw3")->configure_entry(0, r+0x3000);
- membank("bankw4")->configure_entry(0, r+0x4000);//boot
+ m_bankr[0]->configure_entry(0, r);
+ m_bankr[1]->configure_entry(0, r+0x2000);
+ m_bankr[2]->configure_entry(0, r+0x3000);
+ m_bankr[3]->configure_entry(0, r+0x4000);//boot
+ m_bankw[0]->configure_entry(0, r);//boot
+ m_bankw[1]->configure_entry(0, r+0x2000);
+ m_bankw[2]->configure_entry(0, r+0x3000);
+ m_bankw[3]->configure_entry(0, r+0x4000);//boot
// rom_1
- membank("bankr1")->configure_entry(1, &main[0x0000]);//boot
- membank("bankr1")->configure_entry(2, &main[0x2000]);
+ m_bankr[0]->configure_entry(1, &main[0x0000]);//boot
+ m_bankr[0]->configure_entry(2, &main[0x2000]);
// rom_2
- membank("bankr2")->configure_entry(1, &main[0x4000]);//boot
- membank("bankr3")->configure_entry(1, &main[0x5000]);//boot
+ m_bankr[1]->configure_entry(1, &main[0x4000]);//boot
+ m_bankr[2]->configure_entry(1, &main[0x5000]);//boot
// videoram
- membank("bankr2")->configure_entry(2, v);
- membank("bankw2")->configure_entry(2, v);//boot
+ m_bankr[1]->configure_entry(2, v);
+ m_bankw[1]->configure_entry(2, v);//boot
// hiresram
- membank("bankr3")->configure_entry(2, v+0x1000);
- membank("bankw3")->configure_entry(2, v+0x1000);//boot
- membank("bankr4")->configure_entry(2, h);
- membank("bankw4")->configure_entry(2, h);
+ m_bankr[2]->configure_entry(2, v+0x1000);
+ m_bankw[2]->configure_entry(2, v+0x1000);//boot
+ m_bankr[3]->configure_entry(2, h);
+ m_bankw[3]->configure_entry(2, h);
// Set up foreground colours
for (u8 i = 0; i < 32; i++)
diff --git a/src/mame/drivers/exidy.cpp b/src/mame/drivers/exidy.cpp
index 096b2ea215d..2060cb19ee1 100644
--- a/src/mame/drivers/exidy.cpp
+++ b/src/mame/drivers/exidy.cpp
@@ -149,25 +149,254 @@ Fax 1982 6502 FXL, FLA
***************************************************************************/
#include "emu.h"
+#include "audio/exidy.h"
+
#include "cpu/m6502/m6502.h"
#include "machine/6821pia.h"
-#include "audio/exidy.h"
-#include "includes/exidy.h"
+#include "sound/dac.h"
+#include "sound/samples.h"
+
+#include "emupal.h"
+#include "screen.h"
#include "speaker.h"
+namespace {
+
+#define EXIDY_MASTER_CLOCK (XTAL(11'289'000))
+#define EXIDY_CPU_CLOCK (EXIDY_MASTER_CLOCK / 16)
+#define EXIDY_PIXEL_CLOCK (EXIDY_MASTER_CLOCK / 2)
+#define EXIDY_HTOTAL (0x150)
+#define EXIDY_HBEND (0x000)
+#define EXIDY_HBSTART (0x100)
+#define EXIDY_HSEND (0x140)
+#define EXIDY_HSSTART (0x120)
+#define EXIDY_VTOTAL (0x118)
+#define EXIDY_VBEND (0x000)
+#define EXIDY_VBSTART (0x100)
+#define EXIDY_VSEND (0x108)
+#define EXIDY_VSSTART (0x100)
+
+
+class exidy_state : public driver_device
+{
+public:
+ enum
+ {
+ TIMER_COLLISION_IRQ
+ };
+
+ exidy_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_gfxdecode(*this, "gfxdecode"),
+ m_screen(*this, "screen"),
+ m_palette(*this, "palette"),
+ m_color_latch(*this, "color_latch"),
+ m_videoram(*this, "videoram"),
+ m_sprite1_xpos(*this, "sprite1_xpos"),
+ m_sprite1_ypos(*this, "sprite1_ypos"),
+ m_sprite2_xpos(*this, "sprite2_xpos"),
+ m_sprite2_ypos(*this, "sprite2_ypos"),
+ m_spriteno(*this, "spriteno"),
+ m_sprite_enable(*this, "sprite_enable"),
+ m_characterram(*this, "characterram")
+ {
+ }
+
+ void venture(machine_config &config);
+ void mtrap(machine_config &config);
+ void pepper2(machine_config &config);
+
+protected:
+ required_device<cpu_device> m_maincpu;
+ required_device<gfxdecode_device> m_gfxdecode;
+ required_device<screen_device> m_screen;
+ required_device<palette_device> m_palette;
+ required_shared_ptr<uint8_t> m_color_latch;
+
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+ virtual void video_start() override;
+
+ void base(machine_config &config);
+
+ void exidy_video_config(uint8_t _collision_mask, uint8_t _collision_invert, int _is_2bpp);
+
+ uint8_t exidy_interrupt_r();
+
+ void exidy_map(address_map &map);
+
+private:
+ required_shared_ptr<uint8_t> m_videoram;
+ required_shared_ptr<uint8_t> m_sprite1_xpos;
+ required_shared_ptr<uint8_t> m_sprite1_ypos;
+ required_shared_ptr<uint8_t> m_sprite2_xpos;
+ required_shared_ptr<uint8_t> m_sprite2_ypos;
+ required_shared_ptr<uint8_t> m_spriteno;
+ required_shared_ptr<uint8_t> m_sprite_enable;
+ optional_shared_ptr<uint8_t> m_characterram;
+
+ uint8_t m_collision_mask;
+ uint8_t m_collision_invert;
+ int m_is_2bpp;
+ uint8_t m_int_condition;
+ bitmap_ind16 m_background_bitmap;
+ bitmap_ind16 m_motion_object_1_vid;
+ bitmap_ind16 m_motion_object_2_vid;
+ bitmap_ind16 m_motion_object_2_clip;
+
+ void mtrap_ocl_w(uint8_t data);
+
+ uint32_t screen_update_exidy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ INTERRUPT_GEN_MEMBER(exidy_vblank_interrupt);
+
+ void latch_condition(int collision);
+ void set_1_color(int index, int which);
+ void set_colors();
+ void draw_background();
+ int sprite_1_enabled();
+ void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void check_collision();
+
+ void venture_map(address_map &map);
+ void mtrap_map(address_map &map);
+ void pepper2_map(address_map &map);
+};
+
+
+class spectar_state : public exidy_state
+{
+public:
+ spectar_state(const machine_config &mconfig, device_type type, const char *tag) :
+ exidy_state(mconfig, type, tag),
+ m_dac(*this, "dac"),
+ m_samples(*this, "samples")
+ {
+ }
+
+ void sidetrac(machine_config &config);
+ void spectar(machine_config &config);
+ void rallys(machine_config &config);
+ void phantoma(machine_config &config);
+
+ void init_sidetrac();
+ void init_spectar();
+
+protected:
+ virtual void machine_start() override;
+
+ void set_max_freq(int freq) { m_max_freq = freq; }
+
+ void spectar_audio_1_w(uint8_t data);
+ void spectar_audio_2_w(uint8_t data);
+
+ void adjust_sample(uint8_t freq);
+ bool RISING_EDGE(uint8_t data, uint8_t bit) const { return (data & bit) && !(m_port_1_last & bit); }
+ bool FALLING_EDGE(uint8_t data, uint8_t bit) const { return !(data & bit) && (m_port_1_last & bit); }
+
+private:
+ required_device<dac_bit_interface> m_dac;
+ required_device<samples_device> m_samples;
+
+ // Targ and Spectar samples
+ int m_max_freq;
+ uint8_t m_port_1_last;
+ uint8_t m_tone_freq;
+ uint8_t m_tone_active;
+
+ void sidetrac_map(address_map &map);
+ void spectar_map(address_map &map);
+ void rallys_map(address_map &map);
+ void phantoma_map(address_map &map);
+};
+
+
+class targ_state : public spectar_state
+{
+public:
+ targ_state(const machine_config &mconfig, device_type type, const char *tag) :
+ spectar_state(mconfig, type, tag),
+ m_sound_prom(*this, "targ")
+ {
+ }
+
+ void targ(machine_config &config);
+
+ void init_targ();
+
+protected:
+ virtual void machine_start() override;
+
+ void targ_audio_1_w(uint8_t data);
+ void targ_audio_2_w(uint8_t data);
+
+private:
+ required_region_ptr<uint8_t> m_sound_prom;
+
+ uint8_t m_port_2_last;
+ uint8_t m_tone_pointer;
+
+ void targ_map(address_map &map);
+};
+
+
+class teetert_state : public exidy_state
+{
+public:
+ teetert_state(const machine_config &mconfig, device_type type, const char *tag) :
+ exidy_state(mconfig, type, tag),
+ m_dial(*this, "DIAL")
+ {
+ }
+
+ void teetert(machine_config &config);
+
+ DECLARE_CUSTOM_INPUT_MEMBER(teetert_input_r);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ required_ioport m_dial;
+ uint8_t m_last_dial;
+};
+
+
+class fax_state : public exidy_state
+{
+public:
+ fax_state(const machine_config &mconfig, device_type type, const char *tag) :
+ exidy_state(mconfig, type, tag),
+ m_rom_bank(*this, "bank1")
+ {
+ }
+
+ void fax(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ required_memory_bank m_rom_bank;
+
+ void fax_bank_select_w(uint8_t data);
+
+ void fax_map(address_map &map);
+};
+
+
/*************************************
*
* Special Teeter Torture input
*
*************************************/
-CUSTOM_INPUT_MEMBER(exidy_state::teetert_input_r)
+CUSTOM_INPUT_MEMBER(teetert_state::teetert_input_r)
{
- uint8_t dial = ioport("DIAL")->read();
- int result = 0;
+ uint8_t dial = m_dial->read();
- result = (dial != m_last_dial) << 4;
+ int result = (dial != m_last_dial) << 4;
if (result != 0)
{
if (((dial - m_last_dial) & 0xff) < 0x80)
@@ -190,9 +419,9 @@ CUSTOM_INPUT_MEMBER(exidy_state::teetert_input_r)
*
*************************************/
-void exidy_state::fax_bank_select_w(uint8_t data)
+void fax_state::fax_bank_select_w(uint8_t data)
{
- membank("bank1")->set_entry(data & 0x1f);
+ m_rom_bank->set_entry(data & 0x1f);
if ((data & 0x1f) > 0x17)
logerror("Banking to unpopulated ROM bank %02X!\n", data & 0x1f);
@@ -231,40 +460,40 @@ void exidy_state::exidy_map(address_map &map)
}
-void exidy_state::sidetrac_map(address_map &map)
+void spectar_state::sidetrac_map(address_map &map)
{
exidy_map(map);
map(0x0800, 0x3fff).rom();
map(0x4800, 0x4fff).rom();
- map(0x5200, 0x5200).w(FUNC(exidy_state::targ_audio_1_w));
- map(0x5201, 0x5201).w(FUNC(exidy_state::spectar_audio_2_w));
+ map(0x5200, 0x5200).w(FUNC(spectar_state::spectar_audio_1_w));
+ map(0x5201, 0x5201).w(FUNC(spectar_state::spectar_audio_2_w));
map(0xff00, 0xffff).rom().region("maincpu", 0x3f00);
}
-void exidy_state::targ_map(address_map &map)
+void targ_state::targ_map(address_map &map)
{
exidy_map(map);
map(0x0800, 0x3fff).rom();
map(0x4800, 0x4fff).ram().share("characterram");
- map(0x5200, 0x5200).w(FUNC(exidy_state::targ_audio_1_w));
- map(0x5201, 0x5201).w(FUNC(exidy_state::targ_audio_2_w));
+ map(0x5200, 0x5200).w(FUNC(targ_state::targ_audio_1_w));
+ map(0x5201, 0x5201).w(FUNC(targ_state::targ_audio_2_w));
map(0xff00, 0xffff).rom().region("maincpu", 0x3f00);
}
-void exidy_state::spectar_map(address_map &map)
+void spectar_state::spectar_map(address_map &map)
{
exidy_map(map);
map(0x0800, 0x3fff).rom();
map(0x4800, 0x4fff).ram().share("characterram");
- map(0x5200, 0x5200).w(FUNC(exidy_state::targ_audio_1_w));
- map(0x5201, 0x5201).w(FUNC(exidy_state::spectar_audio_2_w));
+ map(0x5200, 0x5200).w(FUNC(spectar_state::spectar_audio_1_w));
+ map(0x5201, 0x5201).w(FUNC(spectar_state::spectar_audio_2_w));
map(0xff00, 0xffff).rom().region("maincpu", 0x3f00);
}
-void exidy_state::rallys_map(address_map &map)
+void spectar_state::rallys_map(address_map &map)
{
map(0x0000, 0x03ff).ram();
map(0x0800, 0x3fff).rom();
@@ -276,9 +505,9 @@ void exidy_state::rallys_map(address_map &map)
map(0x5100, 0x5100).mirror(0x00fc).writeonly().share("spriteno");
map(0x5101, 0x5101).mirror(0x00fc).portr("IN0");
map(0x5101, 0x5101).mirror(0x00fc).writeonly().share("sprite_enable");
- map(0x5103, 0x5103).mirror(0x00fc).r(FUNC(exidy_state::exidy_interrupt_r));
- map(0x5200, 0x5200).w(FUNC(exidy_state::targ_audio_1_w));
- map(0x5201, 0x5201).w(FUNC(exidy_state::spectar_audio_2_w));
+ map(0x5103, 0x5103).mirror(0x00fc).r(FUNC(spectar_state::exidy_interrupt_r));
+ map(0x5200, 0x5200).w(FUNC(spectar_state::spectar_audio_1_w));
+ map(0x5201, 0x5201).w(FUNC(spectar_state::spectar_audio_2_w));
map(0x5210, 0x5212).writeonly().share("color_latch");
map(0x5213, 0x5213).portr("IN2");
map(0x5300, 0x5300).writeonly().share("sprite2_xpos");
@@ -287,6 +516,13 @@ void exidy_state::rallys_map(address_map &map)
}
+void spectar_state::phantoma_map(address_map &map)
+{
+ rallys_map(map);
+ map(0xf800, 0xffff).rom().region("maincpu", 0xf800); // the ROM is actually mapped high
+}
+
+
void exidy_state::venture_map(address_map &map)
{
exidy_map(map);
@@ -311,14 +547,14 @@ void exidy_state::mtrap_map(address_map &map)
map(0x5101, 0x5101).w(FUNC(exidy_state::mtrap_ocl_w));
}
-void exidy_state::fax_map(address_map &map)
+void fax_state::fax_map(address_map &map)
{
exidy_map(map);
map(0x0400, 0x07ff).ram();
map(0x1a00, 0x1a00).portr("IN4");
map(0x1c00, 0x1c00).portr("IN3");
- map(0x2000, 0x2000).w(FUNC(exidy_state::fax_bank_select_w));
- map(0x2000, 0x3fff).bankr("bank1");
+ map(0x2000, 0x2000).w(FUNC(fax_state::fax_bank_select_w));
+ map(0x2000, 0x3fff).bankr(m_rom_bank);
map(0x5200, 0x520f).rw("pia", FUNC(pia6821_device::read), FUNC(pia6821_device::write));
map(0x5213, 0x5217).nopw(); /* empty control lines on color/sound board */
map(0x6000, 0x6fff).ram().share("characterram");
@@ -639,7 +875,7 @@ static INPUT_PORTS_START( teetert )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 )
- PORT_BIT( 0x44, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(exidy_state, teetert_input_r)
+ PORT_BIT( 0x44, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(teetert_state, teetert_input_r)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -824,15 +1060,414 @@ GFXDECODE_END
/*************************************
*
+ * Video configuration
+ *
+ *************************************/
+
+void exidy_state::exidy_video_config(uint8_t _collision_mask, uint8_t _collision_invert, int _is_2bpp)
+{
+ m_collision_mask = _collision_mask;
+ m_collision_invert = _collision_invert;
+ m_is_2bpp = _is_2bpp;
+}
+
+
+
+/*************************************
+ *
+ * Video startup
+ *
+ *************************************/
+
+void exidy_state::video_start()
+{
+ m_screen->register_screen_bitmap(m_background_bitmap);
+ m_motion_object_1_vid.allocate(16, 16);
+ m_motion_object_2_vid.allocate(16, 16);
+ m_motion_object_2_clip.allocate(16, 16);
+
+ save_item(NAME(m_int_condition));
+ save_item(NAME(m_background_bitmap));
+ save_item(NAME(m_motion_object_1_vid));
+ save_item(NAME(m_motion_object_2_vid));
+ save_item(NAME(m_motion_object_2_clip));
+}
+
+
+
+/*************************************
+ *
+ * Interrupt generation
+ *
+ *************************************/
+
+inline void exidy_state::latch_condition(int collision)
+{
+ collision ^= m_collision_invert;
+ m_int_condition = (ioport("INTSOURCE")->read() & ~0x1c) | (collision & m_collision_mask);
+}
+
+
+INTERRUPT_GEN_MEMBER(exidy_state::exidy_vblank_interrupt)
+{
+ /* latch the current condition */
+ latch_condition(0);
+ m_int_condition &= ~0x80;
+
+ /* set the IRQ line */
+ device.execute().set_input_line(0, ASSERT_LINE);
+}
+
+
+
+uint8_t exidy_state::exidy_interrupt_r()
+{
+ /* clear any interrupts */
+ m_maincpu->set_input_line(0, CLEAR_LINE);
+
+ /* return the latched condition */
+ return m_int_condition;
+}
+
+
+
+/*************************************
+ *
+ * Palette handling
+ *
+ *************************************/
+
+inline void exidy_state::set_1_color(int index, int which)
+{
+ m_palette->set_pen_color(index,
+ pal1bit(m_color_latch[2] >> which),
+ pal1bit(m_color_latch[1] >> which),
+ pal1bit(m_color_latch[0] >> which));
+}
+
+void exidy_state::set_colors()
+{
+ /* motion object 1 */
+ set_1_color(0, 0);
+ set_1_color(1, 7);
+
+ /* motion object 2 */
+ set_1_color(2, 0);
+ set_1_color(3, 6);
+
+ /* characters */
+ set_1_color(4, 4);
+ set_1_color(5, 3);
+ set_1_color(6, 2);
+ set_1_color(7, 1);
+}
+
+
+
+/*************************************
+ *
+ * Background update
+ *
+ *************************************/
+
+void exidy_state::draw_background()
+{
+ const uint8_t *const cram = m_characterram ? &m_characterram[0] : memregion("maincpu")->base() + 0x4800;
+
+ pen_t off_pen = 0;
+
+ for (offs_t offs = 0; offs < 0x400; offs++)
+ {
+ uint8_t y = offs >> 5 << 3;
+ uint8_t const code = m_videoram[offs];
+
+ pen_t on_pen_1, on_pen_2;
+ if (m_is_2bpp)
+ {
+ on_pen_1 = 4 + ((code >> 6) & 0x02);
+ on_pen_2 = 5 + ((code >> 6) & 0x02);
+ }
+ else
+ {
+ on_pen_1 = 4 + ((code >> 6) & 0x03);
+ on_pen_2 = off_pen; /* unused */
+ }
+
+ for (uint8_t cy = 0; cy < 8; cy++)
+ {
+ uint8_t x = offs << 3;
+
+ if (m_is_2bpp)
+ {
+ uint8_t data1 = cram[0x000 | (code << 3) | cy];
+ uint8_t data2 = cram[0x800 | (code << 3) | cy];
+
+ for (int i = 0; i < 8; i++)
+ {
+ if (data1 & 0x80)
+ m_background_bitmap.pix(y, x) = (data2 & 0x80) ? on_pen_2 : on_pen_1;
+ else
+ m_background_bitmap.pix(y, x) = off_pen;
+
+ x++;
+ data1 <<= 1;
+ data2 <<= 1;
+ }
+ }
+ else // 1bpp
+ {
+ uint8_t data = cram[(code << 3) | cy];
+
+ for (int i = 0; i < 8; i++)
+ {
+ m_background_bitmap.pix(y, x) = (data & 0x80) ? on_pen_1 : off_pen;
+
+ x++;
+ data <<= 1;
+ }
+ }
+
+ y++;
+ }
+ }
+}
+
+
+
+/*************************************
+ *
+ * Sprite hardware
+ *
+ *************************************/
+
+inline int exidy_state::sprite_1_enabled()
+{
+ /* if the collision_mask is 0x00, then we are on old hardware that always has */
+ /* sprite 1 enabled regardless */
+ return (!(*m_sprite_enable & 0x80) || (*m_sprite_enable & 0x10) || (m_collision_mask == 0x00));
+}
+
+
+void exidy_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ /* draw sprite 2 first */
+ int sprite_set_2 = ((*m_sprite_enable & 0x40) != 0);
+
+ int sx = 236 - *m_sprite2_xpos - 4;
+ int sy = 244 - *m_sprite2_ypos - 4;
+
+ m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
+ ((*m_spriteno >> 4) & 0x0f) + 32 + 16 * sprite_set_2, 1,
+ 0, 0, sx, sy, 0);
+
+ /* draw sprite 1 next */
+ if (sprite_1_enabled())
+ {
+ int sprite_set_1 = ((*m_sprite_enable & 0x20) != 0);
+
+ sx = 236 - *m_sprite1_xpos - 4;
+ sy = 244 - *m_sprite1_ypos - 4;
+
+ if (sy < 0) sy = 0;
+
+ m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
+ (*m_spriteno & 0x0f) + 16 * sprite_set_1, 0,
+ 0, 0, sx, sy, 0);
+ }
+
+}
+
+
+
+/*************************************
+ *
+ * Collision detection
+ *
+ *************************************/
+
+/***************************************************************************
+
+ Exidy hardware checks for two types of collisions based on the video
+ signals. If the Motion Object 1 and Motion Object 2 signals are on at
+ the same time, an M1M2 collision bit gets set. If the Motion Object 1
+ and Background Character signals are on at the same time, an M1CHAR
+ collision bit gets set. So effectively, there's a pixel-by-pixel
+ collision check comparing Motion Object 1 (the player) to the
+ background and to the other Motion Object (typically a bad guy).
+
+***************************************************************************/
+
+void exidy_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_COLLISION_IRQ:
+ /* latch the collision bits */
+ latch_condition(param);
+
+ /* set the IRQ line */
+ m_maincpu->set_input_line(0, ASSERT_LINE);
+
+ break;
+ default:
+ throw emu_fatalerror("Unknown id in exidy_state::device_timer");
+ }
+}
+
+
+void exidy_state::check_collision()
+{
+ uint8_t sprite_set_1 = ((*m_sprite_enable & 0x20) != 0);
+ uint8_t sprite_set_2 = ((*m_sprite_enable & 0x40) != 0);
+ const rectangle clip(0, 15, 0, 15);
+ int org_1_x = 0, org_1_y = 0;
+ int org_2_x = 0, org_2_y = 0;
+ int count = 0;
+
+ /* if there is nothing to detect, bail */
+ if (m_collision_mask == 0)
+ return;
+
+ /* draw sprite 1 */
+ m_motion_object_1_vid.fill(0xff, clip);
+ if (sprite_1_enabled())
+ {
+ org_1_x = 236 - *m_sprite1_xpos - 4;
+ org_1_y = 244 - *m_sprite1_ypos - 4;
+ m_gfxdecode->gfx(0)->transpen(m_motion_object_1_vid,clip,
+ (*m_spriteno & 0x0f) + 16 * sprite_set_1, 0,
+ 0, 0, 0, 0, 0);
+ }
+
+ /* draw sprite 2 */
+ m_motion_object_2_vid.fill(0xff, clip);
+ org_2_x = 236 - *m_sprite2_xpos - 4;
+ org_2_y = 244 - *m_sprite2_ypos - 4;
+ m_gfxdecode->gfx(0)->transpen(m_motion_object_2_vid,clip,
+ ((*m_spriteno >> 4) & 0x0f) + 32 + 16 * sprite_set_2, 0,
+ 0, 0, 0, 0, 0);
+
+ /* draw sprite 2 clipped to sprite 1's location */
+ m_motion_object_2_clip.fill(0xff, clip);
+ if (sprite_1_enabled())
+ {
+ int sx = org_2_x - org_1_x;
+ int sy = org_2_y - org_1_y;
+ m_gfxdecode->gfx(0)->transpen(m_motion_object_2_clip,clip,
+ ((*m_spriteno >> 4) & 0x0f) + 32 + 16 * sprite_set_2, 0,
+ 0, 0, sx, sy, 0);
+ }
+
+ /* scan for collisions */
+ for (int sy = 0; sy < 16; sy++)
+ for (int sx = 0; sx < 16; sx++)
+ {
+ if (m_motion_object_1_vid.pix(sy, sx) != 0xff)
+ {
+ uint8_t current_collision_mask = 0;
+
+ /* check for background collision (M1CHAR) */
+ if (m_background_bitmap.pix(org_1_y + sy, org_1_x + sx) != 0)
+ current_collision_mask |= 0x04;
+
+ /* check for motion object collision (M1M2) */
+ if (m_motion_object_2_clip.pix(sy, sx) != 0xff)
+ current_collision_mask |= 0x10;
+
+ /* if we got one, trigger an interrupt */
+ if ((current_collision_mask & m_collision_mask) && (count++ < 128))
+ timer_set(m_screen->time_until_pos(org_1_x + sx, org_1_y + sy), TIMER_COLLISION_IRQ, current_collision_mask);
+ }
+
+ if (m_motion_object_2_vid.pix(sy, sx) != 0xff)
+ {
+ /* check for background collision (M2CHAR) */
+ if (m_background_bitmap.pix(org_2_y + sy, org_2_x + sx) != 0)
+ if ((m_collision_mask & 0x08) && (count++ < 128))
+ timer_set(m_screen->time_until_pos(org_2_x + sx, org_2_y + sy), TIMER_COLLISION_IRQ, 0x08);
+ }
+ }
+}
+
+
+
+/*************************************
+ *
+ * Standard screen refresh callback
+ *
+ *************************************/
+
+uint32_t exidy_state::screen_update_exidy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ /* refresh the colors from the palette (static or dynamic) */
+ set_colors();
+
+ /* update the background and draw it */
+ draw_background();
+ copybitmap(bitmap, m_background_bitmap, 0, 0, 0, 0, cliprect);
+
+ /* draw the sprites */
+ draw_sprites(bitmap, cliprect);
+
+ /* check for collision, this will set the appropriate bits in collision_mask */
+ check_collision();
+
+ return 0;
+}
+
+
+
+/*************************************
+ *
* Machine init
*
*************************************/
-MACHINE_START_MEMBER(exidy_state,teetert)
+void spectar_state::machine_start()
{
+ exidy_state::machine_start();
+
+ m_tone_freq = 0;
+ m_tone_active = 0;
+
+ /* start_raw can't be called here: chan.source will be set by
+ samples_device::device_start and then nulled out by samples_device::device_reset
+ at the soft_reset stage of init_machine() and will never be set again.
+ Thus, I've moved it to exidy_state::adjust_sample() were it will be set after
+ machine initialization. */
+ //m_samples->set_volume(3, 0);
+ //m_samples->start_raw(3, sine_wave, 32, 1000, true);
+
+ save_item(NAME(m_port_1_last));
+ save_item(NAME(m_tone_freq));
+ save_item(NAME(m_tone_active));
+}
+
+void targ_state::machine_start()
+{
+ spectar_state::machine_start();
+
+ m_tone_pointer = 0;
+
+ save_item(NAME(m_port_2_last));
+ save_item(NAME(m_tone_pointer));
+}
+
+void teetert_state::machine_start()
+{
+ exidy_state::machine_start();
+
save_item(NAME(m_last_dial));
}
+void fax_state::machine_start()
+{
+ exidy_state::machine_start();
+
+ m_rom_bank->configure_entries(0, 32, memregion("maincpu")->base() + 0x10000, 0x2000);
+}
+
+
/*************************************
*
* Machine drivers
@@ -841,11 +1476,11 @@ MACHINE_START_MEMBER(exidy_state,teetert)
void exidy_state::base(machine_config &config)
{
- /* basic machine hardware */
+ // basic machine hardware
M6502(config, m_maincpu, EXIDY_CPU_CLOCK);
m_maincpu->set_vblank_int("screen", FUNC(exidy_state::exidy_vblank_interrupt));
- /* video hardware */
+ // video hardware
GFXDECODE(config, m_gfxdecode, m_palette, gfx_exidy);
PALETTE(config, m_palette).set_entries(8);
@@ -857,48 +1492,77 @@ void exidy_state::base(machine_config &config)
}
-void exidy_state::sidetrac(machine_config &config)
+void spectar_state::sidetrac(machine_config &config)
{
+ static const char *const sample_names[] =
+ {
+ "*targ",
+ "expl",
+ "shot",
+ "sexpl",
+ "spslow",
+ "spfast",
+ nullptr
+ };
+
base(config);
- /* basic machine hardware */
- m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::sidetrac_map);
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &spectar_state::sidetrac_map);
+
+ // video hardware
+ exidy_video_config(0x00, 0x00, false);
+
+ // audio hardware
+ set_max_freq(525'000);
+
+ SPEAKER(config, "speaker").front_center();
+
+ SAMPLES(config, m_samples);
+ m_samples->set_channels(4);
+ m_samples->set_samples_names(sample_names);
+ m_samples->add_route(ALL_OUTPUTS, "speaker", 0.25);
- /* audio hardware */
- spectar_audio(config);
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
}
-void exidy_state::targ(machine_config &config)
+void targ_state::targ(machine_config &config)
{
- base(config);
+ sidetrac(config);
- /* basic machine hardware */
- m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::targ_map);
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &targ_state::targ_map);
- /* audio hardware */
- targ_audio(config);
+ // audio hardware
+ set_max_freq(125'000);
}
-void exidy_state::spectar(machine_config &config)
+void spectar_state::spectar(machine_config &config)
{
- base(config);
+ sidetrac(config);
- /* basic machine hardware */
- m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::spectar_map);
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &spectar_state::spectar_map);
+}
- /* audio hardware */
- spectar_audio(config);
+
+void spectar_state::rallys(machine_config &config)
+{
+ sidetrac(config);
+
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &spectar_state::rallys_map);
}
-void exidy_state::rallys(machine_config &config)
+void spectar_state::phantoma(machine_config &config)
{
- spectar(config);
+ sidetrac(config);
- /* basic machine hardware */
- m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::rallys_map);
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &spectar_state::phantoma_map);
}
@@ -906,12 +1570,15 @@ void exidy_state::venture(machine_config &config)
{
base(config);
- /* basic machine hardware */
+ // basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::venture_map);
config.set_maximum_quantum(attotime::from_hz(600));
- /* audio hardware */
+ // video hardware
+ exidy_video_config(0x04, 0x04, false);
+
+ // audio hardware
pia6821_device &pia(PIA6821(config, "pia", 0));
pia.writepa_handler().set("soundbd", FUNC(venture_sound_device::pb_w));
pia.writepb_handler().set("soundbd", FUNC(venture_sound_device::pa_w));
@@ -926,14 +1593,15 @@ void exidy_state::venture(machine_config &config)
}
-void exidy_state::teetert(machine_config &config)
+void teetert_state::teetert(machine_config &config)
{
venture(config);
- /* basic machine hardware */
- m_maincpu->set_periodic_int(FUNC(exidy_state::nmi_line_pulse), attotime::from_hz(10*60));
+ // basic machine hardware
+ m_maincpu->set_periodic_int(FUNC(teetert_state::nmi_line_pulse), attotime::from_hz(10*60));
- MCFG_MACHINE_START_OVERRIDE(exidy_state, teetert )
+ // video hardware
+ exidy_video_config(0x0c, 0x0c, false);
}
@@ -941,12 +1609,15 @@ void exidy_state::mtrap(machine_config &config)
{
base(config);
- /* basic machine hardware */
+ // basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::mtrap_map);
config.set_maximum_quantum(attotime::from_hz(1920));
- /* audio hardware */
+ // video hardware
+ exidy_video_config(0x14, 0x00, false);
+
+ // audio hardware
pia6821_device &pia(PIA6821(config, "pia", 0));
pia.writepa_handler().set("soundbd", FUNC(venture_sound_device::pb_w));
pia.writepb_handler().set("soundbd", FUNC(venture_sound_device::pa_w));
@@ -965,17 +1636,23 @@ void exidy_state::pepper2(machine_config &config)
{
venture(config);
- /* basic machine hardware */
+ // basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::pepper2_map);
+
+ // video hardware
+ exidy_video_config(0x14, 0x04, true);
}
-void exidy_state::fax(machine_config &config)
+void fax_state::fax(machine_config &config)
{
pepper2(config);
- /* basic machine hardware */
- m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::fax_map);
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &fax_state::fax_map);
+
+ // video hardware
+ exidy_video_config(0x04, 0x04, true);
}
/*************************************************************************
@@ -991,22 +1668,14 @@ void exidy_state::fax(machine_config &config)
3 = Tone generator
*/
-#define SPECTAR_MAXFREQ 525000
-#define TARG_MAXFREQ 125000
-
static const int16_t sine_wave[32] =
{
- 0x0f0f, 0x0f0f, 0x0f0f, 0x0606, 0x0606, 0x0909, 0x0909, 0x0606, 0x0606, 0x0909, 0x0606, 0x0d0d, 0x0f0f, 0x0f0f, 0x0d0d, 0x0000,
+ 0x0f0f, 0x0f0f, 0x0f0f, 0x0606, 0x0606, 0x0909, 0x0909, 0x0606, 0x0606, 0x0909, 0x0606, 0x0d0d, 0x0f0f, 0x0f0f, 0x0d0d, 0x0000,
-0x191a, -0x2122, -0x1e1f, -0x191a, -0x1314, -0x191a, -0x1819, -0x1819, -0x1819, -0x1314, -0x1314, -0x1314, -0x1819, -0x1e1f, -0x1e1f, -0x1819
};
-/* some macros to make detecting bit changes easier */
-#define RISING_EDGE(bit) ( (data & bit) && !(m_port_1_last & bit))
-#define FALLING_EDGE(bit) (!(data & bit) && (m_port_1_last & bit))
-
-
-void exidy_state::adjust_sample(uint8_t freq)
+void spectar_state::adjust_sample(uint8_t freq)
{
m_tone_freq = freq;
@@ -1026,18 +1695,20 @@ void exidy_state::adjust_sample(uint8_t freq)
}
-void exidy_state::targ_audio_1_w(uint8_t data)
+void spectar_state::spectar_audio_1_w(uint8_t data)
{
- /* CPU music */
+ // CPU music
if (BIT(m_port_1_last ^ data, 0))
m_dac->write(BIT(data, 0));
- /* shot */
- if (FALLING_EDGE(0x02) && !m_samples->playing(0)) m_samples->start(0,1);
- if (RISING_EDGE(0x02)) m_samples->start(0,1);
+ // shot
+ if (FALLING_EDGE(data, 0x02) && !m_samples->playing(0))
+ m_samples->start(0,1);
+ if (RISING_EDGE(data, 0x02))
+ m_samples->start(0,1);
- /* crash */
- if (RISING_EDGE(0x20))
+ // crash
+ if (RISING_EDGE(data, 0x20))
{
if (data & 0x40)
m_samples->start(1,0);
@@ -1045,7 +1716,7 @@ void exidy_state::targ_audio_1_w(uint8_t data)
m_samples->start(1,2);
}
- /* Sspec */
+ // Sspec
if (data & 0x10)
m_samples->stop(2);
else
@@ -1059,122 +1730,49 @@ void exidy_state::targ_audio_1_w(uint8_t data)
}
}
- /* Game (tone generator enable) */
- if (FALLING_EDGE(0x80))
+ // Game (tone generator enable)
+ if (FALLING_EDGE(data, 0x80))
{
- m_tone_pointer = 0;
m_tone_active = 0;
adjust_sample(m_tone_freq);
}
- if (RISING_EDGE(0x80))
- m_tone_active=1;
+ if (RISING_EDGE(data, 0x80))
+ m_tone_active = 1;
m_port_1_last = data;
}
-void exidy_state::targ_audio_2_w(uint8_t data)
-{
- if ((data & 0x01) && !(m_port_2_last & 0x01))
- {
- uint8_t *prom = memregion("targ")->base();
-
- m_tone_pointer = (m_tone_pointer + 1) & 0x0f;
-
- adjust_sample(prom[((data & 0x02) << 3) | m_tone_pointer]);
- }
-
- m_port_2_last = data;
-}
-
-
-void exidy_state::spectar_audio_2_w(uint8_t data)
+void spectar_state::spectar_audio_2_w(uint8_t data)
{
adjust_sample(data);
}
-static const char *const sample_names[] =
-{
- "*targ",
- "expl",
- "shot",
- "sexpl",
- "spslow",
- "spfast",
- nullptr
-};
-
-
-
-void exidy_state::common_audio_start(int freq)
-{
- m_max_freq = freq;
-
- m_tone_freq = 0;
- m_tone_active = 0;
-
- /* start_raw can't be called here: chan.source will be set by
- samples_device::device_start and then nulled out by samples_device::device_reset
- at the soft_reset stage of init_machine() and will never be set again.
- Thus, I've moved it to exidy_state::adjust_sample() were it will be set after
- machine initialization. */
- //m_samples->set_volume(3, 0);
- //m_samples->start_raw(3, sine_wave, 32, 1000, true);
-
- save_item(NAME(m_port_1_last));
- save_item(NAME(m_port_2_last));
- save_item(NAME(m_tone_freq));
- save_item(NAME(m_tone_active));
-}
-
-
-SAMPLES_START_CB_MEMBER(exidy_state::spectar_audio_start)
-{
- common_audio_start(SPECTAR_MAXFREQ);
-}
-
-
-SAMPLES_START_CB_MEMBER(exidy_state::targ_audio_start)
+void targ_state::targ_audio_1_w(uint8_t data)
{
- common_audio_start(TARG_MAXFREQ);
-
- m_tone_pointer = 0;
+ if (FALLING_EDGE(data, 0x80))
+ m_tone_pointer = 0;
- save_item(NAME(m_tone_pointer));
+ spectar_audio_1_w(data);
}
-void exidy_state::spectar_audio(machine_config &config)
+void targ_state::targ_audio_2_w(uint8_t data)
{
- SPEAKER(config, "speaker").front_center();
-
- SAMPLES(config, m_samples);
- m_samples->set_channels(4);
- m_samples->set_samples_names(sample_names);
- m_samples->set_samples_start_callback(FUNC(exidy_state::spectar_audio_start));
- m_samples->add_route(ALL_OUTPUTS, "speaker", 0.25);
-
- DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
-}
-
-void exidy_state::targ_audio(machine_config &config)
-{
- SPEAKER(config, "speaker").front_center();
+ if ((data & 0x01) && !(m_port_2_last & 0x01))
+ {
+ m_tone_pointer = (m_tone_pointer + 1) & 0x0f;
- SAMPLES(config, m_samples);
- m_samples->set_channels(4);
- m_samples->set_samples_names(sample_names);
- m_samples->set_samples_start_callback(FUNC(exidy_state::targ_audio_start));
- m_samples->add_route(ALL_OUTPUTS, "speaker", 0.25);
+ adjust_sample(m_sound_prom[((data & 0x02) << 3) | m_tone_pointer]);
+ }
- DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
+ m_port_2_last = data;
}
-
/*************************************
*
* ROM definitions
@@ -1878,94 +2476,33 @@ ROM_END
*
*************************************/
-void exidy_state::init_sidetrac()
+void spectar_state::init_sidetrac()
{
- exidy_video_config(0x00, 0x00, false);
-
- /* hard-coded palette controlled via 8x3 DIP switches on the board */
+ // hard-coded palette controlled via 8x3 DIP switches on the board
m_color_latch[2] = 0xf8;
m_color_latch[1] = 0xdc;
m_color_latch[0] = 0xb8;
}
-void exidy_state::init_targ()
+void targ_state::init_targ()
{
- exidy_video_config(0x00, 0x00, false);
-
- /* hard-coded palette controlled via 8x3 DIP switches on the board */
+ // hard-coded palette controlled via 8x3 DIP switches on the board
m_color_latch[2] = 0x5c;
m_color_latch[1] = 0xee;
m_color_latch[0] = 0x6b;
}
-void exidy_state::init_spectar()
-{
- exidy_video_config(0x00, 0x00, false);
-
- /* hard-coded palette controlled via 8x3 DIP switches on the board */
- m_color_latch[2] = 0x58;
- m_color_latch[1] = 0xee;
- m_color_latch[0] = 0x09;
-}
-
-void exidy_state::init_rallys()
-{
- exidy_video_config(0x00, 0x00, false);
-
- /* hard-coded palette controlled via 8x3 DIP switches on the board */
- m_color_latch[2] = 0x58;
- m_color_latch[1] = 0xee;
- m_color_latch[0] = 0x09;
-}
-
-void exidy_state::init_phantoma()
+void spectar_state::init_spectar()
{
- exidy_video_config(0x00, 0x00, false);
-
- /* hard-coded palette controlled via 8x3 DIP switches on the board */
+ // hard-coded palette controlled via 8x3 DIP switches on the board
m_color_latch[2] = 0x58;
m_color_latch[1] = 0xee;
m_color_latch[0] = 0x09;
-
- /* the ROM is actually mapped high */
- m_maincpu->space(AS_PROGRAM).install_rom(0xf800, 0xffff, memregion("maincpu")->base() + 0xf800);
}
-
-void exidy_state::init_mtrap()
-{
- exidy_video_config(0x14, 0x00, false);
-}
-
-
-void exidy_state::init_venture()
-{
- exidy_video_config(0x04, 0x04, false);
-}
-
-
-void exidy_state::init_teetert()
-{
- exidy_video_config(0x0c, 0x0c, false);
-}
-
-
-void exidy_state::init_pepper2()
-{
- exidy_video_config(0x14, 0x04, true);
-}
-
-
-void exidy_state::init_fax()
-{
- //address_space &space = m_maincpu->space(AS_PROGRAM);
-
- exidy_video_config(0x04, 0x04, true);
-
- membank("bank1")->configure_entries(0, 32, memregion("maincpu")->base() + 0x10000, 0x2000);
-}
+} // anonymous namespace
@@ -1975,38 +2512,38 @@ void exidy_state::init_fax()
*
*************************************/
-GAME( 1979, sidetrac, 0, sidetrac, sidetrac, exidy_state, init_sidetrac, ROT0, "Exidy", "Side Trak", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // "Side Track" on title screen, but cabinet/flyers/documentation clearly indicates otherwise, "Side Trak" it is
+GAME( 1979, sidetrac, 0, sidetrac, sidetrac, spectar_state, init_sidetrac, ROT0, "Exidy", "Side Trak", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // "Side Track" on title screen, but cabinet/flyers/documentation clearly indicates otherwise, "Side Trak" it is
-GAME( 1980, targ, 0, targ, targ, exidy_state, init_targ, ROT0, "Exidy", "Targ", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1980, targc, targ, targ, targ, exidy_state, init_targ, ROT0, "Exidy", "Targ (cocktail?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1980, targ, 0, targ, targ, targ_state, init_targ, ROT0, "Exidy", "Targ", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1980, targc, targ, targ, targ, targ_state, init_targ, ROT0, "Exidy", "Targ (cocktail?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1980, spectar, 0, spectar, spectar, exidy_state, init_spectar, ROT0, "Exidy", "Spectar (revision 3)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1980, spectar1, spectar, spectar, spectar, exidy_state, init_spectar, ROT0, "Exidy", "Spectar (revision 1?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1984, spectarrf, spectar, spectar, spectarrf, exidy_state, init_spectar, ROT0, "bootleg (Recreativos Franco)", "Spectar (revision 2, bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1980, rallys, spectar, rallys, rallys, exidy_state, init_rallys, ROT0, "bootleg (Novar)", "Rallys (bootleg of Spectar, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1980, rallysa, spectar, rallys, rallys, exidy_state, init_rallys, ROT0, "bootleg (Musik Box Brescia)", "Rallys (bootleg of Spectar, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1980, panzer, spectar, rallys, rallys, exidy_state, init_rallys, ROT0, "bootleg (Proel)", "Panzer (bootleg of Spectar)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1980, phantoma, spectar, rallys, phantoma, exidy_state, init_phantoma, ROT0, "bootleg (Jeutel)", "Phantomas (bootleg of Spectar)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1980, phantom, spectar, rallys, phantoma, exidy_state, init_phantoma, ROT0, "bootleg (Proel)", "Phantom (bootleg of Spectar)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1980, spectar, 0, spectar, spectar, spectar_state, init_spectar, ROT0, "Exidy", "Spectar (revision 3)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1980, spectar1, spectar, spectar, spectar, spectar_state, init_spectar, ROT0, "Exidy", "Spectar (revision 1?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1984, spectarrf, spectar, spectar, spectarrf, spectar_state, init_spectar, ROT0, "bootleg (Recreativos Franco)", "Spectar (revision 2, bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1980, rallys, spectar, rallys, rallys, spectar_state, init_spectar, ROT0, "bootleg (Novar)", "Rallys (bootleg of Spectar, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1980, rallysa, spectar, rallys, rallys, spectar_state, init_spectar, ROT0, "bootleg (Musik Box Brescia)", "Rallys (bootleg of Spectar, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1980, panzer, spectar, rallys, rallys, spectar_state, init_spectar, ROT0, "bootleg (Proel)", "Panzer (bootleg of Spectar)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1980, phantoma, spectar, phantoma, phantoma, spectar_state, init_spectar, ROT0, "bootleg (Jeutel)", "Phantomas (bootleg of Spectar)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1980, phantom, spectar, phantoma, phantoma, spectar_state, init_spectar, ROT0, "bootleg (Proel)", "Phantom (bootleg of Spectar)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1981, mtrap, 0, mtrap, mtrap, exidy_state, init_mtrap, ROT0, "Exidy", "Mouse Trap (version 5)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, mtrap4, mtrap, mtrap, mtrap, exidy_state, init_mtrap, ROT0, "Exidy", "Mouse Trap (version 4)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, mtrap3, mtrap, mtrap, mtrap, exidy_state, init_mtrap, ROT0, "Exidy", "Mouse Trap (version 3)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, mtrap2, mtrap, mtrap, mtrap, exidy_state, init_mtrap, ROT0, "Exidy", "Mouse Trap (version 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, mtrapb, mtrap, mtrap, mtrap, exidy_state, init_mtrap, ROT0, "bootleg", "Mouse Trap (bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, mtrapb2, mtrap, mtrap, mtrap, exidy_state, init_mtrap, ROT0, "bootleg", "Mouse Trap (version 4, bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, mtrap, 0, mtrap, mtrap, exidy_state, empty_init, ROT0, "Exidy", "Mouse Trap (version 5)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, mtrap4, mtrap, mtrap, mtrap, exidy_state, empty_init, ROT0, "Exidy", "Mouse Trap (version 4)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, mtrap3, mtrap, mtrap, mtrap, exidy_state, empty_init, ROT0, "Exidy", "Mouse Trap (version 3)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, mtrap2, mtrap, mtrap, mtrap, exidy_state, empty_init, ROT0, "Exidy", "Mouse Trap (version 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, mtrapb, mtrap, mtrap, mtrap, exidy_state, empty_init, ROT0, "bootleg", "Mouse Trap (bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, mtrapb2, mtrap, mtrap, mtrap, exidy_state, empty_init, ROT0, "bootleg", "Mouse Trap (version 4, bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, venture, 0, venture, venture, exidy_state, init_venture, ROT0, "Exidy", "Venture (version 5 set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, venture5a, venture, venture, venture, exidy_state, init_venture, ROT0, "Exidy", "Venture (version 5 set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, venture4, venture, venture, venture, exidy_state, init_venture, ROT0, "Exidy", "Venture (version 4)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, venture5b, venture, venture, venture, exidy_state, init_venture, ROT0, "bootleg", "Venture (version 5 set 2, bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, venture, 0, venture, venture, exidy_state, empty_init, ROT0, "Exidy", "Venture (version 5 set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, venture5a, venture, venture, venture, exidy_state, empty_init, ROT0, "Exidy", "Venture (version 5 set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, venture4, venture, venture, venture, exidy_state, empty_init, ROT0, "Exidy", "Venture (version 4)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, venture5b, venture, venture, venture, exidy_state, empty_init, ROT0, "bootleg", "Venture (version 5 set 2, bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1982, teetert, 0, teetert, teetert, exidy_state, init_teetert, ROT0, "Exidy", "Teeter Torture (prototype)", MACHINE_SUPPORTS_SAVE )
+GAME( 1982, teetert, 0, teetert, teetert, teetert_state, empty_init, ROT0, "Exidy", "Teeter Torture (prototype)", MACHINE_SUPPORTS_SAVE )
-GAME( 1982, pepper2, 0, pepper2, pepper2, exidy_state, init_pepper2, ROT0, "Exidy", "Pepper II (version 8)", MACHINE_SUPPORTS_SAVE )
-GAME( 1982, pepper27, pepper2, pepper2, pepper2, exidy_state, init_pepper2, ROT0, "Exidy", "Pepper II (version 7)", MACHINE_SUPPORTS_SAVE )
+GAME( 1982, pepper2, 0, pepper2, pepper2, exidy_state, empty_init, ROT0, "Exidy", "Pepper II (version 8)", MACHINE_SUPPORTS_SAVE )
+GAME( 1982, pepper27, pepper2, pepper2, pepper2, exidy_state, empty_init, ROT0, "Exidy", "Pepper II (version 7)", MACHINE_SUPPORTS_SAVE )
-GAME( 1982, hardhat, 0, pepper2, pepper2, exidy_state, init_pepper2, ROT0, "Exidy", "Hard Hat", MACHINE_SUPPORTS_SAVE )
+GAME( 1982, hardhat, 0, pepper2, pepper2, exidy_state, empty_init, ROT0, "Exidy", "Hard Hat", MACHINE_SUPPORTS_SAVE )
-GAME( 1983, fax, 0, fax, fax, exidy_state, init_fax, ROT0, "Exidy", "FAX", MACHINE_SUPPORTS_SAVE )
-GAME( 1983, fax2, fax, fax, fax, exidy_state, init_fax, ROT0, "Exidy", "FAX 2", MACHINE_SUPPORTS_SAVE )
+GAME( 1983, fax, 0, fax, fax, fax_state, empty_init, ROT0, "Exidy", "FAX", MACHINE_SUPPORTS_SAVE )
+GAME( 1983, fax2, fax, fax, fax, fax_state, empty_init, ROT0, "Exidy", "FAX 2", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/f-32.cpp b/src/mame/drivers/f-32.cpp
index 2926e7e6845..07cf21529dd 100644
--- a/src/mame/drivers/f-32.cpp
+++ b/src/mame/drivers/f-32.cpp
@@ -12,60 +12,134 @@
driver by Pierpaolo Prazzoli
-*********************************************************************/
-
-/*
-royalpk2 : to get 'secret. OK.'
+ Outputs for Royal Poker 2 (royalpk2):
+ 0: High button
+ 1: Stop button
+ 2: Double Up button
+ 3: Low button *and* Bet button
+ 4: Max Bet button
+ 5: Change button
+ 6: Gift button
+ 7: Hold 1 button
+ 8: Hold 2 button
+ 9: Hold 3 button
+ 10: Hold 4 button
+ 11: Hold 5 button
+ 12: Hold Clear button
+ 13: Staff Call button
+ 14: Start / Deal / Draw button
+ 15: Half Double button
+ 16: 2x Double button
+ 17: Gift 1 lamp
+ 18: Gift 2 lamp
+ 19: Gift 3 lamp
+ 20: 'Medal' (coin output) lamp
+ 21: Counter 1 lamp
+ 22: Counter 2 lamp
+ 23: Counter 3 lamp
+ 24: Counter 4 lamp
+ 25: Counter 5 lamp
+ 26: Light 1 lamp
+ 27: Light 2 lamp
+ 28: Light 3 lamp
+ 29: Light 4 lamp
+ 30: Light 5 lamp
+
+ TODO: royalpk2 is marked non-working, as the machine will soft-lock
+ when attempting to use either settings-save options in the service
+ menu.
-0002D92C: MOV L18, L29
-0002D92E: CMPI L18, $1
-0002D930: BNE $2d94c
-
-go 2d92c
-do l29 = 1
-f5
-
-*/
+*********************************************************************/
#include "emu.h"
#include "cpu/e132xs/e132xs.h"
#include "machine/eepromser.h"
+#include "machine/nvram.h"
+#include "machine/ticket.h"
#include "sound/okim6295.h"
#include "sound/ymopm.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
+namespace {
-class mosaicf2_state : public driver_device
+class fe132_state : public driver_device
{
public:
- mosaicf2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fe132_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu") ,
- m_videoram(*this, "videoram")
+ m_maincpu(*this, "maincpu"),
+ m_eeprom(*this, "eeprom"),
+ m_videoram(*this, "videoram"),
+ m_p1(*this, "P1"),
+ m_system_p2(*this, "SYSTEM_P2")
{ }
- void mosaicf2(machine_config &config);
- void royalpk2(machine_config &config);
+protected:
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void common_map(address_map &map);
-private:
- /* devices */
required_device<hyperstone_device> m_maincpu;
-
- /* memory pointers */
+ required_device<eeprom_serial_93cxx_device> m_eeprom;
required_shared_ptr<uint32_t> m_videoram;
+ required_ioport m_p1;
+ required_ioport m_system_p2;
+};
- uint32_t f32_input_port_1_r();
- uint32_t screen_update_mosaicf2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void common_map(address_map &map);
+class mosaicf2_state : public fe132_state
+{
+public:
+ mosaicf2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fe132_state(mconfig, type, tag)
+ { }
+
+ void mosaicf2(machine_config &config);
+
+protected:
+ uint32_t input_port_1_r();
void mosaicf2_io(address_map &map);
+};
+
+class royalpk2_state : public fe132_state
+{
+public:
+ royalpk2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fe132_state(mconfig, type, tag),
+ m_nvram(*this, "nvram"),
+ m_hopper(*this, "hopper"),
+ m_lamps(*this, "lamps%u", 0U),
+ m_okibank(*this, "okibank")
+ { }
+
+ void royalpk2(machine_config &config);
+
+ int hopper_r();
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
void royalpk2_io(address_map &map);
void royalpk2_map(address_map &map);
-};
+ void oki_map(address_map &map);
+
+ void protection_seed_w(offs_t offset, uint32_t data);
+ uint32_t protection_response_r();
+
+ template <int Bank> void outputs_w(uint32_t data);
+ required_device<nvram_device> m_nvram;
+ required_device<hopper_device> m_hopper;
+ output_finder<31> m_lamps;
+ required_memory_bank m_okibank;
+
+ uint16_t m_protection_index;
+ uint8_t m_protection_response_byte;
+ int m_protection_response_bit;
+};
-uint32_t mosaicf2_state::screen_update_mosaicf2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+uint32_t fe132_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (offs_t offs = 0; offs < 0x10000; offs++)
{
@@ -84,7 +158,7 @@ uint32_t mosaicf2_state::screen_update_mosaicf2(screen_device &screen, bitmap_in
-void mosaicf2_state::common_map(address_map &map)
+void fe132_state::common_map(address_map &map)
{
map(0x00000000, 0x001fffff).ram();
map(0x40000000, 0x4003ffff).ram().share("videoram");
@@ -92,15 +166,15 @@ void mosaicf2_state::common_map(address_map &map)
map(0xfff00000, 0xffffffff).rom().region("user1", 0);
}
-uint32_t mosaicf2_state::f32_input_port_1_r()
+uint32_t mosaicf2_state::input_port_1_r()
{
- /* burn a bunch of cycles because this is polled frequently during busy loops */
+ // burn a bunch of cycles because this is polled frequently during busy loops
offs_t pc = m_maincpu->pc();
- if ((pc == 0x000379de) || (pc == 0x000379cc) )
+ if (pc == 0x000379de || pc == 0x000379cc)
m_maincpu->eat_cycles(100);
//else printf("PC %08x\n", pc );
- return ioport("SYSTEM_P2")->read();
+ return m_system_p2->read();
}
@@ -109,7 +183,7 @@ void mosaicf2_state::mosaicf2_io(address_map &map)
map(0x4003, 0x4003).r("oki", FUNC(okim6295_device::read));
map(0x4813, 0x4813).r("ymsnd", FUNC(ym2151_device::status_r));
map(0x5000, 0x5003).portr("P1");
- map(0x5200, 0x5203).r(FUNC(mosaicf2_state::f32_input_port_1_r));
+ map(0x5200, 0x5203).r(FUNC(mosaicf2_state::input_port_1_r));
map(0x5400, 0x5403).portr("EEPROMIN");
map(0x6003, 0x6003).w("oki", FUNC(okim6295_device::write));
map(0x6803, 0x6803).w("ymsnd", FUNC(ym2151_device::data_w));
@@ -174,9 +248,9 @@ void mosaicf2_state::mosaicf2(machine_config &config)
m_maincpu->set_addrmap(AS_IO, &mosaicf2_state::mosaicf2_io);
m_maincpu->set_vblank_int("screen", FUNC(mosaicf2_state::irq0_line_hold));
- EEPROM_93C46_16BIT(config, "eeprom")
- .erase_time(attotime::from_usec(1))
- .write_time(attotime::from_usec(1));
+ EEPROM_93C46_16BIT(config, m_eeprom);
+ m_eeprom->erase_time(attotime::from_usec(1));
+ m_eeprom->write_time(attotime::from_usec(1));
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -184,7 +258,7 @@ void mosaicf2_state::mosaicf2(machine_config &config)
screen.set_vblank_time(subseconds::from_usec(2500) /* not accurate */);
screen.set_size(512, 512);
screen.set_visarea(0, 319, 0, 223);
- screen.set_screen_update(FUNC(mosaicf2_state::screen_update_mosaicf2));
+ screen.set_screen_update(FUNC(mosaicf2_state::screen_update));
screen.set_palette("palette");
PALETTE(config, "palette", palette_device::RGB_555);
@@ -206,13 +280,45 @@ void mosaicf2_state::mosaicf2(machine_config &config)
static INPUT_PORTS_START( royalpk2 )
PORT_START("P1")
+ PORT_BIT( 0x0000ffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_GAMBLE_HIGH )
+ PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_GAMBLE_LOW )
+ PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT )
+ PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_GAMBLE_D_UP )
+ PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_GAMBLE_BET )
+ PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Max Bet")
+ PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Change")
+ PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Gift")
+ PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_POKER_HOLD1 )
+ PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_POKER_HOLD2 )
+ PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_POKER_HOLD3 )
+ PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_POKER_HOLD4 )
+ PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_POKER_HOLD5 )
+ PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_POKER_CANCEL )
+ PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Staff Call") PORT_CODE(KEYCODE_Q)
+ PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL ) PORT_NAME("Start/Deal/Draw") PORT_CODE(KEYCODE_1)
PORT_START("SYSTEM_P2")
+ PORT_BIT( 0x0000ffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_GAMBLE_HALF )
+ PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("2x Double") PORT_CODE(KEYCODE_4)
+ PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("Credit Clear") PORT_CODE(KEYCODE_W)
+ PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("Credit Pay Out") PORT_CODE(KEYCODE_E)
+ PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("Income") PORT_CODE(KEYCODE_R)
+ PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_NAME("Income Clear") PORT_CODE(KEYCODE_T)
+ PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_GAMBLE_SERVICE )
PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen")
- PORT_BIT( 0xff7fffff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_COIN3 )
+ PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_NAME("Medal Clear") PORT_CODE(KEYCODE_Y)
+ PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_BUTTON11 ) PORT_NAME("Operator Gift") PORT_CODE(KEYCODE_U)
+ PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(royalpk2_state, hopper_r)
+ PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_BUTTON13 ) PORT_NAME("Over Flow") PORT_CODE(KEYCODE_O)
+ PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_BUTTON14 ) PORT_NAME("Medal Empty") PORT_CODE(KEYCODE_L)
PORT_START( "EEPROMIN" )
- PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read)
+ PORT_BIT( 0x00000080, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read)
PORT_START( "EEPROMOUT" )
PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, di_write)
@@ -224,9 +330,7 @@ static INPUT_PORTS_START( royalpk2 )
PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, cs_write)
INPUT_PORTS_END
-
-
-void mosaicf2_state::royalpk2_map(address_map &map)
+void royalpk2_state::royalpk2_map(address_map &map)
{
map(0x00000000, 0x003fffff).ram();
map(0x40000000, 0x4003ffff).ram().share("videoram");
@@ -234,28 +338,146 @@ void mosaicf2_state::royalpk2_map(address_map &map)
map(0xfff00000, 0xffffffff).rom().region("user1", 0);
}
-void mosaicf2_state::royalpk2_io(address_map &map)
+int royalpk2_state::hopper_r()
+{
+ return m_hopper->line_r() ? 0 : 1;
+}
+
+void royalpk2_state::royalpk2_io(address_map &map)
{
+ // map(0x4000, 0x41ff).readonly().share("nvram"); // seems to expect to read NVRAM from here
+
+ map(0x4603, 0x4603).r("oki", FUNC(okim6295_device::read));
+
+ map(0x4800, 0x4803).portr("P1");
map(0x4900, 0x4903).portr("SYSTEM_P2");
map(0x4a00, 0x4a03).portr("EEPROMIN");
+ map(0x4b00, 0x4b03).r(FUNC(royalpk2_state::protection_response_r));
+
+ map(0x6000, 0x61ff).ram().share("nvram");
+
+ map(0x6603, 0x6603).w("oki", FUNC(okim6295_device::write));
+
map(0x6800, 0x6803).portw("EEPROMCLK");
map(0x6900, 0x6903).portw("EEPROMCS");
map(0x6a00, 0x6a03).portw("EEPROMOUT");
+
+ // map(0x6b00, 0x6b03).nopw(); // bits 8, 9, 10 and 13, 14 used
+
+ map(0x6c03, 0x6c03).lw8(NAME([this] (uint8_t data) { m_okibank->set_entry(data & 0x03); })); // TODO: double check this
+
+ map(0x6d00, 0x6d03).w(FUNC(royalpk2_state::protection_seed_w));
+
+ map(0x7000, 0x7003).w(FUNC(royalpk2_state::outputs_w<0>));
+ map(0x7100, 0x7103).w(FUNC(royalpk2_state::outputs_w<1>));
+ map(0x7200, 0x7203).w(FUNC(royalpk2_state::outputs_w<2>));
+ map(0x7300, 0x7303).w(FUNC(royalpk2_state::outputs_w<3>));
+ map(0x7400, 0x7403).w(FUNC(royalpk2_state::outputs_w<4>));
}
-void mosaicf2_state::royalpk2(machine_config &config)
+void royalpk2_state::oki_map(address_map &map)
+{
+ map(0x00000, 0x1ffff).rom();
+ map(0x20000, 0x3ffff).bankr(m_okibank);
+}
+
+void royalpk2_state::machine_start()
+{
+ save_item(NAME(m_protection_index));
+ save_item(NAME(m_protection_response_byte));
+ save_item(NAME(m_protection_response_bit));
+
+ m_lamps.resolve();
+
+ for (int i = 0; i < 31; i++)
+ m_lamps[i] = 0;
+
+ m_okibank->configure_entries(0, 4, memregion("oki")->base(), 0x20000);
+}
+
+void royalpk2_state::machine_reset()
+{
+ m_protection_index = 0;
+ m_protection_response_byte = 0;
+ m_protection_response_bit = 0;
+}
+
+void royalpk2_state::protection_seed_w(offs_t offset, uint32_t data)
+{
+ if ((m_protection_index % 2) == 0)
+ m_protection_response_byte = 0x85;
+ else if ((m_protection_index % 2) == 1)
+ m_protection_response_byte = 0x81;
+
+ m_protection_index++;
+ m_protection_response_bit = 7;
+}
+
+uint32_t royalpk2_state::protection_response_r()
+{
+ uint32_t data = BIT(m_protection_response_byte, m_protection_response_bit) << 6;
+ if (m_protection_response_bit > 0)
+ {
+ m_protection_response_bit--;
+ }
+ else
+ {
+ logerror("Protection response byte fully sent.\n");
+ }
+ return data;
+}
+
+template <int Bank>
+void royalpk2_state::outputs_w(uint32_t data)
+{
+ // TODO: Lamps 26 to 30 occupy multiple bits of a given output port. Find out if it's due to brightness control or something else.
+
+ switch (Bank)
+ {
+ case 0:
+ m_lamps[0] = BIT(data, 8);
+ for (int i = 0; i < 6; i++)
+ m_lamps[1 + i] = BIT(data, 10 + i);
+ break;
+ case 1:
+ for (int i = 0; i < 8; i++)
+ m_lamps[7 + i] = BIT(data, 8 + i);
+ break;
+ case 2:
+ for (int i = 0; i < 8; i++)
+ m_lamps[15 + i] = BIT(data, 8 + i);
+ break;
+ case 3:
+ for (int i = 0; i < 3; i++)
+ m_lamps[23 + i] = BIT(data, 8 + i);
+ m_lamps[26] = (data & 0x3000) ? 1 : 0;
+ m_lamps[27] = (data & 0xc000) ? 1 : 0;
+ break;
+ case 4:
+ m_lamps[28] = (data & 0x0f00) ? 1 : 0;
+ m_lamps[29] = (data & 0x3000) ? 1 : 0;
+ m_lamps[30] = (data & 0xc000) ? 1 : 0;
+ break;
+ }
+}
+
+void royalpk2_state::royalpk2(machine_config &config)
{
/* basic machine hardware */
GMS30C2132(config, m_maincpu, XTAL(50'000'000));
- m_maincpu->set_addrmap(AS_PROGRAM, &mosaicf2_state::royalpk2_map);
- m_maincpu->set_addrmap(AS_IO, &mosaicf2_state::royalpk2_io);
- m_maincpu->set_vblank_int("screen", FUNC(mosaicf2_state::irq1_line_hold));
+ m_maincpu->set_addrmap(AS_PROGRAM, &royalpk2_state::royalpk2_map);
+ m_maincpu->set_addrmap(AS_IO, &royalpk2_state::royalpk2_io);
+ m_maincpu->set_vblank_int("screen", FUNC(royalpk2_state::irq1_line_hold));
+
+ EEPROM_93C46_16BIT(config, m_eeprom);
+ m_eeprom->erase_time(attotime::from_usec(1));
+ m_eeprom->write_time(attotime::from_usec(1));
+
+ NVRAM(config, m_nvram, nvram_device::DEFAULT_ALL_0);
- EEPROM_93C46_16BIT(config, "eeprom")
- .erase_time(attotime::from_usec(1))
- .write_time(attotime::from_usec(1));
+ HOPPER(config, m_hopper, attotime::from_msec(100), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW);
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -263,7 +485,7 @@ void mosaicf2_state::royalpk2(machine_config &config)
screen.set_vblank_time(subseconds::from_usec(2500) /* not accurate */);
screen.set_size(512, 512);
screen.set_visarea(0, 319, 0, 223);
- screen.set_screen_update(FUNC(mosaicf2_state::screen_update_mosaicf2));
+ screen.set_screen_update(FUNC(royalpk2_state::screen_update));
screen.set_palette("palette");
PALETTE(config, "palette", palette_device::RGB_555);
@@ -277,6 +499,7 @@ void mosaicf2_state::royalpk2(machine_config &config)
// ymsnd.add_route(1, "rspeaker", 1.0);
okim6295_device &oki(OKIM6295(config, "oki", XTAL(14'318'181)/8, okim6295_device::PIN7_HIGH)); /* 1.7897725 MHz */
+ oki.set_addrmap(0, &royalpk2_state::oki_map);
oki.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
oki.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
@@ -336,7 +559,7 @@ S1 is the setup button
VRAML & VRAMU are KM6161002CJ-12
DRAML & DRAMU are GM71C18163CJ6
-ROM1 & SND are stardard 27C040 and/or 27C020 eproms
+ROM1 & SND are standard 27C040 and/or 27C020 eproms
L00-L03 & U00-U03 are 29F1610ML Flash roms
@@ -377,6 +600,7 @@ ROM_START( royalpk2 )
ROM_LOAD( "snd2", 0x000000, 0x080000, CRC(f25e3315) SHA1(ce5350ecba6769b17bb01d82b55f26ded4d51773) )
ROM_END
+} // anonymous namespace
GAME( 1999, mosaicf2, 0, mosaicf2, mosaicf2, mosaicf2_state, empty_init, ROT0, "F2 System", "Mosaic (F2 System)", MACHINE_SUPPORTS_SAVE )
-GAME( 1999, royalpk2, 0, royalpk2, royalpk2, mosaicf2_state, empty_init, ROT0, "F2 System", "Royal Poker 2 (Network version 3.12)", MACHINE_NOT_WORKING )
+GAME( 1999, royalpk2, 0, royalpk2, royalpk2, royalpk2_state, empty_init, ROT0, "F2 System", "Royal Poker 2 (Network version 3.12)", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/fidel_card.cpp b/src/mame/drivers/fidel_card.cpp
index 14ce3145ea6..b653c8b86e1 100644
--- a/src/mame/drivers/fidel_card.cpp
+++ b/src/mame/drivers/fidel_card.cpp
@@ -584,7 +584,7 @@ void card_state::brc_base(machine_config &config)
m_mcu->t0_in_cb().set(FUNC(card_state::mcu_t0_r));
// MCU T1 tied to master clock / 4
- CLOCK(config, "t1_clock", 5_MHz_XTAL/4).signal_handler().set_nop();
+ CLOCK(config, "t1_clock", 5_MHz_XTAL/4);
m_mcu->t1_in_cb().set("t1_clock", FUNC(clock_device::signal_r)).invert();
I8243(config, m_i8243);
diff --git a/src/mame/drivers/flstory.cpp b/src/mame/drivers/flstory.cpp
index 929c580f122..a2d611ae1ba 100644
--- a/src/mame/drivers/flstory.cpp
+++ b/src/mame/drivers/flstory.cpp
@@ -855,6 +855,7 @@ void flstory_state::rumba(machine_config &config)
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &flstory_state::rumba_map);
+ m_maincpu->set_clock(XTAL(8'000'000) / 2); // verified on PCB
TAITO68705_MCU(config, m_bmcu, XTAL(18'432'000)/6); /* ? */
diff --git a/src/mame/drivers/force68k.cpp b/src/mame/drivers/force68k.cpp
index 47e7fe73f48..88b41fb6aad 100644
--- a/src/mame/drivers/force68k.cpp
+++ b/src/mame/drivers/force68k.cpp
@@ -382,7 +382,7 @@ void force68k_state::machine_start ()
m_usrrom = (uint16_t*)m_cart->get_rom_base();
#if 0 // This should be the correct way but produces odd and even bytes swapped
m_maincpu->space(AS_PROGRAM).install_read_handler(0xa0000, 0xbffff, read16sm_delegate(*m_cart, FUNC(generic_slot_device::read16_rom)));
-#else // So we installs a custom very inefficient handler for now until we understand hop to solve the problem better
+#else // So we install a custom very inefficient handler for now until we understand how to solve the problem better
m_maincpu->space(AS_PROGRAM).install_read_handler(0xa0000, 0xbffff, read16sm_delegate(*this, FUNC(force68k_state::read16_rom)));
#endif
}
@@ -514,7 +514,7 @@ image_init_result force68k_state::force68k_load_cart(device_image_interface &ima
if (size > 0x20000) // Max 128Kb
{
LOG("Cartridge size exceeding max size (128Kb): %d\n", size);
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Cartridge size exceeding max size (128Kb)");
+ image.seterror(image_error::INVALIDIMAGE, "Cartridge size exceeding max size (128Kb)");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/funkyjet.cpp b/src/mame/drivers/funkyjet.cpp
index e31986a7183..8dca7fe6eda 100644
--- a/src/mame/drivers/funkyjet.cpp
+++ b/src/mame/drivers/funkyjet.cpp
@@ -92,19 +92,98 @@ Notes:
***************************************************************************/
#include "emu.h"
-#include "includes/funkyjet.h"
+#include "machine/deco146.h"
+#include "video/deco16ic.h"
+#include "video/decospr.h"
+
+#include "cpu/h6280/h6280.h"
#include "cpu/m68000/m68000.h"
#include "machine/decocrpt.h"
#include "machine/gen_latch.h"
#include "sound/okim6295.h"
#include "sound/ymopm.h"
+
#include "emupal.h"
+#include "screen.h"
#include "speaker.h"
+namespace {
+
+class funkyjet_state : public driver_device
+{
+public:
+ funkyjet_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_spriteram(*this, "spriteram")
+ , m_pf_rowscroll(*this, "pf%u_rowscroll", 1)
+ , m_screen(*this, "screen")
+ , m_maincpu(*this, "maincpu")
+ , m_audiocpu(*this, "audiocpu")
+ , m_deco146(*this, "ioprot")
+ , m_sprgen(*this, "spritegen")
+ , m_deco_tilegen(*this, "tilegen")
+ { }
+
+ void funkyjet(machine_config &config);
+
+ void init_funkyjet();
+
+private:
+ // memory pointers
+ required_shared_ptr<uint16_t> m_spriteram;
+ required_shared_ptr_array<uint16_t, 2> m_pf_rowscroll;
+
+ // devices
+ required_device<screen_device> m_screen;
+ required_device<cpu_device> m_maincpu;
+ required_device<h6280_device> m_audiocpu;
+ required_device<deco146_device> m_deco146;
+ required_device<decospr_device> m_sprgen;
+ required_device<deco16ic_device> m_deco_tilegen;
+
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ uint16_t protection_region_0_146_r(offs_t offset);
+ void protection_region_0_146_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+ void maincpu_map(address_map &map);
+ void sound_map(address_map &map);
+};
+
/******************************************************************************/
-uint16_t funkyjet_state::funkyjet_protection_region_0_146_r(offs_t offset)
+uint32_t funkyjet_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ // Similar to chinatwn and tumblep, see video/supbtime.cpp
+ //
+ // This causes a 2 pixel gap on the left side of the first stage of all worlds in funkyjet
+ // but allows subsequent stages to be centered and avoids corruption on the world select
+ // screen after each world. It also correctly aligns the graphics in sotsugyo.
+ //
+ // The 2 pixel gap on the first stage of each world has been verified to occur on hardware.
+ // (it can easily be seen by moving your player sprite to the far left)
+ //
+ // it is unclear where this offset comes from, but real hardware videos confirm it is needed
+
+ m_deco_tilegen->set_scrolldx(0, 0, 1, 1);
+ m_deco_tilegen->set_scrolldx(0, 1, 1, 1);
+ m_deco_tilegen->set_scrolldx(1, 0, 1, 1);
+ m_deco_tilegen->set_scrolldx(1, 1, 1, 1);
+
+ uint16_t flip = m_deco_tilegen->pf_control_r(0);
+
+ flip_screen_set(BIT(flip, 7));
+ m_sprgen->set_flip_screen(BIT(flip, 7));
+ m_deco_tilegen->pf_update(m_pf_rowscroll[0], m_pf_rowscroll[1]);
+
+ bitmap.fill(768, cliprect);
+ m_deco_tilegen->tilemap_2_draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0);
+ m_deco_tilegen->tilemap_1_draw(screen, bitmap, cliprect, 0, 0);
+ m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram, 0x400);
+ return 0;
+}
+
+uint16_t funkyjet_state::protection_region_0_146_r(offs_t offset)
{
// uint16_t realdat = deco16_146_funkyjet_prot_r(space,offset&0x3ff,mem_mask);
@@ -119,7 +198,7 @@ uint16_t funkyjet_state::funkyjet_protection_region_0_146_r(offs_t offset)
return data;
}
-void funkyjet_state::funkyjet_protection_region_0_146_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+void funkyjet_state::protection_region_0_146_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
// deco16_146_funkyjet_prot_w(space,offset&0x3ff,data,mem_mask);
@@ -130,32 +209,32 @@ void funkyjet_state::funkyjet_protection_region_0_146_w(offs_t offset, uint16_t
}
-void funkyjet_state::funkyjet_map(address_map &map)
+void funkyjet_state::maincpu_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x120000, 0x1207ff).ram().w("palette", FUNC(palette_device::write16)).share("palette");
map(0x140000, 0x143fff).ram();
- map(0x160000, 0x1607ff).ram().share("spriteram");
- map(0x180000, 0x183fff).rw(FUNC(funkyjet_state::funkyjet_protection_region_0_146_r), FUNC(funkyjet_state::funkyjet_protection_region_0_146_w)).share("prot16ram"); /* Protection device */ // unlikely to be cs0 region
+ map(0x160000, 0x1607ff).ram().share(m_spriteram);
+ map(0x180000, 0x183fff).rw(FUNC(funkyjet_state::protection_region_0_146_r), FUNC(funkyjet_state::protection_region_0_146_w)).share("prot16ram"); // Protection device, unlikely to be cs0 region
map(0x184000, 0x184001).nopw();
map(0x188000, 0x188001).nopw();
map(0x300000, 0x30000f).w(m_deco_tilegen, FUNC(deco16ic_device::pf_control_w));
map(0x320000, 0x321fff).rw(m_deco_tilegen, FUNC(deco16ic_device::pf1_data_r), FUNC(deco16ic_device::pf1_data_w));
map(0x322000, 0x323fff).rw(m_deco_tilegen, FUNC(deco16ic_device::pf2_data_r), FUNC(deco16ic_device::pf2_data_w));
- map(0x340000, 0x340bff).ram().share("pf1_rowscroll");
- map(0x342000, 0x342bff).ram().share("pf2_rowscroll");
+ map(0x340000, 0x340bff).ram().share(m_pf_rowscroll[0]);
+ map(0x342000, 0x342bff).ram().share(m_pf_rowscroll[1]);
}
/******************************************************************************/
-/* Physical memory map (21 bits) */
+// Physical memory map (21 bits)
void funkyjet_state::sound_map(address_map &map)
{
map(0x000000, 0x00ffff).rom();
- map(0x100000, 0x100001).noprw(); /* YM2203 - this board doesn't have one */
+ map(0x100000, 0x100001).noprw(); // YM2203 - this board doesn't have one
map(0x110000, 0x110001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
map(0x120000, 0x120001).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
- map(0x130000, 0x130001).noprw(); /* This board only has 1 oki chip */
+ map(0x130000, 0x130001).noprw(); // This board only has 1 oki chip
map(0x140000, 0x140000).r(m_deco146, FUNC(deco146_device::soundlatch_r));
map(0x1f0000, 0x1f1fff).ram();
}
@@ -170,7 +249,7 @@ static INPUT_PORTS_START( funkyjet )
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) /* Button 3 only in "test mode" */
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) // Button 3 only in "test mode"
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
@@ -178,7 +257,7 @@ static INPUT_PORTS_START( funkyjet )
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
- PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) /* Button 3 only in "test mode" */
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) // Button 3 only in "test mode"
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 )
PORT_START("SYSTEM")
@@ -187,7 +266,7 @@ static INPUT_PORTS_START( funkyjet )
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
- /* Dips seem inverted with respect to other Deco games */
+ // Dips seem inverted with respect to other Deco games
PORT_START("DSW")
PORT_DIPNAME( 0x00e0, 0x00e0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3")
PORT_DIPSETTING( 0x0000, DEF_STR( 3C_1C ) )
@@ -307,26 +386,26 @@ static const gfx_layout tile_layout =
};
static GFXDECODE_START( gfx_funkyjet )
- GFXDECODE_ENTRY( "gfx1", 0, charlayout, 256, 32 ) /* Characters 8x8 */
- GFXDECODE_ENTRY( "gfx1", 0, tile_layout, 256, 32 ) /* Tiles 16x16 */
- GFXDECODE_ENTRY( "gfx2", 0, tile_layout, 0, 16 ) /* Sprites 16x16 */
+ GFXDECODE_ENTRY( "chars", 0, charlayout, 256, 32 ) // Characters 8x8
+ GFXDECODE_ENTRY( "chars", 0, tile_layout, 256, 32 ) // Tiles 16x16
+ GFXDECODE_ENTRY( "sprites", 0, tile_layout, 0, 16 ) // Sprites 16x16
GFXDECODE_END
/******************************************************************************/
void funkyjet_state::funkyjet(machine_config &config)
{
- /* basic machine hardware */
- M68000(config, m_maincpu, XTAL(28'322'000)/2); /* 28 MHz crystal - 28.322000 on funkyjeta2 PCB at least*/
- m_maincpu->set_addrmap(AS_PROGRAM, &funkyjet_state::funkyjet_map);
+ // basic machine hardware
+ M68000(config, m_maincpu, XTAL(28'322'000)/2); // 28 MHz crystal - 28.322000 on funkyjeta2 PCB at least
+ m_maincpu->set_addrmap(AS_PROGRAM, &funkyjet_state::maincpu_map);
m_maincpu->set_vblank_int("screen", FUNC(funkyjet_state::irq6_line_hold));
- H6280(config, m_audiocpu, XTAL(32'220'000)/4); /* Custom chip 45, Audio section crystal is 32.220 MHz */
+ H6280(config, m_audiocpu, XTAL(32'220'000)/4); // Custom chip 45, Audio section crystal is 32.220 MHz
m_audiocpu->set_addrmap(AS_PROGRAM, &funkyjet_state::sound_map);
m_audiocpu->add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused
m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0);
- /* video hardware */
+ // video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(58);
m_screen->set_vblank_time(subseconds::from_usec(529));
@@ -360,7 +439,7 @@ void funkyjet_state::funkyjet(machine_config &config)
m_sprgen->set_gfx_region(2);
m_sprgen->set_gfxdecode_tag("gfxdecode");
- /* sound hardware */
+ // sound hardware
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
@@ -377,109 +456,131 @@ void funkyjet_state::funkyjet(machine_config &config)
/******************************************************************************/
ROM_START( funkyjet )
- ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */
+ ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "jk00-1.12f", 0x00000, 0x40000, CRC(ce61579d) SHA1(fe755b62c822c996d479cafa6fa7ac7724af6560) )
ROM_LOAD16_BYTE( "jk01-1.13f", 0x00001, 0x40000, CRC(274d04be) SHA1(a14ec81e40504d3c7deb28114b85b9bbb76a51f5) )
- ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
+ ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "jk02.16f", 0x00000, 0x10000, CRC(748c0bd8) SHA1(35910e6a4c4f198fb76bde0f5b053e2c66cfa0ff) )
- ROM_REGION( 0x080000, "gfx1", 0 )
- ROM_LOAD( "mat02", 0x000000, 0x80000, CRC(e4b94c7e) SHA1(7b6ddd0bd388c8d32277fce4b3abb102724bc7d1) ) /* Encrypted chars */
+ ROM_REGION( 0x080000, "chars", 0 )
+ ROM_LOAD( "mat02", 0x000000, 0x80000, CRC(e4b94c7e) SHA1(7b6ddd0bd388c8d32277fce4b3abb102724bc7d1) ) // encrypted
- ROM_REGION( 0x100000, "gfx2", 0 )
- ROM_LOAD( "mat01", 0x000000, 0x80000, CRC(24093a8d) SHA1(71f76ddd8a4b6e05ceb2fff4e20b6edb5e011e79) ) /* sprites */
+ ROM_REGION( 0x100000, "sprites", 0 )
+ ROM_LOAD( "mat01", 0x000000, 0x80000, CRC(24093a8d) SHA1(71f76ddd8a4b6e05ceb2fff4e20b6edb5e011e79) )
ROM_LOAD( "mat00", 0x080000, 0x80000, CRC(fbda0228) SHA1(815d49898d02e699393e370209181f2ca8301949) )
- ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */
+ ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples
// needs verifying, looks like a bad dump compared to the ROM in funkyjeta2
// 0x20 bytes at 0x79e0 are blanked out and 0x20 bytes at 0xa6a0 are replaced with different (bad?) data
ROM_LOAD( "jk03.15h", 0x00000, 0x20000, BAD_DUMP CRC(69a0eaf7) SHA1(05038e82ee03106625f05082fe9912e16be181ee) )
ROM_END
ROM_START( funkyjeta )
- ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */
- ROM_LOAD16_BYTE( "jk00.12f", 0x00000, 0x40000, CRC(712089c1) SHA1(84167c90303a228107f55596e2ff8b9f111d1bc2) ) /* Unverified revision, could be JK00-0 or JK00-2 */
- ROM_LOAD16_BYTE( "jk01.13f", 0x00001, 0x40000, CRC(be3920d7) SHA1(6627956d148681bc49991c544a09b07271ea4c7f) ) /* Unverified revision, could be JK01-0 or JK01-2 */
+ ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 code
+ ROM_LOAD16_BYTE( "jk00.12f", 0x00000, 0x40000, CRC(712089c1) SHA1(84167c90303a228107f55596e2ff8b9f111d1bc2) ) // Unverified revision, could be JK00-0 or JK00-2
+ ROM_LOAD16_BYTE( "jk01.13f", 0x00001, 0x40000, CRC(be3920d7) SHA1(6627956d148681bc49991c544a09b07271ea4c7f) ) // Unverified revision, could be JK01-0 or JK01-2
- ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
+ ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "jk02.16f", 0x00000, 0x10000, CRC(748c0bd8) SHA1(35910e6a4c4f198fb76bde0f5b053e2c66cfa0ff) )
- ROM_REGION( 0x080000, "gfx1", 0 )
- ROM_LOAD( "mat02", 0x000000, 0x80000, CRC(e4b94c7e) SHA1(7b6ddd0bd388c8d32277fce4b3abb102724bc7d1) ) /* Encrypted chars */
+ ROM_REGION( 0x080000, "chars", 0 )
+ ROM_LOAD( "mat02", 0x000000, 0x80000, CRC(e4b94c7e) SHA1(7b6ddd0bd388c8d32277fce4b3abb102724bc7d1) ) // encrypted
- ROM_REGION( 0x100000, "gfx2", 0 )
- ROM_LOAD( "mat01", 0x000000, 0x80000, CRC(24093a8d) SHA1(71f76ddd8a4b6e05ceb2fff4e20b6edb5e011e79) ) /* sprites */
+ ROM_REGION( 0x100000, "sprites", 0 )
+ ROM_LOAD( "mat01", 0x000000, 0x80000, CRC(24093a8d) SHA1(71f76ddd8a4b6e05ceb2fff4e20b6edb5e011e79) ) // sprites
ROM_LOAD( "mat00", 0x080000, 0x80000, CRC(fbda0228) SHA1(815d49898d02e699393e370209181f2ca8301949) )
- ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */
+ ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples
// see comment in funkyjet set
ROM_LOAD( "jk03.15h", 0x00000, 0x20000, BAD_DUMP CRC(69a0eaf7) SHA1(05038e82ee03106625f05082fe9912e16be181ee) )
ROM_END
ROM_START( funkyjeta2 )
- ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */
+ ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "12f", 0x00000, 0x40000, CRC(a18de697) SHA1(063f7f4c31c80b8fd807699e0412abb9271ddc59) ) // labels were blank
ROM_LOAD16_BYTE( "13f", 0x00001, 0x40000, CRC(695a27cd) SHA1(79b4e61e7c6bdab439d70993c296443f97339351) )
- ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
+ ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "16f", 0x00000, 0x10000, CRC(748c0bd8) SHA1(35910e6a4c4f198fb76bde0f5b053e2c66cfa0ff) )
- ROM_REGION( 0x080000, "gfx1", 0 )
- ROM_LOAD( "mat02", 0x000000, 0x80000, CRC(e4b94c7e) SHA1(7b6ddd0bd388c8d32277fce4b3abb102724bc7d1) ) /* Encrypted chars */
+ ROM_REGION( 0x080000, "chars", 0 )
+ ROM_LOAD( "mat02", 0x000000, 0x80000, CRC(e4b94c7e) SHA1(7b6ddd0bd388c8d32277fce4b3abb102724bc7d1) ) // encrypted
- ROM_REGION( 0x100000, "gfx2", 0 )
- ROM_LOAD( "mat01", 0x000000, 0x80000, CRC(24093a8d) SHA1(71f76ddd8a4b6e05ceb2fff4e20b6edb5e011e79) ) /* sprites */
+ ROM_REGION( 0x100000, "sprites", 0 )
+ ROM_LOAD( "mat01", 0x000000, 0x80000, CRC(24093a8d) SHA1(71f76ddd8a4b6e05ceb2fff4e20b6edb5e011e79) ) // sprites
ROM_LOAD( "mat00", 0x080000, 0x80000, CRC(fbda0228) SHA1(815d49898d02e699393e370209181f2ca8301949) )
- ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */
+ ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples
ROM_LOAD( "15h", 0x00000, 0x20000, CRC(d7c0f0fe) SHA1(7a4a21bbf0da27767de099fba66011732b2c835a) )
ROM_END
ROM_START( funkyjetj )
- ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */
+ ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "jh00-2.11f", 0x00000, 0x40000, CRC(5b98b700) SHA1(604bd04f4031b0a3b53db2fab4a0e160dff6936d) )
ROM_LOAD16_BYTE( "jh01-2.13f", 0x00001, 0x40000, CRC(21280220) SHA1(b365b6c8aa778e21a14b2813e93b9c9d02e14995) )
- ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
- ROM_LOAD( "jh02.16f", 0x00000, 0x10000, CRC(748c0bd8) SHA1(35910e6a4c4f198fb76bde0f5b053e2c66cfa0ff) ) /* same as jk02.16f from world set */
+ ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_LOAD( "jh02.16f", 0x00000, 0x10000, CRC(748c0bd8) SHA1(35910e6a4c4f198fb76bde0f5b053e2c66cfa0ff) ) // same as jk02.16f from world set
- ROM_REGION( 0x080000, "gfx1", 0 )
- ROM_LOAD( "mat02", 0x000000, 0x80000, CRC(e4b94c7e) SHA1(7b6ddd0bd388c8d32277fce4b3abb102724bc7d1) ) /* Encrypted chars */
+ ROM_REGION( 0x080000, "chars", 0 )
+ ROM_LOAD( "mat02", 0x000000, 0x80000, CRC(e4b94c7e) SHA1(7b6ddd0bd388c8d32277fce4b3abb102724bc7d1) ) // encrypted
- ROM_REGION( 0x100000, "gfx2", 0 )
- ROM_LOAD( "mat01", 0x000000, 0x80000, CRC(24093a8d) SHA1(71f76ddd8a4b6e05ceb2fff4e20b6edb5e011e79) ) /* sprites */
+ ROM_REGION( 0x100000, "sprites", 0 )
+ ROM_LOAD( "mat01", 0x000000, 0x80000, CRC(24093a8d) SHA1(71f76ddd8a4b6e05ceb2fff4e20b6edb5e011e79) )
ROM_LOAD( "mat00", 0x080000, 0x80000, CRC(fbda0228) SHA1(815d49898d02e699393e370209181f2ca8301949) )
- ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */
+ ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples
// see comment in funkyjet set, was this verified as label is different?
- ROM_LOAD( "jh03.15h", 0x00000, 0x20000, BAD_DUMP CRC(69a0eaf7) SHA1(05038e82ee03106625f05082fe9912e16be181ee) ) /* same as jk03.15h from world set */
+ ROM_LOAD( "jh03.15h", 0x00000, 0x20000, BAD_DUMP CRC(69a0eaf7) SHA1(05038e82ee03106625f05082fe9912e16be181ee) ) // same as jk03.15h from world set
ROM_END
ROM_START( sotsugyo )
- ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */
+ ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "03.12f", 0x00000, 0x40000, CRC(d175dfd1) SHA1(61c91d5e20b0492e6ac3b19fe9639eb4f169ae77) )
ROM_LOAD16_BYTE( "04.13f", 0x00001, 0x40000, CRC(2072477c) SHA1(23820a519e4503854e63ab3ad7eec58178c8d822) )
- ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
+ ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "sb020.16f", 0x00000, 0x10000, CRC(baf5ec93) SHA1(82b22a0b565e51cd40733f21fa876dd7064eb604) )
- ROM_REGION( 0x080000, "gfx1", 0 )
- ROM_LOAD( "02.2f", 0x000000, 0x80000, CRC(337b1451) SHA1(ab3a4526e683c23b7634ac3304fb073f6ce98e82) ) /* chars */
+ ROM_REGION( 0x080000, "chars", 0 )
+ ROM_LOAD( "02.2f", 0x000000, 0x80000, CRC(337b1451) SHA1(ab3a4526e683c23b7634ac3304fb073f6ce98e82) )
- ROM_REGION( 0x100000, "gfx2", 0 )
- ROM_LOAD( "01.4a", 0x000000, 0x80000, CRC(fa10dd54) SHA1(5dfe66df0bbab5eb151bf65f7e767a2325a50b36) ) /* sprites */
+ ROM_REGION( 0x100000, "sprites", 0 )
+ ROM_LOAD( "01.4a", 0x000000, 0x80000, CRC(fa10dd54) SHA1(5dfe66df0bbab5eb151bf65f7e767a2325a50b36) )
ROM_LOAD( "00.2a", 0x080000, 0x80000, CRC(d35a14ef) SHA1(b8d27766db7e183aee208c690364e4383f3c6882) )
- ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */
+ ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples
ROM_LOAD( "sb030.15h", 0x00000, 0x20000, CRC(1ea43f48) SHA1(74cc8c740f1c7fa94c2cb460ea4ee7aa0c490ed7) )
ROM_END
+ROM_START( sotsugyok ) // only ROMs that match the parent are the audio CPU and Oki ones
+ ROM_REGION( 0x80000, "maincpu", 0 )
+ ROM_LOAD16_BYTE( "27c020.12f", 0x00000, 0x40000, CRC(147a794d) SHA1(d2a87e6f59cb13707137ef8cd6b63c0ca87c77b0) )
+ ROM_LOAD16_BYTE( "27c020.13f", 0x00001, 0x40000, CRC(d59f270e) SHA1(de3736e1b818cf0ab976824c4e67a394e46f13af) )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_LOAD( "27c512.16f", 0x00000, 0x10000, CRC(baf5ec93) SHA1(82b22a0b565e51cd40733f21fa876dd7064eb604) )
+
+ ROM_REGION( 0x080000, "chars", 0 )
+ ROM_LOAD( "27c4000.2f", 0x000000, 0x80000, CRC(8a76a083) SHA1(f5cccb3a7834225af0c6118af33362efeff66999) )
+
+ ROM_REGION( 0x100000, "sprites", 0 )
+ ROM_LOAD( "27c4000.4a", 0x000000, 0x80000, CRC(69de4049) SHA1(2f4f45108c27ae164a0b5323ee37a331e784cef5) )
+ ROM_LOAD( "27c4000.2a", 0x080000, 0x80000, CRC(9092cc83) SHA1(208391058ab74f2651457644544bbe77c1f5dcb8) )
+
+ ROM_REGION( 0x40000, "oki", 0 )
+ ROM_LOAD( "27c010.15h", 0x00000, 0x20000, CRC(1ea43f48) SHA1(74cc8c740f1c7fa94c2cb460ea4ee7aa0c490ed7) )
+ROM_END
+
void funkyjet_state::init_funkyjet()
{
- deco74_decrypt_gfx(machine(), "gfx1");
+ deco74_decrypt_gfx(machine(), "chars");
}
+} // Anonymous namespace
+
+
/******************************************************************************/
GAME( 1992, funkyjet, 0, funkyjet, funkyjet, funkyjet_state, init_funkyjet, ROT0, "Mitchell", "Funky Jet (World, rev 1)", MACHINE_SUPPORTS_SAVE )
@@ -489,4 +590,5 @@ GAME( 1992, funkyjeta, funkyjet, funkyjet, funkyjet, funkyjet_state, init_funky
GAME( 1992, funkyjeta2,funkyjet, funkyjet, funkyjeta2,funkyjet_state, init_funkyjet, ROT0, "Mitchell", "Funky Jet (Korea, prototype?)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, funkyjetj, funkyjet, funkyjet, funkyjetj, funkyjet_state, init_funkyjet, ROT0, "Mitchell (Data East Corporation license)", "Funky Jet (Japan, rev 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, sotsugyo, 0, funkyjet, sotsugyo, funkyjet_state, init_funkyjet, ROT0, "Mitchell (Atlus license)", "Sotsugyo Shousho", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, sotsugyo, 0, funkyjet, sotsugyo, funkyjet_state, init_funkyjet, ROT0, "Mitchell (Atlus license)", "Sotsugyo Shousho (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1996, sotsugyok, sotsugyo, funkyjet, sotsugyo, funkyjet_state, init_funkyjet, ROT0, "Mitchell", "Jor-eop Jeungmyeongseo (Korea)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/gaelco3d.cpp b/src/mame/drivers/gaelco3d.cpp
index 798d145fdab..d9ee138a2a1 100644
--- a/src/mame/drivers/gaelco3d.cpp
+++ b/src/mame/drivers/gaelco3d.cpp
@@ -970,10 +970,10 @@ void gaelco3d_state::gaelco3d(machine_config &config)
// Sound hardware
SPEAKER(config, "mono").front_center();
- DMADAC(config, m_dmadac[0]).add_route(ALL_OUTPUTS, "mono", 1.0); // speedup: front mono
- DMADAC(config, m_dmadac[1]).add_route(ALL_OUTPUTS, "mono", 1.0); // speedup: left rear
- DMADAC(config, m_dmadac[2]).add_route(ALL_OUTPUTS, "mono", 1.0); // speedup: right rear
- DMADAC(config, m_dmadac[3]).add_route(ALL_OUTPUTS, "mono", 1.0); // speedup: seat speaker
+ DMADAC(config, m_dmadac[0]).add_route(ALL_OUTPUTS, "mono", 0.45); // speedup: front mono
+ DMADAC(config, m_dmadac[1]).add_route(ALL_OUTPUTS, "mono", 0.45); // speedup: left rear
+ DMADAC(config, m_dmadac[2]).add_route(ALL_OUTPUTS, "mono", 0.45); // speedup: right rear
+ DMADAC(config, m_dmadac[3]).add_route(ALL_OUTPUTS, "mono", 0.45); // speedup: seat speaker
}
diff --git a/src/mame/drivers/galaxian.cpp b/src/mame/drivers/galaxian.cpp
index e6b85c2d9e6..45800964ff8 100644
--- a/src/mame/drivers/galaxian.cpp
+++ b/src/mame/drivers/galaxian.cpp
@@ -4556,6 +4556,15 @@ static INPUT_PORTS_START( porter )
INPUT_PORTS_END
+static INPUT_PORTS_START( portera )
+ PORT_INCLUDE(porter)
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
+INPUT_PORTS_END
+
+
static INPUT_PORTS_START( skybase )
PORT_INCLUDE(mooncrst)
@@ -15143,7 +15152,7 @@ GAME( 1984, bagmanm2, bagman, bagmanmc, bagmanmc, bagmanmc_state, init_
// Other games on basic mooncrst hardware
GAME( 1982, porter, dockman, porter, porter, pisces_state, init_pisces, ROT90, "bootleg", "Port Man (bootleg on Moon Cresta hardware)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL )
-GAME( 1982, portera, dockman, porter, porter, pisces_state, init_pisces, ROT90, "bootleg", "El Estivador (Spanish bootleg of Port Man on Galaxian hardware)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL )
+GAME( 1982, portera, dockman, porter, portera, pisces_state, init_pisces, ROT90, "bootleg", "El Estivador (Spanish bootleg of Port Man on Galaxian hardware)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL )
GAME( 1982, skybase, 0, skybase, skybase, pisces_state, init_pisces, ROT90, "Omori Electric Co., Ltd.", "Sky Base", MACHINE_SUPPORTS_SAVE )
GAME( 198?, kong, 0, kong, kong, galaxian_state, init_kong, ROT90, "Taito do Brasil", "Kong (Donkey Kong conversion on Galaxian hardware)", MACHINE_SUPPORTS_SAVE | MACHINE_WRONG_COLORS ) // rewrite of Donkey Kong (!) not a clone
diff --git a/src/mame/drivers/galgames.cpp b/src/mame/drivers/galgames.cpp
index f42243390c8..2aae6c0ce8f 100644
--- a/src/mame/drivers/galgames.cpp
+++ b/src/mame/drivers/galgames.cpp
@@ -38,6 +38,7 @@ Notes:
***************************************************************************/
#include "emu.h"
+
#include "cpu/m68000/m68000.h"
#include "cpu/pic16c5x/pic16c5x.h"
#include "machine/eepromser.h"
@@ -45,10 +46,12 @@ Notes:
#include "machine/watchdog.h"
#include "sound/okim6295.h"
#include "video/cesblit.h"
+
+#include "dirom.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
-#include "dirom.h"
+
/***************************************************************************
diff --git a/src/mame/drivers/gameking.cpp b/src/mame/drivers/gameking.cpp
index 06edc65b7dc..0fc257e54e1 100644
--- a/src/mame/drivers/gameking.cpp
+++ b/src/mame/drivers/gameking.cpp
@@ -261,7 +261,7 @@ DEVICE_IMAGE_LOAD_MEMBER(gameking_state::cart_load)
if (size > 0x100000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/gfamily.cpp b/src/mame/drivers/gfamily.cpp
index 4800d4189fb..37ab897b54f 100644
--- a/src/mame/drivers/gfamily.cpp
+++ b/src/mame/drivers/gfamily.cpp
@@ -3,7 +3,7 @@
/*
Games Family P4-4P (Pentium 4 - 4 Players)
-PC with Chinese Windows 2000 Pro and several emulators, including:
+PC with Chinese Windows 2000 Pro and several emulators, including (programs may change on other revisions):
-MAME v0.78 (Dec 30 2003)
-MAME v0.96u3 (May 25 2005)
-MAME v0.106 (May 16 2006)
@@ -11,22 +11,12 @@ PC with Chinese Windows 2000 Pro and several emulators, including:
-FB Alpha v0.2.94.98
-ZiNc 1.1
-PC motherboard plus an additional PCB for JAMMA, inputs and basic config (and protection).
-
-PC board:
- CPU: Intel Celeron 1.7GHz / 128kb / 400MHz SL6SC
- RAM: 256MB-DDR400
- PCB: 04/082006-SiS-651-6A6IXRMAC-00, Realtec ALC655 audio, Realtec RTL8201BL Ethernet (25.000 MHz xtal), Winbond W83194BG-648 (14.31818 MHz xtal)
- BIOS: 686 AMIBIOS (c) 2006 AY36 8897
-
-I/O board:
+PC motherboard plus an additional PCB for JAMMA, inputs and basic config (and protection) with:
Atmel AT89C2051 (near a 4 dipswitches bank and a 6.000 MHz xtal)
Microchip CF745 (near another 4 dipswitches bank and a 4.000 MHz xtal)
2 x Microchip PIC12F508
Altera Max EPM7128SQC100-10 CPLD
-Newer versions use the same I/O board, but with different PC motherboards with faster CPUs (seen with Pentium 4 2.40GHz/512/533 SL6DV).
-
*/
#include "emu.h"
@@ -85,7 +75,7 @@ void gfamily_state::machine_reset()
void gfamily_state::gfamily(machine_config &config)
{
// Basic machine hardware
- PENTIUM4(config, m_maincpu, 1'700'000'000); // Actually an Intel Celeron SL6SC 1.7GHz
+ PENTIUM4(config, m_maincpu, 1'700'000'000); // Actually an Intel Celeron SL6SC 1.7GHz (with the config found with the default BIOS)
m_maincpu->set_addrmap(AS_PROGRAM, &gfamily_state::gfamily_map);
// Video hardware
@@ -104,15 +94,29 @@ void gfamily_state::gfamily(machine_config &config)
***************************************************************************/
ROM_START( gmfamily )
+
+ /* Different PC motherboards with different configurations.
+ By now, we're throwing all known BIOSes here. */
ROM_REGION(0x80000, "bios", 0)
- ROM_LOAD("686_amibios_ay36_8897.bin", 0x00000, 0x80000, CRC(e04c5750) SHA1(240ca6b270bdebf129e4ce43e79275aa067b6ada) )
+
+ /* CPU: Intel Celeron 1.7GHz / 128kb / 400MHz SL6SC
+ RAM: 256MB-DDR400
+ PCB: Realtec ALC655 audio, Realtec RTL8201BL Ethernet (25.000 MHz xtal), Winbond W83194BG-648 (14.31818 MHz xtal) */
+ ROM_SYSTEM_BIOS(0, "ay36_8897", "04/082006-SiS-651-6A6IXRMAC-00")
+ ROMX_LOAD("686_amibios_ay36_8897.bin", 0x00000, 0x80000, CRC(e04c5750) SHA1(240ca6b270bdebf129e4ce43e79275aa067b6ada), ROM_BIOS(0))
+
+ /* CPU: Pentium 4 2.40GHz/512/533 SL6DV
+ RAM: 512MB
+ PCB: ECS (Elitegroup) 651-M v2.4. Seems like a later low-cost version of the consumer v2.0 motherboard. */
+ ROM_SYSTEM_BIOS(1, "sy_sis651", "05/13/2005-SiS-651-6A6IXE19C-00")
+ ROMX_LOAD("award_i6a6ixe19.bin", 0x00000, 0x40000, CRC(95fa392c) SHA1(40f557339649c47e6c3d941670604e0559edf8db), ROM_BIOS(1)) // Winbond W49F002UP12N
// PICs and MCUs from the I/O board, all of them protected
ROM_REGION(0x10000, "unsorted", 0)
- ROM_LOAD("at89c2051.u3", 0x0000, 0x4000, NO_DUMP ) // 2 Kbytes internal ROM
- ROM_LOAD("cf745.u2", 0x4000, 0x2000, NO_DUMP ) // 1 Kbytes internal ROM
- ROM_LOAD("pic12f508.u0", 0x6000, 0x2000, NO_DUMP ) // 1 Kbytes internal ROM
- ROM_LOAD("pic12f508.u6", 0x8000, 0x2000, NO_DUMP ) // 1 Kbytes internal ROM
+ ROM_LOAD("at89c2051.u3", 0x0000, 0x4000, NO_DUMP) // 2 Kbytes internal ROM
+ ROM_LOAD("cf745.u2", 0x4000, 0x2000, NO_DUMP) // 1 Kbytes internal ROM
+ ROM_LOAD("pic12f508.u0", 0x6000, 0x2000, NO_DUMP) // 1 Kbytes internal ROM
+ ROM_LOAD("pic12f508.u6", 0x8000, 0x2000, NO_DUMP) // 1 Kbytes internal ROM
DISK_REGION( "ide:0:hdd:image" ) // From a Norton Ghost recovery image
DISK_IMAGE( "gamesfamily_1.1", 0, SHA1(cd6b8d19f430c510a95a838d7b8c578f89ccf834) )
diff --git a/src/mame/drivers/gm1000.cpp b/src/mame/drivers/gm1000.cpp
new file mode 100644
index 00000000000..a7fa3a80860
--- /dev/null
+++ b/src/mame/drivers/gm1000.cpp
@@ -0,0 +1,123 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*******************************************************************************
+
+ Skeleton driver for Suzuki BH-1000/Hammond GM-1000 sound module.
+
+*******************************************************************************/
+
+#include "emu.h"
+//#include "bus/midi/midi.h"
+#include "cpu/m37710/m37710.h"
+#include "machine/nvram.h"
+#include "video/hd44780.h"
+#include "emupal.h"
+#include "screen.h"
+
+namespace {
+
+class gm1000_state : public driver_device
+{
+public:
+ gm1000_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_nvram(*this, "nvram", 0x800, ENDIANNESS_LITTLE)
+ {
+ }
+
+ void gm1000(machine_config &config);
+
+private:
+ HD44780_PIXEL_UPDATE(lcd_pixel_update);
+
+ void mem_map(address_map &map);
+
+ required_device<m37702s1_device> m_maincpu;
+ memory_share_creator<u8> m_nvram;
+};
+
+HD44780_PIXEL_UPDATE(gm1000_state::lcd_pixel_update)
+{
+ if (x < 5 && y < 8 && line < 2 && pos < 24)
+ bitmap.pix(line * 8 + y, pos * 6 + x) = state;
+}
+
+
+void gm1000_state::mem_map(address_map &map)
+{
+ map(0x000400, 0x000403).rw("lcdc", FUNC(hd44780_device::read), FUNC(hd44780_device::write)).umask16(0x00ff);
+ map(0x004000, 0x007fff).ram();
+ map(0x008000, 0x03ffff).rom().region("program", 0x8000);
+ map(0x040000, 0x04ffff).rom().region("program", 0);
+ map(0x050000, 0x050fff).lrw8(
+ [this](offs_t offset) { return m_nvram[offset]; }, "nvram_r",
+ [this](offs_t offset, u8 data) { m_nvram[offset] = data; }, "nvram_w").umask16(0x00ff);
+ map(0x064000, 0x06efff).ram();
+ map(0x070002, 0x070005).nopr();
+}
+
+
+static INPUT_PORTS_START(gm1000)
+ // Keycode assignments are rather arbitrary and do not at all reflect the panel layout
+ PORT_START("P4")
+ PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Parameter " UTF8_LEFT)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Parameter " UTF8_RIGHT)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Data " UTF8_LEFT)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("Data " UTF8_RIGHT)
+
+ PORT_START("P6")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("All Mute")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("P. Mute")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("P. Monitor")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Display")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Part " UTF8_LEFT)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_STOP) PORT_NAME("Part " UTF8_RIGHT)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Instrument " UTF8_LEFT)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Instrument " UTF8_RIGHT)
+INPUT_PORTS_END
+
+void gm1000_state::gm1000(machine_config &config)
+{
+ M37702S1(config, m_maincpu, 4'000'000); // unknown clock; type guessed
+ m_maincpu->set_addrmap(AS_PROGRAM, &gm1000_state::mem_map);
+ m_maincpu->p4_in_cb().set_ioport("P4");
+ m_maincpu->p6_in_cb().set_ioport("P6");
+ m_maincpu->an0_cb().set_constant(0xc0); // battery voltage
+ m_maincpu->an2_cb().set_constant(0x80); // ?
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update("lcdc", FUNC(hd44780_device::screen_update));
+ screen.set_size(6*24, 8*2);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
+ screen.set_color(rgb_t::green());
+
+ PALETTE(config, "palette", palette_device::MONOCHROME_INVERTED);
+
+ hd44780_device &lcdc(HD44780(config, "lcdc", 0));
+ lcdc.set_lcd_size(2, 24);
+ lcdc.set_pixel_update_cb(FUNC(gm1000_state::lcd_pixel_update));
+ lcdc.set_function_set_at_any_time(true);
+}
+
+ROM_START(gm1000)
+ ROM_REGION16_LE(0x40000, "program", 0)
+ ROM_LOAD16_BYTE("bh1_mgs71a__u6_sysl__v2.1_bf66.u6", 0x00000, 0x20000, CRC(d003880c) SHA1(5cf727c42dd1b903c0048f147b461676e8c35faf)) // MX27C1000-90
+ ROM_LOAD16_BYTE("bh1_mgs71a__u7_sysh__v2.1_2fac.u7", 0x00001, 0x20000, CRC(989417a1) SHA1(3de4f10a2e7cde5eb93f04bd75db36e194b1d991)) // MX27C1000-90
+
+ ROM_REGION(0x800000, "waves", 0) // DIP42 mask ROMs "© SUZUKI 1993"
+ ROM_LOAD("319-35006_wd06__m531602c-53.u13", 0x000000, 0x200000, NO_DUMP)
+ ROM_LOAD("319-35007_wd07__m531602c-52.u14", 0x200000, 0x200000, NO_DUMP)
+ ROM_LOAD("319-35008_wd08__m531602c-54.u15", 0x200000, 0x200000, NO_DUMP)
+ ROM_LOAD("319-35009_wd09__m531602c-55.u16", 0x200000, 0x200000, NO_DUMP)
+ROM_END
+
+} // anonymous namespace
+
+SYST(1994, gm1000, 0, 0, gm1000, gm1000, gm1000_state, empty_init, "Suzuki (Hammond license)", "GM-1000 GM Sound Module", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/gng.cpp b/src/mame/drivers/gng.cpp
index 4fb5682372e..bf9be00b63f 100644
--- a/src/mame/drivers/gng.cpp
+++ b/src/mame/drivers/gng.cpp
@@ -833,7 +833,7 @@ GAME( 1985, gngprot, gng, gng, gng, gng_state, empty_init, ROT0, "Cap
GAME( 1985, gngblita, gng, gng, gng, gng_state, empty_init, ROT0, "bootleg", "Ghosts'n Goblins (Italian bootleg, harder)", MACHINE_SUPPORTS_SAVE )
GAME( 1985, gngc, gng, gng, gng, gng_state, empty_init, ROT0, "Capcom", "Ghosts'n Goblins (World? set 3)", MACHINE_SUPPORTS_SAVE ) // rev c?
GAME( 1985, gngt, gng, gng, gng, gng_state, empty_init, ROT0, "Capcom (Taito America license)", "Ghosts'n Goblins (US)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, makaimur, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makai-Mura (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, makaimurc, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makai-Mura (Japan Revision C)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, makaimurg, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makai-Mura (Japan Revision G)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, makaimur, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makaimura (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, makaimurc, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makaimura (Japan Revision C)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, makaimurg, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makaimura (Japan Revision G)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, diamond, 0, diamond, diamond, gng_state, empty_init, ROT0, "KH Video", "Diamond Run", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/goldstar.cpp b/src/mame/drivers/goldstar.cpp
index 84e546b9834..bc077c70ab9 100644
--- a/src/mame/drivers/goldstar.cpp
+++ b/src/mame/drivers/goldstar.cpp
@@ -849,6 +849,16 @@ void cmaster_state::cm_portmap(address_map &map)
map(0x14, 0x14).w(FUNC(cmaster_state::girl_scroll_w));
}
+void cmaster_state::super7_portmap(address_map &map)
+{
+ cm_portmap(map);
+
+ map(0x02, 0x03).unmaprw();
+ map(0x03, 0x03).w("aysnd", FUNC(ay8910_device::address_w));
+ map(0x81, 0x81).r("aysnd", FUNC(ay8910_device::data_r));
+ map(0x82, 0x82).w("aysnd", FUNC(ay8910_device::data_w));
+}
+
void cmaster_state::cm97_portmap(address_map &map) // TODO: other reads/writes
{
map.global_mask(0xff);
@@ -9060,6 +9070,13 @@ void cmaster_state::chryangl(machine_config &config)
m_maincpu->set_addrmap(AS_OPCODES, &cmaster_state::chryangl_decrypted_opcodes_map);
}
+void cmaster_state::super7(machine_config &config)
+{
+ chryangl(config);
+
+ m_maincpu->set_addrmap(AS_IO, &cmaster_state::super7_portmap);
+}
+
void goldstar_state::cmast91(machine_config &config)
{
/* basic machine hardware */
@@ -10465,6 +10482,33 @@ ROM_START( cb3e )
ROM_END
+ROM_START( cb3f ) // original Wing W4 PCB + subboard with Z80, ROM, RAM and encryption logic
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "en27c512.u6", 0x00000, 0x10000, CRC(de6d6050) SHA1(7164584b159c8180ffc65d4e0bedbb4a405c74d9) ) // encrypted
+
+ ROM_REGION( 0x18000, "gfx1", 0 )
+ ROM_LOAD( "5.7h", 0x00000, 0x08000, CRC(83650a94) SHA1(e79420ab559d3f74013708767ca3f238fd333fb7) )
+ ROM_LOAD( "6.8h", 0x08000, 0x08000, CRC(2f46a3f5) SHA1(3e6022ee8f84039e48f41aea5e68ee28aabdc556) )
+ ROM_LOAD( "7.10h", 0x10000, 0x08000, CRC(dcf97517) SHA1(0a29696e0464c8878c499b1786a17080fd088a72) )
+
+ ROM_REGION( 0x8000, "gfx2", 0 )
+ ROM_LOAD( "1.1h", 0x00000, 0x02000, CRC(7cc6d26b) SHA1(de33e8985affce7bd3ead89463117c9aaa93d5e4) )
+ ROM_LOAD( "2.3h", 0x02000, 0x02000, CRC(e73ea4e3) SHA1(c9fd56461f6986d6bc170403d298fcc408a524e9) )
+ ROM_LOAD( "3.4h", 0x04000, 0x02000, CRC(91162010) SHA1(3acc21e7074602b247f2f392eb181802092d2f21) )
+ ROM_LOAD( "4.5h", 0x06000, 0x02000, CRC(cbcc6bfb) SHA1(5bafc934fef1f50d8c182c39d3a7ce795c89d175) )
+
+ ROM_REGION( 0x0200, "proms", 0 )
+ ROM_LOAD_NIB_LOW( "n82s129.13g", 0x0000, 0x0100, CRC(59ac98e4) SHA1(5fc0f1a48c49c956cdb8826e20663dc57a9175e4) ) // 1st bank colors, low 4 bits.
+ ROM_LOAD_NIB_HIGH( "n82s129.14g", 0x0000, 0x0100, CRC(0d8f35bd) SHA1(0c2a0145cdaaf9beabdce241731a36b0c65f18a2) ) // 1st bank colors, high 4 bits.
+ ROM_LOAD( "dm74s288.13d", 0x0080, 0x0020, CRC(77a85e21) SHA1(3b41e0ab7cc55c5d78914d23e8289383f5bd5654) ) // 2nd bank colors
+
+ ROM_REGION( 0x100, "unkprom", 0 )
+ ROM_LOAD( "82s129.f3", 0x0000, 0x0100, CRC(1d668d4a) SHA1(459117f78323ea264d3a29f1da2889bbabe9e4be) )
+
+ ROM_REGION( 0x20, "unkprom2", 0 )
+ ROM_LOAD( "dm74s288.d12", 0x0000, 0x0020, CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) )
+ROM_END
+
/* Cherry Gold I (bootleg)
It runs in CB3e similar hardware...
@@ -10562,21 +10606,42 @@ PCB with a New Impeuropex sticker
ROM_START( super7 )
ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "27c512_1", 0x00000, 0x10000, CRC(ddfa6fe7) SHA1(0d86ec5029afd565e039fe84f7001b2dc77c919c) ) // first 0x8000 encrypted
+ ROM_LOAD( "27c512_1", 0x00000, 0x10000, CRC(ddfa6fe7) SHA1(0d86ec5029afd565e039fe84f7001b2dc77c919c) ) // first 0x8000 opcodes & data encrypted, 0x8000 - 0x93ff only opcodes encrypted, 0x9400 onwards unencrypted?
+
+ ROM_REGION( 0x40000, "gfx1", 0 ) // very similar to most cmv4 sets, but differently arranged
+ ROM_LOAD( "27c010_2", 0x20000, 0x8000, CRC(9636d785) SHA1(8f851aae0b05ad909c48cf94142ab927145da464) )
+ ROM_CONTINUE( 0x10000, 0x8000 )
+ ROM_CONTINUE( 0x30000, 0x8000 )
+ ROM_CONTINUE( 0x00000, 0x8000 )
+ ROM_COPY( "gfx1", 0x20000, 0x28000, 0x8000)
+ ROM_COPY( "gfx1", 0x10000, 0x18000, 0x8000)
+ ROM_COPY( "gfx1", 0x30000, 0x38000, 0x8000)
+ ROM_COPY( "gfx1", 0x00000, 0x08000, 0x8000)
+
+ ROM_REGION( 0x40000, "graphics", 0 )
+ ROM_LOAD( "27c010_3", 0x18000, 0x8000, CRC(a6db1162) SHA1(05019166526b0797e3eca8b72d90c325573b3d74) )
+ ROM_CONTINUE( 0x08000, 0x8000 )
+ ROM_CONTINUE( 0x38000, 0x8000 )
+ ROM_CONTINUE( 0x28000, 0x8000 )
+ ROM_COPY( "graphics", 0x28000, 0x20000, 0x8000)
+ ROM_COPY( "graphics", 0x18000, 0x10000, 0x8000)
+ ROM_COPY( "graphics", 0x38000, 0x30000, 0x8000)
+ ROM_COPY( "graphics", 0x08000, 0x00000, 0x8000)
- ROM_REGION( 0x20000, "gfx1", 0 ) // very similar to most cmv4 sets, but differently arranged
- ROM_LOAD( "27c010_2", 0x00000, 0x20000, CRC(9636d785) SHA1(8f851aae0b05ad909c48cf94142ab927145da464) )
-
- ROM_REGION( 0x20000, "gfx2", 0 )
- ROM_LOAD( "27c010_3", 0x00000, 0x20000, CRC(a6db1162) SHA1(05019166526b0797e3eca8b72d90c325573b3d74) )
+ ROM_REGION( 0x8000, "gfx2", 0 )
+ ROM_COPY( "graphics", 0x0e000, 0x00000, 0x2000 )
+ ROM_COPY( "graphics", 0x1e000, 0x02000, 0x2000 )
+ ROM_COPY( "graphics", 0x2e000, 0x04000, 0x2000 )
+ ROM_COPY( "graphics", 0x3e000, 0x06000, 0x2000 )
ROM_REGION( 0x10000, "user1", ROMREGION_ERASEFF ) // no girls ROM
ROM_REGION( 0x800, "proms", 0 ) // RGB generation
ROM_LOAD( "82s191an.bin", 0x000, 0x800, CRC(ec546abe) SHA1(1bd92c0715ec1821fa977a67499dc8971deec9c7) )
- ROM_REGION( 0x400, "proms2", 0 )
- ROM_LOAD( "82s137an.bin", 0x000, 0x400, CRC(92975789) SHA1(4a85d169db5e298ee201fe7d4b9964b1df16992e) )
+ ROM_REGION( 0x100, "proms2", 0 )
+ ROM_LOAD( "82s137an.bin", 0x000, 0x100, CRC(92975789) SHA1(4a85d169db5e298ee201fe7d4b9964b1df16992e) )
+ ROM_IGNORE(0x300)
ROM_REGION( 0xa00, "plds", 0 )
ROM_LOAD( "palce16v8.bin", 0x000, 0x114, NO_DUMP )
@@ -15052,7 +15117,7 @@ ROM_START( nc96 )
ROM_REGION( 0x20000, "graphics", 0 )
ROM_LOAD( "ch96seh.bin", 0x00000, 0x10000, CRC(65dee6ba) SHA1(77f5769ed0b745a4735576e9f0ce90dcdd9b5410) ) /* Correct graphics for this set, shows (R)COPYRIGHT(C) 1996 */
- ROM_LOAD( "ch96sel.bin", 0x10000, 0x10000, CRC(c21cc114) SHA1(f7b6ff5ac34dc1a7332e8c1b9cc40f3b65deac05) ) /* the other set shows a currupted TM graphic */
+ ROM_LOAD( "ch96sel.bin", 0x10000, 0x10000, CRC(c21cc114) SHA1(f7b6ff5ac34dc1a7332e8c1b9cc40f3b65deac05) ) /* the other set shows a corrupted TM graphic */
ROM_REGION( 0x10000, "user1", ROMREGION_ERASEFF )
@@ -18420,6 +18485,22 @@ uint8_t cb3_state::cb3_decrypt(uint8_t cipherText, uint16_t address)
return output ^ sbox[idx];
}
+uint8_t cb3_state::cb3f_decrypt(uint8_t cipherText, uint16_t address)
+{
+ uint8_t output;
+ int rotation[8] = {0, 1, 1, 1, 1, 0, 0, 1};
+ int sbox[8] = {0x20, 0x80, 0x20, 0x08, 0x08, 0x20, 0x80, 0x80};
+
+ int idx = BIT(cipherText, 1) | (BIT(address, 0) << 1) | (BIT(address, 4) << 2);
+
+ if (rotation[idx] == 0)
+ output = bitswap<8>(cipherText, 5, 6, 3, 4, 7, 2, 1, 0); // rotates bit #3, #5 and #7 in one direction...
+ else
+ output = bitswap<8>(cipherText, 3, 6, 7, 4, 5, 2, 1, 0); // ... or in the other
+
+ return output ^ sbox[idx];
+}
+
uint8_t cb3_state::chry10_decrypt(uint8_t cipherText)
{
return cipherText ^ (BIT(cipherText, 4) << 3) ^ (BIT(cipherText, 1) << 5) ^ (BIT(cipherText, 6) << 7);
@@ -19176,6 +19257,16 @@ void cb3_state::init_cb3e()
}
}
+void cb3_state::init_cb3f()
+{
+// program bitswap
+ uint8_t *rom = memregion("maincpu")->base();
+
+ do_blockswaps(rom);
+
+ for (int i = 0; i < 0x9000; i++) // TODO: why? Up to 0x8fff everything's fine, but there are jumps to > 0x9000 where it seems to expect undecrypted code?
+ rom[i] = cb3f_decrypt(rom[i], i);
+}
/* todo: remove these patches! */
void unkch_state::init_unkch1()
@@ -19439,13 +19530,42 @@ void cmaster_state::init_tcl()
}
}
-void cmaster_state::init_super7()
+void cmaster_state::init_super7() // possibly incomplete decryption. Game appears to work with clean NVRAM, but stops with 'scheda da inizializzare" (PCB to be initialized) message with NVRAM present
{
uint8_t *rom = memregion("maincpu")->base();
for (int a = 0; a < 0x8000; a++)
{
rom[a] = (rom[a] << 1) | BIT(rom[a], 7);
+ m_decrypted_opcodes[a] = rom[a];
+ }
+
+ for (int a = 0x8000; a < 0x9000; a++)
+ {
+ switch (a & 0xc00)
+ {
+ case 0x000: m_decrypted_opcodes[a] = bitswap<8>(rom[a] ^ 0x6e, 6, 7, 0, 1, 2, 3, 4, 5); break;
+ case 0x400: m_decrypted_opcodes[a] = bitswap<8>(rom[a] ^ 0x1e, 7, 6, 5, 4, 3, 2, 1, 0); break;
+ case 0x800: m_decrypted_opcodes[a] = bitswap<8>(rom[a] ^ 0x1e, 0, 1, 7, 2, 6, 4, 5, 3); break;
+ case 0xc00: m_decrypted_opcodes[a] = bitswap<8>(rom[a] ^ 0x7d, 2, 0, 1, 3, 4, 5, 6, 7); break;
+ }
+ }
+
+ for (int a = 0x9000; a < 0x9400; a++)
+ m_decrypted_opcodes[a] = bitswap<8>(rom[a] ^ 0x62, 4, 5, 3, 6, 7, 0, 2, 1); // TODO: bit 5 and 4 might be swapped
+
+ for (int a = 0x9400; a < 0xf000; a++)
+ m_decrypted_opcodes[a] = rom[a];
+
+ // try to rearrange PROM contents to what MAME expects. TODO: still doesn't work
+ uint8_t *proms = memregion("proms")->base();
+
+ for (int i = 0; i < 0x100; i++)
+ {
+ uint8_t bits74 = proms[i] >> 4;
+ uint8_t bits30 = proms[i] & 0x0f;
+ proms[i] = bits74;
+ proms[i + 0x100] = bits30;
}
}
@@ -19473,9 +19593,10 @@ GAMEL( 199?, ncb3, 0, ncb3, ncb3, cb3_state, empty_init
GAMEL( 199?, cb3a, ncb3, ncb3, cb3a, cb3_state, empty_init, ROT0, "Dyna", "Cherry Bonus III (ver.1.40, set 2)", 0, layout_cherryb3 )
GAMEL( 199?, cb3, ncb3, ncb3, ncb3, cb3_state, init_cb3, ROT0, "Dyna", "Cherry Bonus III (ver.1.40, encrypted)", 0, layout_cherryb3 )
GAMEL( 199?, cb3b, ncb3, cherrys, ncb3, cb3_state, init_cherrys, ROT0, "Dyna", "Cherry Bonus III (alt)", 0, layout_cherryb3 )
-GAME( 199?, cb3c, ncb3, cb3c, chrygld, cb3_state, init_cb3, ROT0, "bootleg", "Cherry Bonus III (alt, set 2)", MACHINE_NOT_WORKING)
+GAME( 199?, cb3c, ncb3, cb3c, chrygld, cb3_state, init_cb3, ROT0, "bootleg", "Cherry Bonus III (alt, set 2)", MACHINE_NOT_WORKING) // encrypted
GAMEL( 199?, cb3d, ncb3, ncb3, ncb3, cb3_state, empty_init, ROT0, "bootleg", "Cherry Bonus III (set 3)", 0, layout_cherryb3 )
GAMEL( 199?, cb3e, ncb3, cb3e, chrygld, cb3_state, init_cb3e, ROT0, "bootleg", "Cherry Bonus III (set 4, encrypted bootleg)", 0, layout_chrygld )
+GAMEL( 199?, cb3f, ncb3, ncb3, ncb3, cb3_state, init_cb3f, ROT0, "bootleg (Cleco)", "Cherry Bonus III (set 5, encrypted bootleg)", MACHINE_NOT_WORKING, layout_chrygld ) // partially decrypted, stops at 'call attendant'
GAMEL( 199?, chryglda, ncb3, cb3e, chrygld, cb3_state, init_cb3e, ROT0, "bootleg", "Cherry Gold I (set 2, encrypted bootleg)", 0, layout_chrygld ) // Runs in CB3e hardware.
GAME( 1994, chryangla, ncb3, chryangla,ncb3, cb3_state, init_chryangl, ROT0, "bootleg (G.C.I.)", "Cherry Angel (encrypted, W-4 hardware)", MACHINE_NOT_WORKING ) // DYNA CB3 V1.40 string, decrypted but only test screens work
@@ -19513,7 +19634,7 @@ GAMEL( 1991, cmasterh, cmaster, cm, cmasterh, cmaster_state, init_cmv4,
GAMEL( 1991, cmasteri, cmaster, cm, cmasterb, cmaster_state, init_cmv4, ROT0, "Dyna", "Cherry Master I (ver.1.01, set 9)", 0, layout_cmasterb ) // NMC27CP128Q being 32k x8 instead of 16k x8...
GAMEL( 1991, cmasterj, cmaster, cm, cmasterb, cmaster_state, init_cmv4, ROT0, "Dyna", "Cherry Master I (ver.1.01, set 10, BET stops all)", 0, layout_cmasterb )
GAMEL( 1991, cmasterk, cmaster, cm, cmasterb, cmaster_state, init_cmv4, ROT0, "Dyna", "Cherry Master I (ver.1.01, set 11, TAKE stops all)", 0, layout_cmasterb )
-GAMEL( 199?, super7, cmaster, cm, cmaster, cmaster_state, init_super7, ROT0, "bootleg", "Super Seven", MACHINE_NOT_WORKING, layout_cmasterb )
+GAMEL( 199?, super7, cmaster, super7, cmaster, cmaster_state, init_super7, ROT0, "bootleg", "Super Seven", MACHINE_NOT_WORKING, layout_cmasterb ) // bad palette, no reels, decryption might be missing something, too
GAME ( 199?, wcat3a, wcat3, chryangl, cmaster, cmaster_state, init_wcat3a, ROT0, "E.A.I.", "Wild Cat 3 (CMV4 hardware)", MACHINE_NOT_WORKING ) // does not boot. Wrong decryption, wrong machine or wrong what?
GAMEL( 1991, tonypok, 0, cm, tonypok, cmaster_state, init_tonypok, ROT0, "Corsica", "Poker Master (Tony-Poker V3.A, hack?)", 0 , layout_tonypok )
diff --git a/src/mame/drivers/groundfx.cpp b/src/mame/drivers/groundfx.cpp
index 32f704ea7d7..a72a5c84b8d 100644
--- a/src/mame/drivers/groundfx.cpp
+++ b/src/mame/drivers/groundfx.cpp
@@ -319,7 +319,7 @@ ROM_END
u32 groundfx_state::irq_speedup_r()
{
int ptr;
- offs_t sp = m_maincpu->sp();
+ offs_t sp = m_maincpu->state_int(M68K_SP);
if ((sp & 2) == 0) ptr = m_ram[(sp & 0x1ffff) / 4];
else ptr = (((m_ram[(sp & 0x1ffff) / 4]) & 0x1ffff) << 16) |
(m_ram[((sp & 0x1ffff) / 4) + 1] >> 16);
diff --git a/src/mame/drivers/gts1.cpp b/src/mame/drivers/gts1.cpp
index 53e5496d3c1..c59b5f570a0 100644
--- a/src/mame/drivers/gts1.cpp
+++ b/src/mame/drivers/gts1.cpp
@@ -25,9 +25,11 @@ a 4-player game. For example, Centigrade 37 (#407) was a single-player game, whi
originally a 4-player EM game (with Pyramid #410 being the 2-player version). Then, the SS
version was made, and it kept the same number. After that, the SS versions were suffixed
with 'SS' up to The Incredible Hulk (#433), and then the 'SS' was dropped.
+Of the solid-state games, Asteroid Annie is single-player - the others are 4-player.
-Game List:
+Game List: (the ROM letter is stamped onto the personality prom)
+
Number ROM Name
409 A Cleopatra
412SS B Sinbad
@@ -45,23 +47,34 @@ Number ROM Name
438 P Torch
440 R Roller Disco
442 S Asteroid Annie and the Aliens
+ T Test Prom
+
+The personality prom is programmed in PGOL (pinball-game oriented language).
Chips used:
-U1 11660 CPU
-U2 10696EE 5101L RAM interface (device#6)
-U3 10696EE General purpose I/O (dipswitches, lamps, misc) (device#3)
-U4 A1753CX Custom 2kx8 ROM, 128x4 RAM, 16x1 I/O (solenoid control)
-U5 A1752CX Custom 2kx8 ROM, 128x4 RAM, 16x1 I/O (switch matrix)
-U6 10788 Display driver
- 5101L 4-bit static RAM
- MM6351-IJ ROM
+U1 11660 Rockwell Parallel Processing System 4-bit CPU (PPS/4-2)
+U2 10696EE General Purpose I/O expander: 5101L RAM interface (device#6)
+U3 10696EE General purpose I/O expander: dipswitches, lamps, misc (device#3)
+U4 A1753CX Early RIOT-type device: Custom 2kx8 ROM, 128x4 RAM, 16x1 I/O (solenoid control)
+U5 A1752CX Early RIOT-type device: Custom 2kx8 ROM, 128x4 RAM, 16x1 I/O (switch matrix)
+U6 10788 Display driver
+Z22 5101L 4-bit static RAM
+Z23 MM6351-IJ Personality PROM
ToDo:
-- Everything
-- Hard to debug because no errors are logged; also the program flow seems odd.
-- 5101L RAM (battery-backed) is driven from the 10696.
-- MM6351 ROM is driven from the CPU I/O ports and has 4 banks.
+- When game started it plays the startup tune and kicks the ball to the shooter - but then
+ -- You can't add more players;
+ -- No switches register, so unable to score;
+ -- The score flashes the high score as if the game had ended;
+ -- You can still hit tilt (num9) and X until it really is game over.
+ -- If the lucky number matches you'll still get a free credit.
+ -- Some games will go straight to test 11, or instant game over.
+
+- Sound boards
+
+- Outputs to lamps and to optional solenoids.
+
*****************************************************************************************************/
@@ -84,8 +97,10 @@ public:
gts1_state(const machine_config &mconfig, device_type type, const char *tag)
: genpin_class(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
- , m_dips(*this, "DSW%u", 0)
- , m_switches(*this, "X.%u", 0)
+ , m_pm(*this, "module") // personality module
+ , m_nvram(*this, "nvram")
+ , m_dips(*this, "DSW%u", 0U)
+ , m_switches(*this, "X%u", 0U)
, m_digit8(*this, "digit8_%u", 0U)
, m_digit7(*this, "digit7_%u", 0U)
{ }
@@ -93,19 +108,18 @@ public:
void gts1(machine_config &config);
private:
- uint8_t gts1_solenoid_r(offs_t offset);
- void gts1_solenoid_w(offs_t offset, uint8_t data);
- uint8_t gts1_switches_r(offs_t offset);
- void gts1_switches_w(offs_t offset, uint8_t data);
- void gts1_display_w(offs_t offset, uint8_t data);
- uint8_t gts1_lamp_apm_r(offs_t offset);
- void gts1_lamp_apm_w(offs_t offset, uint8_t data);
- uint8_t gts1_nvram_r(offs_t offset);
- void gts1_nvram_w(offs_t offset, uint8_t data);
- uint8_t gts1_io_r(offs_t offset);
- void gts1_io_w(offs_t offset, uint8_t data);
- uint8_t gts1_pa_r();
- void gts1_do_w(uint8_t data);
+ u8 gts1_solenoid_r(offs_t offset);
+ void gts1_solenoid_w(offs_t offset, u8 data);
+ u8 gts1_switches_r(offs_t offset);
+ void gts1_switches_w(offs_t offset, u8 data);
+ void gts1_display_w(offs_t offset, u8 data);
+ u8 gts1_lamp_apm_r(offs_t offset);
+ void gts1_lamp_apm_w(offs_t offset, u8 data);
+ u8 gts1_nvram_r(offs_t offset);
+ void gts1_nvram_w(offs_t offset, u8 data);
+ u8 gts1_pa_r();
+ void gts1_do_w(u8 data);
+ void nvram_w();
virtual void machine_start() override;
virtual void machine_reset() override;
@@ -114,168 +128,187 @@ private:
void gts1_data(address_map &map);
void gts1_io(address_map &map);
- required_device<cpu_device> m_maincpu;
+ required_device<pps4_2_device> m_maincpu;
+ required_region_ptr<u8> m_pm;
+ required_shared_ptr<u8> m_nvram;
required_ioport_array<3> m_dips;
- required_ioport_array<5> m_switches;
- output_finder<32> m_digit8; // driver currently uses 0-6, 8-14, 16-22 and 24-30
- output_finder<32> m_digit7; // driver currently uses 7, 15, 23 and 31
-
- uint8_t m_strobe; //!< switches strobe lines (5 lower bits used)
- uint8_t m_nvram_addr; //!< NVRAM address
- bool m_nvram_e2; //!< NVRWAM enable (E2 line)
- bool m_nvram_wr; //!< NVRWAM write (W/R line)
- uint16_t m_6351_addr; //!< ROM MM6351 address (12 bits)
- uint16_t m_z30_out; //!< 4-to-16 decoder outputs
+ required_ioport_array<6> m_switches;
+ output_finder<32> m_digit8; // digits 0-5,8-13,16-21,24-29
+ output_finder<32> m_digit7; // digits 6,7,14,15 on repurposed digital clock display
+
+ u8 m_strobe = 0; //!< switches strobe lines (5 lower bits used)
+ u8 m_nvram_addr = 0xff; //!< NVRAM address
+ u8 m_nvram_data = 0;
+ bool m_nvram_e2 = 0; //!< NVRWAM enable (E2 line)
+ bool m_nvram_wr = 0; //!< NVRWAM write (W/R line)
+ u16 m_6351_addr = 0; //!< ROM MM6351 address (12 bits)
+ u8 m_z30_out = 0; //!< 4-to-16 decoder outputs
};
void gts1_state::gts1_map(address_map &map)
{
- map(0x0000, 0x0fff).rom();
+ map(0x0000, 0x0fff).rom(); // ROM inside A1752XX and A1753XX chips
}
void gts1_state::gts1_data(address_map &map)
{
- map(0x0000, 0x00ff).ram();
- map(0x0100, 0x01ff).ram().share("nvram");
+ map(0x0000, 0x00ff).ram(); // RAM inside A1752XX and A1753XX chips
+ map(0x0100, 0x01ff).ram().share("nvram"); // Battery-backed M5101L
}
void gts1_state::gts1_io(address_map &map)
{
- map(0x0000, 0x00ff).r(FUNC(gts1_state::gts1_io_r)).w(FUNC(gts1_state::gts1_io_w)); // catch undecoded I/O accesss
-
- map(0x0020, 0x002f).rw("u4", FUNC(ra17xx_device::io_r), FUNC(ra17xx_device::io_w)); // (U4) solenoid
- map(0x0030, 0x003f).rw("u3", FUNC(r10696_device::io_r), FUNC(r10696_device::io_w)); // (U3) solenoid + dips
- map(0x0040, 0x004f).rw("u5", FUNC(ra17xx_device::io_r), FUNC(ra17xx_device::io_w)); // (U5) switch matrix
- map(0x0060, 0x006f).rw("u2", FUNC(r10696_device::io_r), FUNC(r10696_device::io_w)); // (U2) NVRAM io chip
- map(0x00d0, 0x00df).rw("u6", FUNC(r10788_device::io_r), FUNC(r10788_device::io_w)); // (U6) display chip
+ map(0x20, 0x2f).rw("u5", FUNC(ra17xx_device::io_r), FUNC(ra17xx_device::io_w)); // (U5) switch matrix
+ map(0x30, 0x3f).rw("u3", FUNC(r10696_device::io_r), FUNC(r10696_device::io_w)); // (U3) solenoid + dips
+ map(0x40, 0x4f).rw("u4", FUNC(ra17xx_device::io_r), FUNC(ra17xx_device::io_w)); // (U4) solenoid
+ map(0x60, 0x6f).rw("u2", FUNC(r10696_device::io_r), FUNC(r10696_device::io_w)); // (U2) NVRAM io chip
+ map(0xd0, 0xdf).rw("u6", FUNC(r10788_device::io_r), FUNC(r10788_device::io_w)); // (U6) display chip
}
static INPUT_PORTS_START( gts1_dips )
PORT_START("DSW0")
- PORT_DIPNAME( 0x01, 0x00, "S01")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x01, DEF_STR( On ))
- PORT_DIPNAME( 0x02, 0x00, "S02")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x02, DEF_STR( On ))
- PORT_DIPNAME( 0x04, 0x00, "S03")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x04, DEF_STR( On ))
- PORT_DIPNAME( 0x08, 0x00, "S04")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x08, DEF_STR( On ))
- PORT_DIPNAME( 0x10, 0x00, "S05")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x10, DEF_STR( On ))
- PORT_DIPNAME( 0x20, 0x20, "S06")
- PORT_DIPSETTING( 0x00, DEF_STR( No ))
- PORT_DIPSETTING( 0x20, DEF_STR( Yes ))
- PORT_DIPNAME( 0x40, 0x40, "S07")
- PORT_DIPSETTING( 0x00, DEF_STR( No ))
- PORT_DIPSETTING( 0x40, DEF_STR( Yes ))
- PORT_DIPNAME( 0x80, 0x80, "S08")
- PORT_DIPSETTING( 0x00, DEF_STR( No ))
- PORT_DIPSETTING( 0x80, DEF_STR( Yes ))
+ PORT_DIPNAME( 0x0f, 0x0f, "Coinage Left Slot") PORT_DIPLOCATION("SWM1:1,2,3,4")
+ PORT_DIPSETTING( 0x0f, DEF_STR(1C_1C))
+ PORT_DIPSETTING( 0x0e, DEF_STR(1C_2C))
+ PORT_DIPSETTING( 0x0d, DEF_STR(1C_3C))
+ PORT_DIPSETTING( 0x0c, DEF_STR(1C_4C))
+ PORT_DIPSETTING( 0x0b, DEF_STR(1C_5C))
+ PORT_DIPSETTING( 0x0a, DEF_STR(1C_6C))
+ PORT_DIPSETTING( 0x09, DEF_STR(1C_7C))
+ PORT_DIPSETTING( 0x08, DEF_STR(1C_8C))
+ PORT_DIPSETTING( 0x07, DEF_STR(1C_9C))
+ PORT_DIPSETTING( 0x06, DEF_STR(2C_1C))
+ PORT_DIPSETTING( 0x05, DEF_STR(2C_2C))
+ PORT_DIPSETTING( 0x04, DEF_STR(2C_3C))
+ PORT_DIPSETTING( 0x03, DEF_STR(2C_4C))
+ PORT_DIPSETTING( 0x02, DEF_STR(2C_5C))
+ PORT_DIPSETTING( 0x01, "1 coin 1 credit, 2 coins 3 credits")
+ PORT_DIPSETTING( 0x00, DEF_STR(3C_1C))
+ PORT_DIPNAME( 0xf0, 0xf0, "Coinage Right Slot") PORT_DIPLOCATION("SWM1:5,6,7,8")
+ PORT_DIPSETTING( 0xf0, DEF_STR(1C_1C))
+ PORT_DIPSETTING( 0xe0, DEF_STR(1C_2C))
+ PORT_DIPSETTING( 0xd0, DEF_STR(1C_3C))
+ PORT_DIPSETTING( 0xc0, DEF_STR(1C_4C))
+ PORT_DIPSETTING( 0xb0, DEF_STR(1C_5C))
+ PORT_DIPSETTING( 0xa0, DEF_STR(1C_6C))
+ PORT_DIPSETTING( 0x90, DEF_STR(1C_7C))
+ PORT_DIPSETTING( 0x80, DEF_STR(1C_8C))
+ PORT_DIPSETTING( 0x70, DEF_STR(1C_9C))
+ PORT_DIPSETTING( 0x60, DEF_STR(2C_1C))
+ PORT_DIPSETTING( 0x50, DEF_STR(2C_2C))
+ PORT_DIPSETTING( 0x40, DEF_STR(2C_3C))
+ PORT_DIPSETTING( 0x30, DEF_STR(2C_4C))
+ PORT_DIPSETTING( 0x20, DEF_STR(2C_5C))
+ PORT_DIPSETTING( 0x10, "1 coin 1 credit, 2 coins 3 credits")
+ PORT_DIPSETTING( 0x00, DEF_STR(3C_1C))
PORT_START("DSW1")
- PORT_DIPNAME( 0x01, 0x00, "S09")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x01, DEF_STR( On ))
- PORT_DIPNAME( 0x02, 0x00, "S10")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x02, DEF_STR( On ))
- PORT_DIPNAME( 0x04, 0x00, "S11")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x04, DEF_STR( On ))
- PORT_DIPNAME( 0x08, 0x00, "S12")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x08, DEF_STR( On ))
- PORT_DIPNAME( 0x10, 0x00, "S13")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x10, DEF_STR( On ))
- PORT_DIPNAME( 0x20, 0x00, "S14")
- PORT_DIPSETTING( 0x00, DEF_STR( Yes ))
- PORT_DIPSETTING( 0x20, DEF_STR( No ))
- PORT_DIPNAME( 0x40, 0x40, "S15")
- PORT_DIPSETTING( 0x00, DEF_STR( No ))
- PORT_DIPSETTING( 0x40, DEF_STR( Yes ))
- PORT_DIPNAME( 0x80, 0x00, "S16")
- PORT_DIPSETTING( 0x00, DEF_STR( No ))
- PORT_DIPSETTING( 0x80, DEF_STR( Yes ))
+ PORT_DIPNAME( 0x01, 0x00, "Balls") PORT_DIPLOCATION("SWM2:1")
+ PORT_DIPSETTING( 0x00, "3")
+ PORT_DIPSETTING( 0x01, "5")
+ PORT_DIPNAME( 0x02, 0x00, "Match") PORT_DIPLOCATION("SWM2:2")
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ))
+ PORT_DIPNAME( 0x04, 0x00, "Preset score award") PORT_DIPLOCATION("SWM2:3")
+ PORT_DIPSETTING( 0x00, "Replay")
+ PORT_DIPSETTING( 0x04, "Extra Ball")
+ PORT_DIPNAME( 0x08, 0x00, "Tilt Penalty") PORT_DIPLOCATION("SWM2:4")
+ PORT_DIPSETTING( 0x00, "Ball")
+ PORT_DIPSETTING( 0x08, "Game")
+ PORT_DIPNAME( 0x10, 0x00, "Credits display") PORT_DIPLOCATION("SWM2:5")
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ))
+ PORT_DIPNAME( 0x20, 0x00, "Game start sound") PORT_DIPLOCATION("SWM2:6")
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ))
+ PORT_DIPNAME( 0x40, 0x40, "S15") PORT_DIPLOCATION("SWM2:7")
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ))
+ PORT_DIPNAME( 0x80, 0x80, "S16") PORT_DIPLOCATION("SWM2:8")
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ))
PORT_START("DSW2")
- PORT_DIPNAME( 0x01, 0x00, "S17")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x01, DEF_STR( On ))
- PORT_DIPNAME( 0x02, 0x00, "S18")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x02, DEF_STR( On ))
- PORT_DIPNAME( 0x04, 0x00, "S19")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x04, DEF_STR( On ))
- PORT_DIPNAME( 0x08, 0x00, "S20")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x08, DEF_STR( On ))
- PORT_DIPNAME( 0x10, 0x00, "S21")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x10, DEF_STR( On ))
- PORT_DIPNAME( 0x20, 0x00, "S22")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x20, DEF_STR( On ))
- PORT_DIPNAME( 0x40, 0x00, "S23")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x40, DEF_STR( On ))
- PORT_DIPNAME( 0x80, 0x00, "S24")
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x80, DEF_STR( On ))
+ PORT_DIPNAME( 0x03, 0x00, "Max credits") PORT_DIPLOCATION("SWM3:1,2")
+ PORT_DIPSETTING( 0x03, "5")
+ PORT_DIPSETTING( 0x02, "8")
+ PORT_DIPSETTING( 0x01, "10")
+ PORT_DIPSETTING( 0x00, "15")
+ PORT_DIPNAME( 0x04, 0x04, "S1-4 control both slots") PORT_DIPLOCATION("SWM3:3")
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ))
+ PORT_DIPNAME( 0x08, 0x00, "Ingame sound") PORT_DIPLOCATION("SWM3:4")
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ))
+ PORT_DIPNAME( 0x10, 0x00, "High game display") PORT_DIPLOCATION("SWM3:5")
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ))
+ PORT_DIPNAME( 0x20, 0x00, "High game awards 3 credits") PORT_DIPLOCATION("SWM3:6")
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ))
+ PORT_DIPNAME( 0x40, 0x00, "Coin sound") PORT_DIPLOCATION("SWM3:7")
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ))
+ PORT_DIPNAME( 0x80, 0x80, "S24") PORT_DIPLOCATION("SWM3:8")
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ))
INPUT_PORTS_END
static INPUT_PORTS_START( gts1_switches )
- PORT_START("X.0")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_START("X.1")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_START("X.2")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_START("X.3")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_START("X.4")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
+ PORT_START("X0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Play/Test")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("SW.10")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("SW.20")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("SW.30")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("SW.40")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("SW.50")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("SW.60")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("SW.70")
+
+ PORT_START("X1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("SW.11")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("SW.21")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("SW.31")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("SW.41")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("SW.51")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("SW.61")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("SW.71")
+
+ PORT_START("X2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("SW.12")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("SW.22")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("SW.32")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("SW.42")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("SW.52")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("SW.62")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("SW.72")
+
+ PORT_START("X3")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("SW.13")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("SW.23")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("SW.33")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("SW.43")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("SW.53")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("SW.63")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("SW.73")
+
+ PORT_START("X4")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Tilt")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("SW.14")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("SW.24")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("SW.34")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("SW.44")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("SW.54")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("SW.64")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("SW.74")
+
+ PORT_START("X5")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Reset")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Outhole")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Slam Tilt")
INPUT_PORTS_END
static INPUT_PORTS_START( gts1 )
@@ -285,57 +318,52 @@ static INPUT_PORTS_START( gts1 )
INPUT_PORTS_END
static INPUT_PORTS_START( jokrpokr )
- PORT_INCLUDE( gts1_dips )
-
- PORT_START("X.0")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("PLAY/TEST")
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("POP/BUMBER")
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("EXTRA BALL TARGET")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("SPECIAL ROLLOVER")
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("10 POINT CONTACTS")
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"A\" DROP TARGET (red)")
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
-
- PORT_START("X.1")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("#1 COIN CHUTE")
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"A\" ROLLOVER")
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"10\" DROP TARGET")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"Q\" DROP TARGET (red)")
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"K\" DROP TARGET (black)")
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"A\" DROP TARGET (black)")
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
-
- PORT_START("X.2")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("#2 COIN CHUTE")
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"B\" ROLLOVER")
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"J\" DROP TARGET (black)")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"O\" DROP TARGET (black)")
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"K\" DROP TARGET")
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("JOKER DROP TARGET")
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
-
- PORT_START("X.3")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("REPLAY BUTTON")
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"C\" ROLLOVER")
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"J\" DROP TARGET (red)")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"O\" DROP TARGET (red)")
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"K\" DROP TARGET")
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"A\" DROP TARGET (red)")
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
-
- PORT_START("X.4")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("TILT PANEL")
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"K\" DROP TARGET")
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"A\" DROP TARGET (red)")
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
+ PORT_INCLUDE( gts1 )
+
+ PORT_MODIFY("X0")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("POP/BUMBER")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("EXTRA BALL TARGET")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("SPECIAL ROLLOVER")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("10 POINT CONTACTS")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("\"A\" DROP TARGET (red)")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_MODIFY("X1")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("\"A\" ROLLOVER")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("\"10\" DROP TARGET")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("\"Q\" DROP TARGET (red)")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("\"K\" DROP TARGET (black)")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("\"A\" DROP TARGET (black)")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_MODIFY("X2")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("\"B\" ROLLOVER")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("\"J\" DROP TARGET (black)")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("\"O\" DROP TARGET (black)")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("\"K\" DROP TARGET")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("JOKER DROP TARGET")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_MODIFY("X3")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("\"C\" ROLLOVER")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("\"J\" DROP TARGET (red)")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("\"O\" DROP TARGET (red)")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("\"K\" DROP TARGET")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("\"A\" DROP TARGET (red)")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_MODIFY("X4")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_COMMA) PORT_NAME("\"K\" DROP TARGET")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("\"A\" DROP TARGET (red)")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
INPUT_PORTS_END
void gts1_state::machine_start()
@@ -347,6 +375,7 @@ void gts1_state::machine_start()
save_item(NAME(m_strobe));
save_item(NAME(m_nvram_addr));
+ save_item(NAME(m_nvram_data));
save_item(NAME(m_nvram_e2));
save_item(NAME(m_nvram_wr));
save_item(NAME(m_6351_addr));
@@ -358,105 +387,108 @@ void gts1_state::machine_reset()
genpin_class::machine_reset();
m_strobe = 0;
- m_nvram_addr = 0;
+ m_nvram_addr = 0xff;
+ m_nvram_data = 0;
m_nvram_e2 = false;
m_nvram_wr = false;
- m_6351_addr = 0;
+ m_6351_addr = 0x3ff;
m_z30_out = 0;
}
-uint8_t gts1_state::gts1_solenoid_r(offs_t offset)
+u8 gts1_state::gts1_solenoid_r(offs_t offset) // does nothing
{
- uint8_t data = 0;
- LOG("%s: solenoid[%02x] -> %x\n", __FUNCTION__, offset, data);
+ u8 data = 0;
+ //LOG("%s: solenoid[%02x] -> %x\n", __FUNCTION__, offset, data);
return data;
}
-void gts1_state::gts1_solenoid_w(offs_t offset, uint8_t data)
+void gts1_state::gts1_solenoid_w(offs_t offset, u8 data) // WORKS
{
+ //LOG("%s: solenoid #[%02X] gets data=%X\n", __FUNCTION__, offset, data);
switch (offset)
{
- case 0:
- LOG("%s: outhole <- %x\n", __FUNCTION__, data);
+ case 0: // outhole
+ if (data)
+ m_samples->start(5, 5);
break;
- case 1:
- LOG("%s: knocker <- %x\n", __FUNCTION__, data);
+ case 1: // knocker
+ if (data)
+ m_samples->start(0, 6);
break;
- case 2:
- LOG("%s: tens chime <- %x\n", __FUNCTION__, data);
+ case 2: // tens chime
+ if (data)
+ m_samples->start(3, 3);
break;
- case 3:
- LOG("%s: hundreds chime <- %x\n", __FUNCTION__, data);
+ case 3: // hundreds chime
+ if (data)
+ m_samples->start(2, 2);
break;
- case 4:
- LOG("%s: thousands chime <- %x\n", __FUNCTION__, data);
+ case 4: // thousands chime
+ if (data)
+ m_samples->start(1, 1);
break;
- case 5:
- LOG("%s: no. 6 <- %x\n", __FUNCTION__, data);
+ case 5: // optional per machine
break;
- case 6:
- LOG("%s: no. 7 <- %x\n", __FUNCTION__, data);
+ case 6: // optional per machine
break;
- case 7:
- LOG("%s: no. 8 <- %x\n", __FUNCTION__, data);
+ case 7: // optional per machine
break;
- case 8: case 9: case 10: case 11:
- LOG("%s: not used [%x] <- %x\n", __FUNCTION__, offset, data);
+ case 8: case 9: case 10: case 11: // unused
break;
case 12: // spare
- LOG("%s: spare [%x] <- %x\n", __FUNCTION__, offset, data);
break;
case 13: // RAM control E2
- LOG("%s: RAM control E2 <- %x\n", __FUNCTION__, data);
- m_nvram_e2 = (data & 1) ? true : false;
+ m_nvram_e2 = data ? true : false;
+ nvram_w();
break;
case 14: // RAM control W/R
- LOG("%s: RAM control W/R <- %x\n", __FUNCTION__, data);
- m_nvram_wr = (data & 1) ? true : false;
+ m_nvram_wr = data ? false : true;
+ nvram_w();
break;
case 15: // spare
- LOG("%s: spare [%x] <- %x\n", __FUNCTION__, offset, data);
break;
}
}
-uint8_t gts1_state::gts1_switches_r(offs_t offset)
+u8 gts1_state::gts1_switches_r(offs_t offset) // only switches with offset 0 are working; can't go in-game to try the others **********
{
- uint8_t data = 1;
- if (offset >= 8 && offset < 16) {
- const int bit = offset - 8;
- for (int i = 0; i < 5; i++) {
- if (m_strobe & (1 << i)) {
- data &= BIT(m_switches[i]->read(), bit);
+ u8 data = 0;
+ if (offset > 7)
+ for (u8 i = 0; i < 5; i++)
+ if (BIT(m_strobe, i))
+ {
+ data |= BIT(m_switches[i]->read(), offset & 7);
+ //LOG("%s: switches[bit %X of %X, using offset of %X] got %x\n", __FUNCTION__, i, m_strobe, offset&7, data);
}
- }
- }
- LOG("%s: switches[%x,%x] -> %x\n", __FUNCTION__, m_strobe, offset, data);
- return data;
+ return data ? 0 : 1; // FIXME: inverted or normal?
}
-void gts1_state::gts1_switches_w(offs_t offset, uint8_t data)
+void gts1_state::gts1_switches_w(offs_t offset, u8 data) // WORKS
{
- LOG("%s: switches[%x] <- %x\n", __FUNCTION__, offset, data);
- if (offset < 5) {
- // outputs O-0 to O-4 are the 5 strobe lines
- m_strobe = (m_strobe & ~(1 << offset)) | ((data & 1) << offset);
+ // outputs O-0 to O-4 are the 5 strobe lines
+ if (offset < 5)
+ {
+ if (data)
+ m_strobe |= (1<<offset);
+ else
+ m_strobe &= ~(1<<offset);
+ //LOG("%s: strobe is now[%x], data was %x\n", __FUNCTION__, m_strobe, data);
}
}
/**
* @brief write a 8seg display value
- * @param offset digit number 0 .. 19
+ * @param offset digit number 0 .. 15
* @param data 4-bit value to display
*/
-void gts1_state::gts1_display_w(offs_t offset, uint8_t data)
+void gts1_state::gts1_display_w(offs_t offset, u8 data) // WORKS
{
/*
* The 7448 is modified to be disabled through RI/RBO
* when the input is 0001, and in this case the extra
* output H is generated instead.
*/
- enum : uint8_t
+ enum : u8
{
_a = 1 << 0,
_b = 1 << 1,
@@ -467,7 +499,7 @@ void gts1_state::gts1_display_w(offs_t offset, uint8_t data)
_g = 1 << 6,
_h = 1 << 7
};
- static constexpr uint8_t ttl7448_mod[16] = {
+ static constexpr u8 ttl7448_mod[16] = {
/* 0 */ _a | _b | _c | _d | _e | _f,
/* 1 */ _h,
/* 2 */ _a | _b | _d | _e | _g,
@@ -485,24 +517,24 @@ void gts1_state::gts1_display_w(offs_t offset, uint8_t data)
/* e */ _d | _e | _f | _g,
/* f */ 0
};
- uint8_t a = ttl7448_mod[(data >> 0) & 15];
- uint8_t b = ttl7448_mod[(data >> 4) & 15];
+ data ^= 0xff; // It was stored in the 10788 inverted
+ u8 a = ttl7448_mod[BIT(data, 0, 4)];
+ u8 b = ttl7448_mod[BIT(data, 4, 4)];
// LOG("%s: offset:%d data:%02x a:%02x b:%02x\n", __FUNCTION__, offset, data, a, b);
- if ((offset % 8) < 7) { // FIXME: layout suggests this should be < 6 rather than < 7
+ if ((offset % 8) < 6)
+ {
m_digit8[offset] = a;
m_digit8[offset + 16] = b;
- } else {
+ }
+ else
+ {
/*
* For the 4 7-seg displays the segment h is turned back into
- * segments b and c to display the 7-seg "1".
- */
+ * segments b and c to display the 7-seg "1". */
if (a & _h)
a = _b | _c;
- if (b & _h)
- b = _b | _c;
+
m_digit7[offset] = a;
- // FIXME: there is nothing on outputs 22, 23, 30 and 31?
- m_digit7[offset + 16] = b;
}
}
@@ -511,18 +543,16 @@ void gts1_state::gts1_display_w(offs_t offset, uint8_t data)
* @param offset 0 ... 2 = group
* @return 4-bit value read from the group
*/
-uint8_t gts1_state::gts1_nvram_r(offs_t offset)
+u8 gts1_state::gts1_nvram_r(offs_t offset) // WORKS
{
- uint8_t data = 0x0f;
+ u8 data = 0x0f;
switch (offset)
{
case 0: // group A
- // FIXME: Schematics says TO Z5
- if (!m_nvram_wr && m_nvram_e2) {
- uint8_t* nvram = memregion("nvram")->base();
- assert(nvram != nullptr);
- data = nvram[m_nvram_addr];
- LOG("%s: nvram[%02x] -> %x\n", __FUNCTION__, m_nvram_addr, data);
+ if (m_nvram_e2)
+ {
+ data = m_nvram[m_nvram_addr];
+ LOG("%s: NVRAM READ @[%02x] -> %x\n", __FUNCTION__, m_nvram_addr, data);
}
break;
case 1: // group B
@@ -530,7 +560,7 @@ uint8_t gts1_state::gts1_nvram_r(offs_t offset)
// Schematics says: SPARES
break;
}
- return data;
+ return ~data & 15;
}
/**
@@ -538,113 +568,58 @@ uint8_t gts1_state::gts1_nvram_r(offs_t offset)
* @param offset 0 ... 2 = group
* @param data 4 bit value to write
*/
-void gts1_state::gts1_nvram_w(offs_t offset, uint8_t data)
+ /* NVRAM locations: Each stored parameter takes 6 nybbles. The address is XY, where X = the test number in the bookkeeping functions (0 to 9),
+ and Y = 0 for units, 1 for tens, etc. Additionally, A0-A5 is for the high score to date (bookkeeping function 10), and B0-B5 is the stored credits. */
+void gts1_state::gts1_nvram_w(offs_t offset, u8 data) // WORKS
{
+ data = ~data & 15; // make the nvram compatible with pinmame
switch (offset)
{
case 0: // group A - address lines 3:0
- m_nvram_addr = (m_nvram_addr & ~15) | (data & 15);
+ m_nvram_addr = (m_nvram_addr & 0xf0) | data;
break;
case 1: // group B - address lines 7:4
- m_nvram_addr = (m_nvram_addr & ~(15 << 4)) | ((data & 15) << 4);
+ m_nvram_addr = (m_nvram_addr & 15) | (data << 4);
break;
case 2: // group C - data bits 3:0 of NVRAM
- if (m_nvram_wr && m_nvram_e2) {
- LOG("%s: nvram[%02x] <- %x\n", __FUNCTION__, m_nvram_addr, data & 15);
- uint8_t* nvram = memregion("nvram")->base();
- assert(nvram != nullptr);
- nvram[m_nvram_addr] = data & 15;
- }
+ m_nvram_data = data;
+ nvram_w();
break;
}
}
+void gts1_state::nvram_w()
+{
+ if (m_nvram_wr && m_nvram_e2)
+ {
+ LOG("%s: NVRAM WRITE @[%02x] <- %x\n", __FUNCTION__, m_nvram_addr, m_nvram_data);
+ m_nvram[m_nvram_addr] = m_nvram_data;
+ //if (m_nvram_addr == 0xb1) machine().debug_break();
+ }
+}
+
/**
* @brief read input groups A, B, C of lamp + apm I/O chip (U3)
* @param offset 0 ... 2 = group
* @return 4-bit value read from the group
*/
-uint8_t gts1_state::gts1_lamp_apm_r(offs_t offset)
+u8 gts1_state::gts1_lamp_apm_r(offs_t offset) // Think this works - dips seem to work correctly
{
- uint8_t data = 0x0f;
+ u8 data = 0x0f;
switch (offset) {
case 0: // group A switches S01-S04, S09-S12, S17-S20
- if (m_z30_out & 1) {
- uint8_t dsw0 = m_dips[0]->read();
- if (0 == BIT(dsw0,0)) // S01
- data &= ~(1 << 3);
- if (0 == BIT(dsw0,1)) // S02
- data &= ~(1 << 2);
- if (0 == BIT(dsw0,2)) // S03
- data &= ~(1 << 1);
- if (0 == BIT(dsw0,3)) // S04
- data &= ~(1 << 0);
- }
- if (m_z30_out & 2) {
- uint8_t dsw1 = m_dips[1]->read();
- if (0 == BIT(dsw1,0)) // S09
- data &= ~(1 << 0);
- if (0 == BIT(dsw1,1)) // S10
- data &= ~(1 << 1);
- if (0 == BIT(dsw1,2)) // S11
- data &= ~(1 << 2);
- if (0 == BIT(dsw1,3)) // S12
- data &= ~(1 << 3);
- }
- if (m_z30_out & 4) {
- uint8_t dsw2 = m_dips[2]->read();
- if (0 == BIT(dsw2,0)) // S17
- data &= ~(1 << 0);
- if (0 == BIT(dsw2,1)) // S18
- data &= ~(1 << 1);
- if (0 == BIT(dsw2,2)) // S19
- data &= ~(1 << 2);
- if (0 == BIT(dsw2,3)) // S20
- data &= ~(1 << 3);
- }
+ if (m_z30_out < 3)
+ data = BIT(m_dips[m_z30_out]->read(),0,4);
break;
case 1: // group B switches S05-S08, S09-S12, S17-S20
- if (m_z30_out & 1) {
- uint8_t dsw0 = m_dips[0]->read();
- if (0 == BIT(dsw0,4)) // S05
- data &= ~(1 << 3);
- if (0 == BIT(dsw0,5)) // S06
- data &= ~(1 << 2);
- if (0 == BIT(dsw0,6)) // S07
- data &= ~(1 << 1);
- if (0 == BIT(dsw0,7)) // S08
- data &= ~(1 << 0);
- }
- if (m_z30_out & 2) {
- uint8_t dsw1 = m_dips[1]->read();
- if (0 == BIT(dsw1,4)) // S13
- data &= ~(1 << 0);
- if (0 == BIT(dsw1,5)) // S14
- data &= ~(1 << 1);
- if (0 == BIT(dsw1,6)) // S15
- data &= ~(1 << 2);
- if (0 == BIT(dsw1,7)) // S16
- data &= ~(1 << 3);
- }
- if (m_z30_out & 4) {
- uint8_t dsw2 = m_dips[2]->read();
- if (0 == BIT(dsw2,4)) // S21
- data &= ~(1 << 0);
- if (0 == BIT(dsw2,5)) // S22
- data &= ~(1 << 1);
- if (0 == BIT(dsw2,6)) // S23
- data &= ~(1 << 2);
- if (0 == BIT(dsw2,7)) // S24
- data &= ~(1 << 3);
- }
+ if (m_z30_out < 3)
+ data = BIT(m_dips[m_z30_out]->read(),4,4);
break;
- case 2: // TODO: connect
- // IN-9 (unused?)
- // IN-10 (reset sw25)
- // IN-11 (outhole sw)
- // IN-12 (slam sw)
+ case 2: // 3 hardwired switches
+ data = m_switches[5]->read();
break;
}
+ //LOG("%s: offs=%d, m_z30_out=%d, data=%d\n", __FUNCTION__, offset, m_z30_out, data);
return data;
}
@@ -653,59 +628,47 @@ uint8_t gts1_state::gts1_lamp_apm_r(offs_t offset)
* @param offset 0 ... 2 = group
* @param data 4 bit value to write
*/
-void gts1_state::gts1_lamp_apm_w(offs_t offset, uint8_t data)
+void gts1_state::gts1_lamp_apm_w(offs_t offset, u8 data) // Working for the dips, not sure about the PM address. Lamps to be done. ***********
{
switch (offset) {
- case 0: // LD1-LD4 on jumper J5
+ case 0: // LD1-LD4 on jumper J5 // lamps - TODO *********
break;
- case 1: // Z30 1-of-16 decoder
- m_z30_out = 1 << (data & 15);
+ case 1: // Z30 1-of-16 decoder // lamps - TODO *********
+ m_z30_out = ~data & 15;
break;
case 2: // O9: PGOL PROM A8, O10: PGOL PROM A9
- m_6351_addr = (m_6351_addr & ~(3 << 8)) | ((data & 3) << 8);
- // O11 and O12 are unused(?)
+ m_6351_addr = (m_6351_addr & 0xff) | ((data & 3) << 8);
+ // O11 and O12 are unused
break;
}
}
-uint8_t gts1_state::gts1_io_r(offs_t offset)
-{
- const uint8_t data = 0x0f;
- LOG("%s: unmapped io[%02x] -> %x\n", __FUNCTION__, offset, data);
- return data;
-}
-
-void gts1_state::gts1_io_w(offs_t offset, uint8_t data)
-{
- LOG("%s: unmapped io[%02x] <- %x\n", __FUNCTION__, offset, data);
-}
-
-uint8_t gts1_state::gts1_pa_r()
+u8 gts1_state::gts1_pa_r() // TODO: address normal or inverted? data normal or inverted? ***************
{
- // return ROM nibble
- uint8_t *ROM = memregion("maincpu")->base();
- uint8_t data = ROM[0x2000 + m_6351_addr] & 0x0f;
- LOG("%s: ROM[%03x]:%02x\n", __FUNCTION__, m_6351_addr, data);
- return data;
+ u16 addr = m_6351_addr; // ^ 0x3ff;
+ // return nibble from personality module ROM
+ u8 data = m_pm[addr];
+ LOG("%s: PROM READ @[%03x]:%02x\n", __FUNCTION__, addr, data);
+ return ~data & 15; // inverted = game over at start; normal = test mode at start
}
-void gts1_state::gts1_do_w(uint8_t data)
+void gts1_state::gts1_do_w(u8 data)
{
// write address lines (DO1-4 to A0-3, DIO1-4 to A4-7)
m_6351_addr = (m_6351_addr & 0x300) | data;
- LOG("%s: ROM addr:%02x\n", __FUNCTION__, m_6351_addr);
+ LOG("%s: PROM addr:%02x\n", __FUNCTION__, m_6351_addr);
}
void gts1_state::gts1(machine_config & config)
{
/* basic machine hardware */
- pps4_2_device &maincpu(PPS4_2(config, m_maincpu, XTAL(3'579'545))); // divided by 18 in the CPU
- maincpu.set_addrmap(AS_PROGRAM, &gts1_state::gts1_map);
- maincpu.set_addrmap(AS_DATA, &gts1_state::gts1_data);
- maincpu.set_addrmap(AS_IO, &gts1_state::gts1_io);
- maincpu.dia_cb().set(FUNC(gts1_state::gts1_pa_r));
- maincpu.do_cb().set(FUNC(gts1_state::gts1_do_w));
+ PPS4_2(config, m_maincpu, XTAL(3'579'545)); // divided by 18 in the CPU
+ m_maincpu->set_addrmap(AS_PROGRAM, &gts1_state::gts1_map);
+ m_maincpu->set_addrmap(AS_DATA, &gts1_state::gts1_data);
+ m_maincpu->set_addrmap(AS_IO, &gts1_state::gts1_io);
+ m_maincpu->dia_cb().set(FUNC(gts1_state::gts1_pa_r));
+ m_maincpu->do_cb().set(FUNC(gts1_state::gts1_do_w));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -744,26 +707,33 @@ void gts1_state::gts1(machine_config & config)
ROM_START( gts1 )
- ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
+
+ ROM_REGION( 0x0400, "module", ROMREGION_ERASEFF )
ROM_END
ROM_START( gts1s )
- ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
+
+ ROM_REGION( 0x0400, "module", ROMREGION_ERASEFF )
ROM_END
/*-------------------------------------------------------------------
/ Asteroid Annie and the Aliens (12/1980) #442
/-------------------------------------------------------------------*/
ROM_START(astannie)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("442.cpu", 0x2000, 0x0400, CRC(579521e0) SHA1(b1b19473e1ca3373955ee96104b87f586c4c311c))
- ROM_REGION(0x10000, "cpu2", 0)
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("442.cpu", 0x0000, 0x0400, CRC(579521e0) SHA1(b1b19473e1ca3373955ee96104b87f586c4c311c))
+
+ ROM_REGION( 0x10000, "audiocpu", 0)
ROM_LOAD("442.snd", 0x0400, 0x0400, CRC(c70195b4) SHA1(ff06197f07111d6a4b8942dcfe8d2279bda6f281))
ROM_RELOAD( 0x0800, 0x0400)
ROM_LOAD("6530sys1.bin", 0x0c00, 0x0400, CRC(b7831321) SHA1(c94f4bee97854d0373653a6867016e27d3fc1340))
@@ -774,11 +744,14 @@ ROM_END
/ Buck Rogers (01/1980) #437
/-------------------------------------------------------------------*/
ROM_START(buckrgrs)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("437.cpu", 0x2000, 0x0400, CRC(e57d9278) SHA1(dfc4ebff1e14b9a074468671a8e5ac7948d5b352))
- ROM_REGION(0x10000, "cpu2", 0)
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("437.cpu", 0x0000, 0x0400, CRC(e57d9278) SHA1(dfc4ebff1e14b9a074468671a8e5ac7948d5b352))
+
+ ROM_REGION( 0x10000, "audiocpu", 0)
ROM_LOAD("437.snd", 0x0400, 0x0400, CRC(732b5a27) SHA1(7860ea54e75152246c3ac3205122d750b243b40c))
ROM_RELOAD( 0x0800, 0x0400)
ROM_LOAD("6530sys1.bin", 0x0c00, 0x0400, CRC(b7831321) SHA1(c94f4bee97854d0373653a6867016e27d3fc1340))
@@ -789,60 +762,73 @@ ROM_END
/ Charlie's Angels (11/1978) #425
/-------------------------------------------------------------------*/
ROM_START(charlies)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("425.cpu", 0x2000, 0x0400, CRC(928b4279) SHA1(51096d45e880d6a8263eaeaa0cdab0f61ad2f58d))
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("425.cpu", 0x0000, 0x0400, CRC(928b4279) SHA1(51096d45e880d6a8263eaeaa0cdab0f61ad2f58d))
ROM_END
/*-------------------------------------------------------------------
/ Cleopatra (11/1977) #409
/-------------------------------------------------------------------*/
ROM_START(cleoptra)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("409.cpu", 0x2000, 0x0400, CRC(8063ff71) SHA1(205f09f067bf79544d2ce2a48d23259901f935dd))
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("409.cpu", 0x0000, 0x0400, CRC(8063ff71) SHA1(205f09f067bf79544d2ce2a48d23259901f935dd))
ROM_END
/*-------------------------------------------------------------------
/ Close Encounters of the Third Kind (10/1978) #424
/-------------------------------------------------------------------*/
ROM_START(closeenc)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("424.cpu", 0x2000, 0x0400, CRC(a7a5dd13) SHA1(223c67b9484baa719c91de52b363ff22813db160))
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("424.cpu", 0x0000, 0x0400, CRC(a7a5dd13) SHA1(223c67b9484baa719c91de52b363ff22813db160))
ROM_END
/*-------------------------------------------------------------------
/ Count-Down (05/1979) #422
/-------------------------------------------------------------------*/
ROM_START(countdwn)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("422.cpu", 0x2000, 0x0400, CRC(51bc2df0) SHA1(d4b555d106c6b4e420b0fcd1df8871f869476c22))
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("422.cpu", 0x0000, 0x0400, CRC(51bc2df0) SHA1(d4b555d106c6b4e420b0fcd1df8871f869476c22))
ROM_END
/*-------------------------------------------------------------------
/ Dragon (10/1978) #419
/-------------------------------------------------------------------*/
ROM_START(dragon)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("419.cpu", 0x2000, 0x0400, CRC(018d9b3a) SHA1(da37ef5017c71bc41bdb1f30d3fd7ac3b7e1ee7e))
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("419.cpu", 0x0000, 0x0400, CRC(018d9b3a) SHA1(da37ef5017c71bc41bdb1f30d3fd7ac3b7e1ee7e))
ROM_END
/*-------------------------------------------------------------------
/ Genie (11/1979) #435
/-------------------------------------------------------------------*/
ROM_START(geniep)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("435.cpu", 0x2000, 0x0400, CRC(7749fd92) SHA1(9cd3e799842392e3939877bf295759c27f199e58))
- ROM_REGION(0x10000, "cpu2", 0)
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("435.cpu", 0x0000, 0x0400, CRC(7749fd92) SHA1(9cd3e799842392e3939877bf295759c27f199e58))
+
+ ROM_REGION( 0x10000, "audiocpu", 0)
ROM_LOAD("435.snd", 0x0400, 0x0400, CRC(4a98ceed) SHA1(f1d7548e03107033c39953ee04b043b5301dbb47))
ROM_RELOAD( 0x0800, 0x0400)
ROM_LOAD("6530sys1.bin", 0x0c00, 0x0400, CRC(b7831321) SHA1(c94f4bee97854d0373653a6867016e27d3fc1340))
@@ -853,10 +839,12 @@ ROM_END
/ Joker Poker (08/1978) #417
/-------------------------------------------------------------------*/
ROM_START(jokrpokr)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("417.cpu", 0x2000, 0x0400, CRC(33dade08) SHA1(23b8dbd7b6c84b806fc0d2da95478235cbf9f80a))
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("417.cpu", 0x0000, 0x0400, CRC(33dade08) SHA1(23b8dbd7b6c84b806fc0d2da95478235cbf9f80a))
ROM_END
/*-------------------------------------------------------------------
@@ -866,12 +854,15 @@ ROM_END
/ L'Hexagone (04/1986)
/-------------------------------------------------------------------*/
ROM_START(hexagone)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("435.cpu", 0x2000, 0x0400, CRC(7749fd92) SHA1(9cd3e799842392e3939877bf295759c27f199e58))
- ROM_REGION(0x10000, "cpu2", 0)
- ROM_LOAD("hexagone.bin", 0, 0x4000, CRC(002b5464) SHA1(e2d971c4e85b4fb6580c2d3945c9946ea0cebc2e))
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("435.cpu", 0x0000, 0x0400, CRC(7749fd92) SHA1(9cd3e799842392e3939877bf295759c27f199e58))
+
+ ROM_REGION( 0x10000, "audiocpu", 0)
+ ROM_LOAD("hexagone.bin", 0x0000, 0x4000, CRC(002b5464) SHA1(e2d971c4e85b4fb6580c2d3945c9946ea0cebc2e))
ROM_END
/*-------------------------------------------------------------------
/ Movie
@@ -881,21 +872,26 @@ ROM_END
/ Pinball Pool (08/1979) #427
/-------------------------------------------------------------------*/
ROM_START(pinpool)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("427.cpu", 0x2000, 0x0400, CRC(c496393d) SHA1(e91d9596aacdb4277fa200a3f8f9da099c278f32))
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("427.cpu", 0x0000, 0x0400, CRC(c496393d) SHA1(e91d9596aacdb4277fa200a3f8f9da099c278f32))
ROM_END
/*-------------------------------------------------------------------
/ Roller Disco (02/1980) #440
/-------------------------------------------------------------------*/
ROM_START(roldisco)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("440.cpu", 0x2000, 0x0400, CRC(bc50631f) SHA1(6aa3124d09fc4e369d087a5ad6dd1737ace55e41))
- ROM_REGION(0x10000, "cpu2", 0)
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("440.cpu", 0x0000, 0x0400, CRC(bc50631f) SHA1(6aa3124d09fc4e369d087a5ad6dd1737ace55e41))
+
+ ROM_REGION( 0x10000, "audiocpu", 0)
ROM_LOAD("440.snd", 0x0400, 0x0400, CRC(4a0a05ae) SHA1(88f21b5638494d8e78dc0b6b7d69873b76b5f75d))
ROM_RELOAD( 0x0800, 0x0400)
ROM_LOAD("6530sys1.bin", 0x0c00, 0x0400, CRC(b7831321) SHA1(c94f4bee97854d0373653a6867016e27d3fc1340))
@@ -906,12 +902,14 @@ ROM_END
/ Sahara Love (1984)
/-------------------------------------------------------------------*/
ROM_START(sahalove)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("412.cpu", 0x2000, 0x0400, CRC(84a86b83) SHA1(f331f2ffd7d1b279b4ffbb939aa8649e723f5fac))
- ROM_REGION(0x2000, "audiocpu", 0) // extra Z80 for sound. TODO: emulate
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("412.cpu", 0x0000, 0x0400, CRC(84a86b83) SHA1(f331f2ffd7d1b279b4ffbb939aa8649e723f5fac))
+
+ ROM_REGION( 0x4000, "audiocpu", 0) // extra Z80 for sound. TODO: emulate
ROM_LOAD("sahalove.bin", 0x0000, 0x2000, CRC(3512840a) SHA1(eb36bb78bbf2f8610bc1d71a6651b937db3a5c69))
ROM_END
@@ -919,17 +917,21 @@ ROM_END
/ Sinbad (05/1978) #412
/-------------------------------------------------------------------*/
ROM_START(sinbad)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("412.cpu", 0x2000, 0x0400, CRC(84a86b83) SHA1(f331f2ffd7d1b279b4ffbb939aa8649e723f5fac))
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("412.cpu", 0x0000, 0x0400, CRC(84a86b83) SHA1(f331f2ffd7d1b279b4ffbb939aa8649e723f5fac))
ROM_END
ROM_START(sinbadn)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("412no1.cpu", 0x2000, 0x0400, CRC(f5373f5f) SHA1(027840501416ff01b2adf07188c7d667adf3ad5f))
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("412no1.cpu", 0x0000, 0x0400, CRC(f5373f5f) SHA1(027840501416ff01b2adf07188c7d667adf3ad5f))
ROM_END
/*-------------------------------------------------------------------
@@ -940,21 +942,26 @@ ROM_END
/ Solar Ride (02/1979) #421
/-------------------------------------------------------------------*/
ROM_START(solaride)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("421.cpu", 0x2000, 0x0400, CRC(6b5c5da6) SHA1(a09b7009473be53586f53f48b7bfed9a0c5ecd55))
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("421.cpu", 0x0000, 0x0400, CRC(6b5c5da6) SHA1(a09b7009473be53586f53f48b7bfed9a0c5ecd55))
ROM_END
/*-------------------------------------------------------------------
/ The Incredible Hulk (10/1979) #433
/-------------------------------------------------------------------*/
ROM_START(hulk)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("433.cpu", 0x2000, 0x0400, CRC(c05d2b52) SHA1(393fe063b029246317c90ee384db95a84d61dbb7))
- ROM_REGION(0x10000, "cpu2", 0)
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("433.cpu", 0x0000, 0x0400, CRC(c05d2b52) SHA1(393fe063b029246317c90ee384db95a84d61dbb7))
+
+ ROM_REGION( 0x10000, "audiocpu", 0)
ROM_LOAD("433.snd", 0x0400, 0x0400, CRC(20cd1dff) SHA1(93e7c47ff7051c3c0dc9f8f95aa33ba094e7cf25))
ROM_RELOAD( 0x0800, 0x0400)
ROM_LOAD("6530sys1.bin", 0x0c00, 0x0400, CRC(b7831321) SHA1(c94f4bee97854d0373653a6867016e27d3fc1340))
@@ -965,11 +972,14 @@ ROM_END
/ Torch (02/1980) #438
/-------------------------------------------------------------------*/
ROM_START(torch)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("438.cpu", 0x2000, 0x0400, CRC(2d396a64) SHA1(38a1862771500faa471071db08dfbadc6e8759e8))
- ROM_REGION(0x10000, "cpu2", 0)
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("438.cpu", 0x0000, 0x0400, CRC(2d396a64) SHA1(38a1862771500faa471071db08dfbadc6e8759e8))
+
+ ROM_REGION( 0x10000, "audiocpu", 0)
ROM_LOAD("438.snd", 0x0400, 0x0400, CRC(a9619b48) SHA1(1906bc1b059bf31082e3b4546f5a30159479ad3c))
ROM_RELOAD( 0x0800, 0x0400)
ROM_LOAD("6530sys1.bin", 0x0c00, 0x0400, CRC(b7831321) SHA1(c94f4bee97854d0373653a6867016e27d3fc1340))
@@ -980,11 +990,14 @@ ROM_END
/ Totem (10/1979) #429
/-------------------------------------------------------------------*/
ROM_START(totem)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("429.cpu", 0x2000, 0x0400, CRC(7885a384) SHA1(1770662af7d48ad8297097a9877c5c497119978d))
- ROM_REGION(0x10000, "cpu2", 0)
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("429.cpu", 0x0000, 0x0400, CRC(7885a384) SHA1(1770662af7d48ad8297097a9877c5c497119978d))
+
+ ROM_REGION( 0x10000, "audiocpu", 0)
ROM_LOAD("429.snd", 0x0400, 0x0400, CRC(5d1b7ed4) SHA1(4a584f880e907fb21da78f3b3a0617f20599688f))
ROM_RELOAD( 0x0800, 0x0400)
ROM_LOAD("6530sys1.bin", 0x0c00, 0x0400, CRC(b7831321) SHA1(c94f4bee97854d0373653a6867016e27d3fc1340))
@@ -995,10 +1008,12 @@ ROM_END
/ System 1 Test prom
/-------------------------------------------------------------------*/
ROM_START(sys1test)
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION( 0x1000, "maincpu", 0)
ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
- ROM_LOAD("test.cpu", 0x2000, 0x0400, CRC(8b0704bb) SHA1(5f0eb8d5af867b815b6012c9d078927398efe6d8))
+
+ ROM_REGION( 0x0400, "module", 0 )
+ ROM_LOAD("test.cpu", 0x0000, 0x0400, CRC(8b0704bb) SHA1(5f0eb8d5af867b815b6012c9d078927398efe6d8))
ROM_END
diff --git a/src/mame/drivers/hanaawas.cpp b/src/mame/drivers/hanaawas.cpp
index 98b6c0774d5..7a9123d3e95 100644
--- a/src/mame/drivers/hanaawas.cpp
+++ b/src/mame/drivers/hanaawas.cpp
@@ -28,50 +28,105 @@
***************************************************************************/
#include "emu.h"
-#include "includes/hanaawas.h"
#include "cpu/z80/z80.h"
#include "sound/ay8910.h"
+#include "emupal.h"
#include "screen.h"
#include "speaker.h"
+#include "tilemap.h"
-uint8_t hanaawas_state::hanaawas_input_port_0_r()
+namespace {
+
+class hanaawas_state : public driver_device
{
- int i, ordinal = 0;
- uint16_t buttons = 0;
+public:
+ hanaawas_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_videoram(*this, "videoram"),
+ m_colorram(*this, "colorram"),
+ m_maincpu(*this, "maincpu"),
+ m_gfxdecode(*this, "gfxdecode"),
+ m_coins(*this, "COINS"),
+ m_start(*this, "START"),
+ m_player(*this, "P%u", 1U)
+ { }
+
+ void hanaawas(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+ virtual void video_start() override;
+
+private:
+ required_shared_ptr<uint8_t> m_videoram;
+ required_shared_ptr<uint8_t> m_colorram;
+
+ required_device<cpu_device> m_maincpu;
+ required_device<gfxdecode_device> m_gfxdecode;
+
+ required_ioport m_coins, m_start;
+ required_ioport_array<2> m_player;
+
+ tilemap_t *m_bg_tilemap;
+
+ uint8_t m_mux;
+ uint8_t m_coin_settings;
+ uint8_t m_coin_impulse;
+
+ uint8_t input_port_0_r();
+ void inputs_mux_w(uint8_t data);
+ void videoram_w(offs_t offset, uint8_t data);
+ void colorram_w(offs_t offset, uint8_t data);
+ void key_matrix_status_w(uint8_t data);
+ void irq_ack_w(uint8_t data);
+ TILE_GET_INFO_MEMBER(get_bg_tile_info);
+ void palette(palette_device &palette) const;
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void portb_w(uint8_t data);
+ void prg_map(address_map &map);
+ void io_map(address_map &map);
+};
+uint8_t hanaawas_state::input_port_0_r()
+{
// TODO: key matrix seems identical to speedatk.cpp, needs merging
- if(m_coin_impulse > 0)
+ if (m_coin_impulse > 0)
{
m_coin_impulse--;
return 0x80;
}
- if((ioport("COINS")->read() & 1) || (ioport("COINS")->read() & 2))
+ if ((m_coins->read() & 1) || (m_coins->read() & 2))
{
- m_coin_impulse = m_coin_settings*2;
+ m_coin_impulse = m_coin_settings * 2;
m_coin_impulse--;
return 0x80;
}
+ uint16_t buttons = 0;
+
switch (m_mux)
{
- case 1: /* start buttons */
- buttons = ioport("START")->read();
+ case 1: // start buttons
+ buttons = m_start->read();
break;
- case 2: /* player 1 buttons */
- buttons = ioport("P1")->read();
+ case 2: // player 1 buttons
+ buttons = m_player[0]->read();
break;
- case 4: /* player 2 buttons */
- buttons = ioport("P2")->read();
+ case 4: // player 2 buttons
+ buttons = m_player[1]->read();
break;
}
- /* map button pressed into 1-10 range */
+ // map button pressed into 1-10 range
- for (i = 0; i < 10; i++)
+ int ordinal = 0;
+
+ for (int i = 0; i < 10; i++)
{
if (buttons & (1 << i))
{
@@ -83,29 +138,123 @@ uint8_t hanaawas_state::hanaawas_input_port_0_r()
return ordinal;
}
-void hanaawas_state::hanaawas_inputs_mux_w(uint8_t data)
+void hanaawas_state::inputs_mux_w(uint8_t data)
{
m_mux = data;
}
void hanaawas_state::irq_ack_w(uint8_t data)
{
- m_maincpu->set_input_line(0,CLEAR_LINE);
+ m_maincpu->set_input_line(0, CLEAR_LINE);
}
void hanaawas_state::key_matrix_status_w(uint8_t data)
{
- if((data & 0xf0) == 0x40) //coinage setting command
+ if ((data & 0xf0) == 0x40) //coinage setting command
m_coin_settings = data & 0xf;
}
-void hanaawas_state::hanaawas_map(address_map &map)
+/***************************************************************************
+
+ Convert the color PROMs into a more useable format.
+
+***************************************************************************/
+
+void hanaawas_state::palette(palette_device &palette) const
+{
+ uint8_t const *color_prom = memregion("proms")->base();
+
+ // create a lookup table for the palette
+ for (int i = 0; i < 0x10; i++)
+ {
+ // red component
+ int bit0 = BIT(color_prom[i], 0);
+ int bit1 = BIT(color_prom[i], 1);
+ int bit2 = BIT(color_prom[i], 2);
+ int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+
+ // green component
+ bit0 = BIT(color_prom[i], 3);
+ bit1 = BIT(color_prom[i], 4);
+ bit2 = BIT(color_prom[i], 5);
+ int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+
+ // blue component
+ bit0 = 0;
+ bit1 = BIT(color_prom[i], 6);
+ bit2 = BIT(color_prom[i], 7);
+ int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+
+ palette.set_indirect_color(i, rgb_t(r, g, b));
+ }
+
+ // color_prom now points to the beginning of the lookup table
+ color_prom += 0x20;
+
+ // character lookup table. The 1bpp tiles really only use colors 0-0x0f and the 3bpp ones 0x10-0x1f
+ for (int i = 0; i < 0x100; i++)
+ {
+ int const swapped_i = bitswap<8>(i, 2,7,6,5,4,3,1,0);
+ uint8_t const ctabentry = color_prom[swapped_i] & 0x0f;
+ palette.set_pen_indirect(i, ctabentry);
+ }
+}
+
+void hanaawas_state::videoram_w(offs_t offset, uint8_t data)
+{
+ m_videoram[offset] = data;
+ m_bg_tilemap->mark_tile_dirty(offset);
+}
+
+void hanaawas_state::colorram_w(offs_t offset, uint8_t data)
+{
+ m_colorram[offset] = data;
+
+ // dirty both current and next offsets
+ m_bg_tilemap->mark_tile_dirty(offset);
+ m_bg_tilemap->mark_tile_dirty((offset + (flip_screen() ? -1 : 1)) & 0x03ff);
+}
+
+void hanaawas_state::portb_w(uint8_t data)
+{
+ // bit 7 is flip screen
+ if (flip_screen() != (~data & 0x80))
+ {
+ flip_screen_set(~data & 0x80);
+ machine().tilemap().mark_all_dirty();
+ }
+}
+
+TILE_GET_INFO_MEMBER(hanaawas_state::get_bg_tile_info)
+{
+ // the color is determined by the current color byte, but the bank is via the previous one!!!
+ int offset = (tile_index + (flip_screen() ? 1 : -1)) & 0x3ff;
+ int attr = m_colorram[offset];
+ int gfxbank = (attr & 0x40) >> 6;
+ int code = m_videoram[tile_index] + ((attr & 0x20) << 3);
+ int color = m_colorram[tile_index] & 0x1f;
+
+ tileinfo.set(gfxbank, code, color, 0);
+}
+
+void hanaawas_state::video_start()
+{
+ m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(hanaawas_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
+}
+
+uint32_t hanaawas_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
+ return 0;
+}
+
+void hanaawas_state::prg_map(address_map &map)
{
map(0x0000, 0x2fff).rom();
map(0x4000, 0x4fff).rom();
map(0x6000, 0x6fff).rom();
- map(0x8000, 0x83ff).ram().w(FUNC(hanaawas_state::hanaawas_videoram_w)).share("videoram");
- map(0x8400, 0x87ff).ram().w(FUNC(hanaawas_state::hanaawas_colorram_w)).share("colorram");
+ map(0x8000, 0x83ff).ram().w(FUNC(hanaawas_state::videoram_w)).share(m_videoram);
+ map(0x8400, 0x87ff).ram().w(FUNC(hanaawas_state::colorram_w)).share(m_colorram);
map(0x8800, 0x8bff).ram();
map(0xb000, 0xb000).w(FUNC(hanaawas_state::irq_ack_w));
}
@@ -114,8 +263,8 @@ void hanaawas_state::hanaawas_map(address_map &map)
void hanaawas_state::io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).rw(FUNC(hanaawas_state::hanaawas_input_port_0_r), FUNC(hanaawas_state::hanaawas_inputs_mux_w));
- map(0x01, 0x01).nopr().w(FUNC(hanaawas_state::key_matrix_status_w)); /* r bit 1: status ready, presumably of the input mux device / w = configure device? */
+ map(0x00, 0x00).rw(FUNC(hanaawas_state::input_port_0_r), FUNC(hanaawas_state::inputs_mux_w));
+ map(0x01, 0x01).nopr().w(FUNC(hanaawas_state::key_matrix_status_w)); // r bit 1: status ready, presumably of the input mux device / w = configure device?
map(0x10, 0x10).r("aysnd", FUNC(ay8910_device::data_r));
map(0x10, 0x11).w("aysnd", FUNC(ay8910_device::address_data_w));
map(0xc0, 0xc0).nopw(); // watchdog
@@ -150,7 +299,7 @@ static INPUT_PORTS_START( hanaawas )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) )
- /* fake port. The button depressed gets converted to an integer in the 1-10 range */
+ // fake port. The button depressed gets converted to an integer in the 1-10 range
PORT_START("P1")
PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_HANAFUDA_A )
PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_HANAFUDA_B )
@@ -163,7 +312,7 @@ static INPUT_PORTS_START( hanaawas )
PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_HANAFUDA_YES )
PORT_BIT( 0x200, IP_ACTIVE_HIGH, IPT_HANAFUDA_NO )
- /* fake port. The button depressed gets converted to an integer in the 1-10 range */
+ // fake port. The button depressed gets converted to an integer in the 1-10 range
PORT_START("P2")
PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_HANAFUDA_A ) PORT_PLAYER(2)
PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_HANAFUDA_B ) PORT_PLAYER(2)
@@ -198,8 +347,8 @@ GFX( charlayout_1bpp, 0x2000*8+4, 0x2000*8+4, 0x2000*8+4 )
GFX( charlayout_3bpp, 0x2000*8, 0, 4 )
static GFXDECODE_START( gfx_hanaawas )
- GFXDECODE_ENTRY( "gfx1", 0, charlayout_1bpp, 0, 32 )
- GFXDECODE_ENTRY( "gfx1", 0, charlayout_3bpp, 0, 32 )
+ GFXDECODE_ENTRY( "tiles", 0, charlayout_1bpp, 0, 32 )
+ GFXDECODE_ENTRY( "tiles", 0, charlayout_3bpp, 0, 32 )
GFXDECODE_END
@@ -218,31 +367,31 @@ void hanaawas_state::machine_reset()
void hanaawas_state::hanaawas(machine_config &config)
{
- /* basic machine hardware */
- Z80(config, m_maincpu, 18432000/6); /* 3.072 MHz ??? */
- m_maincpu->set_addrmap(AS_PROGRAM, &hanaawas_state::hanaawas_map);
+ // basic machine hardware
+ Z80(config, m_maincpu, 18432000 / 6); // 3.072 MHz ???
+ m_maincpu->set_addrmap(AS_PROGRAM, &hanaawas_state::prg_map);
m_maincpu->set_addrmap(AS_IO, &hanaawas_state::io_map);
m_maincpu->set_vblank_int("screen", FUNC(hanaawas_state::irq0_line_assert));
- /* video hardware */
+ // video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
- screen.set_vblank_time(subseconds::from_usec(2500) /* not accurate */);
+ screen.set_vblank_time(subseconds::from_usec(2500)); // not accurate
screen.set_size(32*8, 32*8);
screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
- screen.set_screen_update(FUNC(hanaawas_state::screen_update_hanaawas));
+ screen.set_screen_update(FUNC(hanaawas_state::screen_update));
screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_hanaawas);
- PALETTE(config, "palette", FUNC(hanaawas_state::hanaawas_palette), 32 * 8, 16);
+ PALETTE(config, "palette", FUNC(hanaawas_state::palette), 32 * 8, 16);
- /* sound hardware */
+ // sound hardware
SPEAKER(config, "mono").front_center();
- ay8910_device &aysnd(AY8910(config, "aysnd", 18432000/12));
+ ay8910_device &aysnd(AY8910(config, "aysnd", 18432000 / 12));
aysnd.port_a_read_callback().set_ioport("DSW");
- aysnd.port_b_write_callback().set(FUNC(hanaawas_state::hanaawas_portB_w));
+ aysnd.port_b_write_callback().set(FUNC(hanaawas_state::portb_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
}
@@ -254,23 +403,25 @@ void hanaawas_state::hanaawas(machine_config &config)
***************************************************************************/
ROM_START( hanaawas )
- ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_REGION( 0x8000, "maincpu", 0 )
ROM_LOAD( "1.1e", 0x0000, 0x2000, CRC(618dc1e3) SHA1(31817f256512352db0d27322998d9dcf95a993cf) )
ROM_LOAD( "2.3e", 0x2000, 0x1000, CRC(5091b67f) SHA1(5a66740b8829b9b4d3aea274f9ff36e0b9e8c151) )
ROM_LOAD( "3.4e", 0x4000, 0x1000, CRC(dcb65067) SHA1(37964ff4016bd927b9f13b4358b831bb667f993b) )
ROM_LOAD( "4.6e", 0x6000, 0x1000, CRC(24bee0dc) SHA1(a4237ad3611c923b563923462e79b0b3f66cc721) )
- ROM_REGION( 0x4000, "gfx1", 0 )
+ ROM_REGION( 0x4000, "tiles", 0 )
ROM_LOAD( "5.9a", 0x0000, 0x1000, CRC(304ae219) SHA1(c1eac4973a6aec9fd8e848c206870667a8bb0922) )
ROM_LOAD( "6.10a", 0x1000, 0x1000, CRC(765a4e5f) SHA1(b2f148c60cffb75d1a841be8b924a874bff22ce4) )
ROM_LOAD( "7.12a", 0x2000, 0x1000, CRC(5245af2d) SHA1(a1262fa5828a52de28cc953ab465cbc719c56c32) )
ROM_LOAD( "8.13a", 0x3000, 0x1000, CRC(3356ddce) SHA1(68818d0692fca548a49a74209bd0ef6f16484eba) )
ROM_REGION( 0x0220, "proms", 0 )
- ROM_LOAD( "13j.bpr", 0x0000, 0x0020, CRC(99300d85) SHA1(dd383db1f3c8c6d784121d32f20ffed3d83e2278) ) /* color PROM */
- ROM_LOAD( "2a.bpr", 0x0020, 0x0100, CRC(e26f21a2) SHA1(d0df06f833e0f97872d9d2ffeb7feef94aaaa02a) ) /* lookup table */
- ROM_LOAD( "6g.bpr", 0x0120, 0x0100, CRC(4d94fed5) SHA1(3ea8e6fb95d5677991dc90fe7435f91e5320bb16) ) /* I don't know what this is */
+ ROM_LOAD( "13j.bpr", 0x0000, 0x0020, CRC(99300d85) SHA1(dd383db1f3c8c6d784121d32f20ffed3d83e2278) ) // color PROM
+ ROM_LOAD( "2a.bpr", 0x0020, 0x0100, CRC(e26f21a2) SHA1(d0df06f833e0f97872d9d2ffeb7feef94aaaa02a) ) // lookup table
+ ROM_LOAD( "6g.bpr", 0x0120, 0x0100, CRC(4d94fed5) SHA1(3ea8e6fb95d5677991dc90fe7435f91e5320bb16) ) // I don't know what this is
ROM_END
+} // Anonymous namespace
+
GAME( 1982, hanaawas, 0, hanaawas, hanaawas, hanaawas_state, empty_init, ROT0, "Seta Kikaku, Ltd.", "Hana Awase", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/harddriv.cpp b/src/mame/drivers/harddriv.cpp
index b772fbce815..d4e5b8438ba 100644
--- a/src/mame/drivers/harddriv.cpp
+++ b/src/mame/drivers/harddriv.cpp
@@ -360,6 +360,8 @@ harddriv_state::harddriv_state(const machine_config &mconfig, device_type type,
m_duartn68681(*this, "duartn68681"),
m_adc8(*this, "adc8"),
m_lamps(*this, "lamp%u", 1U),
+ m_sel(*this, "SEL%u", 1U),
+ m_wheel(*this, "wheel"),
m_hd34010_host_access(0),
m_msp_ram(*this, "msp_ram"),
m_dsk_ram(nullptr),
@@ -1867,7 +1869,7 @@ void stunrun_board_device_state::device_add_mconfig(machine_config &config)
ATARI_JSA_II(config, m_jsa, 0);
m_jsa->main_int_cb().set(FUNC(harddriv_state::sound_int_write_line));
m_jsa->test_read_cb().set_ioport("IN0").bit(5);
- m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_jsa->add_route(ALL_OUTPUTS, "mono", 0.5);
}
/* Steel Talons */
diff --git a/src/mame/drivers/hh_cop400.cpp b/src/mame/drivers/hh_cop400.cpp
index f44587a415f..a6de1accb5e 100644
--- a/src/mame/drivers/hh_cop400.cpp
+++ b/src/mame/drivers/hh_cop400.cpp
@@ -669,10 +669,15 @@ class lchicken_state : public hh_cop400_state
{
public:
lchicken_state(const machine_config &mconfig, device_type type, const char *tag) :
- hh_cop400_state(mconfig, type, tag)
+ hh_cop400_state(mconfig, type, tag),
+ m_motor_pos_out(*this, "motor_pos"),
+ m_motor_on_out(*this, "motor_on")
{ }
- u8 m_motor_pos;
+ output_finder<> m_motor_pos_out;
+ output_finder<> m_motor_on_out;
+
+ u8 m_motor_pos = 0;
TIMER_DEVICE_CALLBACK_MEMBER(motor_sim_tick);
DECLARE_READ_LINE_MEMBER(motor_switch_r);
@@ -692,8 +697,10 @@ void lchicken_state::machine_start()
{
hh_cop400_state::machine_start();
- // zerofill, register for savestates
- m_motor_pos = 0;
+ m_motor_pos_out.resolve();
+ m_motor_on_out.resolve();
+
+ // register for savestates
save_item(NAME(m_motor_pos));
}
@@ -709,7 +716,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(lchicken_state::motor_sim_tick)
if (~m_inp_mux & 8)
{
m_motor_pos++;
- output().set_value("motor_pos", 100 * (m_motor_pos / (float)0x100));
+ m_motor_pos_out = 100 * (m_motor_pos / (float)0x100);
}
}
@@ -726,7 +733,7 @@ void lchicken_state::write_d(u8 data)
// D0-D3: input mux
// D3: motor on
m_inp_mux = data & 0xf;
- output().set_value("motor_on", ~data >> 3 & 1);
+ m_motor_on_out = ~data >> 3 & 1;
}
void lchicken_state::write_g(u8 data)
diff --git a/src/mame/drivers/hh_hmcs40.cpp b/src/mame/drivers/hh_hmcs40.cpp
index 7bf023b2408..43fc3096735 100644
--- a/src/mame/drivers/hh_hmcs40.cpp
+++ b/src/mame/drivers/hh_hmcs40.cpp
@@ -113,7 +113,7 @@ TODO:
games may manipulate VFD plate brightness by strobing it longer/shorter,
eg. cgalaxn when a ship explodes.
- bzaxxon 3D effect is difficult to simulate
-- improve/redo SVGs of: bzaxxon, bpengo, bbtime
+- improve/redo SVGs of: bzaxxon, bbtime
***************************************************************************/
@@ -1165,8 +1165,8 @@ ROM_START( bpengo )
ROM_LOAD( "hd38820a63", 0x0000, 0x1000, CRC(ebd6bc64) SHA1(0a322c47b9553a2739a85908ce64b9650cf93d49) )
ROM_CONTINUE( 0x1e80, 0x0100 )
- ROM_REGION( 744461, "screen", 0)
- ROM_LOAD( "bpengo.svg", 0, 744461, BAD_DUMP CRC(2b9abaa5) SHA1(c70a6ac1fa757fdd3ababfe6e00573ef1410c1eb) )
+ ROM_REGION( 565069, "screen", 0)
+ ROM_LOAD( "bpengo.svg", 0, 565069, CRC(fb25ffeb) SHA1(fb4db5120f1e35e39c7fb2da4af3aa63417efaf1) )
ROM_END
diff --git a/src/mame/drivers/hh_tms1k.cpp b/src/mame/drivers/hh_tms1k.cpp
index 24bde2e39a6..29c7de6901f 100644
--- a/src/mame/drivers/hh_tms1k.cpp
+++ b/src/mame/drivers/hh_tms1k.cpp
@@ -53,6 +53,7 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
@MP1204 TMS1100 1980, Entex Baseball 3 (6007)
*MP1209 TMS1100 1980, U.S. Games Space Cruiser/Strategy Football
@MP1211 TMS1100 1980, Entex Space Invader (6012)
+ *MP1215 TMS1100 1980, Tiger Playmaker
@MP1218 TMS1100 1980, Entex Basketball 2 (6010)
@MP1219 TMS1100 1980, U.S. Games Super Sports-4
@MP1221 TMS1100 1980, Entex Raise The Devil (6011)
@@ -122,6 +123,7 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
@MP6101B TMS0980 1979, Parker Brothers Stop Thief
*MP6354 ? 1982, Tsukuda The Dracula (? note: 40-pin, VFD-capable)
*MP6361 ? 1983, Defender Strikes (? note: VFD-capable)
+ *MP7302 TMS1400 1980, Tiger Deluxe Football with Instant Replay
@MP7304 TMS1400 1982, Tiger 7 in 1 Sports Stadium (model 7-555)
@MP7313 TMS1400 1980, Parker Brothers Bank Shot
@MP7314 TMS1400 1980, Parker Brothers Split Second
@@ -158,6 +160,7 @@ ROM source notes when dumped from another publisher, but confident it's the same
- palmf31: Toshiba BC-8018B
- ti1250: Texas Instruments TI-1200
- ti25503: Texas Instruments TI-1265
+- ti5100: loose 1979 TMS1073NL chip
TODO:
- verify output PLA and microinstructions PLA for MCUs that have been dumped
@@ -274,6 +277,7 @@ TODO:
#include "ti1680.lh"
#include "ti25503.lh"
#include "ti30.lh"
+#include "ti5100.lh"
#include "timaze.lh"
#include "tisr16.lh"
#include "tithermos.lh"
@@ -2387,7 +2391,7 @@ DEVICE_IMAGE_LOAD_MEMBER(quizwizc_state::cart_load)
{
if (!image.loaded_through_softlist())
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Can only load through softwarelist");
+ image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist");
return image_init_result::FAIL;
}
@@ -2575,7 +2579,7 @@ DEVICE_IMAGE_LOAD_MEMBER(tc4_state::cart_load)
{
if (!image.loaded_through_softlist())
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Can only load through softwarelist");
+ image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist");
return image_init_result::FAIL;
}
@@ -10472,6 +10476,158 @@ ROM_END
/***************************************************************************
+ TI-5100, more (see below)
+ * TMS1070 MCU label TMS1073NL or TMC1073NL (die label 1070B, 1073)
+ * 11-digit 7seg VFD (1 custom digit)
+
+ This chip was also used in 3rd-party calculators, such as Toshiba BC-1015,
+ Panasonic JE1601U, Radio Shack EC2001, Triumph-Adler D100. The original
+ TI version did not have the 3 buttons at R4.
+
+***************************************************************************/
+
+class ti5100_state : public hh_tms1k_state
+{
+public:
+ ti5100_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void ti5100(machine_config &config);
+
+private:
+ void update_display();
+ void write_o(u16 data);
+ void write_r(u16 data);
+ u8 read_k();
+};
+
+// handlers
+
+void ti5100_state::update_display()
+{
+ // extra segment on R10
+ m_display->matrix(m_r, (m_r >> 2 & 0x100) | m_o);
+}
+
+void ti5100_state::write_r(u16 data)
+{
+ // R0-R10: input mux, select digit
+ m_r = m_inp_mux = data;
+ update_display();
+}
+
+void ti5100_state::write_o(u16 data)
+{
+ // O0-O7: digit segments
+ m_o = data;
+ update_display();
+}
+
+u8 ti5100_state::read_k()
+{
+ // K: multiplexed inputs
+ return read_inputs(11);
+}
+
+// config
+
+static INPUT_PORTS_START( ti5100 )
+ PORT_START("IN.0") // R0
+ PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_CONFNAME( 0x08, 0x00, "K" ) // constant mode
+ PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x08, DEF_STR( On ) )
+
+ PORT_START("IN.1") // R1
+ PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.2") // R2
+ PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_CONFNAME( 0x08, 0x00, "DP" ) // display point
+ PORT_CONFSETTING( 0x00, "F" )
+ PORT_CONFSETTING( 0x08, "2" )
+
+ PORT_START("IN.3") // R3
+ PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.4") // R4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // clear all?
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("EX")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("GPM")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME(UTF8_CAPITAL_DELTA"%")
+
+ PORT_START("IN.5") // R5
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("C/CE")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CM")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("N")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%")
+
+ PORT_START("IN.6") // R6
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
+
+ PORT_START("IN.7") // R7
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // duplicate of R8 0x01
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
+
+ PORT_START("IN.8") // R8
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+
+ PORT_START("IN.9") // R9
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // duplicate of R9 0x02
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+=")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-=")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY)
+
+ PORT_START("IN.10") // R10
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M+=")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_INSERT) PORT_NAME("M-=")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("RM")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE)
+INPUT_PORTS_END
+
+void ti5100_state::ti5100(machine_config &config)
+{
+ /* basic machine hardware */
+ TMS1070(config, m_maincpu, 250000); // approximation
+ m_maincpu->k().set(FUNC(ti5100_state::read_k));
+ m_maincpu->o().set(FUNC(ti5100_state::write_o));
+ m_maincpu->r().set(FUNC(ti5100_state::write_r));
+
+ /* video hardware */
+ PWM_DISPLAY(config, m_display).set_size(11, 9);
+ m_display->set_segmask(0x7ff, 0xff);
+ config.set_default_layout(layout_ti5100);
+
+ /* no sound! */
+}
+
+// roms
+
+ROM_START( ti5100 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tms1073nl", 0x0000, 0x0400, CRC(94185933) SHA1(d2d9432f857b8530ac399f5097c6d412f06d8814) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_ti5100_micro.pla", 0, 867, CRC(31b43e95) SHA1(6864e4c20f3affffcd3810dcefbc9484dd781547) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_ti5100_output.pla", 0, 365, CRC(11f6f0f4) SHA1(f25cf6bd284ab4614746b2e3f98d42d2585e425a) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
TMC098x series Majestic-line calculators
TI-30, SR-40, TI-15(less buttons) and several by Koh-I-Noor
@@ -11806,7 +11962,7 @@ void tithermos_state::tithermos(machine_config &config)
m_maincpu->r().set(FUNC(tithermos_state::write_r));
m_maincpu->o().set(FUNC(tithermos_state::write_o));
- CLOCK(config, "ac_line", 60).signal_handler().set_nop();
+ CLOCK(config, "ac_line", 60);
/* video hardware */
PWM_DISPLAY(config, m_display).set_size(4, 7);
@@ -13113,6 +13269,7 @@ COMP( 1975, ti1250, 0, 0, ti1250, ti1250, ti1250_state, emp
COMP( 1976, ti125076, ti1250, 0, ti1270, ti1250, ti1250_state, empty_init, "Texas Instruments", "TI-1250 (1976 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
COMP( 1976, ti1270, 0, 0, ti1270, ti1270, ti1250_state, empty_init, "Texas Instruments", "TI-1270", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
COMP( 1976, ti25503, 0, 0, ti25503, ti25503, ti25503_state, empty_init, "Texas Instruments", "TI-2550 III", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+COMP( 1976, ti5100, 0, 0, ti5100, ti5100, ti5100_state, empty_init, "Texas Instruments", "TI-5100", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
COMP( 1976, ti30, 0, 0, ti30, ti30, ti30_state, empty_init, "Texas Instruments", "TI-30", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
COMP( 1976, tibusan, 0, 0, ti30, tibusan, ti30_state, empty_init, "Texas Instruments", "TI Business Analyst", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
COMP( 1977, tiprog, 0, 0, ti30, tiprog, ti30_state, empty_init, "Texas Instruments", "TI Programmer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
diff --git a/src/mame/drivers/hng64.cpp b/src/mame/drivers/hng64.cpp
index aeb33bf35d8..cb33404c9ec 100644
--- a/src/mame/drivers/hng64.cpp
+++ b/src/mame/drivers/hng64.cpp
@@ -2315,21 +2315,6 @@ void hng64_state::ioport4_w(uint8_t data)
/***********************************************
- Other port accesses from MCU side
-
-***********************************************/
-
-uint8_t hng64_state::anport0_r() { return m_an_in[0]->read(); }
-uint8_t hng64_state::anport1_r() { return m_an_in[1]->read(); }
-uint8_t hng64_state::anport2_r() { return m_an_in[2]->read(); }
-uint8_t hng64_state::anport3_r() { return m_an_in[3]->read(); }
-uint8_t hng64_state::anport4_r() { return m_an_in[4]->read(); }
-uint8_t hng64_state::anport5_r() { return m_an_in[5]->read(); }
-uint8_t hng64_state::anport6_r() { return m_an_in[6]->read(); }
-uint8_t hng64_state::anport7_r() { return m_an_in[7]->read(); }
-
-/***********************************************
-
Serial Accesses from MCU side
***********************************************/
@@ -2418,14 +2403,14 @@ void hng64_state::hng64(machine_config &config)
//iomcu.p6_out_cb().set(FUNC(hng64_state::ioport6_w)); // the IO MCU code uses the ADC which shares pins with port 6, meaning port 6 isn't used as an IO port
iomcu.p7_out_cb().set(FUNC(hng64_state::ioport7_w)); // configuration / clocking for shared ram (port 0) accesses
// most likely the analog inputs, up to a maximum of 8
- iomcu.an0_in_cb().set(FUNC(hng64_state::anport0_r));
- iomcu.an1_in_cb().set(FUNC(hng64_state::anport1_r));
- iomcu.an2_in_cb().set(FUNC(hng64_state::anport2_r));
- iomcu.an3_in_cb().set(FUNC(hng64_state::anport3_r));
- iomcu.an4_in_cb().set(FUNC(hng64_state::anport4_r));
- iomcu.an5_in_cb().set(FUNC(hng64_state::anport5_r));
- iomcu.an6_in_cb().set(FUNC(hng64_state::anport6_r));
- iomcu.an7_in_cb().set(FUNC(hng64_state::anport7_r));
+ iomcu.an0_in_cb().set_ioport("AN0");
+ iomcu.an1_in_cb().set_ioport("AN1");
+ iomcu.an2_in_cb().set_ioport("AN2");
+ iomcu.an3_in_cb().set_ioport("AN3");
+ iomcu.an4_in_cb().set_ioport("AN4");
+ iomcu.an5_in_cb().set_ioport("AN5");
+ iomcu.an6_in_cb().set_ioport("AN6");
+ iomcu.an7_in_cb().set_ioport("AN7");
// network related?
iomcu.serial0_out_cb().set(FUNC(hng64_state::sio0_w));
//iomcu.serial1_out_cb().set(FUNC(hng64_state::sio1_w)); // not initialized / used
@@ -2439,14 +2424,14 @@ void hng64_state::hng64_default(machine_config &config)
hng64(config);
hng64_lamps_device &lamps(HNG64_LAMPS(config, m_lamps, 0));
- lamps.lamps0_out_cb().set(FUNC(hng64_state::hng64_default_lamps0_w));
- lamps.lamps1_out_cb().set(FUNC(hng64_state::hng64_default_lamps1_w));
- lamps.lamps2_out_cb().set(FUNC(hng64_state::hng64_default_lamps2_w));
- lamps.lamps3_out_cb().set(FUNC(hng64_state::hng64_default_lamps3_w));
- lamps.lamps4_out_cb().set(FUNC(hng64_state::hng64_default_lamps4_w));
- lamps.lamps5_out_cb().set(FUNC(hng64_state::hng64_default_lamps5_w));
- lamps.lamps6_out_cb().set(FUNC(hng64_state::hng64_default_lamps6_w));
- lamps.lamps7_out_cb().set(FUNC(hng64_state::hng64_default_lamps7_w));
+ lamps.lamps_out_cb<0>().set(FUNC(hng64_state::hng64_default_lamps_w<0>));
+ lamps.lamps_out_cb<1>().set(FUNC(hng64_state::hng64_default_lamps_w<1>));
+ lamps.lamps_out_cb<2>().set(FUNC(hng64_state::hng64_default_lamps_w<2>));
+ lamps.lamps_out_cb<3>().set(FUNC(hng64_state::hng64_default_lamps_w<3>));
+ lamps.lamps_out_cb<4>().set(FUNC(hng64_state::hng64_default_lamps_w<4>));
+ lamps.lamps_out_cb<5>().set(FUNC(hng64_state::hng64_default_lamps_w<5>));
+ lamps.lamps_out_cb<6>().set(FUNC(hng64_state::hng64_default_lamps_w<6>));
+ lamps.lamps_out_cb<7>().set(FUNC(hng64_state::hng64_default_lamps_w<7>));
}
void hng64_state::hng64_drive(machine_config &config)
@@ -2454,9 +2439,9 @@ void hng64_state::hng64_drive(machine_config &config)
hng64(config);
hng64_lamps_device &lamps(HNG64_LAMPS(config, m_lamps, 0));
- lamps.lamps5_out_cb().set(FUNC(hng64_state::hng64_drive_lamps5_w)); // force feedback steering
- lamps.lamps6_out_cb().set(FUNC(hng64_state::hng64_drive_lamps6_w)); // lamps + coin counter
- lamps.lamps7_out_cb().set(FUNC(hng64_state::hng64_drive_lamps7_w)); // lamps
+ lamps.lamps_out_cb<5>().set(FUNC(hng64_state::hng64_drive_lamps5_w)); // force feedback steering
+ lamps.lamps_out_cb<6>().set(FUNC(hng64_state::hng64_drive_lamps6_w)); // lamps + coin counter
+ lamps.lamps_out_cb<7>().set(FUNC(hng64_state::hng64_drive_lamps7_w)); // lamps
}
void hng64_state::hng64_shoot(machine_config &config)
@@ -2464,8 +2449,8 @@ void hng64_state::hng64_shoot(machine_config &config)
hng64(config);
hng64_lamps_device &lamps(HNG64_LAMPS(config, m_lamps, 0));
- lamps.lamps6_out_cb().set(FUNC(hng64_state::hng64_shoot_lamps6_w)); // start lamps (some missing?!)
- lamps.lamps7_out_cb().set(FUNC(hng64_state::hng64_shoot_lamps7_w)); // gun lamps
+ lamps.lamps_out_cb<6>().set(FUNC(hng64_state::hng64_shoot_lamps6_w)); // start lamps (some missing?!)
+ lamps.lamps_out_cb<7>().set(FUNC(hng64_state::hng64_shoot_lamps7_w)); // gun lamps
}
void hng64_state::hng64_fight(machine_config &config)
@@ -2473,7 +2458,7 @@ void hng64_state::hng64_fight(machine_config &config)
hng64(config);
hng64_lamps_device &lamps(HNG64_LAMPS(config, m_lamps, 0));
- lamps.lamps6_out_cb().set(FUNC(hng64_state::hng64_fight_lamps6_w)); // coin counters
+ lamps.lamps_out_cb<6>().set(FUNC(hng64_state::hng64_fight_lamps6_w)); // coin counters
}
diff --git a/src/mame/drivers/homelab.cpp b/src/mame/drivers/homelab.cpp
index db0315a6835..c70d9cd1bf1 100644
--- a/src/mame/drivers/homelab.cpp
+++ b/src/mame/drivers/homelab.cpp
@@ -683,7 +683,7 @@ QUICKLOAD_LOAD_MEMBER(homelab_state::quickload_cb)
u8 ch = image.fgetc();
if (ch != 0xA5)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid header");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid header");
image.message(" Invalid header");
return image_init_result::FAIL;
}
@@ -692,7 +692,7 @@ QUICKLOAD_LOAD_MEMBER(homelab_state::quickload_cb)
{
if (i >= (std::size(pgmname) - 1))
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File name too long");
+ image.seterror(image_error::INVALIDIMAGE, "File name too long");
image.message(" File name too long");
return image_init_result::FAIL;
}
@@ -706,7 +706,7 @@ QUICKLOAD_LOAD_MEMBER(homelab_state::quickload_cb)
if (image.fread(args, sizeof(args)) != sizeof(args))
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Unexpected EOF while getting file size");
+ image.seterror(image_error::INVALIDIMAGE, "Unexpected EOF while getting file size");
image.message(" Unexpected EOF while getting file size");
return image_init_result::FAIL;
}
@@ -717,7 +717,7 @@ QUICKLOAD_LOAD_MEMBER(homelab_state::quickload_cb)
if (quick_end > 0x7fff)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too large");
+ image.seterror(image_error::INVALIDIMAGE, "File too large");
image.message(" File too large");
return image_init_result::FAIL;
}
@@ -732,7 +732,7 @@ QUICKLOAD_LOAD_MEMBER(homelab_state::quickload_cb)
{
char message[512];
snprintf(message, std::size(message), "%s: Unexpected EOF while writing byte to %04X", pgmname, (unsigned) j);
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, message);
+ image.seterror(image_error::INVALIDIMAGE, message);
image.message("%s: Unexpected EOF while writing byte to %04X", pgmname, (unsigned) j);
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/hx20.cpp b/src/mame/drivers/hx20.cpp
index 427b18f35fa..7616965c259 100644
--- a/src/mame/drivers/hx20.cpp
+++ b/src/mame/drivers/hx20.cpp
@@ -835,7 +835,7 @@ DEVICE_IMAGE_LOAD_MEMBER(hx20_state::optrom_load)
if (size != 0x2000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported ROM size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported ROM size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/ibmpcjr.cpp b/src/mame/drivers/ibmpcjr.cpp
index 13ae0b2c3fa..c9c1cc7c3da 100644
--- a/src/mame/drivers/ibmpcjr.cpp
+++ b/src/mame/drivers/ibmpcjr.cpp
@@ -467,7 +467,7 @@ image_init_result pcjr_state::load_cart(device_image_interface &image, generic_s
header_size = 0x200;
break;
default:
- image.seterror(IMAGE_ERROR_UNSUPPORTED, "Invalid header size" );
+ image.seterror(image_error::INVALIDIMAGE, "Invalid header size");
return image_init_result::FAIL;
}
if (size - header_size == 0xa000)
diff --git a/src/mame/drivers/igs_m027.cpp b/src/mame/drivers/igs_m027.cpp
index 2a4c5166058..21a4612256e 100644
--- a/src/mame/drivers/igs_m027.cpp
+++ b/src/mame/drivers/igs_m027.cpp
@@ -29,6 +29,9 @@
#include "video/igs017_igs031.h"
#include "screen.h"
+
+namespace {
+
class igs_m027_state : public driver_device
{
public:
@@ -39,7 +42,7 @@ public:
m_igs017_igs031(*this, "igs017_igs031")
{ }
- void igs_majhong(machine_config &config);
+ void igs_mahjong(machine_config &config);
void amazonia(machine_config &config);
void init_sdwx();
@@ -56,6 +59,7 @@ public:
void init_fruitpar();
void init_amazonia();
void init_amazoni2();
+ void init_qlgs();
private:
optional_shared_ptr<u32> m_igs_mainram;
@@ -67,7 +71,7 @@ private:
void sdwx_gfx_decrypt();
void pgm_create_dummy_internal_arm_region();
- void igs_majhong_map(address_map &map);
+ void igs_mahjong_map(address_map &map);
};
@@ -76,7 +80,7 @@ private:
Video
- 0x38001000, 0x380017ff CG_CONTROL,8 byte per object, 0x100 in total
+ 0x38001000, 0x380017ff CG_CONTROL,8 byte per object, 0x100 in total
0x38001800, 0x380019ff PALETTE RAM,2 byte per color, 0x100 in total
0x38004000, 0x38005FFF TX Video RAM????????1E00??????512x240??????
0x38006000, 0x38007FFF BG Video RAM????????1E00??????512x240??????
@@ -134,7 +138,7 @@ void igs_m027_state::video_start()
***************************************************************************/
-void igs_m027_state::igs_majhong_map(address_map &map)
+void igs_m027_state::igs_mahjong_map(address_map &map)
{
map(0x00000000, 0x00003fff).rom(); /* Internal ROM */
map(0x08000000, 0x0807ffff).rom().region("user1", 0);/* Game ROM */
@@ -317,10 +321,10 @@ WRITE_LINE_MEMBER(igs_m027_state::vblank_irq)
}
-void igs_m027_state::igs_majhong(machine_config &config)
+void igs_m027_state::igs_mahjong(machine_config &config)
{
ARM7(config, m_maincpu, 20000000);
- m_maincpu->set_addrmap(AS_PROGRAM, &igs_m027_state::igs_majhong_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs_m027_state::igs_mahjong_map);
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -348,7 +352,7 @@ void igs_m027_state::igs_majhong(machine_config &config)
void igs_m027_state::amazonia(machine_config &config)
{
ARM7(config, m_maincpu, 20000000);
- m_maincpu->set_addrmap(AS_PROGRAM, &igs_m027_state::igs_majhong_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs_m027_state::igs_mahjong_map);
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -962,7 +966,24 @@ ROM_START( lhzb4 )
ROM_LOAD( "w05502.u5", 0x00000, 0x200000, CRC(467f677e) SHA1(63927c0d606176c0e22db89ea3a9777ed702abbd) )
ROM_END
+// Que Long Gao Shou (Master on Mahjong Dragon) (IGS, 1999) - PCB-0489-17-FM-1 (IGS027A, M6295, IGS031, 8255, Battery)
+ROM_START( qlgs )
+ ROM_REGION( 0x04000, "maincpu", 0 )
+ // Internal rom of IGS027A type G ARM based MCU
+ ROM_LOAD( "qlgs_igs027a", 0x00000, 0x4000, NO_DUMP ) // has a 'DJ-2 U17' and a 'C3' sticker
+
+ ROM_REGION32_LE( 0x200000, "user1", 0 ) // external ARM data / prg
+ ROM_LOAD( "s-501cn.u17", 0x000000, 0x200000, CRC(c80b61c0) SHA1(4e9920beb85fd559620f3136ea52ab6532657b1f) ) // 11xxxxxxxxxxxxxxxxxxx = 0xFF
+ ROM_REGION( 0x200000, "igs017_igs031:tilemaps", 0 )
+ ROM_LOAD( "text_u26.u26", 0x000000, 0x200000, CRC(4cd44ba8) SHA1(49f73233d466f196ee62bfca0c3e1042f38ee340) ) // 11xxxxxxxxxxxxxxxxxxx = 0xFF
+
+ ROM_REGION( 0x400000, "igs017_igs031:sprites", 0 )
+ ROM_LOAD( "cg_u28.u28", 0x000000, 0x400000, CRC(b34e22a0) SHA1(60c7efb9a0112745c5f9934a04578f6ce5071976) ) // FIXED BITS (xxxxxxx0xxxxxxxx)
+
+ ROM_REGION( 0x200000, "oki", 0 )
+ ROM_LOAD( "sp_u5.u5", 0x00000, 0x200000, CRC(6049b892) SHA1(f87285a288bd3fd169080045f70ff15181661582) ) // 11xxxxxxxxxxxxxxxxxxx = 0x00
+ROM_END
void igs_m027_state::pgm_create_dummy_internal_arm_region()
@@ -1097,24 +1118,36 @@ void igs_m027_state::init_amazoni2()
pgm_create_dummy_internal_arm_region();
}
+void igs_m027_state::init_qlgs()
+{
+ //qlgs_decrypt(machine());
+ //qlgs_gfx_decrypt(machine());
+ pgm_create_dummy_internal_arm_region();
+}
+
+
+} // Anonymous namespace
+
+
/***************************************************************************
Game Drivers
***************************************************************************/
-GAME( 1999, slqz3, 0, igs_majhong, sdwx, igs_m027_state, init_slqz3, ROT0, "IGS", "Mahjong Shuang Long Qiang Zhu 3 (China, VS107C)", MACHINE_IS_SKELETON )
+GAME( 1999, slqz3, 0, igs_mahjong, sdwx, igs_m027_state, init_slqz3, ROT0, "IGS", "Mahjong Shuang Long Qiang Zhu 3 (China, VS107C)", MACHINE_IS_SKELETON )
+GAME( 1999, qlgs, 0, igs_mahjong, sdwx, igs_m027_state, init_qlgs, ROT0, "IGS", "Que Long Gao Shou", MACHINE_IS_SKELETON )
GAME( 1999, amazonia, 0, amazonia,amazonia, igs_m027_state, init_amazonia, ROT0, "IGS", "Amazonia King (V104BR)", MACHINE_IS_SKELETON )
GAME( 1999, amazonkp, amazonia, amazonia,amazonia, igs_m027_state, init_amazonia, ROT0, "IGS", "Amazonia King Plus (V204BR)", MACHINE_IS_SKELETON )
-GAME( 200?, fruitpar, 0, igs_majhong, sdwx, igs_m027_state, init_fruitpar, ROT0, "IGS", "Fruit Paradise (V214)", MACHINE_IS_SKELETON )
-GAME( 2002, sdwx, 0, igs_majhong, sdwx, igs_m027_state, init_sdwx, ROT0, "IGS", "Sheng Dan Wu Xian", MACHINE_IS_SKELETON ) // aka Christmas 5 Line? (or Amazonia King II, shares roms at least?)
-GAME( 2002, amazoni2, 0, igs_majhong, sdwx, igs_m027_state, init_amazoni2, ROT0, "IGS", "Amazonia King II (V202BR)", MACHINE_IS_SKELETON )
-GAME( 200?, sddz, 0, igs_majhong, sdwx, igs_m027_state, init_sddz, ROT0, "IGS", "Super Dou Di Zhu", MACHINE_IS_SKELETON )
-GAME( 2000, zhongguo, 0, igs_majhong, sdwx, igs_m027_state, init_zhongguo, ROT0, "IGS", "Zhong Guo Chu Da D", MACHINE_IS_SKELETON )
-GAME( 200?, lhzb3, 0, igs_majhong, sdwx, igs_m027_state, init_lhzb3, ROT0, "IGS", "Long Hu Zheng Ba 3", MACHINE_IS_SKELETON )
-GAME( 200?, lhzb4, 0, igs_majhong, sdwx, igs_m027_state, init_lhzb4, ROT0, "IGS", "Long Hu Zheng Ba 4", MACHINE_IS_SKELETON )
-GAME( 200?, klxyj, 0, igs_majhong, sdwx, igs_m027_state, init_klxyj, ROT0, "IGS", "Kuai Le Xi You Ji", MACHINE_IS_SKELETON )
-GAME( 2000, mgfx, 0, igs_majhong, sdwx, igs_m027_state, init_mgfx, ROT0, "IGS", "Man Guan Fu Xing", MACHINE_IS_SKELETON )
-GAME( 200?, gonefsh2, 0, igs_majhong, sdwx, igs_m027_state, init_gonefsh2, ROT0, "IGS", "Gone Fishing 2", MACHINE_IS_SKELETON )
-GAME( 2002, chessc2, 0, igs_majhong, sdwx, igs_m027_state, init_chessc2, ROT0, "IGS", "Chess Challenge II", MACHINE_IS_SKELETON )
-GAME( 200?, haunthig, 0, igs_majhong, sdwx, igs_m027_state, init_hauntedh, ROT0, "IGS", "Haunted House (IGS)", MACHINE_IS_SKELETON )
+GAME( 200?, fruitpar, 0, igs_mahjong, sdwx, igs_m027_state, init_fruitpar, ROT0, "IGS", "Fruit Paradise (V214)", MACHINE_IS_SKELETON )
+GAME( 2002, sdwx, 0, igs_mahjong, sdwx, igs_m027_state, init_sdwx, ROT0, "IGS", "Sheng Dan Wu Xian", MACHINE_IS_SKELETON ) // aka Christmas 5 Line? (or Amazonia King II, shares roms at least?)
+GAME( 2002, amazoni2, 0, igs_mahjong, sdwx, igs_m027_state, init_amazoni2, ROT0, "IGS", "Amazonia King II (V202BR)", MACHINE_IS_SKELETON )
+GAME( 200?, sddz, 0, igs_mahjong, sdwx, igs_m027_state, init_sddz, ROT0, "IGS", "Super Dou Di Zhu", MACHINE_IS_SKELETON )
+GAME( 2000, zhongguo, 0, igs_mahjong, sdwx, igs_m027_state, init_zhongguo, ROT0, "IGS", "Zhong Guo Chu Da D", MACHINE_IS_SKELETON )
+GAME( 200?, lhzb3, 0, igs_mahjong, sdwx, igs_m027_state, init_lhzb3, ROT0, "IGS", "Long Hu Zheng Ba 3", MACHINE_IS_SKELETON )
+GAME( 200?, lhzb4, 0, igs_mahjong, sdwx, igs_m027_state, init_lhzb4, ROT0, "IGS", "Long Hu Zheng Ba 4", MACHINE_IS_SKELETON )
+GAME( 200?, klxyj, 0, igs_mahjong, sdwx, igs_m027_state, init_klxyj, ROT0, "IGS", "Kuai Le Xi You Ji", MACHINE_IS_SKELETON )
+GAME( 2000, mgfx, 0, igs_mahjong, sdwx, igs_m027_state, init_mgfx, ROT0, "IGS", "Man Guan Fu Xing", MACHINE_IS_SKELETON )
+GAME( 200?, gonefsh2, 0, igs_mahjong, sdwx, igs_m027_state, init_gonefsh2, ROT0, "IGS", "Gone Fishing 2", MACHINE_IS_SKELETON )
+GAME( 2002, chessc2, 0, igs_mahjong, sdwx, igs_m027_state, init_chessc2, ROT0, "IGS", "Chess Challenge II", MACHINE_IS_SKELETON )
+GAME( 200?, haunthig, 0, igs_mahjong, sdwx, igs_m027_state, init_hauntedh, ROT0, "IGS", "Haunted House (IGS)", MACHINE_IS_SKELETON )
diff --git a/src/mame/drivers/instruct.cpp b/src/mame/drivers/instruct.cpp
index 1f14360e37e..fd3f3b9622b 100644
--- a/src/mame/drivers/instruct.cpp
+++ b/src/mame/drivers/instruct.cpp
@@ -356,13 +356,13 @@ QUICKLOAD_LOAD_MEMBER(instruct_state::quickload_cb)
quick_length = image.length();
if (quick_length < 0x0100)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ image.seterror(image_error::INVALIDIMAGE, "File too short");
image.message(" File too short");
}
else
if (quick_length > 0x8000)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too long");
+ image.seterror(image_error::INVALIDIMAGE, "File too long");
image.message(" File too long");
}
else
@@ -371,12 +371,12 @@ QUICKLOAD_LOAD_MEMBER(instruct_state::quickload_cb)
read_ = image.fread( &quick_data[0], quick_length);
if (read_ != quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Cannot read the file");
+ image.seterror(image_error::INVALIDIMAGE, "Cannot read the file");
image.message(" Cannot read the file");
}
else if (quick_data[0] != 0xc5)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid header");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid header");
image.message(" Invalid header");
}
else
@@ -385,7 +385,7 @@ QUICKLOAD_LOAD_MEMBER(instruct_state::quickload_cb)
if (exec_addr >= quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Exec address beyond end of file");
+ image.seterror(image_error::INVALIDIMAGE, "Exec address beyond end of file");
image.message(" Exec address beyond end of file");
}
else
diff --git a/src/mame/drivers/jaguar.cpp b/src/mame/drivers/jaguar.cpp
index f31d60b76b7..d03cabc76c9 100644
--- a/src/mame/drivers/jaguar.cpp
+++ b/src/mame/drivers/jaguar.cpp
@@ -1967,7 +1967,7 @@ image_init_result jaguar_state::quickload_cb(device_image_interface &image)
/* Some programs are too lazy to set a stack pointer */
- m_maincpu->set_state_int(STATE_GENSP, 0x1000);
+ m_maincpu->set_state_int(M68K_SP, 0x1000);
m_shared_ram[0]=0x1000;
/* Transfer control to image */
diff --git a/src/mame/drivers/jtc.cpp b/src/mame/drivers/jtc.cpp
index ab57cdb0935..4a35b96c623 100644
--- a/src/mame/drivers/jtc.cpp
+++ b/src/mame/drivers/jtc.cpp
@@ -597,22 +597,22 @@ QUICKLOAD_LOAD_MEMBER(jtc_state::quickload_cb)
{
if (quick_length < 0x0088)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ image.seterror(image_error::INVALIDIMAGE, "File too short");
image.message(" File too short");
}
else
if (quick_length > 0x8000)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too long");
+ image.seterror(image_error::INVALIDIMAGE, "File too long");
image.message(" File too long");
}
else
{
quick_data.resize(quick_length+1);
- u16 read_ = image.fread( &quick_data[0], quick_length);
+ u16 read_ = image.fread(&quick_data[0], quick_length);
if (read_ != quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Cannot read the file");
+ image.seterror(image_error::INVALIDIMAGE, "Cannot read the file");
image.message(" Cannot read the file");
}
else
@@ -621,7 +621,7 @@ QUICKLOAD_LOAD_MEMBER(jtc_state::quickload_cb)
quick_length = quick_data[0x14] * 256 + quick_data[0x13] - quick_addr + 0x81;
if (image.length() != quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid file header");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid file header");
image.message(" Invalid file header");
}
else
@@ -643,7 +643,7 @@ QUICKLOAD_LOAD_MEMBER(jtc_state::quickload_cb)
quick_addr = 0xe000;
if (quick_length > 0x8000)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too long");
+ image.seterror(image_error::INVALIDIMAGE, "File too long");
image.message(" File too long");
}
else
@@ -652,7 +652,7 @@ QUICKLOAD_LOAD_MEMBER(jtc_state::quickload_cb)
u16 read_ = image.fread( &quick_data[0], quick_length);
if (read_ != quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Cannot read the file");
+ image.seterror(image_error::INVALIDIMAGE, "Cannot read the file");
image.message(" Cannot read the file");
}
else
diff --git a/src/mame/drivers/jupace.cpp b/src/mame/drivers/jupace.cpp
index 0ce284a9a44..a822f1448da 100644
--- a/src/mame/drivers/jupace.cpp
+++ b/src/mame/drivers/jupace.cpp
@@ -179,7 +179,7 @@ SNAPSHOT_LOAD_MEMBER(ace_state::snapshot_cb)
if (m_ram->size() < 16*1024)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "At least 16KB RAM expansion required");
+ image.seterror(image_error::INVALIDIMAGE, "At least 16KB RAM expansion required");
image.message("At least 16KB RAM expansion required");
return image_init_result::FAIL;
}
@@ -216,7 +216,7 @@ SNAPSHOT_LOAD_MEMBER(ace_state::snapshot_cb)
if (!done)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "EOF marker not found");
+ image.seterror(image_error::INVALIDIMAGE, "EOF marker not found");
image.message("EOF marker not found");
return image_init_result::FAIL;
}
@@ -249,7 +249,7 @@ SNAPSHOT_LOAD_MEMBER(ace_state::snapshot_cb)
cpu->set_state_int(Z80_R, RAM[0x2140]);
if ((RAM[0x2119] < 0x80) || !ace_index)
- cpu->set_state_int(STATE_GENSP, RAM[0x2118] | (RAM[0x2119] << 8));
+ cpu->set_state_int(Z80_SP, RAM[0x2118] | (RAM[0x2119] << 8));
}
/* Copy data to the address space */
diff --git a/src/mame/drivers/kaneko16.cpp b/src/mame/drivers/kaneko16.cpp
index a2b82bde90f..cd8f8f08599 100644
--- a/src/mame/drivers/kaneko16.cpp
+++ b/src/mame/drivers/kaneko16.cpp
@@ -1725,15 +1725,15 @@ void kaneko16_berlwall_state::berlwall(machine_config &config)
SPEAKER(config, "mono").front_center();
YM2149(config, m_ym2149[0], 1000000);
- m_ym2149[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_ym2149[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
m_ym2149[0]->port_a_read_callback().set_ioport("DSW1");
m_ym2149[0]->port_b_read_callback().set_ioport("DSW2");
YM2149(config, m_ym2149[1], 1000000);
- m_ym2149[1]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_ym2149[1]->add_route(ALL_OUTPUTS, "mono", 0.5);
OKIM6295(config, m_oki[0], 12000000/6, okim6295_device::PIN7_LOW);
- m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -1791,17 +1791,17 @@ void kaneko16_state::bakubrkr(machine_config &config)
SPEAKER(config, "mono").front_center();
YM2149(config, m_ym2149[0], XTAL(12'000'000)/6); /* verified on pcb */
- m_ym2149[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_ym2149[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
m_ym2149[0]->port_b_write_callback().set(FUNC(kaneko16_state::oki_bank0_w<7>)); /* outputs B: OKI bank Switch */
YM2149(config, m_ym2149[1], XTAL(12'000'000)/6); /* verified on pcb */
- m_ym2149[1]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_ym2149[1]->add_route(ALL_OUTPUTS, "mono", 0.5);
m_ym2149[1]->port_a_read_callback().set(FUNC(kaneko16_state::eeprom_r)); /* inputs A: 0,EEPROM bit read */
m_ym2149[1]->port_b_write_callback().set(FUNC(kaneko16_state::eeprom_cs_w)); /* outputs B: 0,EEPROM reset */
OKIM6295(config, m_oki[0], XTAL(12'000'000)/6, okim6295_device::PIN7_HIGH); /* verified on pcb */
m_oki[0]->set_addrmap(0, &kaneko16_state::bakubrkr_oki1_map);
- m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -1917,10 +1917,10 @@ void kaneko16_state::wingforc(machine_config &config)
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
YM2151(config, m_ymsnd, XTAL(16'000'000)/4);
- m_ymsnd->add_route(ALL_OUTPUTS, "mono", 0.4);
+ m_ymsnd->add_route(ALL_OUTPUTS, "mono", 0.2);
OKIM6295(config, m_oki[0], XTAL(16'000'000)/16, okim6295_device::PIN7_HIGH);
- m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
m_oki[0]->set_addrmap(0, &kaneko16_state::bakubrkr_oki1_map);
}
@@ -2107,15 +2107,15 @@ void kaneko16_state::mgcrystl(machine_config &config)
SPEAKER(config, "mono").front_center();
YM2149(config, m_ym2149[0], XTAL(12'000'000)/6); /* verified on pcb */
- m_ym2149[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_ym2149[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
YM2149(config, m_ym2149[1], XTAL(12'000'000)/6); /* verified on pcb */
- m_ym2149[1]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_ym2149[1]->add_route(ALL_OUTPUTS, "mono", 0.5);
m_ym2149[1]->port_a_read_callback().set(FUNC(kaneko16_state::eeprom_r)); /* inputs A: 0,EEPROM bit read */
m_ym2149[1]->port_b_write_callback().set(FUNC(kaneko16_state::eeprom_cs_w)); /* outputs B: 0,EEPROM reset */
OKIM6295(config, m_oki[0], XTAL(12'000'000)/6, okim6295_device::PIN7_HIGH); /* verified on pcb */
- m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -2228,11 +2228,11 @@ void kaneko16_shogwarr_state::shogwarr(machine_config &config)
OKIM6295(config, m_oki[0], XTAL(16'000'000)/8, okim6295_device::PIN7_LOW);
m_oki[0]->set_addrmap(0, &kaneko16_shogwarr_state::gtmr_oki1_map);
- m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
OKIM6295(config, m_oki[1], XTAL(16'000'000)/8, okim6295_device::PIN7_LOW);
m_oki[1]->set_addrmap(0, &kaneko16_shogwarr_state::gtmr_oki2_map);
- m_oki[1]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki[1]->add_route(ALL_OUTPUTS, "mono", 0.5);
}
diff --git a/src/mame/drivers/kangaroo.cpp b/src/mame/drivers/kangaroo.cpp
index ecfc6c23099..c4013c0175b 100644
--- a/src/mame/drivers/kangaroo.cpp
+++ b/src/mame/drivers/kangaroo.cpp
@@ -557,6 +557,31 @@ ROM_START( kangaroob )
ROM_END
+ROM_START( kangarool ) // runs on earlier revision TVG-1-CPU-A + TVG-1-VIDEO-A PCBs
+ ROM_REGION( 0x14000, "maincpu", 0 ) // only ic17 differs from the parent
+ ROM_LOAD( "tvg_75.ic7", 0x0000, 0x1000, CRC(0d18c581) SHA1(0e0f89d644b79e887c53e5294783843ca7e875ba) )
+ ROM_LOAD( "tvg_76.ic8", 0x1000, 0x1000, CRC(5978d37a) SHA1(684c1092de4a0927a03752903c86c3bbe99e868a) )
+ ROM_LOAD( "tvg_77.ic9", 0x2000, 0x1000, CRC(522d1097) SHA1(09fe627a46d32df2e098d9fad7757f9d61bef41f) )
+ ROM_LOAD( "tvg_78.ic10", 0x3000, 0x1000, CRC(063da970) SHA1(582ff21dd46c651f07a4846e0f8a7544a5891988) )
+ ROM_LOAD( "tvg_79.ic16", 0x4000, 0x1000, CRC(9e5cf8ca) SHA1(015387f038c5670f88c9b22453d074bd9b2a129d) )
+ ROM_LOAD( "tvg_80.ic17", 0x5000, 0x1000, CRC(62df0271) SHA1(4043d90d33ff04729077be7956d30bf82add103c) )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_LOAD( "tvg_81.ic24", 0x0000, 0x1000, CRC(fb449bfd) SHA1(f593a0339f47e121736a927587132aeb52704557) )
+
+ ROM_REGION( 0x0800, "mcu", 0 ) // internal ROM from the 8841 custom MCU
+ ROM_LOAD( "mb8841.ic29", 0x0000, 0x0800, NO_DUMP )
+
+ ROM_REGION( 0x0800, "user1", 0 ) // data for the 8841 custom MCU
+ ROM_LOAD( "tvg_82.ic28", 0x0000, 0x0800, CRC(57766f69) SHA1(94a7a557d8325799523d5e1a88653a9a3fbe34f9) )
+
+ ROM_REGION( 0x4000, "gfx1", 0 )
+ ROM_LOAD( "tvg_83.ic76", 0x0000, 0x1000, CRC(c0446ca6) SHA1(fca6ba565051337c0198c93b7b8477632e0dd0b6) )
+ ROM_LOAD( "tvg_85.ic77", 0x1000, 0x1000, CRC(72c52695) SHA1(87f4715fbb7d509bd9cc4e71e2afb0d475bbac13) )
+ ROM_LOAD( "tvg_84.ic52", 0x2000, 0x1000, CRC(e4cb26c2) SHA1(5016db9d48fdcfb757618659d063b90862eb0e90) )
+ ROM_LOAD( "tvg_86.ic53", 0x3000, 0x1000, CRC(9e6a599f) SHA1(76b4eddb4efcd8189d8cc5962d8497e82885f212) )
+ROM_END
+
/*************************************
*
@@ -564,7 +589,8 @@ ROM_END
*
*************************************/
-GAME( 1981, fnkyfish, 0, nomcu, fnkyfish, kangaroo_state, empty_init, ROT90, "Sun Electronics", "Funky Fish", MACHINE_SUPPORTS_SAVE )
-GAME( 1982, kangaroo, 0, mcu, kangaroo, kangaroo_state, empty_init, ROT90, "Sun Electronics", "Kangaroo", MACHINE_SUPPORTS_SAVE )
-GAME( 1982, kangarooa, kangaroo, mcu, kangaroo, kangaroo_state, empty_init, ROT90, "Sun Electronics (Atari license)", "Kangaroo (Atari)", MACHINE_SUPPORTS_SAVE )
-GAME( 1982, kangaroob, kangaroo, nomcu, kangaroo, kangaroo_state, empty_init, ROT90, "bootleg", "Kangaroo (bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, fnkyfish, 0, nomcu, fnkyfish, kangaroo_state, empty_init, ROT90, "Sun Electronics", "Funky Fish", MACHINE_SUPPORTS_SAVE )
+GAME( 1982, kangaroo, 0, mcu, kangaroo, kangaroo_state, empty_init, ROT90, "Sun Electronics", "Kangaroo", MACHINE_SUPPORTS_SAVE )
+GAME( 1982, kangarooa, kangaroo, mcu, kangaroo, kangaroo_state, empty_init, ROT90, "Sun Electronics (Atari license)", "Kangaroo (Atari)", MACHINE_SUPPORTS_SAVE )
+GAME( 1982, kangaroob, kangaroo, nomcu, kangaroo, kangaroo_state, empty_init, ROT90, "bootleg", "Kangaroo (bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1982, kangarool, kangaroo, mcu, kangaroo, kangaroo_state, empty_init, ROT90, "Sun Electronics (Loewen-Automaten license)", "Kangaroo (Loewen-Automaten)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/kaypro.cpp b/src/mame/drivers/kaypro.cpp
index 093d466eae6..a6a022d2e42 100644
--- a/src/mame/drivers/kaypro.cpp
+++ b/src/mame/drivers/kaypro.cpp
@@ -67,8 +67,8 @@ u8 kaypro_state::kaypro484_87_r() { return 0x7f; } /* to bypass unemulated HD
void kaypro_state::kaypro_map(address_map &map)
{
- map(0x0000, 0x2fff).bankr("bankr").bankw("bankw");
- map(0x3000, 0x3fff).bankrw("bank3");
+ map(0x0000, 0x2fff).bankr(m_bankr).bankw(m_bankw);
+ map(0x3000, 0x3fff).bankrw(m_bank3);
map(0x4000, 0xffff).ram();
}
diff --git a/src/mame/drivers/kenseim.cpp b/src/mame/drivers/kenseim.cpp
index ac1288ee492..f51a0a33801 100644
--- a/src/mame/drivers/kenseim.cpp
+++ b/src/mame/drivers/kenseim.cpp
@@ -159,7 +159,10 @@ public:
m_from68k_st4(0),
m_from68k_st3(0),
m_from68k_st2(0),
- m_lamps(*this, "lamp%u", 1U)
+ m_lamps(*this, "lamp%u", 1U),
+ m_startlamp(*this, "startlamp%u", 1U),
+ m_molea(*this, "molea_%u", 0U),
+ m_moleb(*this, "moleb_%u", 0U)
{
for (int i = 0; i < 6; i++)
{
@@ -198,18 +201,10 @@ private:
void update_moles()
{
for (int i = 0; i < 6; i++)
- {
- char temp[32];
- sprintf(temp, "molea_%d", i);
- output().set_value(temp, mole_state_a[i]);
- }
+ m_molea[i] = mole_state_a[i];
for (int i = 0; i < 6; i++)
- {
- char temp[32];
- sprintf(temp, "moleb_%d", i);
- output().set_value(temp, mole_state_b[i]);
- }
+ m_moleb[i] = mole_state_b[i];
}
/* kenseim */
@@ -255,6 +250,9 @@ private:
int mole_state_a[6];
int mole_state_b[6];
output_finder<20> m_lamps;
+ output_finder<2> m_startlamp;
+ output_finder<6> m_molea;
+ output_finder<6> m_moleb;
};
@@ -357,10 +355,10 @@ void kenseim_state::cpu_portc_w(uint8_t data)
// d5: coin lock
// d6: left start button lamp
// d7: right start button lamp
- machine().bookkeeping().coin_lockout_w(0, (data & 0x10) ? 0 : 1); // toggles if you attempt to insert a coin when there are already 15 coins inserted
- machine().bookkeeping().coin_counter_w(0, (data & 0x20) ? 0 : 1);
- output().set_value("startlamp1", (data & 0x80) ? 0 : 1);
- output().set_value("startlamp2", (data & 0x40) ? 0 : 1);
+ machine().bookkeeping().coin_lockout_w(0, !BIT(data, 4)); // toggles if you attempt to insert a coin when there are already 15 coins inserted
+ machine().bookkeeping().coin_counter_w(0, !BIT(data, 5));
+ m_startlamp[0] = !BIT(data, 7);
+ m_startlamp[1] = !BIT(data, 6);
}
@@ -704,6 +702,9 @@ void kenseim_state::init_kenseim()
m_led_latch = 0;
m_lamps.resolve();
+ m_startlamp.resolve();
+ m_molea.resolve();
+ m_moleb.resolve();
}
diff --git a/src/mame/drivers/kikikai.cpp b/src/mame/drivers/kikikai.cpp
index a3913fe8686..b5d38ec4a7d 100644
--- a/src/mame/drivers/kikikai.cpp
+++ b/src/mame/drivers/kikikai.cpp
@@ -39,6 +39,8 @@ Notes:
figure it all out. Indeed, the 68705 code reads all the memory locations
related to the missing collision detection, but does nothing with them.
+- KiKi KaiKai coinage mode Type 2 doesn't work.
+
- Kick and Run is a rom swap for Kiki KaiKai as the pal chips are all A85-0x
A85 is the Taito rom code for Kiki KaiKai. Even the MCU is socketed!
@@ -51,6 +53,90 @@ JPH1011P JPH1020P JPH1021P
185 185 185
PS4 J8635 PS4 J8541 PS4 J8648
+
+***************************************************************************
+Kiki KaiKai, Taito, 1986
+Hardware info by Guru
+Last Update: 22nd August 2021
+
+
+PCB Layout
+----------
+
+MAIN BOARD K1100195A J1100079A
+Sticker: K1100195A KIKI KAIKAI
+|-------------------------------------------------------------------|
+| SWA SWB TMM2064 A85_15.A1|
+| MB3731 YM3014 YM2203C A85-04.A2 A85_14.A3|
+| 4556 TMM2064 A85_13.A5|
+| VOL Z0840006PSC A85_12.A6|
+| CN1 A85_11.F6 |
+| PC050CM CXK5816 A85-03.B7 |
+|A85_01.H8 |--|
+| | |
+| | |
+|J | |
+|A A85_05.D10 | |
+|M | |E
+|M A85_07.G11 CXK5816 | |
+|A | |
+| A85-10.G12 MCM2016 | |
+| * * * | |
+| A85-09.G14 |--|
+| A85-08.G15 MCM2016 |
+| A85-02.A13|
+| A85-06.G16 |
+| |
+| A85_17.H16 |
+| A85_16.H18 Z0840006PSC MB3771 24MHz |
+|-------------------------------------------------------------------|
+Notes:
+ E - 50 pin flat cable connector labelled 'E' (unused)
+ A85-01.H8 - Motorola MC6801U4 8-bit microcontroller with 192 Bytes internal RAM and 4kB internal mask ROM marked 'TAITO A85-01 JPH1020P 185 PS4 J8641'
+ Clock input 3.000MHz on pin 3 [24/8]
+ CN1 - 4-pin header labelled 'JAMMA' with a 4-pin plug marked 'H' connected on top.
+ Pin 1 is tied to ground.
+ Pin 2 is tied to the PC050CM on pin 10 (schematics show pin 10 is tied to ground).
+ Each of the pins 3 and 4 connect to the JAMMA 12V pins separately (JAMMA 12V is not tied together on the PCB).
+ On the 'H' plug, pins 1-2 are tied with a wire and pin 3-4 are tied with a wire.
+ MB3731 - Fujitsu MB3731 18W BTL mono power amplifier
+ MB3771 - Fujitsu MB3771 power supply monitor IC. This is used to provide the power-on reset.
+ SWA/SWB - 8-position DIP switch
+ TMM2064 - Toshiba TMM2064 8kx8-bit static RAM
+ MCM2016 - Motorola MCM2016 2kx8-bit static RAM
+ CXK5816 - Sony CXK5816 2kx8-bit static RAM
+ 4556 - 4556 dual operational amplifier
+ VOL - 5k volume pot
+ PC050CM - Taito PC050CM custom SIL28 ceramic module for coins, coin lockout and coin counters
+ YM3014 - Yamaha YM3014 serial input floating D/A converter. Clock input 1.000MHz on pin 5 [24/24]. Other clocks: pin 3= 41.6666kHz, pin 4= 83.3332kHz
+ YM2203C - Yamaha YM2203C OPN (FM Operator Type-N) 3-channel sound chip. Clock input 3.000MHz [24/8]
+ Z0840006PSC - Zilog Z0840006PSC Z80 CPU. Clock input 6.000MHz [24/4] (for both Z80's)
+ HSync - 15.1436kHz
+ VSync - 59.1858Hz
+ A85-02.A13 - MMI PAL16L8A marked 'A85-02'
+ A85-03.B7 - MMI PAL16L8A marked 'A85-03'
+ A85-04.A2 - MMI PAL16L8A marked 'A85-04'
+ A85-05.D10 - MMI PAL16L8A marked 'A85-05'
+ A85-06.G16 - MMI PAL16L8A marked 'A85-06'
+ A85-07.G11 - MMI PAL16R4A marked 'A85-07'
+ A85_11 - 27C256 EPROM
+A85_12 to 17 - 27C512 EPROM
+ A85-08.G15 - 63S141 bipolar PROM (Red)
+ A85-09.G14 - 63S141 bipolar PROM (Blue)
+ A85-10.G12 - 63S141 bipolar PROM (Green)
+ * - 4 resistors connected to the color PROM outputs.
+ They are connected as follows (duplicated 3 times for each color PROM).....
+
+ O4-----R220-----|
+ |
+ O3-----R470--+--|
+ Final Output----------| |
+ 02-----R1k------|
+ |
+ 01-----R2.2k----|
+
+ The final output of each PROM connects to the JAMMA connector pins for the red, green or blue video output.
+
***************************************************************************/
#include "emu.h"
@@ -174,49 +260,49 @@ static INPUT_PORTS_START( kicknrun )
/* When Bit 1 is On, the machine waits a signal from another one */
/* Seems like if you can join two cabinets, one as master */
/* and the other as slave, probably to play four players. */
- PORT_DIPNAME( 0x01, 0x01, "Master/Slave Mode" ) PORT_DIPLOCATION("SW1:1")
+ PORT_DIPNAME( 0x01, 0x01, "Master/Slave Mode" ) PORT_DIPLOCATION("SWA:1")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") // Screen ?
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SWA:2") // Screen ?
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) PORT_DIPLOCATION("SW1:3")
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:4") // Demo Sounds only play every 8th Demo
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SWA:4") // Demo Sounds only play every 8th Demo
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
- PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:5,6")
+ PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:5,6")
PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) )
PORT_DIPSETTING( 0x20, DEF_STR( 1C_2C ) )
- PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:7,8")
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWA:7,8")
PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) )
PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) )
PORT_START("DSW1")
- PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2")
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SWB:1,2")
PORT_DIPSETTING( 0x03, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x02, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x01, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
- PORT_DIPNAME( 0x0c, 0x08, "Playing Time" ) PORT_DIPLOCATION("SW2:3,4")
+ PORT_DIPNAME( 0x0c, 0x08, "Playing Time" ) PORT_DIPLOCATION("SWB:3,4")
PORT_DIPSETTING( 0x00, "40 Seconds" )
PORT_DIPSETTING( 0x0c, "One Minute" )
PORT_DIPSETTING( 0x08, "One Minute and 20 Sec." )
PORT_DIPSETTING( 0x04, "One Minute and 40 Sec." )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:5")
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SWB:5")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
/* The following dip seems to be related with the first one */
- PORT_DIPNAME( 0x20, 0x20, "Board ID" ) PORT_DIPLOCATION("SW2:6")
+ PORT_DIPNAME( 0x20, 0x20, "Board ID" ) PORT_DIPLOCATION("SWB:6")
PORT_DIPSETTING( 0x20, "Master" )
PORT_DIPSETTING( 0x00, "Slave" )
- PORT_DIPNAME( 0x40, 0x40, "Number of Matches" ) PORT_DIPLOCATION("SW2:7")
+ PORT_DIPNAME( 0x40, 0x40, "Number of Matches" ) PORT_DIPLOCATION("SWB:7")
PORT_DIPSETTING( 0x00, "2" )
PORT_DIPSETTING( 0x40, "6" )
- PORT_DIPNAME( 0x80, 0x80, "Single board 4 Players Mode" ) PORT_DIPLOCATION("SW2:8")
+ PORT_DIPNAME( 0x80, 0x80, "Single board 4 Players Mode" ) PORT_DIPLOCATION("SWB:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
@@ -298,49 +384,49 @@ static INPUT_PORTS_START( mexico86 )
/* When Bit 1 is On, the machine waits a signal from another one */
/* Seems like if you can join two cabinets, one as master */
/* and the other as slave, probably to play four players. */
- PORT_DIPNAME( 0x01, 0x01, "Master/Slave Mode" ) PORT_DIPLOCATION("SW1:1")
+ PORT_DIPNAME( 0x01, 0x01, "Master/Slave Mode" ) PORT_DIPLOCATION("SWA:1")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") // Screen ?
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SWA:2") // Screen ?
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) PORT_DIPLOCATION("SW1:3")
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4")// this should be Demo Sounds, but doesn't work?
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SWA:4")// this should be Demo Sounds, but doesn't work?
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:5,6")
+ PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:5,6")
PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) )
PORT_DIPSETTING( 0x20, DEF_STR( 1C_2C ) )
- PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:7,8")
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWA:7,8")
PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) )
PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) )
PORT_START("DSW1")
- PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2")
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SWB:1,2")
PORT_DIPSETTING( 0x03, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x02, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x01, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
- PORT_DIPNAME( 0x0c, 0x08, "Playing Time" ) PORT_DIPLOCATION("SW2:3,4")
+ PORT_DIPNAME( 0x0c, 0x08, "Playing Time" ) PORT_DIPLOCATION("SWB:3,4")
PORT_DIPSETTING( 0x00, "40 Seconds" )
PORT_DIPSETTING( 0x0c, "One Minute" )
PORT_DIPSETTING( 0x08, "One Minute and 20 Sec." )
PORT_DIPSETTING( 0x04, "One Minute and 40 Sec." )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:5")
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SWB:5")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
/* The following dip seems to be related with the first one */
- PORT_DIPNAME( 0x20, 0x20, "Board ID" ) PORT_DIPLOCATION("SW2:6")
+ PORT_DIPNAME( 0x20, 0x20, "Board ID" ) PORT_DIPLOCATION("SWB:6")
PORT_DIPSETTING( 0x20, "Master" )
PORT_DIPSETTING( 0x00, "Slave" )
- PORT_DIPNAME( 0x40, 0x40, "Number of Matches" ) PORT_DIPLOCATION("SW2:7")
+ PORT_DIPNAME( 0x40, 0x40, "Number of Matches" ) PORT_DIPLOCATION("SWB:7")
PORT_DIPSETTING( 0x00, "2" )
PORT_DIPSETTING( 0x40, "6" )
- PORT_DIPNAME( 0x80, 0x80, "Single board 4 Players Mode" ) PORT_DIPLOCATION("SW2:8")
+ PORT_DIPNAME( 0x80, 0x80, "Single board 4 Players Mode" ) PORT_DIPLOCATION("SWB:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
@@ -419,14 +505,14 @@ static INPUT_PORTS_START( kikikai )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("DSW0")
- PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:1")
+ PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SWA:1")
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x01, DEF_STR( Cocktail ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:2")
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWA:2")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) PORT_DIPLOCATION("SW1:3")
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:4")
+ PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) PORT_DIPLOCATION("SWA:3")
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPLOCATION("SWA:4")
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
@@ -443,38 +529,46 @@ static INPUT_PORTS_START( kikikai )
PORT_DIPSETTING( 0x00, "A:2C/3C B:1C/6C" )
#endif
- // coinage copied from Japanese manual but type B doesn't work
- PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:5,6")
- PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) )
- PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) )
- PORT_DIPSETTING( 0x20, DEF_STR( 1C_2C ) )
- PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:7,8")
- PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) )
- PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) )
- PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) )
+ // coinage copied from Japanese manual but Type 2 doesn't work so when Type 2 is selected, the Type 1 coinage is still active.
+ PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:5,6")
+ PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x40)
+ PORT_DIPSETTING( 0x20, DEF_STR( 1C_2C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x40)
+ PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x40)
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x40)
+ PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x00)
+ PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x00)
+ PORT_DIPSETTING( 0x10, DEF_STR( 3C_1C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x00)
+ PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x00)
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWA:7,8")
+ PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x40)
+ PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x40)
+ PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x40)
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x40)
+ PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x00)
+ PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x00)
+ PORT_DIPSETTING( 0x40, DEF_STR( 1C_4C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x00)
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_6C ) ) PORT_CONDITION("DSW1", 0x40, EQUALS, 0x00)
PORT_START("DSW1")
- PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2")
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SWB:1,2")
PORT_DIPSETTING( 0x02, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x03, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x01, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
- PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3,4")
+ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SWB:3,4")
PORT_DIPSETTING( 0x00, "50000 100000" )
PORT_DIPSETTING( 0x0c, "70000 150000" )
PORT_DIPSETTING( 0x08, "70000 200000" )
PORT_DIPSETTING( 0x04, "100000 300000" )
- PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:5,6")
+ PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWB:5,6")
PORT_DIPSETTING( 0x00, "2" )
PORT_DIPSETTING( 0x30, "3" )
PORT_DIPSETTING( 0x20, "4" )
PORT_DIPSETTING( 0x10, "5" )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW2:7")
- PORT_DIPSETTING( 0x40, "A" )
- PORT_DIPSETTING( 0x00, "B" )
- PORT_DIPNAME( 0x80, 0x00, "Number Match" ) PORT_DIPLOCATION("SW2:8")
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SWB:7")
+ PORT_DIPSETTING( 0x40, "Type 1" )
+ PORT_DIPSETTING( 0x00, "Type 2" )
+ PORT_DIPNAME( 0x80, 0x00, "Number Match" ) PORT_DIPLOCATION("SWB:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
diff --git a/src/mame/drivers/kinst.cpp b/src/mame/drivers/kinst.cpp
index 44d9ac41644..491458855aa 100644
--- a/src/mame/drivers/kinst.cpp
+++ b/src/mame/drivers/kinst.cpp
@@ -2,19 +2,31 @@
// copyright-holders:Aaron Giles
/***************************************************************************
- Killer Instinct hardware
-
- driver by Aaron Giles and Bryan McPhail
-
- Games supported:
- * Killer Instinct
- * Killer Instinct 2
-
- Known bugs:
- * the SRAM test fails in diagnostics; this is due to the fact that
- the test relies on executing out of the cache while it tromps
- over (and eventually restores) the instructions it is executing;
- this will likely never be fixed
+Killer Instinct hardware
+
+driver by Aaron Giles and Bryan McPhail
+
+Games supported:
+- Killer Instinct
+- Killer Instinct 2
+
+Game by Rare, manufacturing/publishing by Midway.
+Nintendo was just the owner of the Killer Instinct trademark, and licensor
+of the "Ultra 64" arcade games.
+
+TODO:
+- The SRAM test fails in diagnostics; this is due to the fact that the test
+ relies on executing out of the cache while it tromps over (and eventually
+ restores) the instructions it is executing; this will likely never be fixed.
+- Bootup sequence (the blue color fill) is too fast, which in turn causes
+ attract mode music not to play. Maybe the main CPU is running at a lower
+ clockspeed at boot (50MHz/4 seems plausible), but then, what toggles it?
+- Screen timing (not just H and V freq). 261 lines should be good, but pixel
+ clock is unknown. The only one that comes close to sensible values is 6MHz,
+ yet there is no (multiple of) 6MHz XTAL.
+ 15384.6 / 58.9634 = 260.9178 (261 lines? howcome it's off by 0.1?)
+ 15384.6 * 325 = 4999995 (nope, 5 clocks hblank/hsync is too short)
+ 15384.6 * 390 = 5999994
****************************************************************************
@@ -184,23 +196,25 @@ Notes:
#include "bus/ata/idehd.h"
#include "cpu/adsp2100/adsp2100.h"
#include "cpu/mips/mips3.h"
+
#include "emupal.h"
#include "screen.h"
+namespace {
+
class kinst_state : public driver_device
{
public:
kinst_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
- m_rambase(*this, "rambase"),
- m_rambase2(*this, "rambase2"),
- m_control(*this, "control"),
- m_rombase(*this, "user1"),
m_maincpu(*this, "maincpu"),
m_ata(*this, "ata"),
m_dcs(*this, "dcs"),
- m_palette(*this, "palette")
+ m_palette(*this, "palette"),
+ m_rambase(*this, "rambase"),
+ m_rambase2(*this, "rambase2"),
+ m_rombase(*this, "user1")
{
}
@@ -208,47 +222,79 @@ public:
void init_kinst2();
void kinst(machine_config &config);
+ void kinst2(machine_config &config);
+<<<<<<< HEAD
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void device_timer(timer_instance const &timer) override;
+=======
+ DECLARE_CUSTOM_INPUT_MEMBER(sound_status_r) { return BIT(m_dcs->control_r(), 11); }
+>>>>>>> master
-private:
- required_shared_ptr<uint32_t> m_rambase;
- required_shared_ptr<uint32_t> m_rambase2;
- required_shared_ptr<uint32_t> m_control;
- required_region_ptr<uint32_t> m_rombase;
+protected:
required_device<mips3_device> m_maincpu;
required_device<ata_interface_device> m_ata;
required_device<dcs_audio_2k_device> m_dcs;
required_device<palette_device> m_palette;
- uint32_t *m_video_base;
- const uint8_t *m_control_map;
- emu_timer *m_irq0_stop_timer;
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
- enum
- {
- TIMER_IRQ0_STOP
- };
+ void kinst_map(address_map &map);
+ void kinst2_map(address_map &map);
- uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- INTERRUPT_GEN_MEMBER(irq0_start);
- uint32_t control_r(offs_t offset);
- void control_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
uint32_t ide_r(offs_t offset, uint32_t mem_mask = ~0);
void ide_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+
+private:
+ required_shared_ptr<uint32_t> m_rambase;
+ required_shared_ptr<uint32_t> m_rambase2;
+ required_region_ptr<uint32_t> m_rombase;
+
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t ide_extra_r();
void ide_extra_w(uint32_t data);
- void main_map(address_map &map);
+ void vram_control_w(offs_t offset, uint32_t data, uint32_t mem_mask);
+ void sound_reset_w(offs_t offset, uint32_t data, uint32_t mem_mask);
+ void sound_control_w(offs_t offset, uint32_t data, uint32_t mem_mask);
+ void sound_data_w(offs_t offset, uint32_t data, uint32_t mem_mask);
+ void coin_control_w(offs_t offset, uint32_t data, uint32_t mem_mask);
+
+ uint32_t m_hdd_serial_offset;
+ uint32_t *m_video_base;
+
+ uint32_t m_vram_control = 0;
+ uint32_t m_sound_reset = 0;
+ uint32_t m_sound_control = 0;
+ uint32_t m_sound_data = 0;
+ uint32_t m_coin_control = 0;
};
+class kinst2uk_state : public kinst_state
+{
+public:
+ using kinst_state::kinst_state;
-/* constants */
-#define MASTER_CLOCK XTAL(50'000'000)
+ void kinst2uk(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+ void kinst2uk_map(address_map &map);
+
+ uint32_t cpld_r(offs_t offset, uint32_t mem_mask);
+ void cpld_w(offs_t offset, uint32_t data, uint32_t mem_mask);
+
+private:
+ uint8_t m_prot_sel = 0;
+ uint8_t m_prot_cnt = 0;
+ uint8_t m_prot_rega = 0;
+ uint8_t m_prot_regb = 0;
+};
@@ -260,15 +306,32 @@ private:
void kinst_state::machine_start()
{
- /* set the fastest DRC options */
+ // set the fastest DRC options
m_maincpu->mips3drc_set_options(MIPS3DRC_FASTEST_OPTIONS);
- /* configure fast RAM regions */
+ // configure fast RAM regions
m_maincpu->add_fastram(0x08000000, 0x087fffff, false, m_rambase2);
m_maincpu->add_fastram(0x00000000, 0x0007ffff, false, m_rambase);
m_maincpu->add_fastram(0x1fc00000, 0x1fc7ffff, true, m_rombase);
- m_irq0_stop_timer = timer_alloc(TIMER_IRQ0_STOP);
+ // register for savestates
+ save_item(NAME(m_vram_control));
+ save_item(NAME(m_sound_reset));
+ save_item(NAME(m_sound_control));
+ save_item(NAME(m_sound_data));
+ save_item(NAME(m_coin_control));
+}
+
+
+void kinst2uk_state::machine_start()
+{
+ kinst_state::machine_start();
+
+ // register for savestates
+ save_item(NAME(m_prot_sel));
+ save_item(NAME(m_prot_cnt));
+ save_item(NAME(m_prot_rega));
+ save_item(NAME(m_prot_regb));
}
@@ -284,26 +347,18 @@ void kinst_state::machine_reset()
ide_hdd_device *hdd = m_ata->subdevice<ata_slot_device>("0")->subdevice<ide_hdd_device>("hdd");
uint16_t *identify_device = hdd->identify_device_buffer();
- if (strncmp(machine().system().name, "kinst2", 6) != 0)
- {
- /* kinst: tweak the model number so we pass the check */
- identify_device[27] = ('S' << 8) | 'T';
- identify_device[28] = ('9' << 8) | '1';
- identify_device[29] = ('5' << 8) | '0';
- identify_device[30] = ('A' << 8) | 'G';
- identify_device[31] = (' ' << 8) | ' ';
- }
- else
- {
- /* kinst2: tweak the model number so we pass the check */
- identify_device[10] = ('0' << 8) | '0';
- identify_device[11] = ('S' << 8) | 'T';
- identify_device[12] = ('9' << 8) | '1';
- identify_device[13] = ('5' << 8) | '0';
- identify_device[14] = ('A' << 8) | 'G';
- }
+ // insert harddisk model number so we pass the check
+ for (int i = 10; i < 20; i++)
+ identify_device[i] = ('0' << 8) | '0';
+ for (int i = 27; i < 47; i++)
+ identify_device[i] = (' ' << 8) | ' ';
+
+ static const char serial[9] = "ST9150AG";
- /* set a safe base location for video */
+ for (int i = 0; i < 4; i++)
+ identify_device[m_hdd_serial_offset + i] = serial[i * 2] << 8 | serial[i * 2 + 1];
+
+ // set a safe base location for video
m_video_base = &m_rambase[0x30000/4];
}
@@ -342,6 +397,7 @@ uint32_t kinst_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
/*************************************
*
+<<<<<<< HEAD
* Interrupt handling
*
*************************************/
@@ -368,6 +424,8 @@ INTERRUPT_GEN_MEMBER(kinst_state::irq0_start)
/*************************************
*
+=======
+>>>>>>> master
* IDE controller access
*
*************************************/
@@ -399,73 +457,89 @@ void kinst_state::ide_extra_w(uint32_t data)
/*************************************
*
- * Control handling
+ * Upgrade kit CPLD simulation
*
*************************************/
-uint32_t kinst_state::control_r(offs_t offset)
+uint32_t kinst2uk_state::cpld_r(offs_t offset, uint32_t mem_mask)
{
- uint32_t result;
- static const char *const portnames[] = { "P1", "P2", "VOLUME", "UNUSED", "DSW" };
+ // returns last upper bits written with xor of counter and registers in lower 4 bits
+ if (m_prot_sel)
+ return (m_prot_sel << 4) | (m_prot_cnt ^ m_prot_rega ^ m_prot_regb);
+ else
+ return ide_r(0x0c, mem_mask);
+}
- /* apply shuffling */
- offset = m_control_map[offset / 2];
- result = m_control[offset];
- switch (offset)
+void kinst2uk_state::cpld_w(offs_t offset, uint32_t data, uint32_t mem_mask)
+{
+ if (BIT(data, 4)) // write to IDE slave (protection CPLD)
{
- case 2: /* $90 -- sound return */
- result = ioport(portnames[offset])->read();
- result &= ~0x0002;
- if (m_dcs->control_r() & 0x800)
- result |= 0x0002;
- break;
-
- case 0: /* $80 */
- case 1: /* $88 */
- case 3: /* $98 */
- result = ioport(portnames[offset])->read();
- break;
-
- case 4: /* $a0 */
- result = ioport(portnames[offset])->read();
- if (m_maincpu->pc() == 0x802d428)
- m_maincpu->spin_until_interrupt();
- break;
+ if (BIT(data, 6))
+ {
+ m_prot_sel = 0x05; // select IDE slave (D6 high)
+ m_prot_rega = data & 0x0f; // store lower 4 bits in register A
+ }
+ else
+ {
+ m_prot_sel = 0x01; // select IDE slave (D6 low)
+ m_prot_regb = data & 0x0f; // store lower 4 bits in register B
+ m_prot_cnt = (m_prot_cnt + 1) & 0x0f; // every write increments the counter
+ }
}
+ else // write to IDE master
+ {
+ m_prot_sel = 0; // deselect IDE slave
+ }
+
+ ide_w(0x0c, data, mem_mask);
+}
+
+
+
+/*************************************
+ *
+ * Control handling
+ *
+ *************************************/
- return result;
+void kinst_state::vram_control_w(offs_t offset, uint32_t data, uint32_t mem_mask)
+{
+ COMBINE_DATA(&m_vram_control);
+ if (m_vram_control & 4)
+ m_video_base = &m_rambase[0x58000/4];
+ else
+ m_video_base = &m_rambase[0x30000/4];
}
-void kinst_state::control_w(offs_t offset, uint32_t data, uint32_t mem_mask)
+void kinst_state::sound_reset_w(offs_t offset, uint32_t data, uint32_t mem_mask)
{
- /* apply shuffling */
- offset = m_control_map[offset / 2];
- uint32_t olddata = m_control[offset];
- COMBINE_DATA(&m_control[offset]);
+ COMBINE_DATA(&m_sound_reset);
+ m_dcs->reset_w(m_sound_reset & 0x01);
+}
- switch (offset)
- {
- case 0: /* $80 - VRAM buffer control */
- if (data & 4)
- m_video_base = &m_rambase[0x58000/4];
- else
- m_video_base = &m_rambase[0x30000/4];
- break;
-
- case 1: /* $88 - sound reset */
- m_dcs->reset_w(data & 0x01);
- break;
-
- case 2: /* $90 - sound control */
- if (!(olddata & 0x02) && (m_control[offset] & 0x02))
- m_dcs->data_w(m_control[3]);
- break;
-
- case 3: /* $98 - sound data */
- break;
- }
+
+void kinst_state::sound_control_w(offs_t offset, uint32_t data, uint32_t mem_mask)
+{
+ uint32_t prev = m_sound_control;
+ COMBINE_DATA(&m_sound_control);
+
+ if (!(prev & 0x02) && (m_sound_control & 0x02))
+ m_dcs->data_w(m_sound_data);
+}
+
+
+void kinst_state::sound_data_w(offs_t offset, uint32_t data, uint32_t mem_mask)
+{
+ COMBINE_DATA(&m_sound_data);
+}
+
+
+void kinst_state::coin_control_w(offs_t offset, uint32_t data, uint32_t mem_mask)
+{
+ COMBINE_DATA(&m_coin_control);
+ // d0: coincounter? (only on coin slot 1,2)
}
@@ -476,18 +550,47 @@ void kinst_state::control_w(offs_t offset, uint32_t data, uint32_t mem_mask)
*
*************************************/
-void kinst_state::main_map(address_map &map)
+void kinst_state::kinst_map(address_map &map)
{
map.unmap_value_high();
- map(0x00000000, 0x0007ffff).ram().share("rambase");
- map(0x08000000, 0x087fffff).ram().share("rambase2");
- map(0x10000080, 0x100000ff).rw(FUNC(kinst_state::control_r), FUNC(kinst_state::control_w)).share("control");
+ map(0x00000000, 0x0007ffff).ram().share(m_rambase);
+ map(0x08000000, 0x087fffff).ram().share(m_rambase2);
+
+ map(0x10000080, 0x10000083).portr("P1").w(FUNC(kinst_state::vram_control_w));
+ map(0x10000088, 0x1000008b).portr("P2").w(FUNC(kinst_state::sound_reset_w));
+ map(0x10000090, 0x10000093).portr("VOLUME").w(FUNC(kinst_state::sound_control_w));
+ map(0x10000098, 0x1000009b).portr("UNUSED").w(FUNC(kinst_state::sound_data_w));
+ map(0x100000a0, 0x100000a3).portr("DSW").nopw();
+ map(0x100000b0, 0x100000b3).w(FUNC(kinst_state::coin_control_w));
+
map(0x10000100, 0x1000013f).rw(FUNC(kinst_state::ide_r), FUNC(kinst_state::ide_w));
map(0x10000170, 0x10000173).rw(FUNC(kinst_state::ide_extra_r), FUNC(kinst_state::ide_extra_w));
map(0x1fc00000, 0x1fc7ffff).rom().region("user1", 0);
}
+void kinst_state::kinst2_map(address_map &map)
+{
+ kinst_map(map);
+
+ // control mapping is shuffled around
+ map(0x10000080, 0x10000083).portr("VOLUME").w(FUNC(kinst_state::sound_control_w));
+ map(0x10000088, 0x1000008b).portr("DSW").nopw();
+ map(0x10000090, 0x10000093).portr("P2").w(FUNC(kinst_state::sound_reset_w));
+ map(0x10000098, 0x1000009b).portr("P1").w(FUNC(kinst_state::vram_control_w));
+ map(0x100000a0, 0x100000a3).portr("UNUSED").w(FUNC(kinst_state::sound_data_w));
+ map(0x100000b0, 0x100000b3).nopw();
+ map(0x100000b8, 0x100000bb).w(FUNC(kinst_state::coin_control_w));
+}
+
+
+void kinst2uk_state::kinst2uk_map(address_map &map)
+{
+ kinst_map(map);
+
+ map(0x10000130, 0x10000133).rw(FUNC(kinst2uk_state::cpld_r), FUNC(kinst2uk_state::cpld_w));
+}
+
/*************************************
@@ -513,7 +616,7 @@ static INPUT_PORTS_START( kinst )
PORT_SERVICE_NO_TOGGLE( 0x00001000, IP_ACTIVE_LOW )
PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_COIN3 )
PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_COIN4 )
- PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_CUSTOM ) /* door */
+ PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_CUSTOM ) // door
PORT_BIT( 0xffff0000, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("P2")
@@ -531,20 +634,20 @@ static INPUT_PORTS_START( kinst )
PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_TILT )
PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_SERVICE1 )
- PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_BILL1 ) /* bill */
- PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_CUSTOM ) /* coin door */
+ PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_BILL1 ) // bill
+ PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_CUSTOM ) // coin door
PORT_BIT( 0xffff0000, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("VOLUME")
PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_CUSTOM ) /* sound status */
+ PORT_BIT( 0x00000002, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(kinst_state, sound_status_r)
PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_VOLUME_UP )
PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_VOLUME_DOWN )
PORT_BIT( 0x0000fff0, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0xffff0000, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("UNUSED")
- PORT_BIT( 0x0000ffff, IP_ACTIVE_LOW, IPT_UNUSED ) /* verify */
+ PORT_BIT( 0x0000ffff, IP_ACTIVE_LOW, IPT_UNUSED ) // verify
PORT_BIT( 0xffff0000, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("DSW")
@@ -606,111 +709,12 @@ INPUT_PORTS_END
static INPUT_PORTS_START( kinst2 )
- PORT_START("P1")
- PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 High Attack - Quick")
- PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 High Attack - Medium")
- PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 High Attack - Fierce")
- PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("P1 Low Attack - Quick")
- PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("P1 Low Attack - Medium")
- PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("P1 Low Attack - Fierce")
- PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
- PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
- PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
- PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
- PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_START1 )
- PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_SERVICE_NO_TOGGLE( 0x00001000, IP_ACTIVE_LOW )
- PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_COIN3 )
- PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_COIN4 )
- PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_CUSTOM ) /* door */
- PORT_BIT( 0xffff0000, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("P2")
- PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 High Attack - Quick")
- PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 High Attack - Medium")
- PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 High Attack - Fierce")
- PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Low Attack - Quick")
- PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Low Attack - Medium")
- PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("P2 Low Attack - Fierce")
- PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
- PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
- PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
- PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
- PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_START2 )
- PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_COIN2 )
- PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_TILT )
- PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_SERVICE1 )
- PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_BILL1 ) /* bill */
- PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_CUSTOM ) /* coin door */
- PORT_BIT( 0xffff0000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_INCLUDE( kinst )
- PORT_START("VOLUME")
- PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_CUSTOM ) /* sound status */
- PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_VOLUME_UP )
- PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_VOLUME_DOWN )
- PORT_BIT( 0x0000fff0, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0xffff0000, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("UNUSED")
- PORT_BIT( 0x0000ffff, IP_ACTIVE_LOW, IPT_UNUSED ) /* verify */
- PORT_BIT( 0xffff0000, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("DSW")
- PORT_DIPNAME( 0x00000003, 0x00000003, "Blood Level" )
- PORT_DIPSETTING( 0x00000003, DEF_STR( High ))
- PORT_DIPSETTING( 0x00000002, DEF_STR( Medium ))
- PORT_DIPSETTING( 0x00000001, DEF_STR( Low ))
- PORT_DIPSETTING( 0x00000000, DEF_STR( None ))
- PORT_DIPNAME( 0x00000004, 0x00000004, DEF_STR( Demo_Sounds ))
- PORT_DIPSETTING( 0x00000000, DEF_STR( Off ))
- PORT_DIPSETTING( 0x00000004, DEF_STR( On ))
- PORT_DIPNAME( 0x00000008, 0x00000008, "Finishing Moves" )
- PORT_DIPSETTING( 0x00000000, DEF_STR( Off ))
- PORT_DIPSETTING( 0x00000008, DEF_STR( On ))
- PORT_DIPNAME( 0x00000010, 0x00000010, "Display Warning" )
- PORT_DIPSETTING( 0x00000000, DEF_STR( Off ))
- PORT_DIPSETTING( 0x00000010, DEF_STR( On ))
+ PORT_MODIFY("DSW")
PORT_DIPNAME( 0x00000020, 0x00000020, DEF_STR( Unused ))
PORT_DIPSETTING( 0x00000020, DEF_STR( Off ))
PORT_DIPSETTING( 0x00000000, DEF_STR( On ))
- PORT_DIPNAME( 0x00000040, 0x00000040, DEF_STR( Unused ))
- PORT_DIPSETTING( 0x00000040, DEF_STR( Off ))
- PORT_DIPSETTING( 0x00000000, DEF_STR( On ))
- PORT_DIPNAME( 0x00000080, 0x00000080, DEF_STR( Unused ))
- PORT_DIPSETTING( 0x00000080, DEF_STR( Off ))
- PORT_DIPSETTING( 0x00000000, DEF_STR( On ))
- PORT_DIPNAME( 0x00000100, 0x00000100, "Coinage Source" )
- PORT_DIPSETTING( 0x00000100, "Dipswitch" )
- PORT_DIPSETTING( 0x00000000, "Disk" )
- PORT_DIPNAME( 0x00003e00, 0x00003e00, DEF_STR( Coinage ))
- PORT_DIPSETTING( 0x00003e00, "USA-1" )
- PORT_DIPSETTING( 0x00003c00, "USA-2" )
- PORT_DIPSETTING( 0x00003a00, "USA-3" )
- PORT_DIPSETTING( 0x00003800, "USA-4" )
- PORT_DIPSETTING( 0x00003400, "USA-9" )
- PORT_DIPSETTING( 0x00003200, "USA-10" )
- PORT_DIPSETTING( 0x00003600, "USA-ECA" )
- PORT_DIPSETTING( 0x00003000, "USA-Free Play" )
- PORT_DIPSETTING( 0x00002e00, "German-1" )
- PORT_DIPSETTING( 0x00002c00, "German-2" )
- PORT_DIPSETTING( 0x00002a00, "German-3" )
- PORT_DIPSETTING( 0x00002800, "German-4" )
- PORT_DIPSETTING( 0x00002600, "German-ECA" )
- PORT_DIPSETTING( 0x00002000, "German-Free Play" )
- PORT_DIPSETTING( 0x00001e00, "French-1" )
- PORT_DIPSETTING( 0x00001c00, "French-2" )
- PORT_DIPSETTING( 0x00001a00, "French-3" )
- PORT_DIPSETTING( 0x00001800, "French-4" )
- PORT_DIPSETTING( 0x00001600, "French-ECA" )
- PORT_DIPSETTING( 0x00001000, "French-Free Play" )
- PORT_DIPNAME( 0x00004000, 0x00004000, "Coin Counters" )
- PORT_DIPSETTING( 0x00004000, "1" )
- PORT_DIPSETTING( 0x00000000, "2" )
- PORT_DIPNAME( 0x00008000, 0x00008000, "Test Switch" )
- PORT_DIPSETTING( 0x00008000, DEF_STR( Off ))
- PORT_DIPSETTING( 0x00000000, DEF_STR( On ))
- PORT_BIT( 0xffff0000, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
@@ -724,32 +728,54 @@ INPUT_PORTS_END
void kinst_state::kinst(machine_config &config)
{
- /* basic machine hardware */
- R4600LE(config, m_maincpu, MASTER_CLOCK*2);
+ // basic machine hardware
+ R4600LE(config, m_maincpu, 50_MHz_XTAL*2);
m_maincpu->set_icache_size(16384);
m_maincpu->set_dcache_size(16384);
- m_maincpu->set_addrmap(AS_PROGRAM, &kinst_state::main_map);
- m_maincpu->set_vblank_int("screen", FUNC(kinst_state::irq0_start));
+ m_maincpu->set_addrmap(AS_PROGRAM, &kinst_state::kinst_map);
ATA_INTERFACE(config, m_ata).options(ata_devices, "hdd", nullptr, true);
- m_ata->irq_handler().set_inputline("maincpu", 1);
+ m_ata->irq_handler().set_inputline(m_maincpu, 1);
- /* video hardware */
+ // video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+<<<<<<< HEAD
screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
screen.set_refresh_hz(60);
screen.set_vblank_time(subseconds::from_usec(2500)); /* not accurate */
screen.set_size(320, 240);
screen.set_visarea(0, 319, 0, 239);
+=======
+ screen.set_raw(6000000, 390, 0, 320, 261, 0, 240); // preliminary
+ screen.screen_vblank().set_inputline(m_maincpu, 0);
+>>>>>>> master
screen.set_screen_update(FUNC(kinst_state::screen_update));
PALETTE(config, m_palette, palette_device::BGR_555);
- /* sound hardware */
+ // sound hardware
DCS_AUDIO_2K(config, m_dcs, 0);
}
+void kinst_state::kinst2(machine_config &config)
+{
+ kinst(config);
+
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &kinst_state::kinst2_map);
+}
+
+
+void kinst2uk_state::kinst2uk(machine_config &config)
+{
+ kinst(config);
+
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &kinst2uk_state::kinst2uk_map);
+}
+
+
/*************************************
*
@@ -839,6 +865,8 @@ ROM_START( kinst2uk )
DISK_IMAGE( "kinst2", 0, SHA1(e7c9291b4648eae0012ea0cc230731ed4987d1d5) )
ROM_END
+
+
/*************************************
*
* Driver initialization
@@ -847,28 +875,17 @@ ROM_END
void kinst_state::init_kinst()
{
- static const uint8_t kinst_control_map[8] = { 0,1,2,3,4,5,6,7 };
-
- /* set up the control register mapping */
- m_control_map = kinst_control_map;
+ m_hdd_serial_offset = 27;
}
void kinst_state::init_kinst2()
{
- static const uint8_t kinst2_control_map[8] = { 2,4,1,0,3,5,6,7 };
-
- // read: $80 on ki2 = $90 on ki
- // read: $88 on ki2 = $a0 on ki
- // write: $80 on ki2 = $90 on ki
- // write: $90 on ki2 = $88 on ki
- // write: $98 on ki2 = $80 on ki
- // write: $a0 on ki2 = $98 on ki
-
- /* set up the control register mapping */
- m_control_map = kinst2_control_map;
+ m_hdd_serial_offset = 11;
}
+} // anonymous namespace
+
/*************************************
@@ -877,8 +894,9 @@ void kinst_state::init_kinst2()
*
*************************************/
- // versions selectable by changing bioses
+// versions selectable by changing bioses
-GAME( 1994, kinst, 0, kinst, kinst, kinst_state, init_kinst, ROT0, "Rare", "Killer Instinct", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, kinst2, 0, kinst, kinst2, kinst_state, init_kinst2, ROT0, "Rare", "Killer Instinct 2", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, kinst2uk, kinst2, kinst, kinst2, kinst_state, init_kinst2, ROT0, "Rare", "Killer Instinct 2 (Upgrade kit)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
+// YEAR NAME PARENT MACHINE INPUT CLASS INIT SCREEN COMPANY FULLNAME FLAGS
+GAME( 1994, kinst, 0, kinst, kinst, kinst_state, init_kinst, ROT0, "Rare (Midway license)", "Killer Instinct", MACHINE_SUPPORTS_SAVE )
+GAME( 1996, kinst2, 0, kinst2, kinst2, kinst_state, init_kinst2, ROT0, "Rare (Midway license)", "Killer Instinct 2", MACHINE_SUPPORTS_SAVE )
+GAME( 1996, kinst2uk, kinst2, kinst2uk, kinst2, kinst2uk_state, init_kinst2, ROT0, "Rare (Midway license)", "Killer Instinct 2 (upgrade kit)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/kncljoe.cpp b/src/mame/drivers/kncljoe.cpp
index 68e816230d0..d720d72e973 100644
--- a/src/mame/drivers/kncljoe.cpp
+++ b/src/mame/drivers/kncljoe.cpp
@@ -2,11 +2,10 @@
// copyright-holders:Ernesto Corvi
/***************************************************************************
-Knuckle Joe - (c) 1985 Seibu Kaihatsu ( Taito License )
+Knuckle Joe - (c) 1985 Seibu Kaihatsu (Taito license)
driver by Ernesto Corvi
-Notes:
This board seems to be an Irem design.
The sound hardware is modified the 6803-based one used by the classic Irem
games. There's only one AY 3-8910 chip and no MSM5205. There are also two
@@ -15,15 +14,15 @@ The video hardware is pretty much like Irem games too. The only
strange thing is that the screen is flipped vertically.
TODO:
-- sprite vs. sprite priority especially on ground level
+- sprite-sprite priorities are imperfect (simply reversing them won't fix it,
+ motorcycle level will get much worse)
+- accurate screen timing (raw params), attract mode doesn't 1:1 match PCB
-Updates:
-- proper sound hw emulation (TS 070308)
-- you can't play anymore after you die (clock speed too low, check XTAL)
-- scrolling in bike levels (scroll register overflow)
-- sprites disappearing at left screen edge (bad clipping)
-- artifacts in stage 3 and others(clear sprite mem at bank switch?)
-(081503AT)
+BTANB:
+- attract mode demo play stops playing and lets the timer run out
+- heads of baddies clip off when you defeat them on the lowest floor
+- player sprite 1-scanline glitch at the lower part of motorcycle level
+- player sprite may briefly turn into garbage after a boss fight
***************************************************************************/
@@ -31,7 +30,6 @@ Updates:
#include "includes/kncljoe.h"
#include "cpu/z80/z80.h"
-#include "cpu/m6800/m6801.h"
#include "sound/sn76496.h"
#include "speaker.h"
@@ -72,10 +70,10 @@ void kncljoe_state::m6803_port1_w(uint8_t data)
void kncljoe_state::m6803_port2_w(uint8_t data)
{
- /* write latch */
+ // write latch
if ((m_port2 & 0x01) && !(data & 0x01))
{
- /* control or data port? */
+ // control or data port?
if (m_port2 & 0x08)
m_ay8910->data_address_w(m_port2 >> 2, m_port1);
}
@@ -101,7 +99,7 @@ void kncljoe_state::sound_irq_ack_w(uint8_t data)
void kncljoe_state::unused_w(uint8_t data)
{
- //unused - no MSM on the pcb
+ // unused - no MSM on the pcb
}
void kncljoe_state::sound_map(address_map &map)
@@ -256,13 +254,13 @@ void kncljoe_state::kncljoe(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &kncljoe_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(kncljoe_state::irq0_line_hold));
- m6803_cpu_device &soundcpu(M6803(config, "soundcpu", XTAL(3'579'545))); /* verified on pcb */
- soundcpu.set_addrmap(AS_PROGRAM, &kncljoe_state::sound_map);
- soundcpu.in_p1_cb().set(FUNC(kncljoe_state::m6803_port1_r));
- soundcpu.out_p1_cb().set(FUNC(kncljoe_state::m6803_port1_w));
- soundcpu.in_p2_cb().set(FUNC(kncljoe_state::m6803_port2_r));
- soundcpu.out_p2_cb().set(FUNC(kncljoe_state::m6803_port2_w));
- soundcpu.set_periodic_int(FUNC(kncljoe_state::sound_nmi), attotime::from_hz((double)3970)); //measured 3.970 kHz
+ M6803(config, m_soundcpu, XTAL(3'579'545)); /* verified on pcb */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &kncljoe_state::sound_map);
+ m_soundcpu->in_p1_cb().set(FUNC(kncljoe_state::m6803_port1_r));
+ m_soundcpu->out_p1_cb().set(FUNC(kncljoe_state::m6803_port1_w));
+ m_soundcpu->in_p2_cb().set(FUNC(kncljoe_state::m6803_port2_r));
+ m_soundcpu->out_p2_cb().set(FUNC(kncljoe_state::m6803_port2_w));
+ m_soundcpu->set_periodic_int(FUNC(kncljoe_state::sound_nmi), attotime::from_hz(3970)); // measured 3.970 kHz
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
diff --git a/src/mame/drivers/konamigx.cpp b/src/mame/drivers/konamigx.cpp
index 997cd9d80d7..aa106ff144e 100644
--- a/src/mame/drivers/konamigx.cpp
+++ b/src/mame/drivers/konamigx.cpp
@@ -2181,39 +2181,6 @@ ROM_START( salmndr2a )
ROM_LOAD( "salmndr2a.nv", 0x0000, 0x080, CRC(3a98a8f9) SHA1(08c2d164620a4d8ad902d502acea8ad621931198) )
ROM_END
-/* Magical Twinbee */
-ROM_START( mtwinbee )
- /* main program */
- ROM_REGION( 0x800000, "maincpu", 0 )
- GX_BIOS
- ROM_LOAD32_WORD_SWAP( "424eaa02.31b", 0x200002, 512*1024, CRC(34659905) SHA1(011df093502644ab7ceb7fd1fbca41d09af89566) )
- ROM_LOAD32_WORD_SWAP( "424eaa04.27b", 0x200000, 512*1024, CRC(f42d3139) SHA1(e03006b4a87a70dfba9ec5e4857442424269986c) )
-
- /* sound program */
- ROM_REGION( 0x40000, "soundcpu", 0 )
- ROM_LOAD16_BYTE("424a06.9c", 0x000000, 128*1024, CRC(a4760e14) SHA1(78dbd309f3f7fa61e92c9554e594449a7d4eed5a) )
- ROM_LOAD16_BYTE("424a07.7c", 0x000001, 128*1024, CRC(fa90d7e2) SHA1(6b6dee29643309005834416bdfdb18d74f34cb1b) )
-
- /* tiles */
- ROM_REGION( 0x500000, "k056832", ROMREGION_ERASE00 )
- TILE_WORD_ROM_LOAD( "424a14.17h", 0x000000, 2*1024*1024, CRC(b1d9fce8) SHA1(143ed2f03ac10a0f18d878c0ee0509a5714e4664) )
- TILE_BYTE_ROM_LOAD( "424a12.13g", 0x000004, 512*1024, CRC(7f9cb8b1) SHA1(f5e18d70fcb572bb85f9b064995fc0ab0bb581e8) )
-
- /* sprites */
- ROM_REGION( 0x500000, "k055673", ROMREGION_ERASE00 )
- ROM_LOAD32_WORD( "424a11.25g", 0x000000, 2*1024*1024, CRC(29592688) SHA1(a4b44e9153988a510915af83116e3c18dd15642f) )
- ROM_LOAD32_WORD( "424a10.28g", 0x000002, 2*1024*1024, CRC(cf24e5e3) SHA1(095bf2ae4f47c6e4768515ae5e22c982fbc660a5) )
- ROM_LOAD( "424a09.30g", 0x400000, 1*1024*1024, CRC(daa07224) SHA1(198cafa3d0ead2aa2593be066c6f372e66c11c44) )
-
- /* sound data */
- ROM_REGION( 0x400000, "k054539", 0 )
- ROM_LOAD( "424a17.9g", 0x000000, 2*1024*1024, CRC(e9dd9692) SHA1(c289019c8d1dd71b3cec26479c39b649de804707) )
- ROM_LOAD( "424a18.7g", 0x200000, 2*1024*1024, CRC(0f0d9f3a) SHA1(57f6b113b80f06964b7e672ad517c1654c5569c5) )
-
- ROM_REGION16_BE( 0x80, "eeprom", 0 ) // default eeprom to prevent game booting with error
- ROM_LOAD( "mtwinbee.nv", 0x0000, 0x080, CRC(942b4323) SHA1(2f6799bf187510355df5e52c4d416f5c5e70fa05) )
-ROM_END
-
/* Twinbee Yahhoo! */
ROM_START( tbyahhoo )
/* main program */
@@ -2276,6 +2243,39 @@ ROM_START( daiskiss )
ROM_LOAD( "535a22.9g", 0x000000, 2*1024*1024, CRC(7ee59acb) SHA1(782bf15f205e9fe7bd069f6445eb8187837dee32) )
ROM_END
+/* Magical Twinbee */
+ROM_START( mtwinbee )
+ /* main program */
+ ROM_REGION( 0x800000, "maincpu", 0 )
+ GX_BIOS
+ ROM_LOAD32_WORD_SWAP( "424eaa02.31b", 0x200002, 512*1024, CRC(34659905) SHA1(011df093502644ab7ceb7fd1fbca41d09af89566) )
+ ROM_LOAD32_WORD_SWAP( "424eaa04.27b", 0x200000, 512*1024, CRC(f42d3139) SHA1(e03006b4a87a70dfba9ec5e4857442424269986c) )
+
+ /* sound program */
+ ROM_REGION( 0x40000, "soundcpu", 0 )
+ ROM_LOAD16_BYTE("424a06.9c", 0x000000, 128*1024, CRC(a4760e14) SHA1(78dbd309f3f7fa61e92c9554e594449a7d4eed5a) )
+ ROM_LOAD16_BYTE("424a07.7c", 0x000001, 128*1024, CRC(fa90d7e2) SHA1(6b6dee29643309005834416bdfdb18d74f34cb1b) )
+
+ /* tiles */
+ ROM_REGION( 0x500000, "k056832", ROMREGION_ERASE00 )
+ TILE_WORD_ROM_LOAD( "424a14.17h", 0x000000, 2*1024*1024, CRC(b1d9fce8) SHA1(143ed2f03ac10a0f18d878c0ee0509a5714e4664) )
+ TILE_BYTE_ROM_LOAD( "424a12.13g", 0x000004, 512*1024, CRC(7f9cb8b1) SHA1(f5e18d70fcb572bb85f9b064995fc0ab0bb581e8) )
+
+ /* sprites */
+ ROM_REGION( 0x500000, "k055673", ROMREGION_ERASE00 )
+ ROM_LOAD32_WORD( "424a11.25g", 0x000000, 2*1024*1024, CRC(29592688) SHA1(a4b44e9153988a510915af83116e3c18dd15642f) )
+ ROM_LOAD32_WORD( "424a10.28g", 0x000002, 2*1024*1024, CRC(cf24e5e3) SHA1(095bf2ae4f47c6e4768515ae5e22c982fbc660a5) )
+ ROM_LOAD( "424a09.30g", 0x400000, 1*1024*1024, CRC(daa07224) SHA1(198cafa3d0ead2aa2593be066c6f372e66c11c44) )
+
+ /* sound data */
+ ROM_REGION( 0x400000, "k054539", 0 )
+ ROM_LOAD( "424a17.9g", 0x000000, 2*1024*1024, CRC(e9dd9692) SHA1(c289019c8d1dd71b3cec26479c39b649de804707) )
+ ROM_LOAD( "424a18.7g", 0x200000, 2*1024*1024, CRC(0f0d9f3a) SHA1(57f6b113b80f06964b7e672ad517c1654c5569c5) )
+
+ ROM_REGION16_BE( 0x80, "eeprom", 0 ) // default eeprom to prevent game booting with error
+ ROM_LOAD( "mtwinbee.nv", 0x0000, 0x080, CRC(942b4323) SHA1(2f6799bf187510355df5e52c4d416f5c5e70fa05) )
+ROM_END
+
/* Sexy Parodius version JAA (Japan) */
ROM_START( sexyparo )
/* main program */
@@ -4042,8 +4042,8 @@ GAME( 1994, gokuparo, fantjour, gokuparo, gokuparo, konamigx_state, init_ko
GAME( 1994, crzcross, konamigx, gokuparo, puzldama, konamigx_state, init_posthack, ROT0, "Konami", "Crazy Cross (ver EAA)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1994, puzldama, crzcross, gokuparo, puzldama, konamigx_state, init_posthack, ROT0, "Konami", "Taisen Puzzle-dama (ver JAA)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1995, mtwinbee, konamigx, tbyahhoo, gokuparo, konamigx_state, init_posthack, ROT0, "Konami", "Magical Twin Bee (ver EAA)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1995, tbyahhoo, mtwinbee, tbyahhoo, gokuparo, konamigx_state, init_posthack, ROT0, "Konami", "Twin Bee Yahhoo! (ver JAA)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1995, tbyahhoo, konamigx, tbyahhoo, gokuparo, konamigx_state, init_posthack, ROT0, "Konami", "Twin Bee Yahhoo! (ver JAA)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1995, mtwinbee, tbyahhoo, tbyahhoo, gokuparo, konamigx_state, init_posthack, ROT0, "Konami", "Magical Twin Bee (ver EAA)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1995, tkmmpzdm, konamigx, konamigx_6bpp, tokkae, konamigx_state, init_konamigx, ROT0, "Konami", "Tokimeki Memorial Taisen Puzzle-dama (ver JAB)", MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/konendev.cpp b/src/mame/drivers/konendev.cpp
index 6736bdbf813..d6bf652d1f6 100644
--- a/src/mame/drivers/konendev.cpp
+++ b/src/mame/drivers/konendev.cpp
@@ -62,17 +62,22 @@
*/
#include "emu.h"
-#include "cpu/powerpc/ppc.h"
+#include "video/k057714.h"
+
#include "cpu/h8/h83006.h"
+#include "cpu/powerpc/ppc.h"
#include "machine/eepromser.h"
-#include "machine/nvram.h"
#include "machine/msm6242.h"
+#include "machine/nvram.h"
#include "sound/ymz280b.h"
-#include "video/k057714.h"
+
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
+
+namespace {
+
class konendev_state : public driver_device
{
public:
@@ -99,10 +104,6 @@ public:
private:
uint32_t mcu2_r(offs_t offset, uint32_t mem_mask = ~0);
uint32_t ifu2_r(offs_t offset, uint32_t mem_mask = ~0);
- uint32_t ctrl0_r();
- uint32_t ctrl1_r();
- uint32_t ctrl2_r();
- uint32_t ctrl3_r();
void eeprom_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
uint32_t sound_data_r();
void sound_data_w(uint32_t data);
@@ -177,26 +178,6 @@ uint32_t konendev_state::ifu2_r(offs_t offset, uint32_t mem_mask)
return r;
}
-uint32_t konendev_state::ctrl0_r() // doors, switches
-{
- return ioport("IN1")->read();
-}
-
-uint32_t konendev_state::ctrl1_r() // hard meter access, hopper
-{
- return ioport("IN2")->read();
-}
-
-uint32_t konendev_state::ctrl2_r() // main door optic
-{
- return ioport("IN3")->read();
-}
-
-uint32_t konendev_state::ctrl3_r() // buttons
-{
- return ioport("IN0")->read();
-}
-
void konendev_state::eeprom_w(offs_t offset, uint32_t data, uint32_t mem_mask)
{
if (ACCESSING_BITS_0_7)
@@ -224,11 +205,11 @@ void konendev_state::konendev_map(address_map &map)
map(0x780c0000, 0x780c0003).rw(FUNC(konendev_state::sound_data_r), FUNC(konendev_state::sound_data_w));
map(0x78100000, 0x78100003).w(FUNC(konendev_state::eeprom_w));
map(0x78800000, 0x78800003).r(FUNC(konendev_state::ifu2_r));
- map(0x78800004, 0x78800007).r(FUNC(konendev_state::ctrl0_r));
- map(0x78a00000, 0x78a00003).r(FUNC(konendev_state::ctrl1_r));
- map(0x78a00004, 0x78a00007).r(FUNC(konendev_state::ctrl2_r));
+ map(0x78800004, 0x78800007).portr("IN1"); // doors, switches
+ map(0x78a00000, 0x78a00003).portr("IN2"); // hard meter access, hopper
+ map(0x78a00004, 0x78a00007).portr("IN3"); // main door optic
map(0x78c00000, 0x78c003ff).ram().share("dpram");
- map(0x78e00000, 0x78e00003).r(FUNC(konendev_state::ctrl3_r));
+ map(0x78e00000, 0x78e00003).portr("IN0"); // buttons
map(0x79000000, 0x79000003).w(m_gcu, FUNC(k057714_device::fifo_w));
map(0x79800000, 0x798000ff).rw(m_gcu, FUNC(k057714_device::read), FUNC(k057714_device::write));
map(0x7a000000, 0x7a01ffff).ram().share("nvram0");
@@ -702,6 +683,9 @@ void konendev_state::init_enchlamp()
rom[0] = 0x5782b930; // new checksum for program rom
}
+} // anonymous namespace
+
+
// BIOS
GAME( 200?, konendev, 0, konendev, konendev, konendev_state, init_enchlamp, ROT0, "Konami", "Konami Endeavour BIOS", MACHINE_NOT_WORKING|MACHINE_IS_BIOS_ROOT )
diff --git a/src/mame/drivers/konmedal68k.cpp b/src/mame/drivers/konmedal68k.cpp
index 4800ff1d83a..210618ab1d6 100644
--- a/src/mame/drivers/konmedal68k.cpp
+++ b/src/mame/drivers/konmedal68k.cpp
@@ -35,6 +35,9 @@
#include "screen.h"
#include "speaker.h"
+
+namespace {
+
class konmedal68k_state : public driver_device
{
public:
@@ -564,7 +567,7 @@ ROM_END
// GS562 PCB with no K056766 color DAC and no IC 20D 8Kbyte SRAM (palette RAM?), possible have no video output or have it implemented in some unusual way.
// at 1st boot press Service1 to initialise NVRAM
-ROM_START( konslot )
+ROM_START( konslot ) // Possibly Cross Magic Mark 2 (1996)
ROM_REGION( 0x80000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "669-a05-2n.bin", 0x000000, 0x080000, CRC(3330848e) SHA1(24c2ac03fe5d099659081d1f9611c707c746c768) )
@@ -575,7 +578,7 @@ ROM_START( konslot )
ROM_LOAD( "669-a01-2d.bin", 0x000000, 0x080000, CRC(08438dad) SHA1(b4ef8fc37deca5b6537cc581fc99968c86e6ec2c) )
ROM_END
-ROM_START( konslot2 )
+ROM_START( konslot2 ) // Possibly Fruit Magic (1996)
ROM_REGION( 0x80000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "660-a05.2n", 0x000000, 0x080000, CRC(d7460250) SHA1(490588181b3b558e03752f4c6cbdadb807b990b3) )
@@ -587,6 +590,8 @@ ROM_START( konslot2 )
ROM_LOAD( "660-a02.1f", 0x080000, 0x080000, CRC(e3199b0d) SHA1(8805be14388c73c5a8e0b2eb98fb8efb5def1714) )
ROM_END
+} // Anonymous namespace
+
GAME( 1995, kzaurus, 0, kzaurus, kzaurus, konmedal68k_state, empty_init, ROT0, "Konami", "Pittanko Zaurus", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, dobouchn, 0, kzaurus, kzaurus, konmedal68k_state, empty_init, ROT0, "Konami", "Dobou-Chan (ver JAA)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/ksys573.cpp b/src/mame/drivers/ksys573.cpp
index 972a459ead9..68c48c9696f 100644
--- a/src/mame/drivers/ksys573.cpp
+++ b/src/mame/drivers/ksys573.cpp
@@ -525,7 +525,8 @@ public:
void mamboagga(machine_config &config);
void gunmania(machine_config &config);
void hypbbc2p(machine_config &config);
- void gtrfrk2m(machine_config &config);
+ void gtrfrk2m(machine_config& config);
+ void gtrfrk2ml(machine_config& config);
void gtrfrk5m(machine_config &config);
void ddrs2k(machine_config &config);
void stepchmp(machine_config& config);
@@ -2753,7 +2754,14 @@ void ksys573_state::gtrfrks(machine_config &config)
cassx(config);
}
-void ksys573_state::gtrfrk2m(machine_config &config)
+void ksys573_state::gtrfrk2m(machine_config& config)
+{
+ k573a(config);
+ cassyi(config);
+ pccard1_32mb(config); // HACK: The installation tries to check and erase 32mb but only flashes 16mb.
+}
+
+void ksys573_state::gtrfrk2ml(machine_config& config)
{
k573a(config);
cassyi(config);
@@ -4796,7 +4804,7 @@ ROM_START( gtrfrks )
ROM_LOAD( "gq886eac.u1", 0x000000, 0x000224, BAD_DUMP CRC(06bd6c4f) SHA1(61930e467ad135e2f31393ff5af981ed52f3bef9) )
DISK_REGION( "cdrom0" )
- DISK_IMAGE_READONLY( "886__c02", 0, BAD_DUMP SHA1(80293512c4b914ef98acb1bbc7e3a2ed944a0dad) )
+ DISK_IMAGE_READONLY( "886__d02", 0, BAD_DUMP SHA1(8d6681d6cacd054a047ad984184fa0dfa383ecb9) )
ROM_END
ROM_START( gtrfrksu )
@@ -4806,7 +4814,7 @@ ROM_START( gtrfrksu )
ROM_LOAD( "gq886uac.u1", 0x000000, 0x000224, BAD_DUMP CRC(143eaa55) SHA1(51a4fa3693f1cb1646a8986003f9b6cc1ae8b630) )
DISK_REGION( "cdrom0" )
- DISK_IMAGE_READONLY( "886__c02", 0, BAD_DUMP SHA1(80293512c4b914ef98acb1bbc7e3a2ed944a0dad) )
+ DISK_IMAGE_READONLY( "886__d02", 0, BAD_DUMP SHA1(8d6681d6cacd054a047ad984184fa0dfa383ecb9) )
ROM_END
ROM_START( gtrfrksj )
@@ -4816,7 +4824,7 @@ ROM_START( gtrfrksj )
ROM_LOAD( "gq886jac.u1", 0x000000, 0x000224, BAD_DUMP CRC(11ffd43d) SHA1(27f4f4d782604379254fb98c3c57e547aa4b321f) )
DISK_REGION( "cdrom0" )
- DISK_IMAGE_READONLY( "886__c02", 0, BAD_DUMP SHA1(80293512c4b914ef98acb1bbc7e3a2ed944a0dad) )
+ DISK_IMAGE_READONLY( "886__d02", 0, BAD_DUMP SHA1(8d6681d6cacd054a047ad984184fa0dfa383ecb9) )
ROM_END
ROM_START( gtrfrksa )
@@ -4826,10 +4834,141 @@ ROM_START( gtrfrksa )
ROM_LOAD( "gq886aac.u1", 0x000000, 0x000224, BAD_DUMP CRC(efa51ee9) SHA1(3374d936de69c287e0161bc526546441c2943555) )
DISK_REGION( "cdrom0" )
+ DISK_IMAGE_READONLY( "886__d02", 0, BAD_DUMP SHA1(8d6681d6cacd054a047ad984184fa0dfa383ecb9) )
+ROM_END
+
+ROM_START( gtrfrksc )
+ SYS573_BIOS_A
+
+ ROM_REGION( 0x0000224, "cassette:game:eeprom", 0 )
+ ROM_LOAD( "gq886eac.u1", 0x000000, 0x000224, BAD_DUMP CRC(06bd6c4f) SHA1(61930e467ad135e2f31393ff5af981ed52f3bef9) )
+
+ DISK_REGION( "cdrom0" )
DISK_IMAGE_READONLY( "886__c02", 0, BAD_DUMP SHA1(80293512c4b914ef98acb1bbc7e3a2ed944a0dad) )
ROM_END
-ROM_START( gtrfrk2m )
+ROM_START( gtrfrksuc )
+ SYS573_BIOS_A
+
+ ROM_REGION( 0x0000224, "cassette:game:eeprom", 0 )
+ ROM_LOAD( "gq886uac.u1", 0x000000, 0x000224, BAD_DUMP CRC(143eaa55) SHA1(51a4fa3693f1cb1646a8986003f9b6cc1ae8b630) )
+
+ DISK_REGION( "cdrom0" )
+ DISK_IMAGE_READONLY( "886__c02", 0, BAD_DUMP SHA1(80293512c4b914ef98acb1bbc7e3a2ed944a0dad) )
+ROM_END
+
+ROM_START( gtrfrksjc )
+ SYS573_BIOS_A
+
+ ROM_REGION( 0x0000224, "cassette:game:eeprom", 0 )
+ ROM_LOAD( "gq886jac.u1", 0x000000, 0x000224, BAD_DUMP CRC(11ffd43d) SHA1(27f4f4d782604379254fb98c3c57e547aa4b321f) )
+
+ DISK_REGION( "cdrom0" )
+ DISK_IMAGE_READONLY( "886__c02", 0, BAD_DUMP SHA1(80293512c4b914ef98acb1bbc7e3a2ed944a0dad) )
+ROM_END
+
+ROM_START( gtrfrksac )
+ SYS573_BIOS_A
+
+ ROM_REGION( 0x0000224, "cassette:game:eeprom", 0 )
+ ROM_LOAD( "gq886aac.u1", 0x000000, 0x000224, BAD_DUMP CRC(efa51ee9) SHA1(3374d936de69c287e0161bc526546441c2943555) )
+
+ DISK_REGION( "cdrom0" )
+ DISK_IMAGE_READONLY( "886__c02", 0, BAD_DUMP SHA1(80293512c4b914ef98acb1bbc7e3a2ed944a0dad) )
+ROM_END
+
+ROM_START(gtrfrk2m)
+ SYS573_BIOS_A
+
+ ROM_REGION( 0x0000084, "cassette:game:eeprom", 0 )
+ ROM_LOAD( "gq883jad.u1", 0x000000, 0x000084, BAD_DUMP CRC(687868c4) SHA1(1230e74e4cf17953febe501df56d8bbec1de9356) )
+
+ ROM_REGION( 0x000008, "cassette:game:id", 0 )
+ ROM_LOAD( "gq883jad.u6", 0x000000, 0x000008, BAD_DUMP CRC(ce84419e) SHA1(839e8ee080ecfc79021a06417d930e8b32dfc6a1) )
+
+ DISK_REGION( "cdrom0" )
+ DISK_IMAGE_READONLY( "929jbb02", 0, BAD_DUMP SHA1(4f6bb0150ad6ed574dd7583ccd60604028663b2a) )
+ROM_END
+
+ROM_START( gtrfrk2ma )
+ SYS573_BIOS_A
+
+ ROM_REGION( 0x0000084, "cassette:game:eeprom", 0 )
+ ROM_LOAD( "gq883eaa.u1", 0x000000, 0x000084, BAD_DUMP CRC(4440ab9f) SHA1(74742e850d17daf09941482d93bf0ac1912dbb7f) )
+
+ ROM_REGION( 0x000008, "cassette:game:id", 0 )
+ ROM_LOAD( "gq883jad.u6", 0x000000, 0x000008, BAD_DUMP CRC(ce84419e) SHA1(839e8ee080ecfc79021a06417d930e8b32dfc6a1) )
+
+ DISK_REGION( "cdrom0" )
+ DISK_IMAGE_READONLY( "883__a01", 0, BAD_DUMP SHA1(913c55a41d313e6197e0a176a2fba1461cda17f2) )
+ROM_END
+
+ROM_START( gtrfrk2mua )
+ SYS573_BIOS_A
+
+ ROM_REGION( 0x0000084, "cassette:game:eeprom", 0 )
+ ROM_LOAD( "gq883uaa.u1", 0x000000, 0x000084, BAD_DUMP CRC(3f9697a6) SHA1(a05c0e4bb934cc24fe851475a250b70551aac5dd) )
+
+ ROM_REGION( 0x000008, "cassette:game:id", 0 )
+ ROM_LOAD( "gq883jad.u6", 0x000000, 0x000008, BAD_DUMP CRC(ce84419e) SHA1(839e8ee080ecfc79021a06417d930e8b32dfc6a1) )
+
+ DISK_REGION( "cdrom0" )
+ DISK_IMAGE_READONLY( "883__a01", 0, BAD_DUMP SHA1(913c55a41d313e6197e0a176a2fba1461cda17f2) )
+ROM_END
+
+ROM_START( gtrfrk2mja )
+ SYS573_BIOS_A
+
+ ROM_REGION( 0x0000084, "cassette:game:eeprom", 0 )
+ ROM_LOAD( "gq883jaa.u1", 0x000000, 0x000084, BAD_DUMP CRC(687868c4) SHA1(1230e74e4cf17953febe501df56d8bbec1de9356) )
+
+ ROM_REGION( 0x000008, "cassette:game:id", 0 )
+ ROM_LOAD( "gq883jad.u6", 0x000000, 0x000008, BAD_DUMP CRC(ce84419e) SHA1(839e8ee080ecfc79021a06417d930e8b32dfc6a1) )
+
+ DISK_REGION( "cdrom0" )
+ DISK_IMAGE_READONLY( "883__a01", 0, BAD_DUMP SHA1(913c55a41d313e6197e0a176a2fba1461cda17f2) )
+ROM_END
+
+ROM_START( gtrfrk2mka )
+ SYS573_BIOS_A
+
+ ROM_REGION( 0x0000084, "cassette:game:eeprom", 0 )
+ ROM_LOAD( "gq883kaa.u1", 0x000000, 0x000084, BAD_DUMP CRC(67e71110) SHA1(29da052c30109ebb9695721da83cd9019fae3a6d) )
+
+ ROM_REGION( 0x000008, "cassette:game:id", 0 )
+ ROM_LOAD( "gq883jad.u6", 0x000000, 0x000008, BAD_DUMP CRC(ce84419e) SHA1(839e8ee080ecfc79021a06417d930e8b32dfc6a1) )
+
+ DISK_REGION( "cdrom0" )
+ DISK_IMAGE_READONLY( "883__a01", 0, BAD_DUMP SHA1(913c55a41d313e6197e0a176a2fba1461cda17f2) )
+ROM_END
+
+ROM_START( gtrfrk2maa )
+ SYS573_BIOS_A
+
+ ROM_REGION( 0x0000084, "cassette:game:eeprom", 0 )
+ ROM_LOAD( "gq883aaa.u1", 0x000000, 0x000084, BAD_DUMP CRC(2c696501) SHA1(2f0930f77ae68641ecf02ea3b129e1716467cddb) )
+
+ ROM_REGION( 0x000008, "cassette:game:id", 0 )
+ ROM_LOAD( "gq883jad.u6", 0x000000, 0x000008, BAD_DUMP CRC(ce84419e) SHA1(839e8ee080ecfc79021a06417d930e8b32dfc6a1) )
+
+ DISK_REGION( "cdrom0" )
+ DISK_IMAGE_READONLY( "883__a01", 0, BAD_DUMP SHA1(913c55a41d313e6197e0a176a2fba1461cda17f2) )
+ROM_END
+
+ROM_START( gtrfrk2ml1 )
+ SYS573_BIOS_A
+
+ ROM_REGION( 0x0000084, "cassette:game:eeprom", 0 )
+ ROM_LOAD( "gq883jad.u1", 0x000000, 0x000084, BAD_DUMP CRC(687868c4) SHA1(1230e74e4cf17953febe501df56d8bbec1de9356) )
+
+ ROM_REGION( 0x000008, "cassette:game:id", 0 )
+ ROM_LOAD( "gq883jad.u6", 0x000000, 0x000008, BAD_DUMP CRC(ce84419e) SHA1(839e8ee080ecfc79021a06417d930e8b32dfc6a1) )
+
+ DISK_REGION( "cdrom0" )
+ DISK_IMAGE_READONLY( "929jaa02", 0, BAD_DUMP SHA1(7667f6d8eee055a12ed032ab2087db10f1d21bd4) )
+ROM_END
+
+ROM_START( gtrfrk2ml2 )
SYS573_BIOS_A
ROM_REGION( 0x0000084, "cassette:game:eeprom", 0 )
@@ -5837,10 +5976,14 @@ GAME( 1998, hyperbbc, sys573, hyperbbc, hyperbbc, ksys573_state, init_hype
GAME( 1998, hyperbbca, hyperbbc, hyperbbc, hyperbbc, ksys573_state, init_hyperbbc, ROT0, "Konami", "Hyper Bishi Bashi Champ (GQ876 VER. AAA)", MACHINE_IMPERFECT_SOUND )
GAME( 1998, hyperbbck, hyperbbc, hyperbbc, hyperbbc, ksys573_state, init_hyperbbc, ROT0, "Konami", "Hyper Bishi Bashi Champ (GE876 VER. KAA)", MACHINE_IMPERFECT_SOUND )
GAME( 1999, gchgchmp, sys573, gchgchmp, gchgchmp, ksys573_state, empty_init, ROT0, "Konami", "Gachaga Champ (GE877 VER. JAB)", MACHINE_IMPERFECT_SOUND )
-GAME( 1999, gtrfrks, sys573, gtrfrks, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks (GQ886 VER. EAC)", MACHINE_IMPERFECT_SOUND )
-GAME( 1999, gtrfrksu, gtrfrks, gtrfrks, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks (GQ886 VER. UAC)", MACHINE_IMPERFECT_SOUND )
-GAME( 1999, gtrfrksj, gtrfrks, gtrfrks, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks (GQ886 VER. JAC)", MACHINE_IMPERFECT_SOUND )
-GAME( 1999, gtrfrksa, gtrfrks, gtrfrks, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks (GQ886 VER. AAC)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrks, sys573, gtrfrks, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks Ver 1.01 (GQ886 VER. EAD)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrksu, gtrfrks, gtrfrks, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks Ver 1.01 (GQ886 VER. UAD)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrksj, gtrfrks, gtrfrks, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks Ver 1.01 (GQ886 VER. JAD)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrksa, gtrfrks, gtrfrks, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks Ver 1.01 (GQ886 VER. AAD)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrksc, gtrfrks, gtrfrks, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks (GQ886 VER. EAC)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrksuc, gtrfrks, gtrfrks, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks (GQ886 VER. UAC)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrksjc, gtrfrks, gtrfrks, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks (GQ886 VER. JAC)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrksac, gtrfrks, gtrfrks, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks (GQ886 VER. AAC)", MACHINE_IMPERFECT_SOUND )
GAME( 1999, fbaitmc, sys573, fbaitbc, fbaitmc, ksys573_state, empty_init, ROT0, "Konami", "Fisherman's Bait - Marlin Challenge (GX889 VER. EA)", MACHINE_IMPERFECT_SOUND )
GAME( 1999, fbaitmcu, fbaitmc, fbaitbc, fbaitmc, ksys573_state, empty_init, ROT0, "Konami", "Fisherman's Bait - Marlin Challenge (GX889 VER. UA)", MACHINE_IMPERFECT_SOUND )
GAME( 1999, fbaitmcj, fbaitmc, fbaitbc, fbaitmc, ksys573_state, empty_init, ROT0, "Konami", "Fisherman's Bait - Marlin Challenge (GX889 VER. JA)", MACHINE_IMPERFECT_SOUND )
@@ -5857,7 +6000,14 @@ GAME( 1999, pcnfrkk, pcnfrk, drmn, drmn, ksys573_state, init_drmn
GAME( 1999, drmnu, pcnfrk, drmn, drmn, ksys573_state, init_drmn, ROT0, "Konami", "DrumMania (GQ881 VER. UAB)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
GAME( 1999, drmn, pcnfrk, drmn, drmn, ksys573_state, init_drmn, ROT0, "Konami", "DrumMania (GQ881 VER. JAD)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
GAME( 1999, drmna, pcnfrk, drmn, drmn, ksys573_state, init_drmn, ROT0, "Konami", "DrumMania (GQ881 VER. JAD ALT CD)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
-GAME( 1999, gtrfrk2m, sys573, gtrfrk2m, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks 2nd Mix Ver 1.01 (GQ883 VER. JAD)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrk2m, sys573, gtrfrk2m, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks 2nd Mix Ver 1.01 (GQ883 VER. JAD)", MACHINE_IMPERFECT_SOUND ) // Link Kit 2 without the memcard readers boots into GQ883 JAD
+GAME( 1999, gtrfrk2ma, gtrfrk2m, gtrfrk2m, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks 2nd Mix (GQ883 VER. EAA)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrk2mua,gtrfrk2m, gtrfrk2m, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks 2nd Mix (GQ883 VER. UAA)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrk2mja,gtrfrk2m, gtrfrk2m, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks 2nd Mix (GQ883 VER. JAA)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrk2mka,gtrfrk2m, gtrfrk2m, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks 2nd Mix (GQ883 VER. KAA)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrk2maa,gtrfrk2m, gtrfrk2m, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks 2nd Mix (GQ883 VER. AAA)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrk2ml1,gtrfrk2m, gtrfrk2ml, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks 2nd Mix Link Kit 1 (GE929 VER. JAA)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gtrfrk2ml2,gtrfrk2m, gtrfrk2ml, gtrfrks, ksys573_state, empty_init, ROT0, "Konami", "Guitar Freaks 2nd Mix Link Kit 2 (GC929 VER. JBB)", MACHINE_IMPERFECT_SOUND )
GAME( 1999, dsftkd, sys573, dsftkd, ddr, ksys573_state, init_ddr, ROT0, "Konami", "Dancing Stage featuring TRUE KiSS DESTiNATiON (G*884 VER. JAA)", MACHINE_IMPERFECT_SOUND )
GAME( 1999, cr589fw, sys573, konami573, konami573, ksys573_state, empty_init, ROT0, "Konami", "CD-ROM Drive Updater 2.0 (700B04)", MACHINE_IMPERFECT_SOUND )
GAME( 1999, cr589fwa, sys573, konami573, konami573, ksys573_state, empty_init, ROT0, "Konami", "CD-ROM Drive Updater (700A04)", MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/drivers/ldplayer.cpp b/src/mame/drivers/ldplayer.cpp
index 2a01bbdab3d..d85fd696bd7 100644
--- a/src/mame/drivers/ldplayer.cpp
+++ b/src/mame/drivers/ldplayer.cpp
@@ -185,15 +185,15 @@ chd_file *ldplayer_state::get_disc()
{
// open the file itself via our search path
emu_file image_file(machine().options().media_path(), OPEN_FLAG_READ);
- osd_file::error filerr = image_file.open(dir->name);
- if (filerr == osd_file::error::NONE)
+ std::error_condition filerr = image_file.open(dir->name);
+ if (!filerr)
{
std::string fullpath(image_file.fullpath());
image_file.close();
// try to open the CHD
- if (machine().rom_load().set_disk_handle("laserdisc", fullpath.c_str()) == CHDERR_NONE)
+ if (!machine().rom_load().set_disk_handle("laserdisc", fullpath.c_str()))
{
m_filename.assign(dir->name);
found = true;
@@ -204,7 +204,8 @@ chd_file *ldplayer_state::get_disc()
}
// if we failed, pop a message and exit
- if (found == false) {
+ if (!found)
+ {
machine().ui().popup_time(10, "No valid image file found!\n");
return nullptr;
}
diff --git a/src/mame/drivers/lethalj.cpp b/src/mame/drivers/lethalj.cpp
index 88859eb290f..24f1ff7c53d 100644
--- a/src/mame/drivers/lethalj.cpp
+++ b/src/mame/drivers/lethalj.cpp
@@ -816,11 +816,11 @@ void lethalj_state::gameroom(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- OKIM6295(config, "oki1", SOUND_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.8);
+ OKIM6295(config, "oki1", SOUND_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.33);
- OKIM6295(config, "oki2", SOUND_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.8);
+ OKIM6295(config, "oki2", SOUND_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.33);
- OKIM6295(config, "oki3", SOUND_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.8);
+ OKIM6295(config, "oki3", SOUND_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.33);
}
diff --git a/src/mame/drivers/lynx.cpp b/src/mame/drivers/lynx.cpp
index 2324e3b8dbf..7497a944557 100644
--- a/src/mame/drivers/lynx.cpp
+++ b/src/mame/drivers/lynx.cpp
@@ -170,7 +170,7 @@ QUICKLOAD_LOAD_MEMBER(lynx_state::quickload_cb)
/* Check the image */
if (lynx_verify_cart((char*)header, LYNX_QUICKLOAD) != image_verify_result::PASS)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Not a valid Lynx file");
+ image.seterror(image_error::INVALIDIMAGE, "Not a valid Lynx file");
return image_init_result::FAIL;
}
@@ -182,7 +182,7 @@ QUICKLOAD_LOAD_MEMBER(lynx_state::quickload_cb)
if (image.fread( &data[0], length) != length)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid length in file header");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid length in file header");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/m68705prg.cpp b/src/mame/drivers/m68705prg.cpp
index 9dbd4ba61ca..30d67862ce0 100644
--- a/src/mame/drivers/m68705prg.cpp
+++ b/src/mame/drivers/m68705prg.cpp
@@ -67,7 +67,7 @@ protected:
auto const actual(m_eprom_image->common_get_size("rom"));
if (desired > actual)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported EPROM size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported EPROM size");
return image_init_result::FAIL;
}
else
@@ -84,7 +84,7 @@ protected:
auto const actual(m_mcu_image->common_get_size("rom"));
if (desired != actual)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Incorrect internal MCU EPROM size");
+ image.seterror(image_error::INVALIDIMAGE, "Incorrect internal MCU EPROM size");
return image_init_result::FAIL;
}
else
diff --git a/src/mame/drivers/m72.cpp b/src/mame/drivers/m72.cpp
index b91b6a55b6f..236e345ebc4 100644
--- a/src/mame/drivers/m72.cpp
+++ b/src/mame/drivers/m72.cpp
@@ -1828,9 +1828,9 @@ void m72_state::m72_audio_chips(machine_config &config)
ym2151_device &ymsnd(YM2151(config, "ymsnd", SOUND_CLOCK));
ymsnd.irq_handler().set("soundirq", FUNC(rst_neg_buffer_device::rst28_w));
- ymsnd.add_route(ALL_OUTPUTS, "speaker", 0.5);
+ ymsnd.add_route(ALL_OUTPUTS, "speaker", 0.33);
- DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.33); // unknown DAC
}
void m72_state::m72_base(machine_config &config)
diff --git a/src/mame/drivers/mac128.cpp b/src/mame/drivers/mac128.cpp
index 7d426009b7e..b018571bd03 100644
--- a/src/mame/drivers/mac128.cpp
+++ b/src/mame/drivers/mac128.cpp
@@ -1132,6 +1132,7 @@ void mac128_state::mac512ke(machine_config &config)
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(15.6672_MHz_XTAL, MAC_H_TOTAL, 0, MAC_H_VIS, MAC_V_TOTAL, 0, MAC_V_VIS);
+ m_screen->set_native_aspect();
m_screen->set_screen_update(FUNC(mac128_state::screen_update_mac));
m_screen->screen_vblank().set(FUNC(mac128_state::vblank_w));
m_screen->set_palette("palette");
diff --git a/src/mame/drivers/mbc200.cpp b/src/mame/drivers/mbc200.cpp
index 61040ab6014..6965da27108 100644
--- a/src/mame/drivers/mbc200.cpp
+++ b/src/mame/drivers/mbc200.cpp
@@ -44,6 +44,7 @@ TODO:
****************************************************************************/
#include "emu.h"
+
#include "cpu/z80/z80.h"
#include "imagedev/floppy.h"
#include "machine/i8251.h"
@@ -53,11 +54,15 @@ TODO:
#include "sound/beep.h"
#include "sound/spkrdev.h"
#include "video/mc6845.h"
+
#include "emupal.h"
#include "screen.h"
#include "softlist.h"
#include "speaker.h"
+
+namespace {
+
class mbc200_state : public driver_device
{
public:
@@ -79,6 +84,10 @@ public:
void mbc200(machine_config &config);
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
private:
u8 p2_porta_r();
void p1_portc_w(u8 data);
@@ -89,13 +98,11 @@ private:
MC6845_UPDATE_ROW(update_row);
required_device<palette_device> m_palette;
- void main_io(address_map &map);
void main_mem(address_map &map);
- void sub_io(address_map &map);
+ void main_io(address_map &map);
void sub_mem(address_map &map);
+ void sub_io(address_map &map);
- virtual void machine_start() override;
- virtual void machine_reset() override;
u8 m_comm_latch;
u8 m_term_data;
required_device<mc6845_device> m_crtc;
@@ -366,8 +373,10 @@ ROM_START( mbc200 )
ROM_LOAD( "m5l2764.bin", 0x0000, 0x2000, CRC(377300a2) SHA1(8563172f9e7f84330378a8d179f4138be5fda099))
ROM_END
+} // anonymous namespace
+
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1982, mbc200, 0, 0, mbc200, mbc200, mbc200_state, empty_init, "Sanyo", "MBC-200", MACHINE_SUPPORTS_SAVE )
-
diff --git a/src/mame/drivers/mcr68.cpp b/src/mame/drivers/mcr68.cpp
index 799d25df1c7..e5b053a3b16 100644
--- a/src/mame/drivers/mcr68.cpp
+++ b/src/mame/drivers/mcr68.cpp
@@ -965,8 +965,8 @@ void mcr68_state::spyhunt2(machine_config &config)
mcr68(config);
// Basic machine hardware
- MIDWAY_SOUNDS_GOOD(config, m_sounds_good).add_route(ALL_OUTPUTS, "speaker", 1.0);
- MIDWAY_TURBO_CHEAP_SQUEAK(config, m_turbo_cheap_squeak).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ MIDWAY_SOUNDS_GOOD(config, m_sounds_good).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ MIDWAY_TURBO_CHEAP_SQUEAK(config, m_turbo_cheap_squeak).add_route(ALL_OUTPUTS, "speaker", 0.5);
ADC0844(config, m_adc);
m_adc->ch1_callback().set_ioport("AN1");
diff --git a/src/mame/drivers/megadriv.cpp b/src/mame/drivers/megadriv.cpp
index 0689120593c..e41225e438a 100644
--- a/src/mame/drivers/megadriv.cpp
+++ b/src/mame/drivers/megadriv.cpp
@@ -993,13 +993,16 @@ ROM_START( segacd2 )
ROMX_LOAD( "segacd_model2_bios_2_00w_u.bin", 0x000000, 0x020000, CRC(9f6f6276) SHA1(5adb6c3af218c60868e6b723ec47e36bbdf5e6f0), ROM_BIOS(2) )
ROM_END
-/* All confirmed good dump by ElBarto */
+/* v2.00, v2.00w confirmed good dumps by ElBarto */
+/* v2.11x confirmed good dump by TwistedTom */
ROM_START( megacd2 )
ROM_REGION16_BE( 0x400000, "maincpu", ROMREGION_ERASE00 )
- ROM_SYSTEM_BIOS(0, "v200w", "v2.00W")
- ROMX_LOAD( "mpr-15512a.bin", 0x000000, 0x020000, CRC(53f1757c) SHA1(67bf3970ca5a05fd5ce3d6c446789c5d971b98a4), ROM_BIOS(0) | ROM_GROUPWORD | ROM_REVERSE )
- ROM_SYSTEM_BIOS(1, "v200", "v2.00")
- ROMX_LOAD( "mpr-15512.bin", 0x000000, 0x020000, CRC(cb76f114) SHA1(939f173cadc41e996a3c34498da1bf55e7e18ff8), ROM_BIOS(1) | ROM_GROUPWORD | ROM_REVERSE )
+ ROM_SYSTEM_BIOS(0, "v211x", "v2.11X") // MK-4102A-50 Sony pcb
+ ROMX_LOAD( "mpr-15811-t.bin", 0x000000, 0x020000, CRC(391a80d2) SHA1(aa4bb1803b06714fbc04d8a209161876796dd511), ROM_BIOS(0) | ROM_GROUPWORD | ROM_REVERSE )
+ ROM_SYSTEM_BIOS(1, "v200w", "v2.00W") // MK-4102-50 Funai pcb
+ ROMX_LOAD( "mpr-15512a.bin", 0x000000, 0x020000, CRC(53f1757c) SHA1(67bf3970ca5a05fd5ce3d6c446789c5d971b98a4), ROM_BIOS(1) | ROM_GROUPWORD | ROM_REVERSE )
+ ROM_SYSTEM_BIOS(2, "v200", "v2.00") // ?
+ ROMX_LOAD( "mpr-15512.bin", 0x000000, 0x020000, CRC(cb76f114) SHA1(939f173cadc41e996a3c34498da1bf55e7e18ff8), ROM_BIOS(2) | ROM_GROUPWORD | ROM_REVERSE )
ROM_END
/* Confirmed good dump by ElBarto */
diff --git a/src/mame/drivers/mephisto_modular.cpp b/src/mame/drivers/mephisto_modular.cpp
index f789c92b489..5fbdb7d45fd 100644
--- a/src/mame/drivers/mephisto_modular.cpp
+++ b/src/mame/drivers/mephisto_modular.cpp
@@ -421,7 +421,7 @@ void mmodular_state::alm16(machine_config &config)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
MEPHISTO_SENSORS_BOARD(config, m_board);
- subdevice<sensorboard_device>("board:board")->set_spawnpoints(12+2); // 2 jokers
+ subdevice<sensorboard_device>("board:board")->set_spawnpoints(12+2); // +2 jokers
subdevice<sensorboard_device>("board:board")->spawn_cb().set(FUNC(mmodular_state::spawn_cb));
subdevice<sensorboard_device>("board:board")->set_nvram_enable(true);
diff --git a/src/mame/drivers/merit.cpp b/src/mame/drivers/merit.cpp
index 8c0201e9c25..3eceac267e6 100644
--- a/src/mame/drivers/merit.cpp
+++ b/src/mame/drivers/merit.cpp
@@ -1765,6 +1765,21 @@ ROM_START( casino5a ) /* Standard version, the rom set with 3315-02 U5-1 is the
ROM_LOAD( "chr8_u40a.u40", 0x0000, 0x2000, CRC(b13a3fb1) SHA1(25760aa27c88b8be248a87df724bf8797d179e7a) )
ROM_END
+ROM_START( casino5b )
+ ROM_REGION( 0x10000, "maincpu", 0 ) /* Program roms on a CTR-202A daughter card */
+ ROM_LOAD( "3315-12_u5-0.u5", 0x0000, 0x2000, CRC(50116e80) SHA1(3563a685cba25bf6d2b47280f17488d6427b3bd8) ) /* Internal designation: PCFSP 331502SP */
+ ROM_LOAD( "3315-12_u6-0.u6", 0x2000, 0x4000, CRC(7050ca92) SHA1(8ea351cee84812b31d7a6c3de77a7f43e8b077f8) )
+ ROM_LOAD( "3315-12_u7-0.u7", 0x6000, 0x4000, CRC(ddd97b53) SHA1(57f86efa3d87e8eb226506f4a37481c5132a5a6a) )
+
+ ROM_REGION( 0x6000, "gfx1", 0 )
+ ROM_LOAD( "chr7_u39.u39", 0x0000, 0x2000, CRC(6662f607) SHA1(6b423f8de011d196700839af0be37effbf87383f) )
+ ROM_LOAD( "chr7_u38.u38", 0x2000, 0x2000, CRC(a014b44f) SHA1(906d426b1de75f26030c19dcd599b6570909f510) )
+ ROM_LOAD( "chr7_u37.u37", 0x4000, 0x2000, CRC(cb12e139) SHA1(06fe91281faae5d0c0ae4b3cd8ad103bd3995c38) )
+
+ ROM_REGION( 0x2000, "gfx2", 0 )
+ ROM_LOAD( "chr8_u40a.u40", 0x0000, 0x2000, CRC(b13a3fb1) SHA1(25760aa27c88b8be248a87df724bf8797d179e7a) )
+ROM_END
+
ROM_START( mroundup )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "kru1cd_u5.u5", 0x0000, 0x2000, CRC(7bd90672) SHA1(5f763e807370df991cc2c4abaeb8184c42149a0e) ) /* Internal designation: RUM1HRV0 */
@@ -2630,6 +2645,7 @@ GAME( 1982, mpchoicea, pitboss, pitboss, mpchoicea, merit_state, empty_init, R
GAME( 1989, casino5, 0, casino5, casino5, merit_state, empty_init, ROT0, "Merit", "Casino Five (3315-02, U5-2B)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, casino5a, casino5, casino5, casino5, merit_state, empty_init, ROT0, "Merit", "Casino Five (3315-02, U5-0)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, casino5b, casino5, casino5, casino5, merit_state, empty_init, ROT0, "Merit", "Casino Five (3315-12, U5-0)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, mroundup, 0, pitboss, mroundup, merit_state, empty_init, ROT0, "Merit", "The Round Up", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL )
diff --git a/src/mame/drivers/meritm.cpp b/src/mame/drivers/meritm.cpp
index c16573ec081..99a74eee1c2 100644
--- a/src/mame/drivers/meritm.cpp
+++ b/src/mame/drivers/meritm.cpp
@@ -1151,7 +1151,7 @@ void meritm_state::crt250(machine_config &config)
ay8930_device &aysnd(AY8930(config, "aysnd", SYSTEM_CLK/12));
aysnd.port_a_read_callback().set_ioport("DSW");
aysnd.port_b_write_callback().set(FUNC(meritm_state::ay8930_port_b_w));
- aysnd.add_route(ALL_OUTPUTS, "mono", 1.0);
+ aysnd.add_route(ALL_OUTPUTS, "mono", 0.85);
}
void meritm_state::crt250_questions(machine_config &config)
diff --git a/src/mame/drivers/mes.cpp b/src/mame/drivers/mes.cpp
index 3cf168cf348..3bde166b0c1 100644
--- a/src/mame/drivers/mes.cpp
+++ b/src/mame/drivers/mes.cpp
@@ -9,15 +9,19 @@ Schleicher MES
****************************************************************************/
#include "emu.h"
+
#include "cpu/z80/z80.h"
#include "machine/z80ctc.h"
#include "machine/z80pio.h"
#include "machine/z80sio.h"
#include "machine/keyboard.h"
+
#include "emupal.h"
#include "screen.h"
+namespace {
+
class mes_state : public driver_device
{
public:
@@ -30,9 +34,11 @@ public:
void mes(machine_config &config);
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
private:
- void machine_reset() override;
- void machine_start() override;
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void kbd_put(u8 data);
u8 port00_r();
@@ -99,7 +105,7 @@ void mes_state::machine_reset()
Also the screen dimensions are a guess. */
uint32_t mes_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- u16 sy=0,ma=0;
+ u16 sy = 0, ma = 0;
for (u8 y = 0; y < 25; y++)
{
@@ -112,7 +118,7 @@ uint32_t mes_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, c
u8 gfx = 0;
if (ra < 9)
{
- u8 chr = m_p_videoram[x];
+ const u8 chr = m_p_videoram[x];
gfx = m_p_chargen[(chr<<4) | ra ];
}
@@ -127,7 +133,7 @@ uint32_t mes_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, c
*p++ = BIT(gfx, 0);
}
}
- ma+=80;
+ ma += 80;
}
return 0;
}
@@ -177,6 +183,9 @@ ROM_START( mes )
ROM_LOAD( "c10_char.bin", 0x0000, 0x2000, BAD_DUMP CRC(cb530b6f) SHA1(95590bbb433db9c4317f535723b29516b9b9fcbf))
ROM_END
+} // anonymous namespace
+
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/microvsn.cpp b/src/mame/drivers/microvsn.cpp
index e0bec580858..f7fa783c2a7 100644
--- a/src/mame/drivers/microvsn.cpp
+++ b/src/mame/drivers/microvsn.cpp
@@ -188,7 +188,7 @@ DEVICE_IMAGE_LOAD_MEMBER(microvision_state::cart_load)
if (size != 0x400 && size != 0x800)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid ROM file size");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid ROM file size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/miniguay.cpp b/src/mame/drivers/miniguay.cpp
index 7750fde70ba..065d36d9f99 100644
--- a/src/mame/drivers/miniguay.cpp
+++ b/src/mame/drivers/miniguay.cpp
@@ -61,7 +61,7 @@
The dumped version (Mini Guay VD) uses plastic displays with light bulbs, but there's a different
one (undumped) called "Mini Guay VR" (VR stands for "Version Rodillos") or just "Mini Guay" with
- reels instead, with an additional PCB for reels control (8031 + 2764 EPROM).
+ reels instead, with an additional PCB for reels control (8031 + 2764 EPROM).
*/
#include "emu.h"
diff --git a/src/mame/drivers/missbamby.cpp b/src/mame/drivers/missbamby.cpp
index a9afe458f1c..23ab90a3c54 100644
--- a/src/mame/drivers/missbamby.cpp
+++ b/src/mame/drivers/missbamby.cpp
@@ -2,7 +2,7 @@
// copyright-holders:
/*
-Skeleton driver for Cirsa "Mini Super Fruits" and clones.
+Skeleton driver for Cirsa "Mini Super Fruits" slot machines and clones.
Known games on this hardware:
________________________________________________________________________
| Dumped | Game | Manufacturer | Notes |
@@ -15,66 +15,20 @@ Known games on this hardware:
| NO | St.-Tropez | Video Game | |
| NO | Cocktails | Video Game | |
| NO | Gold Mini II | Video Game | |
- +-------------------------------------------------+--------------------+
-*/
-/*
-Miss Bamby - Automatics Pasqual
- _____________________________________________________________
- | _______ |
- | |_PROM_| ____________ |
- | __________________ | EMPTY | |
- | | M5L8085AP | |_SOCKET____| |
- | |_________________| ____________ |
- | ______________ | ROM1 | |
- | XTAL |M5L8212P | |___________| |
- | __ 6.144 |____________| ____________ |
- | |R| | ROM0 | |
- __| |___________| |
-|__| ________ ________ ___________________ ____________ |
-|__| |ULN2003A |ULN2003A | M5L8155P | |_D5101LC__| |
-|__| |__________________| ____________ |
-|__| ________ _________ |_D5101LC__| |
-|__| _______ |74LS393| |74LS74B1 |
-|__| |7407N | ________ |
-|__| ________ ________ |GD4001B| |
-|__| |74LS14_| |74LS153| _________ |
-|__| ____ | BATT | |
-|__| _______ ___________________ |D | | 3.6V | |
-|__| |LM380N| | AY-3-8910 | |I | |_________| |
-|__| |__________________| |P | ______ |
-|__| 8 dips->|S__| LM311N |
- |____________________________________________________________|
+ +--------+-------------------+--------------------+--------------------+
+
+Unrelated games with similar hardware also on this driver:
+ _________________________________________________________
+ |Name |Company | Description |
+ +-------+--------+--------------------------------------|
+ |Trebol | Regama | Pinball |
+ |Basket | Igoa | Electromechanical basketball machine |
+ |Multy | Deta | Slot / bingo |
+ +-------+--------+--------------------------------------+
-Golden Winner - Reben
- _____________________________________________________________
- | _______ |
- | DM74S188N ____________ |
- | __________________ | EMPTY | |
- | | NEC D8085AC | |_SOCKET____| |
- | |_________________| ____________ |
- | ______________ | ROM-B | |
- | XTAL |INS/DP8212N | |___________| |
- | __ 6.000 |____________| ____________ |
- | |R| | ROM-A | |
- __| |___________| |
-|__| ________ ________ ___________________ ____________ |
-|__| |_L203B_| |_L203B_| | NEC D8155HC | |MCM51L01P45| |
-|__| |__________________| ____________ |
-|__| ________ _________ |SCL 5101E-1| |
-|__| _______ |74LS393N |DM7474N| |
-|__| |7407N | ________ |
-|__| ________ ________ |GD4001B| |
-|__| SN74LS14N DM74LS153N |
-|__| ____ |
-|__| _______ ___________________ |D | |
-|__| |LM380N| | AY-3-8910 | |I | |
-|__| |__________________| |P | ______ |
-|__| 8 dips->|S__| CA311E |
- |____________________________________________________________|
*/
#include "emu.h"
-#include "emupal.h"
#include "speaker.h"
#include "cpu/i8085/i8085.h"
#include "machine/i8155.h"
@@ -95,6 +49,7 @@ public:
void missbamby(machine_config &config);
void gldwinner(machine_config &config);
+ void igoabasket(machine_config &config);
private:
required_device<cpu_device> m_maincpu;
@@ -187,6 +142,15 @@ void missbamby_state::gldwinner(machine_config &config)
psg.add_route(ALL_OUTPUTS, "mono", 1.0); // guess
}
+void missbamby_state::igoabasket(machine_config &config)
+{
+ missbamby(config);
+
+ // Two 8155 on the Basket PCB
+ I8155(config, "i8155b", 6_MHz_XTAL/2); // NEC D8155HC, guessed divisor
+}
+
+
// Cirsa PCB 810601 A
ROM_START( minisupf )
ROM_REGION(0x4000, "maincpu", 0)
@@ -208,6 +172,33 @@ ROM_START( luckyplr )
ROM_LOAD( "lucky_player_18sa030n.bin", 0x00, 0x20, CRC(cf80f260) SHA1(b965017aa871454c54f6175fee486eea810a9c2e) )
ROM_END
+/* Miss Bamby - Automatics Pasqual
+ _____________________________________________________________
+ | _______ |
+ | |_PROM_| ____________ |
+ | __________________ | EMPTY | |
+ | | M5L8085AP | |_SOCKET____| |
+ | |_________________| ____________ |
+ | ______________ | ROM1 | |
+ | XTAL |M5L8212P | |___________| |
+ | __ 6.144 |____________| ____________ |
+ | |R| | ROM0 | |
+ __| |___________| |
+|__| ________ ________ ___________________ ____________ |
+|__| |ULN2003A |ULN2003A | M5L8155P | |_D5101LC__| |
+|__| |__________________| ____________ |
+|__| ________ _________ |_D5101LC__| |
+|__| _______ |74LS393| |74LS74B1 |
+|__| |7407N | ________ |
+|__| ________ ________ |GD4001B| |
+|__| |74LS14_| |74LS153| _________ |
+|__| ____ | BATT | |
+|__| _______ ___________________ |D | | 3.6V | |
+|__| |LM380N| | AY-3-8910 | |I | |_________| |
+|__| |__________________| |P | ______ |
+|__| 8 dips->|S__| LM311N |
+ |____________________________________________________________|
+*/
ROM_START( msbamby )
ROM_REGION(0x4000, "maincpu", 0)
ROM_LOAD( "1.bin", 0x0000, 0x2000, CRC(7b5efbd9) SHA1(abb4b4432021945aee474c4bdd83979f6460c671) )
@@ -228,6 +219,33 @@ ROM_START( goldfrts )
ROM_LOAD( "golden_fruits_18sa030n.bin", 0x00, 0x20, CRC(fa7822eb) SHA1(586705f64a5fb95e5dd1c7bfc929dccfebc3ec49) ) // Same as Mini Super Fruits
ROM_END
+/* Golden Winner - Reben. PCB without battery, 6 MHz xtal
+ _____________________________________________________________
+ | _______ |
+ | DM74S188N ____________ |
+ | __________________ | EMPTY | |
+ | | NEC D8085AC | |_SOCKET____| |
+ | |_________________| ____________ |
+ | ______________ | ROM-B | |
+ | XTAL |INS/DP8212N | |___________| |
+ | __ 6.000 |____________| ____________ |
+ | |R| | ROM-A | |
+ __| |___________| |
+|__| ________ ________ ___________________ ____________ |
+|__| |_L203B_| |_L203B_| | NEC D8155HC | |MCM51L01P45| |
+|__| |__________________| ____________ |
+|__| ________ _________ |SCL 5101E-1| |
+|__| _______ |74LS393N |DM7474N| |
+|__| |7407N | ________ |
+|__| ________ ________ |GD4001B| |
+|__| SN74LS14N DM74LS153N |
+|__| ____ |
+|__| _______ ___________________ |D | |
+|__| |LM380N| | AY-3-8910 | |I | |
+|__| |__________________| |P | ______ |
+|__| 8 dips->|S__| CA311E |
+ |____________________________________________________________|
+*/
ROM_START( gwinner )
ROM_REGION(0x4000, "maincpu", 0)
ROM_LOAD( "reben_sa_gw-a_chk_8811_crc_2677.bin", 0x0000, 0x1000, CRC(ffcb4ba0) SHA1(2bc0dfc2b35a3a6cc3addf69a4c8916cc54347e4) )
@@ -237,7 +255,25 @@ ROM_START( gwinner )
ROM_LOAD( "dm74s188n.bin", 0x00, 0x20, CRC(27ed5f29) SHA1(2d5f190fac6be15d3c5b344647333bbf47a04fc3) )
ROM_END
-ROM_START( unkslot )
+/* Multy - Deta. The CPU was missing on the dumped PCB (so the exact type is unknown).
+ _______________________________________________________________________
+ | _______ |
+ | ________ | BATT | ________ ___ ________ ________ |
+ |MCM51L01P45 |______| |N82S23N| |__| CD4001BE |_EMPTY_| |
+ | ____________ ____________ |
+ | ________ | EPROM || EPROM | ________ ________ ________ |
+ |MCM51L01P45 |___________||____________| 74LS74PC 74LS393N |_______| |
+ | ________________ ________________ ________________ |
+ | ________ | GI AY-3-8910 | | Intel P8155H | | CPU | |
+ | 74LS373PC |______________| |_______________| |________________| |
+ | ________ ________ (_) <- Switch |
+ | |8xDIPS | |_7417N_| |
+ | ________ ________ |
+ | ULN2003A ULN2003A |
+ | ____ ____ |
+ |_______________| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |______________|
+*/
+ROM_START( multy )
ROM_REGION(0x4000, "maincpu", 0)
ROM_LOAD( "tms2564jl.bin", 0x0000, 0x2000, CRC(43fa54fb) SHA1(2e0d0883deb20d68e46d3c5c5c98508c9b5d5411) )
ROM_LOAD( "d2764d.bin", 0x2000, 0x1000, CRC(b7c55fc2) SHA1(2dfcc35821971c27178522afe9db1d18e12b3a42) ) // 1xxxxxxxxxxx = 0xFF
@@ -246,22 +282,67 @@ ROM_START( unkslot )
ROM_LOAD( "n83s23n.bin", 0x00, 0x20, CRC(ea598b2c) SHA1(c0d6367ed2381a4a0f22780773ff4777569e88ab) )
ROM_END
-// PINBALL
-// CPU: 1 x I8085A
-// IO: 1 x I8155
-// Sound: 1 x AY8910
+/* Pinball from the Spanish company "Regama S.A."
+ CPU: 1 x I8085A
+ IO: 1 x I8155
+ Sound: 1 x AY8910
+*/
ROM_START( trebol )
ROM_REGION(0x4000, "maincpu", 0)
ROM_LOAD( "m69.bin", 0x0000, 0x2000, CRC(8fb8cd39) SHA1(4ed505d06b489ce83316fdaa39f7ce128011fb4b) )
ROM_END
+/* "Basket" electromechanical machine from the Spanish company IGOA S.A.
+ Similar hardware, with two 8155. PCB silkscreened as "CPU 687-1".
+ Two empty EPROM sockets on the dumped PCB.
+ ____________________________________________________
+ | _________ |
+ | | 8xDips | |__
+ | _____________ _________________ __|
+ | | EMPTY | | GI AY-3-8910A | __|
+ | |_____________| |_________________| __|
+ | _____________ _________________ __|
+ | | EMPTY | | NEC D8155HC | __|
+ | |_____________| |_________________| __|
+ | _____________ _______ _________ ________ __|
+ | | EPROM | |DM7417N SN74LS373N |ULN2003R| __|
+ | |_____________| _________________ ________ __|
+ | ____________ | M5L8085AP | |ULN2003A| __|
+ | | HM6116LP-3 | |_________________| |
+ | |____________| ________ |__
+ | ________ Xtal SN74LS14N __|
+ | 82S123AN 6.144 MHz _________________ __|
+ | ________ | NEC D8155HC | __|
+ | 74LS393N |_________________| __|
+ | ________ ________ __|
+ | PAL16R4ACN |TC4011BP| __|
+ | _____ __|
+ | __________ NE555N ________ __|
+ | | BATT 5V | |ULN2803A __|
+ | |_________| __|
+ | __ |
+ | (__) <- Button |
+ |____________________________________________________|
+*/
+ROM_START( basket )
+ ROM_REGION(0x8000, "maincpu", 0)
+ ROM_LOAD( "igoa_sa_ba2.81_chk_69d2_mod_basket.bin", 0x0000, 0x8000, CRC(3d52419d) SHA1(5f097391bcad72c8d0f029ef21ca38d903cef140) )
+
+ ROM_REGION(0x20, "prom", 0)
+ ROM_LOAD( "n82s123an.bin", 0x00, 0x20, CRC(1ad9b60b) SHA1(936b9f7a6d8f2dde71e86205f6c37634e4119cde) )
+
+ ROM_REGION(0x104, "plds", 0)
+ ROM_LOAD( "pal16r4acn.bin", 0x000, 0x104, NO_DUMP )
+ROM_END
+
} // Anonymous namespace
-GAME( 1981, minisupf, 0, missbamby, c_810601a, missbamby_state, empty_init, ROT0, "Cirsa", "Mini Super Fruits", MACHINE_IS_SKELETON_MECHANICAL )
-GAME( 1981, luckyplr, 0, missbamby, missbamby, missbamby_state, empty_init, ROT0, "Cirsa", "Lucky Player", MACHINE_IS_SKELETON_MECHANICAL )
-GAME( 198?, msbamby, 0, missbamby, missbamby, missbamby_state, empty_init, ROT0, "Automatics Pasqual", "Miss Bamby", MACHINE_IS_SKELETON_MECHANICAL )
-GAME( 198?, goldfrts, 0, missbamby, c_810601a, missbamby_state, empty_init, ROT0, "Video Game", "Golden Fruits", MACHINE_IS_SKELETON_MECHANICAL )
-GAME( 198?, unkslot, 0, missbamby, missbamby, missbamby_state, empty_init, ROT0, "<unknown>", "unknown MGA or Costa Net slot machine", MACHINE_IS_SKELETON_MECHANICAL )
-GAME( 1983, gwinner, 0, gldwinner, missbamby, missbamby_state, empty_init, ROT0, "Reben SA", "Golden Winner", MACHINE_IS_SKELETON_MECHANICAL )
-GAME( 1985, trebol, 0, missbamby, missbamby, missbamby_state, empty_init, ROT0, "Regama", "Trebol", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 1981, minisupf, 0, missbamby, c_810601a, missbamby_state, empty_init, ROT0, "Cirsa", "Mini Super Fruits", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 1981, luckyplr, 0, missbamby, missbamby, missbamby_state, empty_init, ROT0, "Cirsa", "Lucky Player", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 198?, msbamby, 0, missbamby, missbamby, missbamby_state, empty_init, ROT0, "Automatics Pasqual", "Miss Bamby", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 198?, goldfrts, 0, missbamby, c_810601a, missbamby_state, empty_init, ROT0, "Video Game", "Golden Fruits", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 1983, gwinner, 0, gldwinner, missbamby, missbamby_state, empty_init, ROT0, "Reben SA", "Golden Winner", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 1985, trebol, 0, missbamby, missbamby, missbamby_state, empty_init, ROT0, "Regama", "Trebol", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 1987?, basket, 0, igoabasket, missbamby, missbamby_state, empty_init, ROT0, "Igoa S.A.", "Basket", MACHINE_IS_SKELETON_MECHANICAL ) // v2.0 on ROM string, v2.81 on EPROM label
+GAME( 1987, multy, 0, missbamby, missbamby, missbamby_state, empty_init, ROT0, "Deta", "Multy", MACHINE_IS_SKELETON_MECHANICAL )
diff --git a/src/mame/drivers/missile.cpp b/src/mame/drivers/missile.cpp
index 1e8e62fc780..123fcbeeb77 100644
--- a/src/mame/drivers/missile.cpp
+++ b/src/mame/drivers/missile.cpp
@@ -400,10 +400,10 @@ protected:
virtual void machine_reset() override;
private:
- void missile_w(address_space &space, offs_t offset, uint8_t data);
- uint8_t missile_r(address_space &space, offs_t offset);
- void bootleg_w(address_space &space, offs_t offset, uint8_t data);
- uint8_t bootleg_r(address_space &space, offs_t offset);
+ void missile_w(offs_t offset, uint8_t data);
+ uint8_t missile_r(offs_t offset);
+ void bootleg_w(offs_t offset, uint8_t data);
+ uint8_t bootleg_r(offs_t offset);
uint32_t screen_update_missile(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
inline int scanline_to_v(int scanline);
@@ -411,8 +411,8 @@ private:
inline void schedule_next_irq(int curv);
inline bool get_madsel();
inline offs_t get_bit3_addr(offs_t pixaddr);
- void write_vram(address_space &space, offs_t address, uint8_t data);
- uint8_t read_vram(address_space &space, offs_t address);
+ void write_vram(offs_t address, uint8_t data);
+ uint8_t read_vram(offs_t address);
TIMER_CALLBACK_MEMBER(clock_irq);
TIMER_CALLBACK_MEMBER(adjust_cpu_speed);
@@ -614,7 +614,7 @@ offs_t missile_state::get_bit3_addr(offs_t pixaddr)
}
-void missile_state::write_vram(address_space &space, offs_t address, uint8_t data)
+void missile_state::write_vram(offs_t address, uint8_t data)
{
static const uint8_t data_lookup[4] = { 0x00, 0x0f, 0xf0, 0xff };
offs_t vramaddr;
@@ -639,12 +639,12 @@ void missile_state::write_vram(address_space &space, offs_t address, uint8_t dat
m_videoram[vramaddr] = (m_videoram[vramaddr] & vrammask) | (vramdata & ~vrammask);
/* account for the extra clock cycle */
- space.device().execute().adjust_icount(-1);
+ m_maincpu->adjust_icount(-1);
}
}
-uint8_t missile_state::read_vram(address_space &space, offs_t address)
+uint8_t missile_state::read_vram(offs_t address)
{
offs_t vramaddr;
uint8_t vramdata;
@@ -673,7 +673,7 @@ uint8_t missile_state::read_vram(address_space &space, offs_t address)
result &= ~0x20;
/* account for the extra clock cycle */
- space.device().execute().adjust_icount(-1);
+ m_maincpu->adjust_icount(-1);
}
return result;
}
@@ -725,12 +725,12 @@ uint32_t missile_state::screen_update_missile(screen_device &screen, bitmap_ind1
*
*************************************/
-void missile_state::missile_w(address_space &space, offs_t offset, uint8_t data)
+void missile_state::missile_w(offs_t offset, uint8_t data)
{
/* if this is a MADSEL cycle, write to video RAM */
if (get_madsel())
{
- write_vram(space, offset, data);
+ write_vram(offset, data);
return;
}
@@ -784,13 +784,13 @@ void missile_state::missile_w(address_space &space, offs_t offset, uint8_t data)
}
-uint8_t missile_state::missile_r(address_space &space, offs_t offset)
+uint8_t missile_state::missile_r(offs_t offset)
{
uint8_t result = 0xff;
/* if this is a MADSEL cycle, read from video RAM */
if (get_madsel())
- return read_vram(space, offset);
+ return read_vram(offset);
/* otherwise, strip A15 and handle manually */
offset &= 0x7fff;
@@ -845,12 +845,12 @@ uint8_t missile_state::missile_r(address_space &space, offs_t offset)
}
-void missile_state::bootleg_w(address_space &space, offs_t offset, uint8_t data)
+void missile_state::bootleg_w(offs_t offset, uint8_t data)
{
/* if this is a MADSEL cycle, write to video RAM */
if (get_madsel())
{
- write_vram(space, offset, data);
+ write_vram(offset, data);
return;
}
@@ -897,13 +897,13 @@ void missile_state::bootleg_w(address_space &space, offs_t offset, uint8_t data)
}
-uint8_t missile_state::bootleg_r(address_space &space, offs_t offset)
+uint8_t missile_state::bootleg_r(offs_t offset)
{
uint8_t result = 0xff;
/* if this is a MADSEL cycle, read from video RAM */
if (get_madsel())
- return read_vram(space, offset);
+ return read_vram(offset);
/* otherwise, strip A15 and handle manually */
offset &= 0x7fff;
diff --git a/src/mame/drivers/mmd1.cpp b/src/mame/drivers/mmd1.cpp
index d09e61806e3..84b2a07eaff 100644
--- a/src/mame/drivers/mmd1.cpp
+++ b/src/mame/drivers/mmd1.cpp
@@ -73,15 +73,20 @@ ToDo:
****************************************************************************/
#include "emu.h"
+
#include "cpu/i8085/i8085.h"
#include "imagedev/cassette.h"
#include "machine/ay31015.h"
#include "machine/clock.h"
#include "machine/timer.h"
+
#include "speaker.h"
+
#include "mmd1.lh"
+namespace {
+
class mmd1_state : public driver_device
{
public:
@@ -90,6 +95,7 @@ public:
, m_maincpu(*this, "maincpu")
, m_cass(*this, "cassette")
, m_uart(*this, "uart")
+ , m_lines(*this, "LINE%u", 1U)
, m_digits(*this, "digit%u", 0U)
, m_p(*this, "p%u_%u", 0U, 0U)
{ }
@@ -98,9 +104,11 @@ public:
DECLARE_INPUT_CHANGED_MEMBER(reset_button);
-private:
+protected:
virtual void machine_start() override;
virtual void machine_reset() override;
+
+private:
void round_leds_w(offs_t offset, u8 data);
u8 keyboard_r();
u8 port13_r();
@@ -119,6 +127,7 @@ private:
required_device<i8080_cpu_device> m_maincpu;
required_device<cassette_image_device> m_cass;
required_device<ay31015_device> m_uart;
+ required_ioport_array<2> m_lines;
output_finder<9> m_digits;
output_finder<3, 8> m_p;
};
@@ -134,21 +143,20 @@ void mmd1_state::round_leds_w(offs_t offset, u8 data)
// keyboard has a keydown and a keyup code. Keyup = last keydown + bit 7 set
u8 mmd1_state::keyboard_r()
{
- u8 line1 = ioport("LINE1")->read();
- u8 line2 = ioport("LINE2")->read();
- u8 i, data = 0xff;
-
+ const u8 line1 = m_lines[0]->read();
+ const u8 line2 = m_lines[1]->read();
+ u8 data = 0xff;
- for (i = 0; i < 8; i++)
+ for (unsigned i = 0; i < 8; i++)
{
if (!BIT(line1, i))
data = i;
}
- for (i = 0; i < 8; i++)
+ for (unsigned i = 0; i < 8; i++)
{
if (!BIT(line2, i))
- data = i+8;
+ data = i + 8;
}
if (data < 0x10)
@@ -336,6 +344,9 @@ ROM_START( mmd1 )
ROM_LOAD( "prom1.ic16", 0x0100, 0x0100, BAD_DUMP CRC(d23a6ac3) SHA1(469d981b635058dd23e843a3efc555316f87ece4) ) // Typed in by hand from the manual
ROM_END
+} // anonymous namespace
+
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/myvision.cpp b/src/mame/drivers/myvision.cpp
index 801f2611239..4005ca42bcd 100644
--- a/src/mame/drivers/myvision.cpp
+++ b/src/mame/drivers/myvision.cpp
@@ -158,7 +158,7 @@ DEVICE_IMAGE_LOAD_MEMBER( myvision_state::cart_load )
if (size != 0x4000 && size != 0x6000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/n8080.cpp b/src/mame/drivers/n8080.cpp
index f7d22494178..b1c4af96929 100644
--- a/src/mame/drivers/n8080.cpp
+++ b/src/mame/drivers/n8080.cpp
@@ -4,19 +4,143 @@
Nintendo 8080 hardware
- - Space Fever
- - Space Fever High Splitter (aka SF-Hisplitter)
- - Space Launcher
- - Sheriff / Bandido / Western Gun 2
- - Helifire
+- Space Fever / Color Space Fever
+- SF-HiSplitter
+- Space Launcher
+- Sheriff / Bandido / Western Gun 2
+- HeliFire
+
+Space Fever was initially produced with B&W video hardware. It was later sold
+(maybe upgraded too) featuring color graphics, known as "Color Space Fever".
+The other Space Fever hardware games were only sold with color graphics, but
+they run fine on the older B&W video hardware. For example, doing a ROM swap
+on the older Space Fever.
+
+TODO:
+- spacefev sound pitch for laser fire and enemy explosion is wrong, see:
+ https://www.youtube.com/watch?v=mGMUPNqlyuw
+
+----------------------------------------------------------------------------
+
+Space Fever (3 sets, Space Fever?, High Splitter?, Space Launcher?)
+Nintendo, 1979
+
+Note: These are all simple ROM swaps on a standard b/w Space Fever PCB.
+
+
+PCB Layouts
+-----------
+
+Top Board (Sound PCB)
+
+TSF-SOU
+|----------------------------------------------------|
+| VR3 VR2 VR1 |
+| 8035 74123 |
+| 74275 |
+| 6MHz |
+| 74123 SN76477 |
+| SF_SOUND.IC2 74275 |
+| |
+| 7405 |
+| |
+|----------------------------------------------------|
+Notes:
+ All IC's shown.
+ There is no AMP on the PCB, sound amplification is done via a small external AMP board.
+ ROM IC2 is a 2708 EPROM.
+ VR1: master volume
+ VR2: shoot volume
+ VR3: music volume
+ 8035 clocks: pins 2 and 3 measure 6.000MHz
+ pin 9 measures 399.256kHz
+ pin 12 measures 200.0kHz
+ pin 13 measures 105.0kHz
+ pin 21 measures 399.4Khz
+ pin 22 measures 400.0kHz
+ pin 23 measures 399.3kHz
+ pin 24 measures 399.3kHz
+ pin 39 measures 61.5627Hz
+
+
+Middle board
+------------
+
+TSF-I/O PI-500803
+|----------------------------------------------------|
+| |
+| VR1 |
+| 20.160MHz |
+| |
+| |
+| |
+| |
+| |
+| |
+| |
+| |
+| |
+| |
+| |
+| DSW1(8) |
+| |
+| |
+| |
+| |
+| |
+|----------------------------------------------------|
+Notes:
+ VR1: adjusts brightness
+ Board contains mostly logic ICs (not shown)
+ Video output is b/w, the harness is wired to a JAMMA fingerboard but only blue is used.
+
+
+Bottom board
+------------
+
+TSF-CPU PI-500802
+|----------------------------------------------------|
+| |
+| |
+| |
+| SF_F1.F1 SF_G1.G1 SF_H1.H1 SF_I1.I1 |
+| |
+| 8080 |
+| |
+| SF_F2.F2 SF_G2.G2 SF_H2.H2 SF_I2.I2 |
+| |
+| |
+| |
+| |
+| |
+| |
+| |
+| |
+| |
+| |
+| |
+| 4116 4116 4116 4116 4116 4116 4116 4116 |
+|----------------------------------------------------|
+Notes:
+ All ROMs are 2708, 1K x8
+ 4116: 2K x8 DRAM
+ 8080 clock: 2.0160MHz (20.160 / 10)
+ Sync: no V reading, H is 15.57kHz
+
+ Set 1 is on the PCB and is complete.
+ Some ROMs in set1 match the current sfeverbw set.
+
+ The other two sets were supplied as just EPROMs.
+ Set2 (maybe High Splitter) is missing the ROM at location I2. Might be missing, or maybe
+ just the program is smaller and the extra ROM was not required.
***************************************************************************/
#include "emu.h"
#include "includes/n8080.h"
-#define MASTER_CLOCK XTAL(20'160'000)
+// Shifter circuit done with TTL
void n8080_state::n8080_shift_bits_w(uint8_t data)
{
@@ -28,12 +152,14 @@ void n8080_state::n8080_shift_data_w(uint8_t data)
m_shift_data = (m_shift_data >> 8) | (data << 8);
}
-
uint8_t n8080_state::n8080_shift_r()
{
return m_shift_data >> (8 - m_shift_bits);
}
+
+// Memory maps
+
void n8080_state::main_cpu_map(address_map &map)
{
map.global_mask(0x7fff);
@@ -41,7 +167,6 @@ void n8080_state::main_cpu_map(address_map &map)
map(0x4000, 0x7fff).ram().share("videoram");
}
-
void helifire_state::main_cpu_map(address_map &map)
{
map(0x0000, 0x3fff).rom();
@@ -66,7 +191,7 @@ void n8080_state::main_io_map(address_map &map)
}
-/* Input ports */
+// Input ports
static INPUT_PORTS_START( spacefev )
PORT_START("IN0")
@@ -83,11 +208,11 @@ static INPUT_PORTS_START( spacefev )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(2)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Game A") PORT_CODE(KEYCODE_Q)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Game B") PORT_CODE(KEYCODE_W)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Game C") PORT_CODE(KEYCODE_E)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Game A")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Game B")
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Game C")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) /* enables diagnostic ROM at $1c00 */
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) // enables diagnostic ROM at $1c00 ($2000 for highsplt/spacelnc)
PORT_START("IN2")
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ))
@@ -115,32 +240,19 @@ static INPUT_PORTS_START( spacefev )
PORT_DIPSETTING( 0x00, DEF_STR( On ))
PORT_START("IN3")
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_START("VIDEO")
+ PORT_CONFNAME( 0x01, 0x00, "Video Hardware" )
+ PORT_CONFSETTING( 0x01, "Monochrome" )
+ PORT_CONFSETTING( 0x00, "Color" )
INPUT_PORTS_END
static INPUT_PORTS_START( highsplt )
- PORT_START("IN0")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 )
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_INCLUDE( spacefev )
- PORT_START("IN1")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(2)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(2)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Game A") PORT_CODE(KEYCODE_Q)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Game B") PORT_CODE(KEYCODE_W)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Game C") PORT_CODE(KEYCODE_E)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) /* enables diagnostic ROM at $2000 */
-
- PORT_START("IN2")
+ PORT_MODIFY("IN2")
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ))
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x01, "4" )
@@ -163,34 +275,13 @@ static INPUT_PORTS_START( highsplt )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ))
PORT_DIPSETTING( 0x80, DEF_STR( Off ))
PORT_DIPSETTING( 0x00, DEF_STR( On ))
-
- PORT_START("IN3")
-
INPUT_PORTS_END
static INPUT_PORTS_START( spacelnc )
- PORT_START("IN0")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 )
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 )
-
- PORT_START("IN1")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(2)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(2)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Game A") PORT_CODE(KEYCODE_Q)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Game B") PORT_CODE(KEYCODE_W)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Game C") PORT_CODE(KEYCODE_E)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) /* enables diagnostic ROM at $2000 */
+ PORT_INCLUDE( highsplt )
- PORT_START("IN2")
+ PORT_MODIFY("IN2")
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ))
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x01, "4" )
@@ -213,9 +304,6 @@ static INPUT_PORTS_START( spacelnc )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ))
PORT_DIPSETTING( 0x80, DEF_STR( Off ))
PORT_DIPSETTING( 0x00, DEF_STR( On ))
-
- PORT_START("IN3")
-
INPUT_PORTS_END
@@ -245,9 +333,9 @@ static INPUT_PORTS_START( sheriff )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 )
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) /* EXP1 */
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) /* EXP2 */
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) /* EXP3 enables diagnostic ROM at $2400 */
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) // EXP1
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) // EXP2
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) // EXP3 enables diagnostic ROM at $2400
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_START("IN3")
@@ -279,15 +367,16 @@ static INPUT_PORTS_START( bandido )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN )
PORT_START("IN1")
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN2")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 )
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) /* EXP1 */
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) /* EXP2 */
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) /* EXP3 enables diagnostic ROM at $2400 */
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) // EXP1
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) // EXP2
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) // EXP3 enables diagnostic ROM at $2400
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_START("IN3")
@@ -311,7 +400,7 @@ static INPUT_PORTS_START( bandido )
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ))
PORT_DIPSETTING( 0x40, DEF_STR( Off ))
PORT_DIPSETTING( 0x00, DEF_STR( On ))
- PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown )) /* don't know if this is used */
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown )) // don't know if this is used
PORT_DIPSETTING( 0x80, DEF_STR( Off ))
PORT_DIPSETTING( 0x00, DEF_STR( On ))
INPUT_PORTS_END
@@ -349,11 +438,11 @@ static INPUT_PORTS_START( westgun2 )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Cabinet ))
PORT_DIPSETTING( 0x20, DEF_STR( Upright ))
PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ))
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) /* enables diagnostic ROM at $2400 */
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) // enables diagnostic ROM at $2400
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_START("IN3")
-
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
@@ -383,9 +472,9 @@ static INPUT_PORTS_START( helifire )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 )
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) /* EXP1 */
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) /* EXP2 */
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) /* EXP3 */
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) // EXP1
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) // EXP2
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) // EXP3
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_START("IN3")
@@ -431,13 +520,13 @@ static INPUT_PORTS_START( helifire )
INPUT_PORTS_END
-/* Interrupts */
+// Interrupts
TIMER_DEVICE_CALLBACK_MEMBER(n8080_state::rst1_tick)
{
int state = m_inte ? ASSERT_LINE : CLEAR_LINE;
- /* V7 = 1, V6 = 0 */
+ // V7 = 1, V6 = 0
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, state, 0xcf); // I8080
}
@@ -445,7 +534,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(n8080_state::rst2_tick)
{
int state = m_inte ? ASSERT_LINE : CLEAR_LINE;
- /* vblank */
+ // vblank
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, state, 0xd7); // I8080
}
@@ -456,13 +545,16 @@ WRITE_LINE_MEMBER(n8080_state::n8080_inte_callback)
void n8080_state::n8080_status_callback(uint8_t data)
{
- if (data & i8080_cpu_device::STATUS_INTA)
+ if (data & i8080a_cpu_device::STATUS_INTA)
{
- /* interrupt acknowledge */
+ // interrupt acknowledge
m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
}
}
+
+// Machine start/reset
+
void n8080_state::machine_start()
{
save_item(NAME(m_shift_data));
@@ -503,10 +595,12 @@ void helifire_state::machine_reset()
}
+// Machine configs
+
void spacefev_state::spacefev(machine_config &config)
{
/* basic machine hardware */
- I8080(config, m_maincpu, MASTER_CLOCK / 10);
+ I8080A(config, m_maincpu, XTAL(20'160'000) / 10);
m_maincpu->out_status_func().set(FUNC(spacefev_state::n8080_status_callback));
m_maincpu->out_inte_func().set(FUNC(spacefev_state::n8080_inte_callback));
m_maincpu->set_addrmap(AS_PROGRAM, &spacefev_state::main_cpu_map);
@@ -529,11 +623,10 @@ void spacefev_state::spacefev(machine_config &config)
spacefev_sound(config);
}
-
void sheriff_state::sheriff(machine_config &config)
{
/* basic machine hardware */
- I8080(config, m_maincpu, MASTER_CLOCK / 10);
+ I8080A(config, m_maincpu, XTAL(20'160'000) / 10);
m_maincpu->out_status_func().set(FUNC(sheriff_state::n8080_status_callback));
m_maincpu->out_inte_func().set(FUNC(sheriff_state::n8080_inte_callback));
m_maincpu->set_addrmap(AS_PROGRAM, &sheriff_state::main_cpu_map);
@@ -561,7 +654,7 @@ void sheriff_state::westgun2(machine_config &config)
sheriff(config);
/* basic machine hardware */
- I8080(config.replace(), m_maincpu, XTAL(19'968'000) / 10);
+ I8080A(config.replace(), m_maincpu, XTAL(19'968'000) / 10);
m_maincpu->out_status_func().set(FUNC(sheriff_state::n8080_status_callback));
m_maincpu->out_inte_func().set(FUNC(sheriff_state::n8080_inte_callback));
m_maincpu->set_addrmap(AS_PROGRAM, &sheriff_state::main_cpu_map);
@@ -571,7 +664,7 @@ void sheriff_state::westgun2(machine_config &config)
void helifire_state::helifire(machine_config &config)
{
/* basic machine hardware */
- I8080(config, m_maincpu, MASTER_CLOCK / 10);
+ I8080A(config, m_maincpu, XTAL(20'160'000) / 10);
m_maincpu->out_status_func().set(FUNC(helifire_state::n8080_status_callback));
m_maincpu->out_inte_func().set(FUNC(helifire_state::n8080_inte_callback));
m_maincpu->set_addrmap(AS_PROGRAM, &helifire_state::main_cpu_map);
@@ -596,119 +689,7 @@ void helifire_state::helifire(machine_config &config)
}
-/*
-Space Fever (3 sets, Space Fever?, High Splitter?, Space Launcher?)
-Nintendo, 1979
-
-Note: These are all simple ROM swaps on a standard b/w Space Fever PCB.
-
-
-PCB Layouts
------------
-
-Top Board (Sound PCB)
-
-TSF-SOU
-|----------------------------------------------------|
-| VR3 VR2 VR1 |
-| 8035 74123 |
-| 74275 |
-| 6MHz |
-| 74123 SN76477 |
-| SF_SOUND.IC2 74275 |
-| |
-| 7405 |
-| |
-|----------------------------------------------------|
-Notes:
- All IC's shown.
- There is no AMP on the PCB, sound amplification is done via a small external AMP board.
- ROM IC2 is a 2708 EPROM.
- VR1: master volume
- VR2: shoot volume
- VR3: music volume
- 8035 clocks: pins 2 and 3 measure 6.000MHz
- pin 9 measures 399.256kHz
- pin 12 measures 200.0kHz
- pin 13 measures 105.0kHz
- pin 21 measures 399.4Khz
- pin 22 measures 400.0kHz
- pin 23 measures 399.3kHz
- pin 24 measures 399.3kHz
- pin 39 measures 61.5627Hz
-
-
-Middle board
-------------
-
-TSF-I/O PI-500803
-|----------------------------------------------------|
-| |
-| VR1 |
-| 20.160MHz |
-| |
-| |
-| |
-| |
-| |
-| |
-| |
-| |
-| |
-| |
-| |
-| DSW1(8) |
-| |
-| |
-| |
-| |
-| |
-|----------------------------------------------------|
-Notes:
- VR1: adjusts brightness
- Board contains mostly logic ICs (not shown)
- Video output is b/w, the harness is wired to a JAMMA fingerboard but only blue is used.
-
-
-Bottom board
-------------
-
-TSF-CPU PI-500802
-|----------------------------------------------------|
-| |
-| |
-| |
-| SF_F1.F1 SF_G1.G1 SF_H1.H1 SF_I1.I1 |
-| |
-| 8080 |
-| |
-| SF_F2.F2 SF_G2.G2 SF_H2.H2 SF_I2.I2 |
-| |
-| |
-| |
-| |
-| |
-| |
-| |
-| |
-| |
-| |
-| |
-| 4116 4116 4116 4116 4116 4116 4116 4116 |
-|----------------------------------------------------|
-Notes:
- All ROMs are 2708, 1K x8
- 4116: 2K x8 DRAM
- 8080 clock: 2.0160MHz (20.160 / 10)
- Sync: no V reading, H is 15.57kHz
-
- Set 1 is on the PCB and is complete.
- Some ROMs in set1 match the current sfeverbw set.
-
- The other two sets were supplied as just EPROMs.
- Set2 (maybe High Splitter) is missing the ROM at location I2. Might be missing, or maybe
- just the program is smaller and the extra ROM was not required.
-*/
+// ROM definitions
ROM_START( spacefev )
ROM_REGION( 0x8000, "maincpu", 0 )
@@ -723,7 +704,7 @@ ROM_START( spacefev )
ROM_REGION( 0x0400, "audiocpu", 0 )
ROM_LOAD( "ss3.ic2", 0x0000, 0x0400, CRC(95c2c1ee) SHA1(42a3a382fc7d2782052372d71f6d0e8a153e74d0) )
- ROM_REGION( 0x0020, "proms", 0 )
+ ROM_REGION( 0x0020, "proms", 0 ) // for color video hw
ROM_LOAD( "f5-i-.bin", 0x0000, 0x0020, CRC(c5914ec1) SHA1(198875fcab36d09c8726bb21e2fdff9882f6721a) ) // "F5?C"
ROM_END
@@ -740,7 +721,7 @@ ROM_START( spacefevo )
ROM_REGION( 0x0400, "audiocpu", 0 )
ROM_LOAD( "ss3.ic2", 0x0000, 0x0400, CRC(95c2c1ee) SHA1(42a3a382fc7d2782052372d71f6d0e8a153e74d0) )
- ROM_REGION( 0x0020, "proms", 0 )
+ ROM_REGION( 0x0020, "proms", 0 ) // for color video hw
ROM_LOAD( "f5-i-.bin", 0x0000, 0x0020, CRC(c5914ec1) SHA1(198875fcab36d09c8726bb21e2fdff9882f6721a) ) // "F5?C"
ROM_END
@@ -757,7 +738,7 @@ ROM_START( spacefevo2 )
ROM_REGION( 0x0400, "audiocpu", 0 )
ROM_LOAD( "ss3.ic2", 0x0000, 0x0400, CRC(95c2c1ee) SHA1(42a3a382fc7d2782052372d71f6d0e8a153e74d0) )
- ROM_REGION( 0x0020, "proms", 0 )
+ ROM_REGION( 0x0020, "proms", 0 ) // for color video hw
ROM_LOAD( "f5-i-.bin", 0x0000, 0x0020, CRC(c5914ec1) SHA1(198875fcab36d09c8726bb21e2fdff9882f6721a) ) // "F5?C"
ROM_END
@@ -922,15 +903,18 @@ ROM_START( helifirea )
ROM_END
-GAME( 1979, spacefev, 0, spacefev, spacefev, spacefev_state, empty_init, ROT270, "Nintendo", "Space Fever (New Ver.)", MACHINE_SUPPORTS_SAVE )
-GAME( 1979, spacefevo, spacefev, spacefev, spacefev, spacefev_state, empty_init, ROT270, "Nintendo", "Space Fever (Old Ver.)", MACHINE_SUPPORTS_SAVE )
-GAME( 1979, spacefevo2, spacefev, spacefev, spacefev, spacefev_state, empty_init, ROT270, "Nintendo", "Space Fever (Older Ver.)", MACHINE_SUPPORTS_SAVE )
-GAME( 1979, highsplt, 0, spacefev, highsplt, spacefev_state, empty_init, ROT270, "Nintendo", "Space Fever High Splitter (set 1)", MACHINE_SUPPORTS_SAVE ) // known as "SF-Hisplitter" on its flyer
-GAME( 1979, highsplta, highsplt, spacefev, highsplt, spacefev_state, empty_init, ROT270, "Nintendo", "Space Fever High Splitter (set 2)", MACHINE_SUPPORTS_SAVE ) // known as "SF-Hisplitter" on its flyer
-GAME( 1979, highspltb, highsplt, spacefev, highsplt, spacefev_state, empty_init, ROT270, "Nintendo", "Space Fever High Splitter (alt Sound)", MACHINE_SUPPORTS_SAVE ) // known as "SF-Hisplitter" on its flyer
+// YEAR, NAME, PARENT, MACHINE, INPUT, CLASS, INIT, MONITOR, COMPANY, FULLNAME, FLAGS
+GAME( 1979, spacefev, 0, spacefev, spacefev, spacefev_state, empty_init, ROT270, "Nintendo", "Space Fever (new version)", MACHINE_SUPPORTS_SAVE )
+GAME( 1979, spacefevo, spacefev, spacefev, spacefev, spacefev_state, empty_init, ROT270, "Nintendo", "Space Fever (old version)", MACHINE_SUPPORTS_SAVE )
+GAME( 1979, spacefevo2, spacefev, spacefev, spacefev, spacefev_state, empty_init, ROT270, "Nintendo", "Space Fever (older version)", MACHINE_SUPPORTS_SAVE )
+GAME( 1979, highsplt, 0, spacefev, highsplt, spacefev_state, empty_init, ROT270, "Nintendo", "SF-HiSplitter (set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1979, highsplta, highsplt, spacefev, highsplt, spacefev_state, empty_init, ROT270, "Nintendo", "SF-HiSplitter (set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1979, highspltb, highsplt, spacefev, highsplt, spacefev_state, empty_init, ROT270, "Nintendo", "SF-HiSplitter (alt sound)", MACHINE_SUPPORTS_SAVE )
GAME( 1979, spacelnc, 0, spacefev, spacelnc, spacefev_state, empty_init, ROT270, "Nintendo", "Space Launcher", MACHINE_SUPPORTS_SAVE )
+
GAME( 1979, sheriff, 0, sheriff, sheriff, sheriff_state, empty_init, ROT270, "Nintendo", "Sheriff", MACHINE_SUPPORTS_SAVE )
GAME( 1980, bandido, sheriff, sheriff, bandido, sheriff_state, empty_init, ROT270, "Nintendo (Exidy license)", "Bandido", MACHINE_SUPPORTS_SAVE )
GAME( 1980, westgun2, sheriff, westgun2, westgun2, sheriff_state, empty_init, ROT270, "Nintendo (Taito Corporation license)", "Western Gun Part II", MACHINE_SUPPORTS_SAVE ) // official Taito PCBs, but title/copyright not shown
+
GAME( 1980, helifire, 0, helifire, helifire, helifire_state, empty_init, ROT270, "Nintendo", "HeliFire (set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
GAME( 1980, helifirea, helifire, helifire, helifire, helifire_state, empty_init, ROT270, "Nintendo", "HeliFire (set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/nakajies.cpp b/src/mame/drivers/nakajies.cpp
index 8551fc700c6..15fd8a41478 100644
--- a/src/mame/drivers/nakajies.cpp
+++ b/src/mame/drivers/nakajies.cpp
@@ -270,17 +270,20 @@ disabled). Perhaps power on/off related??
******************************************************************************/
-
#include "emu.h"
+
#include "cpu/nec/nec.h"
#include "machine/rp5c01.h"
#include "machine/timer.h"
#include "sound/spkrdev.h"
+
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
+namespace {
+
#define LOG 0
@@ -315,17 +318,9 @@ private:
uint8_t unk_a0_r();
void lcd_memory_start_w(uint8_t data);
uint8_t keyboard_r();
- void banking_w(offs_t offset, uint8_t data) ;
+ void banking_w(offs_t offset, uint8_t data);
void update_banks();
- void bank_w(uint8_t banknr, offs_t offset, uint8_t data);
- void bank0_w(offs_t offset, uint8_t data) ;
- void bank1_w(offs_t offset, uint8_t data) ;
- void bank2_w(offs_t offset, uint8_t data) ;
- void bank3_w(offs_t offset, uint8_t data) ;
- void bank4_w(offs_t offset, uint8_t data) ;
- void bank5_w(offs_t offset, uint8_t data) ;
- void bank6_w(offs_t offset, uint8_t data) ;
- void bank7_w(offs_t offset, uint8_t data) ;
+ template <unsigned N> void bank_w(offs_t offset, uint8_t data);
void nakajies_palette(palette_device &palette) const;
TIMER_DEVICE_CALLBACK_MEMBER(kb_timer);
@@ -376,44 +371,36 @@ void nakajies_state::update_banks()
m_bank_base[i] = &m_rom_base[(((m_bank[i] & 0x0f) ^ 0xf) << 17) % m_rom_size];
}
}
- membank( "bank0" )->set_base( m_bank_base[0] );
- membank( "bank1" )->set_base( m_bank_base[1] );
- membank( "bank2" )->set_base( m_bank_base[2] );
- membank( "bank3" )->set_base( m_bank_base[3] );
- membank( "bank4" )->set_base( m_bank_base[4] );
- membank( "bank5" )->set_base( m_bank_base[5] );
- membank( "bank6" )->set_base( m_bank_base[6] );
- membank( "bank7" )->set_base( m_bank_base[7] );
+ membank( "bank0" )->set_base(m_bank_base[0]);
+ membank( "bank1" )->set_base(m_bank_base[1]);
+ membank( "bank2" )->set_base(m_bank_base[2]);
+ membank( "bank3" )->set_base(m_bank_base[3]);
+ membank( "bank4" )->set_base(m_bank_base[4]);
+ membank( "bank5" )->set_base(m_bank_base[5]);
+ membank( "bank6" )->set_base(m_bank_base[6]);
+ membank( "bank7" )->set_base(m_bank_base[7]);
}
-void nakajies_state::bank_w( uint8_t banknr, offs_t offset, uint8_t data )
+template <unsigned N>
+void nakajies_state::bank_w(offs_t offset, uint8_t data)
{
- if ( m_bank[banknr] & 0x10 )
+ if (m_bank[N] & 0x10)
{
- m_bank_base[banknr][offset] = data;
+ m_bank_base[N][offset] = data;
}
}
-void nakajies_state::bank0_w(offs_t offset, uint8_t data) { bank_w( 0, offset, data ); }
-void nakajies_state::bank1_w(offs_t offset, uint8_t data) { bank_w( 1, offset, data ); }
-void nakajies_state::bank2_w(offs_t offset, uint8_t data) { bank_w( 2, offset, data ); }
-void nakajies_state::bank3_w(offs_t offset, uint8_t data) { bank_w( 3, offset, data ); }
-void nakajies_state::bank4_w(offs_t offset, uint8_t data) { bank_w( 4, offset, data ); }
-void nakajies_state::bank5_w(offs_t offset, uint8_t data) { bank_w( 5, offset, data ); }
-void nakajies_state::bank6_w(offs_t offset, uint8_t data) { bank_w( 6, offset, data ); }
-void nakajies_state::bank7_w(offs_t offset, uint8_t data) { bank_w( 7, offset, data ); }
-
void nakajies_state::nakajies_map(address_map &map)
{
- map(0x00000, 0x1ffff).bankr("bank0").w(FUNC(nakajies_state::bank0_w));
- map(0x20000, 0x3ffff).bankr("bank1").w(FUNC(nakajies_state::bank1_w));
- map(0x40000, 0x5ffff).bankr("bank2").w(FUNC(nakajies_state::bank2_w));
- map(0x60000, 0x7ffff).bankr("bank3").w(FUNC(nakajies_state::bank3_w));
- map(0x80000, 0x9ffff).bankr("bank4").w(FUNC(nakajies_state::bank4_w));
- map(0xa0000, 0xbffff).bankr("bank5").w(FUNC(nakajies_state::bank5_w));
- map(0xc0000, 0xdffff).bankr("bank6").w(FUNC(nakajies_state::bank6_w));
- map(0xe0000, 0xfffff).bankr("bank7").w(FUNC(nakajies_state::bank7_w));
+ map(0x00000, 0x1ffff).bankr("bank0").w(FUNC(nakajies_state::bank_w<0>));
+ map(0x20000, 0x3ffff).bankr("bank1").w(FUNC(nakajies_state::bank_w<1>));
+ map(0x40000, 0x5ffff).bankr("bank2").w(FUNC(nakajies_state::bank_w<2>));
+ map(0x60000, 0x7ffff).bankr("bank3").w(FUNC(nakajies_state::bank_w<3>));
+ map(0x80000, 0x9ffff).bankr("bank4").w(FUNC(nakajies_state::bank_w<4>));
+ map(0xa0000, 0xbffff).bankr("bank5").w(FUNC(nakajies_state::bank_w<5>));
+ map(0xc0000, 0xdffff).bankr("bank6").w(FUNC(nakajies_state::bank_w<6>));
+ map(0xe0000, 0xfffff).bankr("bank7").w(FUNC(nakajies_state::bank_w<7>));
}
@@ -843,6 +830,8 @@ ROM_START( es210_es )
ROM_LOAD("nakajima_es.ic303", 0x00000, 0x80000, CRC(214d73ce) SHA1(ce9967c5b2d122ebebe9401278d8ea374e8fb289))
ROM_END
+} // anonymous namespace
+
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 199?, wales210, 0, 0, nakajies210, nakajies, nakajies_state, empty_init, "Walther", "ES-210", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // German, 128KB RAM
diff --git a/src/mame/drivers/namcona1.cpp b/src/mame/drivers/namcona1.cpp
index ea42780c8ad..5ff08aa6c7a 100644
--- a/src/mame/drivers/namcona1.cpp
+++ b/src/mame/drivers/namcona1.cpp
@@ -14,11 +14,12 @@ NA-1 Games:
- Emeraldia (C358)
NA-2 Games:
-- Knuckle Heads (C3??)
+- Knuckle Heads (C360)
- Numan Athletics (C359)
- Emeraldia (C358)
- Nettou! Gekitou! Quiztou!! (C365)
- X-Day 2 (C394)
+- Zelos (no keycus)
To Do:
@@ -28,7 +29,7 @@ To Do:
area is uninitialized, the game software automatically writes these values there,
but then hangs.
*cgangpzl, cgangpzlj, exvania, exvaniaj, knckheadjp, quiztou
-- xday2: unemulated printer and RTC devices (check test mode game options), also battery always returns NG
+- xday2: unemulated printer and RTC devices (check test mode game options)
- X-Day 2:
Rom board M112
@@ -587,7 +588,7 @@ void namcona1_state::namcona1_main_map(address_map &map)
map(0xf00000, 0xf01fff).ram().w(FUNC(namcona1_state::paletteram_w)).share("paletteram");
map(0xf40000, 0xf7ffff).rw(FUNC(namcona1_state::gfxram_r), FUNC(namcona1_state::gfxram_w)).share("cgram");
map(0xff0000, 0xffbfff).ram().w(FUNC(namcona1_state::videoram_w)).share("videoram");
- map(0xffd000, 0xffdfff).ram(); /* unknown */
+ map(0xffc000, 0xffdfff).ram(); /* expects RAM here for some games or it won't boot*/
map(0xffe000, 0xffefff).ram().share("scroll"); /* scroll registers */
map(0xfff000, 0xffffff).ram().share("spriteram"); /* spriteram */
}
@@ -597,6 +598,25 @@ void namcona1_state::namcona1_c219_map(address_map &map)
map(0x000000, 0x07ffff).ram().share("workram");
}
+void namcona2_state::zelos_ctrl_w(u16 data)
+{
+ // bit 15 to 7 are set during I/O test when switching between the 9 'windows'. Output test? Maybe which 'window' screen to update?
+ // at least bit 4 to 1 are used, too
+
+ m_zelos_ctrl = data;
+
+ //if (data & 0x007f)
+ // logerror("zelos_ctrl_w: %04x\n", data);
+}
+
+void namcona2_state::zelos_main_map(address_map &map)
+{
+ namcona1_main_map(map);
+
+ map(0xd00000, 0xd00001).w(FUNC(namcona2_state::zelos_ctrl_w));
+ // map(0xd40000, 0xd40001).w(FUNC(namcona2_state::)); // bit 1 alternatively set and cleared in test mode
+}
+
u8 xday2_namcona2_state::printer_r()
{
// --xx ---- printer status related, if bit 5 held 1 long enough causes printer error
@@ -880,6 +900,47 @@ static INPUT_PORTS_START(namcona1_quiz)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_SERVICE1)
INPUT_PORTS_END
+static INPUT_PORTS_START(zelost) // TODO: to be adjusted when the game will work, for now using PORT_NAME to name them as the I/O test does
+ PORT_START("P1")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON8) PORT_PLAYER(3) PORT_NAME("LINE 8")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON6) PORT_PLAYER(3) PORT_NAME("LINE 6")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON4) PORT_PLAYER(3) PORT_NAME("LINE 4")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(3) PORT_NAME("LINE 2")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("D.GAME") // double up game?
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("PAY OUT")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN) // no effect in I/O test
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN) // "
+
+ PORT_START("P2")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_NAME("A.L.B.") // ???
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON7) PORT_PLAYER(3) PORT_NAME("LINE 7")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON5) PORT_PLAYER(3) PORT_NAME("LINE 5")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_PLAYER(3) PORT_NAME("LINE 3")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON4) PORT_NAME("T.SCORE") // take score?
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN) // no effect in I/O test
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN) // "
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(3) PORT_NAME("LINE 1")
+
+ PORT_START("P3")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNKNOWN) // no effect in I/O test
+
+ PORT_START("P4")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNKNOWN) // no effect in I/O test
+
+ PORT_START("DSW")
+ PORT_DIPNAME(0x01, 0x01, "DIP2 (Freeze)")
+ PORT_DIPSETTING( 0x01, DEF_STR(Off))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPNAME(0x02, 0x02, "DIP1 (Test)")
+ PORT_DIPSETTING( 0x02, DEF_STR(Off))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN) // no effect in I/O test
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN) // no effect in I/O test
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN) // no effect in I/O test
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN) // no effect in I/O test
+ PORT_SERVICE(0x40, IP_ACTIVE_LOW)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN) // no effect in I/O test
+INPUT_PORTS_END
/***************************************************************************/
@@ -1055,6 +1116,13 @@ void namcona2_state::namcona2(machine_config &config)
// m_maincpu->set_addrmap(AS_PROGRAM, &namcona2_state::namcona2_main_map);
}
+void namcona2_state::zelos(machine_config &config)
+{
+ namcona2(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcona2_state::zelos_main_map);
+}
+
void xday2_namcona2_state::xday2(machine_config &config)
{
namcona_base(config);
@@ -1084,6 +1152,7 @@ void namcona2_state::init_knckhead() { m_gametype = NAMCO_KNCKHEAD; }
void namcona2_state::init_numanath() { m_gametype = NAMCO_NUMANATH; }
void namcona2_state::init_quiztou() { m_gametype = NAMCO_QUIZTOU; }
void xday2_namcona2_state::init_xday2() { m_gametype = NAMCO_XDAY2; }
+void namcona2_state::init_zelos() { m_gametype = -1; save_item(NAME(m_zelos_ctrl)); }
ROM_START(bkrtmaq)
ROM_REGION(0x200000, "maincpu", 0)
@@ -1425,6 +1494,28 @@ ROM_START(xday2)
ROM_LOAD16_BYTE("xds1-dat3.8c", 0x400000, 0x200000, CRC(8980acc4) SHA1(ecd94a3d3a38923e8e322cd8863671af26e30812))
ROM_END
+// an 8-liner game that runs on several Namco NA-2 PCBs. Cabinet pic shows 9 screens (one per reel, called windows in IO test) + 5 screens (one per terminal)
+ROM_START(zelos)
+ ROM_REGION(0x200000, "maincpu", ROMREGION_ERASEFF)
+ ROM_LOAD16_BYTE("zs1 slp 1b.6c", 0x000001, 0x080000, CRC(d71df137) SHA1(457d3e7cb352b44706567e8346dcde82393d13c1))
+ ROM_LOAD16_BYTE("zs1 slp 0b.6f", 0x000000, 0x080000, CRC(5807ef9e) SHA1(5dde8d71637de480d1d679d88b25509c229c6056))
+
+ ROM_REGION16_BE(0x800000, "maskrom", ROMREGION_ERASE00)
+ // not populated
+ROM_END
+
+ROM_START(zelost) // this uses a different ROM board: Namco MDROM PCB - 8625961102 with MB8464A-15LL battery-backed RAM
+ ROM_REGION(0x200000, "maincpu", ROMREGION_ERASEFF)
+ ROM_LOAD16_BYTE("zs1 stp 1e.3e", 0x000001, 0x080000, CRC(3a593d12) SHA1(1941c5e88e425f83fc8e22e48e7bf18f231efb78))
+ ROM_LOAD16_BYTE("zs1 stp 0e.6e", 0x000000, 0x080000, CRC(e331f84c) SHA1(77812e50c49093883a9ec71290f45d398abac5fd))
+
+ ROM_REGION16_BE(0x800000, "maskrom", ROMREGION_ERASE00)
+ // not populated
+
+ ROM_REGION(0x0800, "eeprom", 0) // default EEPROM, to avoid error on start-up
+ ROM_LOAD("eeprom", 0x0000, 0x0800, CRC(ac117acc) SHA1(fa7d8d1f47cc0cbcc37d1fa4d41d76a109320b0b))
+ROM_END
+
// NA-1 (C69 MCU)
GAME(1992, bkrtmaq, 0, namcona1, namcona1_quiz, namcona1_state, init_bkrtmaq, ROT0, "Namco", "Bakuretsu Quiz Ma-Q Dai Bouken (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL)
GAME(1992, cgangpzl, 0, namcona1, namcona1_joy, namcona1_state, init_cgangpzl, ROT0, "Namco", "Cosmo Gang the Puzzle (US)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL)
@@ -1449,3 +1540,5 @@ GAME(1993, numanath, 0, namcona2, namcona1_joy, namcona2_state, init_
GAME(1993, numanathj, numanath, namcona2, namcona1_joy, namcona2_state, init_numanath, ROT0, "Namco", "Numan Athletics (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL)
GAME(1993, quiztou, 0, namcona2, namcona1_quiz, namcona2_state, init_quiztou, ROT0, "Namco", "Nettou! Gekitou! Quiztou!! (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL)
GAME(1995, xday2, 0, xday2, namcona1_joy, xday2_namcona2_state, init_xday2, ROT0, "Namco", "X-Day 2 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL)
+GAME(1994, zelos, 0, zelos, namcona1_joy, namcona2_state, init_zelos, ROT0, "Namco", "Zelos (Japan, main unit)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL) // waits for communication with the terminals
+GAME(1994, zelost, 0, zelos, zelost, namcona2_state, init_zelos, ROT0, "Namco", "Zelos (Japan, terminal)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL) // no way to insert medal. Maybe needs communication with main unit?
diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp
index c396afd6ca7..33ae8e76e60 100644
--- a/src/mame/drivers/namcos2.cpp
+++ b/src/mame/drivers/namcos2.cpp
@@ -3727,18 +3727,18 @@ ROM_START( fourtraxa )
ROM_LOAD16_BYTE( "fx_voi-1.3m", 0x000000, 0x080000, CRC(6173364f) SHA1(cc426f49b7e87b11f1f51e8e10db7cad87ffb44d) )
ROM_END
-/* MARVEL LAND (USA) */
+/* MARVEL LAND (JAPAN) */
ROM_START( marvland )
ROM_REGION( 0x040000, "maincpu", 0 ) /* Master CPU */
- ROM_LOAD16_BYTE( "mv2_mpr0", 0x000000, 0x020000, CRC(d8b14fee) SHA1(8b5615106426efad45c651f1d6b9a6e3238bc242) )
- ROM_LOAD16_BYTE( "mv2_mpr1", 0x000001, 0x020000, CRC(29ff2738) SHA1(9f493f32ae1c4e7ef48d7e208c63a222636bda06) )
+ ROM_LOAD16_BYTE( "mv1-mpr0.bin", 0x000000, 0x010000, CRC(8369120f) SHA1(58cf481bf97f74a91ecc5ff77696528441b41b04) )
+ ROM_LOAD16_BYTE( "mv1-mpr1.bin", 0x000001, 0x010000, CRC(6d5442cc) SHA1(8cdaf6e1ec735740ace78393df2d867a213a4725) )
ROM_REGION( 0x040000, "slave", 0 ) /* Slave CPU */
- ROM_LOAD16_BYTE( "mv2_spr0", 0x000000, 0x010000, CRC(aa418f29) SHA1(413798d9c1d98cfcadb045a5436aaee61ce6718f) )
- ROM_LOAD16_BYTE( "mv2_spr1", 0x000001, 0x010000, CRC(dbd94def) SHA1(56a8d7acd483bc4d12c8bc5b7e90ffdb132be670) )
+ ROM_LOAD16_BYTE( "mv1-spr0.bin", 0x000000, 0x010000, CRC(c3909925) SHA1(bf76cb77c38787574bf75caf868700316894895c) )
+ ROM_LOAD16_BYTE( "mv1-spr1.bin", 0x000001, 0x010000, CRC(1c5599f5) SHA1(6bdf11da4e2a56c6bb6011977b045d9537d0597f) )
ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */
- ROM_LOAD( "mv2_snd0", 0x000000, 0x020000, CRC(a5b99162) SHA1(cafe8d1dae1e981c7ff9b70076b3e1d52cd806f7) )
+ ROM_LOAD( "mv1-snd0.bin", 0x000000, 0x020000, CRC(51b8ccd7) SHA1(5aacb020c12d9a3c43c098f3abd8358bc18acc64) )
ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */
ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) )
@@ -3766,27 +3766,25 @@ ROM_START( marvland )
NAMCOS2_GFXROM_LOAD_256K( "mv1-sha.bin", 0x000000, CRC(a47db5d3) SHA1(110e26412aa84f229773049112709be457b7a6ff) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "mv2_dat0.13s", 0x000000, CRC(62e6318b) SHA1(5c26bc054298f2a0980f7e82ba1844bc9f5eff98) )
- NAMCOS2_DATA_LOAD_O_128K( "mv2_dat1.13p", 0x000000, CRC(8a6902ca) SHA1(272e8699b872b3a50d72090b43c57493e6642bfe) )
- NAMCOS2_DATA_LOAD_E_128K( "mv2_dat2.13r", 0x100000, CRC(f5c6408c) SHA1(568fb08d0763dc91674d708fa2d15ca952956145) )
- NAMCOS2_DATA_LOAD_O_128K( "mv2_dat3.13n", 0x100000, CRC(6df76955) SHA1(fcfb520399acdd3776f66944121d6980552d3100) )
+ NAMCOS2_DATA_LOAD_E_128K( "mv1-dat0.13s", 0x000000, CRC(e15f412e) SHA1(d3ff006d4577540a690c912e94897a1b638ac265) )
+ NAMCOS2_DATA_LOAD_O_128K( "mv1-dat1.13p", 0x000000, CRC(73e1545a) SHA1(a04034e56fef69fb2a2eb88f2f392c376e52d00d) )
ROM_REGION16_BE( 0x200000, "c140", ROMREGION_ERASE00 ) /* Sound voices */
- ROM_LOAD16_BYTE( "mv1-voi1.bin", 0x000000, 0x080000, BAD_DUMP CRC(de5cac09) SHA1(2d73e54c4f159e52db2c403a59d6c137cce6f53e) ) // either undumped, or PCB was wrongly populated with JP samples ROM?
+ ROM_LOAD16_BYTE( "mv1-voi1.bin", 0x000000, 0x080000, CRC(de5cac09) SHA1(2d73e54c4f159e52db2c403a59d6c137cce6f53e) )
ROM_END
-/* MARVEL LAND (JAPAN) */
-ROM_START( marvlandj )
+/* MARVEL LAND (USA) */
+ROM_START( marvlandup )
ROM_REGION( 0x040000, "maincpu", 0 ) /* Master CPU */
- ROM_LOAD16_BYTE( "mv1-mpr0.bin", 0x000000, 0x010000, CRC(8369120f) SHA1(58cf481bf97f74a91ecc5ff77696528441b41b04) )
- ROM_LOAD16_BYTE( "mv1-mpr1.bin", 0x000001, 0x010000, CRC(6d5442cc) SHA1(8cdaf6e1ec735740ace78393df2d867a213a4725) )
+ ROM_LOAD16_BYTE( "mv2_mpr0", 0x000000, 0x020000, CRC(d8b14fee) SHA1(8b5615106426efad45c651f1d6b9a6e3238bc242) )
+ ROM_LOAD16_BYTE( "mv2_mpr1", 0x000001, 0x020000, CRC(29ff2738) SHA1(9f493f32ae1c4e7ef48d7e208c63a222636bda06) )
ROM_REGION( 0x040000, "slave", 0 ) /* Slave CPU */
- ROM_LOAD16_BYTE( "mv1-spr0.bin", 0x000000, 0x010000, CRC(c3909925) SHA1(bf76cb77c38787574bf75caf868700316894895c) )
- ROM_LOAD16_BYTE( "mv1-spr1.bin", 0x000001, 0x010000, CRC(1c5599f5) SHA1(6bdf11da4e2a56c6bb6011977b045d9537d0597f) )
+ ROM_LOAD16_BYTE( "mv2_spr0", 0x000000, 0x010000, CRC(aa418f29) SHA1(413798d9c1d98cfcadb045a5436aaee61ce6718f) )
+ ROM_LOAD16_BYTE( "mv2_spr1", 0x000001, 0x010000, CRC(dbd94def) SHA1(56a8d7acd483bc4d12c8bc5b7e90ffdb132be670) )
ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */
- ROM_LOAD( "mv1-snd0.bin", 0x000000, 0x020000, CRC(51b8ccd7) SHA1(5aacb020c12d9a3c43c098f3abd8358bc18acc64) )
+ ROM_LOAD( "mv2_snd0", 0x000000, 0x020000, CRC(a5b99162) SHA1(cafe8d1dae1e981c7ff9b70076b3e1d52cd806f7) )
ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */
ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) )
@@ -3814,11 +3812,13 @@ ROM_START( marvlandj )
NAMCOS2_GFXROM_LOAD_256K( "mv1-sha.bin", 0x000000, CRC(a47db5d3) SHA1(110e26412aa84f229773049112709be457b7a6ff) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "mv1-dat0.13s", 0x000000, CRC(e15f412e) SHA1(d3ff006d4577540a690c912e94897a1b638ac265) )
- NAMCOS2_DATA_LOAD_O_128K( "mv1-dat1.13p", 0x000000, CRC(73e1545a) SHA1(a04034e56fef69fb2a2eb88f2f392c376e52d00d) )
+ NAMCOS2_DATA_LOAD_E_128K( "mv2_dat0.13s", 0x000000, CRC(62e6318b) SHA1(5c26bc054298f2a0980f7e82ba1844bc9f5eff98) )
+ NAMCOS2_DATA_LOAD_O_128K( "mv2_dat1.13p", 0x000000, CRC(8a6902ca) SHA1(272e8699b872b3a50d72090b43c57493e6642bfe) )
+ NAMCOS2_DATA_LOAD_E_128K( "mv2_dat2.13r", 0x100000, CRC(f5c6408c) SHA1(568fb08d0763dc91674d708fa2d15ca952956145) )
+ NAMCOS2_DATA_LOAD_O_128K( "mv2_dat3.13n", 0x100000, CRC(6df76955) SHA1(fcfb520399acdd3776f66944121d6980552d3100) )
ROM_REGION16_BE( 0x200000, "c140", ROMREGION_ERASE00 ) /* Sound voices */
- ROM_LOAD16_BYTE( "mv1-voi1.bin", 0x000000, 0x080000, CRC(de5cac09) SHA1(2d73e54c4f159e52db2c403a59d6c137cce6f53e) )
+ ROM_LOAD16_BYTE( "mv1-voi1.bin", 0x000000, 0x080000, BAD_DUMP CRC(de5cac09) SHA1(2d73e54c4f159e52db2c403a59d6c137cce6f53e) ) // either undumped, or PCB was wrongly populated with JP samples ROM?
ROM_END
/* METAL HAWK */
@@ -5564,11 +5564,6 @@ void namcos2_state::init_kyukaidk()
m_gametype = NAMCOS2_KYUUKAI_DOUCHUUKI;
}
-void namcos2_state::init_marvlanj()
-{
- m_gametype = NAMCOS2_MARVEL_LAND;
-}
-
void namcos2_state::init_marvland()
{
m_gametype = NAMCOS2_MARVEL_LAND;
@@ -5753,8 +5748,8 @@ GAME( 1989, finehour, 0, base2, base, namcos2_state, init_fineh
GAME( 1989, burnforc, 0, base3, base, namcos2_state, init_burnforc, ROT0, "Namco", "Burning Force (Japan, new version (Rev C))", MACHINE_SUPPORTS_SAVE )
GAME( 1989, burnforco, burnforc, base3, base, namcos2_state, init_burnforc, ROT0, "Namco", "Burning Force (Japan, old version)", MACHINE_SUPPORTS_SAVE )
-GAME( 1989, marvland, 0, base, base, namcos2_state, init_marvland, ROT0, "Namco", "Marvel Land (US, prototype?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1989, marvlandj, marvland, base, base, namcos2_state, init_marvlanj, ROT0, "Namco", "Marvel Land (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1989, marvland, 0, base, base, namcos2_state, init_marvland, ROT0, "Namco", "Marvel Land (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1989, marvlandup, marvland, base, base, namcos2_state, init_marvland, ROT0, "Namco", "Marvel Land (US, prototype)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // or World as no WDUD logo. Game is incomplete and ends abruptly at World 3-4
GAME( 1990, kyukaidk, 0, base, kyukaidk, namcos2_state, init_kyukaidk, ROT0, "Namco", "Kyuukai Douchuuki (Japan, new version (Rev B))", MACHINE_SUPPORTS_SAVE )
GAME( 1990, kyukaidko, kyukaidk, base, kyukaidk, namcos2_state, init_kyukaidk, ROT0, "Namco", "Kyuukai Douchuuki (Japan, old version)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/namcos22.cpp b/src/mame/drivers/namcos22.cpp
index 6d9d53e19c0..0361499d8a2 100644
--- a/src/mame/drivers/namcos22.cpp
+++ b/src/mame/drivers/namcos22.cpp
@@ -4120,6 +4120,17 @@ ROM_START( ridgeracf )
ROM_REGION16_LE( 0x80000, "mcu", 0 ) /* sound data */
ROM_LOAD( "rrf1data.6r", 0, 0x080000, CRC(ce3c6ed6) SHA1(23e033364bc967c10c49fd1d5413dda837670633) )
+ /* this stuff was missing from this version, and shouldn't be the same (bad textures if we use these roms) */
+ ROM_REGION( 0x200000*8, "textile", 0) /* 16x16x8bpp texture tiles */
+ ROM_LOAD( "rrf1cg0.bin", 0x200000*0x4, 0x200000, BAD_DUMP CRC(b557a795) SHA1(f345486ffbe797246ad80a55d3c4a332ed6e2888) )
+ ROM_LOAD( "rrf1cg1.bin", 0x200000*0x5, 0x200000, BAD_DUMP CRC(0fa212d9) SHA1(a1311de0a504e2d399044fa8ac32ec6c56ec965f) )
+ ROM_LOAD( "rrf1cg2.bin", 0x200000*0x6, 0x200000, BAD_DUMP CRC(18e2d2bd) SHA1(69c2ea62eeb255f27d3c69373f6716b0a34683cc) )
+ ROM_LOAD( "rrf1cg3.bin", 0x200000*0x7, 0x200000, BAD_DUMP CRC(9564488b) SHA1(6b27d1aea75d6be747c62e165cfa49ecc5d9e767) )
+
+ ROM_REGION16_LE( 0x280000, "textilemap", 0 ) /* texture tilemap */
+ ROM_LOAD( "rrf1ccrl.bin",0x000000, 0x200000, BAD_DUMP CRC(6092d181) SHA1(52c0e3ac20aa23059a87d1a985d24ae641577310) )
+ ROM_LOAD( "rrf1ccrh.bin",0x200000, 0x080000, BAD_DUMP CRC(dd332fd5) SHA1(a7d9c1d6b5a8e3a937b525c1363880e404dcd147) )
+
ROM_REGION( 0x80000*6, "pointrom", 0 ) /* 3d model data */
ROM_LOAD( "rrf2potl0.l0", 0x80000*0, 0x80000, CRC(9b762e60) SHA1(50b67ff6678bacba140bad3aedda75c30851fa7a) )
ROM_LOAD( "rrf2potl1.l1", 0x80000*1, 0x80000, CRC(ab4d66b0) SHA1(59020b3dc2efff99cd528752ca7168b64ae96ac4) )
@@ -4134,21 +4145,10 @@ ROM_START( ridgeracf )
ROM_LOAD( "rrf1wave2.10n", 0x100000*1, 0x100000,CRC(4ceeae12) SHA1(ae3a6583f8912bc784c7bc63d32448228cf217ba) ) // differs from normal sets
ROM_LOAD( "rrf1wave3.10l", 0x100000*3, 0x100000,CRC(c4cda1a7) SHA1(60bc96880ec79efdff3cc70c09e848692a40bea4) )
- /* this stuff was missing from this version, and shouldn't be the same (bad textures if we use these roms) */
ROM_REGION( 0x300, "gamma_proms", 0 )
- ROM_LOAD( "rrf1gam.2d", 0x0000, 0x0100, BAD_DUMP CRC(b2161bce) SHA1(d2681cc0cf8e68df0d942d392b4eb4458c4bb356) )
- ROM_LOAD( "rrf1gam.3d", 0x0100, 0x0100, BAD_DUMP CRC(b2161bce) SHA1(d2681cc0cf8e68df0d942d392b4eb4458c4bb356) )
- ROM_LOAD( "rrf1gam.4d", 0x0200, 0x0100, BAD_DUMP CRC(b2161bce) SHA1(d2681cc0cf8e68df0d942d392b4eb4458c4bb356) )
-
- ROM_REGION( 0x200000*8, "textile", 0) /* 16x16x8bpp texture tiles */
- ROM_LOAD( "rrf1cg0.bin", 0x200000*0x4, 0x200000, BAD_DUMP CRC(b557a795) SHA1(f345486ffbe797246ad80a55d3c4a332ed6e2888) )
- ROM_LOAD( "rrf1cg1.bin", 0x200000*0x5, 0x200000, BAD_DUMP CRC(0fa212d9) SHA1(a1311de0a504e2d399044fa8ac32ec6c56ec965f) )
- ROM_LOAD( "rrf1cg2.bin", 0x200000*0x6, 0x200000, BAD_DUMP CRC(18e2d2bd) SHA1(69c2ea62eeb255f27d3c69373f6716b0a34683cc) )
- ROM_LOAD( "rrf1cg3.bin", 0x200000*0x7, 0x200000, BAD_DUMP CRC(9564488b) SHA1(6b27d1aea75d6be747c62e165cfa49ecc5d9e767) )
-
- ROM_REGION16_LE( 0x280000, "textilemap", 0 ) /* texture tilemap */
- ROM_LOAD( "rrf1ccrl.bin",0x000000, 0x200000, BAD_DUMP CRC(6092d181) SHA1(52c0e3ac20aa23059a87d1a985d24ae641577310) )
- ROM_LOAD( "rrf1ccrh.bin",0x200000, 0x080000, BAD_DUMP CRC(dd332fd5) SHA1(a7d9c1d6b5a8e3a937b525c1363880e404dcd147) )
+ ROM_LOAD( "rr1gam.2d", 0x0000, 0x0100, CRC(b2161bce) SHA1(d2681cc0cf8e68df0d942d392b4eb4458c4bb356) )
+ ROM_LOAD( "rr1gam.3d", 0x0100, 0x0100, CRC(b2161bce) SHA1(d2681cc0cf8e68df0d942d392b4eb4458c4bb356) )
+ ROM_LOAD( "rr1gam.4d", 0x0200, 0x0100, CRC(b2161bce) SHA1(d2681cc0cf8e68df0d942d392b4eb4458c4bb356) )
ROM_END
diff --git a/src/mame/drivers/namcos23.cpp b/src/mame/drivers/namcos23.cpp
index 12d742f317d..8c3eb6b4f6f 100644
--- a/src/mame/drivers/namcos23.cpp
+++ b/src/mame/drivers/namcos23.cpp
@@ -2314,7 +2314,7 @@ void namcos23_renderer::render_flush(bitmap_rgb32& bitmap)
for(int i=0; i<render.poly_count; i++) {
const namcos23_poly_entry *p = render.poly_order[i];
- namcos23_render_data& extra = render.polymgr->object_data_alloc();
+ namcos23_render_data& extra = render.polymgr->object_data().next();
extra = p->rd;
extra.bitmap = &bitmap;
diff --git a/src/mame/drivers/naomi.cpp b/src/mame/drivers/naomi.cpp
index 250d4ee200e..1f5cf9a8365 100644
--- a/src/mame/drivers/naomi.cpp
+++ b/src/mame/drivers/naomi.cpp
@@ -585,7 +585,7 @@ Marvel Vs. Capcom 2 New Age of Heroes (Export, Rev A) 841-0007C-02 23085A
Marvel Vs. Capcom 2 New Age of Heroes (Korea, Rev A) 841-0007C-03 23085A 14 (64Mb)* present 317-5058-COM *(+2x 32Mb) have factory wire-mod connecting IC13S serial EEPROM CLK pin to IC11 ROM /OE pin
MushiKing The King of Beetles (2K3 2ND Ver. 1.003-, World) 840-0150C 24217 6 (64Mb) present 317-0394-COM requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
MushiKing The King of Beetles (2K3 2ND Ver. 1.002-, World) 840-0150C 24217 6 (64Mb) present 317-0394-COM requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
-MushiKing The King of Beetles (2K3 2ND Ver. 1.000-, Korea) 840-0155C none 6 (64Mb) present 317-0???-COM requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
+MushiKing The King of Beetles (2K3 2ND Ver. 1.000-, Korea) 840-0155C 24265 6 (64Mb) present 317-0394-COM requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
Quiz Ah Megamisama 840-0030C 23227 16 (64Mb) present 317-0280-JPN
Shootout Pool 840-0098C 23844 4 (64Mb) present 317-0336-COM requires regular 837-13551 and 837-13938 rotary JVS boards
/Shootout Pool Prize (Export) /
diff --git a/src/mame/drivers/nascom1.cpp b/src/mame/drivers/nascom1.cpp
index a273f07c357..4979dde7a4d 100644
--- a/src/mame/drivers/nascom1.cpp
+++ b/src/mame/drivers/nascom1.cpp
@@ -367,7 +367,7 @@ SNAPSHOT_LOAD_MEMBER(nascom_state::snapshot_cb)
}
else
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported file format");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported file format");
return image_init_result::FAIL;
}
dummy = 0x00;
@@ -392,7 +392,7 @@ image_init_result nascom2_state::load_cart(device_image_interface &image, generi
{
if (slot->length() > 0x1000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported file size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported file size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/neogeo.cpp b/src/mame/drivers/neogeo.cpp
index 1750bd2c0b3..a6ef01a79e9 100644
--- a/src/mame/drivers/neogeo.cpp
+++ b/src/mame/drivers/neogeo.cpp
@@ -1082,7 +1082,7 @@ void neogeo_base_state::memcard_w(offs_t offset, uint16_t data, uint16_t mem_mas
if (ACCESSING_BITS_0_7)
{
if (m_memcard->present())
- m_memcard->write(offset, data);
+ m_memcard->write(offset, data);
}
}
diff --git a/src/mame/drivers/ngp.cpp b/src/mame/drivers/ngp.cpp
index 61618fcc817..2be9e345da1 100644
--- a/src/mame/drivers/ngp.cpp
+++ b/src/mame/drivers/ngp.cpp
@@ -754,7 +754,7 @@ DEVICE_IMAGE_LOAD_MEMBER(ngp_state::load_ngp_cart)
if (size != 0x8000 && size != 0x80000 && size != 0x100000 && size != 0x200000 && size != 0x400000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/ns32kdb.cpp b/src/mame/drivers/ns32kdb.cpp
index 073a53fff38..ffb2a1e4849 100644
--- a/src/mame/drivers/ns32kdb.cpp
+++ b/src/mame/drivers/ns32kdb.cpp
@@ -9,7 +9,6 @@
*
* TODO:
* - clock/timer routing
- * - cassette interface
* - nmi/reset switches, layout
* - multibus interface
*/
@@ -33,6 +32,8 @@
// busses and connectors
#include "bus/rs232/rs232.h"
+#include "speaker.h"
+#include "imagedev/cassette.h"
#define VERBOSE 0
#include "logmacro.h"
@@ -52,6 +53,7 @@ public:
, m_ppi(*this, "ppi")
, m_pit(*this, "pit")
, m_sdm(*this, "sdm%u", 0U)
+ , m_cass(*this, "cassette")
, m_cfg(*this, "S3")
, m_led(*this, "DS%u", 0U)
{
@@ -81,9 +83,13 @@ protected:
// serial port diagnostic multiplexers
required_device_array<ls157_device, 2> m_sdm;
+ required_device<cassette_image_device> m_cass;
required_ioport m_cfg;
output_finder<4> m_led;
+private:
+ u8 pa_r();
+ void pb_w(u8);
};
void ns32kdb_state::machine_start()
@@ -160,6 +166,16 @@ static INPUT_PORTS_START(db32016)
PORT_DIPSETTING(0x0f, "50")
INPUT_PORTS_END
+void ns32kdb_state::pb_w(u8 data)
+{
+ m_cass->output(BIT(data, 0) ? 1.0 : -1.0);
+}
+
+u8 ns32kdb_state::pa_r()
+{
+ return (m_cass->input() > 0.03) ? 0xfe : 0xff;
+}
+
void ns32kdb_state::db32016(machine_config &config)
{
NS32016(config, m_cpu, 10_MHz_XTAL);
@@ -176,6 +192,8 @@ void ns32kdb_state::db32016(machine_config &config)
m_icu->out_int().set_inputline(m_cpu, INPUT_LINE_IRQ0).invert();
I8255(config, m_ppi);
+ m_ppi->in_pa_callback().set(FUNC(ns32kdb_state::pa_r));
+ m_ppi->out_pb_callback().set(FUNC(ns32kdb_state::pb_w));
PIT8253(config, m_pit);
m_pit->set_clk<0>(18.432_MHz_XTAL / 150);
@@ -225,6 +243,12 @@ void ns32kdb_state::db32016(machine_config &config)
m_sdm[1]->out_callback().append(m_pci[1], FUNC(i8251_device::write_rxd)).bit(1);
//m_sdm[1]->out_callback().append(m_pci[1], FUNC(i8251_device::write_txc)).bit(2);
//m_sdm[1]->out_callback().append(m_pci[1], FUNC(i8251_device::write_rxc)).bit(3);
+
+ /* Cassette */
+ SPEAKER(config, "mono").front_center();
+ CASSETTE(config, m_cass);
+ m_cass->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cass->add_route(ALL_OUTPUTS, "mono", 0.05);
}
ROM_START(db32016)
diff --git a/src/mame/drivers/opercoin.cpp b/src/mame/drivers/opercoin.cpp
new file mode 100644
index 00000000000..c6a114e2f1d
--- /dev/null
+++ b/src/mame/drivers/opercoin.cpp
@@ -0,0 +1,97 @@
+// license:BSD-3-Clause
+// copyright-holders:
+
+/*
+Skeleton driver for Oper Coin "Multi Baby" slot machine.
+ ___________________________________________________________________
+ | ········ ········ ···· |
+ | _________ _________ _________ _________ _________ |
+ | |________| · |________| |_EMPTY__| |_EMPTY__| · |________| |
+ | · _____ · ..|
+ | · |BATT| · ..|
+ | · |_6V_| · ..|
+ | ________ ________ ________ ________ ________ |
+ | |74LS259| |74LS259| |74LS259| |74LS259| |74LS259| |
+ |.. ······ ······ ······ ·|
+ |.. ________ ________ ________ ________ ________ ·|
+ |..|74LS259| |74LS259| |74LS259| |74LS259| |74LS259| ·|
+ |.. ___ ________ |
+ |.. |EM| |TC538BP| |
+ |.. |PT| ________ |
+ |.. |Y | |TC538BP| _____________ |
+ |.. |__| ________ | EMPTY | |
+ | ___ |74LS74APC |____________| ________ |
+ | |EM| ________ ______________|SCL4011BE ________________ ____|
+ | |PT| |74LS363| | EPROM | ________ | GI AY-3-8910 ||4x ||
+ | |Y | ________ |_____________||_74LS02| |_______________||DIPS|
+ | |__|Xtal|74LS138| ________________ |
+ |·___ 8.000 | Z80A CPU | ________ · |
+ |·| |MHz ::::::: |_______________| |ULN28030 · |
+ |·| |<- ULN2803A ·········· · |
+ |·|__| ······ ········ ········ · |
+ |__________________________________________________________________|
+
+*/
+
+#include "emu.h"
+#include "speaker.h"
+#include "cpu/z80/z80.h"
+#include "sound/ay8910.h"
+
+namespace {
+
+class multibaby_state : public driver_device
+{
+public:
+ multibaby_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu")
+ {
+ }
+
+ void multibaby(machine_config &config);
+
+private:
+ required_device<cpu_device> m_maincpu;
+
+ void prg_map(address_map &map);
+};
+
+void multibaby_state::prg_map(address_map &map)
+{
+ map(0x0000, 0x3fff).rom();
+ map(0x4000, 0x47ff).ram();
+ //map(0x8000, 0x8000).w("psg", FUNC(ay8910_device::address_w));
+ //map(0x8001, 0x8001).r("psg", FUNC(ay8910_device::data_r));
+ //map(0x8002, 0x8002).w("psg", FUNC(ay8910_device::data_w));
+ //map(0xe000, 0xe000).nopw();
+}
+
+static INPUT_PORTS_START( multibaby )
+ PORT_START("DSW1")
+ PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW1:1")
+ PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW1:2")
+ PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW1:3")
+ PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW1:4")
+INPUT_PORTS_END
+
+
+void multibaby_state::multibaby(machine_config &config)
+{
+ Z80(config, m_maincpu, 8.000_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &multibaby_state::prg_map);
+
+ SPEAKER(config, "mono").front_center();
+ ay8910_device &psg(AY8910(config, "psg", 8.000_MHz_XTAL / 4)); // Divisor unknown
+ psg.port_a_read_callback().set_ioport("DSW1");
+ psg.add_route(ALL_OUTPUTS, "mono", 1.0); // Guess
+}
+
+ROM_START( multibaby )
+ ROM_REGION(0x4000, "maincpu", 0)
+ ROM_LOAD( "oc_multi_baby_b-1923.ic13", 0x000, 0x4000, CRC(5d1bffe2) SHA1(536492b093dd247ba0440d499920d526ee7ea439) )
+ROM_END
+
+} // Anonymous namespace
+
+GAME( 1990, multibaby, 0, multibaby, multibaby, multibaby_state, empty_init, ROT0, "Oper Coin", "Multi Baby", MACHINE_IS_SKELETON_MECHANICAL )
diff --git a/src/mame/drivers/opwolf.cpp b/src/mame/drivers/opwolf.cpp
index f40d26b2bd3..6a09a82d321 100644
--- a/src/mame/drivers/opwolf.cpp
+++ b/src/mame/drivers/opwolf.cpp
@@ -272,16 +272,19 @@ register. So what is controlling priority.
***************************************************************************/
#include "emu.h"
+
+#include "audio/taitosnd.h"
+#include "includes/taitoipt.h"
+#include "machine/taitocchip.h"
+#include "video/pc080sn.h"
+#include "video/pc090oj.h"
+
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"
#include "machine/timer.h"
-#include "machine/taitocchip.h"
#include "sound/msm5205.h"
#include "sound/ymopm.h"
-#include "includes/taitoipt.h"
-#include "video/pc080sn.h"
-#include "video/pc090oj.h"
-#include "audio/taitosnd.h"
+
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@@ -312,7 +315,9 @@ public:
m_pc090oj(*this, "pc090oj"),
m_msm(*this, "msm%u", 0),
m_lspeaker(*this, "lspeaker"),
- m_rspeaker(*this, "rspeaker")
+ m_rspeaker(*this, "rspeaker"),
+ m_z80bank(*this, "z80bank"),
+ m_recoil(*this, "Player%u_Recoil_Piston", 1U)
{ }
void opwolf(machine_config &config);
@@ -336,7 +341,6 @@ private:
void opwolf_adpcm_d_w(uint8_t data);
void opwolf_adpcm_e_w(uint8_t data);
void opwolf_spritectrl_w(offs_t offset, uint16_t data);
- void sound_bankswitch_w(uint8_t data);
void opwolf_adpcm_b_w(offs_t offset, uint8_t data);
void opwolf_adpcm_c_w(offs_t offset, uint8_t data);
void counters_w(uint8_t data);
@@ -382,6 +386,8 @@ private:
required_device_array<msm5205_device, 2> m_msm;
required_device<speaker_device> m_lspeaker;
required_device<speaker_device> m_rspeaker;
+ required_memory_bank m_z80bank;
+ output_finder<1> m_recoil;
};
@@ -461,7 +467,7 @@ void opwolf_state::opwolfp_map(address_map &map)
void opwolf_state::opwolf_sound_z80_map(address_map &map)
{
map(0x0000, 0x3fff).rom();
- map(0x4000, 0x7fff).bankr("z80bank");
+ map(0x4000, 0x7fff).bankr(m_z80bank);
map(0x8000, 0x8fff).ram();
map(0x9000, 0x9001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
map(0x9002, 0x9100).nopr();
@@ -644,31 +650,24 @@ void opwolf_state::opwolf_spritectrl_w(offs_t offset, uint16_t data)
// popmessage("opwolf_spritectrl_w ctrl = %4x", data);
if (offset == 0)
{
- /* bit 0 -> MOTOR1 transistor */
- /* bit 1 -> MOTOR2 transistor */
- /* bit 2 -> Reset c-chip and coin custom PC050CM (active low) */
- /* bit 3 -> Not connected */
- /* bit 4 -> LATCH - used to signal light gun position can be latched to inputs on v-blank */
- /* bits 5-7 are the sprite palette bank */
+ // bit 0 -> MOTOR1 transistor
+ // bit 1 -> MOTOR2 transistor
+ // bit 2 -> Reset c-chip and coin custom PC050CM (active low)
+ // bit 3 -> Not connected
+ // bit 4 -> LATCH - used to signal light gun position can be latched to inputs on v-blank
+ // bits 5-7 are the sprite palette bank
m_pc090oj->sprite_ctrl_w(data);
- /* If data & 3, the Piston Motor is activated via M-1/M-2 connector */
- if (data & 3)
- {
- output().set_value("Player1_Recoil_Piston", 1);
- }
- else
- {
- output().set_value("Player1_Recoil_Piston", 0);
- }
+ // If data & 3, the Piston Motor is activated via M-1/M-2 connector
+ m_recoil[0] = (data & 3) ? 1 : 0;
}
}
void opwolf_state::opwolf_colpri_cb(u32 &sprite_colbank, u32 &pri_mask, u16 sprite_ctrl)
{
sprite_colbank = (sprite_ctrl & 0xe0) >> 1;
- pri_mask = 0xfc; /* sprites under top bg layer */
+ pri_mask = 0xfc; // sprites under top bg layer
}
uint32_t opwolf_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
@@ -709,11 +708,6 @@ GFXDECODE_END
// SOUND
//**************************************************************************
-void opwolf_state::sound_bankswitch_w(uint8_t data)
-{
- membank("z80bank")->set_entry(data & 0x03);
-}
-
//0 - start ROM offset LSB
//1 - start ROM offset MSB
//2 - end ROM offset LSB
@@ -817,8 +811,6 @@ void opwolf_state::init_opwolf()
// World & US version have different gun offsets, presumably slightly different gun hardware
m_opwolf_gun_xoffs = 0xec - (rom[0x03ffb0 / 2] & 0xff);
m_opwolf_gun_yoffs = 0x1c - (rom[0x03ffae / 2] & 0xff);
-
- membank("z80bank")->configure_entries(0, 4, memregion("audiocpu")->base(), 0x4000);
}
void opwolf_state::init_opwolfb()
@@ -826,20 +818,20 @@ void opwolf_state::init_opwolfb()
/* bootleg needs different range of raw gun coords */
m_opwolf_gun_xoffs = -2;
m_opwolf_gun_yoffs = 17;
-
- membank("z80bank")->configure_entries(0, 4, memregion("audiocpu")->base(), 0x4000);
}
void opwolf_state::init_opwolfp()
{
m_opwolf_gun_xoffs = 5;
m_opwolf_gun_yoffs = 30;
-
- membank("z80bank")->configure_entries(0, 4, memregion("audiocpu")->base(), 0x4000);
}
void opwolf_state::machine_start()
{
+ m_recoil.resolve();
+
+ m_z80bank->configure_entries(0, 4, memregion("audiocpu")->base(), 0x4000);
+
save_item(NAME(m_sprite_ctrl));
save_item(NAME(m_sprites_flipscreen));
@@ -938,7 +930,7 @@ void opwolf_state::opwolf(machine_config &config)
ym2151_device &ymsnd(YM2151(config, "ymsnd", SOUND_CPU_CLOCK)); /* 4 MHz */
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
- ymsnd.port_write_handler().set(FUNC(opwolf_state::sound_bankswitch_w));
+ ymsnd.port_write_handler().set_membank(m_z80bank).mask(0x03);
ymsnd.add_route(0, "lspeaker", 1.0);
ymsnd.add_route(1, "rspeaker", 1.0);
@@ -1012,7 +1004,7 @@ void opwolf_state::opwolfb(machine_config &config) /* OSC clocks unknown for the
ym2151_device &ymsnd(YM2151(config, "ymsnd", SOUND_CPU_CLOCK));
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
- ymsnd.port_write_handler().set(FUNC(opwolf_state::sound_bankswitch_w));
+ ymsnd.port_write_handler().set_membank(m_z80bank).mask(0x03);
ymsnd.add_route(0, "lspeaker", 1.0);
ymsnd.add_route(1, "rspeaker", 1.0);
diff --git a/src/mame/drivers/pc8801.cpp b/src/mame/drivers/pc8801.cpp
index b710bd01f8b..5a9ece1c5c9 100644
--- a/src/mame/drivers/pc8801.cpp
+++ b/src/mame/drivers/pc8801.cpp
@@ -1,24 +1,31 @@
// license:BSD-3-Clause
// copyright-holders:Angelo Salese
-/*************************************************************************************************************************************
+/**************************************************************************************************
PC-8801 (c) 1981 NEC
driver by Angelo Salese, original MESS PC-88SR driver by ???
TODO:
- - implement proper i8214 routing, also add irq latch mechanism;
- - Fix up Floppy Terminal Count 0 / 1 writes properly, Castle Excellent (and presumably other games) is very picky about it.
-
- - add differences between various models;
- - implement proper upd3301 / i8257 support;
- - fix "jumps" in mouse support pointer (noticeable in Balance of Power);
+ - implement proper i8214 routing, and add irq latch mechanism;
+ - Fix up Floppy Terminal Count 0 / 1 writes properly, Castle Excellent (and presumably other
+ games) is very picky about it.
+ - implement proper upd3301 / i8257 text support (currently hacked around);
- Add limits for extend work RAM;
- - What happens to the palette contents when the analog/digital palette mode changes?
- waitstates;
- - dipswitches needs to be controlled;
- - below notes states that plain PC-8801 doesn't have a disk CPU, but the BIOS clearly checks the floppy ports. Wrong info?
- - clean-ups, banking and video in particular (i.e. hook-ups with memory region should go away and device models should be used instead)
+ - clean-ups:
+ - better state machine isolation of features between various models (currently pretty cheaty);
+ - refactor memory banking to use address maps;
+ - video;
+ - double check dipswitches;
+ - move PC80S31K to device, needed by PC-6601SR, PC-88VA, (vanilla & optional) PC-9801.
+ Also notice that there are common points with SPC-1000 and TF-20 FDDs;
+ - backport/merge what is portable to PC-8001;
+ - implement bus slot mechanism for NEC boards ("PC-8800-**"), HAL PCG-8100 & GSX8800,
+ probably others (does bus have an actual codename or just "PC-8801 bus"?);
+ - below notes states that plain PC-8801 doesn't have a disk CPU, but the BIOS clearly checks
+ the floppy ports. Wrong info or check for external board anyway?
+ - fix "jumps" in mouse support pointer (noticeable in Balance of Power);
per-game specific TODO:
- 100yen Soft 8 Revival Special: tight loop with vblank bit, but vblank irq takes too much time to execute its code;
@@ -334,6 +341,8 @@ void pc8801_state::draw_bitmap_3bpp(bitmap_ind16 &bitmap,const rectangle &clipre
if(cliprect.contains(x+xi, y+0))
bitmap.pix(y+0, x+xi) = m_palette->pen(pen & 7);
+ // TODO: real HW seems to actually just output to either even or odd line when in 3bpp mode
+ // investigate which is right
if(cliprect.contains(x+xi, y+1))
bitmap.pix(y+1, x+xi) = m_palette->pen(pen & 7);
}
@@ -1170,6 +1179,8 @@ void pc8801_state::pc8801_palram_w(offs_t offset, uint8_t data)
m_palram[offset].g = data & 4 ? 7 : 0;
}
+ // TODO: What happens to the palette contents when the analog/digital palette mode changes?
+ // Preserve content? Translation? Undefined?
m_palette->set_pen_color(offset, pal3bit(m_palram[offset].r), pal3bit(m_palram[offset].g), pal3bit(m_palram[offset].b));
}
@@ -1294,6 +1305,7 @@ void pc8801_state::pc8801_dmac_mode_w(uint8_t data)
m_dmac_mode = data;
m_dmac_ff = 0;
+ // Valis II sets 0x20
if(data != 0xe4 && data != 0xa0 && data != 0xc4 && data != 0x80 && data != 0x00)
printf("%02x DMAC mode\n",data);
}
@@ -1333,10 +1345,13 @@ void pc8801_state::pc8801_alu_ctrl2_w(uint8_t data)
m_alu_ctrl2 = data;
}
+// TODO: Implement PCG-8100 as a bus option
+// It's an HAL Laboratory custom board with PCG (maps to chars $80-$ff),
+// dual AY-3-891x & PIT, I/O $b0-$b2 is the I/O ID for it?
+// Find a supported SW (only HAL seems to support it) & investigate
void pc8801_state::pc8801_pcg8100_w(offs_t offset, uint8_t data)
{
- if(data)
- printf("Write to PCG-8100 %02x %02x\n",offset,data);
+ logerror("%s: Possible write to PCG-8100 %02x %02x\n", machine().describe_context(), offset, data);
}
void pc8801_state::pc8801_txt_cmt_ctrl_w(uint8_t data)
@@ -1615,7 +1630,8 @@ void pc8801_state::pc8801fdc_mem(address_map &map)
TIMER_CALLBACK_MEMBER(pc8801_state::pc8801fd_upd765_tc_to_zero)
{
- //printf("0\n");
+ // TODO: holein1 explictly reads TC port at PC=504e followed by an HALT opcode, failing to boot
+ // is this gonna unbreak HALT state too?
m_fdc->tc_w(false);
}
@@ -1629,10 +1645,13 @@ uint8_t pc8801_state::upd765_tc_r()
{
//printf("%04x 1\n",m_fdccpu->pc());
- m_fdc->tc_w(true);
- //TODO: I'm not convinced that this works correctly with current hook-up ... 1000 usec is needed by Aploon, a bigger value breaks Alpha.
- //OTOH, 50 seems more than enough for the new upd...
- m_pc8801fd_upd765_tc_to_zero.call_after(attotime::from_usec(50));
+ if (!machine().side_effects_disabled())
+ {
+ m_fdc->tc_w(true);
+ //TODO: I'm not convinced that this works correctly with current hook-up ... 1000 usec is needed by Aploon, a bigger value breaks Alpha.
+ //OTOH, 50 seems more than enough for the new upd...
+ m_pc8801fd_upd765_tc_to_zero.call_after(attotime::from_usec(50));
+ }
return 0xff; // value is meaningless
}
@@ -1662,6 +1681,13 @@ void pc8801_state::pc8801fdc_io(address_map &map)
map(0xfc, 0xff).rw("d8255_slave", FUNC(i8255_device::read), FUNC(i8255_device::write));
}
+void pc8801_state::opna_map(address_map &map)
+{
+ // TODO: confirm it really is ROMless
+ // TODO: confirm size
+ map(0x000000, 0x1fffff).ram();
+}
+
/* Input Ports */
/* 2008-05 FP:
@@ -2380,17 +2406,27 @@ void pc8801_state::pc8801(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
+
+ // TODO: sound irqs goes different routes when both boards are installed
YM2203(config, m_opn, MASTER_CLOCK);
m_opn->irq_handler().set(FUNC(pc8801_state::pc8801_sound_irq));
m_opn->port_a_read_callback().set(FUNC(pc8801_state::opn_porta_r));
m_opn->port_b_read_callback().set(FUNC(pc8801_state::opn_portb_r));
- m_opn->add_route(ALL_OUTPUTS, "mono", 1.00);
+ // TODO: handtune mixing
+ m_opn->add_route(0, "mono", 0.25);
+ m_opn->add_route(1, "mono", 0.25);
+ m_opn->add_route(2, "mono", 0.25);
+ m_opn->add_route(3, "mono", 0.25);
YM2608(config, m_opna, MASTER_CLOCK*2);
+ m_opna->set_addrmap(0, &pc8801_state::opna_map);
m_opna->irq_handler().set(FUNC(pc8801_state::pc8801_sound_irq));
m_opna->port_a_read_callback().set(FUNC(pc8801_state::opn_porta_r));
m_opna->port_b_read_callback().set(FUNC(pc8801_state::opn_portb_r));
- m_opna->add_route(ALL_OUTPUTS, "mono", 1.00);
+ // TODO: handtune mixing
+ m_opna->add_route(0, "mono", 0.25);
+ m_opna->add_route(1, "mono", 0.25);
+ m_opna->add_route(2, "mono", 0.25);
BEEP(config, m_beeper, 2400).add_route(ALL_OUTPUTS, "mono", 0.10);
@@ -2415,15 +2451,7 @@ void pc8801_state::pc8801mc(machine_config &config)
MCFG_MACHINE_RESET_OVERRIDE(pc8801_state, pc8801_cdrom )
}
-
-/* TODO: clean this up */
-#define PC8801_MEM_LOAD \
- ROM_REGION( 0x100000, "opna", ROMREGION_ERASE00 )
-
-
ROM_START( pc8801 )
- PC8801_MEM_LOAD
-
ROM_REGION( 0x8000, "n80rom", ROMREGION_ERASEFF ) // 1.2
ROM_LOAD( "n80.rom", 0x0000, 0x8000, CRC(5cb8b584) SHA1(063609dd518c124a4fc9ba35d1bae35771666a34) )
@@ -2444,8 +2472,6 @@ ROM_END
/* The dump only included "maincpu". Other roms arbitrariely taken from PC-8801 & PC-8801 MkIISR (there should be
at least 1 Kanji ROM). */
ROM_START( pc8801mk2 )
- PC8801_MEM_LOAD
-
ROM_REGION( 0x8000, "n80rom", ROMREGION_ERASEFF ) // 1.4
ROM_LOAD( "m2_n80.rom", 0x0000, 0x8000, CRC(91d84b1a) SHA1(d8a1abb0df75936b3fc9d226ccdb664a9070ffb1) )
@@ -2464,8 +2490,6 @@ ROM_START( pc8801mk2 )
ROM_END
ROM_START( pc8801mk2sr )
- PC8801_MEM_LOAD
-
ROM_REGION( 0x8000, "n80rom", ROMREGION_ERASEFF ) // 1.5
ROM_LOAD( "mk2sr_n80.rom", 0x0000, 0x8000, CRC(27e1857d) SHA1(5b922ed9de07d2a729bdf1da7b57c50ddf08809a) )
@@ -2492,8 +2516,6 @@ ROM_START( pc8801mk2sr )
ROM_END
ROM_START( pc8801mk2fr )
- PC8801_MEM_LOAD
-
ROM_REGION( 0x8000, "n80rom", ROMREGION_ERASEFF ) // 1.5
ROM_LOAD( "m2fr_n80.rom", 0x0000, 0x8000, CRC(27e1857d) SHA1(5b922ed9de07d2a729bdf1da7b57c50ddf08809a) )
@@ -2519,8 +2541,6 @@ ROM_START( pc8801mk2fr )
ROM_END
ROM_START( pc8801mk2mr )
- PC8801_MEM_LOAD
-
ROM_REGION( 0x8000, "n80rom", ROMREGION_ERASEFF ) // 1.8
ROM_LOAD( "m2mr_n80.rom", 0x0000, 0x8000, CRC(f074b515) SHA1(ebe9cf4cf57f1602c887f609a728267f8d953dce) )
@@ -2547,8 +2567,6 @@ ROM_START( pc8801mk2mr )
ROM_END
ROM_START( pc8801mh )
- PC8801_MEM_LOAD
-
ROM_REGION( 0x8000, "n80rom", ROMREGION_ERASEFF ) // 1.8, but different BIOS code?
ROM_LOAD( "mh_n80.rom", 0x0000, 0x8000, CRC(8a2a1e17) SHA1(06dae1db384aa29d81c5b6ed587877e7128fcb35) )
@@ -2575,8 +2593,6 @@ ROM_START( pc8801mh )
ROM_END
ROM_START( pc8801fa )
- PC8801_MEM_LOAD
-
ROM_REGION( 0x8000, "n80rom", ROMREGION_ERASEFF ) // 1.8, but different BIOS code?
ROM_LOAD( "fa_n80.rom", 0x0000, 0x8000, CRC(8a2a1e17) SHA1(06dae1db384aa29d81c5b6ed587877e7128fcb35) )
@@ -2603,8 +2619,6 @@ ROM_START( pc8801fa )
ROM_END
ROM_START( pc8801ma ) // newer floppy BIOS and Jisyo (dictionary) ROM
- PC8801_MEM_LOAD
-
ROM_REGION( 0x8000, "n80rom", ROMREGION_ERASEFF ) // 1.8, but different BIOS code?
ROM_LOAD( "ma_n80.rom", 0x0000, 0x8000, CRC(8a2a1e17) SHA1(06dae1db384aa29d81c5b6ed587877e7128fcb35) )
@@ -2635,8 +2649,6 @@ ROM_START( pc8801ma ) // newer floppy BIOS and Jisyo (dictionary) ROM
ROM_END
ROM_START( pc8801ma2 )
- PC8801_MEM_LOAD
-
ROM_REGION( 0x8000, "n80rom", ROMREGION_ERASEFF ) // 1.8
ROM_LOAD( "ma2_n80.rom", 0x0000, 0x8000, CRC(8a2a1e17) SHA1(06dae1db384aa29d81c5b6ed587877e7128fcb35) )
@@ -2666,8 +2678,6 @@ ROM_START( pc8801ma2 )
ROM_END
ROM_START( pc8801mc )
- PC8801_MEM_LOAD
-
ROM_REGION( 0x08000, "n80rom", ROMREGION_ERASEFF ) // 1.8
ROM_LOAD( "mc_n80.rom", 0x0000, 0x8000, CRC(8a2a1e17) SHA1(06dae1db384aa29d81c5b6ed587877e7128fcb35) )
diff --git a/src/mame/drivers/pc9801.cpp b/src/mame/drivers/pc9801.cpp
index 23794710e94..cbe0fc87694 100644
--- a/src/mame/drivers/pc9801.cpp
+++ b/src/mame/drivers/pc9801.cpp
@@ -4,25 +4,67 @@
PC-9801 (c) 1981 NEC
- driver by Angelo Salese
-
TODO:
- proper 8251 uart hook-up on keyboard;
- - SASI/SCSI support;
- - Finish DIP-Switches support;
- - text scrolling, upd52611 (cfr. clipping in edge & arcus2, madoum* too?);
- - AGDC emulation, upd72120;
- - CMT support (-13/-36 cbus only, identify which models mounted it off the bat);
- - Write a PC80S31K device for 2d type floppies
- (also used on PC-8801 and PC-88VA, it's the FDC + Z80 sub-system);
+ - text scrolling, μPD52611 (cfr. clipping in edge & arcus2, madoum* too?);
+ - Abnormal 90 Hz refresh rate adjust for normal display mode (15KHz).
+ Should really be 61.xx instead, understand how CRTC really switches clock;
+ - AGDC emulation, μPD72120;
+ - GP-IB emulation, μPD7210;
- DAC1BIT has a bit of clicking with start/end of samples, is it fixable or just a btanb?
- - clean-ups & split into separate devices and driver flavours;
- - derive romsets by default options (cfr. 3.5 2HD floppies vs. default 5.25, 2D/2DD etc.);
+ - Write a PC80S31K device for 2d type floppies
+ (also used on PC-6601SR, PC-8801 and PC-88VA, it's the FDC + Z80 sub-system);
+ - FDC (note: epdiag FDC test looks a good candidate for all this):
+ - Has on board dip-switches, we currently just return 2HD/2DD autodetect;
+ - 3'5 floppy disks don't load at all ($4be I/O port is the extra accessor);
+ - fix FDC duplication: according to docs I/O ports $90-$95 are basically mirrors
+ with a subset of the drive related flags.
+ Sounds like a afterthought of having 2HD/2DD separate boards from vanilla class;
+ - Move vanilla FDC 2HD/2DD to a separate (legacy?) bus, and split pc9801f (default: 2DD)
+ from pc9801m (2HD) and vanilla pc9801 (none);
+ - floppy sounds never silences when drive is idle (disabled for the time being);
+ - epdiag throws ID invalid when run with PORT EXC on (DIP-SW 3-1 -> 0);
+ - CMT support (-03/-13/-36 i/f or cbus only, supported by i86/V30 fully compatible machines
+ only);
+ - SASI/SCSI support (fully supported by now?);
+ - IDE sports an hack to not make 512 to 256 sector byte translations.
+ Apparently a SDIP setting is responsible for this?
- Remove kludge for POR bit in a20_ctrl_w fn;
- - floppy sounds never silences when drive is idle (disabled for the time being);
+ - I/O:
+ - HW Dip-switches (where applicable) needs a serious clean-up and naming/position
+ fixing in some cases;
+ - Export mouse support to an actual PC9871 device;
+ - Implement IF-SEGA/98 support (Sega Saturn peripheral compatibility for Windows,
+ available DOS C snippet clearly shows reading in direct mode, an actual SMPC
+ sub-device sounds unlikely but possible);
+ - Incomplete SDIP support:
+ - SDIP never returns a valid state and returns default values even if machine is
+ soft resetted. By logic should read-back the already existing state, instead
+ all machines just returns a "set SDIP" warning message at POST no matter what;
+ - SDIP bank hookup is different across machines, either unmapped or diverging
+ implementation wise both in port select and behaviour;
+ - In theory SDIP can be initialized via a BIOS menu, callable by holding down
+ HELP key at POST. This actually doesn't work for any machine, is it expected to
+ have key repeat support? Later BIOSes actually have strings for an extended menu
+ with 3 or 4 pages strings, may be also requiring a jump/bankswitch to unmapped area?
+ - Expose SDIP to an actual device_nvram_interface;
+ - Derive defaults off what the model sets up at POST;
+ - clean-up functions/variables naming by actual documentation nomenclature;
+ - derive machine configs & romsets by actual default options, examples:
+ - 3.5 built-in floppy drives vs. default 5.25;
+ - separate pc9801f (2DD) available romset to pc9801 (none) & pc9801m (2HD), and
+ remove the correlated machine config option;
+ - cbus available number of slots & built-in or provided boards;
+ - separate machines HDD hooks by SASI/SCSI/IDE;
+ - load actual IDE bioses from IPL romsets where applicable
+ (late era 9801 and 9821 class machines);
+ - pinpoint machines that uses GRCG instead of EGC, we are currently too lenient and support
+ latter on most (use dbuster and hypbingo to checkout);
+ - Improve opacity of video flip/flop registers, consider using an address space instead of
+ current array format;
TODO (PC-9801F)
- - kanji port 0xa9 readback is broken for several games (balpower, lovelyho).
+ - it currently hooks up half size kanji ROMs, causing missing text in many games;
TODO (PC-9801RS):
- several unemulated extra f/f features;
@@ -30,32 +72,19 @@
- Several games hangs with stuck note by misfired/not catched up -26 / -86 irq;
- clean-up duplicate code;
- TODO (PC-9821):
- - fix CPU for some clones;
- - "cache error"
- - undumped IDE ROM, kludged to work;
-
- TODO (PC-9821AS)
- - IPL ROM banking contradicts greatly from the other machines;
-
- TODO (PC-386M):
- - "ERR:BR" at boot (BIOS loader error).
- Executes some code in text VRAM area (PC=$a006e), trying to setup a writeable RAM bank
- (shadow RAM even?) to IPL window, I/O $c06 seems to be the control port for it;
-
- TODO: (PC-486SE/PC-486MU):
- - Verify ROM bankswitch;
- On PC-486SE sets up what is normally IPL bankswitch at PC=0xf5115, successive opcode
- is a jmp 0xf8000, pretty unlikely it delays bankswitch so assume it reloads
- the same bank.
- - Fix POR/ROM bankswitch on soft resets.
- - Eventually errors with a ERR:VR (GFX VRAM);
+ TODO (PC-9801RX?):
+ - Identify model type, it clearly accesses PCI, the extended 3'5 floppy I/O at 0x4be and
+ it's not a 286 CPU;
+ - Floppy boot fails;
- TODO: (PC-9821AP)
- - No way to exit the initial loop. Code looks broken, bad dump?
+ TODO (PC-9801US):
+ - "Invalid Command Byte 13" for bitmap upd7220 at POST (?)
+ - "SYSTEM SHUTDOWN" after BIOS sets up the SDIP values;
- TODO: (PC-9821Xa16/PC-9821Ra20/PC-9821Ra333)
- - "MICON ERROR" at POST (generic HW fault, PCI?);
+ TODO (PC-9801BX2)
+ - "SYSTEM SHUTDOWN" at POST, a soft reset fixes it?
+ - A non-fatal "MEMORY ERROR" is always thrown no matter the RAM size afterwards, related?
+ - unemulated conventional or EMS RAM bank, definitely should have one given the odd minimum RAM size;
===================================================================================================
@@ -239,9 +268,6 @@
For more info (e.g. optional hardware), see http://www.geocities.jp/retro_zzz/machines/nec/9801/mdl98cpu.html
- Epson Series
- http://www.pc-9800.net/db_epson/desk_index.htm
-
PC-9821 Series
PC-9821 (1992) - aka 98MULTi, desktop computer, 386 based
@@ -332,7 +358,7 @@ Keyboard TX commands:
#include "includes/pc9801.h"
#include "machine/input_merger.h"
-void pc9801_state::rtc_w(uint8_t data)
+void pc98_base_state::rtc_w(uint8_t data)
{
m_rtc->c0_w((data & 0x01) >> 0);
m_rtc->c1_w((data & 0x02) >> 1);
@@ -350,7 +376,7 @@ void pc9801_state::dmapg4_w(offs_t offset, uint8_t data)
m_dma_offset[(offset+1) & 3] = data & 0x0f;
}
-void pc9801_state::dmapg8_w(offs_t offset, uint8_t data)
+void pc9801vm_state::dmapg8_w(offs_t offset, uint8_t data)
{
if(offset == 4)
m_dma_autoinc[data & 3] = (data >> 2) & 3;
@@ -368,12 +394,12 @@ void pc9801_state::vrtc_clear_w(uint8_t data)
m_pic1->ir2_w(0);
}
-uint8_t pc9801_state::fdc_2hd_ctrl_r()
+u8 pc9801_state::fdc_2hd_ctrl_r()
{
- return 0x44; //unknown port meaning 2hd flag?
+ return 0x44;
}
-void pc9801_state::fdc_2hd_ctrl_w(uint8_t data)
+void pc9801_state::fdc_2hd_ctrl_w(u8 data)
{
//logerror("%02x ctrl\n",data);
m_fdc_2hd->reset_w(BIT(data, 7));
@@ -392,19 +418,28 @@ void pc9801_state::fdc_2hd_ctrl_w(uint8_t data)
m_fdc_2hd->subdevice<floppy_connector>("0")->get_device()->mon_w(data & 8 ? ASSERT_LINE : CLEAR_LINE);
m_fdc_2hd->subdevice<floppy_connector>("1")->get_device()->mon_w(data & 8 ? ASSERT_LINE : CLEAR_LINE);
}
- else if(!(m_fdc_ctrl & 4)) // required for 9821
- {
- m_fdc_2hd->subdevice<floppy_connector>("0")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
- m_fdc_2hd->subdevice<floppy_connector>("1")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
- }
}
+bool pc9801_state::fdc_drive_ready_r(upd765a_device *fdc)
+{
+ floppy_image_device *floppy0 = fdc->subdevice<floppy_connector>("0")->get_device();
+ floppy_image_device *floppy1 = fdc->subdevice<floppy_connector>("1")->get_device();
+
+ return (!floppy0->ready_r() || !floppy1->ready_r());
+}
uint8_t pc9801_state::fdc_2dd_ctrl_r()
{
- int ret = (!m_fdc_2dd->subdevice<floppy_connector>("0")->get_device()->ready_r()) ? 0x10 : 0;
- ret |= (m_fdc_2dd->subdevice<floppy_connector>("1")->get_device()->ready_r()) ? 0x10 : 0;
- return ret | 0x40; //unknown port meaning, might be 0x70
+ u8 ret = 0;
+
+ // 2dd BIOS specifically tests if a disk is in any drive
+ // (does not happen on 2HD standalone)
+ ret |= fdc_drive_ready_r(m_fdc_2dd) << 4;
+
+ //popmessage("%d %d %02x", floppy0->ready_r(), floppy1->ready_r(), ret);
+
+ // TODO: dips et al.
+ return ret | 0x40;
}
void pc9801_state::fdc_2dd_ctrl_w(uint8_t data)
@@ -417,7 +452,7 @@ void pc9801_state::fdc_2dd_ctrl_w(uint8_t data)
m_fdc_2dd->subdevice<floppy_connector>("1")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
}
-uint8_t pc9801_state::ide_ctrl_r()
+u8 pc9801vm_state::ide_ctrl_r()
{
address_space &ram = m_maincpu->space(AS_PROGRAM);
// this makes the ide driver not do 512 to 256 byte sector translation, the 9821 looks for bit 6 of offset 0xac403 of the kanji ram to set this, the rs unknown
@@ -425,28 +460,28 @@ uint8_t pc9801_state::ide_ctrl_r()
return m_ide_sel;
}
-void pc9801_state::ide_ctrl_w(uint8_t data)
+void pc9801vm_state::ide_ctrl_w(u8 data)
{
if(!(data & 0x80))
m_ide_sel = data & 1;
}
-uint16_t pc9801_state::ide_cs0_r(offs_t offset, uint16_t mem_mask)
+uint16_t pc9801vm_state::ide_cs0_r(offs_t offset, uint16_t mem_mask)
{
return m_ide[m_ide_sel]->cs0_r(offset, mem_mask);
}
-void pc9801_state::ide_cs0_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+void pc9801vm_state::ide_cs0_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
m_ide[m_ide_sel]->cs0_w(offset, data, mem_mask);
}
-uint16_t pc9801_state::ide_cs1_r(offs_t offset, uint16_t mem_mask)
+uint16_t pc9801vm_state::ide_cs1_r(offs_t offset, uint16_t mem_mask)
{
return m_ide[m_ide_sel]->cs1_r(offset, mem_mask);
}
-void pc9801_state::ide_cs1_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+void pc9801vm_state::ide_cs1_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
m_ide[m_ide_sel]->cs1_w(offset, data, mem_mask);
}
@@ -486,7 +521,7 @@ WRITE_LINE_MEMBER( pc9801_state::write_sasi_io )
{
m_sasi_data_out->write(0);
}
- if((m_sasi_ctrl_in->read() & 0x9C) == 0x8C)
+ if((m_sasi_ctrl_in->read() & 0x9c) == 0x8c)
m_pic2->ir1_w(m_sasi_ctrl & 1);
else
m_pic2->ir1_w(0);
@@ -569,13 +604,14 @@ uint8_t pc9801_state::f0_r(offs_t offset)
if(offset == 0)
{
// iterate thru all devices to check if an AMD98 is present
+ // TODO: move to cbus
for (pc9801_amd98_device &amd98 : device_type_enumerator<pc9801_amd98_device>(machine().root_device()))
{
- logerror("Read AMD98 ID %s\n",amd98.tag());
+ logerror("%s: Read AMD98 ID %s\n", machine().describe_context(), amd98.tag());
return 0x18; // return the right ID
}
- logerror("Read port 0 from 0xf0 (AMD98 check?)\n");
+ logerror("%s: Read port 0 from 0xf0 (AMD98 check?)\n", machine().describe_context());
return 0; // card not present
}
@@ -595,7 +631,7 @@ void pc9801_state::pc9801_map(address_map &map)
/* first device is even offsets, second one is odd offsets */
void pc9801_state::pc9801_common_io(address_map &map)
{
- map.unmap_value_high();
+// map.unmap_value_high();
map(0x0000, 0x001f).rw(m_dmac, FUNC(am9517a_device::read), FUNC(am9517a_device::write)).umask16(0xff00);
map(0x0000, 0x001f).rw(FUNC(pc9801_state::pic_r), FUNC(pc9801_state::pic_w)).umask16(0x00ff); // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
map(0x0020, 0x002f).w(FUNC(pc9801_state::rtc_w)).umask16(0x00ff);
@@ -603,17 +639,14 @@ void pc9801_state::pc9801_common_io(address_map &map)
map(0x0040, 0x0047).rw(m_ppi_prn, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff);
map(0x0040, 0x0047).rw(m_keyb, FUNC(pc9801_kbd_device::rx_r), FUNC(pc9801_kbd_device::tx_w)).umask16(0xff00); //i8255 printer port / i8251 keyboard
map(0x0050, 0x0057).rw("ppi8255_fdd", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0xff00);
- map(0x0050, 0x0057).w(FUNC(pc9801_state::nmi_ctrl_w)).umask16(0x00ff); // NMI FF / i8255 floppy port (2d?)
- map(0x0060, 0x0063).rw(m_hgdc1, FUNC(upd7220_device::read), FUNC(upd7220_device::write)).umask16(0x00ff); //upd7220 character ports / <undefined>
+ map(0x0050, 0x0053).w(FUNC(pc9801_state::nmi_ctrl_w)).umask16(0x00ff); // NMI FF / i8255 floppy port (2d?)
+ map(0x0060, 0x0063).rw(m_hgdc[0], FUNC(upd7220_device::read), FUNC(upd7220_device::write)).umask16(0x00ff); //upd7220 character ports / <undefined>
map(0x0064, 0x0064).w(FUNC(pc9801_state::vrtc_clear_w));
// map(0x006c, 0x006f) border color / <undefined>
- map(0x0070, 0x007f).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0xff00);
+ map(0x0070, 0x007f).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0xff00);
map(0x0070, 0x007f).rw(FUNC(pc9801_state::txt_scrl_r), FUNC(pc9801_state::txt_scrl_w)).umask16(0x00ff); //display registers / i8253 pit
- map(0x0090, 0x0090).r(m_fdc_2hd, FUNC(upd765a_device::msr_r));
- map(0x0092, 0x0092).rw(m_fdc_2hd, FUNC(upd765a_device::fifo_r), FUNC(upd765a_device::fifo_w));
- map(0x0094, 0x0094).rw(FUNC(pc9801_state::fdc_2hd_ctrl_r), FUNC(pc9801_state::fdc_2hd_ctrl_w));
map(0x0090, 0x0093).rw(m_sio, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0xff00);
- map(0x7fd8, 0x7fdf).rw("ppi8255_mouse", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0xff00);
+ map(0x7fd8, 0x7fdf).rw(m_ppi_mouse, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0xff00);
}
void pc9801_state::pc9801_io(address_map &map)
@@ -623,6 +656,9 @@ void pc9801_state::pc9801_io(address_map &map)
map(0x0068, 0x0068).w(FUNC(pc9801_state::pc9801_video_ff_w)); //mode FF / <undefined>
map(0x0080, 0x0080).rw(FUNC(pc9801_state::sasi_data_r), FUNC(pc9801_state::sasi_data_w));
map(0x0082, 0x0082).rw(FUNC(pc9801_state::sasi_status_r), FUNC(pc9801_state::sasi_ctrl_w));
+ map(0x0090, 0x0090).r(m_fdc_2hd, FUNC(upd765a_device::msr_r));
+ map(0x0092, 0x0092).rw(m_fdc_2hd, FUNC(upd765a_device::fifo_r), FUNC(upd765a_device::fifo_w));
+ map(0x0094, 0x0094).rw(FUNC(pc9801_state::fdc_2hd_ctrl_r), FUNC(pc9801_state::fdc_2hd_ctrl_w));
map(0x00a0, 0x00af).rw(FUNC(pc9801_state::pc9801_a0_r), FUNC(pc9801_state::pc9801_a0_w)); //upd7220 bitmap ports / display registers
map(0x00c8, 0x00cb).m(m_fdc_2dd, FUNC(upd765a_device::map)).umask16(0x00ff);
map(0x00cc, 0x00cc).rw(FUNC(pc9801_state::fdc_2dd_ctrl_r), FUNC(pc9801_state::fdc_2dd_ctrl_w)); //upd765a 2dd / <undefined>
@@ -635,9 +671,9 @@ void pc9801_state::pc9801_io(address_map &map)
*
************************************/
-/* TODO: it's possible that the offset calculation is actually linear. */
-/* TODO: having this non-linear makes the system to boot in BASIC for PC-9821. Perhaps it stores settings? How to change these? */
-uint8_t pc9801_state::pc9801rs_knjram_r(offs_t offset)
+// TODO: it's possible that the offset calculation is actually linear.
+// TODO: having this non-linear makes the system to boot in BASIC for PC-9821. Perhaps it stores settings? How to change these?
+uint8_t pc9801vm_state::pc9801rs_knjram_r(offs_t offset)
{
uint32_t pcg_offset;
@@ -651,18 +687,21 @@ uint8_t pc9801_state::pc9801rs_knjram_r(offs_t offset)
return m_char_rom[(m_font_addr >> 8) * (8 << char_size) + (char_size * 0x800) + ((offset >> 1) & 0xf)];
}
- /* TODO: investigate on this difference */
if((m_font_addr & 0xff00) == 0x5600 || (m_font_addr & 0xff00) == 0x5700)
return m_kanji_rom[pcg_offset];
+ // TODO: do we really need to recalculate?
pcg_offset = (m_font_addr & 0x7fff) << 5;
- pcg_offset|= offset & 0x1f;
-// pcg_offset|= m_font_lr;
+ pcg_offset|= (offset & 0x1e);
+ // telenetm defintely needs this for 8x16 romaji title songs, otherwise it blanks them out
+ // (pc9801vm never reads this area btw)
+ pcg_offset|= (offset & m_font_lr) & 1;
+// pcg_offset|= (m_font_lr);
return m_kanji_rom[pcg_offset];
}
-void pc9801_state::pc9801rs_knjram_w(offs_t offset, uint8_t data)
+void pc9801vm_state::pc9801rs_knjram_w(offs_t offset, uint8_t data)
{
uint32_t pcg_offset;
@@ -677,8 +716,7 @@ void pc9801_state::pc9801rs_knjram_w(offs_t offset, uint8_t data)
}
}
-/* FF-based */
-void pc9801_state::pc9801rs_bank_w(offs_t offset, uint8_t data)
+void pc9801vm_state::pc9801rs_bank_w(offs_t offset, uint8_t data)
{
if(offset == 1)
{
@@ -704,7 +742,7 @@ void pc9801_state::pc9801rs_bank_w(offs_t offset, uint8_t data)
}
}
-uint8_t pc9801_state::a20_ctrl_r(offs_t offset)
+uint8_t pc9801vm_state::a20_ctrl_r(offs_t offset)
{
if(offset == 0x01)
return (m_gate_a20 ^ 1) | 0xfe;
@@ -714,7 +752,7 @@ uint8_t pc9801_state::a20_ctrl_r(offs_t offset)
return f0_r(offset);
}
-void pc9801_state::a20_ctrl_w(offs_t offset, uint8_t data)
+void pc9801vm_state::a20_ctrl_w(offs_t offset, uint8_t data)
{
if(offset == 0x00)
{
@@ -777,11 +815,32 @@ void pc9801_state::grcg_w(offs_t offset, uint8_t data)
txt_scrl_w(offset,data);
}
-void pc9801_state::egc_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+void pc9801vm_state::pc9801rs_a0_w(offs_t offset, uint8_t data)
{
- if(!m_ex_video_ff[2])
+ if((offset & 1) == 0 && offset & 8 && m_ex_video_ff[ANALOG_16_MODE])
+ {
+ switch(offset)
+ {
+ case 0x08: m_analog16.pal_entry = data & 0xf; break;
+ case 0x0a: m_analog16.g[m_analog16.pal_entry] = data & 0xf; break;
+ case 0x0c: m_analog16.r[m_analog16.pal_entry] = data & 0xf; break;
+ case 0x0e: m_analog16.b[m_analog16.pal_entry] = data & 0xf; break;
+ }
+
+ m_palette->set_pen_color(
+ m_analog16.pal_entry + 0x10,
+ pal4bit(m_analog16.r[m_analog16.pal_entry]),
+ pal4bit(m_analog16.g[m_analog16.pal_entry]),
+ pal4bit(m_analog16.b[m_analog16.pal_entry])
+ );
return;
+ }
+
+ pc9801_a0_w(offset,data);
+}
+void pc9801vm_state::egc_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
if(!(m_egc.regs[1] & 0x6000) || (offset != 4)) // why?
COMBINE_DATA(&m_egc.regs[offset]);
switch(offset)
@@ -795,69 +854,141 @@ void pc9801_state::egc_w(offs_t offset, uint16_t data, uint16_t mem_mask)
}
}
-uint8_t pc9801_state::fdc_mode_ctrl_r()
+uint16_t pc9801vm_state::grcg_gvram_r(offs_t offset, uint16_t mem_mask)
{
- return (m_fdc_ctrl & 3) | 0xf0 | 8 | 4;
+ uint16_t ret = upd7220_grcg_r((offset + 0x4000) | (m_vram_bank << 16), mem_mask);
+ return bitswap<16>(ret,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7);
}
-void pc9801_state::fdc_mode_ctrl_w(uint8_t data)
+void pc9801vm_state::grcg_gvram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
- /*
- ---- x--- ready line?
- ---- --x- select type (1) 2hd (0) 2dd
- ---- ---x select irq
- */
+ data = bitswap<16>(data,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7);
+ upd7220_grcg_w((offset + 0x4000) | (m_vram_bank << 16), data, mem_mask);
+}
- m_fdc_2hd->subdevice<floppy_connector>("0")->get_device()->set_rpm(data & 0x02 ? 360 : 300);
- m_fdc_2hd->subdevice<floppy_connector>("1")->get_device()->set_rpm(data & 0x02 ? 360 : 300);
+uint16_t pc9801vm_state::grcg_gvram0_r(offs_t offset, uint16_t mem_mask)
+{
+ uint16_t ret = upd7220_grcg_r(offset | (m_vram_bank << 16), mem_mask);
+ return bitswap<16>(ret,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7);
+}
- m_fdc_2hd->set_rate(data & 0x02 ? 500000 : 250000);
+void pc9801vm_state::grcg_gvram0_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ data = bitswap<16>(data,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7);
+ upd7220_grcg_w(offset | (m_vram_bank << 16), data, mem_mask);
+}
- m_fdc_ctrl = data;
- //if(data & 0xfc)
- // logerror("FDC ctrl called with %02x\n",data);
+/*
+ * FDC MODE control
+ *
+ * ???? ---- <undefined>
+ * ---- x--- (r/o) DIP-SW 3-2 built-in FDC spec (1) OFF 2HD (0) ON 2DD
+ * ---- -x-- (r) DIP-SW 3-1 FDC FIXed mode (1) ON
+ * (w) Enable motor ON (1) defined by 0x94 bit 3 (0) always on
+ * ---- --x- (r/w) FDD EXC access mode status (1) 2HD (0) 2DD
+ * ---- ---x (r/w) PORT EXC I/F mode select (1) 2HD (0) 2DD
+ * (Disables I/O port access)
+ *
+ * NB: high-reso class diverges here:
+ * - XA/XL themselves have no way to access any of this;
+ * - post-XA/XL just has Enable motor ON writes;
+ */
+uint8_t pc9801vm_state::fdc_mode_r()
+{
+ return (m_fdc_mode & 3) | 0xf0 | (m_dsw3->read() & 3) << 2;
+}
+
+void pc9801vm_state::fdc_set_density_mode(bool is_2hd)
+{
+ floppy_image_device *floppy0 = m_fdc_2hd->subdevice<floppy_connector>("0")->get_device();
+ floppy_image_device *floppy1 = m_fdc_2hd->subdevice<floppy_connector>("1")->get_device();
+
+ floppy0->set_rpm(is_2hd ? 360 : 300);
+ floppy1->set_rpm(is_2hd ? 360 : 300);
+
+ m_fdc_2hd->set_rate(is_2hd ? 500000 : 250000);
+// printf("FDC set new mode %s\n", is_2hd ? "2HD" : "2DD");
+ logerror("%s: FDC set new mode %s\n", machine().describe_context(), is_2hd ? "2HD" : "2DD");
}
-#if 0
-uint8_t pc9801_state::pc9801rs_2dd_r()
+void pc9801vm_state::fdc_mode_w(uint8_t data)
{
-// if(m_fdc_ctrl & 1)
-// return 0xff;
+ const bool old_mode = bool(BIT(m_fdc_mode, 1));
+ const bool new_mode = bool(BIT(data, 1));
- if((offset & 1) == 0)
+ if (old_mode != new_mode)
+ fdc_set_density_mode(new_mode);
+
+ m_fdc_mode = data;
+
+ if(BIT(m_fdc_mode, 2))
{
- switch(offset & 6)
- {
- case 0: return m_fdc_2hd->msr_r();
- case 2: return m_fdc_2hd->fifo_r();
- case 4: return 0x44; //2dd flag
- }
+ m_fdc_2hd->subdevice<floppy_connector>("0")->get_device()->mon_w(CLEAR_LINE);
+ m_fdc_2hd->subdevice<floppy_connector>("1")->get_device()->mon_w(CLEAR_LINE);
}
- logerror("Read to undefined port [%02x]\n",offset+0x90);
+ //if(data & 0xfc)
+ // logerror("FDC ctrl called with %02x\n",data);
+}
- return 0xff;
+// TODO: undefined/disallow read/writes if I/F mode doesn't match
+// (and that applies to FDC mapping too!)
+// id port 0 -> 2DD
+// id port 1 -> 2HD
+template <unsigned port> u8 pc9801vm_state::fdc_2hd_2dd_ctrl_r()
+{
+ u8 res = fdc_2hd_ctrl_r();
+ if (port == 0)
+ {
+ res |= 0x20;
+ res |= fdc_drive_ready_r(m_fdc_2hd) << 4;
+ }
+ return res;
}
-void pc9801_state::pc9801rs_2dd_w(uint8_t data)
+void pc9801vm_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
-// if(m_fdc_ctrl & 1)
-// return;
+ switch (id)
+ {
+ case TIMER_FDC_TRIGGER:
+ // TODO: sorcer definitely expects this irq to be taken
+ if (bool(BIT(m_fdc_2hd_ctrl, 2)))
+ {
+ m_pic2->ir2_w(0);
+ m_pic2->ir2_w(1);
+ }
+ break;
+ }
+}
+
+template <unsigned port> void pc9801vm_state::fdc_2hd_2dd_ctrl_w(u8 data)
+{
+ bool prev_trig = false;
+ bool cur_trig = false;
- if((offset & 1) == 0)
+ if (port == 0 && bool(BIT(m_fdc_mode, 0)) == false)
{
- switch(offset & 6)
- {
- case 2: m_fdc_2hd->fifo_w(data); return;
- case 4: logerror("%02x 2DD FDC ctrl\n",data); return;
- }
+ prev_trig = bool(BIT(m_fdc_2hd_ctrl, 0));
+ cur_trig = bool(BIT(data, 0));
+ }
+
+ fdc_2hd_ctrl_w(data);
+
+ // TODO: Enable motor ON is reversed compared to the docs
+ if(!(m_fdc_mode & 4)) // required for 9821
+ {
+ m_fdc_2hd->subdevice<floppy_connector>("0")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
+ m_fdc_2hd->subdevice<floppy_connector>("1")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
}
- logerror("Write to undefined port [%02x] %02x\n",offset+0x90,data);
+ if (port == 0 && !prev_trig && cur_trig)
+ {
+ m_fdc_timer->reset();
+ m_fdc_timer->adjust(attotime::from_msec(100));
+ }
}
-#endif
-void pc9801_state::pc9801rs_video_ff_w(offs_t offset, uint8_t data)
+void pc9801vm_state::pc9801rs_video_ff_w(offs_t offset, uint8_t data)
{
if(offset == 1)
{
@@ -885,55 +1016,39 @@ void pc9801_state::pc9801rs_video_ff_w(offs_t offset, uint8_t data)
pc9801_video_ff_w(data);
}
-void pc9801_state::pc9801rs_a0_w(offs_t offset, uint8_t data)
+/*
+ * DMA access control (I/O $439)
+ *
+ * x--- ---- Mate A: Printer select (1) built-in (0) PC-9821-E02
+ * ^ on 98Fellow with 0 it disconnects the printer interface,
+ * ^ may still select anything but -E02?
+ * --?? ---- <unknown>
+ * ---- -x-- DMA address mask (1) inhibit DMA access for anything higher than 1MB
+ * ^ defaults to 0 on high-reso equipped machines (?), 1 otherwise
+ * ---- --x- Graph LIO BIOS select (?), on 9801VX21
+ * ---- ---x Mate A: selects high-reso mode
+ * ^ unknown otherwise
+ */
+u8 pc9801vm_state::dma_access_ctrl_r(offs_t offset)
{
- if((offset & 1) == 0 && offset & 8 && m_ex_video_ff[ANALOG_16_MODE])
- {
- switch(offset)
- {
- case 0x08: m_analog16.pal_entry = data & 0xf; break;
- case 0x0a: m_analog16.g[m_analog16.pal_entry] = data & 0xf; break;
- case 0x0c: m_analog16.r[m_analog16.pal_entry] = data & 0xf; break;
- case 0x0e: m_analog16.b[m_analog16.pal_entry] = data & 0xf; break;
- }
-
- m_palette->set_pen_color(
- m_analog16.pal_entry + 0x10,
- pal4bit(m_analog16.r[m_analog16.pal_entry]),
- pal4bit(m_analog16.g[m_analog16.pal_entry]),
- pal4bit(m_analog16.b[m_analog16.pal_entry])
- );
- return;
- }
-
- pc9801_a0_w(offset,data);
+ logerror("%s: DMA access control read\n", machine().describe_context());
+ return m_dma_access_ctrl;
}
-uint8_t pc9801_state::access_ctrl_r(offs_t offset)
+void pc9801vm_state::dma_access_ctrl_w(offs_t offset, u8 data)
{
- if(offset == 1)
- return m_access_ctrl;
-
- return 0xff;
+ logerror("%s: DMA access control write %02x\n", machine().describe_context(), data);
+ m_dma_access_ctrl = data;
}
-void pc9801_state::access_ctrl_w(offs_t offset, uint8_t data)
-{
- if(offset == 1)
- m_access_ctrl = data;
-}
+// ARTIC device
-void pc9801_state::pc9801rs_mouse_freq_w(offs_t offset, uint8_t data)
+uint16_t pc9801vm_state::timestamp_r(offs_t offset)
{
- /* TODO: bit 3 used */
- if(offset == 3)
- {
- m_mouse.freq_reg = data & 3;
- m_mouse.freq_index = 0;
- }
+ return (m_maincpu->total_cycles() >> (16 * offset));
}
-uint8_t pc9801_state::midi_r()
+uint8_t pc9801vm_state::midi_r()
{
/* unconnect, needed by Amaranth KH to boot */
return 0xff;
@@ -949,65 +1064,44 @@ void pc9801_state::pic_w(offs_t offset, uint8_t data)
((offset >= 4) ? m_pic2 : m_pic1)->write(offset & 3, data);
}
-uint16_t pc9801_state::grcg_gvram_r(offs_t offset, uint16_t mem_mask)
-{
- uint16_t ret = upd7220_grcg_r((offset + 0x4000) | (m_vram_bank << 16), mem_mask);
- return bitswap<16>(ret,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7);
-}
-
-void pc9801_state::grcg_gvram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- data = bitswap<16>(data,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7);
- upd7220_grcg_w((offset + 0x4000) | (m_vram_bank << 16), data, mem_mask);
-}
-
-uint16_t pc9801_state::grcg_gvram0_r(offs_t offset, uint16_t mem_mask)
-{
- uint16_t ret = upd7220_grcg_r(offset | (m_vram_bank << 16), mem_mask);
- return bitswap<16>(ret,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7);
-}
-
-void pc9801_state::grcg_gvram0_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- data = bitswap<16>(data,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7);
- upd7220_grcg_w(offset | (m_vram_bank << 16), data, mem_mask);
-}
-
void pc9801_state::ipl_bank(address_map &map)
{
map(0x00000, 0x2ffff).rom().region("ipl", 0);
}
-void pc9801_state::pc9801ux_map(address_map &map)
+void pc9801vm_state::pc9801ux_map(address_map &map)
{
- map(0x0a0000, 0x0a3fff).rw(FUNC(pc9801_state::tvram_r), FUNC(pc9801_state::tvram_w));
- map(0x0a4000, 0x0a4fff).rw(FUNC(pc9801_state::pc9801rs_knjram_r), FUNC(pc9801_state::pc9801rs_knjram_w));
- map(0x0a8000, 0x0bffff).rw(FUNC(pc9801_state::grcg_gvram_r), FUNC(pc9801_state::grcg_gvram_w));
- map(0x0e0000, 0x0e7fff).rw(FUNC(pc9801_state::grcg_gvram0_r), FUNC(pc9801_state::grcg_gvram0_w));
+ map(0x0a0000, 0x0a3fff).rw(FUNC(pc9801vm_state::tvram_r), FUNC(pc9801vm_state::tvram_w));
+ map(0x0a4000, 0x0a4fff).rw(FUNC(pc9801vm_state::pc9801rs_knjram_r), FUNC(pc9801vm_state::pc9801rs_knjram_w));
+ map(0x0a8000, 0x0bffff).rw(FUNC(pc9801vm_state::grcg_gvram_r), FUNC(pc9801vm_state::grcg_gvram_w));
+ map(0x0e0000, 0x0e7fff).rw(FUNC(pc9801vm_state::grcg_gvram0_r), FUNC(pc9801vm_state::grcg_gvram0_w));
map(0x0e8000, 0x0fffff).m(m_ipl, FUNC(address_map_bank_device::amap16));
}
-void pc9801_state::pc9801ux_io(address_map &map)
+void pc9801vm_state::pc9801ux_io(address_map &map)
{
- map.unmap_value_high();
+// map.unmap_value_high();
pc9801_common_io(map);
- map(0x0020, 0x002f).w(FUNC(pc9801_state::dmapg8_w)).umask16(0xff00);
- map(0x0050, 0x0057).noprw(); // 2dd ppi?
- map(0x005c, 0x005f).r(FUNC(pc9801_state::timestamp_r)).nopw(); // artic
- map(0x0068, 0x006b).w(FUNC(pc9801_state::pc9801rs_video_ff_w)).umask16(0x00ff); //mode FF / <undefined>
- map(0x0070, 0x007f).rw(FUNC(pc9801_state::grcg_r), FUNC(pc9801_state::grcg_w)).umask16(0x00ff); //display registers "GRCG" / i8253 pit
- map(0x00a0, 0x00af).rw(FUNC(pc9801_state::pc9801_a0_r), FUNC(pc9801_state::pc9801rs_a0_w)); //upd7220 bitmap ports / display registers
- map(0x00bc, 0x00bf).rw(FUNC(pc9801_state::fdc_mode_ctrl_r), FUNC(pc9801_state::fdc_mode_ctrl_w));
+ map(0x0020, 0x002f).w(FUNC(pc9801vm_state::dmapg8_w)).umask16(0xff00);
+// map(0x0050, 0x0057).noprw(); // 2dd ppi?
+ map(0x005c, 0x005f).r(FUNC(pc9801vm_state::timestamp_r)).nopw(); // artic
+ map(0x0068, 0x006b).w(FUNC(pc9801vm_state::pc9801rs_video_ff_w)).umask16(0x00ff); //mode FF / <undefined>
+ map(0x0070, 0x007f).rw(FUNC(pc9801vm_state::grcg_r), FUNC(pc9801vm_state::grcg_w)).umask16(0x00ff); //display registers "GRCG" / i8253 pit
+ map(0x0090, 0x0090).r(m_fdc_2hd, FUNC(upd765a_device::msr_r));
+ map(0x0092, 0x0092).rw(m_fdc_2hd, FUNC(upd765a_device::fifo_r), FUNC(upd765a_device::fifo_w));
+ map(0x0094, 0x0094).rw(FUNC(pc9801vm_state::fdc_2hd_2dd_ctrl_r<1>), FUNC(pc9801vm_state::fdc_2hd_2dd_ctrl_w<1>));
+ map(0x00a0, 0x00af).rw(FUNC(pc9801vm_state::pc9801_a0_r), FUNC(pc9801vm_state::pc9801rs_a0_w)); //upd7220 bitmap ports / display registers
+ map(0x00be, 0x00be).rw(FUNC(pc9801vm_state::fdc_mode_r), FUNC(pc9801vm_state::fdc_mode_w));
map(0x00c8, 0x00cb).m(m_fdc_2hd, FUNC(upd765a_device::map)).umask16(0x00ff);
- map(0x00cc, 0x00cc).rw(FUNC(pc9801_state::fdc_2hd_ctrl_r), FUNC(pc9801_state::fdc_2hd_ctrl_w));
- map(0x00f0, 0x00ff).rw(FUNC(pc9801_state::a20_ctrl_r), FUNC(pc9801_state::a20_ctrl_w)).umask16(0x00ff);
- map(0x0438, 0x043b).rw(FUNC(pc9801_state::access_ctrl_r), FUNC(pc9801_state::access_ctrl_w));
- map(0x043c, 0x043f).w(FUNC(pc9801_state::pc9801rs_bank_w)); //ROM/RAM bank
- map(0x04a0, 0x04af).w(FUNC(pc9801_state::egc_w));
- map(0x3fd8, 0x3fdf).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0xff00);
+ map(0x00cc, 0x00cc).rw(FUNC(pc9801vm_state::fdc_2hd_2dd_ctrl_r<0>), FUNC(pc9801vm_state::fdc_2hd_2dd_ctrl_w<0>));
+ map(0x00f0, 0x00ff).rw(FUNC(pc9801vm_state::a20_ctrl_r), FUNC(pc9801vm_state::a20_ctrl_w)).umask16(0x00ff);
+ map(0x0439, 0x0439).rw(FUNC(pc9801vm_state::dma_access_ctrl_r), FUNC(pc9801vm_state::dma_access_ctrl_w));
+ map(0x043c, 0x043f).w(FUNC(pc9801vm_state::pc9801rs_bank_w)); //ROM/RAM bank
+ map(0x04a0, 0x04af).w(FUNC(pc9801vm_state::egc_w));
+ map(0x3fd8, 0x3fdf).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0xff00);
}
-void pc9801_state::pc9801rs_map(address_map &map)
+void pc9801vm_state::pc9801rs_map(address_map &map)
{
pc9801ux_map(map);
// map(0x0d8000, 0x0d9fff).rom().region("ide",0);
@@ -1016,226 +1110,115 @@ void pc9801_state::pc9801rs_map(address_map &map)
map(0xfe8000, 0xffffff).m(m_ipl, FUNC(address_map_bank_device::amap16));
}
-void pc9801_state::pc9801rs_io(address_map &map)
+void pc9801vm_state::pc9801rs_io(address_map &map)
{
- map.unmap_value_high();
+// map.unmap_value_high();
pc9801ux_io(map);
- map(0x0430, 0x0433).rw(FUNC(pc9801_state::ide_ctrl_r), FUNC(pc9801_state::ide_ctrl_w)).umask16(0x00ff);
- map(0x0640, 0x064f).rw(FUNC(pc9801_state::ide_cs0_r), FUNC(pc9801_state::ide_cs0_w));
- map(0x0740, 0x074f).rw(FUNC(pc9801_state::ide_cs1_r), FUNC(pc9801_state::ide_cs1_w));
+ map(0x0430, 0x0433).rw(FUNC(pc9801vm_state::ide_ctrl_r), FUNC(pc9801vm_state::ide_ctrl_w)).umask16(0x00ff);
+ map(0x0640, 0x064f).rw(FUNC(pc9801vm_state::ide_cs0_r), FUNC(pc9801vm_state::ide_cs0_w));
+ map(0x0740, 0x074f).rw(FUNC(pc9801vm_state::ide_cs1_r), FUNC(pc9801vm_state::ide_cs1_w));
map(0x1e8c, 0x1e8f).noprw(); // temp
- map(0xbfd8, 0xbfdf).w(FUNC(pc9801_state::pc9801rs_mouse_freq_w));
- map(0xe0d0, 0xe0d3).r(FUNC(pc9801_state::midi_r));
+ map(0xbfdb, 0xbfdb).w(FUNC(pc9801vm_state::mouse_freq_w));
+ map(0xe0d0, 0xe0d3).r(FUNC(pc9801vm_state::midi_r));
}
-/*************************************
- *
- * PC-9821 specific handlers
- *
- ************************************/
+// SDIP handling
+// TODO: move to device
-void pc9801_state::pc9821_video_ff_w(offs_t offset, uint8_t data)
+template<unsigned port> u8 pc9801us_state::sdip_r(offs_t offset)
{
- if(offset == 1)
- {
- if(((data & 0xfe) == 4) && !m_ex_video_ff[3]) // TODO: many other settings are protected
- return;
- m_ex_video_ff[(data & 0xfe) >> 1] = data & 1;
-
- //if((data & 0xfe) == 0x20)
- // logerror("%02x\n",data & 1);
- }
+ u8 sdip_offset = port + (m_sdip_bank * 12);
- /* Intentional fall-through */
- pc9801rs_video_ff_w(offset,data);
+ return m_sdip[sdip_offset];
}
-uint8_t pc9801_state::pc9821_a0_r(offs_t offset)
+template<unsigned port> void pc9801us_state::sdip_w(offs_t offset, u8 data)
{
- if((offset & 1) == 0 && offset & 8)
- {
- if(m_ex_video_ff[ANALOG_256_MODE])
- {
- logerror("256 color mode [%02x] R\n",offset);
- return 0;
- }
- else if(m_ex_video_ff[ANALOG_16_MODE]) //16 color mode, readback possible there
- {
- uint8_t res = 0;
-
- switch(offset)
- {
- case 0x08: res = m_analog16.pal_entry & 0xf; break;
- case 0x0a: res = m_analog16.g[m_analog16.pal_entry] & 0xf; break;
- case 0x0c: res = m_analog16.r[m_analog16.pal_entry] & 0xf; break;
- case 0x0e: res = m_analog16.b[m_analog16.pal_entry] & 0xf; break;
- }
-
- return res;
- }
- }
+ u8 sdip_offset = port + (m_sdip_bank * 12);
- return pc9801_a0_r(offset);
+ m_sdip[sdip_offset] = data;
}
-void pc9801_state::pc9821_a0_w(offs_t offset, uint8_t data)
+void pc9801us_state::sdip_bank_w(offs_t offset, u8 data)
{
- if((offset & 1) == 0 && offset & 8 && m_ex_video_ff[ANALOG_256_MODE])
- {
- switch(offset)
- {
- case 0x08: m_analog256.pal_entry = data & 0xff; break;
- case 0x0a: m_analog256.g[m_analog256.pal_entry] = data & 0xff; break;
- case 0x0c: m_analog256.r[m_analog256.pal_entry] = data & 0xff; break;
- case 0x0e: m_analog256.b[m_analog256.pal_entry] = data & 0xff; break;
- }
-
- m_palette->set_pen_color(
- m_analog256.pal_entry + 0x20,
- m_analog256.r[m_analog256.pal_entry],
- m_analog256.g[m_analog256.pal_entry],
- m_analog256.b[m_analog256.pal_entry]
- );
- return;
- }
-
- pc9801rs_a0_w(offset,data);
+ // TODO: depending on model type this is hooked up differently
+ // (or be not hooked up at all like in 9801US case)
+ m_sdip_bank = (data & 0x40) >> 6;
}
-uint8_t pc9801_state::window_bank_r(offs_t offset)
+void pc9801us_state::pc9801us_io(address_map &map)
{
- if(offset == 1)
- return m_pc9821_window_bank & 0xfe;
-
- return 0xff;
+ pc9801rs_io(map);
+ map(0x841e, 0x841e).rw(FUNC(pc9801us_state::sdip_r<0x0>), FUNC(pc9801us_state::sdip_w<0x0>));
+ map(0x851e, 0x851e).rw(FUNC(pc9801us_state::sdip_r<0x1>), FUNC(pc9801us_state::sdip_w<0x1>));
+ map(0x861e, 0x861e).rw(FUNC(pc9801us_state::sdip_r<0x2>), FUNC(pc9801us_state::sdip_w<0x2>));
+ map(0x871e, 0x871e).rw(FUNC(pc9801us_state::sdip_r<0x3>), FUNC(pc9801us_state::sdip_w<0x3>));
+ map(0x881e, 0x881e).rw(FUNC(pc9801us_state::sdip_r<0x4>), FUNC(pc9801us_state::sdip_w<0x4>));
+ map(0x891e, 0x891e).rw(FUNC(pc9801us_state::sdip_r<0x5>), FUNC(pc9801us_state::sdip_w<0x5>));
+ map(0x8a1e, 0x8a1e).rw(FUNC(pc9801us_state::sdip_r<0x6>), FUNC(pc9801us_state::sdip_w<0x6>));
+ map(0x8b1e, 0x8b1e).rw(FUNC(pc9801us_state::sdip_r<0x7>), FUNC(pc9801us_state::sdip_w<0x7>));
+ map(0x8c1e, 0x8c1e).rw(FUNC(pc9801us_state::sdip_r<0x8>), FUNC(pc9801us_state::sdip_w<0x8>));
+ map(0x8d1e, 0x8d1e).rw(FUNC(pc9801us_state::sdip_r<0x9>), FUNC(pc9801us_state::sdip_w<0x9>));
+ map(0x8e1e, 0x8e1e).rw(FUNC(pc9801us_state::sdip_r<0xa>), FUNC(pc9801us_state::sdip_w<0xa>));
+ map(0x8f1e, 0x8f1e).rw(FUNC(pc9801us_state::sdip_r<0xb>), FUNC(pc9801us_state::sdip_w<0xb>));
+ map(0x8f1f, 0x8f1f).w(FUNC(pc9801us_state::sdip_bank_w));
}
-void pc9801_state::window_bank_w(offs_t offset, uint8_t data)
+void pc9801bx_state::pc9801bx2_map(address_map &map)
{
- if(offset == 1)
- m_pc9821_window_bank = data & 0xfe;
- else
- logerror("PC-9821 $f0000 window bank %02x\n",data);
+ pc9801rs_map(map);
+// map(0x000a0000, 0x000a3fff).rw(FUNC(pc9801_state::tvram_r), FUNC(pc9801_state::tvram_w));
+// map(0x000a4000, 0x000a4fff).rw(FUNC(pc9801_state::pc9801rs_knjram_r), FUNC(pc9801_state::pc9801rs_knjram_w));
+// map(0x000a8000, 0x000bffff).rw(FUNC(pc9821_state::pc9821_grcg_gvram_r), FUNC(pc9821_state::pc9821_grcg_gvram_w));
+// map(0x000cc000, 0x000cffff).rom().region("sound_bios", 0); //sound BIOS
+// map(0x000d8000, 0x000d9fff).rom().region("ide",0)
+// map(0x000da000, 0x000dbfff).ram(); // ide ram (declared in RS)
+// map(0x000e0000, 0x000e7fff).rw(FUNC(pc9821_state::pc9821_grcg_gvram0_r), FUNC(pc9821_state::pc9821_grcg_gvram0_w));
+ map(0x000e8000, 0x000fffff).m(m_ipl, FUNC(address_map_bank_device::amap16));
+ map(0xffee8000, 0xffefffff).m(m_ipl, FUNC(address_map_bank_device::amap16));
+ map(0xfffe8000, 0xffffffff).m(m_ipl, FUNC(address_map_bank_device::amap16));
}
-uint8_t pc9801_state::m_sdip_read(uint16_t port, uint8_t sdip_offset)
+u8 pc9801bx_state::i486_cpu_mode_r(offs_t offset)
{
- if(port == 2)
- return m_sdip[sdip_offset];
-
- logerror("Warning: read from unknown SDIP area %02x %04x\n",port,0x841c + port + (sdip_offset % 12)*0x100);
- return 0xff;
+ /*
+ * x--- ---- 33 MHz/25 MHz switch (9821 Bp, Bs, Be, Cs2, Ce2 only)
+ * ---- ---x (1) MIDDLE or LOW mode (?), (0) High mode
+ */
+ // 9821 MULTi checks this and refuses to boot if finds bit 0 high
+ return 0;
}
-void pc9801_state::m_sdip_write(uint16_t port, uint8_t sdip_offset,uint8_t data)
-{
- if(port == 2)
- {
- m_sdip[sdip_offset] = data;
- return;
- }
-
- logerror("Warning: write from unknown SDIP area %02x %04x %02x\n",port,0x841c + port + (sdip_offset % 12)*0x100,data);
-}
-
-uint8_t pc9801_state::sdip_0_r(offs_t offset) { return m_sdip_read(offset, 0+m_sdip_bank*12); }
-uint8_t pc9801_state::sdip_1_r(offs_t offset) { return m_sdip_read(offset, 1+m_sdip_bank*12); }
-uint8_t pc9801_state::sdip_2_r(offs_t offset) { return m_sdip_read(offset, 2+m_sdip_bank*12); }
-uint8_t pc9801_state::sdip_3_r(offs_t offset) { return m_sdip_read(offset, 3+m_sdip_bank*12); }
-uint8_t pc9801_state::sdip_4_r(offs_t offset) { return m_sdip_read(offset, 4+m_sdip_bank*12); }
-uint8_t pc9801_state::sdip_5_r(offs_t offset) { return m_sdip_read(offset, 5+m_sdip_bank*12); }
-uint8_t pc9801_state::sdip_6_r(offs_t offset) { return m_sdip_read(offset, 6+m_sdip_bank*12); }
-uint8_t pc9801_state::sdip_7_r(offs_t offset) { return m_sdip_read(offset, 7+m_sdip_bank*12); }
-uint8_t pc9801_state::sdip_8_r(offs_t offset) { return m_sdip_read(offset, 8+m_sdip_bank*12); }
-uint8_t pc9801_state::sdip_9_r(offs_t offset) { return m_sdip_read(offset, 9+m_sdip_bank*12); }
-uint8_t pc9801_state::sdip_a_r(offs_t offset) { return m_sdip_read(offset, 10+m_sdip_bank*12); }
-uint8_t pc9801_state::sdip_b_r(offs_t offset) { return m_sdip_read(offset, 11+m_sdip_bank*12); }
-
-void pc9801_state::sdip_0_w(offs_t offset, uint8_t data) { m_sdip_write(offset,0+m_sdip_bank*12,data); }
-void pc9801_state::sdip_1_w(offs_t offset, uint8_t data) { m_sdip_write(offset,1+m_sdip_bank*12,data); }
-void pc9801_state::sdip_2_w(offs_t offset, uint8_t data) { m_sdip_write(offset,2+m_sdip_bank*12,data); }
-void pc9801_state::sdip_3_w(offs_t offset, uint8_t data) { m_sdip_write(offset,3+m_sdip_bank*12,data); }
-void pc9801_state::sdip_4_w(offs_t offset, uint8_t data) { m_sdip_write(offset,4+m_sdip_bank*12,data); }
-void pc9801_state::sdip_5_w(offs_t offset, uint8_t data) { m_sdip_write(offset,5+m_sdip_bank*12,data); }
-void pc9801_state::sdip_6_w(offs_t offset, uint8_t data) { m_sdip_write(offset,6+m_sdip_bank*12,data); }
-void pc9801_state::sdip_7_w(offs_t offset, uint8_t data) { m_sdip_write(offset,7+m_sdip_bank*12,data); }
-void pc9801_state::sdip_8_w(offs_t offset, uint8_t data) { m_sdip_write(offset,8+m_sdip_bank*12,data); }
-void pc9801_state::sdip_9_w(offs_t offset, uint8_t data) { m_sdip_write(offset,9+m_sdip_bank*12,data); }
-void pc9801_state::sdip_a_w(offs_t offset, uint8_t data) { m_sdip_write(offset,10+m_sdip_bank*12,data); }
-void pc9801_state::sdip_b_w(offs_t offset, uint8_t data)
+/*
+ * GDC 31 kHz register
+ * R/W on PC-98GS, H98, all PC-9821 except PC-9821Ts,
+ * 9801BA2, 9801BS2, 9801BX2
+ *
+ * x--- ---- unknown, if set high then DAC1BIT goes berserk at POST.
+ * ---- --xx (R/W) horizontal frequency
+ * ---- --1x ^ "setting prohibited" (?)
+ * ---- --01 ^ 31.47kHz
+ * ---- --00 ^ 24.83kHz
+ *
+ * PC-9801NS/A can also r/w this but with different meaning
+ */
+u8 pc9801bx_state::gdc_31kHz_r(offs_t offset)
{
- if(offset == 3)
- m_sdip_bank = (data & 0x40) >> 6;
-
- if(offset == 2)
- m_sdip_write(offset,11+m_sdip_bank*12,data);
-
- if((offset & 2) == 0)
- logerror("SDIP area B write %02x %02x\n",offset,data);
+ return 0;
}
-uint16_t pc9801_state::timestamp_r(offs_t offset)
+void pc9801bx_state::gdc_31kHz_w(offs_t offset, u8 data)
{
- return (m_maincpu->total_cycles() >> (16 * offset));
+ // Repeatedly switches 0 to 3 during POST, sync monitor check to guess support?
+// if (data)
+// popmessage("31kHz register set %02x, contact MAMEdev", data);
}
-/* basically a read-back of various registers */
-// bit 1: GDC clock select (port 0x6a, selects with 0x84 & bit 0)
-// bit 0: current setting
-uint8_t pc9801_state::ext2_video_ff_r()
+void pc9801bx_state::pc9801bx2_io(address_map &map)
{
- uint8_t res;
-
- res = 0;
-
- switch(m_ext2_ff)
- {
-// case 0x00: ?
-// case 0x01: 200 line color / b&w mode (i/o 0x68 -> 0x02)
-// case 0x02: Odd-numbered raster mask (i/o 0x68 -> 0x08)
- case 0x03: res = m_video_ff[DISPLAY_REG]; break; // display reg
-// case 0x04: palette mode (i/o 0x6a -> 0x00)
-// case 0x05: GDC sync mode (i/o 0x6a -> 0x40)
-// case 0x06: unknown (i/o 0x6a -> 0x44)
-// case 0x07: EGC compatibility mode (i/o 0x6a -> 0x04)
-// case 0x08: Protected mode f/f (i/o 0x6a -> 0x06)
-// case 0x09: GDC clock #0 (i/o 0x6a -> 0x82)
- case 0x0a: res = m_ex_video_ff[ANALOG_256_MODE]; break; // 256 color mode
-// case 0x0b: VRAM access mode (i/o 0x6a -> 0x62)
-// case 0x0c: unknown
-// case 0x0d: VRAM boundary mode (i/o 0x6a -> 0x68)
-// case 0x0e: 65536 color GFX mode (i/o 0x6a -> 0x22)
-// case 0x0f: 65,536 color palette mode (i/o 0x6a -> 0x24)
-// case 0x10: unknown (i/o 0x6a -> 0x6a)
-// case 0x11: Reverse mode related (i/o 0x6a -> 0x26)
-// case 0x12: 256 color overscan color (i/o 0x6a -> 0x2c)
-// case 0x13: Reverse mode related (i/o 0x6a -> 0x28)
-// case 0x14: AGDC Drawing processor selection (i/o 0x6a -> 0x66)
-// case 0x15: unknown (i/o 0x6a -> 0x60)
-// case 0x16: unknown (i/o 0x6a -> 0xc2)
-// case 0x17: bitmap config direction (i/o 0x6a -> 0x6c)
-// case 0x18: High speed palette write (i/o 0x6a -> 0x2a)
-// case 0x19: unknown (i/o 0x6a -> 0x48)
-// case 0x1a: unknown (i/o 0x6a -> 0xc8)
-// case 0x1b: unknown (i/o 0x6a -> 0x2e)
-// case 0x1c: unknown (i/o 0x6a -> 0x6e)
-// case 0x1d: unknown (i/o 0x6a -> 0xc0)
-// case 0x1e: unknown (i/o 0x6a -> 0x80 or 0x46?)
-// case 0x1f: unknown (i/o 0x6a -> 0x08)
- default:
- if(m_ext2_ff < 0x20)
- popmessage("PC-9821: read ext2 f/f with value %02x",m_ext2_ff);
- break;
- }
-
- res|= (m_ex_video_ff[GDC_IS_5MHz] << 1);
-
- return res;
-}
-
-void pc9801_state::ext2_video_ff_w(uint8_t data)
-{
- m_ext2_ff = data;
+ pc9801us_io(map);
+ map(0x0534, 0x0534).r(FUNC(pc9801bx_state::i486_cpu_mode_r));
+ map(0x09a8, 0x09a8).rw(FUNC(pc9801bx_state::gdc_31kHz_r), FUNC(pc9801bx_state::gdc_31kHz_w));
}
/*uint8_t pc9801_state::winram_r(offs_t offset)
@@ -1250,205 +1233,6 @@ void pc9801_state::winram_w(offs_t offset, uint8_t data)
offset = (offset & 0x1ffff) | (m_pc9821_window_bank & 0xfe) * 0x10000;
}*/
-// TODO: analog 256 mode needs HW tests
-uint16_t pc9801_state::pc9821_grcg_gvram_r(offs_t offset, uint16_t mem_mask)
-{
- if(m_ex_video_ff[ANALOG_256_MODE])
- {
- u16 *ext_gvram = (u16 *)m_ext_gvram.target();
- int bank = offset >> 14;
- if(bank <= 1)
- return ext_gvram[((m_analog256.bank[bank])*0x4000) + (offset & 0x3fff)];
- return 0xffff;
- }
-
- return grcg_gvram_r(offset, mem_mask);
-}
-
-void pc9801_state::pc9821_grcg_gvram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- if(m_ex_video_ff[ANALOG_256_MODE])
- {
- u16 *ext_gvram = (u16 *)m_ext_gvram.target();
- int bank = offset >> 14;
- if(bank <= 1)
- COMBINE_DATA(&ext_gvram[((m_analog256.bank[bank])*0x4000) + (offset & 0x3fff)]);
- return;
- }
-
- grcg_gvram_w(offset,data,mem_mask);
-}
-
-uint16_t pc9801_state::pc9821_grcg_gvram0_r(offs_t offset, uint16_t mem_mask)
-{
- if(m_ex_video_ff[ANALOG_256_MODE])
- {
- switch(offset*2)
- {
- case 4: return m_analog256.bank[0];
- case 6: return m_analog256.bank[1];
- }
-
- //return 0;
- }
-
- return grcg_gvram0_r(offset, mem_mask);
-}
-
-void pc9801_state::pc9821_grcg_gvram0_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- if(m_ex_video_ff[ANALOG_256_MODE])
- {
- //printf("%08x %08x\n",offset*2,data);
- if(mem_mask & 0xff)
- {
- switch(offset*2)
- {
- case 4: m_analog256.bank[0] = data & 0xf; break;
- case 6: m_analog256.bank[1] = data & 0xf; break;
- }
- }
- return;
- }
-
- grcg_gvram0_w(offset,data,mem_mask);
-}
-
-
-void pc9801_state::pc9821_map(address_map &map)
-{
- //map(0x00080000, 0x0009ffff).rw(FUNC(pc9801_state::winram_r), FUNC(pc9801_state::winram_w))
- map(0x000a0000, 0x000a3fff).rw(FUNC(pc9801_state::tvram_r), FUNC(pc9801_state::tvram_w));
- map(0x000a4000, 0x000a4fff).rw(FUNC(pc9801_state::pc9801rs_knjram_r), FUNC(pc9801_state::pc9801rs_knjram_w));
- map(0x000a8000, 0x000bffff).rw(FUNC(pc9801_state::pc9821_grcg_gvram_r), FUNC(pc9801_state::pc9821_grcg_gvram_w));
-// map(0x000cc000, 0x000cffff).rom().region("sound_bios", 0); //sound BIOS
-// map(0x000d8000, 0x000d9fff).rom().region("ide",0)
- map(0x000da000, 0x000dbfff).ram(); // ide ram
- map(0x000e0000, 0x000e7fff).rw(FUNC(pc9801_state::pc9821_grcg_gvram0_r), FUNC(pc9801_state::pc9821_grcg_gvram0_w));
- map(0x000e8000, 0x000fffff).m(m_ipl, FUNC(address_map_bank_device::amap16));
- map(0x00f00000, 0x00f9ffff).ram().share("ext_gvram");
- map(0xffee8000, 0xffefffff).m(m_ipl, FUNC(address_map_bank_device::amap16));
- map(0xfff00000, 0xfff9ffff).ram().share("ext_gvram");
- map(0xfffe8000, 0xffffffff).m(m_ipl, FUNC(address_map_bank_device::amap16));
-}
-
-void pc9801_state::pc9821_io(address_map &map)
-{
-// map.unmap_value_high(); // TODO: a read to somewhere makes this to fail at POST
- map(0x0000, 0x001f).rw(m_dmac, FUNC(am9517a_device::read), FUNC(am9517a_device::write)).umask32(0xff00ff00);
- map(0x0000, 0x001f).lr8(NAME([this] (offs_t o) { return BIT(o, 1) ? 0xff : pic_r(o); })).umask32(0x00ff00ff);
- map(0x0000, 0x001f).w(FUNC(pc9801_state::pic_w)).umask32(0x00ff00ff); // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
- map(0x0020, 0x002f).w(FUNC(pc9801_state::rtc_w)).umask32(0x000000ff);
- map(0x0020, 0x002f).w(FUNC(pc9801_state::dmapg8_w)).umask32(0xff00ff00);
- map(0x0030, 0x0037).rw(m_ppi_sys, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask32(0xff00ff00); //i8251 RS232c / i8255 system port
- map(0x0040, 0x0047).rw(m_ppi_prn, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask32(0x00ff00ff);
- map(0x0040, 0x0047).rw(m_keyb, FUNC(pc9801_kbd_device::rx_r), FUNC(pc9801_kbd_device::tx_w)).umask32(0xff00ff00); //i8255 printer port / i8251 keyboard
- map(0x0050, 0x0053).w(FUNC(pc9801_state::nmi_ctrl_w)).umask32(0x00ff00ff);
- map(0x005c, 0x005f).r(FUNC(pc9801_state::timestamp_r)).nopw(); // artic
- map(0x0060, 0x0063).rw(m_hgdc1, FUNC(upd7220_device::read), FUNC(upd7220_device::write)).umask32(0x00ff00ff); //upd7220 character ports / <undefined>
- map(0x0060, 0x0063).r(FUNC(pc9801_state::unk_r)).umask32(0xff00ff00); // mouse related (unmapped checking for AT keyb controller\PS/2 mouse?)
- map(0x0064, 0x0064).w(FUNC(pc9801_state::vrtc_clear_w));
- map(0x0068, 0x006b).w(FUNC(pc9801_state::pc9821_video_ff_w)).umask32(0x00ff00ff); //mode FF / <undefined>
- map(0x0070, 0x007f).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask32(0xff00ff00);
- map(0x0070, 0x007f).rw(FUNC(pc9801_state::grcg_r), FUNC(pc9801_state::grcg_w)).umask32(0x00ff00ff); //display registers "GRCG" / i8253 pit
- map(0x0090, 0x0093).m(m_fdc_2hd, FUNC(upd765a_device::map)).umask32(0x00ff00ff);
- map(0x0094, 0x0094).rw(FUNC(pc9801_state::fdc_2hd_ctrl_r), FUNC(pc9801_state::fdc_2hd_ctrl_w));
- map(0x00a0, 0x00af).rw(FUNC(pc9801_state::pc9821_a0_r), FUNC(pc9801_state::pc9821_a0_w)); //upd7220 bitmap ports / display registers
-// map(0x00b0, 0x00b3) PC9861k (serial port?)
-// map(0x00b9, 0x00b9) PC9861k
-// map(0x00bb, 0x00bb) PC9861k
- map(0x00bc, 0x00bf).rw(FUNC(pc9801_state::fdc_mode_ctrl_r), FUNC(pc9801_state::fdc_mode_ctrl_w));
- map(0x00c8, 0x00cb).m(m_fdc_2hd, FUNC(upd765a_device::map)).umask32(0x00ff00ff);
- map(0x00cc, 0x00cc).rw(FUNC(pc9801_state::fdc_2hd_ctrl_r), FUNC(pc9801_state::fdc_2hd_ctrl_w));
- // map(0x00d8, 0x00df) AMD98 (sound?) board
- map(0x00f0, 0x00ff).rw(FUNC(pc9801_state::a20_ctrl_r), FUNC(pc9801_state::a20_ctrl_w)).umask32(0x00ff00ff);
-// map(0x0188, 0x018f).rw(FUNC(pc9801_state::pc9801_opn_r), FUNC(pc9801_state::pc9801_opn_w)); //ym2203 opn / <undefined>
-// map(0x018c, 0x018f) YM2203 OPN extended ports / <undefined>
- map(0x0430, 0x0433).rw(FUNC(pc9801_state::ide_ctrl_r), FUNC(pc9801_state::ide_ctrl_w)).umask32(0x00ff00ff);
- map(0x0438, 0x043b).rw(FUNC(pc9801_state::access_ctrl_r), FUNC(pc9801_state::access_ctrl_w));
-// map(0x043d, 0x043d) ROM/RAM bank (NEC)
- map(0x043c, 0x043f).w(FUNC(pc9801_state::pc9801rs_bank_w)); //ROM/RAM bank (EPSON)
- map(0x0460, 0x0463).rw(FUNC(pc9801_state::window_bank_r), FUNC(pc9801_state::window_bank_w));
- map(0x04a0, 0x04af).w(FUNC(pc9801_state::egc_w));
-// map(0x04be, 0x04be) FDC "RPM" register
- map(0x0640, 0x064f).rw(FUNC(pc9801_state::ide_cs0_r), FUNC(pc9801_state::ide_cs0_w));
- map(0x0740, 0x074f).rw(FUNC(pc9801_state::ide_cs1_r), FUNC(pc9801_state::ide_cs1_w));
-// map(0x08e0, 0x08ea) <undefined> / EMM SIO registers
- map(0x09a0, 0x09a0).rw(FUNC(pc9801_state::ext2_video_ff_r), FUNC(pc9801_state::ext2_video_ff_w)); // GDC extended register r/w
-// map(0x09a8, 0x09a8) GDC 31KHz register r/w
-// map(0x0c07, 0x0c07) EPSON register w
-// map(0x0c03, 0x0c03) EPSON register 0 r
-// map(0x0c13, 0x0c14) EPSON register 1 r
-// map(0x0c24, 0x0c24) cs4231 PCM board register control
-// map(0x0c2b, 0x0c2b) cs4231 PCM board low byte control
-// map(0x0c2d, 0x0c2d) cs4231 PCM board hi byte control
-// map(0x0cc0, 0x0cc7) SCSI interface / <undefined>
-// map(0x0cfc, 0x0cff) PCI bus
- map(0x1e8c, 0x1e8f).noprw(); // IDE RAM switch
- map(0x2ed0, 0x2edf).lr8(NAME([] (address_space &s, offs_t o, u8 mm) { return 0xff; })).umask32(0xffffffff); // unknown sound related
- map(0x3fd8, 0x3fdf).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask32(0xff00ff00); // <undefined> / pit mirror ports
- map(0x7fd8, 0x7fdf).rw("ppi8255_mouse", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask32(0xff00ff00);
- map(0x841c, 0x841f).rw(FUNC(pc9801_state::sdip_0_r), FUNC(pc9801_state::sdip_0_w));
- map(0x851c, 0x851f).rw(FUNC(pc9801_state::sdip_1_r), FUNC(pc9801_state::sdip_1_w));
- map(0x861c, 0x861f).rw(FUNC(pc9801_state::sdip_2_r), FUNC(pc9801_state::sdip_2_w));
- map(0x871c, 0x871f).rw(FUNC(pc9801_state::sdip_3_r), FUNC(pc9801_state::sdip_3_w));
- map(0x881c, 0x881f).rw(FUNC(pc9801_state::sdip_4_r), FUNC(pc9801_state::sdip_4_w));
- map(0x891c, 0x891f).rw(FUNC(pc9801_state::sdip_5_r), FUNC(pc9801_state::sdip_5_w));
- map(0x8a1c, 0x8a1f).rw(FUNC(pc9801_state::sdip_6_r), FUNC(pc9801_state::sdip_6_w));
- map(0x8b1c, 0x8b1f).rw(FUNC(pc9801_state::sdip_7_r), FUNC(pc9801_state::sdip_7_w));
- map(0x8c1c, 0x8c1f).rw(FUNC(pc9801_state::sdip_8_r), FUNC(pc9801_state::sdip_8_w));
- map(0x8d1c, 0x8d1f).rw(FUNC(pc9801_state::sdip_9_r), FUNC(pc9801_state::sdip_9_w));
- map(0x8e1c, 0x8e1f).rw(FUNC(pc9801_state::sdip_a_r), FUNC(pc9801_state::sdip_a_w));
- map(0x8f1c, 0x8f1f).rw(FUNC(pc9801_state::sdip_b_r), FUNC(pc9801_state::sdip_b_w));
-// map(0xa460, 0xa46f) cs4231 PCM extended port / <undefined>
-// map(0xbfdb, 0xbfdb) mouse timing port
-// map(0xc0d0, 0xc0d3) MIDI port, option 0 / <undefined>
-// map(0xc4d0, 0xc4d3) MIDI port, option 1 / <undefined>
-// map(0xc8d0, 0xc8d3) MIDI port, option 2 / <undefined>
-// map(0xccd0, 0xccd3) MIDI port, option 3 / <undefined>
-// map(0xd0d0, 0xd0d3) MIDI port, option 4 / <undefined>
-// map(0xd4d0, 0xd4d3) MIDI port, option 5 / <undefined>
-// map(0xd8d0, 0xd8d3) MIDI port, option 6 / <undefined>
-// map(0xdcd0, 0xdcd3) MIDI port, option 7 / <undefined>
- map(0xe0d0, 0xe0d3).r(FUNC(pc9801_state::midi_r)); // MIDI port, option 8 / <undefined>
-// map(0xe4d0, 0xe4d3) MIDI port, option 9 / <undefined>
-// map(0xe8d0, 0xe8d3) MIDI port, option A / <undefined>
-// map(0xecd0, 0xecd3) MIDI port, option B / <undefined>
-// map(0xf0d0, 0xf0d3) MIDI port, option C / <undefined>
-// map(0xf4d0, 0xf4d3) MIDI port, option D / <undefined>
-// map(0xf8d0, 0xf8d3) MIDI port, option E / <undefined>
-// map(0xfcd0, 0xfcd3) MIDI port, option F / <undefined>
-}
-
-// TODO: identify this, might be an alt way to access SDIP?
-uint8_t pc9801_state::as_unkdev_data_r(offs_t offset)
-{
- if (offset == 0)
- return m_unkdev0468[m_unkdev0468_addr];
-
- return 0xff;
-}
-
-void pc9801_state::as_unkdev_data_w(offs_t offset, uint8_t data)
-{
- if (offset == 0)
- m_unkdev0468[m_unkdev0468_addr] = data;
-
- // offset == 0: access bit?
-}
-
-void pc9801_state::as_unkdev_addr_w(offs_t offset, uint8_t data)
-{
- if (offset == 0)
- m_unkdev0468_addr = data;
-}
-
-void pc9801_state::pc9821as_io(address_map &map)
-{
- pc9821_io(map);
- map(0x0468, 0x046b).rw(FUNC(pc9801_state::as_unkdev_data_r), FUNC(pc9801_state::as_unkdev_data_w)).umask32(0x00ff00ff);
- map(0x046c, 0x046f).w(FUNC(pc9801_state::as_unkdev_addr_w)).umask32(0x00ff00ff);
-}
void pc9801_state::upd7220_1_map(address_map &map)
{
@@ -1460,12 +1244,12 @@ void pc9801_state::upd7220_2_map(address_map &map)
map(0x00000, 0x3ffff).ram().share("video_ram_2");
}
-void pc9801_state::upd7220_grcg_2_map(address_map &map)
+void pc9801vm_state::upd7220_grcg_2_map(address_map &map)
{
- map(0x00000, 0x3ffff).rw(FUNC(pc9801_state::upd7220_grcg_r), FUNC(pc9801_state::upd7220_grcg_w)).share("video_ram_2");
+ map(0x00000, 0x3ffff).rw(FUNC(pc9801vm_state::upd7220_grcg_r), FUNC(pc9801vm_state::upd7220_grcg_w)).share("video_ram_2");
}
-CUSTOM_INPUT_MEMBER(pc9801_state::system_type_r)
+CUSTOM_INPUT_MEMBER(pc98_base_state::system_type_r)
{
// System Type (0x00 stock PC-9801, 0xc0 PC-9801U / PC-98LT, PC-98HA, 0x80 others)
return m_sys_type;
@@ -1473,121 +1257,40 @@ CUSTOM_INPUT_MEMBER(pc9801_state::system_type_r)
static INPUT_PORTS_START( pc9801 )
PORT_START("DSW1")
- PORT_BIT(0x0001, IP_ACTIVE_HIGH,IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER("upd1990a", upd1990a_device, data_out_r)
- PORT_DIPNAME( 0x0002, 0x0000, "DSW1" ) // error beep if OFF
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, "Display Type" ) PORT_DIPLOCATION("SW2:1")
- PORT_DIPSETTING( 0x0000, "Normal Display" )
- PORT_DIPSETTING( 0x0008, "Hi-Res Display" )
- PORT_DIPNAME( 0x0010, 0x0000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-
- PORT_START("DSW5")
- PORT_DIPNAME( 0x01, 0x00, "DSW5" ) // goes into basic with this off, PC-9801VF / PC-9801U setting
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) ) // V30 / V33
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) // printer busy
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) // 8 / 4096
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) // LCD display
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) //system clock = 5 MHz (0) / 8 MHz (1)
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(pc9801_state, system_type_r)
+ PORT_DIPNAME( 0x0001, 0x0001, "Display Type" ) PORT_DIPLOCATION("SW1:1")
+ PORT_DIPSETTING( 0x0000, "Normal Display (15KHz)" )
+ PORT_DIPSETTING( 0x0001, "Hi-Res Display (24KHz)" )
+ // TODO: "GFX" screen selections (routing?) for vanilla class
+ PORT_DIPUNKNOWN_DIPLOC( 0x002, 0x002, "SW1:2" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x004, 0x004, "SW1:3" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x008, 0x008, "SW1:4" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x010, 0x010, "SW1:5" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x020, 0x000, "SW1:6" )
+ // TODO: built-in RXC / TXC clocks for RS-232C (routing?) for vanilla class
+ PORT_DIPUNKNOWN_DIPLOC( 0x040, 0x000, "SW1:7" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x080, 0x080, "SW1:8" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x100, 0x000, "SW1:9" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x200, 0x200, "SW1:10" )
PORT_START("DSW2")
- PORT_DIPNAME( 0x01, 0x01, "System Specification" ) PORT_DIPLOCATION("SW1:1") //jumps to daa00 if off, presumably some card booting
+ PORT_DIPNAME( 0x01, 0x01, "System Specification" ) PORT_DIPLOCATION("SW2:1") //jumps to daa00 if off, presumably some card booting
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, "Terminal Mode" ) PORT_DIPLOCATION("SW1:2")
+ PORT_DIPNAME( 0x02, 0x02, "Terminal Mode" ) PORT_DIPLOCATION("SW2:2")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x00, "Text width" ) PORT_DIPLOCATION("SW1:3")
+ PORT_DIPNAME( 0x04, 0x00, "Text width" ) PORT_DIPLOCATION("SW2:3")
PORT_DIPSETTING( 0x04, "40 chars/line" )
PORT_DIPSETTING( 0x00, "80 chars/line" )
- PORT_DIPNAME( 0x08, 0x00, "Text height" ) PORT_DIPLOCATION("SW1:4")
+ PORT_DIPNAME( 0x08, 0x00, "Text height" ) PORT_DIPLOCATION("SW2:4")
PORT_DIPSETTING( 0x08, "20 lines/screen" )
PORT_DIPSETTING( 0x00, "25 lines/screen" )
- PORT_DIPNAME( 0x10, 0x00, "Memory Switch Init" ) PORT_DIPLOCATION("SW1:5")
+ PORT_DIPNAME( 0x10, 0x00, "Memory Switch Init" ) PORT_DIPLOCATION("SW2:5")
PORT_DIPSETTING( 0x00, DEF_STR( No ) ) //Fix memory switch condition
PORT_DIPSETTING( 0x10, DEF_STR( Yes ) ) //Initialize Memory Switch with the system default
- PORT_DIPUNUSED_DIPLOC( 0x20, 0x20, "SW1:6" )
- PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW1:7" )
- PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW1:8" )
-
- PORT_START("DSW3")
- PORT_DIPNAME( 0x01, 0x01, "DSW3" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
- PORT_START("DSW4")
- PORT_DIPNAME( 0x01, 0x01, "DSW4" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPUNUSED_DIPLOC( 0x20, 0x20, "SW2:6" )
+ PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW2:7" )
+ PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW2:8" )
PORT_START("MOUSE_X")
PORT_BIT( 0xff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30)
@@ -1598,15 +1301,15 @@ static INPUT_PORTS_START( pc9801 )
PORT_START("MOUSE_B")
PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_CODE(MOUSECODE_BUTTON2) PORT_NAME("Mouse Right Button")
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_CODE(MOUSECODE_BUTTON3) PORT_NAME("Mouse Middle Button")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_CODE(MOUSECODE_BUTTON1) PORT_NAME("Mouse Left Button")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(MOUSECODE_BUTTON2) PORT_NAME("Mouse Right Button")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(MOUSECODE_BUTTON3) PORT_NAME("Mouse Middle Button")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(MOUSECODE_BUTTON1) PORT_NAME("Mouse Left Button")
PORT_START("ROM_LOAD")
- PORT_CONFNAME( 0x01, 0x01, "Load floppy 2hd BIOS" )
+ PORT_CONFNAME( 0x01, 0x01, "Load floppy 2HD BIOS" )
PORT_CONFSETTING( 0x00, DEF_STR( Yes ) )
PORT_CONFSETTING( 0x01, DEF_STR( No ) )
- PORT_CONFNAME( 0x02, 0x02, "Load floppy 2dd BIOS" )
+ PORT_CONFNAME( 0x02, 0x02, "Load floppy 2DD BIOS" )
PORT_CONFSETTING( 0x00, DEF_STR( Yes ) )
PORT_CONFSETTING( 0x02, DEF_STR( No ) )
INPUT_PORTS_END
@@ -1614,50 +1317,59 @@ INPUT_PORTS_END
static INPUT_PORTS_START( pc9801rs )
PORT_INCLUDE( pc9801 )
+ PORT_MODIFY("DSW1")
+ // LCD display, 98DO Demo explicitly wants it to be non-Plasma
+ PORT_DIPNAME( 0x04, 0x04, "Monitor Type" ) PORT_DIPLOCATION("SW1:3")
+ PORT_DIPSETTING( 0x04, "RGB" )
+ PORT_DIPSETTING( 0x00, "Plasma" )
+ PORT_DIPNAME( 0x80, 0x00, "Graphic Function" ) PORT_DIPLOCATION("SW1:8")
+ PORT_DIPSETTING( 0x80, "Basic (8 Colors)" )
+ PORT_DIPSETTING( 0x00, "Expanded (16/4096 Colors)" )
+ PORT_BIT(0x300, IP_ACTIVE_LOW, IPT_UNUSED )
+
PORT_MODIFY("DSW2")
- PORT_DIPNAME( 0x80, 0x80, "GDC clock" ) PORT_DIPLOCATION("SW1:8") // DSW 2-8
+ PORT_DIPNAME( 0x80, 0x80, "GDC clock" ) PORT_DIPLOCATION("SW2:8")
PORT_DIPSETTING( 0x80, "2.5 MHz" )
PORT_DIPSETTING( 0x00, "5 MHz" )
- PORT_MODIFY("DSW4")
- PORT_DIPNAME( 0x04, 0x00, "CPU Type" ) PORT_DIPLOCATION("SW4:8") // DSW 3-8
- PORT_DIPSETTING( 0x04, "V30" )
+ PORT_START("DSW3")
+ PORT_DIPNAME( 0x01, 0x01, "FDD Fix Mode" ) PORT_DIPLOCATION("SW3:1")
+ // with this OFF enables PORT EXC (fdc mode bit 0)
+ PORT_DIPSETTING( 0x00, "Auto-Detection" )
+ PORT_DIPSETTING( 0x01, "Fixed" )
+ PORT_DIPNAME( 0x02, 0x02, "FDD Density Select" ) PORT_DIPLOCATION("SW3:!2")
+ PORT_DIPSETTING( 0x00, "2DD" )
+ PORT_DIPSETTING( 0x02, "2HD" )
+ PORT_DIPUNUSED_DIPLOC( 0x04, 0x04, "SW3:3" )
+ PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW3:4" )
+ PORT_DIPUNUSED_DIPLOC( 0x10, 0x10, "SW3:5" )
+ PORT_DIPNAME( 0x20, 0x20, "Conventional RAM size" ) PORT_DIPLOCATION("SW3:6")
+ PORT_DIPSETTING( 0x20, "640 KB" )
+ PORT_DIPSETTING( 0x00, "512 KB" )
+ PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW3:7" )
+ PORT_DIPNAME( 0x80, 0x00, "CPU Type" ) PORT_DIPLOCATION("SW3:8")
+ PORT_DIPSETTING( 0x80, "V30" )
PORT_DIPSETTING( 0x00, "I386" )
- PORT_MODIFY("DSW5")
- PORT_DIPNAME( 0x08, 0x00, "Graphic Function" ) // DSW 1-8
- PORT_DIPSETTING( 0x08, "Basic (8 Colors)" )
- PORT_DIPSETTING( 0x00, "Expanded (16/4096 Colors)" )
- PORT_DIPNAME( 0x10, 0x10, "Display Type" ) // LCD display, 98DO Demo explicitly wants it to be non-Plasma
- PORT_DIPSETTING( 0x10, "RGB" )
- PORT_DIPSETTING( 0x00, "Plasma" )
-
PORT_MODIFY("ROM_LOAD")
PORT_BIT( 0x03, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_CONFNAME( 0x04, 0x04, "Load IDE BIOS" )
PORT_CONFSETTING( 0x00, DEF_STR( Yes ) )
PORT_CONFSETTING( 0x04, DEF_STR( No ) )
-
-// PORT_START("SOUND_CONFIG")
-// PORT_CONFNAME( 0x01, 0x00, "Sound Type" )
-// PORT_CONFSETTING( 0x00, "YM2203 (OPN)" )
-// PORT_CONFSETTING( 0x01, "YM2608 (OPNA)" )
INPUT_PORTS_END
-static INPUT_PORTS_START( pc9821 )
+static INPUT_PORTS_START( pc9801vm11 )
PORT_INCLUDE( pc9801rs )
- PORT_MODIFY("DSW2")
- PORT_DIPNAME( 0x01, 0x00, "S-Dip SW Init" ) PORT_DIPLOCATION("SW1:1")
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
PORT_MODIFY("DSW3")
- PORT_DIPNAME( 0x40, 0x40, "Conventional RAM size" ) PORT_DIPLOCATION("SW3:7")
- PORT_DIPSETTING( 0x40, "640 KB" )
- PORT_DIPSETTING( 0x00, "512 KB" )
+ // TODO: "CPU Add Waitstate Penalty"?
+ // specific for PC-98DO, CV21, UV11 and VM11
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:!5")
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Yes ) )
INPUT_PORTS_END
+
static const gfx_layout charset_8x8 =
{
8,8,
@@ -1692,11 +1404,11 @@ static const gfx_layout charset_16x16 =
};
static GFXDECODE_START( gfx_pc9801 )
- GFXDECODE_ENTRY( "chargen", 0x00000, charset_8x8, 0x000, 0x01 )
- GFXDECODE_ENTRY( "chargen", 0x00800, charset_8x16, 0x000, 0x01 )
- GFXDECODE_ENTRY( "kanji", 0x00000, charset_16x16, 0x000, 0x01 )
+ GFXDECODE_ENTRY( "chargen", 0x00000, charset_8x8, 0x000, 0x01 )
+ GFXDECODE_ENTRY( "chargen", 0x00800, charset_8x16, 0x000, 0x01 )
+ GFXDECODE_ENTRY( "kanji", 0x00000, charset_16x16, 0x000, 0x01 )
GFXDECODE_ENTRY( "raw_kanji", 0x00000, charset_16x16, 0x000, 0x01 )
- GFXDECODE_ENTRY( "new_chargen",0, charset_16x16, 0x000, 0x01 )
+ GFXDECODE_ENTRY( "new_chargen", 0x00000, charset_16x16, 0x000, 0x01 )
GFXDECODE_END
/****************************************
@@ -1782,6 +1494,7 @@ uint8_t pc9801_state::dma_read_byte(offs_t offset)
{
address_space &program = m_maincpu->space(AS_PROGRAM);
offs_t addr = (m_dma_offset[m_dack] << 16) | offset;
+
if(offset == 0xffff)
{
switch(m_dma_autoinc[m_dack])
@@ -1798,8 +1511,7 @@ uint8_t pc9801_state::dma_read_byte(offs_t offset)
}
}
-// logerror("%08x\n",addr);
-
+// logerror("%08x %02x\n",addr, m_dma_access_ctrl);
return program.read_byte(addr);
}
@@ -1808,6 +1520,7 @@ void pc9801_state::dma_write_byte(offs_t offset, uint8_t data)
{
address_space &program = m_maincpu->space(AS_PROGRAM);
offs_t addr = (m_dma_offset[m_dack] << 16) | offset;
+
if(offset == 0xffff)
{
switch(m_dma_autoinc[m_dack])
@@ -1823,7 +1536,7 @@ void pc9801_state::dma_write_byte(offs_t offset, uint8_t data)
break;
}
}
-// logerror("%08x %02x\n",addr,data);
+// logerror("%08x %02x %02x\n",addr,data, m_dma_access_ctrl);
program.write_byte(addr, data);
}
@@ -1833,34 +1546,113 @@ void pc9801_state::set_dma_channel(int channel, int state)
if (!state) m_dack = channel;
}
+/*
+ch1 cs-4231a
+ch2 FDC
+ch3 SCSI
+*/
+
WRITE_LINE_MEMBER(pc9801_state::dack0_w){ /*logerror("%02x 0\n",state);*/ set_dma_channel(0, state); }
WRITE_LINE_MEMBER(pc9801_state::dack1_w){ /*logerror("%02x 1\n",state);*/ set_dma_channel(1, state); }
WRITE_LINE_MEMBER(pc9801_state::dack2_w){ /*logerror("%02x 2\n",state);*/ set_dma_channel(2, state); }
WRITE_LINE_MEMBER(pc9801_state::dack3_w){ /*logerror("%02x 3\n",state);*/ set_dma_channel(3, state); }
/*
-ch1 cs-4231a
-ch2 FDC
-ch3 SCSI
-*/
+ * PPI "system" I/F
+ *
+ * Port A:
+ * xxxx xxxx DIP SW 2
+ * ^ treated as RAM on pc98lt/ha and 9821Ap, As, Ae
+ *
+ * Port B:
+ * x--- ---- RS-232C CI signal (active low)
+ * -x-- ---- RS-232C CS signal (active low)
+ * --x- ---- RS-232C CD signal (active low)
+ * (normal)
+ * ---x ---- INT3 status for expansion bus
+ * ---- x--- DIP SW 1-1 (0) 15 kHz (1) 24 kHz
+ * ---- -x-- IMCK internal RAM parity error
+ * ---- --x- EMCK expansion RAM parity error
+ * ---- ---x CDAT RTC data read
+ * H98 overrides bits 4, 3 with SHUTx status
+ *
+ * Port C:
+ * x--- ---- (286+ machines) SHUT0 status
+ * -x-- ---- PSTBM printer PSTB mask
+ * --x- ---- (286+ machines) SHUT1 status
+ * ^ pc98lt/ha: ROM drive write protection (active low)
+ * ---x ---- MCHKEN RAM parity check (0) invalid
+ * ---- x--- buzzer/DAC1BIT mute
+ * ---- -x-- TXRE interrupt enable for TXRDY in RS-232C
+ * ---- --x- TXEE interrupt enable for TXEMPTY in RS-232C
+ * ---- ---x RXRE interrupt enable for RXRDY in RS-232C
+ *
+ */
-/****************************************
-*
-* PPI interfaces
-*
-****************************************/
+u8 pc9801_state::ppi_sys_portb_r()
+{
+ u8 res = 0;
+
+ res |= m_rtc->data_out_r();
+ res |= BIT(m_dsw1->read(), 0) << 3;
-void pc9801_state::ppi_sys_beep_portc_w(uint8_t data)
+ return res;
+}
+
+void pc98_base_state::ppi_sys_beep_portc_w(uint8_t data)
{
m_beeper->set_state(!(data & 0x08));
}
-void pc9801_state::ppi_sys_dac_portc_w(uint8_t data)
+void pc9801vm_state::ppi_sys_dac_portc_w(uint8_t data)
{
- m_dac_disable = BIT(data, 3);
+ m_dac1bit_disable = BIT(data, 3);
// TODO: some models have a finer grained volume control at I/O port 0xae8e
// (98NOTE only?)
- m_dac->set_output_gain(0, m_dac_disable ? 0.0 : 1.0);
+ m_dac1bit->set_output_gain(0, m_dac1bit_disable ? 0.0 : 1.0);
+}
+
+/*
+ * PPI "printer" I/F
+ *
+ * Port B:
+ * xx-- ---- TYP1, 0 system type
+ * 11-- ---- PC-9801U, PC98LT/HA
+ * 10-- ---- <everything else>
+ * 01-- ---- <undefined>
+ * 00-- ---- vanilla PC-9801
+ * --x- ---- MOD system clock
+ * --1- ---- CPU 8 MHz Timer 2 MHz
+ * --0- ---- CPU 5/10 MHz Timer 2.5 MHz
+ * ---x ---- DIP SW 1-3 plasma display (notebooks & pc98lt/ha only)
+ * ---- x--- DIP SW 1-8 analog 16 enable
+ * ---- -x-- Printer BUSY signal (active low)
+ * ---- --x- (normal) CPUT V30 mode
+ * ^ (pc98lt/ha) CPUT system type
+ * ---- ---x VF flag (PC-9801VF, PC-9801U)
+ * ^ ? only for models with built-in 2DD
+ *
+ */
+
+u8 pc9801_state::ppi_prn_portb_r()
+{
+ u8 res = 0;
+
+// res |= BIT(m_dsw1->read(), 7) << 3;
+// res |= BIT(m_dsw1->read(), 2) << 4;
+ res |= m_sys_type << 6;
+
+ return res;
+}
+
+u8 pc9801vm_state::ppi_prn_portb_r()
+{
+ u8 res = pc9801_state::ppi_prn_portb_r();
+
+ res |= BIT(m_dsw1->read(), 7) << 3;
+ res |= BIT(m_dsw1->read(), 2) << 4;
+
+ return res;
}
/*
@@ -1874,6 +1666,13 @@ void pc9801_state::ppi_sys_dac_portc_w(uint8_t data)
* ---? ---- <unused>
* ---- xxxx MD3-0 mouse direction latch
*
+ * Port B:
+ * x--- ---- H98 only: DIP SW 1-4 (FDD external drive select)
+ * -x-- ---- DIP SW 3-6: conventional RAM size (RAMKL)
+ * ---x ---- PC98RL only: DIP SW 3-3 SASI DMA channel 0
+ * ---- --x- SPDSW readout: selects CPU clock speed for 286/386 equipped machines
+ * ---- ---x SPDSW readout for H98
+ *
* Port C:
*
* x--- ---- HC Latch Mode (1=read latch, 0=read delta)
@@ -1881,16 +1680,19 @@ void pc9801_state::ppi_sys_dac_portc_w(uint8_t data)
* -x-- ---- SXY Axis select (1=Y 0=X)
* --x- ---- SHL Read nibble select (1) upper (0) lower
* ---x ---- INT # (1) disable (0) enable
+ * ---- x--- (r/o) H98 only: MODSW (0) High-reso mode (1) Normal mode
+ * ---- -x-- (r/o) CPUSW: DIP SW 3-8 (1) V30 compatible mode
+ * ---- --xx (r/o) RS-232C sync mode settings, DIP SWs 1-6 & 1-5
*
* Reading Port B and Port C low nibble are misc DIPSW selectors,
* their meaning diverges on XA/XL/RL classes vs. the rest.
*
*/
-uint8_t pc9801_state::ppi_mouse_porta_r()
+u8 pc9801_state::ppi_mouse_porta_r()
{
- uint8_t res = ioport("MOUSE_B")->read() & 0xf0;
- const uint8_t isporthi = ((m_mouse.control & 0x20) >> 5)*4;
+ u8 res = ioport("MOUSE_B")->read() & 0xf0;
+ const u8 isporthi = ((m_mouse.control & 0x20) >> 5)*4;
if ((m_mouse.control & 0x80) == 0)
{
@@ -1916,9 +1718,19 @@ void pc9801_state::ppi_mouse_porta_w(uint8_t data)
// logerror("A %02x\n",data);
}
+u8 pc9801vm_state::ppi_mouse_portb_r()
+{
+ return (BIT(m_dsw3->read(), 5) << 6) | 2;
+}
+
void pc9801_state::ppi_mouse_portb_w(uint8_t data)
{
-// logerror("B %02x\n",data);
+ logerror("%s: PPI mouse port B %02x\n", machine().describe_context() ,data);
+}
+
+u8 pc9801vm_state::ppi_mouse_portc_r()
+{
+ return (BIT(m_dsw3->read(), 7) << 2);
}
void pc9801_state::ppi_mouse_portc_w(uint8_t data)
@@ -1946,8 +1758,49 @@ void pc9801_state::ppi_mouse_portc_w(uint8_t data)
m_mouse.control = data;
}
-uint8_t pc9801_state::unk_r()
+// extended port $bfdb
+u8 pc9801vm_state::mouse_freq_r(offs_t offset)
+{
+ // TODO: not all models support read-back
+ // PC-9801DA: 0xff
+ // H-98S: reads frequency only, '1' everything else
+ // PC-9801US: frequency & irq cycle, '0' everything else
+ // PC-9801Xa: frequency, '0' everything else
+ popmessage("Read mouse $bfdb, contact MAMEdev");
+ return m_mouse.freq_reg;
+}
+
+void pc9801vm_state::mouse_freq_w(offs_t offset, u8 data)
+{
+ // Port unavailable on PC-9871 1st gen & PC-9871/K, PC-9801F3, PC-9801M2, PC-9801M3
+ // Some if not all of those have hardcoded HW switch for changing the timing instead
+ /*
+ * xxxx xx-- mouse irq cycle setting (edge selection?)
+ * 0000 10-- ^ set on POST
+ * 0000 00-- ^ set by MS-DOS 6.20
+ * 0010 0111 ^ jastrike (main menu)
+ * 1010 0100 ^ jastrike (gameplay)
+ * ---- --xx mouse irq frequency setting (120 >> x) Hz
+ */
+ logerror("%s: mouse $bfdb register write %02x\n",machine().describe_context(), data);
+
+ // jastrike definitely don't intend to write to frequency too when
+ // feeding 0x27/0xa* values at PC=156ec
+ // (without this options menu barely detects any mouse input)
+ if (data & 0xfc)
+ return;
+
+ m_mouse.freq_reg = data & 3;
+ m_mouse.freq_index = 0;
+}
+
+// standard debug catch-all handler
+// I/O mapping is byte smearing party, so logerror can possibly silently hide handler
+// accesses if they are partially handled by an umask in the mapping.
+uint8_t pc9801_state::unk_r(offs_t offset)
{
+// printf("%04x\n",offset);
+// logerror("%s: I/O read access %04x\n",offset);
return 0xff;
}
@@ -1966,53 +1819,56 @@ static void pc9801_floppies(device_slot_interface &device)
static void pc9801_cbus_devices(device_slot_interface &device)
{
+ // official HW
// PC-9801-14
device.option_add("pc9801_26", PC9801_26);
+ device.option_add("pc9801_55u", PC9801_55U);
+ device.option_add("pc9801_55l", PC9801_55L);
device.option_add("pc9801_86", PC9801_86);
-// PC-9801-86
-// PC-9801-26 + PC-9801-86 (?)
-// PC-9801-86 + Chibi-Oto
device.option_add("pc9801_118", PC9801_118);
device.option_add("pc9801_spb", PC9801_SPEAKBOARD);
// Spark Board
-// AMD-98 (AmuseMent boarD)
- device.option_add("pc9801_amd98", PC9801_AMD98);
+ device.option_add("pc9801_amd98", PC9801_AMD98); // AmuseMent boarD
device.option_add("mpu_pc98", MPU_PC98);
+
+ // doujinshi HW
+// MAD Factory / Doujin Hard (同人ハード)
+// MAD Factory Chibi-Oto: an ADPCM override for -86
+// MAD Factory Otomi-chan: "TORIE9211 MAD FACTORY" printed on proto PCB, just overrides for ADPCM for -86?
+ device.option_add("otomichan_kai", OTOMICHAN_KAI);
}
-// Jast Sound, could be put independently
+// Jast Sound, could be installed independently
WRITE_LINE_MEMBER( pc9801_state::fdc_2dd_irq )
{
logerror("IRQ 2DD %d\n",state);
+ // TODO: does this mask applies to the specific timer irq trigger only?
+ // (bit 0 of control)
if(m_fdc_2dd_ctrl & 8)
{
m_pic2->ir2_w(state);
}
}
-WRITE_LINE_MEMBER( pc9801_state::pc9801rs_fdc_irq )
+WRITE_LINE_MEMBER( pc9801vm_state::fdc_irq_w )
{
- /* 0xffaf8 */
-
- //logerror("%02x %d\n",m_fdc_ctrl,state);
-
- if(m_fdc_ctrl & 1)
+ if(m_fdc_mode & 1)
m_pic2->ir3_w(state);
else
m_pic2->ir2_w(state);
}
-WRITE_LINE_MEMBER( pc9801_state::pc9801rs_fdc_drq )
+WRITE_LINE_MEMBER( pc9801vm_state::fdc_drq_w )
{
- if(m_fdc_ctrl & 1)
+ if(m_fdc_mode & 1)
m_dmac->dreq2_w(state ^ 1);
else
m_dmac->dreq3_w(state ^ 1);
}
-uint32_t pc9801_state::a20_286(bool state)
+uint32_t pc9801vm_state::a20_286(bool state)
{
return (state ? 0xffffff : 0x0fffff);
}
@@ -2023,7 +1879,6 @@ uint32_t pc9801_state::a20_286(bool state)
*
****************************************/
-//
void pc9801_state::pc9801_palette(palette_device &palette) const
{
for(int i = 0; i < 8; i++)
@@ -2048,13 +1903,6 @@ MACHINE_START_MEMBER(pc9801_state,pc9801_common)
save_item(NAME(m_sasi_data));
save_item(NAME(m_sasi_data_enable));
save_item(NAME(m_sasi_ctrl));
- save_item(NAME(m_egc.regs));
- save_item(NAME(m_egc.pat));
- save_item(NAME(m_egc.src));
- save_item(NAME(m_egc.count));
- save_item(NAME(m_egc.leftover));
- save_item(NAME(m_egc.first));
- save_item(NAME(m_egc.init));
}
MACHINE_START_MEMBER(pc9801_state,pc9801f)
@@ -2063,36 +1911,41 @@ MACHINE_START_MEMBER(pc9801_state,pc9801f)
m_fdc_2hd->set_rate(500000);
m_fdc_2dd->set_rate(250000);
+ // TODO: set_rpm for m_fdc_2dd?
m_sys_type = 0x00 >> 6;
}
-MACHINE_START_MEMBER(pc9801_state,pc9801rs)
+MACHINE_START_MEMBER(pc9801vm_state,pc9801rs)
{
MACHINE_START_CALL_MEMBER(pc9801_common);
- save_item(NAME(m_dac_disable));
-
m_sys_type = 0x80 >> 6;
-}
-MACHINE_START_MEMBER(pc9801_state,pc9801bx2)
-{
- MACHINE_START_CALL_MEMBER(pc9801rs);
+ m_fdc_timer = timer_alloc(TIMER_FDC_TRIGGER);
- save_pointer(NAME(m_sdip), 24);
-}
+ save_item(NAME(m_dac1bit_disable));
+
+ save_item(NAME(m_dma_access_ctrl));
+ save_item(NAME(m_egc.regs));
+ save_item(NAME(m_egc.pat));
+ save_item(NAME(m_egc.src));
+ save_item(NAME(m_egc.count));
+ save_item(NAME(m_egc.leftover));
+ save_item(NAME(m_egc.first));
+ save_item(NAME(m_egc.init));
+}
-MACHINE_START_MEMBER(pc9801_state,pc9821)
+MACHINE_START_MEMBER(pc9801us_state,pc9801us)
{
MACHINE_START_CALL_MEMBER(pc9801rs);
save_pointer(NAME(m_sdip), 24);
}
-MACHINE_START_MEMBER(pc9801_state,pc9821ap2)
+MACHINE_START_MEMBER(pc9801bx_state,pc9801bx2)
{
- MACHINE_START_CALL_MEMBER(pc9821);
+ MACHINE_START_CALL_MEMBER(pc9801us);
// ...
}
@@ -2107,7 +1960,6 @@ MACHINE_RESET_MEMBER(pc9801_state,pc9801_common)
m_mouse.freq_index = 0;
m_mouse.lx = m_mouse.ly = m_mouse.prev_dx = m_mouse.prev_dy = m_mouse.dx = m_mouse.dy = 0;
m_dma_autoinc[0] = m_dma_autoinc[1] = m_dma_autoinc[2] = m_dma_autoinc[3] = 0;
- memset(&m_egc, 0, sizeof(m_egc));
}
MACHINE_RESET_MEMBER(pc9801_state,pc9801f)
@@ -2134,13 +1986,15 @@ MACHINE_RESET_MEMBER(pc9801_state,pc9801f)
m_beeper->set_state(0);
}
-MACHINE_RESET_MEMBER(pc9801_state,pc9801rs)
+MACHINE_RESET_MEMBER(pc9801vm_state,pc9801rs)
{
MACHINE_RESET_CALL_MEMBER(pc9801_common);
m_gate_a20 = 0;
- m_fdc_ctrl = 3;
- m_access_ctrl = 0;
+ m_fdc_mode = 3;
+ fdc_set_density_mode(true); // 2HD
+ // 0xfb on PC98XL
+ m_dma_access_ctrl = 0xfe;
m_ide_sel = 0;
m_maincpu->set_input_line(INPUT_LINE_A20, m_gate_a20);
@@ -2152,14 +2006,17 @@ MACHINE_RESET_MEMBER(pc9801_state,pc9801rs)
m_maincpu->space(AS_PROGRAM).install_rom(0xd8000, 0xd9fff, memregion("ide")->base() + 0x2000);
}
- m_dac_disable = true;
+ m_dac1bit_disable = true;
+
+ memset(&m_egc, 0, sizeof(m_egc));
}
-MACHINE_RESET_MEMBER(pc9801_state,pc9821)
+MACHINE_RESET_MEMBER(pc9801bx_state,pc9801bx2)
{
MACHINE_RESET_CALL_MEMBER(pc9801rs);
- m_pc9821_window_bank = 0x08;
+ // TODO: if returning default 0xfe / 0xfb then it never ever surpass the "SYSTEM SHUTDOWN" even with a soft reset
+ m_dma_access_ctrl = 0x00;
}
WRITE_LINE_MEMBER(pc9801_state::vrtc_irq)
@@ -2169,7 +2026,7 @@ WRITE_LINE_MEMBER(pc9801_state::vrtc_irq)
}
-void pc9801_state::floppy_formats(format_registration &fr)
+void pc98_base_state::floppy_formats(format_registration &fr)
{
fr.add_mfm_containers();
fr.add(FLOPPY_PC98_FORMAT);
@@ -2182,6 +2039,7 @@ void pc9801_state::floppy_formats(format_registration &fr)
TIMER_DEVICE_CALLBACK_MEMBER( pc9801_state::mouse_irq_cb )
{
+ // irq mask
if((m_mouse.control & 0x10) == 0)
{
m_mouse.freq_index ++;
@@ -2208,49 +2066,54 @@ void pc9801_state::pc9801_keyboard(machine_config &config)
m_keyb->irq_wr_callback().set(m_pic1, FUNC(pic8259_device::ir1_w));
}
-void pc9801_state::pc9801_pit_clock(machine_config &config, const XTAL clock)
+void pc9801_state::pit_clock_config(machine_config &config, const XTAL clock)
{
- m_pit8253->set_clk<0>(clock);
- m_pit8253->set_clk<1>(clock);
- m_pit8253->set_clk<2>(clock);
+ m_pit->set_clk<0>(clock);
+ m_pit->set_clk<1>(clock);
+ m_pit->set_clk<2>(clock);
}
void pc9801_state::pc9801_mouse(machine_config &config)
{
- i8255_device &ppi_mouse(I8255(config, "ppi8255_mouse"));
- ppi_mouse.in_pa_callback().set(FUNC(pc9801_state::ppi_mouse_porta_r));
- ppi_mouse.out_pa_callback().set(FUNC(pc9801_state::ppi_mouse_porta_w));
- ppi_mouse.in_pb_callback().set_ioport("DSW3");
- ppi_mouse.out_pb_callback().set(FUNC(pc9801_state::ppi_mouse_portb_w));
- ppi_mouse.in_pc_callback().set_ioport("DSW4");
- ppi_mouse.out_pc_callback().set(FUNC(pc9801_state::ppi_mouse_portc_w));
-
+ I8255(config, m_ppi_mouse);
+ m_ppi_mouse->in_pa_callback().set(FUNC(pc9801_state::ppi_mouse_porta_r));
+ m_ppi_mouse->out_pa_callback().set(FUNC(pc9801_state::ppi_mouse_porta_w));
+ // Regular vanilla doesn't have readouts of these
+ // (since mouse isn't built-in but comes from an external board at best)
+// m_ppi_mouse->in_pb_callback().set_ioport("DSW3");
+ m_ppi_mouse->in_pb_callback().set_constant(0xff);
+ m_ppi_mouse->out_pb_callback().set(FUNC(pc9801_state::ppi_mouse_portb_w));
+// m_ppi_mouse->in_pc_callback().set_ioport("DSW4");
+ m_ppi_mouse->in_pc_callback().set_constant(0xff);
+ m_ppi_mouse->out_pc_callback().set(FUNC(pc9801_state::ppi_mouse_portc_w));
+
+ // TODO: timing is configurable
TIMER(config, "mouse_timer").configure_periodic(FUNC(pc9801_state::mouse_irq_cb), attotime::from_hz(120));
}
void pc9801_state::pc9801_cbus(machine_config &config)
{
- pc9801_slot_device &cbus0(PC9801CBUS_SLOT(config, "cbus0", pc9801_cbus_devices, "pc9801_26"));
- cbus0.set_memspace(m_maincpu, AS_PROGRAM);
- cbus0.set_iospace(m_maincpu, AS_IO);
- cbus0.int_cb<0>().set("ir3", FUNC(input_merger_device::in_w<0>));
- cbus0.int_cb<1>().set("ir5", FUNC(input_merger_device::in_w<0>));
- cbus0.int_cb<2>().set("ir6", FUNC(input_merger_device::in_w<0>));
- cbus0.int_cb<3>().set("ir9", FUNC(input_merger_device::in_w<0>));
- cbus0.int_cb<4>().set("pic8259_slave", FUNC(pic8259_device::ir2_w));
- cbus0.int_cb<5>().set("ir12", FUNC(input_merger_device::in_w<0>));
- cbus0.int_cb<6>().set("ir13", FUNC(input_merger_device::in_w<0>));
-
- pc9801_slot_device &cbus1(PC9801CBUS_SLOT(config, "cbus1", pc9801_cbus_devices, nullptr));
- cbus1.set_memspace(m_maincpu, AS_PROGRAM);
- cbus1.set_iospace(m_maincpu, AS_IO);
- cbus1.int_cb<0>().set("ir3", FUNC(input_merger_device::in_w<1>));
- cbus1.int_cb<1>().set("ir5", FUNC(input_merger_device::in_w<1>));
- cbus1.int_cb<2>().set("ir6", FUNC(input_merger_device::in_w<1>));
- cbus1.int_cb<3>().set("ir9", FUNC(input_merger_device::in_w<1>));
- cbus1.int_cb<4>().set("pic8259_slave", FUNC(pic8259_device::ir3_w));
- cbus1.int_cb<5>().set("ir12", FUNC(input_merger_device::in_w<1>));
- cbus1.int_cb<6>().set("ir13", FUNC(input_merger_device::in_w<1>));
+ PC9801CBUS_SLOT(config, m_cbus[0], pc9801_cbus_devices, "pc9801_26");
+ m_cbus[0]->set_memspace(m_maincpu, AS_PROGRAM);
+ m_cbus[0]->set_iospace(m_maincpu, AS_IO);
+ m_cbus[0]->int_cb<0>().set("ir3", FUNC(input_merger_device::in_w<0>));
+ m_cbus[0]->int_cb<1>().set("ir5", FUNC(input_merger_device::in_w<0>));
+ m_cbus[0]->int_cb<2>().set("ir6", FUNC(input_merger_device::in_w<0>));
+ m_cbus[0]->int_cb<3>().set("ir9", FUNC(input_merger_device::in_w<0>));
+ m_cbus[0]->int_cb<4>().set("pic8259_slave", FUNC(pic8259_device::ir2_w));
+ m_cbus[0]->int_cb<5>().set("ir12", FUNC(input_merger_device::in_w<0>));
+ m_cbus[0]->int_cb<6>().set("ir13", FUNC(input_merger_device::in_w<0>));
+
+ PC9801CBUS_SLOT(config, m_cbus[1], pc9801_cbus_devices, nullptr);
+ m_cbus[1]->set_memspace(m_maincpu, AS_PROGRAM);
+ m_cbus[1]->set_iospace(m_maincpu, AS_IO);
+ m_cbus[1]->int_cb<0>().set("ir3", FUNC(input_merger_device::in_w<1>));
+ m_cbus[1]->int_cb<1>().set("ir5", FUNC(input_merger_device::in_w<1>));
+ m_cbus[1]->int_cb<2>().set("ir6", FUNC(input_merger_device::in_w<1>));
+ m_cbus[1]->int_cb<3>().set("ir9", FUNC(input_merger_device::in_w<1>));
+ m_cbus[1]->int_cb<4>().set("pic8259_slave", FUNC(pic8259_device::ir3_w));
+ m_cbus[1]->int_cb<5>().set("ir12", FUNC(input_merger_device::in_w<1>));
+ m_cbus[1]->int_cb<6>().set("ir13", FUNC(input_merger_device::in_w<1>));
// TODO: six max slots
INPUT_MERGER_ANY_HIGH(config, "ir3").output_handler().set("pic8259_master", FUNC(pic8259_device::ir3_w));
@@ -2282,14 +2145,14 @@ void pc9801_state::pc9801_sasi(machine_config &config)
m_dmac->out_iow_callback<0>().set(FUNC(pc9801_state::sasi_data_w));
}
-void pc9801_state::cdrom_headphones(device_t *device)
+void pc9801vm_state::cdrom_headphones(device_t *device)
{
cdda_device *cdda = device->subdevice<cdda_device>("cdda");
cdda->add_route(0, "^^lheadphone", 1.0);
cdda->add_route(1, "^^rheadphone", 1.0);
}
-void pc9801_state::pc9801_ide(machine_config &config)
+void pc9801vm_state::pc9801_ide(machine_config &config)
{
SPEAKER(config, "lheadphone").front_left();
SPEAKER(config, "rheadphone").front_right();
@@ -2306,13 +2169,13 @@ void pc9801_state::pc9801_ide(machine_config &config)
void pc9801_state::pc9801_common(machine_config &config)
{
- PIT8253(config, m_pit8253, 0);
- m_pit8253->set_clk<0>(MAIN_CLOCK_X1); // heartbeat IRQ
- m_pit8253->out_handler<0>().set(m_pic1, FUNC(pic8259_device::ir0_w));
- m_pit8253->set_clk<1>(MAIN_CLOCK_X1); // Memory Refresh
- m_pit8253->set_clk<2>(MAIN_CLOCK_X1); // RS-232C
- m_pit8253->out_handler<2>().set(m_sio, FUNC(i8251_device::write_txc));
- m_pit8253->out_handler<2>().append(m_sio, FUNC(i8251_device::write_rxc));
+ PIT8253(config, m_pit, 0);
+ m_pit->set_clk<0>(MAIN_CLOCK_X1); // heartbeat IRQ
+ m_pit->out_handler<0>().set(m_pic1, FUNC(pic8259_device::ir0_w));
+ m_pit->set_clk<1>(MAIN_CLOCK_X1); // Memory Refresh
+ m_pit->set_clk<2>(MAIN_CLOCK_X1); // RS-232C
+ m_pit->out_handler<2>().set(m_sio, FUNC(i8251_device::write_txc));
+ m_pit->out_handler<2>().append(m_sio, FUNC(i8251_device::write_rxc));
AM9517A(config, m_dmac, 5000000); // unknown clock, TODO: check channels 0 - 1
m_dmac->out_hreq_callback().set(FUNC(pc9801_state::dma_hrq_changed));
@@ -2337,13 +2200,13 @@ void pc9801_state::pc9801_common(machine_config &config)
I8255(config, m_ppi_sys, 0);
m_ppi_sys->in_pa_callback().set_ioport("DSW2");
- m_ppi_sys->in_pb_callback().set_ioport("DSW1");
+ m_ppi_sys->in_pb_callback().set(FUNC(pc9801_state::ppi_sys_portb_r));
m_ppi_sys->in_pc_callback().set_constant(0xa0); // 0x80 cpu triple fault reset flag?
// m_ppi_sys->out_pc_callback().set(FUNC(pc9801_state::ppi_sys_portc_w));
I8255(config, m_ppi_prn, 0);
- // TODO: check this one
- m_ppi_prn->in_pb_callback().set_ioport("DSW5");
+ // TODO: other ports
+ m_ppi_prn->in_pb_callback().set(FUNC(pc9801_state::ppi_prn_portb_r));
pc9801_keyboard(config);
pc9801_mouse(config);
@@ -2356,8 +2219,8 @@ void pc9801_state::pc9801_common(machine_config &config)
UPD765A(config, m_fdc_2hd, 8'000'000, true, true);
m_fdc_2hd->intrq_wr_callback().set(m_pic2, FUNC(pic8259_device::ir3_w));
m_fdc_2hd->drq_wr_callback().set(m_dmac, FUNC(am9517a_device::dreq2_w)).invert();
- FLOPPY_CONNECTOR(config, "upd765_2hd:0", pc9801_floppies, "525hd", pc9801_state::floppy_formats);
- FLOPPY_CONNECTOR(config, "upd765_2hd:1", pc9801_floppies, "525hd", pc9801_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765_2hd:0", pc9801_floppies, "525hd", pc9801_state::floppy_formats);//.enable_sound(true);
+ FLOPPY_CONNECTOR(config, "upd765_2hd:1", pc9801_floppies, "525hd", pc9801_state::floppy_formats);//.enable_sound(true);
i8255_device &ppi_fdd(I8255(config, "ppi8255_fdd"));
ppi_fdd.in_pa_callback().set_constant(0xff);
@@ -2373,23 +2236,35 @@ void pc9801_state::pc9801_common(machine_config &config)
m_screen->set_screen_update(FUNC(pc9801_state::screen_update));
m_screen->screen_vblank().set(FUNC(pc9801_state::vrtc_irq));
- UPD7220(config, m_hgdc1, 21.0526_MHz_XTAL / 8);
- m_hgdc1->set_addrmap(0, &pc9801_state::upd7220_1_map);
- m_hgdc1->set_draw_text(FUNC(pc9801_state::hgdc_draw_text));
- m_hgdc1->vsync_wr_callback().set(m_hgdc2, FUNC(upd7220_device::ext_sync_w));
+ UPD7220(config, m_hgdc[0], 21.0526_MHz_XTAL / 8);
+ m_hgdc[0]->set_addrmap(0, &pc9801_state::upd7220_1_map);
+ m_hgdc[0]->set_draw_text(FUNC(pc9801_state::hgdc_draw_text));
+ m_hgdc[0]->vsync_wr_callback().set(m_hgdc[1], FUNC(upd7220_device::ext_sync_w));
- UPD7220(config, m_hgdc2, 21.0526_MHz_XTAL / 8);
- m_hgdc2->set_addrmap(0, &pc9801_state::upd7220_2_map);
- m_hgdc2->set_display_pixels(FUNC(pc9801_state::hgdc_display_pixels));
+ UPD7220(config, m_hgdc[1], 21.0526_MHz_XTAL / 8);
+ m_hgdc[1]->set_addrmap(0, &pc9801_state::upd7220_2_map);
+ m_hgdc[1]->set_display_pixels(FUNC(pc9801_state::hgdc_display_pixels));
SPEAKER(config, "mono").front_center();
GFXDECODE(config, m_gfxdecode, m_palette, gfx_pc9801);
}
+void pc9801_state::config_floppy_525hd(machine_config &config)
+{
+ FLOPPY_CONNECTOR(config.replace(), "upd765_2hd:0", pc9801_floppies, "525hd", pc9801_state::floppy_formats);
+ FLOPPY_CONNECTOR(config.replace(), "upd765_2hd:1", pc9801_floppies, "525hd", pc9801_state::floppy_formats);
+}
+
+void pc9801_state::config_floppy_35hd(machine_config &config)
+{
+ FLOPPY_CONNECTOR(config.replace(), "upd765_2hd:0", pc9801_floppies, "35hd", pc9801_state::floppy_formats);
+ FLOPPY_CONNECTOR(config.replace(), "upd765_2hd:1", pc9801_floppies, "35hd", pc9801_state::floppy_formats);
+}
+
void pc9801_state::pc9801(machine_config &config)
{
- I8086(config, m_maincpu, 5000000); //unknown clock
+ I8086(config, m_maincpu, 5000000); // 5 MHz for vanilla, 8 MHz for direct children
m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9801_map);
m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9801_io);
m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
@@ -2419,22 +2294,25 @@ void pc9801_state::pc9801(machine_config &config)
PALETTE(config, m_palette, FUNC(pc9801_state::pc9801_palette), 16);
}
-void pc9801_state::pc9801rs(machine_config &config)
+void pc9801vm_state::pc9801rs(machine_config &config)
{
- I386SX(config, m_maincpu, MAIN_CLOCK_X1*8); // unknown clock.
- m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9801rs_map);
- m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9801rs_io);
+ I386SX(config, m_maincpu, MAIN_CLOCK_X1*8); // unknown clock
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9801vm_state::pc9801rs_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9801vm_state::pc9801rs_io);
m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
pc9801_common(config);
- m_ppi_sys->out_pc_callback().set(FUNC(pc9801_state::ppi_sys_dac_portc_w));
+ m_ppi_sys->out_pc_callback().set(FUNC(pc9801vm_state::ppi_sys_dac_portc_w));
// TODO: verify if it needs invert();
- m_pit8253->out_handler<1>().set( m_dac, FUNC(speaker_sound_device::level_w));
+ m_pit->out_handler<1>().set( m_dac1bit, FUNC(speaker_sound_device::level_w));
+
+ m_ppi_mouse->in_pb_callback().set(FUNC(pc9801vm_state::ppi_mouse_portb_r));
+ m_ppi_mouse->in_pc_callback().set(FUNC(pc9801vm_state::ppi_mouse_portc_r));
- ADDRESS_MAP_BANK(config, "ipl_bank").set_map(&pc9801_state::ipl_bank).set_options(ENDIANNESS_LITTLE, 16, 18, 0x18000);
+ ADDRESS_MAP_BANK(config, m_ipl).set_map(&pc9801vm_state::ipl_bank).set_options(ENDIANNESS_LITTLE, 16, 18, 0x18000);
- MCFG_MACHINE_START_OVERRIDE(pc9801_state, pc9801rs)
- MCFG_MACHINE_RESET_OVERRIDE(pc9801_state, pc9801rs)
+ MCFG_MACHINE_START_OVERRIDE(pc9801vm_state, pc9801rs)
+ MCFG_MACHINE_RESET_OVERRIDE(pc9801vm_state, pc9801rs)
m_dmac->set_clock(MAIN_CLOCK_X1*8); // unknown clock
@@ -2443,185 +2321,94 @@ void pc9801_state::pc9801rs(machine_config &config)
RAM(config, m_ram).set_default_size("1664K").set_extra_options("640K,3712K,7808K,14M");
- m_hgdc2->set_addrmap(0, &pc9801_state::upd7220_grcg_2_map);
+ m_fdc_2hd->intrq_wr_callback().set(FUNC(pc9801vm_state::fdc_irq_w));
+ m_fdc_2hd->drq_wr_callback().set(FUNC(pc9801vm_state::fdc_drq_w));
+
+ m_hgdc[1]->set_addrmap(0, &pc9801vm_state::upd7220_grcg_2_map);
-// DAC_1BIT(config, m_dac, 0).set_output_range(-1, 1).add_route(ALL_OUTPUTS, "mono", 0.15);
- SPEAKER_SOUND(config, m_dac).add_route(ALL_OUTPUTS, "mono", 0.40);
- PALETTE(config, m_palette, FUNC(pc9801_state::pc9801_palette), 16 + 16);
+// DAC_1BIT(config, m_dac1bit, 0).set_output_range(-1, 1).add_route(ALL_OUTPUTS, "mono", 0.15);
+ SPEAKER_SOUND(config, m_dac1bit).add_route(ALL_OUTPUTS, "mono", 0.40);
+ PALETTE(config, m_palette, FUNC(pc9801vm_state::pc9801_palette), 16 + 16);
}
-void pc9801_state::pc9801vm(machine_config &config)
+void pc9801vm_state::pc9801vm(machine_config &config)
{
pc9801rs(config);
V30(config.replace(), m_maincpu, 10000000);
- m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9801ux_map);
- m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9801ux_io);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9801vm_state::pc9801ux_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9801vm_state::pc9801ux_io);
m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
m_ram->set_default_size("640K").set_extra_options("640K"); // ???
- MCFG_MACHINE_START_OVERRIDE(pc9801_state, pc9801rs)
- MCFG_MACHINE_RESET_OVERRIDE(pc9801_state, pc9801_common)
+ MCFG_MACHINE_START_OVERRIDE(pc9801vm_state, pc9801rs)
+ MCFG_MACHINE_RESET_OVERRIDE(pc9801vm_state, pc9801_common)
}
-void pc9801_state::pc9801ux(machine_config &config)
+void pc9801vm_state::pc9801ux(machine_config &config)
{
pc9801rs(config);
i80286_cpu_device &maincpu(I80286(config.replace(), m_maincpu, 10000000));
- maincpu.set_addrmap(AS_PROGRAM, &pc9801_state::pc9801ux_map);
- maincpu.set_addrmap(AS_IO, &pc9801_state::pc9801ux_io);
- maincpu.set_a20_callback(i80286_cpu_device::a20_cb(&pc9801_state::a20_286, this));
+ maincpu.set_addrmap(AS_PROGRAM, &pc9801vm_state::pc9801ux_map);
+ maincpu.set_addrmap(AS_IO, &pc9801vm_state::pc9801ux_io);
+ maincpu.set_a20_callback(i80286_cpu_device::a20_cb(&pc9801vm_state::a20_286, this));
maincpu.set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
-// AM9157A(config, "i8237", 10000000); // unknown clock
-}
-void pc9801_state::pc9801bx2(machine_config &config)
-{
- pc9801rs(config);
- I486(config.replace(), m_maincpu, 25000000);
- m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
- m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821_io);
- m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
-
- MCFG_MACHINE_START_OVERRIDE(pc9801_state, pc9801bx2)
-}
-
-// TODO: setter for DMAC clock should follow up whatever is the CPU clock
-
-void pc9801_state::pc9821(machine_config &config)
-{
- pc9801rs(config);
- I486(config.replace(), m_maincpu, 16000000); // unknown clock
- m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
- m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821_io);
- m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
-
- m_pit8253->set_clk<0>(MAIN_CLOCK_X2);
- m_pit8253->set_clk<1>(MAIN_CLOCK_X2);
- m_pit8253->set_clk<2>(MAIN_CLOCK_X2);
-
- MCFG_MACHINE_START_OVERRIDE(pc9801_state, pc9821)
- MCFG_MACHINE_RESET_OVERRIDE(pc9801_state, pc9821)
-
- m_dmac->set_clock(16000000); // unknown clock
-
- PALETTE(config.replace(), m_palette, FUNC(pc9801_state::pc9801_palette), 16 + 16 + 256);
-}
-
-void pc9801_state::pc9821as(machine_config &config)
-{
- pc9821(config);
- I486(config.replace(), m_maincpu, 33000000); // unknown clock
- m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
- m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821as_io);
- m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+ config_floppy_35hd(config);
+// AM9157A(config, "i8237", 10000000); // unknown clock
}
-void pc9801_state::pc9821ap2(machine_config &config)
+void pc9801vm_state::pc9801vx(machine_config &config)
{
- pc9821(config);
- I486(config.replace(), m_maincpu, 66666667); // unknown clock
- m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
- m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821_io);
- m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+ pc9801ux(config);
- MCFG_MACHINE_START_OVERRIDE(pc9801_state, pc9821ap2)
-}
+ config_floppy_525hd(config);
-void pc9801_state::pc9821v20(machine_config &config)
-{
- pc9821(config);
- PENTIUM(config.replace(), m_maincpu, 32000000); // unknown clock, definitely not 32 MHz
- m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
- m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821_io);
- m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
-}
-
-void pc9801_state::pc9821xa16(machine_config &config)
-{
- pc9821(config);
- PENTIUM(config.replace(), m_maincpu, 166000000); // Pentium P54C
- m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
- m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821_io);
- m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
-}
+ // TODO: EGC initial buggy revision
+ // Reportedly has a bug with a RMW op, details TBD
+ // ...
-void pc9801_state::pc9821ra20(machine_config &config)
-{
- pc9821(config);
- PENTIUM_PRO(config.replace(), m_maincpu, XTAL(200'000'000));
- m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
- m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821_io);
- m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+ // minimum RAM: 640 kB
+ // maximum RAM: 8.6 MB
+ // GDC & EGC, DAC1BIT built-in
+ // Either 2x 5.25 or 2x 3.5 internal floppy drives
+ // 4x C-Bus slots (3x plus 1x dedicated RAM?)
}
-void pc9801_state::pc9821ra333(machine_config &config)
+void pc9801us_state::pc9801us(machine_config &config)
{
- pc9821(config);
- const double xtal = 333000000;
- PENTIUM2(config.replace(), m_maincpu, xtal); // actually a Celeron
- m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
- m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821_io);
+ pc9801rs(config);
+ I386SX(config.replace(), m_maincpu, MAIN_CLOCK_X1*8); // unknown clock
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9801us_state::pc9801rs_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9801us_state::pc9801us_io);
m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
- // 128KB CPU cache RAM
- // Trident TGUI9682XGi + integrated 98 gfx card
- // 3x cbus + 2x PCI slots
- // 6GB HDD
- // built-in ethernet 100BASE-TX/10BASE-T
-
+ config_floppy_35hd(config);
}
-// Epson clones
-// TODO: definitely runs on their own state machine
-// (verify if for instance they need EGC and what kind of FM board they needs up)
-
-void pc9801_state::pc386m(machine_config &config)
+void pc9801bx_state::pc9801bx2(machine_config &config)
{
pc9801rs(config);
-// I386SX(config.replace(), m_maincpu, 16000000); // i386SX 16MHz, switchable to 10/6 MHz
-// m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9801rs_map);
-// m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9801rs_io);
-// m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
- // RAM: 640KB + 14.6MB max
- // 2 3.5 floppy drives
- // ...
-}
-
-void pc9801_state::pc486se(machine_config &config)
-{
- pc9821(config);
const XTAL xtal = XTAL(25'000'000);
- I486(config.replace(), m_maincpu, xtal); // i486SX, switchable to 10/5 MHz, supports overdrive
- m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
- m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821as_io);
+ I486(config.replace(), m_maincpu, xtal); // i486sx, ODP upgradeable
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9801bx_state::pc9801bx2_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9801bx_state::pc9801bx2_io);
m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
- pc9801_pit_clock(config, xtal/8); // unknown, passes "ERR:TM" test
+ MCFG_MACHINE_START_OVERRIDE(pc9801bx_state, pc9801bx2)
+ MCFG_MACHINE_RESET_OVERRIDE(pc9801bx_state, pc9801bx2)
- // RAM: 1.6 MB (!) + 17.6 max
- // "dedicated internal memory slot x 1"
- // "dedicated video board" slot
-}
+ pit_clock_config(config, xtal / 4); // unknown, fixes timer error at POST, /4 ~ /7
-void pc9801_state::pc486mu(machine_config &config)
-{
- pc9821(config);
- const XTAL xtal = XTAL(33'000'000);
- I486(config.replace(), m_maincpu, xtal); // i486SX, switchable to I386DX 10MHz/5MHz, Pentium ODP compatible
- m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
- m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821as_io);
- m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
-
- pc9801_pit_clock(config, xtal/8); // unknown, passes "ERR:TM" test
-
- // CL-GD5428
- // RAM: 5.6 + 61.6MB max
- // 2 x 3.5 floppy drives
+ // minimum RAM: 1.8 / 3.6 MB (?)
+ // maximum RAM: 19.6 MB
+ // GDC & EGC, DAC1BIT built-in
+ // 2x 3.5/5.25 internal floppy drives or 1x 3.5 and 120MB IDE HDD
+ // 1x mountable File Bay
+ // 3x C-Bus slots
}
-
-/* took from "raw" memory dump, uncomment ROM_FILL if you want to play with it */
+/* took from "raw" memory dump */
#define LOAD_IDE_ROM \
ROM_REGION( 0x4000, "ide", ROMREGION_ERASEVAL(0xcb) ) \
ROM_LOAD( "d8000.rom", 0x0000, 0x2000, BAD_DUMP CRC(5dda57cc) SHA1(d0dead41c5b763008a4d777aedddce651eb6dcbb) ) \
@@ -2642,8 +2429,9 @@ void pc9801_state::pc486mu(machine_config &config)
ROM_CONTINUE( 0x60001, 0x4000 ) \
ROM_REGION( 0x100000, "kanji", ROMREGION_ERASEFF ) \
ROM_REGION( 0x80000, "new_chargen", ROMREGION_ERASEFF )
+
/*
-F - 8086 5
+F - 8086 8
*/
ROM_START( pc9801f )
@@ -2676,95 +2464,6 @@ ROM_START( pc9801f )
ROM_END
/*
-UX - 80286 10 + V30 8
-*/
-
-ROM_START( pc9801ux )
- ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- ROM_LOAD( "itf_ux.rom", 0x10000, 0x08000, CRC(c7942563) SHA1(61bb210d64c7264be939b11df1e9cd14ffeee3c9) )
- ROM_LOAD( "bios_ux.rom", 0x18000, 0x18000, BAD_DUMP CRC(97375ca2) SHA1(bfe458f671d90692104d0640730972ca8dc0a100) )
-
- ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font_ux.rom", 0x000000, 0x046800, BAD_DUMP CRC(19a76eeb) SHA1(96a006e8515157a624599c2b53a581ae0dd560fd) )
-
- LOAD_KANJI_ROMS
-// LOAD_IDE_ROM
-ROM_END
-
-/*
-RX - 80286 12 (no V30?)
-
-The bios is from a 386 model not an RX
-*/
-
-ROM_START( pc9801rx )
- ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- ROM_LOAD( "itf_rs.rom", 0x10000, 0x08000, BAD_DUMP CRC(c1815325) SHA1(a2fb11c000ed7c976520622cfb7940ed6ddc904e) )
- ROM_LOAD( "bios_rx.rom", 0x18000, 0x18000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) )
- // fix csum
- ROM_FILL(0x2fffe, 1, 0x0d)
-
- ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font_rx.rom", 0x000000, 0x046800, BAD_DUMP CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff) )
-
- LOAD_KANJI_ROMS
- LOAD_IDE_ROM
-ROM_END
-
-/*
-RS - 386SX 16
-
-(note: might be a different model!)
-*/
-
-ROM_START( pc9801rs )
- ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- ROM_LOAD( "itf_rs.rom", 0x10000, 0x08000, CRC(c1815325) SHA1(a2fb11c000ed7c976520622cfb7940ed6ddc904e) )
- ROM_LOAD( "bios_rs.rom", 0x18000, 0x18000, BAD_DUMP CRC(315d2703) SHA1(4f208d1dbb68373080d23bff5636bb6b71eb7565) )
-
- /* following is an emulator memory dump, should be checked and eventually nuked if nothing worth is there */
- ROM_REGION( 0x100000, "memory", 0 )
- ROM_LOAD( "00000.rom", 0x00000, 0x8000, CRC(6e299128) SHA1(d0e7d016c005cdce53ea5ecac01c6f883b752b80) )
- ROM_LOAD( "c0000.rom", 0xc0000, 0x8000, CRC(1b43eabd) SHA1(ca711c69165e1fa5be72993b9a7870ef6d485249) ) // 0xff everywhere
- ROM_LOAD( "c8000.rom", 0xc8000, 0x8000, CRC(f2a262b0) SHA1(fe97d2068d18bbb7425d9774e2e56982df2aa1fb) )
- ROM_LOAD( "d0000.rom", 0xd0000, 0x8000, CRC(1b43eabd) SHA1(ca711c69165e1fa5be72993b9a7870ef6d485249) ) // 0xff everywhere
- ROM_LOAD( "e8000.rom", 0xe8000, 0x8000, CRC(4e32081e) SHA1(e23571273b7cad01aa116cb7414c5115a1093f85) ) // contains n-88 basic (86) v2.0
- ROM_LOAD( "f0000.rom", 0xf0000, 0x8000, CRC(4da85a6c) SHA1(18dccfaf6329387c0c64cc4c91b32c25cde8bd5a) )
- ROM_LOAD( "f8000.rom", 0xf8000, 0x8000, CRC(2b1e45b1) SHA1(1fec35f17d96b2e2359e3c71670575ad9ff5007e) )
-
- ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font_rs.rom", 0x00000, 0x46800, BAD_DUMP CRC(da370e7a) SHA1(584d0c7fde8c7eac1f76dc5e242102261a878c5e) )
-
- LOAD_KANJI_ROMS
- LOAD_IDE_ROM
-ROM_END
-
-/*
-BX2/U2 - 486SX - (should be 33, but "dumper" note says it's 25 MHz)
-
-Yet another franken-romset done with direct memory dump, shrug
-
-*/
-
-ROM_START( pc9801bx2 )
- ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- ROM_LOAD( "pc98bank0.bin", 0x00000, 0x08000, BAD_DUMP CRC(bfd100cc) SHA1(cf8e6a5679cca7761481abef0ba4b35ead39efdb) )
- ROM_LOAD( "pc98bank1.bin", 0x00000, 0x08000, BAD_DUMP CRC(d0562af8) SHA1(2c4fd27eb598f4b8a00f3e86941ba27007d58e47) )
- ROM_LOAD( "pc98bank2.bin", 0x00000, 0x08000, BAD_DUMP CRC(12818a14) SHA1(9c31e8ac85d78fa779d6bbc2095557065294ec09) )
- ROM_LOAD( "pc98bank3.bin", 0x00000, 0x08000, BAD_DUMP CRC(d0bda44e) SHA1(c1022a3b2be4d2a1e43914df9e4605254e5f99d5) )
- ROM_LOAD( "pc98bank4.bin", 0x10000, 0x08000, BAD_DUMP CRC(be8092f4) SHA1(12c8a166b8c6ebbef85568b67e1f098562883365) )
- ROM_LOAD( "pc98bank5.bin", 0x18000, 0x08000, BAD_DUMP CRC(4e32081e) SHA1(e23571273b7cad01aa116cb7414c5115a1093f85) )
- ROM_LOAD( "pc98bank6.bin", 0x20000, 0x08000, BAD_DUMP CRC(f878c160) SHA1(cad47f09075ffe4f7b51bb937c9f716c709d4596) )
- ROM_LOAD( "pc98bank7.bin", 0x28000, 0x08000, BAD_DUMP CRC(1bd6537b) SHA1(ff9ee1c976a12b87851635ce8991ac4ad607675b) )
-
- ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font_rs.rom", 0x00000, 0x46800, BAD_DUMP CRC(da370e7a) SHA1(584d0c7fde8c7eac1f76dc5e242102261a878c5e) )
-
- LOAD_KANJI_ROMS
- LOAD_IDE_ROM
-ROM_END
-
-/*
VM - V30 8/10
TODO: missing itf roms, if they exist
@@ -2821,317 +2520,156 @@ ROM_START( pc9801vm11 )
// LOAD_IDE_ROM
ROM_END
-
-
-/*
-98MATE A - 80486SX 25
-
-(note: might be a different model!)
-*/
-
-ROM_START( pc9821 )
- ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- ROM_LOAD( "itf.rom", 0x10000, 0x08000, CRC(dd4c7bb8) SHA1(cf3aa193df2722899066246bccbed03f2e79a74a) )
- ROM_LOAD( "bios.rom", 0x18000, 0x18000, BAD_DUMP CRC(34a19a59) SHA1(2e92346727b0355bc1ec9a7ded1b444a4917f2b9) )
- ROM_FILL(0x24c40, 4, 0) // hide the _32_ marker until we have a 32-bit clean IDE bios otherwise windows tries to
- // make a 32-bit call into 16-bit code
- ROM_FILL(0x27ffe, 1, 0x92)
- ROM_FILL(0x27fff, 1, 0xd7)
-
- ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
-
- LOAD_KANJI_ROMS
- LOAD_IDE_ROM
-ROM_END
-
/*
-As - 80486DX 33
-*/
-
-ROM_START( pc9821as )
- ROM_REGION( 0x80000, "biosrom", ROMREGION_ERASEFF )
-// ROM_LOAD( "itf.rom", 0x10000, 0x08000, BAD_DUMP CRC(dd4c7bb8) SHA1(cf3aa193df2722899066246bccbed03f2e79a74a) )
-// ROM_LOAD( "bios_as.rom", 0x18000, 0x18000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) )
- ROM_LOAD( "mvs0100-1.bin", 0x00000, 0x80000, CRC(ca37b631) SHA1(8c481dd0608d6c27235bc88bd77e345628dc28a1) )
+VX - 80286 10 + V30 8
- ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- // TODO: not quite right yet, needs actual itf rom loaded
- ROM_COPY( "biosrom", 0x20000, 0x10000, 0x08000 )
- ROM_COPY( "biosrom", 0x30000, 0x18000, 0x18000 )
-
- ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font_as.rom", 0x000000, 0x046800, BAD_DUMP CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff) )
+UVPROM label on extension board for CPU board (4 * NEC D27C256D-15):
+YLL01/YLL02/YLL03/YLL04
+00
+(C) '86 NEC
- LOAD_KANJI_ROMS
- LOAD_IDE_ROM
-ROM_END
-
-/*
-PC-9821AP2/U8W
-80486DX2 66MHz
-DOS 5.0, Windows 3.1
-5.6MB RAM, up to 73.6MB
-340MB HD
-Expansion slot C-BUS4 (4)
-Graphics controller S3 86C928
+Dump coming from a dead machine
*/
-ROM_START( pc9821ap2 )
- ROM_REGION( 0x80000, "biosrom", ROMREGION_ERASEFF )
- ROM_DEFAULT_BIOS("phd0104")
- ROM_SYSTEM_BIOS(0, "phd0104", "PHD0104")
- ROMX_LOAD( "phd0104.rom", 0x000000, 0x80000, CRC(da73b372) SHA1(2c15b63a0869b81ef7f04972dbb0975f4e77d384), ROM_BIOS(0) )
- ROM_SYSTEM_BIOS(1, "phd0102", "PHD0102")
- ROMX_LOAD( "phd0102.rom", 0x000000, 0x80000, CRC(3036774c) SHA1(59856a348f156adf5eca06326f967aca54ff871c), ROM_BIOS(1) )
-
- ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- // TODO: identify ROM banks
- ROM_COPY( "biosrom", 0x20000, 0x10000, 0x08000 )
- ROM_COPY( "biosrom", 0x30000, 0x18000, 0x18000 )
-
- ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
-
- LOAD_KANJI_ROMS
- LOAD_IDE_ROM
-ROM_END
-
-
-/*
-98NOTE - i486SX 33
-*/
-
-ROM_START( pc9821ne )
- ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- ROM_LOAD( "itf.rom", 0x10000, 0x08000, CRC(dd4c7bb8) SHA1(cf3aa193df2722899066246bccbed03f2e79a74a) )
- ROM_LOAD( "bios_ne.rom", 0x18000, 0x18000, BAD_DUMP CRC(2ae070c4) SHA1(d7963942042bfd84ed5fc9b7ba8f1c327c094172) )
-
- ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font_ne.rom", 0x00000, 0x46800, BAD_DUMP CRC(fb213757) SHA1(61525826d62fb6e99377b23812faefa291d78c2e) )
-
- LOAD_KANJI_ROMS
- LOAD_IDE_ROM
-ROM_END
-
-/*
-98MULTi Ce2 - 80486SX 25
-*/
+ROM_START( pc9801vx )
+ ROM_REGION16_LE( 0x20000, "biosrom", ROMREGION_ERASEFF )
+ ROM_LOAD16_BYTE( "nec_d27c256d-15_cpu_extboard_yll01.bin", 0x00000, 0x08000, CRC(1b235313) SHA1(d2c5e2cea3ee0a643d3c5d384d134404b58db793) )
+ ROM_LOAD16_BYTE( "nec_d27c256d-15_cpu_extboard_yll03.bin", 0x00001, 0x08000, CRC(33605ae3) SHA1(f644ff15c54c8568e643324f38aa3b6211912af0) )
+ ROM_LOAD16_BYTE( "nec_d27c256d-15_cpu_extboard_yll02.bin", 0x10000, 0x08000, CRC(948f8658) SHA1(674378d4e90fee715ccfdd49378cd5c2fe8d7f62) )
+ ROM_LOAD16_BYTE( "nec_d27c256d-15_cpu_extboard_yll04.bin", 0x10001, 0x08000, CRC(2ce2101b) SHA1(2158d022d5424daf6981bf4da0ab9613bf9646f5) )
-ROM_START( pc9821ce2 )
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- ROM_LOAD( "itf_ce2.rom", 0x10000, 0x008000, CRC(273e9e88) SHA1(9bca7d5116788776ed0f297bccb4dfc485379b41) )
- ROM_LOAD( "bios_ce2.rom", 0x18000, 0x018000, BAD_DUMP CRC(76affd90) SHA1(910fae6763c0cd59b3957b6cde479c72e21f33c1) )
+ ROM_COPY( "biosrom", 0x18000, 0x10000, 0x08000 ) //ITF ROM
+ ROM_COPY( "biosrom", 0x08000, 0x18000, 0x08000 ) //BIOS ROM
+ ROM_COPY( "biosrom", 0x00000, 0x20000, 0x08000 )
+ ROM_COPY( "biosrom", 0x10000, 0x28000, 0x08000 )
ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font_ce2.rom", 0x00000, 0x046800, BAD_DUMP CRC(d1c2702a) SHA1(e7781e9d35b6511d12631641d029ad2ba3f7daef) )
+ ROM_LOAD( "font_ux.rom", 0x000000, 0x046800, BAD_DUMP CRC(19a76eeb) SHA1(96a006e8515157a624599c2b53a581ae0dd560fd) )
LOAD_KANJI_ROMS
- LOAD_IDE_ROM
+// LOAD_IDE_ROM
ROM_END
/*
-98MATE X - 486/Pentium based
+UX - 80286 10 + V30 8
*/
-ROM_START( pc9821xs )
+ROM_START( pc9801ux )
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- ROM_LOAD( "itf.rom", 0x10000, 0x008000, BAD_DUMP CRC(dd4c7bb8) SHA1(cf3aa193df2722899066246bccbed03f2e79a74a) )
- ROM_LOAD( "bios_xs.rom", 0x18000, 0x018000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) )
+ ROM_LOAD( "itf_ux.rom", 0x10000, 0x08000, CRC(c7942563) SHA1(61bb210d64c7264be939b11df1e9cd14ffeee3c9) )
+ ROM_LOAD( "bios_ux.rom", 0x18000, 0x18000, BAD_DUMP CRC(97375ca2) SHA1(bfe458f671d90692104d0640730972ca8dc0a100) )
ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font_xs.rom", 0x00000, 0x046800, BAD_DUMP CRC(c9a77d8f) SHA1(deb8563712eb2a634a157289838b95098ba0c7f2) )
+ ROM_LOAD( "font_ux.rom", 0x000000, 0x046800, BAD_DUMP CRC(19a76eeb) SHA1(96a006e8515157a624599c2b53a581ae0dd560fd) )
LOAD_KANJI_ROMS
- LOAD_IDE_ROM
+// LOAD_IDE_ROM
ROM_END
-
/*
-9821Xa16
-
-Pentium P54C @ 166
-32MB
-3.5"2DD/2HDx1, 8xCD-ROM
-CBus: 3 slots
-
+US - i386SX @ 16 MHz
*/
-ROM_START( pc9821xa16 )
- ROM_REGION16_LE( 0x40000, "biosrom", ROMREGION_ERASEFF )
- ROM_LOAD( "pc-9821xa16_g8yewa_a1_wsg8b01_ab28f200b5-t.bin", 0x00000, 0x040000, CRC(f99c8ce2) SHA1(2bc328d2c496046f6f4f39b0637e90b713a63155) ) // SOP44
+ROM_START( pc9801us )
+ ROM_REGION16_LE( 0x80000, "biosrom", ROMREGION_ERASEFF )
+ ROM_LOAD( "lrh8a00.bin", 0x000000, 0x080000, CRC(a86d8cdb) SHA1(01c805274ca943c1febedda5ad85ba532aac949c) )
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- // TODO: all of the 256k space seems valid
- ROM_COPY( "biosrom", 0x28000, 0x00000, 0x18000 )
- ROM_COPY( "biosrom", 0x00000, 0x18000, 0x18000 )
+ // 0x0c000-0x0ffff sound ROM BIOS
+ // 0x10000-0x13fff ^ mirror
+ // 0x14000-0x17fff <empty>
+ // 0x18000-0x191ff unknown, disk BIOS?
+ // 0x20000-0x27fff ITF ROM
+ // 0x40000-0x7ffff <empty>
+ ROM_COPY( "biosrom", 0x20000, 0x10000, 0x08000 ) //ITF ROM
+ ROM_COPY( "biosrom", 0x28000, 0x18000, 0x08000 ) //BIOS ROM
+ ROM_COPY( "biosrom", 0x30000, 0x20000, 0x08000 )
+ ROM_COPY( "biosrom", 0x38000, 0x28000, 0x08000 )
ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
+ ROM_LOAD( "font_ux.rom", 0x000000, 0x046800, BAD_DUMP CRC(19a76eeb) SHA1(96a006e8515157a624599c2b53a581ae0dd560fd) )
LOAD_KANJI_ROMS
- LOAD_IDE_ROM
+ // SASI HDDs
+// LOAD_IDE_ROM
ROM_END
-/*
-pc-9821Ra20 (98MATE R)
-
-Pentium Pro @ 200
-32MB
-3.5"2DD/2HDx1, 8xCD-ROM
-CBus: 3 slots
-*/
-
-ROM_START( pc9821ra20 )
- ROM_REGION16_LE( 0x40000, "biosrom", ROMREGION_ERASEFF )
- ROM_LOAD( "g8wtp_a13_wtp8b01_ab28f200b5-t.bin", 0x00000, 0x040000, CRC(cd3acc5c) SHA1(746490d7f3d8d0e8df865315adaaae65f3fd0425) ) // SOP44
-
- ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- // TODO: all of the 256k space seems valid
- ROM_COPY( "biosrom", 0x28000, 0x00000, 0x18000 )
- ROM_COPY( "biosrom", 0x00000, 0x18000, 0x18000 )
-
- ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
-
- LOAD_KANJI_ROMS
- LOAD_IDE_ROM
-ROM_END
/*
-pc-9821Ra333 (98MATE R)
+RX - 80286 12 (no V30?)
-Celeron @ 333
-32MB, max 256 MB (ECC EDO RAM)
-3.5x1, 24xCD-ROM
-CBus: 3 slots, PCI: 2 slots
+The bios is from a 386 model not an RX
*/
-
-ROM_START( pc9821ra333 )
- ROM_REGION16_LE( 0x40000, "biosrom", ROMREGION_ERASEFF )
- ROM_LOAD( "g8ykkw.bin", 0x00000, 0x040000, CRC(c605ef31) SHA1(3779aed757f21eb75093c1bfcbf18a232c198ee6) )
-
+ROM_START( pc9801rx )
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- // TODO: all of the 256k space seems valid
- ROM_COPY( "biosrom", 0x28000, 0x00000, 0x18000 )
- ROM_COPY( "biosrom", 0x00000, 0x18000, 0x18000 )
+ ROM_LOAD( "itf_rs.rom", 0x10000, 0x08000, BAD_DUMP CRC(c1815325) SHA1(a2fb11c000ed7c976520622cfb7940ed6ddc904e) )
+ ROM_LOAD( "bios_rx.rom", 0x18000, 0x18000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) )
+ // fix csum
+ ROM_FILL(0x2fffe, 1, 0x0d)
ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
+ ROM_LOAD( "font_rx.rom", 0x000000, 0x046800, BAD_DUMP CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff) )
LOAD_KANJI_ROMS
LOAD_IDE_ROM
ROM_END
-
/*
-98MATE VALUESTAR - Pentium based
-*/
-
-ROM_START( pc9821v13 )
- ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- ROM_LOAD( "itf.rom", 0x10000, 0x08000, CRC(dd4c7bb8) SHA1(cf3aa193df2722899066246bccbed03f2e79a74a) )
- ROM_LOAD( "bios_v13.rom", 0x18000, 0x18000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) )
-
- ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font_a.rom", 0x00000, 0x46800, BAD_DUMP CRC(c9a77d8f) SHA1(deb8563712eb2a634a157289838b95098ba0c7f2) )
+RS - 386SX @ 16 MHz
- LOAD_KANJI_ROMS
- LOAD_IDE_ROM
-ROM_END
-
-/*
-98MATE VALUESTAR - Pentium based
+(note: might be a different model!)
*/
-ROM_START( pc9821v20 )
+ROM_START( pc9801rs )
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- ROM_LOAD( "itf_v20.rom", 0x10000, 0x08000, CRC(10e52302) SHA1(f95b8648e3f5a23e507a9fbda8ab2e317d8e5151) )
- ROM_LOAD( "bios_v20.rom", 0x18000, 0x18000, BAD_DUMP CRC(d5d1f13b) SHA1(bf44b5f4e138e036f1b848d6616fbd41b5549764) )
-
- ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font_v20.rom", 0x00000, 0x046800, BAD_DUMP CRC(6244c4c0) SHA1(9513cac321e89b4edb067b30e9ecb1adae7e7be7) )
-
- LOAD_KANJI_ROMS
- LOAD_IDE_ROM
-ROM_END
-
-/*
-Epson PC-386M
-
-i386SX-16 @ 16
-1MB
-3.5"2DD/2HDx2
-CBus: 3slots
-*/
+ ROM_LOAD( "itf_rs.rom", 0x10000, 0x08000, CRC(c1815325) SHA1(a2fb11c000ed7c976520622cfb7940ed6ddc904e) )
+ ROM_LOAD( "bios_rs.rom", 0x18000, 0x18000, BAD_DUMP CRC(315d2703) SHA1(4f208d1dbb68373080d23bff5636bb6b71eb7565) )
-ROM_START( pc386m )
- ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- ROM_LOAD( "cwma-a02.bin", 0x10000, 0x08000, CRC(d2c357a4) SHA1(819c9a1fc92124a8d6a85339c74651add7efaf92) )
- ROM_CONTINUE( 0x18000, 0x18000 )
+ /* following is an emulator memory dump, should be checked and eventually nuked if nothing worth is there */
+ ROM_REGION( 0x100000, "memory", 0 )
+ ROM_LOAD( "00000.rom", 0x00000, 0x8000, CRC(6e299128) SHA1(d0e7d016c005cdce53ea5ecac01c6f883b752b80) )
+ ROM_LOAD( "c0000.rom", 0xc0000, 0x8000, CRC(1b43eabd) SHA1(ca711c69165e1fa5be72993b9a7870ef6d485249) ) // 0xff everywhere
+ ROM_LOAD( "c8000.rom", 0xc8000, 0x8000, CRC(f2a262b0) SHA1(fe97d2068d18bbb7425d9774e2e56982df2aa1fb) )
+ ROM_LOAD( "d0000.rom", 0xd0000, 0x8000, CRC(1b43eabd) SHA1(ca711c69165e1fa5be72993b9a7870ef6d485249) ) // 0xff everywhere
+ ROM_LOAD( "e8000.rom", 0xe8000, 0x8000, CRC(4e32081e) SHA1(e23571273b7cad01aa116cb7414c5115a1093f85) ) // contains n-88 basic (86) v2.0
+ ROM_LOAD( "f0000.rom", 0xf0000, 0x8000, CRC(4da85a6c) SHA1(18dccfaf6329387c0c64cc4c91b32c25cde8bd5a) )
+ ROM_LOAD( "f8000.rom", 0xf8000, 0x8000, CRC(2b1e45b1) SHA1(1fec35f17d96b2e2359e3c71670575ad9ff5007e) )
ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font_486mu.rom", 0x0000, 0x46800, BAD_DUMP CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff))
+ ROM_LOAD( "font_rs.rom", 0x00000, 0x46800, BAD_DUMP CRC(da370e7a) SHA1(584d0c7fde8c7eac1f76dc5e242102261a878c5e) )
LOAD_KANJI_ROMS
LOAD_IDE_ROM
ROM_END
/*
-Epson PC-486SE
+BX2/U2 - 486SX @ 25 MHz
-i486SX @ 25 MHz
-1.6 MB of conventional memory (???)
-17.6 MB
-CBus: 2slots
-*/
-
-ROM_START( pc486se )
- ROM_REGION16_LE( 0x20000, "biosrom", ROMREGION_ERASEFF )
- ROM_LOAD( "1699ma_cw99-a03.bin", 0x00000, 0x20000, CRC(f03df711) SHA1(88614746e01c7d3cff9f3b8ce0a598830a77d1dc) )
-
- ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- // this looks convoluted
- ROM_COPY( "biosrom", 0x08000, 0x00000, 0x08000 ) // tests this area at PC=0xf5149
- ROM_COPY( "biosrom", 0x00000, 0x10000, 0x08000 )
- ROM_COPY( "biosrom", 0x10000, 0x08000, 0x08000 )
-// ROM_FILL( 0x18000, 0x08000, 0x90) // untested by BIOS
- ROM_COPY( "biosrom", 0x10000, 0x20000, 0x08000 ) // PC=f5113 bankswitch into same area, correct?
- ROM_COPY( "biosrom", 0x18000, 0x28000, 0x08000 )
-
- ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font_486mu.rom", 0x0000, 0x46800, BAD_DUMP CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff))
-
- LOAD_KANJI_ROMS
- LOAD_IDE_ROM
-ROM_END
+Yet another franken-romset done with direct memory dump, shrug
-/*
-Epson PC-486MU
-i486SX-33 @ 33
-8MB RAM
-3.5'2DD/2HDx2, 2xCD-ROM
-CBus: 3 slots
*/
-ROM_START( pc486mu )
- ROM_REGION16_LE( 0x20000, "biosrom", ROMREGION_ERASEFF )
- ROM_LOAD( "pc-486mu_hn27c1024.bin", 0x00000, 0x20000, CRC(113268e1) SHA1(2a630abc825b2808f9f8fb65c6cb1fb7e7f6c710))
-// ROM_LOAD( "bios_486mu.rom", 0x00000, 0x18000, BAD_DUMP CRC(57b5d701) SHA1(15029800842e93e07615b0fd91fb9f2bfe3e3c24))
+ROM_START( pc9801bx2 )
+ ROM_REGION16_LE( 0x40000, "biosrom", ROMREGION_ERASEFF )
+ ROM_LOAD( "pc98bank0.bin", 0x00000, 0x08000, BAD_DUMP CRC(bfd100cc) SHA1(cf8e6a5679cca7761481abef0ba4b35ead39efdb) )
+ ROM_LOAD( "pc98bank1.bin", 0x08000, 0x08000, BAD_DUMP CRC(d0562af8) SHA1(2c4fd27eb598f4b8a00f3e86941ba27007d58e47) )
+ ROM_LOAD( "pc98bank2.bin", 0x10000, 0x08000, BAD_DUMP CRC(12818a14) SHA1(9c31e8ac85d78fa779d6bbc2095557065294ec09) )
+ ROM_LOAD( "pc98bank3.bin", 0x18000, 0x08000, BAD_DUMP CRC(d0bda44e) SHA1(c1022a3b2be4d2a1e43914df9e4605254e5f99d5) )
+ ROM_LOAD( "pc98bank4.bin", 0x20000, 0x08000, BAD_DUMP CRC(be8092f4) SHA1(12c8a166b8c6ebbef85568b67e1f098562883365) )
+ ROM_LOAD( "pc98bank5.bin", 0x28000, 0x08000, BAD_DUMP CRC(4e32081e) SHA1(e23571273b7cad01aa116cb7414c5115a1093f85) )
+ ROM_LOAD( "pc98bank6.bin", 0x30000, 0x08000, BAD_DUMP CRC(f878c160) SHA1(cad47f09075ffe4f7b51bb937c9f716c709d4596) )
+ ROM_LOAD( "pc98bank7.bin", 0x38000, 0x08000, BAD_DUMP CRC(1bd6537b) SHA1(ff9ee1c976a12b87851635ce8991ac4ad607675b) )
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
- // backported from pc486se
- ROM_COPY( "biosrom", 0x08000, 0x00000, 0x08000 )
- ROM_COPY( "biosrom", 0x00000, 0x10000, 0x08000 )
- ROM_COPY( "biosrom", 0x10000, 0x08000, 0x08000 )
-// ROM_FILL( 0x18000, 0x08000, 0x90) // untested by BIOS
- ROM_COPY( "biosrom", 0x10000, 0x20000, 0x08000 )
- ROM_COPY( "biosrom", 0x18000, 0x28000, 0x08000 )
-
+ ROM_COPY( "biosrom", 0x20000, 0x10000, 0x8000 ) // ITF ROM
+ ROM_COPY( "biosrom", 0x28000, 0x18000, 0x8000 ) // BIOS ROM
+ ROM_COPY( "biosrom", 0x30000, 0x20000, 0x8000 )
+ ROM_COPY( "biosrom", 0x38000, 0x28000, 0x8000 )
ROM_REGION( 0x80000, "chargen", 0 )
- ROM_LOAD( "font_486mu.rom", 0x0000, 0x46800, BAD_DUMP CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff))
+ ROM_LOAD( "font_rs.rom", 0x00000, 0x46800, BAD_DUMP CRC(da370e7a) SHA1(584d0c7fde8c7eac1f76dc5e242102261a878c5e) )
LOAD_KANJI_ROMS
LOAD_IDE_ROM
@@ -3195,7 +2733,7 @@ void pc9801_state::init_pc9801_kanji()
#undef copy_kanji_strip
}
-void pc9801_state::init_pc9801vm_kanji()
+void pc9801vm_state::init_pc9801vm_kanji()
{
uint32_t raw_tile;
uint8_t *chargen = memregion("chargen")->base();
@@ -3269,65 +2807,91 @@ void pc9801_state::init_pc9801vm_kanji()
}
}
-// For simpilicity's sake we arbitrarily group those with whatever romset came first historically.
-// This is also repeated in SW list reports: you'd have to use an "On RS class xxx" format to indicate a bug report
-// specifically happening for a family group. This will be hopefully put into stone with driver splits at some point in future.
+// We keep track of anything undumped of note that belongs to the "PC-98" family tree here, and try to give a
+// sub-tree code in state machine if not obvious from the naming suffix.
+// This is also repeated in SW list reports, i.e. you have to use an "On RS class xxx" format to indicate a bug report
+// specifically happening for PC9801RS. This will be hopefully put into stone with driver splits at some point in future.
// "vanilla" class (i86, E/F/M)
-COMP( 1983, pc9801f, 0, 0, pc9801, pc9801, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801F", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // genuine dump
+COMP( 1983, pc9801f, 0, 0, pc9801, pc9801, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801F", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // genuine dump
-// N5200 (started as a vanilla PC-98 business line derivative, eventually diverged into its own thing and incorporated various Hyper 98 features. Runs proprietary PTOS)
+// N5200 (started as a vanilla PC-98 business line derivative,
+// eventually diverged into its own thing and incorporated various Hyper 98 features.
+// Runs proprietary PTOS)
// APC III (US version of either vanilla PC9801 or N5200, aimed at business market. Runs MS-DOS 2.11/3.xx or PC-UX)
// ...
-// VM class (V30 and/or i286)
-COMP( 1985, pc9801vm, pc9801ux, 0, pc9801vm, pc9801rs, pc9801_state, init_pc9801vm_kanji, "NEC", "PC-9801VM", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // genuine dump
-COMP( 1985, pc9801vm11, pc9801ux, 0, pc9801vm, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801VM11", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-COMP( 1987, pc9801ux, 0, 0, pc9801ux, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801UX", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
+// 文豪 a.k.a. "Bungo" (A full family of desktop & notebook word processors)
+// NWP-20N (OG 1981 model)
+// HWP "Hyper 7" (business model)
+// DP "DP NOTE" ("Document Processor", based off various flavours of N5820 & 9821NOTE combo)
+// DP-70F (based off N5820-70FA & 9821ap2)
+// DP-70S (Document Filing Server)
+// Mini 5
+// Mini 7
+// JX series
+// ...
+
+// VM class (V30)
+COMP( 1985, pc9801vm, 0, 0, pc9801vm, pc9801rs, pc9801vm_state, init_pc9801vm_kanji, "NEC", "PC-9801VM", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // genuine dump
+COMP( 1985, pc9801vm11, pc9801ux, 0, pc9801vm, pc9801vm11, pc9801vm_state, init_pc9801_kanji, "NEC",
+ "PC-9801VM11", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+// UX class (i286)
+COMP( 1987, pc9801ux, 0, 0, pc9801ux, pc9801rs, pc9801vm_state, init_pc9801_kanji, "NEC", "PC-9801UX", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
// VX class (first model using an EGC)
-// ...
+// original VX0/VX2/VX4 released in Nov 1986, minor updates with OS pre-installed etc. in 1987
+COMP( 1986, pc9801vx, 0, 0, pc9801vx, pc9801rs, pc9801vm_state, init_pc9801_kanji, "NEC", "PC-9801VX", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
// XA/XL class (1120 x 750 true color, nicknamed "High-reso")
// ...
// PC-H98 (Hyper 98, '90-'93 high end line with High-reso, proprietary NESA bus, E²GC)
// PC-H98T (LCD Hyper 98)
-// SV-H98 (Later Hyper 98 revision, up to Pentium CPU)
+// SV-H98 "98SERVER" (i486, later Hyper 98 revision)
+// SV-98 (Pentium based, second gen of 98SERVER)
+// OP-98 ("Office Processor", released around '91. Reports claims to be H98-like, with extra connectivity with NEC 7200 workstation)
+// ...
+
+// CV class (V30, compact version with monitor built-in like a Macintosh)
// ...
// RS class (i386SX)
-COMP( 1988, pc9801rx, pc9801rs, 0, pc9801rs, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801RX", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-COMP( 1989, pc9801rs, 0, 0, pc9801rs, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801RS", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
+COMP( 1988, pc9801rx, pc9801rs, 0, pc9801rs, pc9801rs, pc9801vm_state, init_pc9801_kanji, "NEC", "PC-9801RX", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+COMP( 1989, pc9801rs, 0, 0, pc9801rs, pc9801rs, pc9801vm_state, init_pc9801_kanji, "NEC", "PC-9801RS", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+// DA class (i386SX + SDIP and EMS)
+// ...
+// UF/UR/US class (i386SX + SDIP, optional high-reso according to BIOS? Derivatives of UX)
+COMP( 1992, pc9801us, 0, 0, pc9801us, pc9801rs, pc9801us_state, init_pc9801_kanji, "NEC", "PC-9801US", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
// FA class (i486SX)
-COMP( 1993, pc9801bx2, pc9801rs, 0, pc9801bx2, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801BX2/U2", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
+// ...
+// BX class (official nickname "98 FELLOW", last releases prior to 9821 line)
+COMP( 1993, pc9801bx2, 0, 0, pc9801bx2, pc9801rs, pc9801bx_state, init_pc9801_kanji, "NEC", "PC-9801BX2/U2 (98 FELLOW)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
// PC-98GS (Multimedia PC, exclusive video mode "Extended Screen Graphics", -73 sound board (a superset of later -86), superimposition)
// ...
-// Epson class
-COMP( 1990, pc386m, 0, 0, pc386m, pc9801rs, pc9801_state, init_pc9801_kanji, "Epson", "PC-386M", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-COMP( 1994, pc486mu, 0, 0, pc486mu, pc9821, pc9801_state, init_pc9801_kanji, "Epson", "PC-486MU", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-COMP( 1993, pc486se, pc486mu, 0, pc486se, pc9801rs, pc9801_state, init_pc9801_kanji, "Epson", "PC-486SE", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-
-// PC9821 class
-// TODO: unknown real model of parent, given the BIOS rom size wrt the others it may be better suited as a "98Multi" or even a FA class?
-// investigate by making genuine BIOS dumps to boot
-COMP( 1994, pc9821, 0, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-COMP( 1993, pc9821as, pc9821, 0, pc9821as, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE A)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-COMP( 1993, pc9821ap2, pc9821, 0, pc9821ap2, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821AP2/U8W (98MATE A)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-COMP( 1994, pc9821xs, pc9821, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE Xs)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-COMP( 1994, pc9821ce2, pc9821, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MULTi Ce2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-COMP( 1994, pc9821ne, pc9821, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98NOTE)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-COMP( 1996, pc9821xa16, pc9821, 0, pc9821xa16, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821Xa16", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-COMP( 1996, pc9821ra20, pc9821, 0, pc9821ra20, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821Ra20 (98MATE R)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-COMP( 1998, pc9821ra333, pc9821, 0, pc9821ra333, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821Ra333 (98MATE R)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-COMP( 1998, pc9821v13, pc9821, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE VALUESTAR 13)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-COMP( 1998, pc9821v20, pc9821, 0, pc9821v20, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE VALUESTAR 20)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
+// Epson class knockoffs -> cfr. pc9801_epson.cpp
+
+// PC9821 -> cfr. pc9821.cpp
// PC98DO (PC88+PC98, V33 + μPD70008AC)
+// ...
-// PC-98LT (laptop b&w LCD version V50, no upd7220, just one single bitmap layer)
-// PC-98HA aka HANDY98 (portable b&w LCD version, V50, apparently compatible with LT)
+// PC-98LT / PC-98HA -> cfr. pc98ha.cpp
+// PC-9801T (i386SX, extremely expensive TFT or LCD laptop with C-Bus slots, de-facto a "portable" desktop machine)
+// PC-9801LX (i286, belongs to pc98ha.cpp?)
+// PC-9801LS (i386SX, Plasma laptop)
// RC-9801 (portable (color?) LCD, i386SX, wireless 9600bps modem)
// PC-9801P (LCD with light pen)
+// DB-P1 (1993 b&w LCD touch tablet / eBook)
+
+// DtermPC (V30/V40/V50 LCD terminal telephone aimed at digital PBX exchanges)
+
+// FC-9801 (FC stands for "Factory Computer". Aimed at industrial automation, has similarly named models from 9801 to 9821 and H98.
+// Uses a FC-9801-06 RAS "Reliability, Availability and Serviceability" specific expansion)
+// FC98-NX (Evolution of FC-9821Ka, first model FC20C released in 1998, branch is still running to date.
+// Most likely just DOS/V compatible and not going to fit here except for RAS capabilities)
+
+// TWINPOS ("Point Of Sale" from NEC, originally based off PC-98 arch, eventually switched to DOS/V too?)
diff --git a/src/mame/drivers/pc9801_epson.cpp b/src/mame/drivers/pc9801_epson.cpp
new file mode 100644
index 00000000000..2c417268a4d
--- /dev/null
+++ b/src/mame/drivers/pc9801_epson.cpp
@@ -0,0 +1,490 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese,Carl
+/**************************************************************************************************
+
+ Epson PC98[01] class machine
+
+ TODO (PC-386M):
+ - Incomplete shadow IPL banking, we currently never bankswitch to the other ROM bank
+ (which barely contains program code);
+ - "ERR:VR" at POST (GFX VRAM)
+ Sub-routine that throws this is at PC=0xfd9bc. Notice that you can actually skip this
+ with eip=0x1bf in debugger and make the system to actually checkout memory installed.
+ (Shorthand: "bp fd9bc,eip=0x1bf")
+ - POST throws non-fatal "ERR:PA" (page fault, "Protected Address"?) after checking memory
+ installed. Non-fatal as in POST will checkout bootable devices afterward.
+
+ TODO: (PC-486SE/PC-486MU):
+ - Verify ROM bankswitch;
+ On PC-486SE sets up what is normally IPL bankswitch at PC=0xf5115, successive opcode
+ is a jmp 0xf8000, pretty unlikely it delays bankswitch so assume it reloads
+ the same bank.
+ - Remove IDE regression hack at I/O $74e;
+ - Regressed with a ERR:RA (conventional memory!?) when moving driver to
+ stand-alone file;
+ - Eventually errors with a ERR:VR (GFX VRAM);
+
+ Notes:
+ - A detailed list of Epson PC98s can be seen from here:
+ http://www.pc-9800.net/db_epson/index.htm
+
+ - Being these knockoffs means that there isn't 100% compatibility with all SWs.
+ Additionally NEC introduced the so called "EPSON Protect" / "EPSON check" (エプソンチェック)
+ starting with MS-DOS 3.3 onward, which checks the presence of NEC / Microsoft copyright
+ string at E800:0DD8 and refuses to boot if not satisfied.
+ cfr. https://github.com/joncampbell123/dosbox-x/issues/682
+ Epson offcially provided PC "Software Installation Program" (SIP) floppy disks
+ (the "epinstal*" in SW list?) that counteracts with the protection check.
+ There's alternatively a freeware user released "Dispell!" program tool that can be used for
+ the same purpose, which also works for 32-bit DOS/V machines.
+
+**************************************************************************************************/
+
+#include "emu.h"
+#include "includes/pc9801_epson.h"
+
+template <unsigned which> void pc98_epson_state::shadow_ipl_w(offs_t offset, u16 data, u16 mem_mask)
+{
+ // TODO: shadow register 0x6a may actually be write deprotect
+ COMBINE_DATA(&m_shadow_ipl[which][offset]);
+}
+
+/**************************************************************************************************
+
+ Control port for Epson shadow IPL
+
+ If any of these isn't right system throws "ERR:BR" at boot (BIOS loader error).
+ Executes some code in text VRAM area (PC=$a006e), trying to setup a writeable RAM bank
+ to IPL window area.
+
+**************************************************************************************************/
+void pc98_epson_state::epson_ipl_bank_w(offs_t offset, u8 data)
+{
+ m_shadow_ipl_bank = data;
+ switch(m_shadow_ipl_bank)
+ {
+ case 0x2a:
+ m_ipl->set_bank(2);
+ break;
+ case 0xe6:
+ m_ipl->set_bank(0);
+ break;
+ default:
+ // TODO: at least 0xa6 used, what for?
+ logerror("%s: unknown Epson shadow IPL bank setting set %02x\n", machine().describe_context(), data);
+ break;
+ }
+}
+
+// overrides original PC98 $43c-$43f ports
+void pc98_epson_state::epson_itf_bank_w(offs_t offset, u8 data)
+{
+ // $43f
+ if (offset == 1)
+ {
+ switch(data)
+ {
+ case 0x40: m_itf_bank_enable = false; break;
+ case 0x42: m_itf_bank_enable = true; break;
+ default:
+ logerror("%s: unknown ITF enable setting %02x\n", machine().describe_context(), data);
+ break;
+ }
+ }
+
+ // $43d
+ if (offset == 0)
+ {
+ switch(data)
+ {
+ case 0x00:
+ case 0x02:
+ if (m_itf_bank_enable == true)
+ m_ipl->set_bank((data & 2) >> 1);
+ break;
+ default:
+ // TODO: 0x10 - 0x12 setting, which should be same as NEC PC98
+ // (i.e. reversed compared to above)
+ logerror("%s: unknown ITF bank setting %02x\n", machine().describe_context(), data);
+ break;
+ }
+ }
+}
+
+void pc98_epson_state::epson_a20_w(offs_t offset, u8 data)
+{
+ // pc386m PC=0xfd9b3
+ // if this isn't mapped then POST throws "ERR:RA" (conventional memory -> "Real Address"?)
+ m_gate_a20 = data & 1;
+ m_maincpu->set_input_line(INPUT_LINE_A20, m_gate_a20 ? ASSERT_LINE : CLEAR_LINE);
+ logerror("%s: Epson gate a20 %02x\n", machine().describe_context(), data);
+}
+
+void pc98_epson_state::epson_vram_bank_w(offs_t offset, u8 data)
+{
+// m_vram_bank = (data & 1) ^ 1;
+ // accessed in the same routine that actually throws ERR:VR
+ logerror("%s: Epson $c06 write %02x\n", machine().describe_context(), data);
+}
+
+void pc98_epson_state::pc386m_map(address_map &map)
+{
+ pc9801rs_map(map);
+ // TODO: is shadow RAM physically mapped here?
+// map(0xd0000, 0xd**ff).ram();
+}
+
+void pc98_epson_state::pc486se_map(address_map &map)
+{
+ pc386m_map(map);
+ map(0x000e8000, 0x000fffff).m(m_ipl, FUNC(address_map_bank_device::amap16));
+ map(0xffee8000, 0xffefffff).m(m_ipl, FUNC(address_map_bank_device::amap16));
+ map(0xfffe8000, 0xffffffff).m(m_ipl, FUNC(address_map_bank_device::amap16));
+}
+
+void pc98_epson_state::pc386m_io(address_map &map)
+{
+ pc9801rs_io(map);
+// map(0x0c03, 0x0c03).r Epson CPU mode, 'R' for Real mode, 'P' for Protected mode (lolwut)
+ map(0x0c05, 0x0c05).w(FUNC(pc98_epson_state::epson_a20_w));
+ map(0x0c06, 0x0c06).w(FUNC(pc98_epson_state::epson_vram_bank_w));
+ map(0x0c07, 0x0c07).w(FUNC(pc98_epson_state::epson_ipl_bank_w));
+// map(0x0c13, 0x0c13).r Epson <unknown> readback
+// map(0x0c14, 0x0c14).r Epson <unknown> readback
+}
+
+void pc98_epson_state::pc486se_io(address_map &map)
+{
+ pc386m_io(map);
+
+ map(0x0082, 0x0082).lr8(NAME([]() -> u8 { return 0x00; }));
+
+ map(0x043c, 0x043f).w(FUNC(pc98_epson_state::epson_itf_bank_w)).umask16(0xff00);
+
+ map(0x0c42, 0x0c43).lr16(NAME([]() -> u16 { return 0x0000; }));
+
+// map(0x0640, 0x064f).rw(FUNC(pc9801_state::ide_cs0_r), FUNC(pc9801_state::ide_cs0_w));
+// map(0x0740, 0x074f).rw(FUNC(pc9801_state::ide_cs1_r), FUNC(pc9801_state::ide_cs1_w));
+ // HACK: avoid POST moaning for misconfigured HDDs (!?)
+ map(0x074e, 0x074e).lr8(NAME([]() -> u8 { return 0xff; }));
+
+ // (R) bit 0: expected to go off at PC=0xf8c52 (pc486se)
+ // (W) commands for?
+ map(0x0c09, 0x0c09).lr8(NAME([]() -> u8 { return 0x00; }));
+ map(0x0c0b, 0x0c0b).lr8(NAME([]() -> u8 { return 0x00; }));
+}
+
+void pc98_epson_state::pc386m_ipl_bank(address_map &map)
+{
+ map(0x00000, 0x17fff).rom().region("ipl", 0x00000).w(FUNC(pc98_epson_state::shadow_ipl_w<0>));
+ map(0x18000, 0x2ffff).rom().region("ipl", 0x18000).w(FUNC(pc98_epson_state::shadow_ipl_w<1>));
+ map(0x30000, 0x47fff).ram().share("shadow_ipl_0");
+ map(0x48000, 0x5ffff).ram().share("shadow_ipl_1");
+}
+
+static INPUT_PORTS_START( pc386m )
+ // in tracer bullet fashion we intentionally separated all dips/mouse switches
+ // since there's no real need to actually INPUT_PORTS_EXTERN here:
+ // - mouse should really be a device interface anyway;
+ // - dips may really diverge from NEC specs or even be unmapped (needs verification).
+ // In both cases those needs a major cleanup, haven't yet found actual documentation for these specifically.
+ // Notice that Epson eventually inherited SDIP chip as well.
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x01, 0x01, "Monitor Type" )
+ PORT_DIPSETTING( 0x00, "Normal Display (15KHz)" )
+ PORT_DIPSETTING( 0x01, "Hi-Res Display (24KHz)" )
+ PORT_DIPNAME( 0x02, 0x00, "DSW1" )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, "Display Type" )
+ PORT_DIPSETTING( 0x04, "RGB" )
+ PORT_DIPSETTING( 0x00, "Plasma" )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x00, "Graphic Function" )
+ PORT_DIPSETTING( 0x80, "Basic (8 Colors)" )
+ PORT_DIPSETTING( 0x00, "Expanded (16/4096 Colors)" )
+
+ PORT_START("DSW2")
+ PORT_DIPNAME( 0x01, 0x00, "DSW2" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, "GDC clock" )
+ PORT_DIPSETTING( 0x80, "2.5 MHz" )
+ PORT_DIPSETTING( 0x00, "5 MHz" )
+
+ PORT_START("DSW3")
+ PORT_DIPNAME( 0x01, 0x01, "FDD Fix Mode" )
+ PORT_DIPSETTING( 0x00, "Auto-Detection" )
+ PORT_DIPSETTING( 0x01, "Fixed" )
+ PORT_DIPNAME( 0x02, 0x02, "FDD Density Select" )
+ PORT_DIPSETTING( 0x00, "2DD" )
+ PORT_DIPSETTING( 0x02, "2HD" )
+ PORT_DIPNAME( 0x04, 0x04, "DSW3" )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, "Conventional RAM size" )
+ PORT_DIPSETTING( 0x40, "640 KB" )
+ PORT_DIPSETTING( 0x00, "512 KB" )
+ PORT_DIPNAME( 0x80, 0x00, "CPU Type" )
+ PORT_DIPSETTING( 0x80, "V30" )
+ PORT_DIPSETTING( 0x00, "I386" )
+
+ PORT_START("MOUSE_X")
+ PORT_BIT( 0xff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30)
+
+ PORT_START("MOUSE_Y")
+ PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30)
+
+ PORT_START("MOUSE_B")
+ PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(MOUSECODE_BUTTON2) PORT_NAME("Mouse Right Button")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(MOUSECODE_BUTTON3) PORT_NAME("Mouse Middle Button")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(MOUSECODE_BUTTON1) PORT_NAME("Mouse Left Button")
+
+ PORT_START("ROM_LOAD")
+ PORT_BIT( 0x03, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_CONFNAME( 0x04, 0x04, "Load IDE BIOS" )
+ PORT_CONFSETTING( 0x00, DEF_STR( Yes ) )
+ PORT_CONFSETTING( 0x04, DEF_STR( No ) )
+INPUT_PORTS_END
+
+MACHINE_START_MEMBER(pc98_epson_state, pc98_epson)
+{
+ MACHINE_START_CALL_MEMBER(pc9801rs);
+}
+
+MACHINE_RESET_MEMBER(pc98_epson_state, pc98_epson)
+{
+ MACHINE_RESET_CALL_MEMBER(pc9801rs);
+ m_ipl->set_bank(0);
+}
+
+void pc98_epson_state::pc386m(machine_config &config)
+{
+ pc9801rs(config);
+ I386SX(config.replace(), m_maincpu, 16000000); // i386SX 16MHz, switchable to 10/6 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc98_epson_state::pc386m_map);
+ m_maincpu->set_addrmap(AS_IO, &pc98_epson_state::pc386m_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ m_ipl->set_addrmap(AS_PROGRAM, &pc98_epson_state::pc386m_ipl_bank);
+ // TODO: 19 or 20 address lines?
+ // 20 may be used in case that mixed up ROM & shadow IPL loads are actually possible
+ // (which sounds pretty possible)
+ m_ipl->set_options(ENDIANNESS_LITTLE, 16, 19, 0x18000);
+
+ MCFG_MACHINE_START_OVERRIDE(pc98_epson_state, pc98_epson)
+ MCFG_MACHINE_RESET_OVERRIDE(pc98_epson_state, pc98_epson)
+
+ // RAM: 640KB + 14.6MB max
+ // 2 3.5 floppy drives
+ // ...
+}
+
+void pc98_epson_state::pc486se(machine_config &config)
+{
+ pc386m(config);
+ const XTAL xtal = XTAL(25'000'000);
+ I486(config.replace(), m_maincpu, xtal); // i486SX, switchable to 10/5 MHz, supports overdrive
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc98_epson_state::pc486se_map);
+ m_maincpu->set_addrmap(AS_IO, &pc98_epson_state::pc486se_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ pit_clock_config(config, xtal/8); // unknown, passes "ERR:TM" test
+
+ // RAM: 1.6 MB (!) + 17.6 max
+ // "dedicated internal memory slot x 1"
+ // "dedicated video board" slot
+}
+
+void pc98_epson_state::pc486mu(machine_config &config)
+{
+ pc386m(config);
+ const XTAL xtal = XTAL(33'000'000);
+ I486(config.replace(), m_maincpu, xtal); // i486SX, switchable to I386DX 10MHz/5MHz, Pentium ODP compatible
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc98_epson_state::pc486se_map);
+ m_maincpu->set_addrmap(AS_IO, &pc98_epson_state::pc386m_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ pit_clock_config(config, xtal/8); // unknown, passes "ERR:TM" test
+
+ // CL-GD5428
+ // RAM: 5.6 + 61.6MB max
+ // 2 x 3.5 floppy drives
+}
+
+
+// backported from pc98, of course both aren't 100% identical to the NEC counterpart
+#define LOAD_IDE_ROM \
+ ROM_REGION( 0x4000, "ide", ROMREGION_ERASEVAL(0xcb) ) \
+ ROM_LOAD( "epson_ide_bios.rom", 0x0000, 0x2000, NO_DUMP ) \
+ ROM_IGNORE( 0x2000 ) \
+ ROM_IGNORE( 0x2000 ) \
+ ROM_IGNORE( 0x2000 )
+
+#define LOAD_KANJI_ROMS \
+ ROM_REGION( 0x80000, "raw_kanji", ROMREGION_ERASEFF ) \
+ ROM_LOAD16_BYTE( "24256c-x01.bin", 0x00000, 0x4000, BAD_DUMP CRC(28ec1375) SHA1(9d8e98e703ce0f483df17c79f7e841c5c5cd1692) ) \
+ ROM_CONTINUE( 0x20000, 0x4000 ) \
+ ROM_LOAD16_BYTE( "24256c-x02.bin", 0x00001, 0x4000, BAD_DUMP CRC(90985158) SHA1(78fb106131a3f4eb054e87e00fe4f41193416d65) ) \
+ ROM_CONTINUE( 0x20001, 0x4000 ) \
+ ROM_LOAD16_BYTE( "24256c-x03.bin", 0x40000, 0x4000, BAD_DUMP CRC(d4893543) SHA1(eb8c1bee0f694e1e0c145a24152222d4e444e86f) ) \
+ ROM_CONTINUE( 0x60000, 0x4000 ) \
+ ROM_LOAD16_BYTE( "24256c-x04.bin", 0x40001, 0x4000, BAD_DUMP CRC(5dec0fc2) SHA1(41000da14d0805ed0801b31eb60623552e50e41c) ) \
+ ROM_CONTINUE( 0x60001, 0x4000 ) \
+ ROM_REGION( 0x100000, "kanji", ROMREGION_ERASEFF ) \
+ ROM_REGION( 0x80000, "new_chargen", ROMREGION_ERASEFF )
+
+/*
+Epson PC-386M
+
+i386SX-16 @ 16
+1MB
+3.5"2DD/2HDx2
+CBus: 3slots
+*/
+
+ROM_START( pc386m )
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // bank 0: definitely wants this ROM mapping otherwise POST throws "ERR:R0" (BIOS checksum)
+ ROM_LOAD( "cwma-a02.bin", 0x10000, 0x08000, CRC(d2c357a4) SHA1(819c9a1fc92124a8d6a85339c74651add7efaf92) )
+ ROM_CONTINUE( 0x00000, 0x10000 )
+ ROM_CONTINUE( 0x28000, 0x08000 ) // bank 1, unconfirmed
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font_486mu.rom", 0x0000, 0x46800, BAD_DUMP CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff))
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+/*
+Epson PC-486SE
+
+i486SX @ 25 MHz
+1.6 MB of conventional memory (???)
+17.6 MB
+CBus: 2slots
+*/
+
+ROM_START( pc486se )
+ ROM_REGION16_LE( 0x20000, "biosrom", ROMREGION_ERASEFF )
+ ROM_LOAD( "1699ma_cw99-a03.bin", 0x00000, 0x20000, CRC(f03df711) SHA1(88614746e01c7d3cff9f3b8ce0a598830a77d1dc) )
+
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // this is quite convoluted
+ ROM_COPY( "biosrom", 0x08000, 0x00000, 0x08000 )
+ ROM_COPY( "biosrom", 0x00000, 0x10000, 0x08000 )
+ ROM_COPY( "biosrom", 0x10000, 0x08000, 0x08000 )
+// ROM_FILL( 0x18000, 0x08000, 0x90) // untested by BIOS
+ ROM_COPY( "biosrom", 0x10000, 0x20000, 0x08000 )
+ ROM_COPY( "biosrom", 0x18000, 0x28000, 0x08000 )
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font_486mu.rom", 0x0000, 0x46800, BAD_DUMP CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff))
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+/*
+Epson PC-486MU
+i486SX-33 @ 33
+8MB RAM
+3.5'2DD/2HDx2, 2xCD-ROM
+CBus: 3 slots
+*/
+
+ROM_START( pc486mu )
+ ROM_REGION16_LE( 0x20000, "biosrom", ROMREGION_ERASEFF )
+ ROM_LOAD( "pc-486mu_hn27c1024.bin", 0x00000, 0x20000, CRC(113268e1) SHA1(2a630abc825b2808f9f8fb65c6cb1fb7e7f6c710))
+// ROM_LOAD( "bios_486mu.rom", 0x00000, 0x18000, BAD_DUMP CRC(57b5d701) SHA1(15029800842e93e07615b0fd91fb9f2bfe3e3c24))
+
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // backported from pc486se
+ ROM_COPY( "biosrom", 0x08000, 0x00000, 0x08000 )
+ ROM_COPY( "biosrom", 0x00000, 0x10000, 0x08000 )
+ ROM_COPY( "biosrom", 0x10000, 0x08000, 0x08000 )
+// ROM_FILL( 0x18000, 0x08000, 0x90) // untested by BIOS
+ ROM_COPY( "biosrom", 0x10000, 0x20000, 0x08000 )
+ ROM_COPY( "biosrom", 0x18000, 0x28000, 0x08000 )
+
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font_486mu.rom", 0x0000, 0x46800, BAD_DUMP CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff))
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+// Epson PC98 desktop line
+
+// PC-286 (i286, first model released in Oct 1987)
+// PC-286U (same as above except running on V30)
+// PC-286C "PC Club" (same as PC-286?)
+// ...
+
+// PC-386 (i386)
+COMP( 1990, pc386m, 0, 0, pc386m, pc386m, pc98_epson_state, init_pc9801_kanji, "Epson", "PC-386M", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+// PC-486 (i486SX/DX)
+COMP( 1994, pc486mu, 0, 0, pc486se, pc386m, pc98_epson_state, init_pc9801_kanji, "Epson", "PC-486MU", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+COMP( 1993, pc486se, pc486mu, 0, pc486se, pc386m, pc98_epson_state, init_pc9801_kanji, "Epson", "PC-486SE", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+// PRO-486 (first actual version with i486dx? Supports High-reso)
+// PC-486P/Win (same as a PC-486P but with Windows 3.0a + MS-DOS 3.3 HDD pre-installed?)
+
+// PC-586 (Pentium/Pentium ODP compatibles)
+// ...
+
+// Epson PC98 L[aptop] line
+// PC-286B (80C286)
+// PC-286L* (V30 or 80C286)
+// ...
+
+// PC-386BL* (i386sx)
+// PC-386LS* (just bigger version of above?)
+// ...
+
+// Epson PC98 NOTE[book] line
+// PC-*86N* (runs on correlated CPU as above)
+// PC-486PT ("P[or]T[able]" SL enhanced i486, wallet-like dimensions, supports light pen, runs under "PenDOS")
+// ...
diff --git a/src/mame/drivers/pc9821.cpp b/src/mame/drivers/pc9821.cpp
new file mode 100644
index 00000000000..bb9e1ff9857
--- /dev/null
+++ b/src/mame/drivers/pc9821.cpp
@@ -0,0 +1,1418 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese,Carl
+/**************************************************************************************************
+
+ NEC PC-9821
+
+ follow-up to PC-9801 for the consumer market
+
+ TODO (PC-9821):
+ - non-fatal "cache error" at POST for all machines listed here;
+ - undumped IDE ROM, kludged to work;
+ - further state machine breakdowns;
+
+ TODO (PC-9821As):
+ - unimplemented SDIP specific access;
+ - "SYSTEM SHUTDOWN" while accessing above;
+ - Update: it never goes into above after I changed default m_dma_access_ctrl to 0xfe?
+
+ TODO (PC-9821Cx3):
+ - "MICON ERROR" at POST, we currently return a ready state in remote control register
+ to bypass it, is it expected behaviour?
+ - Hangs normally with "Set the SDIP" message, on soft reset tries to r/w I/Os
+ $b00-$b03, kanji RAM $a9 and $f0 (mostly bit 5, built-in 27 inches HDD check?) then keeps
+ looping;
+ - 0xfa2c8 contains ITF test routines, to access it's supposedly CTRL+CAPS+KANA,
+ which currently doesn't work. It also never returns a valid processor or CPU clock,
+ is it a debug side-effect or supposed to be read somehow?
+ - Expects 0xc0000-0xdffff to be r/w at PC=0x104e8, currently failing for inner C-Bus mappings.
+ Is PCI supposed to overlay the C-Bus section?
+ - Eventually jump off the weeds by taking an invalid irq in timer test;
+ - Reportedly should display a CanBe logo at POST (always blue with white fg?),
+ at least pc9821cx3 ROM has some VRAM data in first half of BIOS ROM.
+ Where this is mapped is currently unknown;
+
+ TODO (PC-9821Xa16/PC-9821Ra20/PC-9821Ra266/PC-9821Ra333):
+ - "MICON ERROR" at POST (processor microcode detection fails, basically down to a more
+ involved bankswitch with Pentium based machines);
+
+ TODO: (PC-9821Nr15/PC-9821Nr166)
+ - Tests conventional RAM then keeps polling $03c4 (should be base VGA regs read);
+ - Skipping that will eventually die with a "MEMORY ERROR" (never reads extended memory);
+
+**************************************************************************************************/
+
+#include "emu.h"
+#include "includes/pc9821.h"
+
+UPD7220_DISPLAY_PIXELS_MEMBER( pc9821_state::pegc_display_pixels )
+{
+ if(m_ex_video_ff[ANALOG_256_MODE])
+ {
+ // PEGC mode is linear VRAM picked from a specific VRAM buffer.
+ // It still latches addresses from μPD7220, and applies some shuffling around.
+ // Is the DAC really merging two pixels not unlike VGA correlated Mode 13h?
+ rgb_t const *const palette = m_palette->palette()->entry_list_raw();
+ u16 *ext_gvram = (u16 *)m_ext_gvram.target();
+
+ for(int xi=0;xi<8;xi+=2)
+ {
+ int res_x = (x >> 1) + xi;
+ int res_y = y;
+
+ u16 pen = ext_gvram[(address << 2) + (xi >> 1) + (m_vram_disp*0x20000)];
+
+ bitmap.pix(res_y, res_x) = palette[(pen & 0xff) + 0x20];
+ bitmap.pix(res_y, res_x+1) = palette[(pen >> 8) + 0x20];
+ }
+ }
+ else
+ pc9801_state::hgdc_display_pixels(bitmap, y, x, address);
+}
+
+void pc9821_state::pc9821_egc_w(offs_t offset, u16 data, u16 mem_mask)
+{
+ if(!m_ex_video_ff[2])
+ return;
+
+ egc_w(offset, data, mem_mask);
+}
+
+void pc9821_state::pc9821_video_ff_w(offs_t offset, uint8_t data)
+{
+ if(offset == 1)
+ {
+ if(((data & 0xfe) == 4) && !m_ex_video_ff[3]) // TODO: many other settings are protected
+ return;
+ m_ex_video_ff[(data & 0xfe) >> 1] = data & 1;
+
+ //if((data & 0xfe) == 0x20)
+ // logerror("%02x\n",data & 1);
+ }
+
+ /* Intentional fall-through */
+ pc9801rs_video_ff_w(offset,data);
+}
+
+uint8_t pc9821_state::pc9821_a0_r(offs_t offset)
+{
+ if((offset & 1) == 0 && offset & 8)
+ {
+ if(m_ex_video_ff[ANALOG_256_MODE])
+ {
+ logerror("256 color mode [%02x] R\n",offset);
+ return 0;
+ }
+ else if(m_ex_video_ff[ANALOG_16_MODE]) //16 color mode, readback possible there
+ {
+ uint8_t res = 0;
+
+ switch(offset)
+ {
+ case 0x08: res = m_analog16.pal_entry & 0xf; break;
+ case 0x0a: res = m_analog16.g[m_analog16.pal_entry] & 0xf; break;
+ case 0x0c: res = m_analog16.r[m_analog16.pal_entry] & 0xf; break;
+ case 0x0e: res = m_analog16.b[m_analog16.pal_entry] & 0xf; break;
+ }
+
+ return res;
+ }
+ }
+
+ return pc9801_a0_r(offset);
+}
+
+void pc9821_state::pc9821_a0_w(offs_t offset, uint8_t data)
+{
+ if((offset & 1) == 0 && offset & 8 && m_ex_video_ff[ANALOG_256_MODE])
+ {
+ switch(offset)
+ {
+ case 0x08: m_analog256.pal_entry = data & 0xff; break;
+ case 0x0a: m_analog256.g[m_analog256.pal_entry] = data & 0xff; break;
+ case 0x0c: m_analog256.r[m_analog256.pal_entry] = data & 0xff; break;
+ case 0x0e: m_analog256.b[m_analog256.pal_entry] = data & 0xff; break;
+ }
+
+ m_palette->set_pen_color(
+ m_analog256.pal_entry + 0x20,
+ m_analog256.r[m_analog256.pal_entry],
+ m_analog256.g[m_analog256.pal_entry],
+ m_analog256.b[m_analog256.pal_entry]
+ );
+ return;
+ }
+
+ pc9801rs_a0_w(offset,data);
+}
+
+uint8_t pc9821_state::window_bank_r(offs_t offset)
+{
+ if(offset == 1)
+ return m_pc9821_window_bank & 0xfe;
+
+ return 0xff;
+}
+
+void pc9821_state::window_bank_w(offs_t offset, uint8_t data)
+{
+ if(offset == 1)
+ m_pc9821_window_bank = data & 0xfe;
+ else
+ logerror("PC-9821 $f0000 window bank %02x\n",data);
+}
+
+/* basically a read-back of various registers */
+// bit 1: GDC clock select (port 0x6a, selects with 0x84 & bit 0)
+// bit 0: current setting
+uint8_t pc9821_state::ext2_video_ff_r()
+{
+ uint8_t res;
+
+ res = 0;
+
+ switch(m_ext2_ff)
+ {
+// case 0x00: ?
+// case 0x01: 200 line color / b&w mode (i/o 0x68 -> 0x02)
+// case 0x02: Odd-numbered raster mask (i/o 0x68 -> 0x08)
+ case 0x03: res = m_video_ff[DISPLAY_REG]; break; // display reg
+// case 0x04: palette mode (i/o 0x6a -> 0x00)
+// case 0x05: GDC sync mode (i/o 0x6a -> 0x40)
+// case 0x06: unknown (i/o 0x6a -> 0x44)
+// case 0x07: EGC compatibility mode (i/o 0x6a -> 0x04)
+// case 0x08: Protected mode f/f (i/o 0x6a -> 0x06)
+// case 0x09: GDC clock #0 (i/o 0x6a -> 0x82)
+ case 0x0a: res = m_ex_video_ff[ANALOG_256_MODE]; break; // 256 color mode
+// case 0x0b: VRAM access mode (i/o 0x6a -> 0x62)
+// case 0x0c: unknown
+// case 0x0d: VRAM boundary mode (i/o 0x6a -> 0x68)
+// case 0x0e: 65,536 color GFX mode (i/o 0x6a -> 0x22)
+// case 0x0f: 65,536 color palette mode (i/o 0x6a -> 0x24)
+// case 0x10: unknown (i/o 0x6a -> 0x6a)
+// case 0x11: Reverse mode related (i/o 0x6a -> 0x26)
+// case 0x12: 256 color overscan color (i/o 0x6a -> 0x2c)
+// case 0x13: Reverse mode related (i/o 0x6a -> 0x28)
+// case 0x14: AGDC Drawing processor selection (i/o 0x6a -> 0x66)
+// case 0x15: unknown (i/o 0x6a -> 0x60)
+// case 0x16: unknown (i/o 0x6a -> 0xc2)
+// case 0x17: bitmap config direction (i/o 0x6a -> 0x6c)
+// case 0x18: High speed palette write (i/o 0x6a -> 0x2a)
+// case 0x19: unknown (i/o 0x6a -> 0x48)
+// case 0x1a: unknown (i/o 0x6a -> 0xc8)
+// case 0x1b: unknown (i/o 0x6a -> 0x2e)
+// case 0x1c: unknown (i/o 0x6a -> 0x6e)
+// case 0x1d: unknown (i/o 0x6a -> 0xc0)
+// case 0x1e: unknown (i/o 0x6a -> 0x80 or 0x46?)
+// case 0x1f: unknown (i/o 0x6a -> 0x08)
+ default:
+ if(m_ext2_ff < 0x20)
+ popmessage("PC-9821: read ext2 f/f with value %02x",m_ext2_ff);
+ break;
+ }
+
+ res |= (m_ex_video_ff[GDC_IS_5MHz] << 1);
+
+ return res;
+}
+
+void pc9821_state::ext2_video_ff_w(uint8_t data)
+{
+ m_ext2_ff = data;
+}
+
+// TODO: rename ANALOG_256 refs to pegc
+// (it's seemingly the official NEC naming)
+uint16_t pc9821_state::pc9821_grcg_gvram_r(offs_t offset, uint16_t mem_mask)
+{
+ if(m_ex_video_ff[ANALOG_256_MODE])
+ {
+ u16 *ext_gvram = (u16 *)m_ext_gvram.target();
+ int bank = offset >> 14;
+ if(bank <= 1)
+ return ext_gvram[((m_analog256.bank[bank])*0x4000) + (offset & 0x3fff)];
+ return 0xffff;
+ }
+
+ return grcg_gvram_r(offset, mem_mask);
+}
+
+void pc9821_state::pc9821_grcg_gvram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ if(m_ex_video_ff[ANALOG_256_MODE])
+ {
+ u16 *ext_gvram = (u16 *)m_ext_gvram.target();
+ int bank = offset >> 14;
+ if(bank <= 1)
+ COMBINE_DATA(&ext_gvram[((m_analog256.bank[bank])*0x4000) + (offset & 0x3fff)]);
+ return;
+ }
+
+ grcg_gvram_w(offset,data,mem_mask);
+}
+
+uint16_t pc9821_state::pc9821_grcg_gvram0_r(offs_t offset, uint16_t mem_mask)
+{
+ if(m_ex_video_ff[ANALOG_256_MODE])
+ {
+ switch(offset*2)
+ {
+ case 4: return m_analog256.bank[0];
+ case 6: return m_analog256.bank[1];
+ }
+
+ //return 0;
+ }
+
+ return grcg_gvram0_r(offset, mem_mask);
+}
+
+void pc9821_state::pc9821_grcg_gvram0_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ if(m_ex_video_ff[ANALOG_256_MODE])
+ {
+ //printf("%08x %08x\n",offset*2,data);
+ if(mem_mask & 0xff)
+ {
+ switch(offset*2)
+ {
+ case 4: m_analog256.bank[0] = data & 0xf; break;
+ case 6: m_analog256.bank[1] = data & 0xf; break;
+ }
+ }
+ return;
+ }
+
+ grcg_gvram0_w(offset,data,mem_mask);
+}
+
+void pc9821_state::pc9821_map(address_map &map)
+{
+ pc9801bx2_map(map);
+ map(0x000a8000, 0x000bffff).rw(FUNC(pc9821_state::pc9821_grcg_gvram_r), FUNC(pc9821_state::pc9821_grcg_gvram_w));
+// map(0x000cc000, 0x000cffff).rom().region("sound_bios", 0); //sound BIOS
+// map(0x000d8000, 0x000d9fff).rom().region("ide",0)
+// map(0x000da000, 0x000dbfff).ram(); // ide ram
+ map(0x000e0000, 0x000e7fff).rw(FUNC(pc9821_state::pc9821_grcg_gvram0_r), FUNC(pc9821_state::pc9821_grcg_gvram0_w));
+ map(0x00f00000, 0x00f9ffff).ram().share("ext_gvram");
+ map(0xfff00000, 0xfff9ffff).ram().share("ext_gvram");
+}
+
+void pc9821_state::pc9821_io(address_map &map)
+{
+ pc9801bx2_io(map);
+// map.unmap_value_high(); // TODO: a read to somewhere makes this to fail at POST
+ map(0x0000, 0x001f).rw(m_dmac, FUNC(am9517a_device::read), FUNC(am9517a_device::write)).umask32(0xff00ff00);
+ map(0x0000, 0x001f).lr8(NAME([this] (offs_t o) { return BIT(o, 1) ? 0xff : pic_r(o); })).umask32(0x00ff00ff);
+ map(0x0000, 0x001f).w(FUNC(pc9821_state::pic_w)).umask32(0x00ff00ff); // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
+ map(0x0020, 0x002f).w(FUNC(pc9821_state::rtc_w)).umask32(0x000000ff);
+ map(0x0020, 0x002f).w(FUNC(pc9821_state::dmapg8_w)).umask32(0xff00ff00);
+ map(0x0030, 0x0037).rw(m_ppi_sys, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask32(0xff00ff00); //i8251 RS232c / i8255 system port
+ map(0x0040, 0x0047).rw(m_ppi_prn, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask32(0x00ff00ff);
+ map(0x0040, 0x0047).rw(m_keyb, FUNC(pc9801_kbd_device::rx_r), FUNC(pc9801_kbd_device::tx_w)).umask32(0xff00ff00); //i8255 printer port / i8251 keyboard
+// map(0x0050, 0x0053).w(FUNC(pc9821_state::nmi_ctrl_w)).umask32(0x00ff00ff);
+// map(0x005c, 0x005f).r(FUNC(pc9821_state::timestamp_r)).nopw(); // artic
+// map(0x0060, 0x0063).rw(m_hgdc[0], FUNC(upd7220_device::read), FUNC(upd7220_device::write)).umask32(0x00ff00ff); //upd7220 character ports / <undefined>
+// map(0x0060, 0x0063).r(FUNC(pc9821_state::unk_r)).umask32(0xff00ff00); // mouse related (unmapped checking for AT keyb controller\PS/2 mouse?)
+// map(0x0064, 0x0064).w(FUNC(pc9821_state::vrtc_clear_w));
+ map(0x0068, 0x006b).w(FUNC(pc9821_state::pc9821_video_ff_w)).umask32(0x00ff00ff); //mode FF / <undefined>
+// map(0x0070, 0x007f).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask32(0xff00ff00);
+// map(0x0070, 0x007f).rw(FUNC(pc9821_state::grcg_r), FUNC(pc9821_state::grcg_w)).umask32(0x00ff00ff); //display registers "GRCG" / i8253 pit
+ map(0x0090, 0x0093).m(m_fdc_2hd, FUNC(upd765a_device::map)).umask32(0x00ff00ff);
+ map(0x0094, 0x0094).rw(FUNC(pc9821_state::fdc_2hd_ctrl_r), FUNC(pc9821_state::fdc_2hd_ctrl_w));
+ map(0x00a0, 0x00af).rw(FUNC(pc9821_state::pc9821_a0_r), FUNC(pc9821_state::pc9821_a0_w)); //upd7220 bitmap ports / display registers
+// map(0x00b0, 0x00b3) PC9861k (serial port?)
+// map(0x00b9, 0x00b9) PC9861k
+// map(0x00bb, 0x00bb) PC9861k
+// map(0x00bc, 0x00bf).rw(FUNC(pc9821_state::fdc_mode_ctrl_r), FUNC(pc9821_state::fdc_mode_ctrl_w));
+ map(0x00c8, 0x00cb).m(m_fdc_2hd, FUNC(upd765a_device::map)).umask32(0x00ff00ff);
+// map(0x00cc, 0x00cc).rw(FUNC(pc9821_state::fdc_2hd_ctrl_r), FUNC(pc9821_state::fdc_2hd_ctrl_w));
+ // map(0x00d8, 0x00df) AMD98 (sound?) board
+// map(0x00f0, 0x00ff).rw(FUNC(pc9821_state::a20_ctrl_r), FUNC(pc9821_state::a20_ctrl_w)).umask32(0x00ff00ff);
+// map(0x0188, 0x018f).rw(FUNC(pc9821_state::pc9801_opn_r), FUNC(pc9821_state::pc9801_opn_w)); //ym2203 opn / <undefined>
+// map(0x018c, 0x018f) YM2203 OPN extended ports / <undefined>
+// map(0x0430, 0x0433).rw(FUNC(pc9821_state::ide_ctrl_r), FUNC(pc9821_state::ide_ctrl_w)).umask32(0x00ff00ff);
+// map(0x0438, 0x043b).rw(FUNC(pc9821_state::access_ctrl_r), FUNC(pc9821_state::access_ctrl_w));
+// map(0x043c, 0x043f).w(FUNC(pc9821_state::pc9801rs_bank_w)); //ROM/RAM bank (NEC)
+// map(0x043c, 0x043f) ROM/RAM bank (EPSON)
+ map(0x0460, 0x0463).rw(FUNC(pc9821_state::window_bank_r), FUNC(pc9821_state::window_bank_w));
+ map(0x04a0, 0x04af).w(FUNC(pc9821_state::pc9821_egc_w));
+// map(0x04be, 0x04be) FDC "RPM" register
+// map(0x0640, 0x064f).rw(FUNC(pc9821_state::ide_cs0_r), FUNC(pc9821_state::ide_cs0_w));
+// map(0x0740, 0x074f).rw(FUNC(pc9821_state::ide_cs1_r), FUNC(pc9821_state::ide_cs1_w));
+// map(0x08e0, 0x08ea) <undefined> / EMM SIO registers
+ map(0x09a0, 0x09a0).rw(FUNC(pc9821_state::ext2_video_ff_r), FUNC(pc9821_state::ext2_video_ff_w)); // GDC extended register r/w
+// map(0x09a8, 0x09a8) GDC 31KHz register r/w
+// map(0x0c07, 0x0c07) EPSON register w
+// map(0x0c03, 0x0c03) EPSON register 0 r
+// map(0x0c13, 0x0c14) EPSON register 1 r
+// map(0x0c24, 0x0c24) cs4231 PCM board register control
+// map(0x0c2b, 0x0c2b) cs4231 PCM board low byte control
+// map(0x0c2d, 0x0c2d) cs4231 PCM board hi byte control
+// map(0x0cc0, 0x0cc7) SCSI interface / <undefined>
+// map(0x0cfc, 0x0cff) PCI bus
+ map(0x1e8c, 0x1e8f).noprw(); // IDE RAM switch
+ map(0x2ed0, 0x2edf).lr8(NAME([] (address_space &s, offs_t o, u8 mm) { return 0xff; })).umask32(0xffffffff); // unknown sound related
+// map(0x3fd8, 0x3fdf).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask32(0xff00ff00); // <undefined> / pit mirror ports
+// map(0x7fd8, 0x7fdf).rw(m_ppi_mouse, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask32(0xff00ff00);
+// map(0x841c, 0x8f1f).rw(FUNC(pc9821_state::sdip_r<0x0>), FUNC(pc9821_state::sdip_w<0x0>));
+// map(0xa460, 0xa46f) cs4231 PCM extended port / <undefined>
+ map(0xbfdb, 0xbfdb).rw(FUNC(pc9821_state::mouse_freq_r), FUNC(pc9821_state::mouse_freq_w));
+// map(0xc0d0, 0xc0d3) MIDI port, option 0 / <undefined>
+// map(0xc4d0, 0xc4d3) MIDI port, option 1 / <undefined>
+// map(0xc8d0, 0xc8d3) MIDI port, option 2 / <undefined>
+// map(0xccd0, 0xccd3) MIDI port, option 3 / <undefined>
+// map(0xd0d0, 0xd0d3) MIDI port, option 4 / <undefined>
+// map(0xd4d0, 0xd4d3) MIDI port, option 5 / <undefined>
+// map(0xd8d0, 0xd8d3) MIDI port, option 6 / <undefined>
+// map(0xdcd0, 0xdcd3) MIDI port, option 7 / <undefined>
+// map(0xe0d0, 0xe0d3).r(FUNC(pc9821_state::midi_r)); // MIDI port, option 8 / <undefined>
+// map(0xe4d0, 0xe4d3) MIDI port, option 9 / <undefined>
+// map(0xe8d0, 0xe8d3) MIDI port, option A / <undefined>
+// map(0xecd0, 0xecd3) MIDI port, option B / <undefined>
+// map(0xf0d0, 0xf0d3) MIDI port, option C / <undefined>
+// map(0xf4d0, 0xf4d3) MIDI port, option D / <undefined>
+// map(0xf8d0, 0xf8d3) MIDI port, option E / <undefined>
+// map(0xfcd0, 0xfcd3) MIDI port, option F / <undefined>
+}
+
+/*
+ * 98MATE A overrides
+ */
+// TODO: SDIP extended access for 9821Ap, As, Ae
+// It never r/w the conventional ports, at least on POST.
+// I also suspect a few ports here not being direct RAM r/w but actual regs instead.
+u8 pc9821_mate_a_state::ext_sdip_data_r(offs_t offset)
+{
+ logerror("%s: EXT SDIP access read %02x %02x\n", machine().describe_context(), m_ext_sdip_addr, m_ext_sdip[m_ext_sdip_addr]);
+ return m_ext_sdip[m_ext_sdip_addr];
+}
+
+void pc9821_mate_a_state::ext_sdip_data_w(offs_t offset, u8 data)
+{
+ m_ext_sdip[m_ext_sdip_addr] = data;
+}
+
+void pc9821_mate_a_state::ext_sdip_access_w(offs_t offset, u8 data)
+{
+ // access enable?
+}
+
+void pc9821_mate_a_state::ext_sdip_address_w(offs_t offset, uint8_t data)
+{
+ m_ext_sdip_addr = data;
+}
+
+void pc9821_mate_a_state::pc9821as_io(address_map &map)
+{
+ pc9821_io(map);
+ map(0x0468, 0x0468).rw(FUNC(pc9821_mate_a_state::ext_sdip_data_r), FUNC(pc9821_mate_a_state::ext_sdip_data_w));
+ map(0x046a, 0x046a).w(FUNC(pc9821_mate_a_state::ext_sdip_access_w));
+ map(0x046c, 0x046c).w(FUNC(pc9821_mate_a_state::ext_sdip_address_w));
+ // TODO: specific MATE A local bus (location?)
+}
+
+/*
+ * CanBe overrides
+ */
+
+/*
+ * CanBe Remote control
+ * I/O $f4a: remote index (write only?)
+ * I/O $f4b: remote data r/w
+ * [0x00] <unknown>
+ * [0x01] Windows Sound System related
+ * ---- xxxx irq select
+ * ---- 1000 INT8
+ * ---- 0011 INT0
+ * ---- 0010 INT41
+ * ---- 0000 INT5
+ * [0x02] <unknown>
+ * [0x03] Remote control reset
+ * ---- -x-- (1) Mic through (loopback?)
+ * ---- ---x (1) Remote control reset
+ * [0x04] Mute control
+ * ---- ---x (Global?) sound mute
+ * [0x10] Remote control data status
+ * ---- --x- (1) device ready (0) busy
+ * ---- ---x (1) received data available
+ * [0x11] Remote control code
+ * <returns the button pressed in 2 bytes form, 2nd byte is the XOR-ed version of 1st>
+ * [0x12] <unknown>
+ * [0x13] Power control
+ * <succession of bytes to power on/off>
+ * [0x14] remote irq control
+ * ---- -x-- irq enable
+ * ---- --xx irq select
+ * ---- --11 INT41
+ * ---- --10 INT1
+ * ---- --01 INT2
+ * ---- --00 INT0
+ * [0x30] VOL1,2 YMF288 Left sound output
+ * [0x31] VOL1,2 YMF288 Right sound output
+ * [0x32] VOL3,4 Line Left input
+ * [0x33] VOL3,4 Line Right input
+ * [0x34] <unknown>
+ * [0x35] <unknown>
+ */
+// TODO: export remote control to an actual device, and pinpoint actual name
+void pc9821_canbe_state::remote_addr_w(offs_t offset, u8 data)
+{
+ m_remote.index = data;
+}
+
+u8 pc9821_canbe_state::remote_data_r(offs_t offset)
+{
+ uint8_t res;
+
+ res = 0;
+
+ logerror("%s: remote control reg read %02x\n", machine().describe_context(), m_remote.index);
+
+ switch(m_remote.index)
+ {
+ case 0x10:
+ res |= 2; // POST will throw "MICOM ERROR" otherwise
+ break;
+ }
+ return res;
+}
+
+void pc9821_canbe_state::remote_data_w(offs_t offset, u8 data)
+{
+ switch(m_remote.index)
+ {
+ default:
+ logerror("%s: remote control reg write %02x %02x\n", machine().describe_context(), m_remote.index, data);
+ }
+}
+
+void pc9821_canbe_state::pc9821cx3_map(address_map &map)
+{
+ pc9821_map(map);
+ // TODO: overwritten by C-bus mapping, but definitely tested as RAM on POST
+ map(0x000c0000, 0x000dffff).ram();
+}
+
+void pc9821_canbe_state::pc9821cx3_io(address_map &map)
+{
+ pc9821_io(map);
+ map(0x0f4a, 0x0f4a).w(FUNC(pc9821_canbe_state::remote_addr_w));
+ map(0x0f4b, 0x0f4b).rw(FUNC(pc9821_canbe_state::remote_data_r), FUNC(pc9821_canbe_state::remote_data_w));
+}
+
+static INPUT_PORTS_START( pc9821 )
+ // TODO: verify how many "switches" are really present on pc9821
+ // I suspect there are none: if you flip some of these then BIOS keeps throwing
+ // "set the sdip" warning until it matches parity odd.
+ // They may actually be hardwired defaults that should return constant values depending
+ // on machine type.
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x01, 0x01, "Display Type" )
+ PORT_DIPSETTING( 0x00, "Normal Display (15KHz)" )
+ PORT_DIPSETTING( 0x01, "Hi-Res Display (24KHz)" )
+ PORT_DIPNAME( 0x02, 0x00, "DSW1" )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, "Monitor Type" )
+ PORT_DIPSETTING( 0x04, "RGB" )
+ PORT_DIPSETTING( 0x00, "Plasma" )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x00, "Graphic Function" )
+ PORT_DIPSETTING( 0x80, "Basic (8 Colors)" )
+ PORT_DIPSETTING( 0x00, "Expanded (16/4096 Colors)" )
+
+ PORT_START("DSW2")
+ PORT_DIPNAME( 0x01, 0x00, "DSW2" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, "GDC clock" )
+ PORT_DIPSETTING( 0x80, "2.5 MHz" )
+ PORT_DIPSETTING( 0x00, "5 MHz" )
+
+ PORT_START("DSW3")
+ PORT_DIPNAME( 0x01, 0x01, "FDD Fix Mode" )
+ PORT_DIPSETTING( 0x00, "Auto-Detection" )
+ PORT_DIPSETTING( 0x01, "Fixed" )
+ PORT_DIPNAME( 0x02, 0x02, "FDD Density Select" )
+ PORT_DIPSETTING( 0x00, "2DD" )
+ PORT_DIPSETTING( 0x02, "2HD" )
+ PORT_DIPNAME( 0x04, 0x04, "DSW3" )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, "Conventional RAM size" )
+ PORT_DIPSETTING( 0x40, "640 KB" )
+ PORT_DIPSETTING( 0x00, "512 KB" )
+ PORT_DIPNAME( 0x80, 0x00, "CPU Type" )
+ PORT_DIPSETTING( 0x80, "V30" )
+ PORT_DIPSETTING( 0x00, "I386" )
+
+ // TODO: make a mouse device, not unlike pc9801_epson.cpp
+ PORT_START("MOUSE_X")
+ PORT_BIT( 0xff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30)
+
+ PORT_START("MOUSE_Y")
+ PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30)
+
+ PORT_START("MOUSE_B")
+ PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(MOUSECODE_BUTTON2) PORT_NAME("Mouse Right Button")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(MOUSECODE_BUTTON3) PORT_NAME("Mouse Middle Button")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(MOUSECODE_BUTTON1) PORT_NAME("Mouse Left Button")
+
+ PORT_START("ROM_LOAD")
+ PORT_BIT( 0x03, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_CONFNAME( 0x04, 0x04, "Load IDE BIOS" )
+ PORT_CONFSETTING( 0x00, DEF_STR( Yes ) )
+ PORT_CONFSETTING( 0x04, DEF_STR( No ) )
+INPUT_PORTS_END
+
+MACHINE_START_MEMBER(pc9821_state,pc9821)
+{
+ MACHINE_START_CALL_MEMBER(pc9801bx2);
+
+ // ...
+}
+
+MACHINE_START_MEMBER(pc9821_mate_a_state,pc9821ap2)
+{
+ MACHINE_START_CALL_MEMBER(pc9821);
+
+ // ...
+}
+
+MACHINE_START_MEMBER(pc9821_canbe_state,pc9821_canbe)
+{
+ MACHINE_START_CALL_MEMBER(pc9821);
+
+ // ...
+}
+
+MACHINE_RESET_MEMBER(pc9821_state,pc9821)
+{
+ MACHINE_RESET_CALL_MEMBER(pc9801rs);
+
+ m_pc9821_window_bank = 0x08;
+}
+
+// TODO: setter for DMAC clock should follow up whatever is the CPU clock
+
+// TODO: remove me, cfr. pc9801.cpp
+#define MAIN_CLOCK_X2 2'457'600
+
+void pc9821_state::pc9821(machine_config &config)
+{
+ // TODO: specs for a vanilla MULTi doesn't match
+ // should be 386sx at 20 MHz, this may be "just" a FA/BX class instead
+ pc9801rs(config);
+ const double xtal = 16000000;
+ I486(config.replace(), m_maincpu, xtal); // unknown clock
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_state::pc9821_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ m_pit->set_clk<0>(MAIN_CLOCK_X2);
+ m_pit->set_clk<1>(MAIN_CLOCK_X2);
+ m_pit->set_clk<2>(MAIN_CLOCK_X2);
+
+ m_cbus[0]->set_default_option("pc9801_86");
+
+ MCFG_MACHINE_START_OVERRIDE(pc9821_state, pc9821)
+ MCFG_MACHINE_RESET_OVERRIDE(pc9821_state, pc9821)
+
+ m_dmac->set_clock(xtal); // unknown clock
+
+ PALETTE(config.replace(), m_palette, FUNC(pc9821_state::pc9801_palette), 16 + 16 + 256);
+
+ m_hgdc[1]->set_display_pixels(FUNC(pc9821_state::pegc_display_pixels));
+}
+
+void pc9821_mate_a_state::pc9821as(machine_config &config)
+{
+ pc9821(config);
+ const XTAL xtal = XTAL(33'000'000);
+ I486(config.replace(), m_maincpu, xtal); // i486dx
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_mate_a_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_mate_a_state::pc9821as_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ // 9821Ap, As, Ae has no dips to port A but reads back written content
+ m_ppi_sys->in_pa_callback().set(m_ppi_sys, FUNC(i8255_device::pa_r));
+
+ MCFG_MACHINE_START_OVERRIDE(pc9821_mate_a_state, pc9821ap2)
+}
+
+void pc9821_mate_a_state::pc9821ap2(machine_config &config)
+{
+ pc9821(config);
+ const XTAL xtal = XTAL(66'000'000);
+ I486(config.replace(), m_maincpu, xtal); // i486dx2
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_mate_a_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_mate_a_state::pc9821_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ pit_clock_config(config, xtal / 4); // unknown, fixes timer error at POST
+
+ MCFG_MACHINE_START_OVERRIDE(pc9821_mate_a_state, pc9821ap2)
+}
+
+void pc9821_canbe_state::pc9821ce2(machine_config &config)
+{
+ pc9821(config);
+ const XTAL xtal = XTAL(25'000'000);
+ I486(config.replace(), m_maincpu, xtal); // i486sx
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_canbe_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_canbe_state::pc9821_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ pit_clock_config(config, xtal / 4); // unknown, fixes timer error at POST
+
+ m_cbus[0]->set_default_option("pc9801_118");
+
+ MCFG_MACHINE_START_OVERRIDE(pc9821_canbe_state, pc9821_canbe);
+}
+
+void pc9821_canbe_state::pc9821cx3(machine_config &config)
+{
+ pc9821(config);
+ const XTAL xtal = XTAL(100'000'000); // Pentium Pro, 512 kB second cache option RAM
+ PENTIUM(config.replace(), m_maincpu, xtal);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_canbe_state::pc9821cx3_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_canbe_state::pc9821cx3_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ pit_clock_config(config, xtal / 4); // unknown, fixes timer error at POST
+
+// m_cbus[0]->set_default_option(nullptr);
+ m_cbus[0]->set_default_option("pc9801_118");
+
+ MCFG_MACHINE_START_OVERRIDE(pc9821_canbe_state, pc9821_canbe);
+
+ // VLSI Supercore594 (Wildcat) PCI 2.0
+ // GD5440
+ // built-in 3.5 floppy x 1
+ // file bay with built-in CD-Rom (4x)
+ // HDD with pre-installed software (850MB, 1.2GB)
+ // minimum RAM: 16MB
+ // maximum RAM: 128MB
+ // C-Bus x 3
+ // PC-9821CB-B04, on dedicated bus (Fax/Modem 14'400 bps) and IrDA board (115'200 bps)
+ // Optional PC-9821C3-B02 MIDI board, on dedicated bus
+}
+
+void pc9821_mate_x_state::pc9821xs(machine_config &config)
+{
+ pc9821(config);
+ const XTAL xtal = XTAL(66'000'000);
+ I486(config.replace(), m_maincpu, xtal); // i486dx2
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_mate_x_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_mate_x_state::pc9821_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+}
+
+void pc9821_mate_x_state::pc9821xa16(machine_config &config)
+{
+ pc9821(config);
+ PENTIUM(config.replace(), m_maincpu, 166000000); // Pentium P54C
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_mate_x_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_mate_x_state::pc9821_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+}
+
+void pc9821_valuestar_state::pc9821v13(machine_config &config)
+{
+ pc9821(config);
+ const double xtal = 133000000;
+ PENTIUM(config.replace(), m_maincpu, xtal); // Pentium Pro, 256kB cache RAM
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_valuestar_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_valuestar_state::pc9821_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ // VLSI Supercore594 (Wildcat) / Intel 430FX (Triton) PCI 2.0
+ // PCI slot x 1
+ // GD5440
+ // built-in 3.5 floppy x 1
+ // file bay with built-in CD-Rom (4x, 6x, 8x depending on sub-model type)
+ // HDD with pre-installed software (850MB, 1.2GB, 1.6GB)
+ // minimum RAM: 16MB
+ // maximum RAM: 128MB
+ // C-Bus x 2
+ // PC-9801-120 pre-installed (fax/modem 28'000 bps) or PC-9801-121 (ISDN)
+}
+
+void pc9821_valuestar_state::pc9821v20(machine_config &config)
+{
+ pc9821(config);
+ const double xtal = 200000000;
+ PENTIUM(config.replace(), m_maincpu, xtal); // Pentium Pro
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_valuestar_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_valuestar_state::pc9821_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+}
+
+void pc9821_mate_r_state::pc9821ra20(machine_config &config)
+{
+ pc9821(config);
+ PENTIUM_PRO(config.replace(), m_maincpu, XTAL(200'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_mate_r_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_mate_r_state::pc9821_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+}
+
+void pc9821_mate_r_state::pc9821ra266(machine_config &config)
+{
+ pc9821(config);
+ const double xtal = 266000000;
+ PENTIUM2(config.replace(), m_maincpu, xtal);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_mate_r_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_mate_r_state::pc9821_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ // 512KB CPU cache RAM
+ // Trident TGUI9682XGi + integrated 98 gfx card
+ // 3x cbus + 2x PCI slots
+ // 3GB HDD
+ // built-in ethernet 100BASE-TX/10BASE-T
+}
+
+void pc9821_mate_r_state::pc9821ra333(machine_config &config)
+{
+ pc9821(config);
+ const double xtal = 333000000;
+ PENTIUM2(config.replace(), m_maincpu, xtal); // actually a Celeron
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_mate_r_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_mate_r_state::pc9821_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ // 128KB CPU cache RAM
+ // Trident TGUI9682XGi + integrated 98 gfx card
+ // 3x cbus + 2x PCI slots
+ // 6GB HDD
+ // built-in ethernet 100BASE-TX/10BASE-T
+}
+
+// 9821 NOTE machine configs
+
+void pc9821_note_state::pc9821ne(machine_config &config)
+{
+ pc9821(config);
+ const XTAL xtal = XTAL(33'000'000);
+ I486(config.replace(), m_maincpu, xtal); // i486sx
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_note_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_note_state::pc9821_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ pit_clock_config(config, xtal / 4); // unknown, fixes timer error at POST
+
+ // 9.5 TFT with 640x480x256 mode
+ // 1x internal 3.5 floppy
+ // PCMCIA2.0/JEIDA 4.1
+ // 110-pin expansion bus (?)
+ // Ni-Cd battery, around 1 hour of session duration
+ // minimum RAM: 3.6MB
+ // maximum RAM: 14.6MB
+}
+
+void pc9821_note_lavie_state::pc9821nr15(machine_config &config)
+{
+ pc9821(config);
+// const XTAL xtal = XTAL(150'000'000);
+ const double xtal = 150000000;
+ PENTIUM_PRO(config.replace(), m_maincpu, xtal); // unsure if normal or pro, clock and cache size suggests latter
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_note_lavie_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_note_lavie_state::pc9821_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ // 256KB CPU cache RAM
+ // TFT 12.1 screen with 800x600 max resolution
+ // Trident Cyber9385 Flat Panel Controller (SVGA, PCI?)
+ // -86 board
+ // PCI TypeII x 2 (Type III x 1)
+ // C-Bus x 1 or ZV port (?)
+ // 1GB or 1.4GB HDD
+ // 8x/11x CD-ROM
+ // Optional FAX
+}
+
+void pc9821_note_lavie_state::pc9821nr166(machine_config &config)
+{
+ pc9821(config);
+ const double xtal = 166000000;
+ PENTIUM_MMX(config.replace(), m_maincpu, xtal);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_note_lavie_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_note_lavie_state::pc9821_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ // 256KB CPU cache RAM
+ // TFT 13.3 screen with 1024x768 resolution
+ // Trident Cyber9385 Flat Panel Controller (SVGA, PCI?)
+ // PCI TypeII x 2 (Type III x 1)
+ // C-Bus x 1 or ZV port (?)
+ // 3GB HDD
+ // Has FAX or ethernet 100BASE-TX/10BASE-T (depending on submodel type)
+}
+
+void pc9821_note_lavie_state::pc9821nw150(machine_config &config)
+{
+ pc9821(config);
+ const double xtal = 150000000;
+ PENTIUM_MMX(config.replace(), m_maincpu, xtal);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc9821_note_lavie_state::pc9821_map);
+ m_maincpu->set_addrmap(AS_IO, &pc9821_note_lavie_state::pc9821_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ // 256KB CPU cache RAM
+ // TFT 12.1 screen with 800x600 resolution & true color
+ // Trident Cyber9385-1 Flat Panel Controller (SVGA, PCI?)
+ // built-in CD-Rom x16
+ // equivalent sound board -86 built-in
+ // PCI TypeII x 2 (Type III x 1)
+ // C-Bus x 1 or ZV port (?)
+ // 2GB HDD (max 31.51GB)
+ // has composite video output
+ // Has 33.6Kbps FAX
+ // Ni-cd (?) battery with 1.5 ~ 2.3 hours of duration
+}
+
+/* took from "raw" memory dump */
+#define LOAD_IDE_ROM \
+ ROM_REGION( 0x4000, "ide", ROMREGION_ERASEVAL(0xcb) ) \
+ ROM_LOAD( "d8000.rom", 0x0000, 0x2000, BAD_DUMP CRC(5dda57cc) SHA1(d0dead41c5b763008a4d777aedddce651eb6dcbb) ) \
+ ROM_IGNORE( 0x2000 ) \
+ ROM_IGNORE( 0x2000 ) \
+ ROM_IGNORE( 0x2000 )
+
+// all of these are half size :/
+#define LOAD_KANJI_ROMS \
+ ROM_REGION( 0x80000, "raw_kanji", ROMREGION_ERASEFF ) \
+ ROM_LOAD16_BYTE( "24256c-x01.bin", 0x00000, 0x4000, BAD_DUMP CRC(28ec1375) SHA1(9d8e98e703ce0f483df17c79f7e841c5c5cd1692) ) \
+ ROM_CONTINUE( 0x20000, 0x4000 ) \
+ ROM_LOAD16_BYTE( "24256c-x02.bin", 0x00001, 0x4000, BAD_DUMP CRC(90985158) SHA1(78fb106131a3f4eb054e87e00fe4f41193416d65) ) \
+ ROM_CONTINUE( 0x20001, 0x4000 ) \
+ ROM_LOAD16_BYTE( "24256c-x03.bin", 0x40000, 0x4000, BAD_DUMP CRC(d4893543) SHA1(eb8c1bee0f694e1e0c145a24152222d4e444e86f) ) \
+ ROM_CONTINUE( 0x60000, 0x4000 ) \
+ ROM_LOAD16_BYTE( "24256c-x04.bin", 0x40001, 0x4000, BAD_DUMP CRC(5dec0fc2) SHA1(41000da14d0805ed0801b31eb60623552e50e41c) ) \
+ ROM_CONTINUE( 0x60001, 0x4000 ) \
+ ROM_REGION( 0x100000, "kanji", ROMREGION_ERASEFF ) \
+ ROM_REGION( 0x80000, "new_chargen", ROMREGION_ERASEFF )
+
+/*
+98MATE A - 80486SX 25
+
+(note: might be a different model!)
+*/
+
+ROM_START( pc9821 )
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ ROM_LOAD( "itf.rom", 0x10000, 0x08000, CRC(dd4c7bb8) SHA1(cf3aa193df2722899066246bccbed03f2e79a74a) )
+ ROM_LOAD( "bios.rom", 0x18000, 0x18000, BAD_DUMP CRC(34a19a59) SHA1(2e92346727b0355bc1ec9a7ded1b444a4917f2b9) )
+ ROM_FILL(0x24c40, 4, 0) // hide the _32_ marker until we have a 32-bit clean IDE bios otherwise windows tries to
+ // make a 32-bit call into 16-bit code
+ ROM_FILL(0x27ffe, 1, 0x92)
+ ROM_FILL(0x27fff, 1, 0xd7)
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+/*
+As - 80486DX 33
+*/
+
+ROM_START( pc9821as )
+ ROM_REGION( 0x80000, "biosrom", ROMREGION_ERASEFF )
+// ROM_LOAD( "itf.rom", 0x10000, 0x08000, BAD_DUMP CRC(dd4c7bb8) SHA1(cf3aa193df2722899066246bccbed03f2e79a74a) )
+// ROM_LOAD( "bios_as.rom", 0x18000, 0x18000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) )
+ ROM_LOAD( "mvs0100-1.bin", 0x00000, 0x80000, CRC(ca37b631) SHA1(8c481dd0608d6c27235bc88bd77e345628dc28a1) )
+
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // backported from pc9821ap2
+ ROM_COPY( "biosrom", 0x20000, 0x10000, 0x08000 ) // ITF
+ ROM_COPY( "biosrom", 0x28000, 0x18000, 0x18000 ) // BIOS
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font_as.rom", 0x000000, 0x046800, BAD_DUMP CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+/*
+PC-9821AP2/U8W
+80486DX2 66MHz
+DOS 5.0, Windows 3.1
+5.6MB RAM, up to 73.6MB
+340MB HD
+Expansion slot C-BUS4 (4)
+Graphics controller S3 86C928
+*/
+
+ROM_START( pc9821ap2 )
+ ROM_REGION( 0x80000, "biosrom", ROMREGION_ERASEFF )
+ ROM_DEFAULT_BIOS("phd0104")
+ ROM_SYSTEM_BIOS(0, "phd0104", "PHD0104")
+ ROMX_LOAD( "phd0104.rom", 0x000000, 0x80000, CRC(da73b372) SHA1(2c15b63a0869b81ef7f04972dbb0975f4e77d384), ROM_BIOS(0) )
+ ROM_SYSTEM_BIOS(1, "phd0102", "PHD0102")
+ ROMX_LOAD( "phd0102.rom", 0x000000, 0x80000, CRC(3036774c) SHA1(59856a348f156adf5eca06326f967aca54ff871c), ROM_BIOS(1) )
+
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // 0x00000-0x04ff0 <unknown>
+ // 0x0c000-0x0ffff internal sound BIOS?
+ // 0x10000-0x13fff ^ mirror of above?
+ // 0x14000-0x14ff0 <unknown>
+ // 0x16000-0x19fff contains refs to 765 and HDDs "Conner Peripherals", IDE BIOS?
+ // 0x1c000-0x1ffff contains refs to SDIP setup
+ ROM_COPY( "biosrom", 0x20000, 0x10000, 0x08000 ) // ITF
+ ROM_COPY( "biosrom", 0x28000, 0x18000, 0x18000 ) // BIOS
+ // 0x40000-0x4ffff empty
+ // 0x50000-0x57fff extended BIOS check?
+ // 0x58000-0x65fff empty
+ // 0x66000-0x77fff mirrors of IDE or sound BIOS (left-overs?)
+ // 0x78000-0x7ffff Has a (c) 1986, more left-over?
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+
+/*
+98NOTE - i486SX 33
+*/
+
+ROM_START( pc9821ne )
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ ROM_LOAD( "itf.rom", 0x10000, 0x08000, BAD_DUMP CRC(dd4c7bb8) SHA1(cf3aa193df2722899066246bccbed03f2e79a74a) )
+ ROM_LOAD( "bios_ne.rom", 0x18000, 0x18000, BAD_DUMP CRC(2ae070c4) SHA1(d7963942042bfd84ed5fc9b7ba8f1c327c094172) )
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font_ne.rom", 0x00000, 0x46800, BAD_DUMP CRC(fb213757) SHA1(61525826d62fb6e99377b23812faefa291d78c2e) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+/*
+98MULTi Ce2 - 80486SX 25
+*/
+
+ROM_START( pc9821ce2 )
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ ROM_LOAD( "itf_ce2.rom", 0x10000, 0x008000, CRC(273e9e88) SHA1(9bca7d5116788776ed0f297bccb4dfc485379b41) )
+ ROM_LOAD( "bios_ce2.rom", 0x18000, 0x018000, BAD_DUMP CRC(76affd90) SHA1(910fae6763c0cd59b3957b6cde479c72e21f33c1) )
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font_ce2.rom", 0x00000, 0x046800, BAD_DUMP CRC(d1c2702a) SHA1(e7781e9d35b6511d12631641d029ad2ba3f7daef) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+/*
+PC-9821CX3
+
+Pentium @ 100 MHz
+16MB, max 128 MB
+3.5x1, 4xCD-ROM
+CL GD5440
+PCI VLSI Supercore594 (Wildcat), PCI Rev. 2.0
+*/
+
+ROM_START( pc9821cx3 )
+ ROM_REGION16_LE( 0x80000, "biosrom", ROMREGION_ERASEFF )
+ // ROM BIOS rev. 0.13
+ ROM_LOAD( "pc-9821cx3.bin", 0x000000, 0x080000, CRC(0360ed78) SHA1(2e4fe059d001d980add1656816bda97cd11ef331) )
+
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // TODO: all of the 512k space seems valid
+ // all GFXs are 1bpp packed with different pitches
+ // 0 - 0x56xx: CanBe mascot GFX animations
+ // 0x1fda8 (?) - 0x2458f: monitor GFXs
+ // 0x24590 - 0x36xxx: more CanBe mascot GFX animations
+ // 0x3c000: NEC & CanBe logo GFXs
+ ROM_COPY( "biosrom", 0x68000, 0x00000, 0x18000 )
+ ROM_COPY( "biosrom", 0x30000, 0x18000, 0x18000 )
+
+ // "microcode" memory dump, probably identical to above but shuffled
+ // left for consultation
+ ROM_REGION16_LE( 0x80000, "memory", ROMREGION_ERASEFF )
+ ROM_LOAD( "bank0.bin", 0x000000, 0x008000, CRC(bccc5233) SHA1(1246203bebf9f04e3bac2df7fc64719304f9f1bd) )
+ ROM_LOAD( "bank1.bin", 0x008000, 0x008000, CRC(190b448b) SHA1(01d555cb1044ea280759c5fb724b24ca38ba67f7) )
+ ROM_LOAD( "bank2.bin", 0x010000, 0x008000, CRC(2a73461c) SHA1(745d48a33766b7f4dab84faa87014fd6f4c8ce34) )
+ ROM_LOAD( "bank3.bin", 0x018000, 0x008000, CRC(13ffa799) SHA1(dba02689de02d4c2d6bbf10efe86a37653f3aa86) )
+ ROM_LOAD( "bank4.bin", 0x020000, 0x008000, CRC(b5fa9408) SHA1(fd94a0da767b5de2c10da154ae336c14a1d70e4f) )
+ ROM_LOAD( "bank5.bin", 0x028000, 0x008000, CRC(4e32081e) SHA1(e23571273b7cad01aa116cb7414c5115a1093f85) )
+ ROM_LOAD( "bank6.bin", 0x030000, 0x008000, CRC(1021ccca) SHA1(2154b03c8650e66700a9ea83f1eb2bb32a2bad46) )
+ ROM_LOAD( "bank7.bin", 0x038000, 0x008000, CRC(d339d36f) SHA1(fdb5e2d8bfcc723a86d4706c7c00e3adb1bc421b) )
+ ROM_LOAD( "bank8.bin", 0x040000, 0x008000, CRC(41263c3a) SHA1(fa415639882b266e663f36b22a8f6336258b7f93) )
+ ROM_LOAD( "bank9.bin", 0x048000, 0x008000, CRC(28ccca78) SHA1(44b10f0cfae71b34221306db5d93d5d5aaec3cd3) )
+ ROM_LOAD( "banka.bin", 0x050000, 0x008000, CRC(1b43eabd) SHA1(ca711c69165e1fa5be72993b9a7870ef6d485249) )
+ ROM_LOAD( "bankb.bin", 0x058000, 0x008000, CRC(2ec7b657) SHA1(34b9ba199b13c71d4facc4215931574d59afd928) )
+ ROM_LOAD( "bankc.bin", 0x060000, 0x008000, CRC(b3559c78) SHA1(d8f177b75e96ad22393933534b0432bc0018eae5) )
+ ROM_LOAD( "bankd.bin", 0x068000, 0x008000, CRC(9bc44372) SHA1(baa917086edd578d88b730ab1dca1899beb0525d) )
+ ROM_LOAD( "banke.bin", 0x070000, 0x008000, CRC(911003f4) SHA1(a35b72130b2c3c3822a1648d1f470a6973262c73) )
+ ROM_LOAD( "bankf.bin", 0x078000, 0x008000, CRC(77f6a5c7) SHA1(b8fbf104dd8a8e00855be18f0c3b71da79b6a841) )
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font_ce2.rom", 0x00000, 0x046800, BAD_DUMP CRC(d1c2702a) SHA1(e7781e9d35b6511d12631641d029ad2ba3f7daef) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+/*
+98MATE X - 486/Pentium based
+*/
+
+ROM_START( pc9821xs )
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // "ROM SUM ERROR"
+ ROM_LOAD( "itf.rom", 0x10000, 0x008000, BAD_DUMP CRC(dd4c7bb8) SHA1(cf3aa193df2722899066246bccbed03f2e79a74a) )
+ ROM_LOAD( "bios_xs.rom", 0x18000, 0x018000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) )
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font_xs.rom", 0x00000, 0x046800, BAD_DUMP CRC(c9a77d8f) SHA1(deb8563712eb2a634a157289838b95098ba0c7f2) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+
+/*
+9821Xa16
+
+Pentium P54C @ 166
+32MB
+3.5"2DD/2HDx1, 8xCD-ROM
+CBus: 3 slots
+
+*/
+
+ROM_START( pc9821xa16 )
+ ROM_REGION16_LE( 0x40000, "biosrom", ROMREGION_ERASEFF )
+ ROM_LOAD( "pc-9821xa16_g8yewa_a1_wsg8b01_ab28f200b5-t.bin", 0x00000, 0x040000, CRC(f99c8ce2) SHA1(2bc328d2c496046f6f4f39b0637e90b713a63155) ) // SOP44
+
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // TODO: all of the 256k space seems valid
+ ROM_COPY( "biosrom", 0x28000, 0x00000, 0x18000 )
+ ROM_COPY( "biosrom", 0x00000, 0x18000, 0x18000 )
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+/*
+PC-9821Ra20 (98MATE R)
+
+Pentium Pro @ 200
+32MB
+3.5"2DD/2HDx1, 8xCD-ROM
+CBus: 3 slots
+*/
+
+ROM_START( pc9821ra20 )
+ ROM_REGION16_LE( 0x40000, "biosrom", ROMREGION_ERASEFF )
+ ROM_LOAD( "g8wtp_a13_wtp8b01_ab28f200b5-t.bin", 0x00000, 0x040000, CRC(cd3acc5c) SHA1(746490d7f3d8d0e8df865315adaaae65f3fd0425) ) // SOP44
+
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // TODO: all of the 256k space seems valid
+ ROM_COPY( "biosrom", 0x28000, 0x00000, 0x18000 )
+ ROM_COPY( "biosrom", 0x00000, 0x18000, 0x18000 )
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+/*
+PC-9821Ra266
+
+Pentium II @ 266 MHz
+Trident TGUI9682XGi
+32MB, max 256 MB (ECC EDO RAM)
+3.5x1, 16xCD-ROM
+CBus: 3 slots, PCI: 2 slots
+PCI Intel 440FX (Natoma), PCI Rev. 2.1
+
+PC-9821Ra266/M30R has been re-released in 1998,
+unknown differences other than having Win98 pre-installed
+*/
+
+ROM_START( pc9821ra266 )
+ ROM_REGION16_LE( 0x40000, "biosrom", ROMREGION_ERASEFF )
+ ROM_LOAD( "g8ykkw.bin", 0x000000, 0x040000, CRC(d73a2795) SHA1(65d4e1e438e91c1646bcc06a9868aa474faf0ccf) ) // SOP44
+
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // TODO: all of the 256k space seems valid
+ ROM_COPY( "biosrom", 0x28000, 0x00000, 0x18000 )
+ ROM_COPY( "biosrom", 0x00000, 0x18000, 0x18000 )
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+/*
+PC-9821Ra333 (98MATE R)
+
+Celeron @ 333
+32MB, max 256 MB (ECC EDO RAM)
+3.5x1, 24xCD-ROM
+CBus: 3 slots, PCI: 2 slots
+*/
+
+ROM_START( pc9821ra333 )
+ ROM_REGION16_LE( 0x40000, "biosrom", ROMREGION_ERASEFF )
+ ROM_LOAD( "g8ykkw.bin", 0x00000, 0x040000, CRC(c605ef31) SHA1(3779aed757f21eb75093c1bfcbf18a232c198ee6) )
+
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // TODO: all of the 256k space seems valid
+ ROM_COPY( "biosrom", 0x28000, 0x00000, 0x18000 )
+ ROM_COPY( "biosrom", 0x00000, 0x18000, 0x18000 )
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+
+/*
+98MATE VALUESTAR - Pentium based
+*/
+
+ROM_START( pc9821v13 )
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // "ROM SUM ERROR"
+ ROM_LOAD( "itf.rom", 0x10000, 0x08000, BAD_DUMP CRC(dd4c7bb8) SHA1(cf3aa193df2722899066246bccbed03f2e79a74a) )
+// ROM_LOAD( "itf_v20.rom", 0x10000, 0x08000, BAD_DUMP CRC(10e52302) SHA1(f95b8648e3f5a23e507a9fbda8ab2e317d8e5151) )
+ ROM_LOAD( "bios_v13.rom", 0x18000, 0x18000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) )
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font_v13.rom", 0x00000, 0x46800, BAD_DUMP CRC(c9a77d8f) SHA1(deb8563712eb2a634a157289838b95098ba0c7f2) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+
+ // TODO: factory HDDs
+ROM_END
+
+/*
+98MATE VALUESTAR - Pentium based
+*/
+
+ROM_START( pc9821v20 )
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // Doesn't boot, not an ITF ROM!
+ ROM_LOAD( "itf.rom", 0x10000, 0x08000, BAD_DUMP CRC(dd4c7bb8) SHA1(cf3aa193df2722899066246bccbed03f2e79a74a) )
+// ROM_LOAD( "itf_v20.rom", 0x10000, 0x08000, CRC(10e52302) SHA1(f95b8648e3f5a23e507a9fbda8ab2e317d8e5151) )
+ ROM_LOAD( "bios_v20.rom", 0x18000, 0x18000, BAD_DUMP CRC(d5d1f13b) SHA1(bf44b5f4e138e036f1b848d6616fbd41b5549764) )
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font_v20.rom", 0x00000, 0x046800, BAD_DUMP CRC(6244c4c0) SHA1(9513cac321e89b4edb067b30e9ecb1adae7e7be7) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+
+ // TODO: factory HDDs
+ROM_END
+
+/*
+PC-9821Nr15
+
+Pentium [Pro?] @ 150 MHz
+16MB, max 128 MB
+3.5x1, 8xCD-ROM
+Trident Cyber9385
+TFT 12.1 inches @ 800x600
+
+Nr15/S14F has:
+11xCD-ROM
+FAX
+*/
+
+ROM_START( pc9821nr15 )
+ ROM_REGION16_LE( 0x40000, "biosrom", ROMREGION_ERASEFF )
+ ROM_LOAD( "g8xwa_xwa00_ab28f200bx-t.bin", 0x000000, 0x040000, CRC(17b91850) SHA1(755eb8767c08980d0f1b6e32638e9fdd616a1b26) ) // SOP44
+
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // TODO: all of the 256k space seems valid
+ ROM_COPY( "biosrom", 0x28000, 0x00000, 0x18000 )
+ ROM_COPY( "biosrom", 0x00000, 0x18000, 0x18000 )
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+/*
+PC-9821Nr166
+
+Pentium MMX @ 166 MHz
+32MB, max 128 MB
+3.5x1, 11xCD-ROM
+Trident Cyber9385
+TFT 13.3 inches, 1024x768
+Optional FAX or LAN (depending on model sub-type)
+*/
+
+ROM_START( pc9821nr166 )
+ ROM_REGION16_LE( 0x40000, "biosrom", ROMREGION_ERASEFF )
+ ROM_LOAD( "pc-9821nr166.bin", 0x000000, 0x040000, CRC(6a137f51) SHA1(1b8264ff525cfda5b367bf85570ff53a6ad42cd4) )
+
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // TODO: all of the 256k space seems valid
+ ROM_COPY( "biosrom", 0x28000, 0x00000, 0x18000 )
+ ROM_COPY( "biosrom", 0x00000, 0x18000, 0x18000 )
+
+ // "microcode" memory dump, probably identical to above but shuffled
+ // left for consultation
+ ROM_REGION16_LE( 0x40000, "memory", ROMREGION_ERASEFF )
+ ROM_LOAD( "bank0.bin", 0x000000, 0x008000, CRC(c08b4f76) SHA1(bc352826e33566b0e9f5e54c391d7690b6d8fff0) )
+ ROM_LOAD( "bank1.bin", 0x008000, 0x008000, CRC(62dfab8b) SHA1(e95cd8e6f385a8074fc311dcfc982b42ce1f1a7c) )
+ ROM_LOAD( "bank2.bin", 0x010000, 0x008000, CRC(1df9ebcb) SHA1(91db85ac60ab7c9100aa95c945f50564f4933776) )
+ ROM_LOAD( "bank3.bin", 0x018000, 0x008000, CRC(e2b44219) SHA1(f02449f37a2b3d7a22551c3c4fd018d426059829) )
+ ROM_LOAD( "bank4.bin", 0x020000, 0x008000, CRC(507d66df) SHA1(f29434ce472ea49b87a17f195fef7d31b7f9ba67) )
+ ROM_LOAD( "bank5.bin", 0x028000, 0x008000, CRC(4e32081e) SHA1(e23571273b7cad01aa116cb7414c5115a1093f85) )
+ ROM_LOAD( "bank6.bin", 0x030000, 0x008000, CRC(c0f0495b) SHA1(5fd9db08f61faadc8d5b004e41005f113c480ee5) )
+ ROM_LOAD( "bank7.bin", 0x038000, 0x008000, CRC(cf92cf6b) SHA1(880350ce71fcf5a039155062d6065566f0c8fa46) )
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+ROM_START( pc9821nw150 )
+ ROM_REGION16_LE( 0x40000, "biosrom", ROMREGION_ERASEFF )
+ ROM_LOAD( "g8yxb_b7a_yxb00_ab28f200bx-t.bin", 0x000000, 0x040000, CRC(75f547f6) SHA1(5ff610f3796a3742b674151e4e5a750ded48c951) ) // SOP44
+
+ ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
+ // TODO: all of the 256k space seems valid
+ ROM_COPY( "biosrom", 0x28000, 0x00000, 0x18000 )
+ ROM_COPY( "biosrom", 0x00000, 0x18000, 0x18000 )
+
+ ROM_REGION( 0x80000, "chargen", 0 )
+ ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
+
+ LOAD_KANJI_ROMS
+ LOAD_IDE_ROM
+ROM_END
+
+
+// PC9821 [desktop] class
+// NB: several of these sub-models don't have the final letter in the original flyers but present in later docs as an afterthought.
+// To mark this we intentionally add square brackets here as optional omission notation.
+
+// 98MULTi (i386, desktop)
+COMP( 1992, pc9821, 0, 0, pc9821, pc9821, pc9821_state, init_pc9801_kanji, "NEC", "PC-9821 (98MULTi)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+// 98MATE [A] (i486, desktop, has 98 MATE local bus "ML", with optional RL-like high-reso)
+COMP( 1993, pc9821as, 0, 0, pc9821as, pc9821, pc9821_mate_a_state, init_pc9801_kanji, "NEC", "PC-9821As (98MATE A)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+COMP( 1993, pc9821ap2, pc9821as, 0, pc9821ap2, pc9821, pc9821_mate_a_state, init_pc9801_kanji, "NEC", "PC-9821Ap2/U8W (98MATE A)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+// SC-9821A (rebranded MATE A machines with minor differences such as SW power control)
+// ...
+
+// 98MATE [B] (i486, desktop, has GD5428 and no built-in sound)
+// ...
+
+// 98MULTi CanBe (i486/Pentium, desktop & tower, Multimedia PC with optional TV Tuner & remote control function, Fax, Modem, MPEG-2, FX-98IF for PC-FX compatibility etc. etc.)
+COMP( 1994, pc9821ce2, 0, 0, pc9821ce2, pc9821, pc9821_canbe_state, init_pc9801_kanji, "NEC", "PC-9821Ce2 (98MULTi CanBe)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+COMP( 1995, pc9821cx3, pc9821ce2, 0, pc9821cx3, pc9821, pc9821_canbe_state, init_pc9801_kanji, "NEC", "PC-9821Cx3 (98MULTi CanBe)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+// 98MULTi CanBe Jam (Pentium Pro equipped, laptop, Multimedia PC as above + JEIDA 4.2/PCMCIA 2.1)
+// ...
+
+// CEREB (Pentium MMX based CanBe follow-up. Multimedia PC with a Sony DDU100E DVD-ROM drive as most notable addition.
+// Form factor is way more akin of a DVD player than a PC)
+// ...
+
+// 98MATE X (i486sx/Pentium/Pentium Pro, has PCI, comes with various SVGA cards)
+COMP( 1994, pc9821xs, 0, 0, pc9821xs, pc9821, pc9821_mate_x_state, init_pc9801_kanji, "NEC", "PC-9821Xs (98MATE X)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+COMP( 1996, pc9821xa16, pc9821xs, 0, pc9821xa16, pc9821, pc9821_mate_x_state, init_pc9801_kanji, "NEC", "PC-9821Xa16 (98MATE X)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+// 98MATE VALUESTAR (Pentium, comes with Windows 95 and several programs pre-installed)
+COMP( 1998, pc9821v13, 0, 0, pc9821v13, pc9821, pc9821_valuestar_state, init_pc9801_kanji, "NEC", "PC-9821V13 (98MATE VALUESTAR)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+COMP( 1998, pc9821v20, pc9821v13, 0, pc9821v20, pc9821, pc9821_valuestar_state, init_pc9801_kanji, "NEC", "PC-9821V20 (98MATE VALUESTAR)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+// 98MATE R (Pentium Pro, otherwise same as 98MATE X?)
+COMP( 1996, pc9821ra20, 0, 0, pc9821ra20, pc9821, pc9821_mate_r_state, init_pc9801_kanji, "NEC", "PC-9821Ra20 (98MATE R)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+COMP( 1997, pc9821ra266, pc9821ra20, 0, pc9821ra266, pc9821, pc9821_mate_r_state, init_pc9801_kanji, "NEC", "PC-9821Ra266 (98MATE R)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+COMP( 1998, pc9821ra333, pc9821ra20, 0, pc9821ra333, pc9821, pc9821_mate_r_state, init_pc9801_kanji, "NEC", "PC-9821Ra333 (98MATE R)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+// 98MATE SERVER, pc9821rs* (Server variant of 98MATE R. Inherits concepts from SV-H98 98SERVER)
+// ...
+
+// PC-9821 NOTE[book] class
+// 98NOTE
+COMP( 1994, pc9821ne, 0, 0, pc9821ne, pc9821, pc9821_note_state, init_pc9801_kanji, "NEC", "PC-9821Ne (98NOTE)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+// 98NOTE Lavie
+COMP( 1996, pc9821nr15, 0, 0, pc9821nr15, pc9821, pc9821_note_lavie_state, init_pc9801_kanji, "NEC", "PC-9821Nr15 (98NOTE Lavie)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+COMP( 1997, pc9821nr166, pc9821nr15, 0, pc9821nr166, pc9821, pc9821_note_lavie_state, init_pc9801_kanji, "NEC", "PC-9821Nr166 (98NOTE Lavie)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+COMP( 1997, pc9821nw150, pc9821nr15, 0, pc9821nw150, pc9821, pc9821_note_lavie_state, init_pc9801_kanji, "NEC", "PC-9821Nw150 (98NOTE Lavie)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+// 98NOTE Light
+// ...
+
+// 98NOTE Aile
+// ...
+
+// 98FiNE
+// ...
diff --git a/src/mame/drivers/pc98ha.cpp b/src/mame/drivers/pc98ha.cpp
new file mode 100644
index 00000000000..bd4ca0806a5
--- /dev/null
+++ b/src/mame/drivers/pc98ha.cpp
@@ -0,0 +1,526 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/**************************************************************************************************
+
+ PC98LT/HA class machine "Handy98" aka 1st Gen LCD PC98
+
+ TODO:
+ - pc98lt: remove timer hack:
+ - definitely incorrect given the erratic cursor blinking in N88BASIC;
+ - identify LCDC used here, reg 2 is clearly H display (0x4f+1)*8=640
+ - merge from base pc98 class (WIP);
+ - when idle for some time buzzer farts until a key is pressed (?);
+ - add NVRAM saving:
+ - pinpoint NVRAM init switch source:
+ - first port C read (pc98lt: i/o 0x35, PC=0xf841f) tests for bit 7,
+ which initializes battery backup if on, but port C is in output mode there.
+ Somehow obf irq is on at boot if battery failed?
+ - power handling;
+ - pc98ha specifics:
+ - RTC is upd4991a (partially done), it's parallel instead of serial and incompatible with
+ everything else ugh;
+ - EMS fails at boot, it's never ever really checked;
+ - MSDOS cannot detect EMS properly, is there a flag somewhere?
+ - JEIDA memory card interface;
+ - optional docking station (for floppy device only or can mount other stuff too?);
+
+**************************************************************************************************/
+
+#include "emu.h"
+#include "includes/pc98ha.h"
+
+void pc98lt_state::lt_palette(palette_device &palette) const
+{
+ palette.set_pen_color(0, 160, 168, 160);
+ palette.set_pen_color(1, 48, 56, 16);
+}
+
+uint32_t pc98lt_state::screen_update( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect )
+{
+ for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
+ for (int x = cliprect.min_x; x <= cliprect.max_x; x += 16)
+ {
+ u16 pen = bitswap<16>(m_gvram[(y*640+x)/16], 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7);
+
+ for (int xi = 0; xi < 16; xi++)
+ {
+ u8 dot = (pen >> xi) & 1;
+ bitmap.pix(y, x+xi) = m_palette->pen(dot);
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * Power Status Register
+ *
+ * x--- ---- docking station connected (HA only?)
+ * -x-- ---- AC power supply connected
+ * ---x ---- alarm enabled
+ * ---- x--- unknown
+ * ---- -x-- Lithium battery low (HA only?)
+ * ---- --x- battery low
+ * ---- ---x power off
+ */
+u8 pc98lt_state::power_status_r()
+{
+ return 0x80;
+}
+
+void pc98lt_state::power_control_w(offs_t offset, u8 data)
+{
+ // TODO: happens pretty often, supposed to halt the system and wake up on arbitrary event?
+ if (BIT(data, 2))
+ logerror("%s: power_control_w standby signal ON\n", machine().describe_context());
+
+ // pc98lt: go to prompt (type "command" in main menu) and execute "poweroff.com"
+ if (BIT(data, 0))
+ logerror("%s: power_control_w power off signal ON\n", machine().describe_context());
+
+ // pc98ha bit 1: flips between 0->1 on system boot failure, in tandem with standby mode held
+ if (data & ~0x07)
+ logerror("%s: power_control_w unknown signal sent %02x\n", machine().describe_context(), data);
+}
+
+// TODO: intentionally repeated from base pc98 until I understand what's going on here.
+// (supposedly should be same from base pc98 minus the V50 integrations and whatever the "docking station" really adds up)
+u8 pc98lt_state::floppy_mode_r(offs_t offset)
+{
+ // floppy "mode" identifies drive capabilities, if 2dd/2hd exclusive or mixed type.
+ // and to my understanding it doesn't really read from write reg ...
+ return (m_floppy_mode & 3) | 0x08;
+}
+
+void pc98lt_state::floppy_mode_w(offs_t offset, u8 data)
+{
+ // bit 1: selects between 2hd and 2dd, not unlike base PC98
+ m_floppy_mode = data & 3;
+ m_fdc->subdevice<floppy_connector>("0")->get_device()->set_rpm(data & 0x02 ? 360 : 300);
+ m_fdc->subdevice<floppy_connector>("1")->get_device()->set_rpm(data & 0x02 ? 360 : 300);
+
+ m_fdc->set_rate(data & 0x02 ? 500000 : 250000);
+}
+
+u8 pc98lt_state::fdc_ctrl_r(offs_t offset)
+{
+ // TODO: doesn't work as intended, bit 4 is supposedly if the drive has a disk in or not according to documentation.
+ int ret = (m_fdc->subdevice<floppy_connector>("0")->get_device()->ready_r()) ? 0x10 : 0;
+ ret |= (m_fdc->subdevice<floppy_connector>("1")->get_device()->ready_r()) ? 0x10 : 0;
+ return ret | 0x64;
+}
+
+void pc98lt_state::fdc_ctrl_w(offs_t offset, u8 data)
+{
+ m_fdc->reset_w(BIT(data, 7));
+
+ m_fdc_ctrl = data;
+ if(data & 0x40)
+ {
+ m_fdc->set_ready_line_connected(0);
+ m_fdc->ready_w(0);
+ }
+ else
+ m_fdc->set_ready_line_connected(1);
+
+ m_fdc->subdevice<floppy_connector>("0")->get_device()->mon_w(data & 8 ? ASSERT_LINE : CLEAR_LINE);
+ m_fdc->subdevice<floppy_connector>("1")->get_device()->mon_w(data & 8 ? ASSERT_LINE : CLEAR_LINE);
+}
+
+void pc98lt_state::lt_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x00000, 0x5ffff).ram(); // 384 KB
+ map(0x60000, 0x9ffff).noprw();
+
+ // no TVRAM
+ map(0xa8000, 0xaffff).ram().share("gvram");
+// 0xb0000-0xbffff unmapped GVRAM or mirror, check me
+ map(0xc0000, 0xcffff).unmaprw(); // EMS area, not present here but checked
+ map(0xd0000, 0xd3fff).bankrw("bram_bank");
+ map(0xd4000, 0xd7fff).bankr("dict_bank");
+ map(0xd8000, 0xdbfff).bankr("kanji_bank");
+ map(0xe0000, 0xeffff).bankr("romdrv_bank");
+ map(0xf0000, 0xfffff).rom().region("ipl", 0);
+}
+
+void pc98lt_state::lt_io(address_map &map)
+{
+ map.unmap_value_high();
+// map(0x0000, 0x001f) // PIC (bit 3 ON slave / master), V50 internal / <undefined>
+ map(0x0020, 0x002f).w(FUNC(pc98lt_state::rtc_w)).umask16(0x00ff);
+ map(0x0030, 0x0037).rw(m_ppi_sys, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0xff00); //i8251 RS232c / i8255 system port
+ map(0x0040, 0x0047).rw(m_ppi_prn, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff);
+ map(0x0040, 0x0047).rw(m_keyb, FUNC(pc9801_kbd_device::rx_r), FUNC(pc9801_kbd_device::tx_w)).umask16(0xff00); //i8255 printer port / i8251 keyboard
+// map(0x0070, 0x007f) // PIT, V50 internal
+
+ // floppy actually requires a docking station on PC98HA, density should be 2dd given the mapping
+ map(0x00be, 0x00be).rw(FUNC(pc98lt_state::floppy_mode_r), FUNC(pc98lt_state::floppy_mode_w));
+ map(0x00c8, 0x00cb).m(m_fdc, FUNC(upd765a_device::map)).umask16(0x00ff);
+ map(0x00cc, 0x00cc).rw(FUNC(pc98lt_state::fdc_ctrl_r), FUNC(pc98lt_state::fdc_ctrl_w));
+
+// map(0x00e0, 0x00ef) // uPD71071, V50 internal
+
+// map(0x0810, 0x0810) // <unknown device data>, LCDC?
+// map(0x0812, 0x0812) // <unknown device address> & 0xf
+
+ map(0x0c10, 0x0c10).lrw8(
+ NAME([this] () { return (m_bram_bank_reg & (m_bram_banks - 1)) | 0x40; }),
+ NAME([this] (u8 data) { m_bram_bank_reg = data & (m_bram_banks - 1); m_bram_bank->set_entry(m_bram_bank_reg); })
+ );
+// map(0x0f8e, 0x0f8e) // card slot status 1 (undefined on pc98lt?)
+// map(0x4810, 0x4810) // ?
+ map(0x4c10, 0x4c10).lrw8(
+ NAME([this] () { return (m_dict_bank_reg & 0x3f) | 0x40; }),
+ NAME([this] (u8 data) { m_dict_bank_reg = data & 0x3f; m_dict_bank->set_entry(m_dict_bank_reg); })
+ );
+// map(0x5e8e, 0x5e8e) // card slot status 2
+// map(0x6e8e, 0x6e8e) // modem control 1
+// map(0x7e8e, 0x7e8e) // modem control 2
+ map(0x8810, 0x8810).rw(FUNC(pc98lt_state::power_status_r), FUNC(pc98lt_state::power_control_w));
+ map(0x8c10, 0x8c10).lw8(NAME([this] (u8 data) { m_kanji_bank->set_entry(data & 0x0f); }));
+// map(0xc810, 0xc810) // ?
+ map(0xcc10, 0xcc10).lrw8(
+ NAME([this] () { return (m_romdrv_bank_reg & 0xf) | 0x40; }),
+ NAME([this] (u8 data) { m_romdrv_bank_reg = data & 0xf; m_romdrv_bank->set_entry(m_romdrv_bank_reg); })
+ );
+}
+
+/************************************
+ *
+ * 98HA specifics
+ *
+ ***********************************/
+
+void pc98ha_state::ext_view_bank_w(offs_t offset, u8 data)
+{
+ if (m_ext_view_sel == 0x81)
+ m_ramdrv_bank->set_entry(data & 0x7f);
+ else
+ logerror("External view SEL bank set %02x (view=%02x)\n", data, m_ext_view_sel);
+}
+
+void pc98ha_state::ext_view_sel_w(offs_t offset, u8 data)
+{
+ m_ext_view_sel = data;
+ // either bit 7 ON or writing 0x80 to this port disables the external view.
+ if (data & 0x80)
+ m_ext_view.select(data & 0x3);
+ if (data != 0x81)
+ logerror("External view SEL line set %02x\n", data);
+}
+
+void pc98ha_state::ems_bank_w(offs_t offset, u8 data)
+{
+ m_ems_banks[offset]->set_entry(data & 0x7f);
+}
+
+u8 pc98ha_state::memcard_status_1_r(offs_t offset)
+{
+ // TODO: identify exact type
+ // 0x0e: memory card present
+ // bit 3 is checked at boot, PC=f82a5
+ // mask 0xf0 is checked at PC=f8956 then periodically polled at PC=0xfd110
+ // NeoGeo uses v3
+ return 0x04;
+}
+
+u8 pc98ha_state::memcard_status_2_r(offs_t offset)
+{
+ // 0x46: memory card present
+ return 0x40;
+}
+
+void pc98ha_state::ha_map(address_map &map)
+{
+ lt_map(map);
+ map(0x00000, 0x9ffff).ram(); // 640 KB
+
+ map(0xc0000, 0xc3fff).bankrw("ems_bank1");
+ map(0xc4000, 0xc7fff).bankrw("ems_bank2");
+ map(0xc8000, 0xcbfff).bankrw("ems_bank3");
+ map(0xcc000, 0xcffff).bankrw("ems_bank4");
+ map(0xdc000, 0xdffff).view(m_ext_view);
+ m_ext_view[0](0xdc000, 0xdffff).unmaprw(); // unknown, accessed on MSDOS boot
+ m_ext_view[1](0xdc000, 0xdffff).bankrw("ramdrv_bank");
+ m_ext_view[2](0xdc000, 0xdffff).unmaprw(); // JEIDA memory card
+ m_ext_view[3](0xdc000, 0xdffff).unmaprw();
+}
+
+void pc98ha_state::ha_io(address_map &map)
+{
+ lt_io(map);
+ map(0x0020, 0x002f).unmaprw();
+ map(0x0022, 0x0022).w(m_rtc_pio, FUNC(upd4991a_device::address_w));
+ map(0x0023, 0x0023).rw(m_rtc_pio, FUNC(upd4991a_device::data_r), FUNC(upd4991a_device::data_w));
+ map(0x08e0, 0x08e7).w(FUNC(pc98ha_state::ems_bank_w)).umask16(0xff00);
+ map(0x0e8e, 0x0e8e).w(FUNC(pc98ha_state::ext_view_bank_w));
+ map(0x0f8e, 0x0f8e).r(FUNC(pc98ha_state::memcard_status_1_r));
+ map(0x1e8e, 0x1e8e).w(FUNC(pc98ha_state::ext_view_sel_w));
+ map(0x5f8e, 0x5f8e).r(FUNC(pc98ha_state::memcard_status_2_r));
+}
+
+static INPUT_PORTS_START( pc98lt )
+ PORT_START("SYSB")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER(RTC_TAG, upd1990a_device, data_out_r)
+ PORT_DIPNAME( 0x02, 0x00, "SYSB" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+
+ PORT_START("SYSC")
+ PORT_DIPNAME( 0x01, 0x00, "SYSC" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+
+ PORT_START("PRNB")
+ PORT_DIPNAME( 0x01, 0x00, "PRNB" ) // checked on boot
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // CPUT LT/HA switch
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) // checked on boot
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( On ) )
+ PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(pc98lt_state, system_type_r)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( pc98ha )
+ PORT_INCLUDE( pc98lt )
+
+ PORT_MODIFY("SYSB")
+ PORT_DIPNAME( 0x01, 0x00, "<rtc empty signal>" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+
+ PORT_MODIFY("PRNB")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+// debug
+static const gfx_layout gfx_16x16x1 =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 1,
+ { 0 },
+ { STEP16(0,1) },
+ { STEP16(0,16) },
+ 16*16
+};
+
+static GFXDECODE_START( gfx_pc98lt )
+ GFXDECODE_ENTRY( "kanji", 0x00000, gfx_8x8x1, 0x000, 0x01 )
+ GFXDECODE_ENTRY( "kanji", 0x00000, gfx_16x16x1, 0x000, 0x01 )
+GFXDECODE_END
+
+void pc98lt_state::machine_start()
+{
+ // TODO: make this and NVRAM saving to co-exist
+ // we have a 16-bit host bus with a banked NVRAM window that also has different sizes depending on the model,
+ // may consider to encapsulate instead.
+ const u32 bram_size = memregion("backup")->bytes() / 2;
+ uint16_t *bram = (uint16_t *)memregion("backup")->base();
+ m_bram_banks = (bram_size * 2) / 0x4000;
+ m_bram_ptr = make_unique_clear<uint16_t[]>(bram_size);
+
+ for (int i = 0; i < bram_size; i++)
+ m_bram_ptr[i] = bram[i];
+
+ m_kanji_bank->configure_entries( 0, 0x10, memregion("kanji")->base(), 0x4000);
+ m_bram_bank->configure_entries( 0, m_bram_banks, m_bram_ptr.get(), 0x4000);
+ m_romdrv_bank->configure_entries( 0, 0x10, memregion("romdrv")->base(), 0x10000);
+ m_dict_bank->configure_entries( 0, 0x40, memregion("dict")->base(), 0x4000);
+
+ if (m_rtc != nullptr)
+ {
+ m_rtc->cs_w(1);
+ m_rtc->oe_w(1);
+ }
+ m_sys_type = 0xc0 >> 6;
+
+ save_item(NAME(m_bram_bank_reg));
+ save_item(NAME(m_romdrv_bank_reg));
+ save_item(NAME(m_dict_bank_reg));
+ save_pointer(NAME(m_bram_ptr), bram_size);
+}
+
+void pc98ha_state::machine_start()
+{
+ pc98lt_state::machine_start();
+ const u32 ems_banks = 0x80;
+ const u32 ems_size = (ems_banks * 0x4000) / 2;
+
+ m_ramdrv_bank->configure_entries(0, 0x80, memregion("ramdrv")->base(), 0x4000);
+
+ m_ems_ram = make_unique_clear<uint16_t[]>(ems_size);
+ for (int i = 0; i < 4; i++)
+ m_ems_banks[i]->configure_entries(0, ems_banks, m_ems_ram.get(), 0x4000);
+
+ save_item(NAME(m_ext_view_sel));
+ save_pointer(NAME(m_ems_ram), ems_size);
+}
+
+static void pc9801_floppies(device_slot_interface &device)
+{
+// device.option_add("525dd", FLOPPY_525_DD);
+ device.option_add("525hd", FLOPPY_525_HD);
+// device.option_add("35hd", FLOPPY_35_HD);
+}
+
+void pc98lt_state::lt_config(machine_config &config)
+{
+ const XTAL xtal = XTAL(8'000'000);
+ V50(config, m_maincpu, xtal); // µPD70216
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc98lt_state::lt_map);
+ m_maincpu->set_addrmap(AS_IO, &pc98lt_state::lt_io);
+ // TODO: jumps off the weeds if divided by / 4 after timer check, DMA issue?
+// m_maincpu->set_tclk(xtal / 4);
+ m_maincpu->set_tclk(xtal / 100);
+// m_maincpu->tout2_cb().set_inputline(m_maincpu, INPUT_LINE_IRQ2);
+// m_pit->out_handler<0>().set(m_pic1, FUNC(pic8259_device::ir0_w));
+// m_pit->out_handler<2>().set(m_sio, FUNC(i8251_device::write_txc));
+// m_pit->out_handler<2>().append(m_sio, FUNC(i8251_device::write_rxc));
+
+// m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ PC9801_KBD(config, m_keyb, 53);
+ m_keyb->irq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ1);
+
+ I8255(config, m_ppi_sys, 0);
+ // PC98LT/HA has no dips, port A acts as a RAM storage
+ m_ppi_sys->in_pa_callback().set(m_ppi_sys, FUNC(i8255_device::pa_r));
+ m_ppi_sys->in_pb_callback().set_ioport("SYSB");
+// m_ppi_sys->in_pc_callback().set_constant(0xa0); // 0x80 cpu triple fault reset flag?
+ m_ppi_sys->out_pc_callback().set(FUNC(pc98lt_state::ppi_sys_beep_portc_w));
+
+ I8255(config, m_ppi_prn, 0);
+ m_ppi_prn->in_pb_callback().set_ioport("PRNB");
+
+ UPD1990A(config, m_rtc);
+
+ UPD765A(config, m_fdc, 8'000'000, false, true);
+ m_fdc->intrq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ6);
+ m_fdc->drq_wr_callback().set(m_maincpu, FUNC(v50_device::dreq_w<2>)).invert();
+// m_fdc->drq_wr_callback().set(m_maincpu, FUNC(v50_device::dreq_w<3>)).invert(); // 2dd
+ FLOPPY_CONNECTOR(config, "upd765:0", pc9801_floppies, "525hd", pc9801_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765:1", pc9801_floppies, "525hd", pc9801_state::floppy_formats);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_LCD);
+ // TODO: copied verbatim from base PC98, verify clock et al.
+ m_screen->set_raw(21.0526_MHz_XTAL, 848, 0, 640, 440, 0, 400);
+ m_screen->set_screen_update(FUNC(pc98lt_state::screen_update));
+// m_screen->screen_vblank().set(FUNC(pc9801_state::vrtc_irq));
+
+ PALETTE(config, m_palette, FUNC(pc98lt_state::lt_palette), 2);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_pc98lt);
+
+ SPEAKER(config, "mono").front_center();
+ BEEP(config, m_beeper, 2400).add_route(ALL_OUTPUTS, "mono", 0.05);
+}
+
+void pc98ha_state::ha_config(machine_config &config)
+{
+ lt_config(config);
+ const XTAL xtal = XTAL(10'000'000);
+ V50(config.replace(), m_maincpu, xtal);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc98ha_state::ha_map);
+ m_maincpu->set_addrmap(AS_IO, &pc98ha_state::ha_io);
+ m_maincpu->set_tclk(xtal / 4);
+// m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
+
+ config.device_remove("rtc");
+ UPD4991A(config, m_rtc_pio, 32'768);
+}
+
+// all ROMs in both sets needs at least chip renaming, and I haven't seen a single PCB pic from the net.
+// dict.rom and ramdrv.bin definitely won't fit an even ROM size regardless,
+// also backup.bin may not be factory default.
+
+ROM_START( pc98lt )
+ ROM_REGION16_LE( 0x10000, "ipl", ROMREGION_ERASEFF )
+ ROM_LOAD( "ipl.rom", 0x000000, 0x010000, BAD_DUMP CRC(b6a6a382) SHA1(3f1767cccc1ae02b3e48f6ee327d3ef4fad05750) )
+
+ ROM_REGION( 0x40000, "kanji", ROMREGION_ERASEFF )
+ ROM_LOAD( "kanji.rom", 0x000000, 0x040000, BAD_DUMP CRC(26a81aa2) SHA1(bf12e40c608ef6ef1ac38f6b0b3ca79260a50cef) )
+
+ ROM_REGION16_LE( 0x10000, "backup", ROMREGION_ERASEFF )
+ ROM_LOAD( "backup.bin", 0x000000, 0x010000, BAD_DUMP CRC(56d7ca00) SHA1(d17942e166f98af1d484e497e97d31da515973f7) )
+
+ ROM_REGION( 0x100000, "dict", ROMREGION_ERASEFF )
+ ROM_LOAD( "dict.rom", 0x000000, 0x080000, BAD_DUMP CRC(421278ee) SHA1(f6066fc5085de521395ce1a8bb040536c1454c7e) )
+
+ ROM_REGION( 0x100000, "romdrv", ROMREGION_ERASEFF )
+ ROM_LOAD( "romdrv.rom", 0x000000, 0x080000, BAD_DUMP CRC(282ff6eb) SHA1(f4833e49dd9089ec40f5e86a713e08cd8c598578) )
+ROM_END
+
+ROM_START( pc98ha )
+ ROM_REGION16_LE( 0x10000, "ipl", ROMREGION_ERASEFF )
+ ROM_LOAD( "ipl.rom", 0x000000, 0x010000, BAD_DUMP CRC(2f552bb9) SHA1(7f53bf95181d65b2f9942285da669d92c61247a3) )
+
+ ROM_REGION( 0x40000, "kanji", ROMREGION_ERASEFF )
+ ROM_LOAD( "kanji.rom", 0x000000, 0x040000, BAD_DUMP CRC(4be5ff2f) SHA1(261d28419a2ddebe3177a282952806d7bb036b40) )
+
+ ROM_REGION16_LE( 0x40000, "backup", ROMREGION_ERASEFF )
+ ROM_LOAD( "backup.bin", 0x000000, 0x040000, BAD_DUMP CRC(3c5b2a99) SHA1(f8e2f5a4c7601d4e81d5e9c83621107ed3f5a29a) )
+
+ ROM_REGION( 0x100000, "dict", ROMREGION_ERASEFF )
+ ROM_LOAD( "dict.rom", 0x000000, 0x0c0000, BAD_DUMP CRC(6dc8493c) SHA1(3e04cdc3403a814969b6590cd78e239e72677fe5) )
+
+ ROM_REGION( 0x100000, "romdrv", ROMREGION_ERASEFF )
+ ROM_LOAD( "romdrv.rom", 0x000000, 0x100000, BAD_DUMP CRC(2f59127f) SHA1(932cb970c2b22408f7895dbf9df6dbc47f8e055b) )
+
+ // $00 filled with odd size
+ ROM_REGION( 0x200000, "ramdrv", ROMREGION_ERASEFF )
+ ROM_LOAD( "ramdrv.bin", 0x000000, 0x160000, BAD_DUMP CRC(f2cec994) SHA1(c986ad6d8f810ac0a9657c1af26b6fec712d56ed) )
+ROM_END
+
+COMP( 1989, pc98lt, 0, 0, lt_config, pc98lt, pc98lt_state, empty_init, "NEC", "PC-98LT", MACHINE_NOT_WORKING )
+COMP( 1990, pc98ha, 0, 0, ha_config, pc98ha, pc98ha_state, empty_init, "NEC", "PC-98HA (Handy98)", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/pcipc.cpp b/src/mame/drivers/pcipc.cpp
index cdf7d2d3104..95f9c824bc1 100644
--- a/src/mame/drivers/pcipc.cpp
+++ b/src/mame/drivers/pcipc.cpp
@@ -536,9 +536,9 @@ void pcipc_state::pcipc(machine_config &config)
i82371sb_ide_device &ide(I82371SB_IDE(config, ":pci:07.1", 0));
ide.irq_pri().set(":pci:07.0", FUNC(i82371sb_isa_device::pc_irq14_w));
- ide.irq_sec().set(":pci:07.0", FUNC(i82371sb_isa_device::pc_irq15_w));
+ ide.irq_sec().set(":pci:07.0", FUNC(i82371sb_isa_device::pc_mirq0_w));
// MGA2064W(config, ":pci:12.0", 0);
- VIRGEDX_PCI(config, ":pci:12.0", 0); // use VIRGEDX_PCI for its VESA 2.0 BIOS
+ VIRGE_PCI(config, ":pci:12.0", 0); // use VIRGEDX_PCI for its VESA 2.0 BIOS
ISA16_SLOT(config, "board4", 0, "pci:07.0:isabus", isa_internal_devices, "fdc37c93x", true).set_option_machine_config("fdc37c93x", superio_config);
ISA16_SLOT(config, "isa1", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false);
@@ -547,7 +547,7 @@ void pcipc_state::pcipc(machine_config &config)
ISA16_SLOT(config, "isa4", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false);
ISA16_SLOT(config, "isa5", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false);
- rs232_port_device &serport0(RS232_PORT(config, "serport0", isa_com, "microsoft_mouse"));
+ rs232_port_device& serport0(RS232_PORT(config, "serport0", isa_com, nullptr)); // "microsoft_mouse"));
serport0.rxd_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::rxd1_w));
serport0.dcd_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndcd1_w));
serport0.dsr_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndsr1_w));
diff --git a/src/mame/drivers/pegasus.cpp b/src/mame/drivers/pegasus.cpp
index d936a6499cb..a782a37ea63 100644
--- a/src/mame/drivers/pegasus.cpp
+++ b/src/mame/drivers/pegasus.cpp
@@ -38,18 +38,22 @@
****************************************************************************/
#include "emu.h"
+
#include "bus/generic/carts.h"
#include "bus/generic/slot.h"
#include "cpu/m6809/m6809.h"
#include "imagedev/cassette.h"
#include "machine/6821pia.h"
#include "machine/timer.h"
+
#include "emupal.h"
#include "screen.h"
#include "softlist.h"
#include "speaker.h"
+namespace {
+
class pegasus_state : public driver_device
{
public:
@@ -74,6 +78,10 @@ public:
void init_pegasus();
+protected:
+ virtual void machine_reset() override;
+ virtual void machine_start() override;
+
private:
u8 pegasus_keyboard_r();
u8 pegasus_protection_r();
@@ -100,8 +108,6 @@ private:
u8 m_kbd_row;
bool m_kbd_irq;
u8 m_control_bits;
- virtual void machine_reset() override;
- virtual void machine_start() override;
std::unique_ptr<u8[]> m_pcg;
void pegasus_decrypt_rom(u8 *ROM);
required_device<cpu_device> m_maincpu;
@@ -130,13 +136,13 @@ WRITE_LINE_MEMBER( pegasus_state::pegasus_firq_clr )
u8 pegasus_state::pegasus_keyboard_r()
{
- u8 i,data = 0xff;
- for (i = 0; i < 8; i++)
+ u8 data = 0xff;
+ for (unsigned i = 0; i < 8; i++)
if (!BIT(m_kbd_row, i)) data &= m_io_keyboard[i]->read();
m_kbd_irq = (data == 0xff) ? 1 : 0;
if (BIT(m_control_bits, 3))
- data<<=4;
+ data <<= 4;
return data;
}
@@ -314,16 +320,16 @@ static const u8 mcm6571a_shift[] =
u32 pegasus_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- u16 sy=0,ma=0;
- bool pcg_mode = BIT(m_control_bits, 1);
+ u16 sy=0, ma=0;
+ const bool pcg_mode = BIT(m_control_bits, 1);
- for(u8 y = 0; y < 16; y++ )
+ for (u8 y = 0; y < 16; y++)
{
- for(u8 ra = 0; ra < 16; ra++ )
+ for (u8 ra = 0; ra < 16; ra++)
{
u16 *p = &bitmap.pix(sy++);
- for(u16 x = ma; x < ma + 32; x++ )
+ for (u16 x = ma; x < ma + 32; x++)
{
u8 inv = 0xff;
u8 chr = m_vram[x];
@@ -373,15 +379,15 @@ u32 pegasus_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, co
/* F4 Character Displayer */
static const gfx_layout pegasus_charlayout =
{
- 8, 16, /* text = 7 x 9, pcg = 8 x 16 */
- 128, /* 128 characters */
- 1, /* 1 bits per pixel */
- { 0 }, /* no bitplanes */
- /* x offsets */
+ 8, 16, // text = 7 x 9, pcg = 8 x 16
+ 128, // 128 characters
+ 1, // 1 bits per pixel
+ { 0 }, // no bitplanes
+ // x offsets
{ 0, 1, 2, 3, 4, 5, 6, 7 },
- /* y offsets */
+ // y offsets
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
- 8*16 /* every char takes 16 bytes */
+ 8*16 // every char takes 16 bytes
};
static GFXDECODE_START( gfx_pegasus )
@@ -396,10 +402,6 @@ GFXDECODE_END
void pegasus_state::pegasus_decrypt_rom(u8 *ROM)
{
bool doit = false;
- u8 b;
- u16 j;
- std::vector<u8> temp_copy;
- temp_copy.resize(0x1000);
if (ROM[0] == 0x02) doit = true;
if (ROM[0] == 0x1e && ROM[1] == 0xfa && ROM[2] == 0x60 && ROM[3] == 0x71) doit = true; // xbasic 2nd rom
@@ -409,11 +411,12 @@ void pegasus_state::pegasus_decrypt_rom(u8 *ROM)
if (doit)
{
+ std::vector<u8> temp_copy;
+ temp_copy.resize(0x1000);
for (int i = 0; i < 0x1000; i++)
{
- b = ROM[i];
- j = bitswap<16>(i, 15, 14, 13, 12, 11, 10, 9, 8, 0, 1, 2, 3, 4, 5, 6, 7);
- b = bitswap<8>(b, 3, 2, 1, 0, 7, 6, 5, 4);
+ const u16 j = bitswap<16>(i, 15, 14, 13, 12, 11, 10, 9, 8, 0, 1, 2, 3, 4, 5, 6, 7);
+ const u8 b = bitswap<8>(ROM[i], 3, 2, 1, 0, 7, 6, 5, 4);
temp_copy[j & 0xfff] = b;
}
memcpy(ROM, &temp_copy[0], 0x1000);
@@ -427,7 +430,7 @@ image_init_result pegasus_state::load_cart(device_image_interface &image, generi
if (size > 0x1000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
@@ -443,7 +446,7 @@ image_init_result pegasus_state::load_cart(device_image_interface &image, generi
std::string errmsg = string_format(
"Attempted to load a file that does not work in this socket.\n"
"Please check \"Usage\" field in the software list for the correct socket(s) to use.");
- image.seterror(IMAGE_ERROR_UNSPECIFIED, errmsg.c_str());
+ image.seterror(image_error::INVALIDIMAGE, errmsg.c_str());
return image_init_result::FAIL;
}
}
@@ -575,6 +578,9 @@ ROM_END
#define rom_pegasusm rom_pegasus
+} // anonymous namespace
+
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/pgm.cpp b/src/mame/drivers/pgm.cpp
index 4f2b075e888..7383b538ec4 100644
--- a/src/mame/drivers/pgm.cpp
+++ b/src/mame/drivers/pgm.cpp
@@ -2487,6 +2487,42 @@ ROM_START( killbld106 )
ROM_LOAD( "pgm_m0300.u1", 0x400000, 0x400000, CRC(93159695) SHA1(50c5976c9b681bd3d1ebefa3bfa9fe6e72dcb96f) )
ROM_END
+ROM_START( killbld100 ) // was dumped from a Taiwanese board
+ ROM_REGION( 0x600000, "maincpu", 0 ) /* 68000 Code */
+ PGM_68K_BIOS
+ ROM_LOAD16_BYTE( "kb_u3_v100.u3", 0x100001, 0x080000, CRC(ba3233a9) SHA1(d41f00c0c83ead8567b2e4ebf3fd7b8525f06b73) )
+ ROM_LOAD16_BYTE( "kb_u6_v100.u6", 0x100000, 0x080000, CRC(55ae1d39) SHA1(931411c0d7d02a636010bb5f7f312906de32d839) )
+ ROM_LOAD16_BYTE( "kb_u4_v100.u4", 0x200001, 0x080000, CRC(d56a8407) SHA1(1c43c62ec9e3b11f77d9c14647797493f7b8f960) )
+ ROM_LOAD16_BYTE( "kb_u5_v100.u5", 0x200000, 0x080000, CRC(99afff2b) SHA1(4167efc81daf365e632177bb26650c95dcc32ccb) )
+
+ ROM_REGION( 0x010000, "igs022", 0 ) /* Protection Data */
+ ROM_LOAD( "kb_u2_v100.u2", 0x000000, 0x010000, CRC(6fbbdcb7) SHA1(2928b66cd605d38a5d4e5876890e52af89dfadc4) )
+
+ ROM_REGION( 0xa00000, "tiles", 0 ) /* 8x8 Text Tiles + 32x32 BG Tiles */
+ PGM_VIDEO_BIOS
+ ROM_LOAD( "pgm_t0300.u14", 0x180000, 0x400000, CRC(0922f7d9) SHA1(4302b4b7369e13f315fad14f7d6cad1321101d24) )
+
+ ROM_REGION16_LE( 0x2000000, "sprcol", 0 ) /* Sprite Colour Data */
+ ROM_LOAD( "pgm_a0300.u9", 0x0000000, 0x0400000, CRC(3f9455d3) SHA1(3718ce00ad93975383aafc14e5a74dc297b011a1) )
+ ROM_LOAD( "pgm_a0301.u10", 0x0400000, 0x0400000, CRC(92776889) SHA1(6d677837fefff47bfd1c6166322f69f89989a5e2) )
+ ROM_LOAD( "pgm_a0303.u11", 0x0800000, 0x0400000, CRC(33f5cc69) SHA1(9cacd5058d4bb25b77f71658bbbbd4b38d0a6b6a) )
+ ROM_LOAD( "pgm_a0306.u12", 0x0c00000, 0x0400000, CRC(cc018a8e) SHA1(37752d46f238fb57c0ab5a4f96b1e013f2077347) )
+ ROM_LOAD( "pgm_a0307.u2", 0x1000000, 0x0400000, CRC(bc772e39) SHA1(079cc42a190cb916f02b59bca8fa90e524acefe9) )
+// ROM_LOAD( "pgm_a0302.u3", 0x1400000, 0x0200000, CRC(a4810e38) SHA1(c31fe641feab2c93795fc35bf71d4f37af1056d4) ) // from lord of gun! unused..
+// ROM_LOAD( "pgm_a0304.u4", 0x1600000, 0x0200000, CRC(3096de1c) SHA1(d010990d21cfda9cb8ab5b4bc0e329c23b7719f5) ) // from lord of gun! unused..
+// ROM_LOAD( "pgm_a0305.u5", 0x1800000, 0x0200000, CRC(2234531e) SHA1(58a82e31a1c0c1a4dd026576319f4e7ecffd140e) ) // from lord of gun! unused..
+
+ ROM_REGION16_LE( 0x1000000, "sprmask", 0 ) /* Sprite Masks + Colour Indexes */
+ ROM_LOAD( "pgm_b0300.u13", 0x0000000, 0x0400000, CRC(7f876981) SHA1(43555a200929ad5ecc42137fc9aeb42dc4f50d20) )
+ ROM_LOAD( "pgm_b0302.u14", 0x0400000, 0x0400000, CRC(eea9c502) SHA1(04b3972c7111ea59a3cceab6ad124080c4ce3520) )
+ ROM_LOAD( "pgm_b0303.u15", 0x0800000, 0x0200000, CRC(77a9652e) SHA1(2342f643d37945fbda224a5034c013796e5134ca) )
+// ROM_LOAD( "pgm_b0301.u8", 0x0a00000, 0x0200000, CRC(400abe33) SHA1(20de1eb626424ea41bd55eb3cecd6b50be744ee0) ) // from lord of gun! unused..
+
+ ROM_REGION( 0x800000, "ics", 0 ) /* Samples - (8 bit mono 11025Hz) - */
+ PGM_AUDIO_BIOS
+ ROM_LOAD( "pgm_m0300.u1", 0x400000, 0x400000, CRC(93159695) SHA1(50c5976c9b681bd3d1ebefa3bfa9fe6e72dcb96f) )
+ROM_END
+
/*
Puzzle Star
@@ -5364,6 +5400,7 @@ GAME( 1997, drgw2100hk, drgw2, pgm_012_025_drgw2, pgm, pgm_012_
GAME( 1998, killbld, pgm, pgm_022_025_killbld, killbld, pgm_022_025_state, init_killbld, ROT0, "IGS", "The Killing Blade / Ao Jian Kuang Dao (ver. 109, Chinese Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) /* region provided by protection device */
GAME( 1998, killbld104, killbld, pgm_022_025_killbld, killbld, pgm_022_025_state, init_killbld, ROT0, "IGS", "The Killing Blade / Ao Jian Kuang Dao (ver. 104)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) /* region provided by protection device */
GAME( 1998, killbld106, killbld, pgm_022_025_killbld, killbld, pgm_022_025_state, init_killbld, ROT0, "IGS", "The Killing Blade / Ao Jian Kuang Dao (ver. 106)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) /* region provided by protection device */
+GAME( 1998, killbld100, killbld, pgm_022_025_killbld, killbld, pgm_022_025_state, init_killbld, ROT0, "IGS", "The Killing Blade / Ao Jian Kuang Dao (ver. 100)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) /* region provided by protection device */
//中國龍3/Zhōngguó lóng 3 (China, Taiwan, Japan; Traditional chinese only in title screen)
//東方之珠3/Dung1Fong1 Zi1 Zyu1 3 (Hong Kong)/dongbang jiju 3 (Korea)
diff --git a/src/mame/drivers/phunsy.cpp b/src/mame/drivers/phunsy.cpp
index fc5c5776fa5..25a260c9c5f 100644
--- a/src/mame/drivers/phunsy.cpp
+++ b/src/mame/drivers/phunsy.cpp
@@ -291,7 +291,7 @@ QUICKLOAD_LOAD_MEMBER(phunsy_state::quickload_cb)
int quick_length = image.length();
if (quick_length > 0x4000)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too long");
+ image.seterror(image_error::INVALIDIMAGE, "File too long");
image.message(" File too long");
}
else
diff --git a/src/mame/drivers/pipbug.cpp b/src/mame/drivers/pipbug.cpp
index dee8696c1b1..a7214dbb094 100644
--- a/src/mame/drivers/pipbug.cpp
+++ b/src/mame/drivers/pipbug.cpp
@@ -160,12 +160,12 @@ QUICKLOAD_LOAD_MEMBER(pipbug_state::quickload_cb)
quick_length = image.length();
if (quick_length < 0x0444)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ image.seterror(image_error::INVALIDIMAGE, "File too short");
image.message(" File too short");
}
else if (quick_length > 0x8000)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too long");
+ image.seterror(image_error::INVALIDIMAGE, "File too long");
image.message(" File too long");
}
else
@@ -174,12 +174,12 @@ QUICKLOAD_LOAD_MEMBER(pipbug_state::quickload_cb)
read_ = image.fread( &quick_data[0], quick_length);
if (read_ != quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Cannot read the file");
+ image.seterror(image_error::INVALIDIMAGE, "Cannot read the file");
image.message(" Cannot read the file");
}
else if (quick_data[0] != 0xc4)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid header");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid header");
image.message(" Invalid header");
}
else
@@ -188,7 +188,7 @@ QUICKLOAD_LOAD_MEMBER(pipbug_state::quickload_cb)
if (exec_addr >= quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Exec address beyond end of file");
+ image.seterror(image_error::INVALIDIMAGE, "Exec address beyond end of file");
image.message(" Exec address beyond end of file");
}
else
diff --git a/src/mame/drivers/pipeline.cpp b/src/mame/drivers/pipeline.cpp
index 20555ed2e05..16fd62d62a0 100644
--- a/src/mame/drivers/pipeline.cpp
+++ b/src/mame/drivers/pipeline.cpp
@@ -69,10 +69,10 @@ Stephh's notes (based on the games Z80 code and some tests) :
#include "cpu/m6805/m68705.h"
#include "cpu/z80/z80.h"
-#include "machine/z80daisy.h"
#include "machine/i8255.h"
#include "machine/z80ctc.h"
+#include "machine/z80daisy.h"
#include "sound/ymopn.h"
@@ -82,6 +82,8 @@ Stephh's notes (based on the games Z80 code and some tests) :
#include "tilemap.h"
+namespace {
+
class pipeline_state : public driver_device
{
public:
@@ -89,10 +91,14 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_mcu(*this, "mcu")
+ , m_ctc(*this, "ctc")
, m_gfxdecode(*this, "gfxdecode")
, m_palette(*this, "palette")
- , m_vram1(*this, "vram1")
- , m_vram2(*this, "vram2")
+ , m_vram(*this, "vram%u", 1U)
+ , m_vidctrl(0)
+ , m_palram(*this, "palram", 0x1000, ENDIANNESS_LITTLE)
+ , m_from_mcu(0)
+ , m_sound_data(0)
{
}
@@ -103,20 +109,23 @@ protected:
virtual void video_start() override;
private:
- void vram2_w(offs_t offset, uint8_t data);
- void vram1_w(offs_t offset, uint8_t data);
- void mcu_porta_w(uint8_t data);
- void vidctrl_w(uint8_t data);
- uint8_t protection_r();
- void protection_w(uint8_t data);
+ void vram2_w(offs_t offset, u8 data);
+ void vram1_w(offs_t offset, u8 data);
+ void mcu_porta_w(u8 data);
+ void vidctrl_w(u8 data);
+ u8 protection_r();
+ void protection_w(u8 data);
+ u8 sound_data_r();
+ void sound_data_w(u8 data);
TILE_GET_INFO_MEMBER(get_tile_info);
TILE_GET_INFO_MEMBER(get_tile_info2);
- void pipeline_palette(palette_device &palette) const;
+ void palette(palette_device &palette) const;
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ TIMER_CALLBACK_MEMBER(vidctrl_deferred_w);
TIMER_CALLBACK_MEMBER(protection_deferred_w);
transient_timer_factory m_protection_deferred_w;
@@ -126,70 +135,79 @@ private:
required_device<cpu_device> m_maincpu;
required_device<m68705r_device> m_mcu;
+ required_device<z80ctc_device> m_ctc;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
- required_shared_ptr<u8> m_vram1;
- required_shared_ptr<u8> m_vram2;
+ required_shared_ptr_array<u8, 2> m_vram;
- tilemap_t *m_tilemap1;
- tilemap_t *m_tilemap2;
+ tilemap_t *m_tilemap[2];
- u8 m_vidctrl;
- std::unique_ptr<u8[]> m_palram;
- u8 m_from_mcu;
+ u8 m_vidctrl;
+ memory_share_creator<u8> m_palram;
+ u8 m_from_mcu;
+ u8 m_sound_data;
};
void pipeline_state::machine_start()
{
+ membank("soundbank")->configure_entries(0, 2, memregion("audiocpu")->base() + 0x8000, 0x4000);
+
save_item(NAME(m_from_mcu));
+ save_item(NAME(m_sound_data));
+
m_protection_deferred_w.init(*this, FUNC(pipeline_state::protection_deferred_w));
}
TILE_GET_INFO_MEMBER(pipeline_state::get_tile_info)
{
- int code = m_vram2[tile_index] + m_vram2[tile_index + 0x800] * 256;
+ int code = m_vram[1][tile_index] + m_vram[1][tile_index + 0x800] * 256;
tileinfo.set(0, code, 0, 0);
}
TILE_GET_INFO_MEMBER(pipeline_state::get_tile_info2)
{
- int code = m_vram1[tile_index] + ((m_vram1[tile_index + 0x800] >> 4)) * 256;
- int color = ((m_vram1[tile_index + 0x800]) & 0xf);
+ int code = m_vram[0][tile_index] + ((m_vram[0][tile_index + 0x800] >> 4)) * 256;
+ int color = ((m_vram[0][tile_index + 0x800]) & 0xf);
tileinfo.set(1, code, color, 0);
}
void pipeline_state::video_start()
{
- m_palram=std::make_unique<u8[]>(0x1000);
- m_tilemap1 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(pipeline_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8,8, 64,32);
- m_tilemap2 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(pipeline_state::get_tile_info2)), TILEMAP_SCAN_ROWS, 8,8, 64,32);
- m_tilemap2->set_transparent_pen(0);
+ m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(pipeline_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8,8, 64,32);
+ m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(pipeline_state::get_tile_info2)), TILEMAP_SCAN_ROWS, 8,8, 64,32);
+ m_tilemap[1]->set_transparent_pen(0);
save_item(NAME(m_vidctrl));
- save_pointer(NAME(m_palram), 0x1000);
}
u32 pipeline_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- m_tilemap1->draw(screen, bitmap, cliprect, 0,0);
- m_tilemap2->draw(screen, bitmap, cliprect, 0,0);
+ m_tilemap[0]->draw(screen, bitmap, cliprect, 0, 0);
+ m_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
-void pipeline_state::vidctrl_w(uint8_t data)
+void pipeline_state::vidctrl_w(u8 data)
+{
+ // synchronization is needed to avoid spurious CTC interrupts
+ machine().scheduler().synchronize(timer_expired_delegate(FUNC(pipeline_state::vidctrl_deferred_w),this), data);
+}
+
+TIMER_CALLBACK_MEMBER(pipeline_state::vidctrl_deferred_w)
{
- m_vidctrl = data;
+ m_vidctrl = u8(param);
+ m_ctc->trg2(BIT(param, 1));
}
-void pipeline_state::vram2_w(offs_t offset, uint8_t data)
+void pipeline_state::vram2_w(offs_t offset, u8 data)
{
if (!(m_vidctrl & 1))
{
- m_tilemap1->mark_tile_dirty(offset & 0x7ff);
- m_vram2[offset] = data;
+ m_tilemap[0]->mark_tile_dirty(offset & 0x7ff);
+ m_vram[1][offset] = data;
}
else
{
@@ -202,13 +220,13 @@ void pipeline_state::vram2_w(offs_t offset, uint8_t data)
}
}
-void pipeline_state::vram1_w(offs_t offset, uint8_t data)
+void pipeline_state::vram1_w(offs_t offset, u8 data)
{
- m_tilemap2->mark_tile_dirty(offset & 0x7ff);
- m_vram1[offset] = data;
+ m_tilemap[1]->mark_tile_dirty(offset & 0x7ff);
+ m_vram[0][offset] = data;
}
-uint8_t pipeline_state::protection_r()
+u8 pipeline_state::protection_r()
{
return m_from_mcu;
}
@@ -218,18 +236,28 @@ TIMER_CALLBACK_MEMBER(pipeline_state::protection_deferred_w)
m_mcu->pa_w(param);
}
-void pipeline_state::protection_w(uint8_t data)
+void pipeline_state::protection_w(u8 data)
{
m_protection_deferred_w.synchronize(data);
machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(100));
}
+u8 pipeline_state::sound_data_r()
+{
+ return m_sound_data;
+}
+
+void pipeline_state::sound_data_w(u8 data)
+{
+ m_sound_data = data;
+}
+
void pipeline_state::cpu0_mem(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x87ff).ram();
- map(0x8800, 0x97ff).ram().w(FUNC(pipeline_state::vram1_w)).share("vram1");
- map(0x9800, 0xa7ff).ram().w(FUNC(pipeline_state::vram2_w)).share("vram2");
+ map(0x8800, 0x97ff).ram().w(FUNC(pipeline_state::vram1_w)).share(m_vram[0]);
+ map(0x9800, 0xa7ff).ram().w(FUNC(pipeline_state::vram2_w)).share(m_vram[1]);
map(0xb800, 0xb803).rw("ppi8255_0", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xb810, 0xb813).rw("ppi8255_1", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xb830, 0xb830).noprw();
@@ -239,24 +267,25 @@ void pipeline_state::cpu0_mem(address_map &map)
void pipeline_state::cpu1_mem(address_map &map)
{
map(0x0000, 0x7fff).rom();
+ map(0x8000, 0xbfff).bankr("soundbank");
map(0xc000, 0xc7ff).ram();
- map(0xe000, 0xe003).rw("ppi8255_2", FUNC(i8255_device::read), FUNC(i8255_device::write));
+ map(0xe000, 0xe001).mirror(2).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write));
}
void pipeline_state::sound_port(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x03).rw("ctc", FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
- map(0x06, 0x07).noprw();
+ map(0x00, 0x03).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
+ map(0x04, 0x07).rw("ppi8255_2", FUNC(i8255_device::read), FUNC(i8255_device::write));
}
-void pipeline_state::mcu_porta_w(uint8_t data)
+void pipeline_state::mcu_porta_w(u8 data)
{
m_from_mcu = data;
}
-/* verified from Z80 code */
+// verified from Z80 code
static INPUT_PORTS_START( pipeline )
PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
@@ -264,18 +293,18 @@ static INPUT_PORTS_START( pipeline )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
PORT_START("DSW1")
- /* bits 0 to 6 are tested from less to most significant - code at 0x00dd */
+ // bits 0 to 6 are tested from less to most significant - code at 0x00dd
PORT_DIPNAME( 0x7f, 0x00, DEF_STR( Coinage ) )
PORT_DIPSETTING( 0x07, "10 Coins/1 Credit" )
PORT_DIPSETTING( 0x03, DEF_STR( 5C_1C ) )
PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
-// PORT_DIPSETTING( 0x7f, DEF_STR( 1C_1C ) ) /* duplicated setting */
+// PORT_DIPSETTING( 0x7f, DEF_STR( 1C_1C ) ) // duplicated setting
PORT_DIPSETTING( 0x0f, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x1f, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0x3f, DEF_STR( 1C_4C ) )
@@ -284,21 +313,21 @@ static INPUT_PORTS_START( pipeline )
PORT_DIPSETTING( 0x00, "2" )
PORT_START("DSW2")
- /* bits 0 to 2 are tested from less to most significant - code at 0x0181 */
+ // bits 0 to 2 are tested from less to most significant - code at 0x0181
PORT_DIPNAME( 0x07, 0x00, DEF_STR( Difficulty ) )
- PORT_DIPSETTING( 0x00, DEF_STR( Easy ) ) /* table at 0x35eb */
- PORT_DIPSETTING( 0x01, DEF_STR( Medium ) ) /* table at 0x35c5 */
-// PORT_DIPSETTING( 0x07, DEF_STR( Medium ) ) /* duplicated setting */
- PORT_DIPSETTING( 0x03, DEF_STR( Hard ) ) /* table at 0x35a0 */
- PORT_DIPNAME( 0x18, 0x18, "Water Speed" ) /* check code at 0x2619 - table at 0x5685 */
- PORT_DIPSETTING( 0x18, "Slowest" ) /* 0x12 */
- PORT_DIPSETTING( 0x10, "Slow" ) /* 0x0f */
- PORT_DIPSETTING( 0x08, "Fast" ) /* 0x0d */
- PORT_DIPSETTING( 0x00, "Fastest" ) /* 0x08 */
- PORT_DIPNAME( 0x20, 0x20, "Continue" ) /* check code at 0x0ffd - see notes */
+ PORT_DIPSETTING( 0x00, DEF_STR( Easy ) ) // table at 0x35eb
+ PORT_DIPSETTING( 0x01, DEF_STR( Medium ) ) // table at 0x35c5
+ PORT_DIPSETTING( 0x07, DEF_STR( Medium ) ) // duplicated setting
+ PORT_DIPSETTING( 0x03, DEF_STR( Hard ) ) // table at 0x35a0
+ PORT_DIPNAME( 0x18, 0x18, "Water Speed" ) // check code at 0x2619 - table at 0x5685
+ PORT_DIPSETTING( 0x18, "Slowest" ) // 0x12
+ PORT_DIPSETTING( 0x10, "Slow" ) // 0x0f
+ PORT_DIPSETTING( 0x08, "Fast" ) // 0x0d
+ PORT_DIPSETTING( 0x00, "Fastest" ) // 0x08
+ PORT_DIPNAME( 0x20, 0x20, "Continue" ) // check code at 0x0ffd - see notes
PORT_DIPSETTING( 0x20, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x00, "Checkpoints" )
- PORT_DIPNAME( 0xc0, 0x00, "Sounds/Music" ) /* check code at 0x1c0a - determine if it really affects music once it is supported */
+ PORT_DIPNAME( 0xc0, 0x00, "Sounds/Music" ) // check code at 0x1c0a
PORT_DIPSETTING( 0xc0, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, "Attract Mode" )
PORT_DIPSETTING( 0x80, "Normal Game" )
@@ -329,8 +358,8 @@ static const gfx_layout layout_8x8x3 =
};
static GFXDECODE_START( gfx_pipeline )
- GFXDECODE_ENTRY( "gfx1", 0, layout_8x8x8, 0x000, 1 ) // 8bpp tiles
- GFXDECODE_ENTRY( "gfx2", 0, layout_8x8x3, 0x100, 32 ) // 3bpp tiles
+ GFXDECODE_ENTRY( "8bpp_tiles", 0, layout_8x8x8, 0x000, 1 )
+ GFXDECODE_ENTRY( "3bpp_tiles", 0, layout_8x8x3, 0x100, 32 )
GFXDECODE_END
static const z80_daisy_config daisy_chain_sound[] =
@@ -339,7 +368,7 @@ static const z80_daisy_config daisy_chain_sound[] =
{ nullptr }
};
-void pipeline_state::pipeline_palette(palette_device &palette) const
+void pipeline_state::palette(palette_device &palette) const
{
u8 const *const prom1 = &memregion("proms")->base()[0x000];
u8 const *const prom2 = &memregion("proms")->base()[0x100];
@@ -356,24 +385,25 @@ void pipeline_state::pipeline_palette(palette_device &palette) const
void pipeline_state::pipeline(machine_config &config)
{
- /* basic machine hardware */
- Z80(config, m_maincpu, 7372800/2);
+ // basic machine hardware
+ Z80(config, m_maincpu, 7.3728_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &pipeline_state::cpu0_mem);
- z80_device& audiocpu(Z80(config, "audiocpu", 7372800/2));
+ z80_device& audiocpu(Z80(config, "audiocpu", 7.3728_MHz_XTAL / 2));
audiocpu.set_daisy_config(daisy_chain_sound);
audiocpu.set_addrmap(AS_PROGRAM, &pipeline_state::cpu1_mem);
audiocpu.set_addrmap(AS_IO, &pipeline_state::sound_port);
- M68705R3(config, m_mcu, 7372800/2);
+ M68705R3(config, m_mcu, 7.3728_MHz_XTAL / 2);
m_mcu->porta_w().set(FUNC(pipeline_state::mcu_porta_w));
- z80ctc_device& ctc(Z80CTC(config, "ctc", 7372800/2 /* same as "audiocpu" */));
- ctc.intr_callback().set_inputline("audiocpu", INPUT_LINE_IRQ0);
+ Z80CTC(config, m_ctc, 7.3728_MHz_XTAL / 2); // same as "audiocpu"
+ // TODO: external clock needed for channel 1 (DAC-related)?
+ m_ctc->intr_callback().set_inputline("audiocpu", INPUT_LINE_IRQ0);
i8255_device &ppi0(I8255A(config, "ppi8255_0"));
ppi0.in_pa_callback().set_ioport("P1");
- // PORT B Write - related to sound/music : check code at 0x1c0a
+ ppi0.out_pb_callback().set(FUNC(pipeline_state::sound_data_w)); // related to sound/music : check code at 0x1c0a
ppi0.out_pc_callback().set(FUNC(pipeline_state::vidctrl_w));
i8255_device &ppi1(I8255A(config, "ppi8255_1"));
@@ -382,9 +412,11 @@ void pipeline_state::pipeline(machine_config &config)
ppi1.in_pc_callback().set(FUNC(pipeline_state::protection_r));
ppi1.out_pc_callback().set(FUNC(pipeline_state::protection_w));
- I8255A(config, "ppi8255_2", 0);
+ i8255_device &ppi2(I8255A(config, "ppi8255_2"));
+ ppi2.in_pb_callback().set(FUNC(pipeline_state::sound_data_r));
+ ppi2.out_pc_callback().set_membank("soundbank").bit(7);
- /* video hardware */
+ // video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(subseconds::from_usec(0));
@@ -395,43 +427,46 @@ void pipeline_state::pipeline(machine_config &config)
screen.screen_vblank().set_inputline("maincpu", INPUT_LINE_NMI);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_pipeline);
- PALETTE(config, m_palette, FUNC(pipeline_state::pipeline_palette), 0x100 + 0x100);
+ PALETTE(config, m_palette, FUNC(pipeline_state::palette), 0x100 + 0x100);
- /* audio hardware */
+ // audio hardware
SPEAKER(config, "mono").front_center();
- YM2203(config, "ymsnd", 7372800/4).add_route(ALL_OUTPUTS, "mono", 0.60);
+ YM2203(config, "ymsnd", 7.3728_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "mono", 0.30);
}
ROM_START( pipeline )
- ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_REGION( 0x8000, "maincpu", 0 )
ROM_LOAD( "rom1.u77", 0x00000, 0x08000, CRC(6e928290) SHA1(e2c8c35c04fd8ce3ddd6ecec04b0193a248e4362) )
- ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_REGION( 0x8000, "audiocpu", 0 )
ROM_LOAD( "rom2.u84", 0x00000, 0x08000, CRC(e77c43b7) SHA1(8b04005bc448083a429ace3319fc7e168a61f2f9) )
ROM_REGION( 0x1000, "mcu", 0 )
ROM_LOAD( "68705r3.u74", 0x00000, 0x01000, CRC(9bef427e) SHA1(d8e9b144190ac1c837e379e4be69d1e258a6c666) )
- ROM_REGION( 0x18000, "gfx2",0 )
+ ROM_REGION( 0x18000, "3bpp_tiles",0 )
ROM_LOAD( "rom3.u32", 0x00000, 0x08000, CRC(d065ca46) SHA1(9fd8bb66735195d1cd20420096438abb5cb3fd54) )
ROM_LOAD( "rom4.u31", 0x08000, 0x08000, CRC(6dc86355) SHA1(4b73e95726f7f244977634a5a152c90acb4ba89f) )
ROM_LOAD( "rom5.u30", 0x10000, 0x08000, CRC(93f3f82a) SHA1(bc018370efc67a614ef6efa82526225f0db008ac) )
- ROM_REGION( 0x100000, "gfx1",0 )
- ROM_LOAD( "rom13.u1", 0x00000, 0x20000,CRC(611d7e01) SHA1(77e83c51b059f6d64009740d2e7e7ac1c8a6c7ec) )
- ROM_LOAD( "rom12.u2", 0x20000, 0x20000,CRC(8933c908) SHA1(9f04e454aacda479b6d6dd84dedbf56855f07fca) )
- ROM_LOAD( "rom11.u3", 0x40000, 0x20000,CRC(4e20e82d) SHA1(507b996ab5c8b8fb88f826d808f4b74dfc770db3) )
- ROM_LOAD( "rom10.u4", 0x60000, 0x20000,CRC(9892e465) SHA1(8789d169128bfc8de449bd617601a0f7fe1a19fb) )
- ROM_LOAD( "rom9.u5", 0x80000, 0x20000,CRC(07d16ca1) SHA1(caecf98284236af0e1f77566a9c6950491d0902a) )
- ROM_LOAD( "rom8.u6", 0xa0000, 0x20000,CRC(4e244c8a) SHA1(6808b2b195601e8041a12fff4b77e487efba015e) )
- ROM_LOAD( "rom7.u7", 0xc0000, 0x20000,CRC(23eb84dd) SHA1(ad1d359ba59087a5e786d262194cfe7db9bb0000) )
- ROM_LOAD( "rom6.u8", 0xe0000, 0x20000,CRC(c34bee64) SHA1(2da2dc6e6615ccc2e3e7ca0ceb735a347923a728) )
+ ROM_REGION( 0x100000, "8bpp_tiles",0 )
+ ROM_LOAD( "rom13.u1", 0x00000, 0x20000, CRC(611d7e01) SHA1(77e83c51b059f6d64009740d2e7e7ac1c8a6c7ec) )
+ ROM_LOAD( "rom12.u2", 0x20000, 0x20000, CRC(8933c908) SHA1(9f04e454aacda479b6d6dd84dedbf56855f07fca) )
+ ROM_LOAD( "rom11.u3", 0x40000, 0x20000, CRC(4e20e82d) SHA1(507b996ab5c8b8fb88f826d808f4b74dfc770db3) )
+ ROM_LOAD( "rom10.u4", 0x60000, 0x20000, CRC(9892e465) SHA1(8789d169128bfc8de449bd617601a0f7fe1a19fb) )
+ ROM_LOAD( "rom9.u5", 0x80000, 0x20000, CRC(07d16ca1) SHA1(caecf98284236af0e1f77566a9c6950491d0902a) )
+ ROM_LOAD( "rom8.u6", 0xa0000, 0x20000, CRC(4e244c8a) SHA1(6808b2b195601e8041a12fff4b77e487efba015e) )
+ ROM_LOAD( "rom7.u7", 0xc0000, 0x20000, CRC(23eb84dd) SHA1(ad1d359ba59087a5e786d262194cfe7db9bb0000) )
+ ROM_LOAD( "rom6.u8", 0xe0000, 0x20000, CRC(c34bee64) SHA1(2da2dc6e6615ccc2e3e7ca0ceb735a347923a728) )
ROM_REGION( 0x00220, "proms", 0 )
- ROM_LOAD( "82s129.u10", 0x00000, 0x00100,CRC(e91a1f9e) SHA1(a293023ebe96a5438e89457a98d94beb6dad5418) )
- ROM_LOAD( "82s129.u9", 0x00100, 0x00100,CRC(1cc09f6f) SHA1(35c857e0f3df0dcceec963459978e779e94f76f6) )
- ROM_LOAD( "82s123.u79", 0x00200, 0x00020,CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) )
+ ROM_LOAD( "82s129.u10", 0x00000, 0x00100, CRC(e91a1f9e) SHA1(a293023ebe96a5438e89457a98d94beb6dad5418) )
+ ROM_LOAD( "82s129.u9", 0x00100, 0x00100, CRC(1cc09f6f) SHA1(35c857e0f3df0dcceec963459978e779e94f76f6) )
+ ROM_LOAD( "82s123.u79", 0x00200, 0x00020, CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) )
ROM_END
-GAME( 1990, pipeline, 0, pipeline, pipeline, pipeline_state, empty_init, ROT0, "Daehyun Electronics", "Pipeline", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )
+} // Anonymous namespace
+
+
+GAME( 1990, pipeline, 0, pipeline, pipeline, pipeline_state, empty_init, ROT0, "Daehyun Electronics", "Pipeline", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/play_1.cpp b/src/mame/drivers/play_1.cpp
index 6861e4b9235..1d537309231 100644
--- a/src/mame/drivers/play_1.cpp
+++ b/src/mame/drivers/play_1.cpp
@@ -30,6 +30,8 @@ Others: When starting the game, hold down X, then release and hit Z, otherwise
#include "play_1.lh"
+namespace {
+
class play_1_state : public genpin_class
{
public:
@@ -39,11 +41,17 @@ public:
, m_dips(*this, "X.%u", 0)
, m_monotone(*this, "monotone")
, m_digits(*this, "digit%u", 0U)
+ , m_leds(*this, "led%u", 1U)
+ , m_player_lamps(*this, "text%u", 1U)
{ }
void chance(machine_config &config);
void play_1(machine_config &config);
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
private:
uint8_t port07_r();
void port01_w(uint8_t data);
@@ -69,12 +77,12 @@ private:
uint8_t m_segment;
uint8_t m_match;
uint8_t m_ball;
- virtual void machine_reset() override;
- virtual void machine_start() override { m_digits.resolve(); }
required_device<cosmac_device> m_maincpu;
required_ioport_array<4> m_dips;
required_device<clock_device> m_monotone;
output_finder<46> m_digits;
+ output_finder<5> m_leds;
+ output_finder<4> m_player_lamps;
};
void play_1_state::play_1_map(address_map &map)
@@ -254,6 +262,13 @@ static INPUT_PORTS_START( spcgambl )
INPUT_PORTS_END
+void play_1_state::machine_start()
+{
+ m_digits.resolve();
+ m_leds.resolve();
+ m_player_lamps.resolve();
+}
+
void play_1_state::machine_reset()
{
m_waitcnt = 0xffff;
@@ -337,13 +352,9 @@ void play_1_state::port03_w(uint8_t data)
// display player number
{
- char wordnum[8];
uint8_t player = m_segment >> 5;
for (uint8_t i = 1; i < 5; i++)
- {
- sprintf(wordnum,"text%d", i);
- output().set_value(wordnum, (player == i) ? 0:1);
- }
+ m_player_lamps[i - 1] = (player == i) ? 0 : 1;
}
break;
case 2:
@@ -461,11 +472,11 @@ WRITE_LINE_MEMBER( play_1_state::clock_w )
else
{
m_digits[43] = m_match;
- output().set_value("led1", !BIT(m_ball, 1));
- output().set_value("led2", !BIT(m_ball, 2));
- output().set_value("led3", !BIT(m_ball, 3));
- output().set_value("led4", !BIT(m_ball, 4));
- output().set_value("led5", !BIT(m_ball, 5));
+ m_leds[0] = !BIT(m_ball, 1);
+ m_leds[1] = !BIT(m_ball, 2);
+ m_leds[2] = !BIT(m_ball, 3);
+ m_leds[3] = !BIT(m_ball, 4);
+ m_leds[4] = !BIT(m_ball, 5);
}
}
}
@@ -568,6 +579,8 @@ ROM_START(ngtfever)
ROM_LOAD("nfeverb.bin", 0x0400, 0x0400, CRC(5e2ba9c0) SHA1(abd285aa5702c7fb84257b4341f64ff83c1fc0ce))
ROM_END
+} // anonymous namespace
+
/* Big Town, Last Lap, Night Fever, Party and Third World all reportedly share the same roms with different playfield/machine artworks */
GAME(1978, bigtown, 0, play_1, play_1, play_1_state, empty_init, ROT0, "Playmatic", "Big Town", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/pokemini.cpp b/src/mame/drivers/pokemini.cpp
index f2b8aedd4c5..6a3009c27fc 100644
--- a/src/mame/drivers/pokemini.cpp
+++ b/src/mame/drivers/pokemini.cpp
@@ -1516,14 +1516,14 @@ DEVICE_IMAGE_LOAD_MEMBER( pokemini_state::cart_load )
/* Verify that the image is big enough */
if (size <= 0x2100)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid ROM image: ROM image is too small");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid ROM image: ROM image is too small");
return image_init_result::FAIL;
}
/* Verify that the image is not too big */
if (size > 0x1fffff)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid ROM image: ROM image is too big");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid ROM image: ROM image is too big");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/ppmast93.cpp b/src/mame/drivers/ppmast93.cpp
index 4e2f2d69fff..d60e379300d 100644
--- a/src/mame/drivers/ppmast93.cpp
+++ b/src/mame/drivers/ppmast93.cpp
@@ -142,6 +142,8 @@ Dip locations added based on the notes above.
#include "tilemap.h"
+namespace {
+
class ppmast93_state : public driver_device
{
public:
@@ -150,17 +152,23 @@ public:
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_bgram(*this, "bgram"),
- m_fgram(*this, "fgram")
+ m_fgram(*this, "fgram"),
+ m_cpubank(*this, "cpubank")
{ }
void ppmast93(machine_config &config);
+protected:
+ virtual void machine_start() override;
+ virtual void video_start() override;
+
private:
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_shared_ptr<uint8_t> m_bgram;
required_shared_ptr<uint8_t> m_fgram;
+ required_memory_bank m_cpubank;
tilemap_t *m_fg_tilemap;
tilemap_t *m_bg_tilemap;
@@ -172,32 +180,29 @@ private:
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
- virtual void machine_start() override;
- virtual void video_start() override;
-
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void ppmast93_cpu1_io(address_map &map);
- void ppmast93_cpu1_map(address_map &map);
- void ppmast93_cpu2_io(address_map &map);
- void ppmast93_cpu2_map(address_map &map);
+ void cpu1_io(address_map &map);
+ void cpu1_map(address_map &map);
+ void cpu2_io(address_map &map);
+ void cpu2_map(address_map &map);
};
void ppmast93_state::machine_start()
{
- membank("cpubank")->configure_entries(0, 8, memregion("maincpu")->base(), 0x4000);
+ m_cpubank->configure_entries(0, 8, memregion("maincpu")->base(), 0x4000);
}
void ppmast93_state::fgram_w(offs_t offset, uint8_t data)
{
m_fgram[offset] = data;
- m_fg_tilemap->mark_tile_dirty(offset/2);
+ m_fg_tilemap->mark_tile_dirty(offset / 2);
}
void ppmast93_state::bgram_w(offs_t offset, uint8_t data)
{
m_bgram[offset] = data;
- m_bg_tilemap->mark_tile_dirty(offset/2);
+ m_bg_tilemap->mark_tile_dirty(offset / 2);
}
void ppmast93_state::port4_w(uint8_t data)
@@ -205,20 +210,20 @@ void ppmast93_state::port4_w(uint8_t data)
machine().bookkeeping().coin_counter_w(0, data & 0x08);
machine().bookkeeping().coin_counter_w(1, data & 0x10);
- membank("cpubank")->set_entry(data & 0x07);
+ m_cpubank->set_entry(data & 0x07);
}
-void ppmast93_state::ppmast93_cpu1_map(address_map &map)
+void ppmast93_state::cpu1_map(address_map &map)
{
map(0x0000, 0x7fff).rom().nopw();
- map(0x8000, 0xbfff).bankr("cpubank");
- map(0xd000, 0xd7ff).ram().w(FUNC(ppmast93_state::bgram_w)).share("bgram");
+ map(0x8000, 0xbfff).bankr(m_cpubank);
+ map(0xd000, 0xd7ff).ram().w(FUNC(ppmast93_state::bgram_w)).share(m_bgram);
map(0xd800, 0xdfff).nopw();
- map(0xf000, 0xf7ff).ram().w(FUNC(ppmast93_state::fgram_w)).share("fgram");
+ map(0xf000, 0xf7ff).ram().w(FUNC(ppmast93_state::fgram_w)).share(m_fgram);
map(0xf800, 0xffff).ram();
}
-void ppmast93_state::ppmast93_cpu1_io(address_map &map)
+void ppmast93_state::cpu1_io(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).portr("P1").w("soundlatch", FUNC(generic_latch_8_device::write));
@@ -228,16 +233,16 @@ void ppmast93_state::ppmast93_cpu1_io(address_map &map)
map(0x08, 0x08).portr("DSW2");
}
-void ppmast93_state::ppmast93_cpu2_map(address_map &map)
+void ppmast93_state::cpu2_map(address_map &map)
{
- map(0x0000, 0xfbff).rom().region("sub", 0x10000);
+ map(0x0000, 0xfbff).rom().region("sub", 0x00000);
map(0xfc00, 0xfc00).r("soundlatch", FUNC(generic_latch_8_device::read));
map(0xfd00, 0xffff).ram();
}
-void ppmast93_state::ppmast93_cpu2_io(address_map &map)
+void ppmast93_state::cpu2_io(address_map &map)
{
- map(0x0000, 0xffff).rom().region("sub", 0x20000);
+ map(0x0000, 0xffff).rom().region("sub", 0x10000);
map(0x0000, 0x0001).mirror(0xff00).w("ymsnd", FUNC(ym2413_device::write));
map(0x0002, 0x0002).mirror(0xff00).w("dac", FUNC(dac_byte_interface::data_w));
}
@@ -337,12 +342,12 @@ static const gfx_layout tiles8x8_layout =
};
static GFXDECODE_START( gfx_ppmast93 )
- GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0, 16 )
+ GFXDECODE_ENTRY( "tiles", 0, tiles8x8_layout, 0, 16 )
GFXDECODE_END
TILE_GET_INFO_MEMBER(ppmast93_state::get_bg_tile_info)
{
- int code = (m_bgram[tile_index*2+1] << 8) | m_bgram[tile_index*2];
+ int code = (m_bgram[tile_index * 2 + 1] << 8) | m_bgram[tile_index * 2];
tileinfo.set(0,
code & 0x0fff,
(code & 0xf000) >> 12,
@@ -351,9 +356,9 @@ TILE_GET_INFO_MEMBER(ppmast93_state::get_bg_tile_info)
TILE_GET_INFO_MEMBER(ppmast93_state::get_fg_tile_info)
{
- int code = (m_fgram[tile_index*2+1] << 8) | m_fgram[tile_index*2];
+ int code = (m_fgram[tile_index * 2 + 1] << 8) | m_fgram[tile_index * 2];
tileinfo.set(0,
- (code & 0x0fff)+0x1000,
+ (code & 0x0fff) + 0x1000,
(code & 0xf000) >> 12,
0);
}
@@ -375,23 +380,23 @@ uint32_t ppmast93_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
void ppmast93_state::ppmast93(machine_config &config)
{
- /* basic machine hardware */
- Z80(config, m_maincpu, 5000000); /* 5 MHz */
- m_maincpu->set_addrmap(AS_PROGRAM, &ppmast93_state::ppmast93_cpu1_map);
- m_maincpu->set_addrmap(AS_IO, &ppmast93_state::ppmast93_cpu1_io);
+ // basic machine hardware
+ Z80(config, m_maincpu, 5_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ppmast93_state::cpu1_map);
+ m_maincpu->set_addrmap(AS_IO, &ppmast93_state::cpu1_io);
m_maincpu->set_vblank_int("screen", FUNC(ppmast93_state::irq0_line_hold));
- z80_device &sub(Z80(config, "sub", 5000000)); /* 5 MHz */
- sub.set_addrmap(AS_PROGRAM, &ppmast93_state::ppmast93_cpu2_map);
- sub.set_addrmap(AS_IO, &ppmast93_state::ppmast93_cpu2_io);
+ z80_device &sub(Z80(config, "sub", 5_MHz_XTAL));
+ sub.set_addrmap(AS_PROGRAM, &ppmast93_state::cpu2_map);
+ sub.set_addrmap(AS_IO, &ppmast93_state::cpu2_io);
sub.set_periodic_int(FUNC(ppmast93_state::irq0_line_hold), attotime::from_hz(8000));
- /* video hardware */
+ // video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(55);
screen.set_vblank_time(subseconds::from_usec(0));
screen.set_size(256, 256);
- screen.set_visarea(0, 256-1, 0, 256-1);
+ screen.set_visarea_full();
screen.set_screen_update(FUNC(ppmast93_state::screen_update));
screen.set_palette("palette");
@@ -399,12 +404,12 @@ void ppmast93_state::ppmast93(machine_config &config)
PALETTE(config, "palette", palette_device::RGB_444_PROMS, "proms", 0x100);
-
+ // sound hardware
SPEAKER(config, "speaker").front_center();
GENERIC_LATCH_8(config, "soundlatch");
- YM2413(config, "ymsnd", 5000000/2).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ YM2413(config, "ymsnd", 5_MHz_XTAL / 2).add_route(ALL_OUTPUTS, "speaker", 1.0);
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.3); // unknown DAC
}
@@ -413,10 +418,10 @@ ROM_START( ppmast93 )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "2.up7", 0x00000, 0x20000, CRC(8854d8db) SHA1(9d93ddfb44d533772af6519747a6cb50b42065cd) )
- ROM_REGION( 0x30000, "sub", 0 )
- ROM_LOAD( "1.ue7", 0x10000, 0x20000, CRC(8e26939e) SHA1(e62441e523f5be6a3889064cc5e0f44545260e93) )
+ ROM_REGION( 0x20000, "sub", 0 )
+ ROM_LOAD( "1.ue7", 0x00000, 0x20000, CRC(8e26939e) SHA1(e62441e523f5be6a3889064cc5e0f44545260e93) )
- ROM_REGION( 0x40000, "gfx1", 0 )
+ ROM_REGION( 0x40000, "tiles", 0 )
ROM_LOAD( "3.ug16", 0x00000, 0x20000, CRC(8ab24641) SHA1(c0ebee90bf3fe208947ae5ea56f31469ed24d198) )
ROM_LOAD( "4.ug15", 0x20000, 0x20000, CRC(b16e9fb6) SHA1(53aa962c63319cd649e0c8cf0c26e2308598e1aa) )
@@ -426,4 +431,7 @@ ROM_START( ppmast93 )
ROM_LOAD( "prom1.ug26", 0x200, 0x100, CRC(d979c64e) SHA1(172c9579013d58e35a5b4f732e360811ac36295e) )
ROM_END
+} // Anonymous namespace
+
+
GAME( 1993, ppmast93, 0, ppmast93, ppmast93, ppmast93_state, empty_init, ROT0, "Electronic Devices S.R.L.", "Ping Pong Masters '93", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/pv1000.cpp b/src/mame/drivers/pv1000.cpp
index 2a5d3d2a29b..80985108b06 100644
--- a/src/mame/drivers/pv1000.cpp
+++ b/src/mame/drivers/pv1000.cpp
@@ -307,7 +307,7 @@ DEVICE_IMAGE_LOAD_MEMBER( pv1000_state::cart_load )
if (size != 0x2000 && size != 0x4000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/pv2000.cpp b/src/mame/drivers/pv2000.cpp
index d3080bfffc3..eefb89a8b02 100644
--- a/src/mame/drivers/pv2000.cpp
+++ b/src/mame/drivers/pv2000.cpp
@@ -373,7 +373,7 @@ DEVICE_IMAGE_LOAD_MEMBER( pv2000_state::cart_load )
if (size != 0x2000 && size != 0x4000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/pwp14.cpp b/src/mame/drivers/pwp14.cpp
index a9b2da9ffef..0d1a35abbe6 100644
--- a/src/mame/drivers/pwp14.cpp
+++ b/src/mame/drivers/pwp14.cpp
@@ -7,17 +7,17 @@
08/08/2021 Skeleton driver.
- https://twitter.com/FozzTexx/status/1424043157264617478
+ https://twitter.com/FozzTexx/status/1424043157264617478
- XTAL : 7.938 MHz
+ XTAL : 7.938 MHz
14.364 MHz
- 6.000 MHz
-
- FDC - WD2793A
- 2 * AM9128 (2048x8 SRAM)
- NEC D4364 (8192x8 SRAM)
- 2 * MT4067-12 (64Kx4 DRAM)
- CRT5037 - SMC 8621
+ 6.000 MHz
+
+ FDC - WD2793A
+ 2 * AM9128 (2048x8 SRAM)
+ NEC D4364 (8192x8 SRAM)
+ 2 * MT4067-12 (64Kx4 DRAM)
+ CRT5037 - SMC 8621
****************************************************************************/
@@ -57,7 +57,7 @@ private:
virtual void machine_reset() override;
virtual void machine_start() override;
uint32_t screen_update_pwp14(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
-
+
void pwp14_io(address_map &map);
void pwp14_mem(address_map &map);
void bankswitch_w(offs_t offset, uint8_t data);
@@ -74,7 +74,7 @@ private:
required_region_ptr<u8> m_rom;
required_device<crt5037_device> m_crtc;
required_device<palette_device> m_palette;
- required_region_ptr<uint8_t> m_chargen;
+ required_region_ptr<uint8_t> m_chargen;
required_device<wd2793_device> m_fdc;
uint8_t m_bank_reg;
};
@@ -183,7 +183,7 @@ uint32_t pwp14_state::screen_update_pwp14(screen_device &screen, bitmap_ind16 &b
uint8_t data = m_chargen[(chr << 3) | ra];
//if (cursor.contains(x * 8, y * 8))
- // data ^= 0xff;
+ // data ^= 0xff;
// draw 8 pixels of the char
for (int i = 0; i < 8; i++)
diff --git a/src/mame/drivers/r2dx_v33.cpp b/src/mame/drivers/r2dx_v33.cpp
index c9073b33bf2..1ba4567ab70 100644
--- a/src/mame/drivers/r2dx_v33.cpp
+++ b/src/mame/drivers/r2dx_v33.cpp
@@ -1082,6 +1082,7 @@ GAME( 1997, nzeroteama, zeroteam, nzerotea, nzerotea, r2dx_v33_state, init_nzer
// 'V33 SYSTEM TYPE_C' - uses V33 CPU, basically the same board as TYPE_C VER2
// there is a version of New Zero Team on "V33 SYSTEM TYPE_C" board with EEPROM rather than dipswitches like Zero Team 2000
+// 1998 release of New Zero team on this hardware also exists, but not dumped: https://youtu.be/8mnFjXCc9BI
// 'V33 SYSTEM TYPE_C VER2' - uses V33 CPU, COPX-D3 external protection rom, but still has the proper sound system, unencrypted sprites, EEPROM for settings. PCB also seen without 'VER2', looks the same
GAME( 2000, zerotm2k, zeroteam, zerotm2k, zerotm2k, r2dx_v33_state, init_zerotm2k, ROT0, "Seibu Kaihatsu", "Zero Team 2000", MACHINE_SUPPORTS_SAVE)
diff --git a/src/mame/drivers/ravens.cpp b/src/mame/drivers/ravens.cpp
index a557347644a..41171b74b79 100644
--- a/src/mame/drivers/ravens.cpp
+++ b/src/mame/drivers/ravens.cpp
@@ -322,12 +322,12 @@ QUICKLOAD_LOAD_MEMBER(ravens_base::quickload_cb)
quick_length = image.length();
if (quick_length < 0x0900)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ image.seterror(image_error::INVALIDIMAGE, "File too short");
image.message(" File too short");
}
else if (quick_length > 0x8000)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too long");
+ image.seterror(image_error::INVALIDIMAGE, "File too long");
image.message(" File too long");
}
else
@@ -336,12 +336,12 @@ QUICKLOAD_LOAD_MEMBER(ravens_base::quickload_cb)
read_ = image.fread( &quick_data[0], quick_length);
if (read_ != quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Cannot read the file");
+ image.seterror(image_error::INVALIDIMAGE, "Cannot read the file");
image.message(" Cannot read the file");
}
else if (quick_data[0] != 0xc6)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid header");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid header");
image.message(" Invalid header");
}
else
@@ -350,7 +350,7 @@ QUICKLOAD_LOAD_MEMBER(ravens_base::quickload_cb)
if (exec_addr >= quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Exec address beyond end of file");
+ image.seterror(image_error::INVALIDIMAGE, "Exec address beyond end of file");
image.message(" Exec address beyond end of file");
}
else
diff --git a/src/mame/drivers/redalert.cpp b/src/mame/drivers/redalert.cpp
index 01771bcae83..249d7cb7427 100644
--- a/src/mame/drivers/redalert.cpp
+++ b/src/mame/drivers/redalert.cpp
@@ -113,8 +113,10 @@
****************************************************************************/
#include "emu.h"
-#include "cpu/m6502/m6502.h"
#include "includes/redalert.h"
+#include "audio/redalert.h"
+
+#include "cpu/m6502/m6502.h"
#define MAIN_PCB_CLOCK (XTAL(12'500'000))
@@ -180,10 +182,10 @@ void redalert_state::redalert_main_map(address_map &map)
map(0xc000, 0xc000).mirror(0x0f8f).portr("DSW").nopw();
map(0xc010, 0xc010).mirror(0x0f8f).portr("KEY1").nopw();
map(0xc020, 0xc020).mirror(0x0f8f).portr("KEY2").nopw();
- map(0xc030, 0xc030).mirror(0x0f8f).nopr().w(FUNC(redalert_state::redalert_audio_command_w));
+ map(0xc030, 0xc030).mirror(0x0f8f).nopr().w("soundboard", FUNC(irem_m37b_ue17b_audio_device::audio_command_w));
map(0xc040, 0xc040).mirror(0x0f8f).nopr().writeonly().share("video_control");
map(0xc050, 0xc050).mirror(0x0f8f).nopr().writeonly().share("bitmap_color");
- map(0xc060, 0xc060).mirror(0x0f8f).nopr().w(FUNC(redalert_state::redalert_voice_command_w));
+ map(0xc060, 0xc060).mirror(0x0f8f).nopr().w("soundboard", FUNC(irem_m37b_ue17b_audio_device::voice_command_w));
map(0xc070, 0xc070).mirror(0x0f8f).rw(FUNC(redalert_state::redalert_interrupt_clear_r), FUNC(redalert_state::redalert_interrupt_clear_w));
map(0xf000, 0xffff).rom().region("maincpu", 0x8000);
}
@@ -197,7 +199,7 @@ void redalert_state::ww3_main_map(address_map &map)
map(0xc000, 0xc000).mirror(0x0f8f).portr("DSW").nopw();
map(0xc010, 0xc010).mirror(0x0f8f).portr("KEY1").nopw();
map(0xc020, 0xc020).mirror(0x0f8f).portr("KEY2").nopw();
- map(0xc030, 0xc030).mirror(0x0f8f).nopr().w(FUNC(redalert_state::redalert_audio_command_w));
+ map(0xc030, 0xc030).mirror(0x0f8f).nopr().w("soundboard", FUNC(irem_m37b_ue17b_audio_device::audio_command_w));
map(0xc040, 0xc040).mirror(0x0f8f).nopr().writeonly().share("video_control");
map(0xc050, 0xc050).mirror(0x0f8f).nopr().writeonly().share("bitmap_color");
map(0xc070, 0xc070).mirror(0x0f8f).rw(FUNC(redalert_state::redalert_interrupt_clear_r), FUNC(redalert_state::redalert_interrupt_clear_w));
@@ -213,7 +215,7 @@ void redalert_state::panther_main_map(address_map &map)
map(0xc000, 0xc000).mirror(0x0f8f).portr("DSW").nopw();
map(0xc010, 0xc010).mirror(0x0f8f).portr("KEY1").nopw();
map(0xc020, 0xc020).mirror(0x0f8f).portr("KEY2").nopw();
- map(0xc030, 0xc030).mirror(0x0f8f).nopr().w(FUNC(redalert_state::redalert_audio_command_w));
+ map(0xc030, 0xc030).mirror(0x0f8f).nopr().w("soundboard", FUNC(panther_audio_device::audio_command_w));
map(0xc040, 0xc040).mirror(0x0f8f).nopr().writeonly().share("video_control");
map(0xc050, 0xc050).mirror(0x0f8f).nopr().writeonly().share("bitmap_color");
map(0xc070, 0xc070).mirror(0x0f8f).rw(FUNC(redalert_state::panther_interrupt_clear_r), FUNC(redalert_state::redalert_interrupt_clear_w));
@@ -229,7 +231,7 @@ void redalert_state::demoneye_main_map(address_map &map)
map(0xc000, 0xc000).mirror(0x0f8f).portr("DSW").nopw();
map(0xc010, 0xc010).mirror(0x0f8f).portr("KEY1").nopw();
map(0xc020, 0xc020).mirror(0x0f8f).portr("KEY2").nopw();
- map(0xc030, 0xc030).mirror(0x0f8f).nopr().w(FUNC(redalert_state::demoneye_audio_command_w));
+ map(0xc030, 0xc030).mirror(0x0f8f).nopr().w("soundboard", FUNC(demoneye_audio_device::audio_command_w));
map(0xc040, 0xc040).mirror(0x0f8f).nopr().writeonly().share("video_control");
map(0xc050, 0xc050).mirror(0x0f8f).nopr().writeonly().share("bitmap_color");
map(0xc060, 0xc063).mirror(0x0f80).w(FUNC(redalert_state::demoneye_bitmap_layer_w));
@@ -251,13 +253,6 @@ INPUT_CHANGED_MEMBER(redalert_state::coin_inserted)
m_maincpu->set_input_line(INPUT_LINE_NMI, newval ? CLEAR_LINE : ASSERT_LINE);
}
-CUSTOM_INPUT_MEMBER(redalert_state::sound_status_r)
-{
- // communication handshake between host and sound CPU
- // at least Panther uses it, unconfirmed for Red Alert and Demoneye-X
- return m_sound_hs;
-}
-
static INPUT_PORTS_START( m27_base )
// port names comes from Panther input test
PORT_START("COIN")
@@ -278,7 +273,7 @@ static INPUT_PORTS_START( m27_base )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* Meter */
PORT_START("KEY2")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(redalert_state, sound_status_r)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_DEVICE_MEMBER("soundboard", irem_m37b_audio_device, sound_status_r)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* Meter */
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL
// TODO: 2-way/4-way ...?
@@ -358,6 +353,9 @@ INPUT_PORTS_END
static INPUT_PORTS_START( demoneye )
PORT_INCLUDE( m27_base )
+ PORT_MODIFY("KEY2")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // audio status for panther
+
PORT_START("DSW")
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) )
PORT_DIPSETTING( 0x00, "3" )
@@ -402,7 +400,7 @@ void redalert_state::redalert(machine_config &config)
redalert_video(config);
/* audio hardware */
- redalert_audio(config);
+ IREM_M37B_UE17B_AUDIO(config, "soundboard");
}
void redalert_state::ww3(machine_config &config)
@@ -416,7 +414,7 @@ void redalert_state::ww3(machine_config &config)
ww3_video(config);
/* audio hardware */
- ww3_audio(config);
+ IREM_M37B_AUDIO(config, "soundboard");
}
void redalert_state::panther(machine_config &config)
@@ -430,7 +428,7 @@ void redalert_state::panther(machine_config &config)
panther_video(config);
/* audio hardware */
- panther_audio(config);
+ PANTHER_AUDIO(config, "soundboard");
}
void redalert_state::demoneye(machine_config &config)
@@ -444,7 +442,7 @@ void redalert_state::demoneye(machine_config &config)
demoneye_video(config);
/* audio hardware */
- demoneye_audio(config);
+ DEMONEYE_AUDIO(config, "soundboard");
}
@@ -467,7 +465,7 @@ ROM_START( panther )
ROM_LOAD( "qr-6.bin", 0xa800, 0x0800, BAD_DUMP CRC(02fbd9d9) SHA1(65b5875c78886b51c9bdfc75e730b9f67ce72cfc) )
ROM_LOAD( "qr-7.bin", 0xb000, 0x0800, BAD_DUMP CRC(b3e2d6cc) SHA1(7bb18f17d635196e617e8f68bf8d866134c362d1) )
- ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_REGION( 0x10000, "soundboard:audiocpu", 0 )
ROM_LOAD( "q7a.bin", 0x7000, 0x0800, CRC(febd1674) SHA1(e122d0855ab6a352d741f9013c20ec31e0068248) )
ROM_REGION( 0x0200, "proms", 0 ) /* color PROM */
@@ -485,7 +483,7 @@ ROM_START( ww3 )
ROM_LOAD( "w3ia.3c", 0xa000, 0x1000, CRC(dccb8605) SHA1(f4c5e1a5de0828c5e39f37e2bf10f4f60bef856a) )
ROM_LOAD( "w3ib.3a", 0xb000, 0x1000, CRC(3658e465) SHA1(2c910b2e9d689cb577d8a63bc4d07d0770a6de68) )
- ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_REGION( 0x10000, "soundboard:audiocpu", 0 )
ROM_LOAD( "w3s1", 0x7000, 0x0800, CRC(4af956a5) SHA1(25368a40d7ebc60316fd2d78ec4c686e701b96dc) )
ROM_REGION( 0x0200, "proms", 0 ) /* color PROM */
@@ -502,10 +500,10 @@ ROM_START( redalert )
ROM_LOAD( "ragab", 0xa000, 0x1000, CRC(ab99f5ed) SHA1(a93713bb03d61cce64adc89b874b67adea7c53cd) )
ROM_LOAD( "ragb", 0xb000, 0x1000, CRC(8e0d1661) SHA1(bff4ddca761ddd70113490f50777e62c66813685) )
- ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_REGION( 0x10000, "soundboard:audiocpu", 0 )
ROM_LOAD( "w3s1", 0x7000, 0x0800, CRC(4af956a5) SHA1(25368a40d7ebc60316fd2d78ec4c686e701b96dc) )
- ROM_REGION( 0x10000, "voice", 0 )
+ ROM_REGION( 0x10000, "soundboard:voice", 0 )
ROM_LOAD( "ras1b", 0x0000, 0x1000, CRC(ec690845) SHA1(26a84738bd45ed21dac6c8383ebd9c3b9831024a) )
ROM_LOAD( "ras2", 0x1000, 0x1000, CRC(fae94cfc) SHA1(2fd798706bb3afda3fb55bc877e597cc4e5d0c15) )
ROM_LOAD( "ras3", 0x2000, 0x1000, CRC(20d56f3e) SHA1(5c32ee3365407e6d3f7ab5662e9ecbac437ed4cb) )
@@ -525,7 +523,7 @@ ROM_START( demoneye )
ROM_LOAD( "demoneye.a", 0xa000, 0x1000, CRC(a27d08aa) SHA1(659ad22778e852fc58f3951d62bc01151c973d36) )
ROM_LOAD( "demoneye.b", 0xb000, 0x1000, CRC(1fd3585b) SHA1(b1697b7b21b739499fda1e155530dbfab89f3358) )
- ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_REGION( 0x10000, "soundboard:audiocpu", 0 )
ROM_LOAD( "demoneye.7s", 0x2000, 0x1000, CRC(8fdc9364) SHA1(3fccb5b22f08d6a0cde85863c1ce5399c84f233e) )
ROM_LOAD( "demoneye.6s", 0x3000, 0x1000, CRC(0a23def9) SHA1(b52f52be312ec7810e3c9cbd3913e887f983b1ee) )
@@ -544,7 +542,7 @@ ROM_END
*
*************************************/
-GAME( 1981, panther, 0, panther, panther, redalert_state, empty_init, ROT270, "Irem", "Panther (bootleg?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1981, redalert, 0, redalert, redalert, redalert_state, empty_init, ROT270, "Irem (GDI license)", "Red Alert", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1981, ww3, redalert, ww3, redalert, redalert_state, empty_init, ROT270, "Irem", "WW III", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1981, demoneye, 0, demoneye, demoneye, redalert_state, empty_init, ROT270, "Irem", "Demoneye-X", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1981, panther, 0, panther, panther, redalert_state, empty_init, ROT270, "Irem", "Panther (bootleg?)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, redalert, 0, redalert, redalert, redalert_state, empty_init, ROT270, "Irem (GDI license)", "Red Alert", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, ww3, redalert, ww3, redalert, redalert_state, empty_init, ROT270, "Irem", "WW III", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, demoneye, 0, demoneye, demoneye, redalert_state, empty_init, ROT270, "Irem", "Demoneye-X", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/rfslotsmcs48.cpp b/src/mame/drivers/rfslotsmcs48.cpp
index 235ac52ccc4..637260c9241 100644
--- a/src/mame/drivers/rfslotsmcs48.cpp
+++ b/src/mame/drivers/rfslotsmcs48.cpp
@@ -11,7 +11,7 @@
| |4xDSW| ·|
| ·|
| ___________ ___________ ___________ ___________ ___________ ___________ ·|
-| | SN74154N | | D8245C | | D8245C | | D8245C | | D8245C | | D8245C | ·|
+| | SN74154N | | D8243C | | D8243C | | D8243C | | D8243C | | D8243C | ·|
| |__________| |__________| |__________| |__________| |__________| |__________| ·|
| ·|
| XTAL |
@@ -19,11 +19,11 @@
| |LM380N| CD4051BCN |6xDSW| 74LS00PC |7402PC| | Intel P8035L | __|
| |_______________| |·||
| ___________ ___________ |·||
-| ________________ |55101L-1PC| |55101L-1PC| ___________ ___________ |·||
+| ________________ |S5101L-1PC| |S5101L-1PC| ___________ ___________ |·||
| | Intel D8748 | | EPROM | | AMD P8212 | |_||
| |_______________| ___________ ___________ |___________| |___________| |
-| XTAL |55101L-1PC| |55101L-1PC| ·|
-| 4.0000 MHz ·|
+| XTAL |S5101L-1PC| |S5101L-1PC| ·|
+| 4.0000 MHz LED-> O ·|
| ·|
| RF-3115 ·|
| BATTERY ·|
@@ -33,6 +33,8 @@
#include "emu.h"
#include "cpu/mcs48/mcs48.h"
+#include "machine/i8212.h"
+#include "sound/ay8910.h"
#include "speaker.h"
namespace
@@ -45,14 +47,21 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_audiocpu(*this, "audiocpu")
+ , m_audiosubcpu(*this, "audiosubcpu")
+ , m_aysnd1(*this, "aysnd1")
+ , m_aysnd2(*this, "aysnd2")
{
}
void ajofrin(machine_config &config);
+ void babyfrts(machine_config &config);
protected:
required_device<i8035_device> m_maincpu;
- required_device<i8748_device> m_audiocpu;
+ optional_device<i8748_device> m_audiocpu;
+ optional_device<i8035_device> m_audiosubcpu;
+ optional_device<ay8910_device> m_aysnd1;
+ optional_device<ay8910_device> m_aysnd2;
};
INPUT_PORTS_START(ajofrin)
@@ -64,19 +73,89 @@ void rfslotsmcs48_state::ajofrin(machine_config &config)
I8748(config, m_audiocpu, 4_MHz_XTAL);
+ I8212(config, "i8212");
+
SPEAKER(config, "mono").front_center();
}
-// Found just one PCB, probably missing some more boards (sound, I/O, etc.)
+void rfslotsmcs48_state::babyfrts(machine_config &config)
+{
+ // Main PCB
+
+ I8035(config, m_maincpu, 6_MHz_XTAL);
+
+ I8212(config, "i8212");
+
+ // Audio PCB
+
+ I8035(config, m_audiosubcpu, 6_MHz_XTAL);
+
+ I8212(config, "i8212_2");
+
+ SPEAKER(config, "mono").front_center();
+
+ AY8910(config, m_aysnd1, 6_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "mono", 0.50); // Divider unknown
+ AY8910(config, m_aysnd2, 6_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "mono", 0.50); // Divider unknown
+}
+
+// Found just one PCB, may be missing some more boards (extra sound, I/O, etc.)
ROM_START(ajofrin)
ROM_REGION(0x1000, "maincpu", 0)
ROM_LOAD("ajofr_90percent_4k.bin", 0x0000, 0x1000, CRC(9e1fd7fe) SHA1(e7a5a2a10d17537edb039ac0f53358ee35465c90))
- ROM_REGION(0x400, "audiocpu", 0)
- ROM_LOAD( "ajo_d8748.bin", 0x000, 0x400, CRC(414dc0e3) SHA1(016ed2aa36b36a637163ac7cba0a944a258c02a4))
+ ROM_REGION(0x0400, "audiocpu", 0)
+ ROM_LOAD( "ajo_d8748.bin", 0x0000, 0x0400, CRC(414dc0e3) SHA1(016ed2aa36b36a637163ac7cba0a944a258c02a4))
+ROM_END
+
+/* It's an upgrade from "babyfrts25" for accepting 100 pts coins instead of just 25 pts ones.
+ Standard RF-3115 PCB but:
+ -Two S5101 static RAM chips (instead of 4, two empty sockets)
+ -Four NEC D8243C (instead of 5, one empty socket in the middle).
+ -No D8748 (the socket is empty), uses an external PCB (RF 53/3131) for sound with this layout:
+ ___________________________________
+ | __________________________ |
+ | |·························| |
+ | Xtal |
+ | 6.000 MHz |
+ | _____________________ |
+ | _______ | AM8035PC | |
+ | DM7486N |____________________| |
+ | |
+ | ____________ ____________ |
+ | |Intel D8212| |2532 EPROM | |
+ | |___________| |___________| |
+ | |
+ | _____________________ |
+ | | GI AY-3-8910 | |
+ | |____________________| |
+ | _____________________ |
+ | | GI AY-3-8910 | |
+ | |____________________| |
+ | _______ |
+ | |· · · ·| |
+ |__________________________________|
+
+*/
+ROM_START(babyfrts)
+ ROM_REGION(0x1000, "maincpu", 0)
+ ROM_LOAD("bbr_cpu_100pts.bin", 0x0000, 0x1000, CRC(22c47a4d) SHA1(051c82b20a823047119a6d5460c07df601e44a2e))
+
+ ROM_REGION(0x1000, "audiocpu", 0)
+ ROM_LOAD( "bbs_100pts_sonido.bin", 0x0000, 0x1000, CRC(c84e20d3) SHA1(ab9457d3877a10bc54485a4954ef5b4d006ed3be))
+ROM_END
+
+// Same PCBs configuration as "babyfrts"
+ROM_START(babyfrts25)
+ ROM_REGION(0x1000, "maincpu", 0)
+ ROM_LOAD("baby_8.3_av_25pts.bin", 0x0000, 0x1000, CRC(af45e046) SHA1(d4896f428a2061ad6bc12eed7d56eca4182d237d))
+
+ ROM_REGION(0x1000, "audiocpu", 0)
+ ROM_LOAD( "bbs_25pts_sonido.bin", 0x0000, 0x1000, CRC(384dc9b4) SHA1(0a3ab8a7dfba958858b06d23850d1a8a2b9a348f))
ROM_END
} // anonymous namespace
-// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS
-GAME( 1981, ajofrin, 0, ajofrin, ajofrin, rfslotsmcs48_state, empty_init, ROT0, "Recreativos Franco", "Ajofrin City", MACHINE_IS_SKELETON_MECHANICAL )
+// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS
+GAME( 1981, ajofrin, 0, ajofrin, ajofrin, rfslotsmcs48_state, empty_init, ROT0, "Recreativos Franco", "Ajofrin City", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 198?, babyfrts, 0, babyfrts, ajofrin, rfslotsmcs48_state, empty_init, ROT0, "Recreativos Franco", "Baby Fruits (100 pts version)", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 1981, babyfrts25, babyfrts, babyfrts, ajofrin, rfslotsmcs48_state, empty_init, ROT0, "Recreativos Franco", "Baby Fruits (25 pts version)", MACHINE_IS_SKELETON_MECHANICAL )
diff --git a/src/mame/drivers/roland_cm32p.cpp b/src/mame/drivers/roland_cm32p.cpp
index e26027acef2..cefe4efe729 100644
--- a/src/mame/drivers/roland_cm32p.cpp
+++ b/src/mame/drivers/roland_cm32p.cpp
@@ -398,7 +398,7 @@ DEVICE_IMAGE_LOAD_MEMBER(cm32p_state::card_load)
uint32_t size = pcmcard->common_get_size("rom");
if (size > 0x080000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only up to 512K is supported");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid size: Only up to 512K is supported");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/rollext.cpp b/src/mame/drivers/rollext.cpp
index a69b208a5ee..b1eca6e6dfc 100644
--- a/src/mame/drivers/rollext.cpp
+++ b/src/mame/drivers/rollext.cpp
@@ -233,7 +233,7 @@ void rollext_renderer::process_display_list(screen_device &screen, uint32_t* dis
vert[2].p[0] = 1.0f; vert[2].p[1] = 0.0f;
vert[3].p[0] = 1.0f; vert[3].p[1] = 1.0f;
- rollext_polydata &extra = object_data_alloc();
+ rollext_polydata &extra = object_data().next();
extra.tex_bottom = (disp_ram[(ii + 8) / 4] >> 19) & 0x1fff;
extra.tex_left = (disp_ram[(ii + 8) / 4] >> 8) & 0x7ff;
diff --git a/src/mame/drivers/rx78.cpp b/src/mame/drivers/rx78.cpp
index 71d00e3b7f5..638451e5961 100644
--- a/src/mame/drivers/rx78.cpp
+++ b/src/mame/drivers/rx78.cpp
@@ -489,7 +489,7 @@ DEVICE_IMAGE_LOAD_MEMBER( rx78_state::cart_load )
if (size != 0x2000 && size != 0x4000 && size != 0x8000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/s3.cpp b/src/mame/drivers/s3.cpp
index c8d53f57291..c707715d8a1 100644
--- a/src/mame/drivers/s3.cpp
+++ b/src/mame/drivers/s3.cpp
@@ -57,69 +57,95 @@ public:
s3_state(const machine_config &mconfig, device_type type, const char *tag)
: genpin_class(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
- , m_audiocpu(*this, "audiocpu")
, m_pia22(*this, "pia22")
, m_pia24(*this, "pia24")
, m_pia28(*this, "pia28")
, m_pia30(*this, "pia30")
- , m_pias(*this, "pias")
, m_digits(*this, "digit%u", 0U)
+ , m_leds(*this, "led%u", 0U)
, m_swarray(*this, "SW.%u", 0U)
- { }
+ , m_dips(*this, "DS%u", 1U)
+ {
+ }
- void s3a(machine_config &config);
void s3(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
- DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
protected:
- virtual void machine_start() override { m_digits.resolve(); m_strobe = 0; }
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ required_device<cpu_device> m_maincpu;
+ required_device<pia6821_device> m_pia22;
+ required_device<pia6821_device> m_pia24;
+ required_device<pia6821_device> m_pia28;
+ required_device<pia6821_device> m_pia30;
private:
- uint8_t sound_r();
void dig0_w(uint8_t data);
void dig1_w(uint8_t data);
void lamp0_w(uint8_t data);
void lamp1_w(uint8_t data);
void sol0_w(uint8_t data);
- void sol1_w(uint8_t data);
+ void sol1_chimes_w(uint8_t data);
uint8_t dips_r();
uint8_t switch_r();
void switch_w(uint8_t data);
- DECLARE_READ_LINE_MEMBER(pia28_ca1_r);
- DECLARE_READ_LINE_MEMBER(pia28_cb1_r);
- DECLARE_WRITE_LINE_MEMBER(pia22_ca2_w) { }; //ST5
- DECLARE_WRITE_LINE_MEMBER(pia22_cb2_w) { }; //ST-solenoids enable
- DECLARE_WRITE_LINE_MEMBER(pia24_ca2_w) { }; //ST2
- DECLARE_WRITE_LINE_MEMBER(pia24_cb2_w) { }; //ST1
- DECLARE_WRITE_LINE_MEMBER(pia28_ca2_w) { }; //diag leds enable
- DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; //ST6
- DECLARE_WRITE_LINE_MEMBER(pia30_ca2_w) { }; //ST4
- DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; //ST3
+ DECLARE_WRITE_LINE_MEMBER(pia22_ca2_w) { } //ST5
+ DECLARE_WRITE_LINE_MEMBER(pia22_cb2_w) { } //ST-solenoids enable
+ DECLARE_WRITE_LINE_MEMBER(pia24_ca2_w) { } //ST2
+ DECLARE_WRITE_LINE_MEMBER(pia24_cb2_w) { } //ST1
+ DECLARE_WRITE_LINE_MEMBER(pia28_ca2_w) { } //diag leds enable
+ DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { } //ST6
+ DECLARE_WRITE_LINE_MEMBER(pia30_ca2_w) { } //ST4
+ DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { } //ST3
TIMER_DEVICE_CALLBACK_MEMBER(irq);
- DECLARE_MACHINE_RESET(s3);
- DECLARE_MACHINE_RESET(s3a);
- void s3_audio_map(address_map &map);
void s3_main_map(address_map &map);
+ output_finder<32> m_digits;
+ output_finder<2> m_leds;
+ required_ioport_array<8> m_swarray;
+ required_ioport_array<2> m_dips;
+
uint8_t m_t_c;
- uint8_t m_sound_data;
uint8_t m_strobe;
uint8_t m_switch_col;
bool m_data_ok;
- bool m_chimes;
- required_device<cpu_device> m_maincpu;
- optional_device<cpu_device> m_audiocpu;
- required_device<pia6821_device> m_pia22;
- required_device<pia6821_device> m_pia24;
- required_device<pia6821_device> m_pia28;
- required_device<pia6821_device> m_pia30;
- optional_device<pia6821_device> m_pias;
- output_finder<32> m_digits;
- required_ioport_array<8> m_swarray;
};
+
+class s3a_state : public s3_state
+{
+public:
+ s3a_state(const machine_config &mconfig, device_type type, const char *tag)
+ : s3_state(mconfig, type, tag)
+ , m_audiocpu(*this, "audiocpu")
+ , m_pias(*this, "pias")
+ , m_io_snd(*this, "SND")
+ {
+ }
+
+ void s3a(machine_config &config);
+
+ DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
+
+protected:
+ required_device<cpu_device> m_audiocpu;
+ required_device<pia6821_device> m_pias;
+
+private:
+ uint8_t sound_r();
+ void s3a_sol1_w(uint8_t data);
+
+ void s3_audio_map(address_map &map);
+
+ required_ioport m_io_snd;
+
+ uint8_t m_sound_data;
+};
+
+
void s3_state::s3_main_map(address_map &map)
{
map.global_mask(0x7fff);
@@ -132,13 +158,14 @@ void s3_state::s3_main_map(address_map &map)
map(0x6000, 0x7fff).rom().region("roms", 0);
}
-void s3_state::s3_audio_map(address_map &map)
+void s3a_state::s3_audio_map(address_map &map)
{
map.global_mask(0xfff);
map(0x0400, 0x0403).rw(m_pias, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // sounds
map(0x0800, 0x0fff).rom().region("audioroms", 0);
}
+
static INPUT_PORTS_START( s3 )
PORT_START("SW.0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_TILT ) // 3 touches before it tilts
@@ -206,12 +233,7 @@ static INPUT_PORTS_START( s3 )
PORT_START("SW.7")
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_START("SND")
- PORT_BIT( 0xbf, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Music") PORT_CODE(KEYCODE_2_PAD) PORT_TOGGLE
-
PORT_START("DIAGS")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, s3_state, audio_nmi, 1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Main Diag") PORT_CODE(KEYCODE_4_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, s3_state, main_nmi, 1)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Advance") PORT_CODE(KEYCODE_5_PAD)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Manual/Auto") PORT_CODE(KEYCODE_6_PAD)
@@ -277,16 +299,29 @@ static INPUT_PORTS_START( s3 )
PORT_DIPSETTING( 0x07, "31" )
INPUT_PORTS_END
-MACHINE_RESET_MEMBER( s3_state, s3 )
+static INPUT_PORTS_START( s3a )
+ PORT_INCLUDE(s3)
+
+ PORT_START("SND")
+ PORT_BIT( 0xbf, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Music") PORT_CODE(KEYCODE_2_PAD) PORT_TOGGLE
+
+ PORT_MODIFY("DIAGS")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, s3a_state, audio_nmi, 1)
+INPUT_PORTS_END
+
+
+void s3_state::machine_start()
{
- m_t_c = 0;
- m_chimes = 1;
+ m_digits.resolve();
+ m_leds.resolve();
+
+ m_strobe = 0;
}
-MACHINE_RESET_MEMBER( s3_state, s3a )
+void s3_state::machine_reset()
{
m_t_c = 0;
- m_chimes = 0;
}
INPUT_CHANGED_MEMBER( s3_state::main_nmi )
@@ -296,10 +331,10 @@ INPUT_CHANGED_MEMBER( s3_state::main_nmi )
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-INPUT_CHANGED_MEMBER( s3_state::audio_nmi )
+INPUT_CHANGED_MEMBER( s3a_state::audio_nmi )
{
// Diagnostic button sends a pulse to NMI pin
- if ((newval==CLEAR_LINE) && !m_chimes)
+ if (newval==CLEAR_LINE)
m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
@@ -309,47 +344,48 @@ void s3_state::sol0_w(uint8_t data)
m_samples->start(5, 5); // outhole
}
-void s3_state::sol1_w(uint8_t data)
+void s3_state::sol1_chimes_w(uint8_t data)
{
- if (m_chimes)
- {
- if (BIT(data, 0))
- m_samples->start(1, 1); // 10 chime
+ if (BIT(data, 0))
+ m_samples->start(1, 1); // 10 chime
- if (BIT(data, 1))
- m_samples->start(2, 2); // 100 chime
+ if (BIT(data, 1))
+ m_samples->start(2, 2); // 100 chime
- if (BIT(data, 2))
- m_samples->start(3, 3); // 1000 chime
+ if (BIT(data, 2))
+ m_samples->start(3, 3); // 1000 chime
- if (BIT(data, 3))
- m_samples->start(4, 4); // 10k chime
- }
- else
- {
- uint8_t sound_data = ioport("SND")->read(); // 0xff or 0xbf
- if (BIT(data, 0))
- sound_data &= 0xfe;
+ if (BIT(data, 3))
+ m_samples->start(4, 4); // 10k chime
- if (BIT(data, 1))
- sound_data &= 0xfd;
+ if (BIT(data, 5))
+ m_samples->start(0, 6); // knocker
+}
- if (BIT(data, 2))
- sound_data &= 0xfb;
+void s3a_state::s3a_sol1_w(uint8_t data)
+{
+ uint8_t sound_data = m_io_snd->read(); // 0xff or 0xbf
+ if (BIT(data, 0))
+ sound_data &= 0xfe;
- if (BIT(data, 3))
- sound_data &= 0xf7;
+ if (BIT(data, 1))
+ sound_data &= 0xfd;
- if (BIT(data, 4))
- sound_data &= 0xef;
+ if (BIT(data, 2))
+ sound_data &= 0xfb;
- bool cb1 = ((sound_data & 0xbf) != 0xbf);
+ if (BIT(data, 3))
+ sound_data &= 0xf7;
- if (cb1)
- m_sound_data = sound_data;
+ if (BIT(data, 4))
+ sound_data &= 0xef;
- m_pias->cb1_w(cb1);
- }
+ bool cb1 = ((sound_data & 0xbf) != 0xbf);
+
+ if (cb1)
+ m_sound_data = sound_data;
+
+ m_pias->cb1_w(cb1);
if (BIT(data, 5))
m_samples->start(0, 6); // knocker
@@ -364,32 +400,11 @@ void s3_state::lamp1_w(uint8_t data)
{
}
-READ_LINE_MEMBER( s3_state::pia28_ca1_r )
-{
- return BIT(ioport("DIAGS")->read(), 2); // advance button
-}
-
-READ_LINE_MEMBER( s3_state::pia28_cb1_r )
-{
- return BIT(ioport("DIAGS")->read(), 3); // auto/manual switch
-}
-
uint8_t s3_state::dips_r()
{
- if (BIT(ioport("DIAGS")->read(), 4) )
- {
- switch (m_strobe)
- {
- case 0:
- return ioport("DS2")->read();
- case 1:
- return ioport("DS2")->read() << 4;
- case 2:
- return ioport("DS1")->read();
- case 3:
- return ioport("DS1")->read() << 4;
- }
- }
+ if (BIT(ioport("DIAGS")->read(), 4))
+ return m_dips[BIT(~m_strobe, 1)]->read() << (BIT(m_strobe, 0) ? 4 : 0);
+
return 0xff;
}
@@ -397,8 +412,8 @@ void s3_state::dig0_w(uint8_t data)
{
m_strobe = data & 15;
m_data_ok = true;
- output().set_value("led0", !BIT(data, 4));
- output().set_value("led1", !BIT(data, 5));
+ m_leds[0] = !BIT(data, 4);
+ m_leds[1] = !BIT(data, 5);
}
void s3_state::dig1_w(uint8_t data)
@@ -431,7 +446,7 @@ void s3_state::switch_w(uint8_t data)
m_switch_col = data;
}
-uint8_t s3_state::sound_r()
+uint8_t s3a_state::sound_r()
{
return m_sound_data;
}
@@ -446,46 +461,45 @@ TIMER_DEVICE_CALLBACK_MEMBER( s3_state::irq )
void s3_state::s3(machine_config &config)
{
- /* basic machine hardware */
+ // basic machine hardware
M6800(config, m_maincpu, 3580000);
m_maincpu->set_addrmap(AS_PROGRAM, &s3_state::s3_main_map);
TIMER(config, "irq").configure_periodic(FUNC(s3_state::irq), attotime::from_hz(250));
- MCFG_MACHINE_RESET_OVERRIDE(s3_state, s3)
- /* Video */
+ // Video
config.set_default_layout(layout_s3);
- /* Sound */
+ // Sound
genpin_audio(config);
- /* Devices */
+ // Devices
PIA6821(config, m_pia22, 0);
m_pia22->writepa_handler().set(FUNC(s3_state::sol0_w));
- m_pia22->writepb_handler().set(FUNC(s3_state::sol1_w));
+ m_pia22->writepb_handler().set(FUNC(s3_state::sol1_chimes_w));
m_pia22->ca2_handler().set(FUNC(s3_state::pia22_ca2_w));
m_pia22->cb2_handler().set(FUNC(s3_state::pia22_cb2_w));
- m_pia22->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- m_pia22->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
+ m_pia22->irqa_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+ m_pia22->irqb_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
PIA6821(config, m_pia24, 0);
m_pia24->writepa_handler().set(FUNC(s3_state::lamp0_w));
m_pia24->writepb_handler().set(FUNC(s3_state::lamp1_w));
m_pia24->ca2_handler().set(FUNC(s3_state::pia24_ca2_w));
m_pia24->cb2_handler().set(FUNC(s3_state::pia24_cb2_w));
- m_pia24->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- m_pia24->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
+ m_pia24->irqa_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+ m_pia24->irqb_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
PIA6821(config, m_pia28, 0);
m_pia28->readpa_handler().set(FUNC(s3_state::dips_r));
m_pia28->set_port_a_input_overrides_output_mask(0xff);
- m_pia28->readca1_handler().set(FUNC(s3_state::pia28_ca1_r));
- m_pia28->readcb1_handler().set(FUNC(s3_state::pia28_cb1_r));
+ m_pia28->readca1_handler().set_ioport("DIAGS").bit(2); // advance button
+ m_pia28->readcb1_handler().set_ioport("DIAGS").bit(3); // auto/manual switch
m_pia28->writepa_handler().set(FUNC(s3_state::dig0_w));
m_pia28->writepb_handler().set(FUNC(s3_state::dig1_w));
m_pia28->ca2_handler().set(FUNC(s3_state::pia28_ca2_w));
m_pia28->cb2_handler().set(FUNC(s3_state::pia28_cb2_w));
- m_pia28->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- m_pia28->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
+ m_pia28->irqa_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+ m_pia28->irqb_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
PIA6821(config, m_pia30, 0);
m_pia30->readpa_handler().set(FUNC(s3_state::switch_r));
@@ -493,28 +507,30 @@ void s3_state::s3(machine_config &config)
m_pia30->writepb_handler().set(FUNC(s3_state::switch_w));
m_pia30->ca2_handler().set(FUNC(s3_state::pia30_ca2_w));
m_pia30->cb2_handler().set(FUNC(s3_state::pia30_cb2_w));
- m_pia30->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- m_pia30->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
+ m_pia30->irqa_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+ m_pia30->irqb_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
}
-void s3_state::s3a(machine_config &config)
+void s3a_state::s3a(machine_config &config)
{
s3(config);
- /* Add the soundcard */
+
+ m_pia22->writepb_handler().set(FUNC(s3a_state::s3a_sol1_w));
+
+ // Add the soundcard
M6802(config, m_audiocpu, 3580000);
- m_audiocpu->set_addrmap(AS_PROGRAM, &s3_state::s3_audio_map);
- MCFG_MACHINE_RESET_OVERRIDE(s3_state, s3a)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &s3a_state::s3_audio_map);
SPEAKER(config, "speaker").front_center();
MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
PIA6821(config, m_pias, 0);
- m_pias->readpb_handler().set(FUNC(s3_state::sound_r));
+ m_pias->readpb_handler().set(FUNC(s3a_state::sound_r));
m_pias->writepa_handler().set("dac", FUNC(dac_byte_interface::data_w));
- m_pias->irqa_handler().set_inputline("audiocpu", M6802_IRQ_LINE);
- m_pias->irqb_handler().set_inputline("audiocpu", M6802_IRQ_LINE);
+ m_pias->irqa_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE);
+ m_pias->irqb_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE);
}
@@ -608,10 +624,10 @@ ROM_END
} // Anonymous namespace
-GAME( 1977, httip_l1, 0, s3, s3, s3_state, empty_init, ROT0, "Williams", "Hot Tip (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1977, lucky_l1, 0, s3, s3, s3_state, empty_init, ROT0, "Williams", "Lucky Seven (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1978, wldcp_l1, 0, s3a, s3, s3_state, empty_init, ROT0, "Williams", "World Cup (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1978, cntct_l1, 0, s3a, s3, s3_state, empty_init, ROT0, "Williams", "Contact (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1978, disco_l1, 0, s3a, s3, s3_state, empty_init, ROT0, "Williams", "Disco Fever (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1978, phnix_l1, 0, s3a, s3, s3_state, empty_init, ROT0, "Williams", "Phoenix (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1978, pkrno_l1, 0, s3a, s3, s3_state, empty_init, ROT0, "Williams", "Pokerino (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1977, httip_l1, 0, s3, s3, s3_state, empty_init, ROT0, "Williams", "Hot Tip (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1977, lucky_l1, 0, s3, s3, s3_state, empty_init, ROT0, "Williams", "Lucky Seven (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1978, wldcp_l1, 0, s3a, s3a, s3a_state, empty_init, ROT0, "Williams", "World Cup (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1978, cntct_l1, 0, s3a, s3a, s3a_state, empty_init, ROT0, "Williams", "Contact (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1978, disco_l1, 0, s3a, s3a, s3a_state, empty_init, ROT0, "Williams", "Disco Fever (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1978, phnix_l1, 0, s3a, s3a, s3a_state, empty_init, ROT0, "Williams", "Phoenix (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1978, pkrno_l1, 0, s3a, s3a, s3a_state, empty_init, ROT0, "Williams", "Pokerino (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/s4.cpp b/src/mame/drivers/s4.cpp
index bad163eaba8..9ce31fb2145 100644
--- a/src/mame/drivers/s4.cpp
+++ b/src/mame/drivers/s4.cpp
@@ -5,7 +5,7 @@
PINBALL
Williams System 4
- Phoenix and Pokerino are listed as System 4 systems, but use System 3 roms.
+ Phoenix and Pokerino are listed as System 4 systems, but use System 3 ROMs.
They have been moved to s3.cpp, and are working there.
The "Shuffle" games consist of a flat board with an air-driven puck and 10
@@ -51,69 +51,95 @@ public:
s4_state(const machine_config &mconfig, device_type type, const char *tag)
: genpin_class(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
- , m_audiocpu(*this, "audiocpu")
, m_pia22(*this, "pia22")
, m_pia24(*this, "pia24")
, m_pia28(*this, "pia28")
, m_pia30(*this, "pia30")
- , m_pias(*this, "pias")
, m_digits(*this, "digit%u", 0U)
+ , m_leds(*this, "led%u", 0U)
, m_swarray(*this, "SW.%u", 0U)
- { }
+ , m_dips(*this, "DS%u", 1U)
+ {
+ }
void s4(machine_config &config);
- void s4a(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
- DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
protected:
- virtual void machine_start() override { m_digits.resolve(); m_strobe = 0; }
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ required_device<cpu_device> m_maincpu;
+ required_device<pia6821_device> m_pia22;
+ required_device<pia6821_device> m_pia24;
+ required_device<pia6821_device> m_pia28;
+ required_device<pia6821_device> m_pia30;
private:
- uint8_t sound_r();
void dig0_w(uint8_t data);
void dig1_w(uint8_t data);
void lamp0_w(uint8_t data);
void lamp1_w(uint8_t data);
void sol0_w(uint8_t data);
- void sol1_w(uint8_t data);
+ void sol1_chimes_w(uint8_t data);
uint8_t dips_r();
uint8_t switch_r();
void switch_w(uint8_t data);
- DECLARE_READ_LINE_MEMBER(pia28_ca1_r);
- DECLARE_READ_LINE_MEMBER(pia28_cb1_r);
- DECLARE_WRITE_LINE_MEMBER(pia22_ca2_w) { }; //ST5
- DECLARE_WRITE_LINE_MEMBER(pia22_cb2_w) { }; //ST-solenoids enable
- DECLARE_WRITE_LINE_MEMBER(pia24_ca2_w) { }; //ST2
- DECLARE_WRITE_LINE_MEMBER(pia24_cb2_w) { }; //ST1
- DECLARE_WRITE_LINE_MEMBER(pia28_ca2_w) { }; //diag leds enable
- DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; //ST6
- DECLARE_WRITE_LINE_MEMBER(pia30_ca2_w) { }; //ST4
- DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; //ST3
+ DECLARE_WRITE_LINE_MEMBER(pia22_ca2_w) { } //ST5
+ DECLARE_WRITE_LINE_MEMBER(pia22_cb2_w) { } //ST-solenoids enable
+ DECLARE_WRITE_LINE_MEMBER(pia24_ca2_w) { } //ST2
+ DECLARE_WRITE_LINE_MEMBER(pia24_cb2_w) { } //ST1
+ DECLARE_WRITE_LINE_MEMBER(pia28_ca2_w) { } //diag leds enable
+ DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { } //ST6
+ DECLARE_WRITE_LINE_MEMBER(pia30_ca2_w) { } //ST4
+ DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { } //ST3
TIMER_DEVICE_CALLBACK_MEMBER(irq);
- DECLARE_MACHINE_RESET(s4);
- DECLARE_MACHINE_RESET(s4a);
- void s4_audio_map(address_map &map);
void s4_main_map(address_map &map);
+ output_finder<32> m_digits;
+ output_finder<2> m_leds;
+ required_ioport_array<8> m_swarray;
+ required_ioport_array<2> m_dips;
+
uint8_t m_t_c;
- uint8_t m_sound_data;
uint8_t m_strobe;
uint8_t m_switch_col;
bool m_data_ok;
- bool m_chimes;
- required_device<cpu_device> m_maincpu;
- optional_device<cpu_device> m_audiocpu;
- required_device<pia6821_device> m_pia22;
- required_device<pia6821_device> m_pia24;
- required_device<pia6821_device> m_pia28;
- required_device<pia6821_device> m_pia30;
- optional_device<pia6821_device> m_pias;
- output_finder<32> m_digits;
- required_ioport_array<8> m_swarray;
};
+
+class s4a_state : public s4_state
+{
+public:
+ s4a_state(const machine_config &mconfig, device_type type, const char *tag)
+ : s4_state(mconfig, type, tag)
+ , m_audiocpu(*this, "audiocpu")
+ , m_pias(*this, "pias")
+ , m_io_snd(*this, "SND")
+ {
+ }
+
+ void s4a(machine_config &config);
+
+ DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
+
+protected:
+ required_device<cpu_device> m_audiocpu;
+ required_device<pia6821_device> m_pias;
+
+private:
+ uint8_t sound_r();
+ void s4a_sol1_w(uint8_t data);
+
+ void s4_audio_map(address_map &map);
+
+ required_ioport m_io_snd;
+
+ uint8_t m_sound_data;
+};
+
+
void s4_state::s4_main_map(address_map &map)
{
map.global_mask(0x7fff);
@@ -126,7 +152,7 @@ void s4_state::s4_main_map(address_map &map)
map(0x6000, 0x7fff).rom().region("roms", 0);
}
-void s4_state::s4_audio_map(address_map &map)
+void s4a_state::s4_audio_map(address_map &map)
{
map.global_mask(0x0fff);
map(0x0000, 0x00ff).ram();
@@ -134,6 +160,7 @@ void s4_state::s4_audio_map(address_map &map)
map(0x0800, 0x0fff).rom().region("audioroms", 0);
}
+
static INPUT_PORTS_START( s4 )
PORT_START("SW.0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_TILT )
@@ -201,12 +228,7 @@ static INPUT_PORTS_START( s4 )
PORT_START("SW.7")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_START("SND")
- PORT_BIT( 0xbf, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Music") PORT_CODE(KEYCODE_2_PAD) PORT_TOGGLE
-
PORT_START("DIAGS")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, s4_state, audio_nmi, 1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Main Diag") PORT_CODE(KEYCODE_4_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, s4_state, main_nmi, 1)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Advance") PORT_CODE(KEYCODE_5_PAD)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Manual/Auto") PORT_CODE(KEYCODE_6_PAD)
@@ -272,16 +294,29 @@ static INPUT_PORTS_START( s4 )
PORT_DIPSETTING( 0x07, "31" )
INPUT_PORTS_END
-MACHINE_RESET_MEMBER( s4_state, s4 )
+static INPUT_PORTS_START( s4a )
+ PORT_INCLUDE(s4)
+
+ PORT_START("SND")
+ PORT_BIT( 0xbf, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Music") PORT_CODE(KEYCODE_2_PAD) PORT_TOGGLE
+
+ PORT_MODIFY("DIAGS")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, s4a_state, audio_nmi, 1)
+INPUT_PORTS_END
+
+
+void s4_state::machine_start()
{
- m_t_c = 0;
- m_chimes = 1;
+ m_digits.resolve();
+ m_leds.resolve();
+
+ m_strobe = 0;
}
-MACHINE_RESET_MEMBER( s4_state, s4a )
+void s4_state::machine_reset()
{
m_t_c = 0;
- m_chimes = 0;
}
INPUT_CHANGED_MEMBER( s4_state::main_nmi )
@@ -291,10 +326,10 @@ INPUT_CHANGED_MEMBER( s4_state::main_nmi )
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-INPUT_CHANGED_MEMBER( s4_state::audio_nmi )
+INPUT_CHANGED_MEMBER( s4a_state::audio_nmi )
{
// Diagnostic button sends a pulse to NMI pin
- if ((newval==CLEAR_LINE) && !m_chimes)
+ if (newval==CLEAR_LINE)
m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
@@ -304,47 +339,48 @@ void s4_state::sol0_w(uint8_t data)
m_samples->start(2, 5); // outhole
}
-void s4_state::sol1_w(uint8_t data)
+void s4_state::sol1_chimes_w(uint8_t data)
{
- if (m_chimes)
- {
- if (BIT(data, 0))
- m_samples->start(1, 1); // 10 chime
+ if (BIT(data, 0))
+ m_samples->start(1, 1); // 10 chime
- if (BIT(data, 1))
- m_samples->start(2, 2); // 100 chime
+ if (BIT(data, 1))
+ m_samples->start(2, 2); // 100 chime
- if (BIT(data, 2))
- m_samples->start(3, 3); // 1000 chime
+ if (BIT(data, 2))
+ m_samples->start(3, 3); // 1000 chime
- if (BIT(data, 3))
- m_samples->start(1, 4); // 10k chime
- }
- else
- {
- uint8_t sound_data = ioport("SND")->read();
- if (BIT(data, 0))
- sound_data &= 0xfe;
+ if (BIT(data, 3))
+ m_samples->start(1, 4); // 10k chime
- if (BIT(data, 1))
- sound_data &= 0xfd;
+ if (BIT(data, 5))
+ m_samples->start(0, 6); // knocker
+}
- if (BIT(data, 2))
- sound_data &= 0xfb;
+void s4a_state::s4a_sol1_w(uint8_t data)
+{
+ uint8_t sound_data = m_io_snd->read(); // 0xff or 0xbf
+ if (BIT(data, 0))
+ sound_data &= 0xfe;
- if (BIT(data, 3))
- sound_data &= 0xf7;
+ if (BIT(data, 1))
+ sound_data &= 0xfd;
- if (BIT(data, 4))
- sound_data &= 0xef;
+ if (BIT(data, 2))
+ sound_data &= 0xfb;
- bool cb1 = ((sound_data & 0xbf) != 0xbf);
+ if (BIT(data, 3))
+ sound_data &= 0xf7;
- if (cb1)
- m_sound_data = sound_data;
+ if (BIT(data, 4))
+ sound_data &= 0xef;
- m_pias->cb1_w(cb1);
- }
+ bool cb1 = ((sound_data & 0xbf) != 0xbf);
+
+ if (cb1)
+ m_sound_data = sound_data;
+
+ m_pias->cb1_w(cb1);
if (BIT(data, 5))
m_samples->start(0, 6); // knocker
@@ -359,32 +395,11 @@ void s4_state::lamp1_w(uint8_t data)
{
}
-READ_LINE_MEMBER( s4_state::pia28_ca1_r )
-{
- return BIT(ioport("DIAGS")->read(), 2); // advance button
-}
-
-READ_LINE_MEMBER( s4_state::pia28_cb1_r )
-{
- return BIT(ioport("DIAGS")->read(), 3); // auto/manual switch
-}
-
uint8_t s4_state::dips_r()
{
- if (BIT(ioport("DIAGS")->read(), 4) )
- {
- switch (m_strobe)
- {
- case 0:
- return ioport("DS2")->read();
- case 1:
- return ioport("DS2")->read() << 4;
- case 2:
- return ioport("DS1")->read();
- case 3:
- return ioport("DS1")->read() << 4;
- }
- }
+ if (BIT(ioport("DIAGS")->read(), 4))
+ return m_dips[BIT(~m_strobe, 1)]->read() << (BIT(m_strobe, 0) ? 4 : 0);
+
return 0xff;
}
@@ -392,8 +407,8 @@ void s4_state::dig0_w(uint8_t data)
{
m_strobe = data & 15;
m_data_ok = true;
- output().set_value("led0", !BIT(data, 4));
- output().set_value("led1", !BIT(data, 5));
+ m_leds[0] = !BIT(data, 4);
+ m_leds[1] = !BIT(data, 5);
}
void s4_state::dig1_w(uint8_t data)
@@ -426,7 +441,7 @@ void s4_state::switch_w(uint8_t data)
m_switch_col = data;
}
-uint8_t s4_state::sound_r()
+uint8_t s4a_state::sound_r()
{
return m_sound_data;
}
@@ -441,46 +456,45 @@ TIMER_DEVICE_CALLBACK_MEMBER( s4_state::irq )
void s4_state::s4(machine_config &config)
{
- /* basic machine hardware */
+ // basic machine hardware
M6800(config, m_maincpu, 3580000);
m_maincpu->set_addrmap(AS_PROGRAM, &s4_state::s4_main_map);
TIMER(config, "irq").configure_periodic(FUNC(s4_state::irq), attotime::from_hz(250));
- MCFG_MACHINE_RESET_OVERRIDE(s4_state, s4)
- /* Video */
+ // Video
config.set_default_layout(layout_s4);
- /* Sound */
+ // Sound
genpin_audio(config);
- /* Devices */
+ // Devices
PIA6821(config, m_pia22, 0);
m_pia22->writepa_handler().set(FUNC(s4_state::sol0_w));
- m_pia22->writepb_handler().set(FUNC(s4_state::sol1_w));
+ m_pia22->writepb_handler().set(FUNC(s4_state::sol1_chimes_w));
m_pia22->ca2_handler().set(FUNC(s4_state::pia22_ca2_w));
m_pia22->cb2_handler().set(FUNC(s4_state::pia22_cb2_w));
- m_pia22->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- m_pia22->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
+ m_pia22->irqa_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+ m_pia22->irqb_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
PIA6821(config, m_pia24, 0);
m_pia24->writepa_handler().set(FUNC(s4_state::lamp0_w));
m_pia24->writepb_handler().set(FUNC(s4_state::lamp1_w));
m_pia24->ca2_handler().set(FUNC(s4_state::pia24_ca2_w));
m_pia24->cb2_handler().set(FUNC(s4_state::pia24_cb2_w));
- m_pia24->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- m_pia24->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
+ m_pia24->irqa_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+ m_pia24->irqb_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
PIA6821(config, m_pia28, 0);
m_pia28->readpa_handler().set(FUNC(s4_state::dips_r));
m_pia28->set_port_a_input_overrides_output_mask(0xff);
- m_pia28->readca1_handler().set(FUNC(s4_state::pia28_ca1_r));
- m_pia28->readcb1_handler().set(FUNC(s4_state::pia28_cb1_r));
+ m_pia28->readca1_handler().set_ioport("DIAGS").bit(2); // advance button
+ m_pia28->readcb1_handler().set_ioport("DIAGS").bit(3); // auto/manual switch
m_pia28->writepa_handler().set(FUNC(s4_state::dig0_w));
m_pia28->writepb_handler().set(FUNC(s4_state::dig1_w));
m_pia28->ca2_handler().set(FUNC(s4_state::pia28_ca2_w));
m_pia28->cb2_handler().set(FUNC(s4_state::pia28_cb2_w));
- m_pia28->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- m_pia28->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
+ m_pia28->irqa_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+ m_pia28->irqb_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
PIA6821(config, m_pia30, 0);
m_pia30->readpa_handler().set(FUNC(s4_state::switch_r));
@@ -488,28 +502,30 @@ void s4_state::s4(machine_config &config)
m_pia30->writepb_handler().set(FUNC(s4_state::switch_w));
m_pia30->ca2_handler().set(FUNC(s4_state::pia30_ca2_w));
m_pia30->cb2_handler().set(FUNC(s4_state::pia30_cb2_w));
- m_pia30->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- m_pia30->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
+ m_pia30->irqa_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+ m_pia30->irqb_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
}
-void s4_state::s4a(machine_config &config)
+void s4a_state::s4a(machine_config &config)
{
s4(config);
- /* Add the soundcard */
+
+ m_pia22->writepb_handler().set(FUNC(s4a_state::s4a_sol1_w));
+
+ // Add the soundcard
M6808(config, m_audiocpu, 3580000);
- m_audiocpu->set_addrmap(AS_PROGRAM, &s4_state::s4_audio_map);
- MCFG_MACHINE_RESET_OVERRIDE(s4_state, s4a)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &s4a_state::s4_audio_map);
SPEAKER(config, "speaker").front_center();
MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
PIA6821(config, m_pias, 0);
- m_pias->readpb_handler().set(FUNC(s4_state::sound_r));
+ m_pias->readpb_handler().set(FUNC(s4a_state::sound_r));
m_pias->writepa_handler().set("dac", FUNC(dac_byte_interface::data_w));
- m_pias->irqa_handler().set_inputline("audiocpu", M6808_IRQ_LINE);
- m_pias->irqb_handler().set_inputline("audiocpu", M6808_IRQ_LINE);
+ m_pias->irqa_handler().set_inputline(m_audiocpu, M6808_IRQ_LINE);
+ m_pias->irqb_handler().set_inputline(m_audiocpu, M6808_IRQ_LINE);
}
@@ -720,21 +736,21 @@ ROM_END
} // Anonymous namespace
-GAME( 1979, flash_l2, 0, s4a, s4, s4_state, empty_init, ROT0, "Williams", "Flash (Williams, L-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1979, flash_l1, flash_l2, s4a, s4, s4_state, empty_init, ROT0, "Williams", "Flash (Williams, L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1979, flash_t1, flash_l2, s4a, s4, s4_state, empty_init, ROT0, "Williams", "Flash (Williams, T-1) Ted Estes", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1978, trizn_l1, 0, s4a, s4, s4_state, empty_init, ROT0, "Williams", "Tri Zone (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1978, trizn_t1, trizn_l1, s4a, s4, s4_state, empty_init, ROT0, "Williams", "Tri Zone (T-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1979, tmwrp_l3, 0, s4a, s4, s4_state, empty_init, ROT0, "Williams", "Time Warp (Williams, L-3)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1979, tmwrp_l2, tmwrp_l3, s4a, s4, s4_state, empty_init, ROT0, "Williams", "Time Warp (Williams, L-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1979, tmwrp_t2, tmwrp_l3, s4a, s4, s4_state, empty_init, ROT0, "Williams", "Time Warp (Williams, T-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1979, stlwr_l2, 0, s4a, s4, s4_state, empty_init, ROT0, "Williams", "Stellar Wars (L-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-
-GAME( 1978, pomp_l1, 0, s4a, s4, s4_state, empty_init, ROT0, "Williams", "Pompeii (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING)
-GAME( 1978, arist_l1, 0, s4a, s4, s4_state, empty_init, ROT0, "Williams", "Aristocrat (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING)
-GAME( 1978, topaz_l1, 0, s4a, s4, s4_state, empty_init, ROT0, "Williams", "Topaz (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING)
-GAME( 1979, taurs_l1, 0, s4a, s4, s4_state, empty_init, ROT0, "Williams", "Taurus (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING)
-GAME( 1979, kingt_l1, 0, s4a, s4, s4_state, empty_init, ROT0, "Williams", "King Tut (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING)
-GAME( 1980, omni_l1, 0, s4a, s4, s4_state, empty_init, ROT0, "Williams", "Omni (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
-GAME( 1983, bstrk_l1, 0, s4, s4, s4_state, empty_init, ROT0, "Williams", "Big Strike (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
-GAME( 1983, tstrk_l1, 0, s4, s4, s4_state, empty_init, ROT0, "Williams", "Triple Strike (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
+GAME( 1979, flash_l2, 0, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "Flash (Williams, L-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1979, flash_l1, flash_l2, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "Flash (Williams, L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1979, flash_t1, flash_l2, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "Flash (Williams, T-1) Ted Estes", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1978, trizn_l1, 0, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "Tri Zone (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1978, trizn_t1, trizn_l1, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "Tri Zone (T-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1979, tmwrp_l3, 0, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "Time Warp (Williams, L-3)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1979, tmwrp_l2, tmwrp_l3, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "Time Warp (Williams, L-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1979, tmwrp_t2, tmwrp_l3, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "Time Warp (Williams, T-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1979, stlwr_l2, 0, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "Stellar Wars (L-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+
+GAME( 1978, pomp_l1, 0, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "Pompeii (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING)
+GAME( 1978, arist_l1, 0, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "Aristocrat (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING)
+GAME( 1978, topaz_l1, 0, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "Topaz (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING)
+GAME( 1979, taurs_l1, 0, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "Taurus (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING)
+GAME( 1979, kingt_l1, 0, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "King Tut (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING)
+GAME( 1980, omni_l1, 0, s4a, s4a, s4a_state, empty_init, ROT0, "Williams", "Omni (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
+GAME( 1983, bstrk_l1, 0, s4, s4, s4_state, empty_init, ROT0, "Williams", "Big Strike (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
+GAME( 1983, tstrk_l1, 0, s4, s4, s4_state, empty_init, ROT0, "Williams", "Triple Strike (Shuffle) (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
diff --git a/src/mame/drivers/s6.cpp b/src/mame/drivers/s6.cpp
index 59d908ba377..545e860eab0 100644
--- a/src/mame/drivers/s6.cpp
+++ b/src/mame/drivers/s6.cpp
@@ -58,6 +58,8 @@ ToDo:
#include "s6.lh"
+namespace {
+
class s6_state : public genpin_class
{
public:
@@ -72,37 +74,41 @@ public:
, m_pia28(*this, "pia28")
, m_pia30(*this, "pia30")
, m_digits(*this, "digit%u", 0U)
+ , m_leds(*this, "led%u", 0U)
, m_swarray(*this, "SW.%u", 0U)
+ , m_dips(*this, "DS%u", 1U)
+ , m_io_snd(*this, "SND")
{ }
void s6(machine_config &config);
- void init_s6();
-
DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
+protected:
+ virtual void machine_start() override;
+ virtual void device_timer(timer_instance const &timer) override;
+
private:
uint8_t sound_r();
void dig0_w(uint8_t data);
void dig1_w(uint8_t data);
void lamp0_w(uint8_t data);
void lamp1_w(uint8_t data);
- uint8_t dips_r();
void sol0_w(uint8_t data);
void sol1_w(uint8_t data);
+ uint8_t dips_r();
uint8_t switch_r();
void switch_w(uint8_t data);
- DECLARE_WRITE_LINE_MEMBER(pia22_ca2_w) { }; //ST5
- DECLARE_WRITE_LINE_MEMBER(pia22_cb2_w) { }; //ST-solenoids enable
- DECLARE_WRITE_LINE_MEMBER(pia24_ca2_w) { }; //ST2
- DECLARE_WRITE_LINE_MEMBER(pia24_cb2_w) { }; //ST1
- DECLARE_WRITE_LINE_MEMBER(pia28_ca2_w) { }; //diag leds enable
- DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; //ST6
- DECLARE_WRITE_LINE_MEMBER(pia30_ca2_w) { }; //ST4
- DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; //ST3
+ DECLARE_WRITE_LINE_MEMBER(pia22_ca2_w) { } //ST5
+ DECLARE_WRITE_LINE_MEMBER(pia22_cb2_w) { } //ST-solenoids enable
+ DECLARE_WRITE_LINE_MEMBER(pia24_ca2_w) { } //ST2
+ DECLARE_WRITE_LINE_MEMBER(pia24_cb2_w) { } //ST1
+ DECLARE_WRITE_LINE_MEMBER(pia28_ca2_w) { } //diag leds enable
+ DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { } //ST6
+ DECLARE_WRITE_LINE_MEMBER(pia30_ca2_w) { } //ST4
+ DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { } //ST3
DECLARE_WRITE_LINE_MEMBER(pia_irq);
- DECLARE_MACHINE_RESET(s6);
void s6_audio_map(address_map &map);
void s6_main_map(address_map &map);
@@ -112,9 +118,7 @@ private:
uint8_t m_switch_col;
bool m_data_ok;
emu_timer* m_irq_timer;
- virtual void device_timer(timer_instance const &timer) override;
static const device_timer_id TIMER_IRQ = 0;
- virtual void machine_start() override { m_digits.resolve(); }
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<hc55516_device> m_hc55516;
@@ -124,7 +128,10 @@ private:
required_device<pia6821_device> m_pia28;
required_device<pia6821_device> m_pia30;
output_finder<61> m_digits;
+ output_finder<2> m_leds;
required_ioport_array<8> m_swarray;
+ required_ioport_array<2> m_dips;
+ required_ioport m_io_snd;
};
void s6_state::s6_main_map(address_map &map)
@@ -269,7 +276,7 @@ void s6_state::sol0_w(uint8_t data)
void s6_state::sol1_w(uint8_t data)
{
- uint8_t sound_data = ioport("SND")->read();
+ uint8_t sound_data = m_io_snd->read();
if (BIT(data, 0))
sound_data &= 0xfe;
@@ -306,20 +313,9 @@ void s6_state::lamp1_w(uint8_t data)
uint8_t s6_state::dips_r()
{
- if (BIT(ioport("DIAGS")->read(), 4) )
- {
- switch (m_strobe)
- {
- case 0:
- return ioport("DS2")->read();
- case 1:
- return ioport("DS2")->read() << 4;
- case 2:
- return ioport("DS1")->read();
- case 3:
- return ioport("DS1")->read() << 4;
- }
- }
+ if (BIT(ioport("DIAGS")->read(), 4))
+ return m_dips[BIT(~m_strobe, 1)]->read() << (BIT(m_strobe, 0) ? 4 : 0);
+
return 0xff;
}
@@ -327,8 +323,8 @@ void s6_state::dig0_w(uint8_t data)
{
m_strobe = data & 15;
m_data_ok = true;
- output().set_value("led0", !BIT(data, 4));
- output().set_value("led1", !BIT(data, 5));
+ m_leds[0] = !BIT(data, 4);
+ m_leds[1] = !BIT(data, 5);
}
void s6_state::dig1_w(uint8_t data)
@@ -381,6 +377,15 @@ WRITE_LINE_MEMBER( s6_state::pia_irq )
}
}
+void s6_state::machine_start()
+{
+ m_digits.resolve();
+ m_leds.resolve();
+
+ m_irq_timer = timer_alloc(TIMER_IRQ);
+ m_irq_timer->adjust(attotime::from_ticks(980,3580000/4),1);
+}
+
void s6_state::device_timer(timer_instance const &timer)
{
switch(timer.id())
@@ -404,22 +409,11 @@ void s6_state::device_timer(timer_instance const &timer)
}
}
-MACHINE_RESET_MEMBER( s6_state, s6 )
-{
-}
-
-void s6_state::init_s6()
-{
- m_irq_timer = timer_alloc(TIMER_IRQ);
- m_irq_timer->adjust(attotime::from_ticks(980,3580000/4),1);
-}
-
void s6_state::s6(machine_config &config)
{
/* basic machine hardware */
M6808(config, m_maincpu, 3580000); // 6802 or 6808 could be used here
m_maincpu->set_addrmap(AS_PROGRAM, &s6_state::s6_main_map);
- MCFG_MACHINE_RESET_OVERRIDE(s6_state, s6)
/* Video */
config.set_default_layout(layout_s6);
@@ -666,17 +660,19 @@ ROM_START(frpwr_l2)
ROM_LOAD("sound3.716", 0x4800, 0x0800, CRC(55a10d13) SHA1(521d4cdfb0ed8178b3594cedceae93b772a951a4))
ROM_END
-
-GAME( 1979, lzbal_l2, 0, s6, s6, s6_state, init_s6, ROT0, "Williams", "Laser Ball (L-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1979, lzbal_l2sp, lzbal_l2, s6, s6, s6_state, init_s6, ROT0, "Williams", "Laser Ball (L-2, PROM sound)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1980, lzbal_t2, lzbal_l2, s6, s6, s6_state, init_s6, ROT0, "Williams", "Laser Ball (T-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1980, scrpn_l1, 0, s6, s6, s6_state, init_s6, ROT0, "Williams", "Scorpion (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1980, scrpn_t1, scrpn_l1, s6, s6, s6_state, init_s6, ROT0, "Williams", "Scorpion (T-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1979, blkou_l1, 0, s6, s6, s6_state, init_s6, ROT0, "Williams", "Blackout (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1979, blkou_t1, blkou_l1, s6, s6, s6_state, init_s6, ROT0, "Williams", "Blackout (T-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1979, blkou_f1, blkou_l1, s6, s6, s6_state, init_s6, ROT0, "Williams", "Blackout (L-1, French Speech)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1979, grgar_l1, 0, s6, s6, s6_state, init_s6, ROT0, "Williams", "Gorgar (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1979, grgar_t1, grgar_l1, s6, s6, s6_state, init_s6, ROT0, "Williams", "Gorgar (T-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1980, frpwr_l6, 0, s6, s6, s6_state, init_s6, ROT0, "Williams", "Firepower (L-6)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
-GAME( 1980, frpwr_t6, frpwr_l6, s6, s6, s6_state, init_s6, ROT0, "Williams", "Firepower (T-6)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
-GAME( 1980, frpwr_l2, frpwr_l6, s6, s6, s6_state, init_s6, ROT0, "Williams", "Firepower (L-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
+} // anonymous namespace
+
+
+GAME( 1979, lzbal_l2, 0, s6, s6, s6_state, empty_init, ROT0, "Williams", "Laser Ball (L-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1979, lzbal_l2sp, lzbal_l2, s6, s6, s6_state, empty_init, ROT0, "Williams", "Laser Ball (L-2, PROM sound)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1980, lzbal_t2, lzbal_l2, s6, s6, s6_state, empty_init, ROT0, "Williams", "Laser Ball (T-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1980, scrpn_l1, 0, s6, s6, s6_state, empty_init, ROT0, "Williams", "Scorpion (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1980, scrpn_t1, scrpn_l1, s6, s6, s6_state, empty_init, ROT0, "Williams", "Scorpion (T-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1979, blkou_l1, 0, s6, s6, s6_state, empty_init, ROT0, "Williams", "Blackout (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1979, blkou_t1, blkou_l1, s6, s6, s6_state, empty_init, ROT0, "Williams", "Blackout (T-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1979, blkou_f1, blkou_l1, s6, s6, s6_state, empty_init, ROT0, "Williams", "Blackout (L-1, French Speech)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1979, grgar_l1, 0, s6, s6, s6_state, empty_init, ROT0, "Williams", "Gorgar (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1979, grgar_t1, grgar_l1, s6, s6, s6_state, empty_init, ROT0, "Williams", "Gorgar (T-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1980, frpwr_l6, 0, s6, s6, s6_state, empty_init, ROT0, "Williams", "Firepower (L-6)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
+GAME( 1980, frpwr_t6, frpwr_l6, s6, s6, s6_state, empty_init, ROT0, "Williams", "Firepower (T-6)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
+GAME( 1980, frpwr_l2, frpwr_l6, s6, s6, s6_state, empty_init, ROT0, "Williams", "Firepower (L-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
diff --git a/src/mame/drivers/s6a.cpp b/src/mame/drivers/s6a.cpp
index 57c0b05668b..1986c67c0ba 100644
--- a/src/mame/drivers/s6a.cpp
+++ b/src/mame/drivers/s6a.cpp
@@ -67,18 +67,19 @@ public:
, m_pia28(*this, "pia28")
, m_pia30(*this, "pia30")
, m_digits(*this, "digit%u", 0U)
+ , m_leds(*this, "led%u", 0U)
, m_swarray(*this, "SW.%u", 0U)
+ , m_dips(*this, "DS%u", 1U)
+ , m_io_snd(*this, "SND")
{ }
void s6a(machine_config &config);
- void init_s6a();
-
DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
protected:
- virtual void machine_start() override { m_digits.resolve(); }
+ virtual void machine_start() override;
virtual void device_timer(timer_instance const &timer) override;
private:
@@ -92,14 +93,14 @@ private:
uint8_t dips_r();
uint8_t switch_r();
void switch_w(uint8_t data);
- DECLARE_WRITE_LINE_MEMBER(pia22_ca2_w) { }; //ST5
- DECLARE_WRITE_LINE_MEMBER(pia22_cb2_w) { }; //ST-solenoids enable
- DECLARE_WRITE_LINE_MEMBER(pia24_ca2_w) { }; //ST2
- DECLARE_WRITE_LINE_MEMBER(pia24_cb2_w) { }; //ST1
- DECLARE_WRITE_LINE_MEMBER(pia28_ca2_w) { }; //diag leds enable
- DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; //ST6
- DECLARE_WRITE_LINE_MEMBER(pia30_ca2_w) { }; //ST4
- DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; //ST3
+ DECLARE_WRITE_LINE_MEMBER(pia22_ca2_w) { } //ST5
+ DECLARE_WRITE_LINE_MEMBER(pia22_cb2_w) { } //ST-solenoids enable
+ DECLARE_WRITE_LINE_MEMBER(pia24_ca2_w) { } //ST2
+ DECLARE_WRITE_LINE_MEMBER(pia24_cb2_w) { } //ST1
+ DECLARE_WRITE_LINE_MEMBER(pia28_ca2_w) { } //diag leds enable
+ DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { } //ST6
+ DECLARE_WRITE_LINE_MEMBER(pia30_ca2_w) { } //ST4
+ DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { } //ST3
DECLARE_WRITE_LINE_MEMBER(pia_irq);
void s6a_audio_map(address_map &map);
@@ -120,7 +121,10 @@ private:
required_device<pia6821_device> m_pia28;
required_device<pia6821_device> m_pia30;
output_finder<32> m_digits;
+ output_finder<2> m_leds;
required_ioport_array<8> m_swarray;
+ required_ioport_array<2> m_dips;
+ required_ioport m_io_snd;
};
void s6a_state::s6a_main_map(address_map &map)
@@ -255,7 +259,7 @@ void s6a_state::sol0_w(uint8_t data)
void s6a_state::sol1_w(uint8_t data)
{
- uint8_t sound_data = ioport("SND")->read();
+ uint8_t sound_data = m_io_snd->read();
if (BIT(data, 0))
sound_data &= 0xfe;
@@ -292,20 +296,9 @@ void s6a_state::lamp1_w(uint8_t data)
uint8_t s6a_state::dips_r()
{
- if (BIT(ioport("DIAGS")->read(), 4) )
- {
- switch (m_strobe)
- {
- case 0:
- return ioport("DS2")->read();
- case 1:
- return ioport("DS2")->read() << 4;
- case 2:
- return ioport("DS1")->read();
- case 3:
- return ioport("DS1")->read() << 4;
- }
- }
+ if (BIT(ioport("DIAGS")->read(), 4))
+ return m_dips[BIT(~m_strobe, 1)]->read() << (BIT(m_strobe, 0) ? 4 : 0);
+
return 0xff;
}
@@ -313,8 +306,8 @@ void s6a_state::dig0_w(uint8_t data)
{
m_strobe = data & 15;
m_data_ok = true;
- output().set_value("led0", !BIT(data, 4));
- output().set_value("led1", !BIT(data, 5));
+ m_leds[0] = !BIT(data, 4);
+ m_leds[1] = !BIT(data, 5);
}
void s6a_state::dig1_w(uint8_t data)
@@ -367,6 +360,15 @@ WRITE_LINE_MEMBER( s6a_state::pia_irq )
}
}
+void s6a_state::machine_start()
+{
+ m_digits.resolve();
+ m_leds.resolve();
+
+ m_irq_timer = timer_alloc(TIMER_IRQ);
+ m_irq_timer->adjust(attotime::from_ticks(980,3580000/4),1);
+}
+
void s6a_state::device_timer(timer_instance const &timer)
{
switch(timer.id())
@@ -390,12 +392,6 @@ void s6a_state::device_timer(timer_instance const &timer)
}
}
-void s6a_state::init_s6a()
-{
- m_irq_timer = timer_alloc(TIMER_IRQ);
- m_irq_timer->adjust(attotime::from_ticks(980,3580000/4),1);
-}
-
void s6a_state::s6a(machine_config &config)
{
/* basic machine hardware */
@@ -461,8 +457,8 @@ void s6a_state::s6a(machine_config &config)
m_pias->writepa_handler().set("dac", FUNC(dac_byte_interface::data_w));
m_pias->ca2_handler().set("hc55516", FUNC(hc55516_device::digit_w));
m_pias->cb2_handler().set("hc55516", FUNC(hc55516_device::clock_w));
- m_pias->irqa_handler().set_inputline("audiocpu", M6802_IRQ_LINE); // FIXME: needs an input merger
- m_pias->irqb_handler().set_inputline("audiocpu", M6802_IRQ_LINE);
+ m_pias->irqa_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE); // FIXME: needs an input merger
+ m_pias->irqb_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE);
}
@@ -522,10 +518,10 @@ ROM_START(alpok_f6)
ROM_LOAD("sound3.716", 0x4800, 0x0800, CRC(55a10d13) SHA1(521d4cdfb0ed8178b3594cedceae93b772a951a4))
ROM_END
-} // Anonymous namespace
+} // anonymous namespace
-GAME( 1980, algar_l1, 0, s6a, s6a, s6a_state, init_s6a, ROT0, "Williams", "Algar (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1980, alpok_l6, 0, s6a, s6a, s6a_state, init_s6a, ROT0, "Williams", "Alien Poker (L-6)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1980, alpok_l2, alpok_l6, s6a, s6a, s6a_state, init_s6a, ROT0, "Williams", "Alien Poker (L-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1980, alpok_f6, alpok_l6, s6a, s6a, s6a_state, init_s6a, ROT0, "Williams", "Alien Poker (L-6 French speech)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1980, algar_l1, 0, s6a, s6a, s6a_state, empty_init, ROT0, "Williams", "Algar (L-1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1980, alpok_l6, 0, s6a, s6a, s6a_state, empty_init, ROT0, "Williams", "Alien Poker (L-6)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1980, alpok_l2, alpok_l6, s6a, s6a, s6a_state, empty_init, ROT0, "Williams", "Alien Poker (L-2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
+GAME( 1980, alpok_f6, alpok_l6, s6a, s6a, s6a_state, empty_init, ROT0, "Williams", "Alien Poker (L-6 French speech)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/sag.cpp b/src/mame/drivers/sag.cpp
index 9a530c24bfd..8799ba83bb8 100644
--- a/src/mame/drivers/sag.cpp
+++ b/src/mame/drivers/sag.cpp
@@ -112,7 +112,7 @@ DEVICE_IMAGE_LOAD_MEMBER(sag_state::cart_load)
if (size != 0x1000 && size != 0x1100 && size != 0x2000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid ROM file size");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid ROM file size");
return image_init_result::FAIL;
}
@@ -125,7 +125,7 @@ DEVICE_IMAGE_LOAD_MEMBER(sag_state::cart_load)
// TMS1670 MCU
if (!image.loaded_through_softlist())
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Can only load TMS1670 type through softwarelist");
+ image.seterror(image_error::INVALIDIMAGE, "Can only load TMS1670 type through softwarelist");
return image_init_result::FAIL;
}
@@ -136,7 +136,7 @@ DEVICE_IMAGE_LOAD_MEMBER(sag_state::cart_load)
size = image.get_software_region_length("rom:mpla");
if (size != 867)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid MPLA file size");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid MPLA file size");
return image_init_result::FAIL;
}
memcpy(memregion("tms1k_cpu:mpla")->base(), image.get_software_region("rom:mpla"), size);
@@ -144,7 +144,7 @@ DEVICE_IMAGE_LOAD_MEMBER(sag_state::cart_load)
size = image.get_software_region_length("rom:opla");
if (size != 557)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid OPLA file size");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid OPLA file size");
return image_init_result::FAIL;
}
memcpy(memregion("tms1k_cpu:opla")->base(), image.get_software_region("rom:opla"), size);
diff --git a/src/mame/drivers/sbmjb.cpp b/src/mame/drivers/sbmjb.cpp
index 4b2d97be786..88fe5b3ad71 100644
--- a/src/mame/drivers/sbmjb.cpp
+++ b/src/mame/drivers/sbmjb.cpp
@@ -1,13 +1,18 @@
// license:BSD-3-Clause
// copyright-holders:
-/*
- Sonic Blast Man's Janken Battle (c) 1998 Taito
+/*
+ Sonic Blast Man's Janken Battle (ソニックブラストマンのジャンケンバトル) (c) 1998 Taito
Redemption game based on Janken, a Japanese game similar to Rock Paper Scissors
Video: https://www.youtube.com/watch?v=AFWLMHbpQz8
- A (possibly) one-off PCB design with the following main components:
+ Other undumped games believed to use the same hardware:
+ Bubblen Roulette (バブルンるーれっと) (c) 1997 Taito - video: https://www.youtube.com/watch?v=AaugRz3cqv0
+ Harikiri Junior Baseball (はりきりジュニアベースボール) (c) 1998 Taito - video: https://www.youtube.com/watch?v=eRZctnd8whE
+ Packy's Treasure Slot (パッキイのトレジャースロット) (c) 1997 Taito - video: https://www.youtube.com/watch?v=IPse14eGiqM
+
+ Main components:
2 x Z0840004PSC
1 x TC0091LVC (marked as TC0090LVC on PCB)
1 x YM2203C
@@ -30,8 +35,9 @@
#include "emu.h"
#include "cpu/z80/z80.h"
-#include "machine/te7750.h"
#include "machine/tc009xlvc.h"
+#include "machine/te7750.h"
+#include "machine/ticket.h"
#include "machine/timer.h"
#include "sound/okim6295.h"
#include "sound/ymopn.h"
@@ -181,7 +187,7 @@ void sbmjb_state::sbmjb(machine_config &config)
opn.irq_handler().set_inputline("audiocpu", 0);
opn.add_route(ALL_OUTPUTS, "mono", 0.30);
- OKIM6295(config, "oki", 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // pin not verified
+ OKIM6295(config, "oki", 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.5); // pin not verified
}
@@ -210,4 +216,4 @@ ROM_END
} // Anonymous namespace
-GAME( 1998, sbmjb, 0, sbmjb, sbmjb, sbmjb_state, empty_init, ROT0, "Taito", "Sonic Blast Man's Janken Battle (main ver. 1.1, video ver. 1.0)", MACHINE_NOT_WORKING )
+GAME( 1998, sbmjb, 0, sbmjb, sbmjb, sbmjb_state, empty_init, ROT0, "Taito Corporation", "Sonic Blast Man's Janken Battle (main ver. 1.1, video ver. 1.0)", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/schexx4gen.cpp b/src/mame/drivers/schexx4gen.cpp
index d465fae1fef..2c0f8cdaa1f 100644
--- a/src/mame/drivers/schexx4gen.cpp
+++ b/src/mame/drivers/schexx4gen.cpp
@@ -25,15 +25,23 @@ public:
void schexx(machine_config &config);
private:
+ void mem_map(address_map &map);
+
required_device<mc68hc11_cpu_device> m_maincpu;
};
+void schexx_state::mem_map(address_map &map)
+{
+ map(0xe000, 0xffff).rom().region("program", 0x7e000);
+}
+
INPUT_PORTS_START(schexx)
INPUT_PORTS_END
void schexx_state::schexx(machine_config &config)
{
MC68HC11A1(config, m_maincpu, 8_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &schexx_state::mem_map);
}
ROM_START(schexx)
diff --git a/src/mame/drivers/segaatom.cpp b/src/mame/drivers/segaatom.cpp
index aa337cc8531..9ba749b2b0c 100644
--- a/src/mame/drivers/segaatom.cpp
+++ b/src/mame/drivers/segaatom.cpp
@@ -127,7 +127,7 @@ void atom2_state::atom2(machine_config &config)
ROM_START( spongbob )
ROM_REGION( 0x2000000, "maincpu", ROMREGION_ERASE00 )
// Main board
- ROM_LOAD("ic4", 0x0000000, 0x80000, NO_DUMP )
+ ROM_LOAD("epr-24430.ic4", 0x0000000, 0x80000, NO_DUMP )
// ROM board
ROM_LOAD("ic1", 0x0000000, 0x1000000, CRC(607a0989) SHA1(17706df8400e13800edd1d1cf45047d1c970d0b8) )
diff --git a/src/mame/drivers/segac2.cpp b/src/mame/drivers/segac2.cpp
index dfb361f68d5..1be460ff039 100644
--- a/src/mame/drivers/segac2.cpp
+++ b/src/mame/drivers/segac2.cpp
@@ -5,8 +5,6 @@
Sega System C (System 14)/C2 Driver
driver by David Haywood and Aaron Giles
---------------------------------------
- Last Update 15 Nov 2005
-
Sega's C2 was used between 1989 and 1994, the hardware being very similar to that
used by the Sega MegaDrive/Genesis Home Console Sega produced around the same time.
@@ -33,7 +31,7 @@
1992 Tant-R (Korea) Sega ? C2
1992 Waku Waku Marine Sega 317-0140 C2
1993 SegaSonic Popcorn Shop Sega 317-0140 C2
- 1993 Sega Sonic Cosmo Fighter Sega 317-0140 C2
+ 1993 SegaSonic Cosmo Fighter Sega 317-0140 C2
1994 PotoPoto (Japan) Sega 317-0218 C2
1994 Stack Columns (Japan) Sega 317-0219 C2
1994 Stack Columns (World) Sega 317-0223 C2
@@ -49,7 +47,7 @@
1996 Print Club (Vol.5) Atlus ? C2
- Notes:
+ Notes:
Bloxeed doesn't Read from the Protection Chip at all; all of the other games do.
Currently the protection chip is mostly understood, and needs a table of 256
4-bit values for each game. In all cases except for Poto Poto and Puyo Puyo 2,
@@ -60,8 +58,11 @@
version of the board with it, this could be completely wrong but it doesn't really
matter anyway.
- Bugs: Puyo Puyo ends up with a black screen after doing memory tests
- Battery-backed RAM needs to be figured out
+ TODO: - Puyo Puyo ends up with a black screen after doing memory tests
+ - Battery-backed RAM needs to be figured out
+ - Correct ROM labels for: ssonicbr, ooparts, headonch
+ - Does ooparts actually use upd samples? PCB has the same rom as tfrceac
+ - Is the joystick hack for ooparts unofficial, or done by Sega for location test?
Thanks: (in no particular order) to any MameDev that helped me out .. (OG, Mish etc.)
Charles MacDonald for his C2Emu .. without it working out what were bugs in my code
@@ -69,23 +70,24 @@
Razoola & Antiriad .. for helping teach me some 68k ASM needed to work out just why
the games were crashing :)
Sega for producing some Fantastic Games...
+ The Japanese magazine that proudly previewed OOPArts as "FARTS"
and anyone else who knows they've contributed :)
***********************************************************************************************/
-
#include "emu.h"
-#include "includes/megadriv.h"
#include "includes/segaipt.h"
#include "cpu/m68000/m68000.h"
#include "machine/nvram.h"
#include "machine/315_5296.h"
-#include "sound/okim6295.h"
#include "sound/sn76496.h"
#include "sound/upd7759.h"
#include "sound/ymopn.h"
+#include "video/315_5313.h"
+
#include "emupal.h"
+#include "screen.h"
#include "speaker.h"
@@ -95,37 +97,36 @@ namespace {
#define XL2_CLOCK XTAL(53'693'175)
-#define LOG_PROTECTION 1
+#define LOG_PROTECTION 0
#define LOG_PALETTE 0
#define LOG_IOCHIP 0
typedef device_delegate<int (int in)> segac2_prot_delegate;
-// does this need to inherit from md_base? really we only need the VDP and some basics like the maincpu
-class segac2_state : public md_base_state
+class segac2_state : public driver_device
{
public:
segac2_state(const machine_config &mconfig, device_type type, const char *tag)
- : md_base_state(mconfig, type, tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
, m_paletteram(*this, "paletteram")
+ , m_vdp(*this, "gen_vdp")
+ , m_screen(*this, "screen")
, m_upd_region(*this, "upd")
- , m_prot_func(*this)
- , m_sound_banks(0)
, m_upd7759(*this, "upd")
- , m_screen(*this, "screen")
+ , m_ymsnd(*this, "ymsnd")
, m_palette(*this, "palette")
, m_io(*this, "io")
- {
- }
+ , m_prot_func(*this)
+ { }
void segac2(machine_config &config);
void segac(machine_config &config);
- void segac2_tfrceacjpb(machine_config &config);
- void segac2_ribbit(machine_config &config);
+ void tfrceacjpb(machine_config &config);
+ void ribbit(machine_config &config);
- void init_c2boot();
- void init_bloxeedc();
+ void init_noprot();
void init_columns();
void init_columns2();
void init_tfrceac();
@@ -145,24 +146,22 @@ public:
void init_ichirjbl();
void init_puyopuy2();
void init_zunkyou();
- void init_pclub();
- void init_pclubj();
- void init_pclubjv2();
- void init_pclubjv4();
- void init_pclubjv5();
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
-private:
- // for Print Club only
- int m_cam_data;
-
int m_segac2_enable_display;
+ required_device<m68000_base_device> m_maincpu;
required_shared_ptr<uint16_t> m_paletteram;
+ required_device<sega315_5313_device> m_vdp;
+ required_device<screen_device> m_screen;
optional_memory_region m_upd_region;
+ optional_device<upd7759_device> m_upd7759;
+ required_device<ym3438_device> m_ymsnd;
+ required_device<palette_device> m_palette;
+ required_device<sega_315_5296_device> m_io;
/* protection-related tracking */
segac2_prot_delegate m_prot_func; /* emulation of protection chip */
@@ -178,8 +177,7 @@ private:
/* sound-related variables */
uint8_t m_sound_banks; /* number of sound banks */
- void segac2_common_init(segac2_prot_delegate prot_func);
-
+ void set_prot_func(segac2_prot_delegate prot_func) { m_prot_func = prot_func; }
uint32_t screen_update_segac2_new(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
int m_segac2_bg_pal_lookup[4];
@@ -189,26 +187,21 @@ private:
DECLARE_WRITE_LINE_MEMBER(vdp_sndirqline_callback_c2);
DECLARE_WRITE_LINE_MEMBER(vdp_lv6irqline_callback_c2);
DECLARE_WRITE_LINE_MEMBER(vdp_lv4irqline_callback_c2);
+ IRQ_CALLBACK_MEMBER(int_callback);
uint8_t io_portc_r();
void io_portd_w(uint8_t data);
void io_porth_w(uint8_t data);
- void segac2_upd7759_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+ void segac2_upd7759_w(uint8_t data);
uint16_t palette_r(offs_t offset);
void palette_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void control_w(uint8_t data);
uint8_t prot_r();
void prot_w(uint8_t data);
void counter_timer_w(uint8_t data);
- uint16_t printer_r();
- void print_club_camera_w(uint16_t data);
uint16_t ichirjbl_prot_r();
DECLARE_WRITE_LINE_MEMBER(segac2_irq2_interrupt);
- optional_device<upd7759_device> m_upd7759;
- optional_device<screen_device> m_screen;
- required_device<palette_device> m_palette;
- required_device<sega_315_5296_device> m_io;
int prot_func_dummy(int in);
int prot_func_columns(int in);
@@ -228,30 +221,57 @@ private:
int prot_func_ichirk(int in);
int prot_func_puyopuy2(int in);
int prot_func_zunkyou(int in);
- int prot_func_pclub(int in);
- int prot_func_pclubjv2(int in);
- int prot_func_pclubjv4(int in);
- int prot_func_pclubjv5(int in);
- void main_map(address_map &map);
+ void segac_map(address_map &map);
+ void segac2_map(address_map &map);
};
-class segac2_pc_state : public segac2_state
+class wwmarine_state : public segac2_state
{
public:
- using segac2_state::segac2_state;
- static constexpr feature_type unemulated_features() { return feature::CAMERA | feature::PRINTER; }
+ wwmarine_state(const machine_config &mconfig, device_type type, const char *tag)
+ : segac2_state(mconfig, type, tag)
+ , m_wheel(*this, "WHEEL")
+ { }
+
+ ioport_value read_wheel() { return m_wheel->read() | ((m_screen->frame_number() & 1) * 3); }
+
+private:
+ required_ioport m_wheel;
};
-/******************************************************************************
- Machine init
-*******************************************************************************
+class pclub_state : public segac2_state
+{
+public:
+ pclub_state(const machine_config &mconfig, device_type type, const char *tag)
+ : segac2_state(mconfig, type, tag)
+ { }
+
+ static constexpr feature_type unemulated_features() { return feature::CAMERA | feature::PRINTER; }
+
+ void init_pclub();
+ void init_pclubj();
+ void init_pclubjv2();
+ void init_pclubjv4();
+ void init_pclubjv5();
+
+private:
+ int m_cam_data;
- This is called at init time, when it's safe to create a timer. We use
- it to prime the scanline interrupt timer.
+ uint16_t printer_r();
+ void print_club_camera_w(uint16_t data);
+
+ int prot_func_pclub(int in);
+ int prot_func_pclubjv2(int in);
+ int prot_func_pclubjv4(int in);
+ int prot_func_pclubjv5(int in);
+};
+
+/******************************************************************************
+ Machine start/reset
******************************************************************************/
void segac2_state::machine_start()
@@ -259,14 +279,23 @@ void segac2_state::machine_start()
save_item(NAME(m_prot_write_buf));
save_item(NAME(m_prot_read_buf));
+ // determine how many sound banks
+ if (m_upd_region != nullptr)
+ m_sound_banks = m_upd_region->bytes() / 0x20000;
+ else
+ m_sound_banks = 0;
+
+ // init the VDP
+ m_vdp->set_use_cram(0); // C2 uses its own palette ram
+ m_vdp->set_vdp_pal(false);
+ m_vdp->set_framerate(60);
+ m_vdp->set_total_scanlines(262);
m_vdp->stop_timers();
}
void segac2_state::machine_reset()
{
-// megadriv_scanline_timer = machine().device<timer_device>("md_scan_timer");
-// megadriv_scanline_timer->adjust(attotime::zero);
m_segac2_bg_pal_lookup[0] = 0x00;
m_segac2_bg_pal_lookup[1] = 0x10;
m_segac2_bg_pal_lookup[2] = 0x20;
@@ -279,13 +308,6 @@ void segac2_state::machine_reset()
m_vdp->device_reset_old();
- /* determine how many sound banks */
- m_sound_banks = 0;
- if (m_upd_region != nullptr)
- {
- m_sound_banks = m_upd_region->bytes() / 0x20000;
- }
-
/* reset the protection */
m_prot_write_buf = 0;
m_prot_read_buf = 0;
@@ -313,19 +335,11 @@ void segac2_state::machine_reset()
******************************************************************************/
/* handle writes to the UPD7759 */
-void segac2_state::segac2_upd7759_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+void segac2_state::segac2_upd7759_w(uint8_t data)
{
- /* make sure we have a UPD chip */
- if (m_upd7759 == nullptr)
- return;
-
- /* only works if we're accessing the low byte */
- if (ACCESSING_BITS_0_7)
- {
- m_upd7759->port_w(data & 0xff);
- m_upd7759->start_w(0);
- m_upd7759->start_w(1);
- }
+ m_upd7759->port_w(data);
+ m_upd7759->start_w(0);
+ m_upd7759->start_w(1);
}
@@ -636,12 +650,12 @@ void segac2_state::counter_timer_w(uint8_t data)
******************************************************************************/
-uint16_t segac2_state::printer_r()
+uint16_t pclub_state::printer_r()
{
return m_cam_data;
}
-void segac2_state::print_club_camera_w(uint16_t data)
+void pclub_state::print_club_camera_w(uint16_t data)
{
m_cam_data = data;
}
@@ -657,7 +671,7 @@ void segac2_state::print_club_camera_w(uint16_t data)
******************************************************************************/
-void segac2_state::main_map(address_map &map)
+void segac2_state::segac_map(address_map &map)
{
map(0x000000, 0x1fffff).rom();
map(0x800001, 0x800001).mirror(0x13fdfe).rw(FUNC(segac2_state::prot_r), FUNC(segac2_state::prot_w));
@@ -670,6 +684,12 @@ void segac2_state::main_map(address_map &map)
map(0xe00000, 0xe0ffff).mirror(0x1f0000).ram().share("nvram");
}
+void segac2_state::segac2_map(address_map &map)
+{
+ segac_map(map);
+ map(0x880000, 0x880001).mirror(0x13fefe).w(FUNC(segac2_state::segac2_upd7759_w)).umask16(0x00ff);
+}
+
/******************************************************************************
Input Ports
@@ -982,8 +1002,7 @@ static INPUT_PORTS_START( wwmarine )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) // Handle Left - Acts like a button, holding LEFT doesn't work - "tapping" left moves player
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) // Handle Right - Acts like a button, holding RIGHT doesn't work - "tapping" right moves player
+ PORT_BIT( 0xc0, 0x00, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(wwmarine_state, read_wheel)
PORT_MODIFY("P2")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
@@ -1008,12 +1027,57 @@ static INPUT_PORTS_START( wwmarine )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
//"SW2:4" unused
- PORT_DIPNAME( 0x10, 0x10, "Cedit Mode" ) PORT_DIPLOCATION("SW2:5")
+ PORT_DIPNAME( 0x10, 0x10, "Credit Mode" ) PORT_DIPLOCATION("SW2:5")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
//"SW2:6" unused
//"SW2:7" unused
//"SW2:7" unused
+
+ PORT_START("WHEEL") // free-spinning wheel, some mechanism causing the input to trigger repeatedly
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( sonicfgt )
+ PORT_INCLUDE( systemc_generic )
+
+ PORT_MODIFY("P1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // shot
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) // transform
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) // lever
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+
+ PORT_MODIFY("P2")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_CUSTOM ) // limit sw
+ PORT_BIT( 0xdf, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_MODIFY("SERVICE")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_SERVICE_NO_TOGGLE( 0x04, IP_ACTIVE_LOW )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_MODIFY("DSW")
+ PORT_DIPNAME( 0x01, 0x01, "Credit Mode" ) PORT_DIPLOCATION("SW2:1")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ //"SW2:2" unused
+ //"SW2:3" unused
+ //"SW2:4" unused
+ //"SW2:5" unused
+ //"SW2:6" unused
+ //"SW2:7" unused
+ //"SW2:8" unused
INPUT_PORTS_END
@@ -1315,6 +1379,101 @@ static INPUT_PORTS_START( ichir )
INPUT_PORTS_END
+static INPUT_PORTS_START( headonch )
+ PORT_INCLUDE( systemc_generic )
+
+ PORT_MODIFY("P1")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* Button 2 Unused */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* Button 3 Unused */
+
+ PORT_MODIFY("P2")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* Button 2 Unused */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* Button 3 Unused */
+
+ PORT_MODIFY("DSW")
+ PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:1")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x06, 0x06, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:2,3")
+ PORT_DIPSETTING( 0x04, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( Medium ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
+ PORT_DIPNAME( 0x18, 0x18, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:4,5")
+ PORT_DIPSETTING( 0x10, "2" )
+ PORT_DIPSETTING( 0x18, "3" )
+ PORT_DIPSETTING( 0x08, "4" )
+ PORT_DIPSETTING( 0x00, "5" )
+ //"SW2:6" unused
+ //"SW2:7" unused
+ //"SW2:8" unused
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( ssonicbr )
+ PORT_INCLUDE( systemc_generic )
+
+ PORT_MODIFY("P1")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* Button 2 Unused */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* Button 3 Unused */
+
+ PORT_MODIFY("P2")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* Button 2 Unused */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* Button 3 Unused */
+
+ PORT_MODIFY("DSW")
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:1")
+ PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x06, 0x06, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:2,3")
+ PORT_DIPSETTING( 0x04, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( Medium ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
+ //"SW2:4" unused
+ //"SW2:5" unused
+ //"SW2:6" unused
+ //"SW2:7" unused
+ //"SW2:8" unused
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( ooparts ) // testmode expects controls similar to twinsqua
+ PORT_INCLUDE( systemc_generic )
+
+ PORT_MODIFY("P1")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* Button 3 Unused */
+
+ PORT_MODIFY("P2")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* Button 3 Unused */
+
+ PORT_MODIFY("SERVICE") // "shot" button in testmode (needed for sound test)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+
+ PORT_MODIFY("DSW")
+ PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:1")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x06, 0x06, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:2,3")
+ PORT_DIPSETTING( 0x04, "2" )
+ PORT_DIPSETTING( 0x06, "3" )
+ PORT_DIPSETTING( 0x02, "4" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPNAME( 0x18, 0x18, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:4,5")
+ PORT_DIPSETTING( 0x10, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x18, DEF_STR( Medium ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
+ PORT_DIPNAME( 0x60, 0x60, "Region" ) PORT_DIPLOCATION("SW2:6,7") // undocumented
+ PORT_DIPSETTING( 0x60, DEF_STR( Japan ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( USA ) )
+ PORT_DIPSETTING( 0x20, "Export" )
+ PORT_DIPSETTING( 0x00, "Export" )
+ //"SW2:8" unused
+INPUT_PORTS_END
+
+
static INPUT_PORTS_START( bloxeedc )
PORT_INCLUDE( systemc_generic )
@@ -1487,31 +1646,16 @@ static INPUT_PORTS_START( pclubjv2 )
PORT_DIPUNUSED_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW5:8" )
INPUT_PORTS_END
-/******************************************************************************
- Sound interfaces
-******************************************************************************/
-
-WRITE_LINE_MEMBER(segac2_state::segac2_irq2_interrupt)
-{
- //printf("sound irq %d\n", state);
- m_maincpu->set_input_line(2, state ? ASSERT_LINE : CLEAR_LINE);
-}
-
/******************************************************************************
- Machine Drivers
+ Screen update
*******************************************************************************
- General Overview
- M68000 @ 10MHz (Main Processor)
- YM3438 (Fm Sound)
- SN76489 (PSG, Noise, Part of the VDP)
- UPD7759 (Sample Playback, C-2 Only)
+ C2 doesn't use the internal VDP CRAM, instead it uses the digital
+ output of the chip and applies it's own external colour circuity.
******************************************************************************/
-// C2 doesn't use the internal VDP CRAM, instead it uses the digital output of the chip
-// and applies it's own external colour circuity
uint32_t segac2_state::screen_update_segac2_new(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
const pen_t *paldata = m_palette->pens();
@@ -1569,7 +1713,15 @@ uint32_t segac2_state::screen_update_segac2_new(screen_device &screen, bitmap_rg
}
+/******************************************************************************
+ Interrupt handling
+******************************************************************************/
+WRITE_LINE_MEMBER(segac2_state::segac2_irq2_interrupt)
+{
+ //printf("sound irq %d\n", state);
+ m_maincpu->set_input_line(2, state ? ASSERT_LINE : CLEAR_LINE);
+}
// the main interrupt on C2 comes from the vdp line used to drive the z80 interrupt on a regular genesis(!)
WRITE_LINE_MEMBER(segac2_state::vdp_sndirqline_callback_c2)
@@ -1593,18 +1745,39 @@ WRITE_LINE_MEMBER(segac2_state::vdp_lv4irqline_callback_c2)
m_maincpu->set_input_line(4, CLEAR_LINE);
}
-/*
+/* Callback when the 68k takes an IRQ */
+IRQ_CALLBACK_MEMBER(segac2_state::int_callback)
+{
+ if (irqline == 4)
+ m_vdp->vdp_clear_irq4_pending();
+
+ return (0x60 + irqline * 4) / 4; // vector address
+}
+
+
+/******************************************************************************
+ Machine Drivers
+*******************************************************************************
+
+ General Overview
+ M68000 @ 10MHz (Main Processor)
+ YM3438 (Fm Sound)
+ SN76489 (PSG, Noise, Part of the VDP)
+ UPD7759 (Sample Playback, C-2 Only)
+
sound output balance (tfrceac)
- reference : https://youtu.be/AOmeWp9qe5E
- reference 2 : https://youtu.be/Tq8VkJYmij8
+ reference 1: https://youtu.be/AOmeWp9qe5E
+ reference 2: https://youtu.be/Tq8VkJYmij8
reference 3: https://youtu.be/VId_HWdNuyA
-*/
+
+******************************************************************************/
+
void segac2_state::segac(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, XL2_CLOCK/6);
- m_maincpu->set_addrmap(AS_PROGRAM, &segac2_state::main_map);
- m_maincpu->set_irq_acknowledge_callback(FUNC(md_base_state::genesis_int_callback));
+ m_maincpu->set_addrmap(AS_PROGRAM, &segac2_state::segac_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(segac2_state::int_callback));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); // borencha requires 0xff fill or there is no sound (it lacks some of the init code of the borench set)
@@ -1625,50 +1798,49 @@ void segac2_state::segac(machine_config &config)
m_vdp->lv6_irq().set(FUNC(segac2_state::vdp_lv6irqline_callback_c2));
m_vdp->lv4_irq().set(FUNC(segac2_state::vdp_lv4irqline_callback_c2));
m_vdp->set_alt_timing(1);
- m_vdp->set_screen("megadriv");
+ m_vdp->set_screen("screen");
m_vdp->add_route(ALL_OUTPUTS, "mono", 0.50);
m_vdp->set_palette(m_palette);
- TIMER(config, "scantimer").configure_scanline("gen_vdp", FUNC(sega315_5313_device::megadriv_scanline_timer_callback_alt_timing), "megadriv", 0, 1);
+ TIMER(config, "scantimer").configure_scanline("gen_vdp", FUNC(sega315_5313_device::megadriv_scanline_timer_callback_alt_timing), "screen", 0, 1);
- screen_device &screen(SCREEN(config, "megadriv", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(double(XL2_CLOCK.value()) / 10.0 / 262.0 / 342.0); // same as SMS?
-// screen.set_refresh_hz(double(XL2_CLOCK.value()) / 8.0 / 262.0 / 427.0); // or 427 Htotal?
- screen.set_size(512, 262);
- screen.set_visarea(0, 32*8-1, 0, 28*8-1);
- screen.set_screen_update(FUNC(segac2_state::screen_update_segac2_new));
- screen.screen_vblank().set(FUNC(segac2_state::screen_vblank_megadriv));
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(double(XL2_CLOCK.value()) / 10.0 / 262.0 / 342.0); // same as SMS?
+// m_screen->set_refresh_hz(double(XL2_CLOCK.value()) / 8.0 / 262.0 / 427.0); // or 427 Htotal?
+ m_screen->set_size(512, 262);
+ m_screen->set_visarea(0, 32*8-1, 0, 28*8-1);
+ m_screen->set_screen_update(FUNC(segac2_state::screen_update_segac2_new));
PALETTE(config, m_palette).set_entries(2048*3);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- ym3438_device &ymsnd(YM3438(config, "ymsnd", XL2_CLOCK/7));
- ymsnd.irq_handler().set(FUNC(segac2_state::segac2_irq2_interrupt));
- ymsnd.add_route(0, "mono", 0.50);
+ YM3438(config, m_ymsnd, XL2_CLOCK/7);
+ m_ymsnd->irq_handler().set(FUNC(segac2_state::segac2_irq2_interrupt));
+ m_ymsnd->add_route(0, "mono", 0.50);
/* right channel not connected */
}
-
void segac2_state::segac2(machine_config &config)
{
segac(config);
/* basic machine hardware */
+ m_maincpu->set_addrmap(AS_PROGRAM, &segac2_state::segac2_map);
subdevice<sega_315_5296_device>("io")->out_cnt1_callback().set(m_upd7759, FUNC(upd7759_device::reset_w));
/* sound hardware */
UPD7759(config, m_upd7759, XL1_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.50);
}
-void segac2_state::segac2_tfrceacjpb(machine_config& config)
+void segac2_state::tfrceacjpb(machine_config& config)
{
segac2(config);
m_io->set_ddr_override(0xf); // game erroneously writes 0x58 to DDR
}
-void segac2_state::segac2_ribbit(machine_config& config)
+void segac2_state::ribbit(machine_config& config)
{
segac2(config);
@@ -1686,7 +1858,6 @@ void segac2_state::segac2_ribbit(machine_config& config)
******************************************************************************/
-
/* ----- System C Games ----- */
ROM_START( bloxeedc ) /* Bloxeed (C System Version) (c)1989 Sega / Elorg */
@@ -1848,7 +2019,6 @@ ROM_START( tfrceacjpb ) // protection chip simply marked T-FORCE (not used outsi
ROM_END
-
ROM_START( tfrceacb ) /* Thunder Force AC (Bootleg) (c)1990 Technosoft / Sega */
ROM_REGION( 0x200000, "maincpu", 0 )
ROM_LOAD16_BYTE( "4.bin", 0x000000, 0x040000, CRC(eba059d3) SHA1(7bc04401f9a138fa151ac09a528b70acfb2021e3) )
@@ -1891,6 +2061,17 @@ ROM_START( wwmarine ) /* Waku Waku Marine (c)1992 Sega - 834-9082 WAKUWAKU MARI
ROM_LOAD( "epr-15095.ic4", 0x000000, 0x040000, CRC(df13755b) SHA1(177aac7aaadc36e14dbcdf12bd42dbe70b3edd49) )
ROM_END
+
+ROM_START( ssonicbr ) // hack: supposedly the data ROM mapping was modified
+ ROM_REGION( 0x200000, "maincpu", 0 )
+ ROM_LOAD16_BYTE( "ssonicbr.ic32", 0x000000, 0x040000, CRC(cf254ecd) SHA1(4bb295ec80f8ddfeab4e360eebf12c5e2dfb9800) )
+ ROM_LOAD16_BYTE( "ssonicbr.ic31", 0x000001, 0x040000, CRC(03709746) SHA1(0b457f557da77acd3f43950428117c1decdfaf26) )
+
+ ROM_REGION( 0x020000, "upd", 0 )
+ ROM_LOAD( "ssonicbr.ic4", 0x000000, 0x020000, CRC(78e56a51) SHA1(8a72c12975cd74919b4337e0f681273e6b5cbbc6) )
+ROM_END
+
+
ROM_START( anpanman ) /* Sega Soreike! Anpanman Popcorn Koujou (Rev.B) (c)1993 Sega - 834-8795-01 (EMP5032 labeled 317-0140) */
ROM_REGION( 0x200000, "maincpu", 0 )
ROM_LOAD16_BYTE( "epr-14804b.ic32", 0x000000, 0x040000, CRC(7ce88c49) SHA1(959ee459a5b4a6324488a935fa6a48e38ce93464) ) // 27C020
@@ -1903,7 +2084,7 @@ ROM_START( anpanman ) /* Sega Soreike! Anpanman Popcorn Koujou (Rev.B) (c)1993 S
ROM_END
-ROM_START( sonicpop ) /* Sega Sonic Popcorn Shop (Rev.B) (c)1993 Sega - 834-9555-02 (EMP5032 labeled 317-0140) */
+ROM_START( sonicpop ) /* SegaSonic Popcorn Shop (Rev.B) (c)1993 Sega - 834-9555-02 (EMP5032 labeled 317-0140) */
ROM_REGION( 0x200000, "maincpu", 0 )
ROM_LOAD16_BYTE( "epr-14592b.ic32", 0x000000, 0x040000, CRC(bac586a1) SHA1(0208213bfa1a5093e76edb1a7e0ba5ebc862801d) )
ROM_LOAD16_BYTE( "epr-15491b.ic31", 0x000001, 0x040000, CRC(527106c3) SHA1(97f08006bba4b87c304c7ad3b1480b77e99dff10) )
@@ -1915,7 +2096,7 @@ ROM_START( sonicpop ) /* Sega Sonic Popcorn Shop (Rev.B) (c)1993 Sega - 834-9555
ROM_END
-ROM_START( sonicfgt ) /* Sega Sonic Cosmo Fighter (c)1993 Sega - 834-10082 930719-1755T (EMP5032 labeled 317-0140) */
+ROM_START( sonicfgt ) /* SegaSonic Cosmo Fighter (c)1993 Sega - 834-10082 930719-1755T (EMP5032 labeled 317-0140) */
ROM_REGION( 0x200000, "maincpu", 0 )
ROM_LOAD16_BYTE( "epr-16001.ic32", 0x000000, 0x040000, CRC(8ed1dc11) SHA1(cd1cb6066c2ff159bec88802bc4b7ca7fff2ed71) )
ROM_LOAD16_BYTE( "epr-16000.ic31", 0x000001, 0x040000, CRC(1440caec) SHA1(9e50c28544d6c42cdc7d3ae0f321670fed68fedb) )
@@ -2003,6 +2184,18 @@ ROM_START( tantrbl4 ) // extremely similar to tantrbl, but in this one the card
ROM_END
+ROM_START( ooparts ) // hack: modified to be playable with digital joystick
+ ROM_REGION( 0x200000, "maincpu", 0 )
+ ROM_LOAD16_BYTE( "ooparts.ic32", 0x000000, 0x080000, CRC(8dcf2940) SHA1(f72630e8a26e7f2089da56878a1599268c355246) )
+ ROM_LOAD16_BYTE( "ooparts.ic31", 0x000001, 0x080000, CRC(35381899) SHA1(524f6e1b1292542079589275e20f45c2eb68605c) )
+ ROM_LOAD16_BYTE( "ooparts.ic34", 0x100000, 0x080000, CRC(7192ac29) SHA1(d3028a9bbb7faa733285cf7e47fd840ec0d0bf69) )
+ ROM_LOAD16_BYTE( "ooparts.ic33", 0x100001, 0x080000, CRC(42755dc2) SHA1(cd0aa79418b922266c5d41bf24b9136f9f105dc5) )
+
+ ROM_REGION( 0x040000, "upd", 0 )
+ ROM_LOAD( "epr-13655.ic4", 0x000000, 0x040000, CRC(e09961f6) SHA1(e109b5f41502b765d191f22e3bbcff97d6defaa1) )
+ROM_END
+
+
ROM_START( puyo ) /* Puyo Puyo (c)1992 Sega / Compile */
ROM_REGION( 0x200000, "maincpu", 0 )
ROM_LOAD16_BYTE( "epr-15198.ic32", 0x000000, 0x020000, CRC(9610d80c) SHA1(1ffad09d3369c1942d4db611c41bae47d08c7564) )
@@ -2160,6 +2353,18 @@ ROM_START( zunkyou ) /* Zunzunkyou no Yabou (c)1994 Sega - 834-10857 (EMP5032 l
ROM_END
+ROM_START( headonch ) // hack: protection routine was removed
+ ROM_REGION( 0x200000, "maincpu", 0 )
+ ROM_LOAD16_BYTE( "headonch.ic32", 0x000000, 0x080000, CRC(091cf538) SHA1(04673678f543743b395edea39ad4ee6177436dc0) )
+ ROM_LOAD16_BYTE( "headonch.ic31", 0x000001, 0x080000, CRC(91f3b5f1) SHA1(15cbe7a172dde7de7b73f0c9eeddfee41e8d1f80) )
+ ROM_LOAD16_BYTE( "headonch.ic34", 0x100000, 0x080000, CRC(d8dc6323) SHA1(e7e891324764641691dcb63e5222f2ed9207fb96) )
+ ROM_LOAD16_BYTE( "headonch.ic33", 0x100001, 0x080000, CRC(3268e38b) SHA1(10ded2be01465014ca9e6c64ffab1190ec985359) )
+
+ ROM_REGION( 0x040000, "upd", 0 )
+ ROM_LOAD( "headonch.ic4", 0x000000, 0x040000, CRC(90af7301) SHA1(227227cb5d0df6612bac7b4c94b99e2287686ccd) )
+ROM_END
+
+
ROM_START( pclubj ) /* Print Club (c)1995 Atlus */
ROM_REGION( 0x200000, "maincpu", 0 )
ROM_LOAD16_BYTE( "epr18171.32", 0x000000, 0x080000, CRC(6c8eb8e2) SHA1(bbd885a83269524215c1d8470544086e3e82c05c) )
@@ -2246,15 +2451,6 @@ it should be, otherwise I don't see how the formula could be computed.
******************************************************************************/
-void segac2_state::segac2_common_init(segac2_prot_delegate prot_func)
-{
- init_megadriv_c2();
- m_prot_func = prot_func;
-
- if (m_upd7759 != nullptr)
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x880000, 0x880001, 0, 0x13fefe, 0, write16s_delegate(*this, FUNC(segac2_state::segac2_upd7759_w)));
-}
-
int segac2_state::prot_func_dummy(int in)
{
return 0x0;
@@ -2446,12 +2642,12 @@ int segac2_state::prot_func_zunkyou(int in)
return (b3 << 3) | (b2 << 2) | (b1 << 1) | b0;
}
-int segac2_state::prot_func_pclub(int in)
+int pclub_state::prot_func_pclub(int in)
{
return 0xf;
}
-int segac2_state::prot_func_pclubjv2(int in)
+int pclub_state::prot_func_pclubjv2(int in)
{
int const b0 = (BIT( in,3) && BIT(~in,4)) ^ ((BIT(~in,1) && BIT(~in,7)) || BIT( in,6));
int const b1 = (BIT( in,0) && BIT( in,5)) ^ (BIT( in,2) && BIT(~in,6));
@@ -2461,7 +2657,7 @@ int segac2_state::prot_func_pclubjv2(int in)
return (b3 << 3) | (b2 << 2) | (b1 << 1) | b0;
}
-int segac2_state::prot_func_pclubjv4(int in)
+int pclub_state::prot_func_pclubjv4(int in)
{
int const b0 = (BIT(~in,2) && BIT( in,4)) ^ (BIT( in,1) && BIT(~in,6) && BIT(~in,3));
int const b1 = (BIT(~in,3) && BIT(~in,4)) ^ (BIT( in,0) && BIT( in,5) && BIT(~in,6));
@@ -2471,7 +2667,7 @@ int segac2_state::prot_func_pclubjv4(int in)
return (b3 << 3) | (b2 << 2) | (b1 << 1) | b0;
}
-int segac2_state::prot_func_pclubjv5(int in)
+int pclub_state::prot_func_pclubjv5(int in)
{
int const b0 = (BIT(~in,1) && BIT( in,5)) ^ (BIT(~in,2) && BIT(~in,6));
int const b1 = (BIT(~in,0) && BIT( in,4)) ^ (BIT(~in,3) && BIT(~in,7));
@@ -2482,97 +2678,92 @@ int segac2_state::prot_func_pclubjv5(int in)
}
-
-void segac2_state::init_c2boot()
-{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_dummy)));
-}
-
-void segac2_state::init_bloxeedc()
+void segac2_state::init_noprot()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_dummy)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_dummy)));
}
void segac2_state::init_columns()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_columns)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_columns)));
}
void segac2_state::init_columns2()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_columns2)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_columns2)));
}
void segac2_state::init_tfrceac()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_tfrceac)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_tfrceac)));
}
void segac2_state::init_tfrceacb()
{
+ init_noprot();
+
/* disable the palette bank switching from the protection chip */
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_dummy)));
m_maincpu->space(AS_PROGRAM).nop_write(0x800000, 0x800001);
}
void segac2_state::init_borench()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_borench)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_borench)));
}
void segac2_state::init_twinsqua()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_twinsqua)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_twinsqua)));
}
void segac2_state::init_ribbit()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_ribbit)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_ribbit)));
}
void segac2_state::init_puyo()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_puyo)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_puyo)));
}
void segac2_state::init_tantr()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_tantr)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_tantr)));
}
void segac2_state::init_tantrkor()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_tantrkor)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_tantrkor)));
}
void segac2_state::init_potopoto()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_potopoto)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_potopoto)));
}
void segac2_state::init_stkclmns()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_stkclmns)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_stkclmns)));
}
void segac2_state::init_stkclmnj()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_stkclmnj)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_stkclmnj)));
}
void segac2_state::init_ichir()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_ichir)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_ichir)));
}
void segac2_state::init_ichirk()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_ichirk)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_ichirk)));
}
void segac2_state::init_ichirj()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_ichirj)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_ichirj)));
}
uint16_t segac2_state::ichirjbl_prot_r()
@@ -2582,49 +2773,49 @@ uint16_t segac2_state::ichirjbl_prot_r()
void segac2_state::init_ichirjbl()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_dummy)));
+ init_noprot();
m_maincpu->space(AS_PROGRAM).install_read_handler(0x840108, 0x840109, read16smo_delegate(*this, FUNC(segac2_state::ichirjbl_prot_r)));
}
void segac2_state::init_puyopuy2()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_puyopuy2)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_puyopuy2)));
}
void segac2_state::init_zunkyou()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_zunkyou)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_zunkyou)));
}
-void segac2_state::init_pclub()
+void pclub_state::init_pclub()
{
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x880120, 0x880121, read16smo_delegate(*this, FUNC(segac2_state::printer_r)));
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x880124, 0x880125, read16smo_delegate(*this, FUNC(segac2_state::printer_r)));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x880124, 0x880125, write16smo_delegate(*this, FUNC(segac2_state::print_club_camera_w)));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x880120, 0x880121, read16smo_delegate(*this, FUNC(pclub_state::printer_r)));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x880124, 0x880125, read16smo_delegate(*this, FUNC(pclub_state::printer_r)));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x880124, 0x880125, write16smo_delegate(*this, FUNC(pclub_state::print_club_camera_w)));
}
-void segac2_state::init_pclubj()
+void pclub_state::init_pclubj()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_pclub)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(pclub_state::prot_func_pclub)));
init_pclub();
}
-void segac2_state::init_pclubjv2()
+void pclub_state::init_pclubjv2()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_pclubjv2)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(pclub_state::prot_func_pclubjv2)));
init_pclub();
}
-void segac2_state::init_pclubjv4()
+void pclub_state::init_pclubjv4()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_pclubjv4)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(pclub_state::prot_func_pclubjv4)));
init_pclub();
}
-void segac2_state::init_pclubjv5()
+void pclub_state::init_pclubjv5()
{
- segac2_common_init(segac2_prot_delegate(*this, FUNC(segac2_state::prot_func_pclubjv5)));
+ set_prot_func(segac2_prot_delegate(*this, FUNC(pclub_state::prot_func_pclubjv5)));
init_pclub();
}
@@ -2647,75 +2838,81 @@ void segac2_state::init_pclubjv5()
******************************************************************************/
-// YEAR, NAME, PARENT, MACHINE,INPUT, INIT, MONITOR,COMPANY,FULLNAME,FLAGS
+// YEAR, NAME, PARENT, MACHINE, INPUT, CLASS, INIT, MONITOR,COMPANY,FULLNAME,FLAGS
/* System C Games */
-GAME( 1989, bloxeedc, bloxeed, segac, bloxeedc, segac2_state, init_bloxeedc, ROT0, "Sega / Elorg", "Bloxeed (World, C System)", 0 )
-GAME( 1989, bloxeedu, bloxeed, segac, bloxeedu, segac2_state, init_bloxeedc, ROT0, "Sega / Elorg", "Bloxeed (US, C System, Rev A)", 0 )
+GAME( 1989, bloxeedc, bloxeed, segac, bloxeedc, segac2_state, init_noprot, ROT0, "Sega / Elorg", "Bloxeed (World, C System)", 0 )
+GAME( 1989, bloxeedu, bloxeed, segac, bloxeedu, segac2_state, init_noprot, ROT0, "Sega / Elorg", "Bloxeed (US, C System, Rev A)", 0 )
-GAME( 1990, columns, 0, segac, columns, segac2_state, init_columns, ROT0, "Sega", "Columns (World)", 0 )
-GAME( 1990, columnsu, columns, segac, columnsu, segac2_state, init_columns, ROT0, "Sega", "Columns (US, cocktail, Rev A)", 0 ) // has cocktail mode dsw
-GAME( 1990, columnsj, columns, segac, columns, segac2_state, init_columns, ROT0, "Sega", "Columns (Japan)", 0 )
+GAME( 1990, columns, 0, segac, columns, segac2_state, init_columns, ROT0, "Sega", "Columns (World)", 0 )
+GAME( 1990, columnsu, columns, segac, columnsu, segac2_state, init_columns, ROT0, "Sega", "Columns (US, cocktail, Rev A)", 0 ) // has cocktail mode dsw
+GAME( 1990, columnsj, columns, segac, columns, segac2_state, init_columns, ROT0, "Sega", "Columns (Japan)", 0 )
-GAME( 1990, columns2, 0, segac, columns2, segac2_state, init_columns2, ROT0, "Sega", "Columns II: The Voyage Through Time (World)", 0 )
-GAME( 1990, column2j, columns2, segac, columns2, segac2_state, init_columns2, ROT0, "Sega", "Columns II: The Voyage Through Time (Japan)", 0 )
+GAME( 1990, columns2, 0, segac, columns2, segac2_state, init_columns2, ROT0, "Sega", "Columns II: The Voyage Through Time (World)", 0 )
+GAME( 1990, column2j, columns2, segac, columns2, segac2_state, init_columns2, ROT0, "Sega", "Columns II: The Voyage Through Time (Japan)", 0 )
/* System C-2 Games */
-GAME( 1990, tfrceac, 0, segac2, tfrceac, segac2_state, init_tfrceac, ROT0, "Technosoft / Sega", "Thunder Force AC", 0 )
-GAME( 1990, tfrceacj, tfrceac, segac2, tfrceac, segac2_state, init_tfrceac, ROT0, "Technosoft / Sega", "Thunder Force AC (Japan)", 0 )
-GAME( 1990, tfrceacb, tfrceac, segac2, tfrceac, segac2_state, init_tfrceacb, ROT0, "bootleg", "Thunder Force AC (bootleg)", 0 )
-GAME( 1990, tfrceacjpb,tfrceac, segac2_tfrceacjpb, tfrceac, segac2_state, init_tfrceac, ROT0, "Technosoft / Sega", "Thunder Force AC (Japan, prototype, bootleg)", 0 )
+GAME( 1990, tfrceac, 0, segac2, tfrceac, segac2_state, init_tfrceac, ROT0, "Technosoft / Sega", "Thunder Force AC", 0 )
+GAME( 1990, tfrceacj, tfrceac, segac2, tfrceac, segac2_state, init_tfrceac, ROT0, "Technosoft / Sega", "Thunder Force AC (Japan)", 0 )
+GAME( 1990, tfrceacb, tfrceac, segac2, tfrceac, segac2_state, init_tfrceacb, ROT0, "bootleg", "Thunder Force AC (bootleg)", 0 )
+GAME( 1990, tfrceacjpb, tfrceac, tfrceacjpb, tfrceac, segac2_state, init_tfrceac, ROT0, "Technosoft / Sega", "Thunder Force AC (Japan, prototype, bootleg)", 0 )
+
+GAME( 1990, borench, 0, segac2, borench, segac2_state, init_borench, ROT0, "Sega", "Borench (set 1)", 0 )
+GAME( 1990, borencha, borench, segac2, borench, segac2_state, init_borench, ROT0, "Sega", "Borench (set 2)", 0 )
+GAME( 1990, borenchj, borench, segac2, borench, segac2_state, init_borench, ROT0, "Sega", "Borench (Japan)", 0 )
-GAME( 1990, borench, 0, segac2, borench, segac2_state, init_borench, ROT0, "Sega", "Borench (set 1)", 0 )
-GAME( 1990, borencha, borench, segac2, borench, segac2_state, init_borench, ROT0, "Sega", "Borench (set 2)", 0 )
-GAME( 1990, borenchj, borench, segac2, borench, segac2_state, init_borench, ROT0, "Sega", "Borench (Japan)", 0 )
+GAME( 1991, ribbit, 0, ribbit, ribbit, segac2_state, init_ribbit, ROT0, "Sega", "Ribbit!", 0 )
+GAME( 1991, ribbitj, ribbit, ribbit, ribbitj, segac2_state, init_ribbit, ROT0, "Sega", "Ribbit! (Japan)", 0 )
-GAME( 1991, ribbit, 0, segac2_ribbit, ribbit, segac2_state, init_ribbit, ROT0, "Sega", "Ribbit!", 0 )
-GAME( 1991, ribbitj, ribbit, segac2_ribbit, ribbitj, segac2_state, init_ribbit, ROT0, "Sega", "Ribbit! (Japan)", 0 )
+GAME( 1991, twinsqua, 0, segac2, twinsqua, segac2_state, init_twinsqua, ROT0, "Sega", "Twin Squash", 0 )
-GAME( 1991, twinsqua, 0, segac2, twinsqua, segac2_state, init_twinsqua, ROT0, "Sega", "Twin Squash", 0 )
+GAME( 1991, soniccar, 0, segac2, soniccar, segac2_state, init_noprot, ROT0, "Sega", "Waku Waku Sonic Patrol Car", 0 )
-GAME( 1991, soniccar, 0, segac2, soniccar, segac2_state, init_bloxeedc, ROT0, "Sega", "Waku Waku Sonic Patrol Car", 0 )
+GAME( 1992, ssonicbr, 0, segac2, ssonicbr, segac2_state, init_noprot, ROT0, "hack", "SegaSonic Bros. (prototype, hack)", 0 )
-GAME( 1992, puyo, 0, segac2, puyo, segac2_state, init_puyo, ROT0, "Compile / Sega", "Puyo Puyo (World)", 0 )
-GAME( 1992, puyobl, puyo, segac2, puyo, segac2_state, init_puyo, ROT0, "bootleg", "Puyo Puyo (World, bootleg)", 0 )
-GAME( 1992, puyoj, puyo, segac2, puyo, segac2_state, init_puyo, ROT0, "Compile / Sega", "Puyo Puyo (Japan, Rev B)", 0 )
-GAME( 1992, puyoja, puyo, segac2, puyo, segac2_state, init_puyo, ROT0, "Compile / Sega", "Puyo Puyo (Japan, Rev A)", 0 )
+GAME( 1992, ooparts, 0, segac2, ooparts, segac2_state, init_noprot, ROT270, "hack", "OOPArts (prototype, joystick hack)", 0 )
-GAME( 1992, tantr, 0, segac2, ichir, segac2_state, init_tantr, ROT0, "Sega", "Puzzle & Action: Tant-R (Japan)", 0 )
-GAME( 1993, tantrkor, tantr, segac2, ichir, segac2_state, init_tantrkor, ROT0, "Sega", "Puzzle & Action: Tant-R (Korea)", 0 )
-GAME( 1992, tantrbl, tantr, segac2, ichir, segac2_state, init_c2boot, ROT0, "bootleg", "Puzzle & Action: Tant-R (Japan) (bootleg set 1)", 0 )
-GAME( 1992, tantrbl4, tantr, segac2, ichir, segac2_state, init_c2boot, ROT0, "bootleg", "Puzzle & Action: Tant-R (Japan) (bootleg set 4)", 0 )
-GAME( 1994, tantrbl2, tantr, segac, ichir, segac2_state, init_tantr, ROT0, "bootleg", "Puzzle & Action: Tant-R (Japan) (bootleg set 2)", 0 ) // Common bootleg in Europe, C board, no samples
-GAME( 1994, tantrbl3, tantr, segac, ichir, segac2_state, init_tantr, ROT0, "bootleg", "Puzzle & Action: Tant-R (Japan) (bootleg set 3)", 0 ) // Common bootleg in Europe, C board, no samples
+GAME( 1992, puyo, 0, segac2, puyo, segac2_state, init_puyo, ROT0, "Compile / Sega", "Puyo Puyo (World)", 0 )
+GAME( 1992, puyobl, puyo, segac2, puyo, segac2_state, init_puyo, ROT0, "bootleg", "Puyo Puyo (World, bootleg)", 0 )
+GAME( 1992, puyoj, puyo, segac2, puyo, segac2_state, init_puyo, ROT0, "Compile / Sega", "Puyo Puyo (Japan, Rev B)", 0 )
+GAME( 1992, puyoja, puyo, segac2, puyo, segac2_state, init_puyo, ROT0, "Compile / Sega", "Puyo Puyo (Japan, Rev A)", 0 )
-GAME( 1992, wwmarine, 0, segac2, wwmarine, segac2_state, init_bloxeedc, ROT0, "Sega", "Waku Waku Marine", 0 )
+GAME( 1992, tantr, 0, segac2, ichir, segac2_state, init_tantr, ROT0, "Sega", "Puzzle & Action: Tant-R (Japan)", 0 )
+GAME( 1993, tantrkor, tantr, segac2, ichir, segac2_state, init_tantrkor, ROT0, "Sega", "Puzzle & Action: Tant-R (Korea)", 0 )
+GAME( 1992, tantrbl, tantr, segac2, ichir, segac2_state, init_noprot, ROT0, "bootleg", "Puzzle & Action: Tant-R (Japan) (bootleg set 1)", 0 )
+GAME( 1992, tantrbl4, tantr, segac2, ichir, segac2_state, init_noprot, ROT0, "bootleg", "Puzzle & Action: Tant-R (Japan) (bootleg set 4)", 0 )
+GAME( 1994, tantrbl2, tantr, segac, ichir, segac2_state, init_tantr, ROT0, "bootleg", "Puzzle & Action: Tant-R (Japan) (bootleg set 2)", 0 ) // Common bootleg in Europe, C board, no samples
+GAME( 1994, tantrbl3, tantr, segac, ichir, segac2_state, init_tantr, ROT0, "bootleg", "Puzzle & Action: Tant-R (Japan) (bootleg set 3)", 0 ) // Common bootleg in Europe, C board, no samples
+
+GAME( 1992, wwmarine, 0, segac2, wwmarine, wwmarine_state, init_noprot, ROT0, "Sega", "Waku Waku Marine", 0 )
// not really sure how this should hook up, things like the 'sold out' flags could be mechanical sensors, or from another MCU / CPU board in the actual popcorn part of the machine?
-GAME( 1992, anpanman, 0, segac2, anpanman, segac2_state, init_bloxeedc, ROT0, "Sega", "Soreike! Anpanman Popcorn Koujou (Rev B)", MACHINE_MECHANICAL ) // 'Mechanical' part isn't emulated
-GAME( 1993, sonicpop, 0, segac2, sonicpop, segac2_state, init_bloxeedc, ROT0, "Sega", "SegaSonic Popcorn Shop (Rev B)", MACHINE_MECHANICAL ) // region DSW for USA / Export / Japan, still speaks Japanese tho. 'Mechanical' part isn't emulated
+GAME( 1992, anpanman, 0, segac2, anpanman, segac2_state, init_noprot, ROT0, "Sega", "Soreike! Anpanman Popcorn Koujou (Rev B)", MACHINE_MECHANICAL ) // 'Mechanical' part isn't emulated
+GAME( 1993, sonicpop, 0, segac2, sonicpop, segac2_state, init_noprot, ROT0, "Sega", "SegaSonic Popcorn Shop (Rev B)", MACHINE_MECHANICAL ) // region DSW for USA / Export / Japan, still speaks Japanese tho. 'Mechanical' part isn't emulated
+
+GAME( 1993, sonicfgt, 0, segac2, sonicfgt, segac2_state, init_noprot, ROT0, "Sega", "SegaSonic Cosmo Fighter", 0 )
-GAME( 1993, sonicfgt, 0, segac2, systemc_generic, segac2_state, init_bloxeedc, ROT0, "Sega", "Sega Sonic Cosmo Fighter", 0 )
+GAME( 1994, potopoto, 0, segac2, potopoto, segac2_state, init_potopoto, ROT0, "Sega", "Poto Poto (Japan, Rev A)", 0 )
-GAME( 1994, potopoto, 0, segac2, potopoto, segac2_state, init_potopoto, ROT0, "Sega", "Poto Poto (Japan, Rev A)", 0 )
+GAME( 1994, stkclmns, 0, segac2, stkclmns, segac2_state, init_stkclmns, ROT0, "Sega", "Stack Columns (World)", 0 )
+GAME( 1994, stkclmnsj, stkclmns, segac2, stkclmns, segac2_state, init_stkclmnj, ROT0, "Sega", "Stack Columns (Japan)", 0 )
-GAME( 1994, stkclmns, 0, segac2, stkclmns, segac2_state, init_stkclmns, ROT0, "Sega", "Stack Columns (World)", 0 )
-GAME( 1994, stkclmnsj, stkclmns, segac2, stkclmns, segac2_state, init_stkclmnj, ROT0, "Sega", "Stack Columns (Japan)", 0 )
+GAME( 1994, ichir, 0, segac2, ichir, segac2_state, init_ichir, ROT0, "Sega", "Puzzle & Action: Ichidant-R (World)", 0 )
+GAME( 1994, ichirk, ichir, segac2, ichir, segac2_state, init_ichirk, ROT0, "Sega", "Puzzle & Action: Ichidant-R (Korea)", 0 )
+GAME( 1994, ichirj, ichir, segac2, ichir, segac2_state, init_ichirj, ROT0, "Sega", "Puzzle & Action: Ichidant-R (Japan)", 0 )
+GAME( 1994, ichirjbl, ichir, segac, ichir, segac2_state, init_ichirjbl, ROT0, "bootleg", "Puzzle & Action: Ichidant-R (Japan) (bootleg)", 0 ) // C board, no samples
-GAME( 1994, ichir, 0, segac2, ichir, segac2_state, init_ichir, ROT0, "Sega", "Puzzle & Action: Ichidant-R (World)", 0 )
-GAME( 1994, ichirk, ichir, segac2, ichir, segac2_state, init_ichirk, ROT0, "Sega", "Puzzle & Action: Ichidant-R (Korea)", 0 )
-GAME( 1994, ichirj, ichir, segac2, ichir, segac2_state, init_ichirj, ROT0, "Sega", "Puzzle & Action: Ichidant-R (Japan)", 0 )
-GAME( 1994, ichirjbl, ichir, segac, ichir, segac2_state, init_ichirjbl, ROT0, "bootleg", "Puzzle & Action: Ichidant-R (Japan) (bootleg)", 0 ) // C board, no samples
+GAME( 1994, puyopuy2, 0, segac2, puyopuy2, segac2_state, init_puyopuy2, ROT0, "Compile (Sega license)", "Puyo Puyo 2 (Japan)", 0 )
-GAME( 1994, puyopuy2, 0, segac2, puyopuy2, segac2_state, init_puyopuy2, ROT0, "Compile (Sega license)", "Puyo Puyo 2 (Japan)", 0 )
+GAME( 1994, zunkyou, 0, segac2, zunkyou, segac2_state, init_zunkyou, ROT0, "Sega", "Zunzunkyou no Yabou (Japan)", 0 )
-GAME( 1994, zunkyou, 0, segac2, zunkyou, segac2_state, init_zunkyou, ROT0, "Sega", "Zunzunkyou no Yabou (Japan)", 0 )
+GAME( 1994, headonch, 0, segac2, headonch, segac2_state, init_noprot, ROT0, "hack", "Head On Channel (prototype, hack)", 0 )
/* Atlus Print Club 'Games' (C-2 Hardware) requires printer and camera emulation */
-GAME( 1995, pclubj, 0, segac2, pclub, segac2_pc_state, init_pclubj, ROT0, "Atlus", "Print Club (Japan Vol.1)", MACHINE_NOT_WORKING )
+GAME( 1995, pclubj, 0, segac2, pclub, pclub_state, init_pclubj, ROT0, "Atlus", "Print Club (Japan Vol.1)", MACHINE_NOT_WORKING )
-GAME( 1995, pclubjv2, 0, segac2, pclubjv2, segac2_pc_state, init_pclubjv2, ROT0, "Atlus", "Print Club (Japan Vol.2)", MACHINE_NOT_WORKING )
-GAME( 1995, pclub, pclubjv2, segac2, pclubjv2, segac2_pc_state, init_pclubj, ROT0, "Atlus", "Print Club (World)", MACHINE_NOT_WORKING ) // based on Japan Vol.2 but no Vol.2 subtitle
+GAME( 1995, pclubjv2, 0, segac2, pclubjv2, pclub_state, init_pclubjv2, ROT0, "Atlus", "Print Club (Japan Vol.2)", MACHINE_NOT_WORKING )
+GAME( 1995, pclub, pclubjv2, segac2, pclubjv2, pclub_state, init_pclubj, ROT0, "Atlus", "Print Club (World)", MACHINE_NOT_WORKING ) // based on Japan Vol.2 but no Vol.2 subtitle
-GAME( 1996, pclubjv4, 0, segac2, pclubjv2, segac2_pc_state, init_pclubjv4, ROT0, "Atlus", "Print Club (Japan Vol.4)", MACHINE_NOT_WORKING )
+GAME( 1996, pclubjv4, 0, segac2, pclubjv2, pclub_state, init_pclubjv4, ROT0, "Atlus", "Print Club (Japan Vol.4)", MACHINE_NOT_WORKING )
-GAME( 1996, pclubjv5, 0, segac2, pclubjv2, segac2_pc_state, init_pclubjv5, ROT0, "Atlus", "Print Club (Japan Vol.5)", MACHINE_NOT_WORKING )
+GAME( 1996, pclubjv5, 0, segac2, pclubjv2, pclub_state, init_pclubjv5, ROT0, "Atlus", "Print Club (Japan Vol.5)", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/segas16a.cpp b/src/mame/drivers/segas16a.cpp
index 1b9e42c4be7..1d03316eed1 100644
--- a/src/mame/drivers/segas16a.cpp
+++ b/src/mame/drivers/segas16a.cpp
@@ -1996,9 +1996,6 @@ void segas16a_state::system16a(machine_config &config)
m_screen->set_visarea(0*8, 40*8-1, 0*8, 28*8-1);
m_screen->set_screen_update(FUNC(segas16a_state::screen_update));
m_screen->set_palette(m_palette);
- // see MT1852 (glitch in fantzone after stage intro text vanishes)
- // this is a hack, but the scroll values must be latched at some point, when is unknown
- m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
SEGA_SYS16A_SPRITES(config, m_sprites, 0);
SEGAIC16VID(config, m_segaic16vid, 0, "gfxdecode");
@@ -2075,7 +2072,7 @@ void segas16a_state::system16a_no7751(machine_config &config)
config.device_remove("dac");
YM2151(config.replace(), m_ymsnd, 4000000);
- m_ymsnd->add_route(ALL_OUTPUTS, "speaker", 1.0);
+ m_ymsnd->add_route(ALL_OUTPUTS, "speaker", 0.5);
}
void segas16a_state::system16a_no7751p(machine_config &config)
@@ -2094,9 +2091,8 @@ void segas16a_state::system16a_i8751_no7751(machine_config &config)
system16a_i8751(config);
config.device_remove("n7751");
config.device_remove("dac");
- config.device_remove("vref");
- YM2151(config.replace(), "ymsnd", 4000000).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ YM2151(config.replace(), "ymsnd", 4000000).add_route(ALL_OUTPUTS, "speaker", 0.5);
}
*/
@@ -2109,7 +2105,7 @@ void segas16a_state::system16a_fd1089a_no7751(machine_config &config)
config.device_remove("dac");
YM2151(config.replace(), m_ymsnd, 4000000);
- m_ymsnd->add_route(ALL_OUTPUTS, "speaker", 1.0);
+ m_ymsnd->add_route(ALL_OUTPUTS, "speaker", 0.5);
}
void segas16a_state::system16a_fd1089b_no7751(machine_config &config)
@@ -2121,7 +2117,7 @@ void segas16a_state::system16a_fd1089b_no7751(machine_config &config)
config.device_remove("dac");
YM2151(config.replace(), m_ymsnd, 4000000);
- m_ymsnd->add_route(ALL_OUTPUTS, "speaker", 1.0);
+ m_ymsnd->add_route(ALL_OUTPUTS, "speaker", 0.5);
}
void segas16a_state::system16a_fd1094_no7751(machine_config &config)
@@ -2133,7 +2129,7 @@ void segas16a_state::system16a_fd1094_no7751(machine_config &config)
config.device_remove("dac");
YM2151(config.replace(), m_ymsnd, 4000000);
- m_ymsnd->add_route(ALL_OUTPUTS, "speaker", 1.0);
+ m_ymsnd->add_route(ALL_OUTPUTS, "speaker", 0.5);
}
diff --git a/src/mame/drivers/segas16b.cpp b/src/mame/drivers/segas16b.cpp
index de8e4679277..ad97abf80bf 100644
--- a/src/mame/drivers/segas16b.cpp
+++ b/src/mame/drivers/segas16b.cpp
@@ -3971,8 +3971,6 @@ void segas16b_state::system16b(machine_config &config)
m_screen->set_raw(MASTER_CLOCK_25MHz/4, 400, 0, 320, 262, 0, 224);
m_screen->set_screen_update(FUNC(segas16b_state::screen_update));
m_screen->set_palette(m_palette);
- // see note in segas16a.cpp, also used here for consistency
- m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
SEGA_SYS16B_SPRITES(config, m_sprites, 0);
SEGAIC16VID(config, m_segaic16vid, 0, m_gfxdecode);
@@ -3982,12 +3980,12 @@ void segas16b_state::system16b(machine_config &config)
#if USE_NL
YM2151(config, m_ym2151, MASTER_CLOCK_8MHz/2)
- .add_route(0, "netlist", 1.0, 0)
- .add_route(1, "netlist", 1.0, 1);
+ .add_route(0, "netlist", 0.43, 0)
+ .add_route(1, "netlist", 0.43, 1);
UPD7759(config, m_upd7759);
m_upd7759->md_w(0);
m_upd7759->drq().set(FUNC(segas16b_state::upd7759_generate_nmi));
- m_upd7759->add_route(0, "netlist", 1.0, 2);
+ m_upd7759->add_route(0, "netlist", 0.48, 2);
NETLIST_SOUND(config, "netlist", 48000)
.set_source(netlist_segas16b_audio)
@@ -4186,7 +4184,6 @@ void segas16b_state::lockonph(machine_config &config)
m_soundcpu->set_addrmap(AS_PROGRAM, &segas16b_state::lockonph_sound_map);
m_soundcpu->set_addrmap(AS_IO, &segas16b_state::lockonph_sound_iomap);
-
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
// video hardware
@@ -4197,8 +4194,6 @@ void segas16b_state::lockonph(machine_config &config)
m_screen->set_raw(MASTER_CLOCK_25MHz/4, 400, 0, 320, 262, 0, 224); // wrong, other XTAL seems to be 17Mhz?
m_screen->set_screen_update(FUNC(segas16b_state::screen_update));
m_screen->set_palette(m_palette);
- // see note in segas16a.cpp, also used here for consistency
- m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
SEGA_SYS16B_SPRITES(config, m_sprites, 0);
SEGAIC16VID(config, m_segaic16vid, 0, m_gfxdecode);
@@ -4236,10 +4231,13 @@ void segas16b_state::atomicp(machine_config &config) // 10MHz CPU Clock verified
// sound hardware
config.device_remove("ym2151");
+ config.device_remove("upd");
+#if USE_NL
+ config.device_remove("netlist");
+#endif
+
YM2413(config, m_ym2413, XTAL(20'000'000)/4); // 20MHz OSC divided by 4 (verified)
m_ym2413->add_route(ALL_OUTPUTS, "mono", 1.0);
-
- config.device_remove("upd");
}
INTERRUPT_GEN_MEMBER(dfjail_state::soundirq_cb)
@@ -4280,7 +4278,7 @@ void dfjail_state::dfjail(machine_config &config)
//config.device_remove("ym2151");
config.device_remove("upd");
- AD7533(config, m_dac, 0).add_route(ALL_OUTPUTS, "mono", 0.5); // AD7533KN
+ AD7533(config, m_dac, 0).add_route(ALL_OUTPUTS, "mono", 0.25); // AD7533KN
}
@@ -7979,36 +7977,36 @@ ROM_END
//
ROM_START( riotcity )
ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 code
- ROM_LOAD16_BYTE( "epr-14612.bin", 0x000000, 0x20000, CRC(a1b331ec) SHA1(49136ffed35ecc9e5e9a6ea7acbe534e6ccc9dd8) )
- ROM_LOAD16_BYTE( "epr-14610.bin", 0x000001, 0x20000, CRC(cd4f2c50) SHA1(c7a7e95901c664a72195c202b50a159db8d5981d) )
- ROM_LOAD16_BYTE( "epr-14613.bin", 0x040000, 0x20000, CRC(0659df4c) SHA1(a24005ce354113732306c318de373c818400a9c8) )
- ROM_LOAD16_BYTE( "epr-14611.bin", 0x040001, 0x20000, CRC(d9e6f80b) SHA1(5ac56b3685bb121a4f07be3d81209807436e76ec) )
+ ROM_LOAD16_BYTE( "epr-14612.a7", 0x000000, 0x20000, CRC(a1b331ec) SHA1(49136ffed35ecc9e5e9a6ea7acbe534e6ccc9dd8) )
+ ROM_LOAD16_BYTE( "epr-14610.a5", 0x000001, 0x20000, CRC(cd4f2c50) SHA1(c7a7e95901c664a72195c202b50a159db8d5981d) )
+ ROM_LOAD16_BYTE( "epr-14613.a8", 0x040000, 0x20000, CRC(0659df4c) SHA1(a24005ce354113732306c318de373c818400a9c8) )
+ ROM_LOAD16_BYTE( "epr-14611.a6", 0x040001, 0x20000, CRC(d9e6f80b) SHA1(5ac56b3685bb121a4f07be3d81209807436e76ec) )
ROM_REGION( 0xc0000, "gfx1", 0 ) // tiles
- ROM_LOAD( "epr-14616.bin", 0x00000, 0x20000, CRC(46d30368) SHA1(a791ef0e881345b6be0b28f32af17127edb5b590) ) // plane 1
- ROM_LOAD( "epr-14625.bin", 0x20000, 0x20000, CRC(abfb80fe) SHA1(5f0d61d55f27e8f776b573e3193164c4d70ec12b) )
- ROM_LOAD( "epr-14617.bin", 0x40000, 0x20000, CRC(884e40f9) SHA1(f7eeae57544e7d95139588137605986732937d38) ) // plane 2
- ROM_LOAD( "epr-14626.bin", 0x60000, 0x20000, CRC(4ef55846) SHA1(2f23474e7d1d8880dc251ada55c5fca2fc19256a) )
- ROM_LOAD( "epr-14618.bin", 0x80000, 0x20000, CRC(00eb260e) SHA1(f293180fb9a053c98022ef086bf4002563752f61) ) // plane 3
- ROM_LOAD( "epr-14627.bin", 0xa0000, 0x20000, CRC(961e5f82) SHA1(dc88b511dff6cdebf96fe8bf388bf76098296b0f) )
+ ROM_LOAD( "epr-14616.a14", 0x00000, 0x20000, CRC(46d30368) SHA1(a791ef0e881345b6be0b28f32af17127edb5b590) ) // plane 1
+ ROM_LOAD( "epr-14625.b14", 0x20000, 0x20000, CRC(abfb80fe) SHA1(5f0d61d55f27e8f776b573e3193164c4d70ec12b) )
+ ROM_LOAD( "epr-14617.a15", 0x40000, 0x20000, CRC(884e40f9) SHA1(f7eeae57544e7d95139588137605986732937d38) ) // plane 2
+ ROM_LOAD( "epr-14626.b15", 0x60000, 0x20000, CRC(4ef55846) SHA1(2f23474e7d1d8880dc251ada55c5fca2fc19256a) )
+ ROM_LOAD( "epr-14618.a16", 0x80000, 0x20000, CRC(00eb260e) SHA1(f293180fb9a053c98022ef086bf4002563752f61) ) // plane 3
+ ROM_LOAD( "epr-14627.b16", 0xa0000, 0x20000, CRC(961e5f82) SHA1(dc88b511dff6cdebf96fe8bf388bf76098296b0f) )
ROM_REGION16_BE( 0x1c0000, "sprites", 0 ) // sprites
- ROM_LOAD16_BYTE( "epr-14619.bin", 0x000001, 0x020000, CRC(6f2b5ef7) SHA1(a0186fcc5b12c31b65b84355f88bcb10b1434135) )
- ROM_CONTINUE( 0x100001, 0x020000 )
- ROM_LOAD16_BYTE( "epr-14622.bin", 0x000000, 0x020000, CRC(7ca7e40d) SHA1(57d26cc1b530cb867b2a4779bb5108ac457b2154) )
- ROM_CONTINUE( 0x100000, 0x020000 )
- ROM_LOAD16_BYTE( "epr-14620.bin", 0x040001, 0x020000, CRC(66183333) SHA1(44bb9d57cd0308c0d7b6a10ba9bd95763ceea775) )
- ROM_CONTINUE( 0x140001, 0x020000 )
- ROM_LOAD16_BYTE( "epr-14623.bin", 0x040000, 0x020000, CRC(98630049) SHA1(216ae0b4a59f306b51bd50dfcbf831c3186a4d2a) )
- ROM_CONTINUE( 0x140000, 0x020000 )
- ROM_LOAD16_BYTE( "epr-14621.bin", 0x080001, 0x020000, CRC(c0f2820e) SHA1(ae433f6c5065ed495f5f57f50d6abe5ff98b041e) )
- ROM_CONTINUE( 0x180001, 0x020000 )
- ROM_LOAD16_BYTE( "epr-14624.bin", 0x080000, 0x020000, CRC(d1a68448) SHA1(7591f0476e899a11042d9b7e93f99b64de48b0ef) )
- ROM_CONTINUE( 0x180000, 0x020000 )
+ ROM_LOAD16_BYTE( "epr-14619.b1", 0x000001, 0x020000, CRC(6f2b5ef7) SHA1(a0186fcc5b12c31b65b84355f88bcb10b1434135) )
+ ROM_CONTINUE( 0x100001, 0x020000 )
+ ROM_LOAD16_BYTE( "epr-14622.b5", 0x000000, 0x020000, CRC(7ca7e40d) SHA1(57d26cc1b530cb867b2a4779bb5108ac457b2154) )
+ ROM_CONTINUE( 0x100000, 0x020000 )
+ ROM_LOAD16_BYTE( "epr-14620.b2", 0x040001, 0x020000, CRC(66183333) SHA1(44bb9d57cd0308c0d7b6a10ba9bd95763ceea775) )
+ ROM_CONTINUE( 0x140001, 0x020000 )
+ ROM_LOAD16_BYTE( "epr-14623.b6", 0x040000, 0x020000, CRC(98630049) SHA1(216ae0b4a59f306b51bd50dfcbf831c3186a4d2a) )
+ ROM_CONTINUE( 0x140000, 0x020000 )
+ ROM_LOAD16_BYTE( "epr-14621.b3", 0x080001, 0x020000, CRC(c0f2820e) SHA1(ae433f6c5065ed495f5f57f50d6abe5ff98b041e) )
+ ROM_CONTINUE( 0x180001, 0x020000 )
+ ROM_LOAD16_BYTE( "epr-14624.b7", 0x080000, 0x020000, CRC(d1a68448) SHA1(7591f0476e899a11042d9b7e93f99b64de48b0ef) )
+ ROM_CONTINUE( 0x180000, 0x020000 )
ROM_REGION( 0x50000, "soundcpu", 0 ) // sound CPU
- ROM_LOAD( "epr-14614.bin", 0x00000, 0x10000, CRC(c65cc69a) SHA1(28a75dd2085b8e1447fe4e6af210a54a6666fcb1) )
- ROM_LOAD( "epr-14615.bin", 0x10000, 0x20000, CRC(46653db1) SHA1(7a43d8742ee451d93bb5f1b0f4f261b274c3f0ef) )
+ ROM_LOAD( "epr-14614.a10", 0x00000, 0x10000, CRC(c65cc69a) SHA1(28a75dd2085b8e1447fe4e6af210a54a6666fcb1) )
+ ROM_LOAD( "epr-14615.all", 0x10000, 0x20000, CRC(46653db1) SHA1(7a43d8742ee451d93bb5f1b0f4f261b274c3f0ef) )
ROM_REGION( 0x0100, "plds", 0 )
ROM_LOAD( "315-5298.b9", 0x0000, 0x00eb, CRC(39b47212) SHA1(432b47aee5ecbf08a8a6dc2f8379c816feb86328) ) // PLS153
@@ -10067,16 +10065,16 @@ GAME( 1989, wrestwar2d, wrestwar, system16b, wrestwar, segas16b_stat
GAME( 1989, wrestwar1d, wrestwar, system16b, wrestwar, segas16b_state, init_generic_5704, ROT270, "bootleg", "Wrestle War (set 1, Japan) (bootleg of FD1094 317-0090 set)", 0 )
// bootlegs with split code/data, no memory mapper
-GAME( 1987, sdibl2, sdi, system16b_split, sdi, segas16b_state, init_sdi_5358_small, ROT0, "bootleg", "SDI - Strategic Defense Initiative (bootleg, set 1)", 0 ) // 0x5230
-GAME( 1987, sdibl3, sdi, system16b_split, sdi, segas16b_state, init_sdi_5358_small, ROT0, "bootleg", "SDI - Strategic Defense Initiative (bootleg, set 2)", 0 ) // ^
-GAME( 1987, sdibl4, sdi, system16b_split, sdi, segas16b_state, init_sdi_5358_small, ROT0, "bootleg", "SDI - Strategic Defense Initiative (bootleg, set 3)", 0 ) // ^
-GAME( 1987, sdibl5, sdi, system16b_split, sdi, segas16b_state, init_sdi_5358_small, ROT0, "bootleg", "SDI - Strategic Defense Initiative (bootleg, set 4)", 0 )
-GAME( 1987, sdibl6, sdi, system16b_split, sdi, segas16b_state, init_sdi_5358_small, ROT0, "bootleg", "SDI - Strategic Defense Initiative (bootleg, set 5)", 0 )
+GAME( 1987, sdibl2, sdi, system16b_split, sdi, segas16b_state, init_sdi_5358_small, ROT0, "bootleg", "SDI - Strategic Defense Initiative (bootleg, set 1)", 0 ) // 0x5230
+GAME( 1987, sdibl3, sdi, system16b_split, sdi, segas16b_state, init_sdi_5358_small, ROT0, "bootleg", "SDI - Strategic Defense Initiative (bootleg, set 2)", 0 ) // ^
+GAME( 1987, sdibl4, sdi, system16b_split, sdi, segas16b_state, init_sdi_5358_small, ROT0, "bootleg", "SDI - Strategic Defense Initiative (bootleg, set 3)", 0 ) // ^
+GAME( 1987, sdibl5, sdi, system16b_split, sdi, segas16b_state, init_sdi_5358_small, ROT0, "bootleg", "SDI - Strategic Defense Initiative (bootleg, set 4)", 0 )
+GAME( 1987, sdibl6, sdi, system16b_split, sdi, segas16b_state, init_sdi_5358_small, ROT0, "bootleg", "SDI - Strategic Defense Initiative (bootleg, set 5)", 0 )
// bootlegs with modified hardware
-GAME( 1989, fpointbl, fpoint, fpointbl, fpointbl, segas16b_state, init_generic_bootleg, ROT0, "bootleg (Datsu)", "Flash Point (World, bootleg)", 0 )
-GAME( 1989, fpointbj, fpoint, fpointbl, fpointbl, segas16b_state, init_generic_bootleg, ROT0, "bootleg (Datsu)", "Flash Point (Japan, bootleg set 1)", 0 )
-GAME( 1989, fpointbla, fpoint, fpointbla, fpointbl, segas16b_state, init_fpointbla, ROT0, "bootleg", "Flash Point (Japan, bootleg set 2)", MACHINE_NOT_WORKING )
+GAME( 1989, fpointbl, fpoint, fpointbl, fpointbl, segas16b_state, init_generic_bootleg, ROT0, "bootleg (Datsu)", "Flash Point (World, bootleg)", 0 )
+GAME( 1989, fpointbj, fpoint, fpointbl, fpointbl, segas16b_state, init_generic_bootleg, ROT0, "bootleg (Datsu)", "Flash Point (Japan, bootleg set 1)", 0 )
+GAME( 1989, fpointbla, fpoint, fpointbla, fpointbl, segas16b_state, init_fpointbla, ROT0, "bootleg", "Flash Point (Japan, bootleg set 2)", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/seibuspi.cpp b/src/mame/drivers/seibuspi.cpp
index 6d89af88949..f00b8e7b0ec 100644
--- a/src/mame/drivers/seibuspi.cpp
+++ b/src/mame/drivers/seibuspi.cpp
@@ -1242,6 +1242,16 @@ CUSTOM_INPUT_MEMBER(seibuspi_state::ejanhs_encode)
/*****************************************************************************/
+// JP1 is for SXX2C only
+static INPUT_PORTS_START( sxx2c )
+ PORT_START("JUMPERS")
+ PORT_DIPNAME( 0x03, 0x03, "JP1" ) // "Only used when game-board is changed with a new game" in manual
+ PORT_DIPSETTING( 0x03, "Update" ) // "Changing game" in manual
+ PORT_DIPSETTING( 0x00, "Normal" )
+ PORT_BIT( 0xfc, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+
static INPUT_PORTS_START( sxx2e )
PORT_START("INPUTS")
PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
@@ -1286,13 +1296,7 @@ INPUT_PORTS_END
static INPUT_PORTS_START( spi_3button )
PORT_INCLUDE( sxx2e )
-
- PORT_START("JUMPERS")
- PORT_DIPNAME( 0x03, 0x03, "JP1" )
- PORT_DIPSETTING( 0x03, "Update" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_BIT( 0xfc, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_INCLUDE( sxx2c )
INPUT_PORTS_END
@@ -1380,6 +1384,7 @@ INPUT_PORTS_END
static INPUT_PORTS_START( spi_ejanhs )
PORT_INCLUDE( spi_mahjong_keyboard )
+ PORT_INCLUDE( sxx2c )
PORT_START("INPUTS")
PORT_BIT( 0x00000007, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(seibuspi_state, ejanhs_encode<3>)
@@ -1406,13 +1411,6 @@ static INPUT_PORTS_START( spi_ejanhs )
PORT_START("EXCH") // Another set of mahjong inputs is decoded from here but not used
PORT_BIT( 0xffffffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_START("JUMPERS")
- PORT_DIPNAME( 0x03, 0x03, "JP1" )
- PORT_DIPSETTING( 0x03, "Update" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_BIT( 0xfc, IP_ACTIVE_LOW, IPT_UNUSED )
-
PORT_START("COIN")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
diff --git a/src/mame/drivers/seta.cpp b/src/mame/drivers/seta.cpp
index 977cbef199a..b80520cd562 100644
--- a/src/mame/drivers/seta.cpp
+++ b/src/mame/drivers/seta.cpp
@@ -7953,7 +7953,7 @@ void downtown_state::tndrcade(machine_config &config)
ym1.add_route(ALL_OUTPUTS, "mono", 0.35);
ym3812_device &ym2(YM3812(config, "ym2", 16000000/4)); /* 4 MHz */
- ym2.add_route(ALL_OUTPUTS, "mono", 1.0);
+ ym2.add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -8009,7 +8009,7 @@ void downtown_state::twineagl(machine_config &config)
GENERIC_LATCH_8(config, m_soundlatch[1]);
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -8152,7 +8152,7 @@ void usclssic_state::usclssic(machine_config &config)
m_soundlatch[0]->set_separate_acknowledge(true);
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -8271,7 +8271,7 @@ void downtown_state::metafox(machine_config &config)
GENERIC_LATCH_8(config, m_soundlatch[1]);
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
void downtown_state::arbalest(machine_config &config)
@@ -8318,7 +8318,7 @@ void seta_state::atehate(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -8367,7 +8367,7 @@ void seta_state::blandia(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
m_x1->set_addrmap(0, &seta_state::blandia_x1_map);
}
@@ -8406,7 +8406,7 @@ void seta_state::blandiap(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
m_x1->set_addrmap(0, &seta_state::blandia_x1_map);
}
@@ -8446,7 +8446,7 @@ void seta_state::blockcar(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -8524,7 +8524,7 @@ void seta_state::daioh(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, XTAL(16'000'000)); /* 16 MHz, Verified from PCB audio */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -8583,7 +8583,7 @@ void seta_state::drgnunit(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
void seta_state::stg(machine_config &config)
@@ -8722,7 +8722,7 @@ void seta_state::eightfrc(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
m_x1->set_addrmap(0, &seta_state::blandia_x1_map);
}
@@ -8839,7 +8839,7 @@ void seta_state::gundhara(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -8915,7 +8915,7 @@ void seta_state::jjsquawk(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
void seta_state::jjsquawb(machine_config &config)
@@ -8951,7 +8951,7 @@ void seta_state::jjsquawb(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -8999,7 +8999,7 @@ void seta_state::kamenrid(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -9132,7 +9132,7 @@ void seta_state::krzybowl(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -9180,7 +9180,7 @@ void seta_state::madshark(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -9232,7 +9232,7 @@ void seta_state::magspeed(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -9280,7 +9280,7 @@ void seta_state::msgundam(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
void seta_state::msgundamb(machine_config &config)
@@ -9469,7 +9469,7 @@ void seta_state::rezon(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -9510,7 +9510,7 @@ void seta_state::thunderl(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -9628,7 +9628,7 @@ void seta_state::wits(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -9667,7 +9667,7 @@ void seta_state::umanclub(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -9774,7 +9774,7 @@ void seta_state::wrofaero(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -9822,7 +9822,7 @@ void seta_state::zingzip(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -9878,7 +9878,7 @@ void seta_state::pairlove(machine_config &config)
SPEAKER(config, "mono").front_center();
X1_010(config, m_x1, 16000000); /* 16 MHz */
- m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_x1->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -9930,10 +9930,10 @@ void seta_state::crazyfgt(machine_config &config)
SPEAKER(config, "mono").front_center();
ym3812_device &ymsnd(YM3812(config, "ymsnd", 16_MHz_XTAL / 4));
- ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
+ ymsnd.add_route(ALL_OUTPUTS, "mono", 0.5);
okim6295_device &oki(OKIM6295(config, "oki", 4.433619_MHz_XTAL / 4, okim6295_device::PIN7_HIGH));
- oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+ oki.add_route(ALL_OUTPUTS, "mono", 0.5);
}
diff --git a/src/mame/drivers/skullxbo.cpp b/src/mame/drivers/skullxbo.cpp
index dc3a4a86dac..3a72b28a5d1 100644
--- a/src/mame/drivers/skullxbo.cpp
+++ b/src/mame/drivers/skullxbo.cpp
@@ -272,7 +272,7 @@ void skullxbo_state::skullxbo(machine_config &config)
ATARI_JSA_II(config, m_jsa, 0);
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_4);
m_jsa->test_read_cb().set_ioport("FF5802").bit(7);
- m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_jsa->add_route(ALL_OUTPUTS, "mono", 0.8);
}
diff --git a/src/mame/drivers/skylncr.cpp b/src/mame/drivers/skylncr.cpp
index 5af73356d87..02e09468358 100644
--- a/src/mame/drivers/skylncr.cpp
+++ b/src/mame/drivers/skylncr.cpp
@@ -162,10 +162,12 @@ public:
void mbutrfly(machine_config &config);
void olymp(machine_config &config);
+ void init_leadera();
void init_mbutrfly() { save_item(NAME(m_mbutrfly_prot)); }
void init_miaction();
void init_olymp();
void init_sonikfig();
+ void init_speedway();
void init_superb2k();
READ_LINE_MEMBER(mbutrfly_prot_r);
@@ -1917,6 +1919,23 @@ ROM_START( leader )
ROM_LOAD16_BYTE( "leadergfx2.dmp22", 0x40001, 0x20000, CRC(04cc0118) SHA1(016ccbe7daf8c4676830aadcc906a64e2826d11a) )
ROM_END
+ROM_START( leadera ) // this has the same GFX ROMs as butrfly, with different program
+ ROM_REGION( 0x80000, "maincpu", 0 )
+ ROM_LOAD( "leader 2ka.bin", 0x00000, 0x10000, CRC(2664db55) SHA1(de4c07a8ba8fab772441395b6d05272ee54d9614) ) // on sub board with Altera EPM7032
+
+ ROM_REGION( 0x80000, "gfx1", 0 )
+ ROM_LOAD16_BYTE( "u29", 0x00000, 0x20000, CRC(2ff775ea) SHA1(2219c75cbac2969485607446ab116587bdee7278) )
+ ROM_LOAD16_BYTE( "u31", 0x00001, 0x20000, CRC(029d2214) SHA1(cf8256157db0b297ed457b3da6b6517907128843) )
+ ROM_LOAD16_BYTE( "u33", 0x40000, 0x20000, CRC(37bad677) SHA1(c077f0c07b097b376a01e5637446e4c4f82d9e28) )
+ ROM_LOAD16_BYTE( "u35", 0x40001, 0x20000, CRC(d14c7713) SHA1(c229ef64f3b0a04ff8e27bc56cff6a55ca34b80c) )
+
+ ROM_REGION( 0x80000, "gfx2", 0 )
+ ROM_LOAD16_BYTE( "u52", 0x00000, 0x20000, CRC(15051537) SHA1(086c38c05c605f297a7bc470eb51763a7648e72c) )
+ ROM_LOAD16_BYTE( "u54", 0x00001, 0x20000, CRC(8e34d029) SHA1(ae316f2f34768938a07d62db110ce59d2751abaa) )
+ ROM_LOAD16_BYTE( "u56", 0x40000, 0x20000, CRC(a53daaef) SHA1(7b88bb986bd5e47576163d6999f8770c720c5bfc) )
+ ROM_LOAD16_BYTE( "u58", 0x40001, 0x20000, CRC(21ca47f8) SHA1(b192be06a2eb817776309580dc64fd76772a8d50) )
+ROM_END
+
/*
Neraidoula
@@ -2168,6 +2187,23 @@ ROM_START( olymp )
ROM_LOAD16_BYTE( "u58", 0x40001, 0x20000, CRC(f939f3f0) SHA1(0a089f78ca66d1e660cb854bbf5b0eb38e317a19) )
ROM_END
+ROM_START( speedway ) // runs on a Rolla PCB with small sub board with main CPU, ROM and Altera EPM. Hack of Leader, extremely similar and still has Leader strings.
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "v3.bin", 0x00000, 0x10000, CRC(ef777180) SHA1(f1a554677543082eb7df2e204d0d4c987b7c6bbb) ) //TMS 27C512
+
+ ROM_REGION( 0x80000, "gfx1", 0 ) // all HN27C301AG
+ ROM_LOAD16_BYTE( "1.u29", 0x00000, 0x20000, CRC(72e001fe) SHA1(dbb02f8425c175d5ee401754e6c11ce4d429e621) )
+ ROM_LOAD16_BYTE( "2.u31", 0x00001, 0x20000, CRC(a491bdcf) SHA1(793faa829de50f67a44541136b66407ee9744971) )
+ ROM_LOAD16_BYTE( "3.u33", 0x40000, 0x20000, CRC(935fc941) SHA1(12e5f7fea932a86298928b70b342e0825a3caca1) )
+ ROM_LOAD16_BYTE( "4.u35", 0x40001, 0x20000, CRC(aa8164ce) SHA1(027fa9743ad9d80bd86e59d684180f75dc6d60a0) )
+
+ ROM_REGION( 0x80000, "gfx2", 0 ) // all HN27C301AG. Still has Bordun and Butterfly GFX in here.
+ ROM_LOAD16_BYTE( "5.u52", 0x00000, 0x20000, CRC(df984dbc) SHA1(7ea27465f9fd537fbdc1e13ca5842f656cbc2897) )
+ ROM_LOAD16_BYTE( "6.u54", 0x00001, 0x20000, CRC(37fbdc4d) SHA1(8db83c43e7c43c2da5a39b86edff416c35fa275e) )
+ ROM_LOAD16_BYTE( "7.u56", 0x40000, 0x20000, CRC(328f7912) SHA1(7f05217a18cfb316972cf96711276205e8098ee6) )
+ ROM_LOAD16_BYTE( "8.u58", 0x40001, 0x20000, CRC(b93b221f) SHA1(efd6962a0f5e150c60d258fea116d726228dc39c) )
+ROM_END
+
/**********************************
* Driver Init *
**********************************/
@@ -2267,7 +2303,7 @@ void skylncr_state::init_superb2k() // TODO: very preliminary, just enough to re
// descramble addresses. At a first glance, swaps seem to change if address line bits 13 or 14 are set (possibly 15 too, but not verified yet)
// the scrambled address line bits appear to be 1, 3, 6, 9 and 12
- // it's possible XORs and are data lines swaps are involved, too, at least for opcodes
+ // it's possible XORs and data lines swaps are involved, too, at least for opcodes
for (int i = 0x00000; i < 0x10000; i++)
{
switch (i & 0x6000)
@@ -2280,6 +2316,63 @@ void skylncr_state::init_superb2k() // TODO: very preliminary, just enough to re
}
}
+void skylncr_state::init_speedway() // TODO: complete this. These XORs and ranges have been derived by comparing this dump with leader, of which it's clearly a hack.
+{
+ uint8_t *const ROM = memregion("maincpu")->base();
+
+ for (int x = 0x0000; x < 0x10000; x++)
+ m_decrypted_opcodes[x] = ROM[x];
+
+ for (int x = 0x000d; x < 0x5000; x++)
+ {
+ ROM[x] = ROM[x] ^ 0x41;
+ m_decrypted_opcodes[x] = ROM[x];
+ }
+
+ for (int x = 0x5000; x < 0x53c2; x++)
+ m_decrypted_opcodes[x] = ROM[x] ^ 0x12;
+
+ for (int x = 0x5400; x < 0x8000; x++)
+ {
+ ROM[x] = ROM[x] ^ 0x41;
+ m_decrypted_opcodes[x] = ROM[x];
+ }
+
+ for (int x = 0xc000; x < 0xc300; x++)
+ {
+ ROM[x] = ROM[x] ^ 0x08;
+ m_decrypted_opcodes[x] = ROM[x];
+ }
+
+ for (int x = 0xc300; x < 0xc368; x++)
+ m_decrypted_opcodes[x] = ROM[x] ^ 0x12;
+
+ for (int x = 0xf690; x < 0xf74f; x++)
+ m_decrypted_opcodes[x] = ROM[x] ^ 0x12;
+
+ for (int x = 0xf74f; x < 0x10000; x++)
+ {
+ ROM[x] = ROM[x] ^ 0x08;
+ m_decrypted_opcodes[x] = ROM[x];
+ }
+}
+
+void skylncr_state::init_leadera()
+{
+ uint8_t *const ROM = memregion("maincpu")->base();
+
+ for (int x = 0x000d; x < 0x4000; x++)
+ ROM[x] ^= 0x08;
+
+ for (int x = 0x4000; x < 0x8000; x++)
+ ROM[x] ^= 0x10;
+
+ for (int x = 0xc000; x < 0x10000; x++)
+ ROM[x] ^= 0x40;
+
+ ROM[0x762a] = ROM[0x762b] = 0x00; // TODO: some minor protection? bypass for now
+}
+
} // Anonymous namespace
@@ -2293,6 +2386,8 @@ GAME( 1995, butrfly, 0, skylncr, skylncr, skylncr_state, empty_init,
GAME( 1999, mbutrfly, 0, mbutrfly, mbutrfly, skylncr_state, init_mbutrfly, ROT0, "Bordun International", "Magical Butterfly (version U350C, protected)", MACHINE_SUPPORTS_SAVE )
GAME( 1995, madzoo, 0, skylncr, skylncr, skylncr_state, empty_init, ROT0, "Bordun International", "Mad Zoo (version U450C)", MACHINE_SUPPORTS_SAVE )
GAME( 1995, leader, 0, skylncr, leader, skylncr_state, empty_init, ROT0, "bootleg", "Leader (version Z 2E, Greece)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, leadera, leader, skylncr, leader, skylncr_state, init_leadera, ROT0, "bootleg", "Leader (version Z 2F, Greece)", MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) // Needs correct protection emulation instead of ROM patch
+GAME( 199?, speedway, 0, olymp, leader, skylncr_state, init_speedway, ROT0, "hack (Drivers)", "Speedway", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // Incomplete decryption (?)
GAME( 199?, gallag50, 0, skylncr, gallag50, skylncr_state, empty_init, ROT0, "bootleg", "Gallag Video Game / Petalouda (Butterfly, x50)", MACHINE_SUPPORTS_SAVE )
GAME( 199?, neraidou, 0, neraidou, neraidou, skylncr_state, empty_init, ROT0, "bootleg", "Neraidoula", MACHINE_SUPPORTS_SAVE )
GAME( 199?, miaction, 0, skylncr, skylncr, skylncr_state, init_miaction, ROT0, "Vegas", "Missing In Action", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/spg2xx.cpp b/src/mame/drivers/spg2xx.cpp
index 9a4d5cbc469..c9a249ab426 100644
--- a/src/mame/drivers/spg2xx.cpp
+++ b/src/mame/drivers/spg2xx.cpp
@@ -2095,6 +2095,10 @@ ROM_START( doraglob )
ROM_LOAD16_WORD_SWAP( "doraglobe.bin", 0x000000, 0x800000, CRC(6f454c50) SHA1(201e2de3d90abe017a8dc141613cbf6383423d13) )
ROM_END
+ROM_START( doraglobg )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "doraglobegerman.bin", 0x000000, 0x800000, CRC(538aa197) SHA1(e97e0641df04074a0e45d02cecb43fbec91a4ce6) )
+ROM_END
ROM_START( senspeed )
ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
@@ -2235,8 +2239,10 @@ CONS( 2007, itvphone, 0, 0, spg2xx_pal, itvphone, spg2xx_game_state,
CONS( 2006, doraphon, 0, 0, doraphone, doraphone, spg2xx_game_doraphone_state,empty_init, "VTech", "Dora the Explorer - Dora TV Explorer Phone / Boots's Special Day", MACHINE_IMPERFECT_SOUND )
// This was from a 'cost reduced' unit with the 'non-TV' mode switch and internal speaker removed, however it looks like the code was not disabled or removed as the mode is fully functional.
// The ZC-Infinity video for this on YouTube shows the map scrolling to center the continent, there doesn't appear to be an input for this, different revision?
-// A Dutch localized version also exists, which again must be different code
+// Dutch and French localized versions also exists, which again must be different code
CONS( 2007, doraglob, 0, 0, doraphone, doraglobe, spg2xx_game_doraphone_state,empty_init, "VTech", "Dora the Explorer - Dora TV Adventure Globe", MACHINE_IMPERFECT_SOUND )
+CONS( 2007, doraglobg, doraglob, 0, doraphone, doraglobe, spg2xx_game_doraphone_state,empty_init, "VTech", "Dora the Explorer - Doras Abenteuer-Globus (Germany)", MACHINE_IMPERFECT_SOUND )
+
// ROM checksum fails, but is expecting 0 as a result? shows 'CopyRight' when booting normally? protection?
CONS( 200?, jouet, 0, 0, spg2xx, spg2xx, spg2xx_game_state, empty_init, "<unknown>", "10 Jeux Interactifs / Jeux Pour Filles (France)", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/spg2xx_ican.cpp b/src/mame/drivers/spg2xx_ican.cpp
index 0398e13935e..d346c9ad549 100644
--- a/src/mame/drivers/spg2xx_ican.cpp
+++ b/src/mame/drivers/spg2xx_ican.cpp
@@ -430,7 +430,7 @@ DEVICE_IMAGE_LOAD_MEMBER(icanguit_state::cart_load_icanguit)
if (size < 0x800000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/spg2xx_jakks.cpp b/src/mame/drivers/spg2xx_jakks.cpp
index 9878d16ac2a..da3125d5e32 100644
--- a/src/mame/drivers/spg2xx_jakks.cpp
+++ b/src/mame/drivers/spg2xx_jakks.cpp
@@ -16,8 +16,7 @@ public:
{ }
void base_config(machine_config& config);
- void batman(machine_config &config);
- void walle(machine_config& config);
+ void spg2xx_jakks(machine_config& config);
void mk(machine_config& config);
void jakks_mpac(machine_config& config);
@@ -46,13 +45,14 @@ static INPUT_PORTS_START( batman )
PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Menu")
PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("B Button")
PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("X Button")
+ PORT_BIT( 0x00ff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P3")
PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER("i2cmem", i2cmem_device, read_sda)
PORT_BIT(0xfffe, IP_ACTIVE_HIGH, IPT_UNUSED)
INPUT_PORTS_END
-static INPUT_PORTS_START( walle )
+static INPUT_PORTS_START( spg2xx_jakks )
PORT_START("P1")
PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
@@ -60,11 +60,18 @@ static INPUT_PORTS_START( walle )
PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("A Button")
PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("B Button")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) // Button 3 if used
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) // Button 4 if used
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Menu / Pause")
+ PORT_BIT( 0x000f, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P3")
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("i2cmem", i2cmem_device, read_sda)
- PORT_BIT( 0xfff6, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0006, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
+ PORT_BIT( 0xfff0, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
static INPUT_PORTS_START( mk )
@@ -127,13 +134,7 @@ void jakks_state::base_config(machine_config& config)
I2C_24C04(config, m_i2cmem, 0); // ?
}
-void jakks_state::batman(machine_config &config)
-{
- base_config(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_state::mem_map_4m);
-}
-
-void jakks_state::walle(machine_config &config)
+void jakks_state::spg2xx_jakks(machine_config &config)
{
base_config(config);
m_maincpu->set_addrmap(AS_PROGRAM, &jakks_state::mem_map_2m);
@@ -181,6 +182,11 @@ ROM_START( jak_wall )
//ROM_LOAD16_WORD_SWAP( "walle.bin", 0x000000, 0x400000, BAD_DUMP CRC(6bc90b16) SHA1(184d72de059057aae7800da510fcf05ed1da9ec9))
ROM_END
+ROM_START( jak_sbjd )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "spongebobjelly.bin", 0x000000, 0x400000, CRC(804fbd87) SHA1(519aa7fada993837cb57fce26a1d721547af1861) )
+ROM_END
+
ROM_START( jak_mk )
ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
// Sources indicate this should use a 6MB ROM. The ROM here dosen't end on a blank fill and even the ROM checksum listed in the header seems to be about 50% off.
@@ -194,9 +200,9 @@ ROM_START( jak_mpacw )
ROM_END
-// JAKKS Pacific Inc TV games
-CONS( 2004, jak_batm, 0, 0, batman, batman, jakks_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "The Batman (JAKKS Pacific TV Game)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2008, jak_wall, 0, 0, walle, walle, jakks_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Wall-E (JAKKS Pacific TV Game)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+// Pre-GameKey units
+
+CONS( 2004, jak_batm, 0, 0, spg2xx_jakks, batman, jakks_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "The Batman (JAKKS Pacific TV Game)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
// you could link 2 pads of this together for 2 player mode as you could with WWE (feature not emulated)
CONS( 2004, jak_mk, 0, 0, mk, mk, jakks_state, empty_init, "JAKKS Pacific Inc / Digital Eclipse", "Mortal Kombat (JAKKS Pacific TV Game)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
@@ -204,3 +210,18 @@ CONS( 2004, jak_mk, 0, 0, mk, mk, jakks_state, empty_init, "JAKKS Paci
// this is an older unit than the jak_mpac Game Key Ready set and features no GameKey branding
CONS( 2004, jak_mpacw,0, 0, jakks_mpac, jak_mpac, jakks_state, empty_init, "JAKKS Pacific Inc / Namco / HotGen Ltd", "Ms. Pac-Man 7-in-1 (Wireless) (Ms. Pac-Man, Pole Position, Galaga, Xevious, Mappy, New Rally X, Bosconian) (18 AUG 2004 A)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NM (3 keys available [Dig Dug, New Rally-X], [Rally-X, Pac-Man, Bosconian], [Pac-Man, Bosconian])
+
+// Post-GameKey units (all of these still have GameKey references in the code even if the physical connector was no longer present on the PCB)
+
+// This was available in 2 different case styles, initially an underwater / jellyfish themed one, then later
+// reissued in a 'SpongeBob head' style case reminiscent of the undumpable 2003 SpongeBob plug and play but
+// with 2 buttons in the top left corner instead of 1
+//
+// The software on both versions of Jellyfish Dodge is believed to be the same, the build date can be seen in
+// the 'hidden' test mode.
+//
+// A further updated version of this, adapted for touch controls, was released as a 'TV Touch' unit, see
+// spg2xx_jakks_tvtouch.cpp
+CONS( 2007, jak_sbjd, 0, 0, spg2xx_jakks, spg2xx_jakks, jakks_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "SpongeBob SquarePants Jellyfish Dodge (JAKKS Pacific TV Game) (Apr 5 2007)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+
+CONS( 2008, jak_wall, 0, 0, spg2xx_jakks, spg2xx_jakks, jakks_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Wall-E (JAKKS Pacific TV Game) (Dec 18 2007 11:34:25)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/spg2xx_smarttv.cpp b/src/mame/drivers/spg2xx_smarttv.cpp
index 27f042d8a7a..bc315ae4a43 100644
--- a/src/mame/drivers/spg2xx_smarttv.cpp
+++ b/src/mame/drivers/spg2xx_smarttv.cpp
@@ -193,7 +193,7 @@ DEVICE_IMAGE_LOAD_MEMBER(smarttv_state::cart_load_smarttv)
if (size > 0x800000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/spg2xx_telestory.cpp b/src/mame/drivers/spg2xx_telestory.cpp
index 972cf1206fb..b8a0dd24411 100644
--- a/src/mame/drivers/spg2xx_telestory.cpp
+++ b/src/mame/drivers/spg2xx_telestory.cpp
@@ -257,7 +257,7 @@ DEVICE_IMAGE_LOAD_MEMBER(telestory_state::cart_load_telestory)
if (size > 0x800000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/spg2xx_tvgogo.cpp b/src/mame/drivers/spg2xx_tvgogo.cpp
index df0bc746d07..b1bf613e7d0 100644
--- a/src/mame/drivers/spg2xx_tvgogo.cpp
+++ b/src/mame/drivers/spg2xx_tvgogo.cpp
@@ -210,7 +210,7 @@ DEVICE_IMAGE_LOAD_MEMBER(tvgogo_state::cart_load_tvgogo)
if (size > 0x800000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/spg2xx_vii.cpp b/src/mame/drivers/spg2xx_vii.cpp
index 19ec4195a79..1175342d63e 100644
--- a/src/mame/drivers/spg2xx_vii.cpp
+++ b/src/mame/drivers/spg2xx_vii.cpp
@@ -153,7 +153,7 @@ DEVICE_IMAGE_LOAD_MEMBER(vii_state::cart_load_vii)
if (size < 0x800000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/spirit76.cpp b/src/mame/drivers/spirit76.cpp
index d79e3614840..38cc13d9367 100644
--- a/src/mame/drivers/spirit76.cpp
+++ b/src/mame/drivers/spirit76.cpp
@@ -1,11 +1,11 @@
// license:BSD-3-Clause
-// copyright-holders:Ivan Vangelista
+// copyright-holders:Robbbert
// PINBALL
/*********************************************************************************************************************
Skeleton driver for Mirco's Spirit of 76, one of the first if not the first commercial solid-state pinball game.
Hardware listing and ROM definitions from PinMAME.
-No schematic has been located as yet.
+No schematic of the CPU or sound boards has been located, so this is largely guesswork.
Hardware:
CPU: 1 x M6800
@@ -18,6 +18,19 @@ OTHER INDICATORS: 5 red leds for the ball in play
5x lights for Drum Bonus, 13 lights for the Cannon
Settings are done with 2x 8 dipswitches
Switch at G6 (sw1-4 = free game scores, sw5-8 = config), at G8 (coin chute settings)
+
+2021-08-29 Game mostly working [Robbbert]
+
+TODO:
+- Outputs (lamps)
+- After starting a 2-player game, the credit button will let you waste away your remaining credits.
+- The 240k/280k preset high score free games are actually 200k.
+- The settings for the right-hand coin slot are ignored; both slots use the left-hand slot's settings.
+- Find tilt input
+- There's supposed to be a boom box and sound card in the cabinet to make various noisy effects, but
+ no examples have been found.
+
+
*********************************************************************************************************************/
#include "emu.h"
@@ -25,13 +38,19 @@ Switch at G6 (sw1-4 = free game scores, sw5-8 = config), at G8 (coin chute setti
#include "cpu/m6800/m6800.h"
#include "machine/6821pia.h"
#include "machine/timer.h"
+#include "spirit76.lh"
class spirit76_state : public genpin_class
{
public:
spirit76_state(const machine_config &mconfig, device_type type, const char *tag)
: genpin_class(mconfig, type, tag)
- , m_maincpu(*this, "maincpu") { }
+ , m_maincpu(*this, "maincpu")
+ , m_switches(*this, "X%d", 0U)
+ , m_digits(*this, "digit%d", 0U)
+ , m_leds(*this, "led%d", 0U)
+ , m_solenoids(*this, "sol%d", 0U)
+ { }
void spirit76(machine_config &config);
@@ -40,85 +59,283 @@ private:
void porta_w(u8 data);
void portb_w(u8 data);
u8 porta_r();
- u8 portb_r();
- void unk_w(u8 data);
- u8 unk_r();
+ u8 sw_r();
void maincpu_map(address_map &map);
- u8 m_t_c;
+ u8 m_t_c = 0;
+ u8 m_strobe = 0;
+ u8 m_segment = 0;
+ u8 m_last_solenoid[2] = { 0, 0 };
+ virtual void machine_start() override;
virtual void machine_reset() override;
required_device<cpu_device> m_maincpu;
+ required_ioport_array<16> m_switches;
+ output_finder<16> m_digits;
+ output_finder<8> m_leds;
+ output_finder<16> m_solenoids;
};
void spirit76_state::maincpu_map(address_map &map)
{
map.unmap_value_high();
-// map.global_mask(0xfff); // this could most likely go in once the memory map is sorted
+ map.global_mask(0xfff);
map(0x0000, 0x00ff).ram(); // 2x 2112
- map(0x2200, 0x2203).rw("pia", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // 6820
- map(0x2400, 0x2400).r(FUNC(spirit76_state::unk_r));
- map(0x2401, 0x2401).w(FUNC(spirit76_state::unk_w));
+ map(0x0200, 0x0203).rw("pia", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // 6820
+ map(0x0400, 0x0400).r(FUNC(spirit76_state::sw_r));
map(0x0600, 0x0fff).rom().region("roms", 0);
- map(0xfe00, 0xffff).rom().region("roms", 0x800);
}
static INPUT_PORTS_START( spirit76 )
- PORT_START("DSW0")
- PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_START("DSW1")
- PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_START("X0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Upper right advance bonus")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Middle right advance bonus")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Lower right collect bonus")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("X1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Right 50pt wing target")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Right sling")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Lower right advance bonus")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("X2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("6 rollover")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Upper right target")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("Lower right target")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("X3")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Right 100pt wing target")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("Right bumper")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("X4")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("2nd 7 rollover")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Upper eagle targets")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Lower right switch")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("X5")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Right 500 wing target")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Left 1000pt target")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("X6")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("Left 500pt wing target")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("Centre bumper")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Outhole")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START )
+
+ PORT_START("X7")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("1st 7 rollover")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Mystery 1000pt")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_LSHIFT) PORT_NAME("Left Flipper")
+
+ PORT_START("X8")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Left 100pt wing target")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Left bumper")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Lower left switch")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Right Flipper")
+
+ PORT_START("X9")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("1 rollover")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Left sling")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Lower left target")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("X10")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Left 50pt wing target")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Upper left target")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Lower left advance bonus")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
+
+ PORT_START("X11")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Upper left advance bonus")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Middle left advance bonus")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("Lower left collect bonus")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 )
+
+ PORT_START("X12")
+ PORT_DIPNAME( 0x08, 0x00, "Preset score award allowed")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x08, DEF_STR(Off))
+ PORT_DIPNAME( 0x04, 0x00, "Match")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x04, DEF_STR(Off))
+ PORT_DIPNAME( 0x02, 0x02, "Add-a-ball")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x02, DEF_STR(Off))
+ PORT_DIPNAME( 0x01, 0x01, "Balls")
+ PORT_DIPSETTING( 0x00, "5")
+ PORT_DIPSETTING( 0x01, "3")
+
+ PORT_START("X13")
+ PORT_DIPNAME( 0x0f, 0x0f, "Preset score")
+ PORT_DIPSETTING( 0x0f, "40k") // more free games at 70k, 100k - undocumented
+ PORT_DIPSETTING( 0x0e, "50k")
+ PORT_DIPSETTING( 0x0d, "60k")
+ PORT_DIPSETTING( 0x0c, "70k")
+ PORT_DIPSETTING( 0x0b, "80k")
+ PORT_DIPSETTING( 0x0a, "90k")
+ PORT_DIPSETTING( 0x09, "100k")
+ PORT_DIPSETTING( 0x08, "120k")
+ PORT_DIPSETTING( 0x07, "140k")
+ PORT_DIPSETTING( 0x06, "160k")
+ PORT_DIPSETTING( 0x05, "180k")
+ PORT_DIPSETTING( 0x04, "200k")
+ PORT_DIPSETTING( 0x03, "240k") // actually 200k
+ PORT_DIPSETTING( 0x02, "280k") // actually 200k
+ PORT_DIPSETTING( 0x01, "320k")
+ PORT_DIPSETTING( 0x00, "400k")
+
+ PORT_START("X14")
+ PORT_DIPNAME( 0x0f, 0x0f, "Coinage Left Slot")
+ PORT_DIPSETTING( 0x0f, "1C_1C")
+ PORT_DIPSETTING( 0x0e, "1C_2C")
+ PORT_DIPSETTING( 0x0d, "1C_3C")
+ PORT_DIPSETTING( 0x0c, "1C_4C")
+
+ PORT_START("X15")
+ PORT_DIPNAME( 0x0f, 0x0f, "Coinage Right Slot") // has no effect - it does what slot 1 does
+ PORT_DIPSETTING( 0x0f, "1C_1C")
+ PORT_DIPSETTING( 0x0e, "1C_2C")
+ PORT_DIPSETTING( 0x0d, "1C_3C")
+ PORT_DIPSETTING( 0x0c, "1C_4C")
INPUT_PORTS_END
TIMER_DEVICE_CALLBACK_MEMBER( spirit76_state::irq )
{
- if (m_t_c > 0x70)
- m_maincpu->set_input_line(M6800_IRQ_LINE, ASSERT_LINE);
- else
- m_t_c++;
+ m_t_c++;
+ if (m_t_c > 0x13)
+ m_t_c = 0x10;
+ if (m_t_c > 0x10)
+ {
+ if (m_t_c < 0x12)
+ m_maincpu->set_input_line(M6800_IRQ_LINE, ASSERT_LINE);
+ else
+ m_maincpu->set_input_line(M6800_IRQ_LINE, CLEAR_LINE);
+ }
}
-// continual write in irq routine
+
void spirit76_state::porta_w(u8 data)
{
- printf("PORT A=%X\n",data);
+ m_segment = data & 15;
}
-// continual write in irq routine
void spirit76_state::portb_w(u8 data)
{
- printf("PORT B=%X\n",data);
-}
+ static constexpr uint8_t patterns[16] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0,0,0,0,0,0 }; // unknown decoder that blanks out 10-15
+ // DISPLAYS
+ if (BIT(data, 7))
+ {
+ m_strobe = data & 15;
+ if (m_strobe == 7) // indicate player-up
+ {
+ if (BIT(m_segment, 0))
+ {
+ m_leds[5] = BIT(m_segment, 2);
+ m_leds[6] = !BIT(m_segment, 2);
+ m_segment = 15; // blank the match
+ }
+ else
+ {
+ m_leds[5] = 0;
+ m_leds[6] = 0;
+ m_segment = 0;
+ }
+ }
+ else
+ if (m_strobe == 5) // indicate ball in play
+ {
+ u8 ball = 15;
+ switch (m_segment)
+ {
+ case 1: ball = 0; break;
+ case 7: ball = 1; break;
+ case 3: ball = 2; break;
+ case 2: ball = 3; break;
+ case 8: ball = 4; break;
+ default:
+ break;
+ }
+ for (u8 i = 0; i < 5; i++)
+ m_leds[i] = (ball == i);
+ m_segment = 0;
+ }
-// continual read in irq routine
-u8 spirit76_state::porta_r()
-{
- printf("Read PORT A\n");
- return 0xff;
+ m_digits[m_strobe] = patterns[m_segment & 15];
+ }
+
+ // SOLENOIDS
+ // Some solenoids get continuously pulsed, which is absorbed by the real thing, but
+ // causes issues for us. So we need to use only the first occurrence of a particular sound.
+ if (BIT(data, 5))
+ {
+ data &= 15;
+ if (data == 0)
+ {
+ if (m_last_solenoid[0])
+ m_solenoids[m_last_solenoid[0]] = 0; // turn off last solenoid
+ m_last_solenoid[1] = m_last_solenoid[0]; // store it away
+ m_last_solenoid[0] = 0;
+ }
+ else
+ {
+ m_last_solenoid[0] = data;
+ if (m_last_solenoid[1] != data)
+ {
+ m_solenoids[data] = 1;
+ switch (data)
+ {
+ case 1: m_samples->start(3, 3); break; // 10 chime
+ case 2: m_samples->start(2, 2); break; // 100 chime
+ case 3: m_samples->start(1, 1); break; // 1000 chime
+ case 4: case 14: m_samples->start(0, 6); break; // knocker
+ //case 5: m_samples->start(x, 6); break; // Right flipper
+ //case 7: m_samples->start(x, 6); break; // Left flipper
+ case 8: case 9: case 10: m_samples->start(4, 0); break; // 3 bumpers
+ case 11: case 12: m_samples->start(4, 7); break; // 2 slings
+ case 13: m_samples->start(5, 5); break; // outhole
+ default: break;
+ }
+ }
+ }
+ }
}
-// might not be used?
-u8 spirit76_state::portb_r()
+u8 spirit76_state::porta_r()
{
- printf("Read PORT B\n");
return 0xff;
}
-// writes here once at start
-void spirit76_state::unk_w(u8 data)
+u8 spirit76_state::sw_r()
{
- printf("UNK PORT=%X\n",data);
+ return ~m_switches[m_strobe]->read();
}
-// continual read in irq routine
-u8 spirit76_state::unk_r()
+void spirit76_state::machine_start()
{
- return 0;
+ m_digits.resolve();
+ m_leds.resolve();
+ m_solenoids.resolve();
+ save_item(NAME(m_t_c));
+ save_item(NAME(m_strobe));
+ save_item(NAME(m_segment));
+ save_item(NAME(m_last_solenoid));
}
void spirit76_state::machine_reset()
{
m_t_c = 0;
+ m_strobe = 0;
+ m_segment = 0;
+ m_last_solenoid[0] = 0;
+ m_last_solenoid[1] = 0;
}
void spirit76_state::spirit76(machine_config &config)
@@ -127,21 +344,16 @@ void spirit76_state::spirit76(machine_config &config)
M6800(config, m_maincpu, 500000);
m_maincpu->set_addrmap(AS_PROGRAM, &spirit76_state::maincpu_map);
- TIMER(config, "irq").configure_periodic(FUNC(spirit76_state::irq), attotime::from_hz(120));
+ TIMER(config, "irq").configure_periodic(FUNC(spirit76_state::irq), attotime::from_hz(1200));
/* video hardware */
- //config.set_default_layout();
+ config.set_default_layout(layout_spirit76);
//6821pia
pia6821_device &pia(PIA6821(config, "pia", 0));
pia.writepa_handler().set(FUNC(spirit76_state::porta_w));
pia.writepb_handler().set(FUNC(spirit76_state::portb_w));
pia.readpa_handler().set(FUNC(spirit76_state::porta_r));
- pia.readpb_handler().set(FUNC(spirit76_state::portb_r));
-// pia.ca2_handler().set(FUNC(spirit76_state::pia22_ca2_w));
-// pia.cb2_handler().set(FUNC(spirit76_state::pia22_cb2_w));
-// pia.irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
-// pia.irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
/* sound hardware */
genpin_audio(config);
diff --git a/src/mame/drivers/squale.cpp b/src/mame/drivers/squale.cpp
index e0b7dce8e0b..018f9a12903 100644
--- a/src/mame/drivers/squale.cpp
+++ b/src/mame/drivers/squale.cpp
@@ -629,7 +629,7 @@ DEVICE_IMAGE_LOAD_MEMBER( squale_state::cart_load )
if ( ! size || size > 0x10000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/srmp6.cpp b/src/mame/drivers/srmp6.cpp
index 5e475439094..08d2dee3f00 100644
--- a/src/mame/drivers/srmp6.cpp
+++ b/src/mame/drivers/srmp6.cpp
@@ -164,7 +164,7 @@ static inline u8 get_fade(int c, int f) // same as CPS3?
{
f &= 0x3f;
c = (f & 0x20) ? (c + (((0x1f - c) * (f & 0x1f)) / 0x1f)) : ((c * f) / 0x1f);
- c = std::max(0, std::min(0x1f, c));
+ c = std::clamp(c, 0, 0x1f);
}
return c;
}
diff --git a/src/mame/drivers/stellafr.cpp b/src/mame/drivers/stellafr.cpp
index 97c6c0cb781..e71916c1e4e 100644
--- a/src/mame/drivers/stellafr.cpp
+++ b/src/mame/drivers/stellafr.cpp
@@ -102,7 +102,7 @@ void stellafr_state::stellafr(machine_config &config)
SPEAKER(config, "mono").front_center();
ay8910_device &aysnd(AY8910(config, "aysnd", 1000000));
- aysnd.add_route(ALL_OUTPUTS, "mono", 1.0);
+ aysnd.add_route(ALL_OUTPUTS, "mono", 0.85);
aysnd.port_a_read_callback().set_ioport("INPUTS");
aysnd.port_b_write_callback().set(FUNC(stellafr_state::ay8910_portb_w));
}
diff --git a/src/mame/drivers/studio2.cpp b/src/mame/drivers/studio2.cpp
index 44278fe4780..f51c62a7d79 100644
--- a/src/mame/drivers/studio2.cpp
+++ b/src/mame/drivers/studio2.cpp
@@ -604,7 +604,7 @@ DEVICE_IMAGE_LOAD_MEMBER( studio2_state::cart_load )
if (image.length() < 0x200)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid ROM file");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid ROM file");
return image_init_result::FAIL;
}
@@ -613,14 +613,14 @@ DEVICE_IMAGE_LOAD_MEMBER( studio2_state::cart_load )
// validate
if (strncmp((const char *)header, "RCA2", 4))
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Not an .ST2 file");
+ image.seterror(image_error::INVALIDIMAGE, "Not an .ST2 file");
return image_init_result::FAIL;
}
blocks = header[4];
if ((blocks < 2) || (blocks > 11))
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid .ST2 file");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid .ST2 file");
return image_init_result::FAIL;
}
@@ -654,7 +654,7 @@ DEVICE_IMAGE_LOAD_MEMBER( studio2_state::cart_load )
size = image.length();
if (size > 0x400)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
else
diff --git a/src/mame/drivers/supracan.cpp b/src/mame/drivers/supracan.cpp
index a4ecfdf39d5..3627b8f4b88 100644
--- a/src/mame/drivers/supracan.cpp
+++ b/src/mame/drivers/supracan.cpp
@@ -1922,7 +1922,7 @@ DEVICE_IMAGE_LOAD_MEMBER(supracan_state::cart_load)
if (size > 0x400000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/supstarf.cpp b/src/mame/drivers/supstarf.cpp
index c51a223445c..f717a6d1c7d 100644
--- a/src/mame/drivers/supstarf.cpp
+++ b/src/mame/drivers/supstarf.cpp
@@ -2,9 +2,21 @@
// copyright-holders:AJR
/***************************************************************************
- Super Star (Recreativos Franco)
-
- Skeleton driver for 8085-based pinball hardware.
+Super Star (Recreativos Franco)
+
+Skeleton driver for 8085-based pinball hardware.
+
+TODO:
+- The ROM for the sound cpu is a bad dump. The 8035 should set itself up,
+ then signal a rst(call 0024) to the 8085 which in turn sets up key
+ indicators in RAM and enabling the machine to begin. With the bad dump,
+ none of that can happen.
+- Display circuits: i8259, 74164, 74159 and other bits.
+- Default layout
+- Outputs (solenoids, lamps)
+- Inputs (switches)
+- NVRAM (5517 ram is battery-backed)
+- Manual is missing a couple of pages.
***************************************************************************/
diff --git a/src/mame/drivers/sv8000.cpp b/src/mame/drivers/sv8000.cpp
index d671302c563..5302f27a27e 100644
--- a/src/mame/drivers/sv8000.cpp
+++ b/src/mame/drivers/sv8000.cpp
@@ -207,7 +207,7 @@ DEVICE_IMAGE_LOAD_MEMBER( sv8000_state::cart_load )
if (size != 0x1000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Incorrect or not support cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Incorrect or not support cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/svision.cpp b/src/mame/drivers/svision.cpp
index a39279b8735..0462d92d864 100644
--- a/src/mame/drivers/svision.cpp
+++ b/src/mame/drivers/svision.cpp
@@ -449,7 +449,7 @@ DEVICE_IMAGE_LOAD_MEMBER( svision_state::cart_load )
if (size > 0x80000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/taito_b.cpp b/src/mame/drivers/taito_b.cpp
index b096b75e5d7..08f74d5f543 100644
--- a/src/mame/drivers/taito_b.cpp
+++ b/src/mame/drivers/taito_b.cpp
@@ -3055,24 +3055,6 @@ ROM_START( rambo3p ) /* Is this set a prototype or possible bootleg? */
ROM_LOAD( "r3-a4.rom", 0x60000, 0x20000, CRC(9cf4c21b) SHA1(756fc6bbc798a39a18eab3829e032cac8fe3f8ed) )
ROM_END
-ROM_START( bublbust ) // Purportedly a location test version, but has the same version number and build date as the released Japanese set below
- ROM_REGION( 0x80000, "maincpu", 0 ) // 512k for 68000 code - located on Taito C0503005B main board
- ROM_LOAD16_BYTE( "p.bobble_prg_h_usa_6-15_c681.ic18", 0x00000, 0x40000, CRC(ba83e398) SHA1(2512ea5a805f0e5c470c4d216d679f3dc3c4aa82) ) // hand written label P.Bobble PRG H USA 6/15 C681 - "Bobble" written in Kanji
- ROM_LOAD16_BYTE( "p.bobble_prg_l_usa_6-15_e9e1.ic2", 0x00001, 0x40000, CRC(a12cb3f2) SHA1(06271d3a0af101a959e6e777f1f9e99bae1e6076) ) // hand written label P.Bobble PRG L USA 6/15 E9E1 - "Bobble" written in Kanji
-
- ROM_REGION( 0x20000, "audiocpu", 0 ) // 128k for Z80 code - located on Taito C0503005B main board
- ROM_LOAD( "prg_snd.ic27", 0x00000, 0x20000, CRC(2f288fe0) SHA1(4ba707f4b3a1ca0e573652d1c733ee889f9fef8a) ) // hand written label PRG SND IC 27 - no checksum listed
-
- ROM_REGION( 0x100000, "tc0180vcu", 0 ) // located on Taito C0503002A ROM PCB
- ROM_LOAD16_BYTE( "p.bobble_chr-1l_6-14_eaa0.ic11_ch_1_0l", 0x00000, 0x40000, CRC(8d3fa2f0) SHA1(3d36944e35081740469df61a40e538eb94ea2ef6) ) // hand written label P.Bobble CHR 1L 6/14 EAA0 - "Bobble" written in Kanji
- ROM_LOAD16_BYTE( "p.bobble_chr-1h_6-14_1515.ic12_ch_1_0h", 0x00001, 0x40000, CRC(a2eb4d32) SHA1(571811a543af50cc5e0f1d7aad9fc388919e93e6) ) // hand written label P.Bobble CHR 1H 6/14 1515 - "Bobble" written in Kanji
- ROM_LOAD16_BYTE( "p.bobble_chr-0l_6-14_86d5.ic7_ch_0_0l", 0x80000, 0x40000, CRC(80f1aab0) SHA1(f5cdb93aa702fb8ba91eaf8f470b6e2a61a581b5) ) // hand written label P.Bobble CHR 0L 6/14 86D5 - "Bobble" written in Kanji
- ROM_LOAD16_BYTE( "p.bobble_chr-0h_6-14_d180.ic8_ch_0_0h", 0x80001, 0x40000, CRC(d773cac8) SHA1(b008a21c39650a28cba402cd1c4de0567e275bc9) ) // hand written label P.Bobble CHR 0H 6/14 D180 - "Bobble" written in Kanji
-
- ROM_REGION( 0x100000, "ymsnd:adpcma", 0 ) // located on Taito C0503002A ROM PCB - Half the size of the Japanese ADPCMA sample ROM
- ROM_LOAD( "ach0-kaigai.ic15_ach_0", 0x00000, 0x80000, CRC(f203ae52) SHA1(d41b880ef17eea6614e2911318db5cd070473381) ) // hand written ???
-ROM_END
-
ROM_START( pbobble )
ROM_REGION( 0x80000, "maincpu", 0 ) /* 512k for 68000 code */
ROM_LOAD16_BYTE( "pb-1c18.bin", 0x00000, 0x40000, CRC(5de14f49) SHA1(91d537748f26e19a5c32de4b8dad341750de39ef) )
@@ -3089,6 +3071,24 @@ ROM_START( pbobble )
ROM_LOAD( "pb-ic15.bin", 0x000000, 0x100000, CRC(0840cbc4) SHA1(1adbd7aef44fa80832f63dfb8efdf69fd7256a57) )
ROM_END
+ROM_START( bublbust ) // Purportedly a location test version, but has the same version number and build date as the released Japanese set below
+ ROM_REGION( 0x80000, "maincpu", 0 ) // 512k for 68000 code - located on Taito C0503005B main board
+ ROM_LOAD16_BYTE( "p.bobble_prg_h_kyotsu_6-15_c681.ic18", 0x00000, 0x40000, CRC(ba83e398) SHA1(2512ea5a805f0e5c470c4d216d679f3dc3c4aa82) ) // hand written label P.ボブル PRG H 共通 6/15 C681
+ ROM_LOAD16_BYTE( "p.bobble_prg_l_usa_6-15_e9e1.ic2", 0x00001, 0x40000, CRC(a12cb3f2) SHA1(06271d3a0af101a959e6e777f1f9e99bae1e6076) ) // hand written label P.ボブル PRG L USA 6/15 E9E1
+
+ ROM_REGION( 0x20000, "audiocpu", 0 ) // 128k for Z80 code - located on Taito C0503005B main board
+ ROM_LOAD( "prg_snd.ic27", 0x00000, 0x20000, CRC(2f288fe0) SHA1(4ba707f4b3a1ca0e573652d1c733ee889f9fef8a) ) // hand written label PRG SND IC 27 - no checksum listed
+
+ ROM_REGION( 0x100000, "tc0180vcu", 0 ) // located on Taito C0503002A ROM PCB
+ ROM_LOAD16_BYTE( "p.bobble_chr-1l_6-14_eaa0.ic11_ch_1_0l", 0x00000, 0x40000, CRC(8d3fa2f0) SHA1(3d36944e35081740469df61a40e538eb94ea2ef6) ) // hand written label P.ボブル CHR 1L 6/14 EAA0
+ ROM_LOAD16_BYTE( "p.bobble_chr-1h_6-14_1515.ic12_ch_1_0h", 0x00001, 0x40000, CRC(a2eb4d32) SHA1(571811a543af50cc5e0f1d7aad9fc388919e93e6) ) // hand written label P.ボブル CHR 1H 6/14 1515
+ ROM_LOAD16_BYTE( "p.bobble_chr-0l_6-14_86d5.ic7_ch_0_0l", 0x80000, 0x40000, CRC(80f1aab0) SHA1(f5cdb93aa702fb8ba91eaf8f470b6e2a61a581b5) ) // hand written label P.ボブル CHR 0L 6/14 86D5
+ ROM_LOAD16_BYTE( "p.bobble_chr-0h_6-14_d180.ic8_ch_0_0h", 0x80001, 0x40000, CRC(d773cac8) SHA1(b008a21c39650a28cba402cd1c4de0567e275bc9) ) // hand written label P.ボブル CHR 0H 6/14 D180 (label torn, checksum illegible besides final 0)
+
+ ROM_REGION( 0x100000, "ymsnd:adpcma", 0 ) // located on Taito C0503002A ROM PCB - Half the size of the Japanese ADPCMA sample ROM
+ ROM_LOAD( "cr40-kaigai-7bec.ic15_ach_0", 0x00000, 0x80000, CRC(f203ae52) SHA1(d41b880ef17eea6614e2911318db5cd070473381) ) // hand written label CR40 海外 7BEC
+ROM_END
+
ROM_START( spacedx )
ROM_REGION( 0x80000, "maincpu", 0 ) /* 512k for 68000 code */
ROM_LOAD16_BYTE( "d89-06", 0x00000, 0x40000, CRC(7122751e) SHA1(4b4eb58af28f1988ff102251407449d0affbd4c2) )
@@ -3574,8 +3574,8 @@ GAME( 1993, ryujina, ryujin, selfeena, ryujin, taitob_state, init_taito_b,
GAME( 1993, qzshowby, 0, qzshowby, qzshowby, taitob_state, init_taito_b, ROT0, "Taito Corporation", "Quiz Sekai wa SHOW by shobai (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, bublbust, 0, pbobble, pbobble, taitob_state, init_taito_b, ROT0, "Taito America Corporation", "Bubble Buster (USA, B-System)", MACHINE_SUPPORTS_SAVE ) // PUZZLE VER 2.0A 1994/06/15 15:28:30 - Location test but same build as Japan release?
-GAME( 1994, pbobble, bublbust,pbobble, pbobble, taitob_state, init_taito_b, ROT0, "Taito Corporation", "Puzzle Bobble (Japan, B-System)", MACHINE_SUPPORTS_SAVE ) // PUZZLE VER 2.0J 1994/06/15 15:28:30
+GAME( 1994, pbobble, 0, pbobble, pbobble, taitob_state, init_taito_b, ROT0, "Taito Corporation", "Puzzle Bobble (Japan, B-System)", MACHINE_SUPPORTS_SAVE ) // PUZZLE VER 2.0J 1994/06/15 15:28:30
+GAME( 1994, bublbust, pbobble, pbobble, pbobble, taitob_state, init_taito_b, ROT0, "Taito America Corporation", "Bubble Buster (USA, B-System)", MACHINE_SUPPORTS_SAVE ) // PUZZLE VER 2.0A 1994/06/15 15:28:30 - Location test but same build as Japan release?
GAME( 1994, spacedx, 0, spacedx, pbobble, taitob_state, init_taito_b, ROT0, "Taito Corporation", "Space Invaders DX (US, v2.1)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, spacedxj, spacedx, spacedx, pbobble, taitob_state, init_taito_b, ROT0, "Taito Corporation", "Space Invaders DX (Japan, v2.1)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/taito_f2.cpp b/src/mame/drivers/taito_f2.cpp
index 0caedbc8a43..0bb7b9dd58a 100644
--- a/src/mame/drivers/taito_f2.cpp
+++ b/src/mame/drivers/taito_f2.cpp
@@ -2162,8 +2162,11 @@ static INPUT_PORTS_START( deadconx )
TAITO_COINAGE_WORLD_LOC(SW1)
PORT_START("DSWB") /* DSW B, missing a timer speed maybe? */
- PORT_DIPUNUSED_DIPLOC( 0x01, 0x01, "SW2:1" ) /* Listed as "NOT USE" */
- PORT_DIPUNUSED_DIPLOC( 0x02, 0x02, "SW2:2" ) /* Listed as "NOT USE" */
+ PORT_DIPNAME( 0x03, 0x03, "Number of Enemies 1/2 Player" ) PORT_DIPLOCATION("SW2:1,2") // see MT08059
+ PORT_DIPSETTING( 0x01, "25/45" )
+ PORT_DIPSETTING( 0x03, "30/50" )
+ PORT_DIPSETTING( 0x02, "40/60" )
+ PORT_DIPSETTING( 0x00, "50/70" )
PORT_DIPUNUSED_DIPLOC( 0x04, 0x04, "SW2:3" ) /* Listed as "NOT USE" */
PORT_DIPNAME( 0x18, 0x18, "Life Meter") PORT_DIPLOCATION("SW2:4,5")
PORT_DIPSETTING( 0x00, "5" )
@@ -2171,11 +2174,10 @@ static INPUT_PORTS_START( deadconx )
PORT_DIPSETTING( 0x18, "10" )
PORT_DIPSETTING( 0x08, "12" )
PORT_DIPUNUSED_DIPLOC( 0x20, 0x20, "SW2:6" ) /* Listed as "NOT USE" */
- PORT_DIPNAME( 0xc0, 0xc0, "Number of Enemies 1/2 Player" ) PORT_DIPLOCATION("SW2:7,8")
- PORT_DIPSETTING( 0xc0, "30/50" )
- PORT_DIPSETTING( 0x80, "40/60" )
- PORT_DIPSETTING( 0x40, "25/45" )
- PORT_DIPSETTING( 0x00, "50/70" )
+ PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW2:7" ) /* Listed as "NOT USE" */
+ PORT_DIPNAME( 0x80, 0x80, "Upright Controls" ) PORT_DIPLOCATION("SW2:8") // single or two players at once
+ PORT_DIPSETTING( 0x00, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Dual ) )
INPUT_PORTS_END
static INPUT_PORTS_START( deadconxj ) /* Matches PDF of Dip Sheet but not matching current taito coin macros */
@@ -2562,7 +2564,9 @@ static INPUT_PORTS_START( yuyugogo )
PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW2:4" )
PORT_DIPUNUSED_DIPLOC( 0x10, 0x10, "SW2:5" )
PORT_DIPUNUSED_DIPLOC( 0x20, 0x20, "SW2:6" )
- PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW2:7" )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:7")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW2:8" )
PORT_START("IN0")
diff --git a/src/mame/drivers/taito_f3.cpp b/src/mame/drivers/taito_f3.cpp
index a38502aecc1..b9904d9a3aa 100644
--- a/src/mame/drivers/taito_f3.cpp
+++ b/src/mame/drivers/taito_f3.cpp
@@ -203,7 +203,7 @@ void taito_f3_state::f3_map(address_map &map)
map(0xc80100, 0xc80103).w(FUNC(taito_f3_state::sound_reset_1_w));
}
-void taito_f3_state::bubsympb_oki_w(u8 data)
+void taito_f3_state::bubsympb_oki_w(u8 data) // TODO: this is wrong. PCB reference: https://www.youtube.com/watch?v=UbgPg8qUDig
{
//printf("write %08x %08x\n",data,mem_mask);
const u8 bank = data & 0xf;
@@ -213,7 +213,7 @@ void taito_f3_state::bubsympb_oki_w(u8 data)
}
else
{
- logerror("unknown oki bank write %02x at %08x", bank, m_maincpu->pc());
+ logerror("unknown oki bank write %02x at %08x\n", bank, m_maincpu->pc());
}
//printf("oki bank w %08x\n",data);
}
@@ -2413,10 +2413,38 @@ ROM_START( bubsymphb )
ROM_LOAD ("bsb_d11b.bin", 0x000000, 0x080000, CRC(d0607829) SHA1(546c629ec22bb98202c7127ccb77df0b8f3a1966) )
ROM_REGION( 0x100000, "oki" , ROMREGION_ERASE00 ) // OKI6295 samples
- ROM_LOAD("bsb_d11.bin", 0x000000, 0x080000, CRC(26bdc617) SHA1(993e7a52128fdd58f22d95521a629beb71ca7b91) ) // I haven't verified this dump.. but given how bad the rest is I'm not confident
+ ROM_LOAD("bsb_d11.bin", 0x000000, 0x080000, CRC(26bdc617) SHA1(993e7a52128fdd58f22d95521a629beb71ca7b91) )
ROM_RELOAD(0x80000,0x80000)
ROM_END
+ROM_START( bubsymphba ) // extremely similar to bubsymphb (i.e. the only differences in the program ROMs are copyright removals). 2 PCB set: 70121 MAIN + ROM board
+ ROM_REGION( 0x200000, "maincpu", 0 )
+ ROM_LOAD32_BYTE( "2-27c2000.bin", 0x000000, 0x40000, CRC(b26728fa) SHA1(accd2530a5d0aa8baa4598a8312e8c8fd283008f) )
+ ROM_LOAD32_BYTE( "3-27c2000.bin", 0x000001, 0x40000, CRC(d7406de1) SHA1(7d064b249ff576058b762bf2b8dd6dc55bb88ec6) )
+ ROM_LOAD32_BYTE( "4-27c2000.bin", 0x000002, 0x40000, CRC(5a45a291) SHA1(54a53b3c1c057dabbca5e72b289a4f0f96048311) )
+ ROM_LOAD32_BYTE( "5-27c2000.bin", 0x000003, 0x40000, CRC(aad3806b) SHA1(5999c0dd78374b3adc2223ff76478eb2604fc8b8) )
+
+ ROM_REGION( 0x300000, "sprites" , ROMREGION_ERASE00)
+ ROM_LOAD16_WORD_SWAP( "8-27c4000.bin", 0x080000, 0x080000, CRC(22d7eeb5) SHA1(30aa4493c5bc98d9256817b9e3341b20d2b76f1f) )
+ ROM_LOAD16_WORD_SWAP( "9-27c4000.bin", 0x100000, 0x080000, CRC(b8f7b1c6) SHA1(c51aa9168eab4083b5ce0e6c0da6ad6416bd17bd) )
+ ROM_LOAD16_WORD_SWAP( "10-27c4000.bin", 0x180000, 0x080000, CRC(d4981f73) SHA1(25c574aae85e185e01ba451dd15a4b4e14314f78) )
+ ROM_LOAD16_WORD_SWAP( "7-27c4000.bin", 0x200000, 0x080000, CRC(c1c35f7b) SHA1(9e7c821d9f717c56f9cc32f724046a40cc5e336e) )
+ ROM_LOAD16_WORD_SWAP( "6-27c4000.bin", 0x280000, 0x080000, CRC(35a60e28) SHA1(29504c9c2308443aa0b2cd1cd489fcb95737821a) )
+
+ ROM_REGION( 0x200000, "tilemap" , 0)
+ ROM_LOAD32_BYTE( "11-27c4000.bin", 0x000000, 0x080000, CRC(69f814b1) SHA1(9daaaff3652798006fa5432890bdc7c64fbb84c4) )
+ ROM_LOAD32_BYTE( "12-27c4000.bin", 0x000001, 0x080000, CRC(95add6ec) SHA1(5e33624921438bbf785313bd04b1860bd91097d3) )
+ ROM_LOAD32_BYTE( "13-27c4000.bin", 0x000002, 0x080000, CRC(5d87b202) SHA1(1625be0d8222388066694cd56c69b5768edd9513) )
+ ROM_LOAD32_BYTE( "14-27c4000.bin", 0x000003, 0x080000, CRC(8be51e5a) SHA1(69ea6c778eaea246bd763c93f087b6ae1ebf2e1e) )
+
+ ROM_REGION( 0x080000, "tilemap_hi", 0 )
+ ROM_LOAD( "15-27c4000.bin", 0x000000, 0x080000, CRC(45b3cf43) SHA1(f97684b69a56717b1e712dac1f8ff924d3775de0) )
+
+ ROM_REGION( 0x100000, "oki" , ROMREGION_ERASE00 )
+ ROM_LOAD( "1-27c4000.bin", 0x000000, 0x080000, CRC(26bdc617) SHA1(993e7a52128fdd58f22d95521a629beb71ca7b91) )
+ ROM_RELOAD( 0x80000, 0x80000 )
+ROM_END
+
ROM_START( bubsymphu )
ROM_REGION( 0x200000, "maincpu", 0 ) /* 68020 code */
ROM_LOAD32_BYTE("d90-12", 0x000000, 0x40000, CRC(9e523996) SHA1(c49a426f9865f96e8021c8ed9a6ac094c5e586b1) )
@@ -4686,7 +4714,8 @@ GAME( 1994, bublbob2p, bublbob2, f3_224a, f3, taito_f3_state, init_bubsymph, RO
GAME( 1994, bubsymphe, bublbob2, f3_224a, f3, taito_f3_state, init_bubsymph, ROT0, "Taito Corporation Japan", "Bubble Symphony (Ver 2.5O 1994/10/05)", 0 )
GAME( 1994, bubsymphu, bublbob2, f3_224a, f3, taito_f3_state, init_bubsymph, ROT0, "Taito America Corporation", "Bubble Symphony (Ver 2.5A 1994/10/05)", 0 )
GAME( 1994, bubsymphj, bublbob2, f3_224a, f3, taito_f3_state, init_bubsymph, ROT0, "Taito Corporation", "Bubble Symphony (Ver 2.5J 1994/10/05)", 0 )
-GAME( 1994, bubsymphb, bublbob2, bubsympb,f3, taito_f3_state, init_bubsympb, ROT0, "bootleg", "Bubble Symphony (bootleg with OKI6295)", MACHINE_NOT_WORKING ) // backgrounds don't display
+GAME( 1994, bubsymphb, bublbob2, bubsympb,f3, taito_f3_state, init_bubsympb, ROT0, "bootleg", "Bubble Symphony (bootleg with OKI6295)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // backgrounds don't display, OKI banking is wrong
+GAME( 1994, bubsymphba, bublbob2, bubsympb,f3, taito_f3_state, init_bubsympb, ROT0, "bootleg (SOFTV)", "Seoul Symphony (Bubble Symphony bootleg with OKI6295)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // backgrounds don't display, OKI banking is wrong
GAME( 1994, spcinvdj, spacedx, f3, f3, taito_f3_state, init_spcinvdj, ROT0, "Taito Corporation", "Space Invaders DX (Ver 2.6J 1994/09/14) (F3 Version)", 0 )
GAME( 1994, pwrgoal, 0, f3_224a, f3, taito_f3_state, init_hthero95, ROT0, "Taito Corporation Japan", "Taito Power Goal (Ver 2.5O 1994/11/03)", 0 )
GAME( 1994, hthero95, pwrgoal, f3_224a, f3, taito_f3_state, init_hthero95, ROT0, "Taito Corporation", "Hat Trick Hero '95 (Ver 2.5J 1994/11/03)", 0 )
diff --git a/src/mame/drivers/taito_z.cpp b/src/mame/drivers/taito_z.cpp
index 8c2981ac013..eed52da1acf 100644
--- a/src/mame/drivers/taito_z.cpp
+++ b/src/mame/drivers/taito_z.cpp
@@ -1300,7 +1300,7 @@ void taitoz_state::cpua_ctrl_w(offs_t offset, u16 data, u16 mem_mask)
parse_cpu_control();
}
-void taitoz_state::chasehq_cpua_ctrl_w(offs_t offset, u16 data, u16 mem_mask)
+void chasehq_state::chasehq_cpua_ctrl_w(offs_t offset, u16 data, u16 mem_mask)
{
cpua_ctrl_w(offset, data, mem_mask);
@@ -1308,11 +1308,11 @@ void taitoz_state::chasehq_cpua_ctrl_w(offs_t offset, u16 data, u16 mem_mask)
m_lamps[1] = BIT(m_cpua_ctrl, 6);
}
-void taitoz_state::dblaxle_cpua_ctrl_w(offs_t offset, u16 data, u16 mem_mask)
+void dblaxle_state::dblaxle_cpua_ctrl_w(offs_t offset, u16 data, u16 mem_mask)
{
cpua_ctrl_w(offset, data, mem_mask);
- output().set_value("Wheel_Vibration", BIT(data, 2));
+ m_wheel_vibration = BIT(data, 2);
}
@@ -1320,7 +1320,7 @@ void taitoz_state::dblaxle_cpua_ctrl_w(offs_t offset, u16 data, u16 mem_mask)
INTERRUPTS
***********************************************************/
-void taitoz_state::device_timer(timer_instance const &timer)
+void sci_state::device_timer(timer_instance const &timer)
{
switch (timer.id())
{
@@ -1335,7 +1335,7 @@ void taitoz_state::device_timer(timer_instance const &timer)
/***** Routines for particular games *****/
-INTERRUPT_GEN_MEMBER(taitoz_state::sci_interrupt)
+INTERRUPT_GEN_MEMBER(sci_state::sci_interrupt)
{
/* Need 2 int4's per int6 else (-$6b63,A5) never set to 1 which
causes all sprites to vanish! Spriteram has areas for 2 frames
@@ -1374,7 +1374,7 @@ u16 taitoz_state::eep_latch_r()
}
#endif
-void taitoz_state::spacegun_eeprom_w(u8 data)
+void spacegun_state::spacegun_eeprom_w(u8 data)
{
/* 0000xxxx (unused)
000x0000 eeprom reset (active low)
@@ -1411,7 +1411,7 @@ template <int axis> CUSTOM_INPUT_MEMBER(taitoz_state::adstick_r)
return retval[raw_value];
}
-u8 taitoz_state::contcirc_input_bypass_r()
+u8 contcirc_state::contcirc_input_bypass_r()
{
/* Bypass TC0040IOC controller for analog input */
@@ -1432,7 +1432,7 @@ u8 taitoz_state::contcirc_input_bypass_r()
}
-u8 taitoz_state::chasehq_input_bypass_r()
+u8 chasehq_state::chasehq_input_bypass_r()
{
/* Bypass TC0040IOC controller for extra inputs */
@@ -1442,16 +1442,10 @@ u8 taitoz_state::chasehq_input_bypass_r()
switch (port)
{
case 0x08:
- return ioport("UNK1")->read();
-
case 0x09:
- return ioport("UNK2")->read();
-
case 0x0a:
- return ioport("UNK3")->read();
-
case 0x0b:
- return ioport("UNK4")->read();
+ return m_unknown_io[port - 0x08]->read();
case 0x0c:
return steer & 0xff;
@@ -1465,7 +1459,7 @@ u8 taitoz_state::chasehq_input_bypass_r()
}
-u16 taitoz_state::sci_steer_input_r(offs_t offset)
+u16 sci_state::sci_steer_input_r(offs_t offset)
{
u16 steer = 0xff80 + m_steer.read_safe(0x80);
@@ -1484,14 +1478,14 @@ u16 taitoz_state::sci_steer_input_r(offs_t offset)
}
-void taitoz_state::spacegun_gun_output_w(u16 data)
+void spacegun_state::spacegun_gun_output_w(u16 data)
{
- output().set_value("Player1_Gun_Recoil", BIT(data, 0));
- output().set_value("Player2_Gun_Recoil", BIT(data, 1));
+ m_recoil[0] = BIT(data, 0);
+ m_recoil[1] = BIT(data, 1);
}
-u16 taitoz_state::dblaxle_steer_input_r(offs_t offset)
+u16 taitoz_z80_sound_state::dblaxle_steer_input_r(offs_t offset)
{
u16 steer = 0xff80 + m_steer.read_safe(0x80);
@@ -1512,7 +1506,7 @@ u16 taitoz_state::dblaxle_steer_input_r(offs_t offset)
// TODO: proper motorcpu hook-up
-u16 taitoz_state::chasehq_motor_r(offs_t offset)
+u16 chasehq_state::chasehq_motor_r(offs_t offset)
{
switch (offset)
{
@@ -1528,7 +1522,7 @@ u16 taitoz_state::chasehq_motor_r(offs_t offset)
}
}
-void taitoz_state::chasehq_motor_w(offs_t offset, u16 data)
+void chasehq_state::chasehq_motor_w(offs_t offset, u16 data)
{
/* Writes $e00000-25 and $e00200-219 */
switch (offset)
@@ -1545,38 +1539,44 @@ void taitoz_state::chasehq_motor_w(offs_t offset, u16 data)
}
-void taitoz_state::nightstr_motor_w(offs_t offset, u16 data)
+void nightstr_state::nightstr_motor_w(offs_t offset, u16 data)
{
/* Despite the informative notes at the top, the high end of the word doesn't seem to output any useful data. */
/* I've added this so someone else can finish it. */
switch (offset)
{
case 0:
- output().set_value("Motor_1_Direction",0);
- if (BIT(data, 0)) output().set_value("Motor_1_Direction",1);
- if (BIT(data, 1)) output().set_value("Motor_1_Direction",2);
- output().set_value("Motor_1_Speed",(data & 60)/4);
-
+ if (BIT(data, 0))
+ m_motor_dir[0] = 1;
+ else if (BIT(data, 1))
+ m_motor_dir[0] = 2;
+ else
+ m_motor_dir[0] = 0;
+ m_motor_speed[0] = (data & 0x3c) >> 2;
break;
case 4:
- output().set_value("Motor_2_Direction",0);
- if (BIT(data, 0)) output().set_value("Motor_2_Direction",1);
- if (BIT(data, 1)) output().set_value("Motor_2_Direction",2);
- output().set_value("Motor_2_Speed",(data & 60)/4);
-
+ if (BIT(data, 0))
+ m_motor_dir[1] = 1;
+ else if (BIT(data, 1))
+ m_motor_dir[1] = 2;
+ else
+ m_motor_dir[1] = 0;
+ m_motor_speed[1] = (data & 0x3c) >> 2;
break;
case 8:
- output().set_value("Motor_3_Direction",0);
- if (BIT(data, 0)) output().set_value("Motor_3_Direction",1);
- if (BIT(data, 1)) output().set_value("Motor_3_Direction",2);
- output().set_value("Motor_3_Speed",(data & 60)/4);
-
+ if (BIT(data, 0))
+ m_motor_dir[2] = 1;
+ else if (BIT(data, 1))
+ m_motor_dir[2] = 2;
+ else
+ m_motor_dir[2] = 0;
+ m_motor_speed[2] = (data & 0x3c) >> 2;
break;
default:
- output().set_value("motor_debug",data);
+ m_motor_debug = data;
break;
}
@@ -1592,7 +1592,7 @@ void taitoz_state::coin_control_w(u8 data)
}
-u16 taitoz_state::aquajack_unknown_r()
+u16 taitoz_z80_sound_state::aquajack_unknown_r()
{
return 0xff;
}
@@ -1602,7 +1602,7 @@ u16 taitoz_state::aquajack_unknown_r()
SOUND
*****************************************************/
-void taitoz_state::sound_bankswitch_w(u8 data)
+void taitoz_z80_sound_state::sound_bankswitch_w(u8 data)
{
m_z80bank->set_entry(data & 7);
}
@@ -1620,12 +1620,12 @@ void taitoz_state::pancontrol_w(offs_t offset, u8 data)
***********************************************************/
-void taitoz_state::contcirc_map(address_map &map)
+void contcirc_state::contcirc_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x080000, 0x083fff).ram();
map(0x084000, 0x087fff).ram().share("share1");
- map(0x090001, 0x090001).w(FUNC(taitoz_state::contcirc_out_w)); /* road palette bank, sub CPU reset, 3d glasses control */
+ map(0x090001, 0x090001).w(FUNC(contcirc_state::contcirc_out_w)); /* road palette bank, sub CPU reset, 3d glasses control */
map(0x100000, 0x100007).rw(m_tc0110pcr, FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_rbswap_word_w)); /* palette */
map(0x200000, 0x20ffff).rw(m_tc0100scn, FUNC(tc0100scn_device::ram_r), FUNC(tc0100scn_device::ram_w)); /* tilemaps */
map(0x220000, 0x22000f).rw(m_tc0100scn, FUNC(tc0100scn_device::ctrl_r), FUNC(tc0100scn_device::ctrl_w));
@@ -1633,37 +1633,37 @@ void taitoz_state::contcirc_map(address_map &map)
map(0x400000, 0x4006ff).ram().share("spriteram");
}
-void taitoz_state::contcirc_cpub_map(address_map &map)
+void contcirc_state::contcirc_cpub_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x080000, 0x083fff).ram();
map(0x084000, 0x087fff).ram().share("share1");
- map(0x100001, 0x100001).r(FUNC(taitoz_state::contcirc_input_bypass_r)).w(m_tc0040ioc, FUNC(tc0040ioc_device::portreg_w)).umask16(0x00ff);
+ map(0x100001, 0x100001).r(FUNC(contcirc_state::contcirc_input_bypass_r)).w(m_tc0040ioc, FUNC(tc0040ioc_device::portreg_w)).umask16(0x00ff);
map(0x100003, 0x100003).rw(m_tc0040ioc, FUNC(tc0040ioc_device::watchdog_r), FUNC(tc0040ioc_device::port_w));
map(0x200001, 0x200001).w(m_tc0140syt, FUNC(tc0140syt_device::master_port_w));
map(0x200003, 0x200003).rw(m_tc0140syt, FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w));
}
-void taitoz_state::chasehq_map(address_map &map)
+void chasehq_state::chasehq_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x100000, 0x107fff).ram();
map(0x108000, 0x10bfff).ram().share("share1");
map(0x10c000, 0x10ffff).ram();
- map(0x400001, 0x400001).r(FUNC(taitoz_state::chasehq_input_bypass_r)).w(m_tc0040ioc, FUNC(tc0040ioc_device::portreg_w)).umask16(0x00ff);
+ map(0x400001, 0x400001).r(FUNC(chasehq_state::chasehq_input_bypass_r)).w(m_tc0040ioc, FUNC(tc0040ioc_device::portreg_w)).umask16(0x00ff);
map(0x400003, 0x400003).rw(m_tc0040ioc, FUNC(tc0040ioc_device::watchdog_r), FUNC(tc0040ioc_device::port_w));
- map(0x800000, 0x800001).w(FUNC(taitoz_state::chasehq_cpua_ctrl_w));
+ map(0x800000, 0x800001).w(FUNC(chasehq_state::chasehq_cpua_ctrl_w));
map(0x820001, 0x820001).w(m_tc0140syt, FUNC(tc0140syt_device::master_port_w));
map(0x820003, 0x820003).rw(m_tc0140syt, FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w));
map(0xa00000, 0xa00007).rw(m_tc0110pcr, FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_word_w)); /* palette */
map(0xc00000, 0xc0ffff).rw(m_tc0100scn, FUNC(tc0100scn_device::ram_r), FUNC(tc0100scn_device::ram_w)); /* tilemaps */
map(0xc20000, 0xc2000f).rw(m_tc0100scn, FUNC(tc0100scn_device::ctrl_r), FUNC(tc0100scn_device::ctrl_w));
map(0xd00000, 0xd007ff).ram().share("spriteram");
- map(0xe00000, 0xe003ff).rw(FUNC(taitoz_state::chasehq_motor_r), FUNC(taitoz_state::chasehq_motor_w)); /* motor cpu */
+ map(0xe00000, 0xe003ff).rw(FUNC(chasehq_state::chasehq_motor_r), FUNC(chasehq_state::chasehq_motor_w)); /* motor cpu */
}
-void taitoz_state::chq_cpub_map(address_map &map)
+void chasehq_state::chasehq_cpub_map(address_map &map)
{
map(0x000000, 0x01ffff).rom();
map(0x100000, 0x103fff).ram();
@@ -1672,12 +1672,12 @@ void taitoz_state::chq_cpub_map(address_map &map)
}
-void taitoz_state::enforce_map(address_map &map)
+void contcirc_state::enforce_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x100000, 0x103fff).ram();
map(0x104000, 0x107fff).ram().share("share1");
- map(0x200001, 0x200001).w(FUNC(taitoz_state::contcirc_out_w));
+ map(0x200001, 0x200001).w(FUNC(contcirc_state::contcirc_out_w));
map(0x300000, 0x3006ff).ram().share("spriteram");
map(0x400000, 0x401fff).rw(m_tc0150rod, FUNC(tc0150rod_device::word_r), FUNC(tc0150rod_device::word_w)); /* "root ram" ??? */
map(0x500000, 0x500007).rw(m_tc0110pcr, FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_rbswap_word_w)); /* palette */
@@ -1685,7 +1685,7 @@ void taitoz_state::enforce_map(address_map &map)
map(0x620000, 0x62000f).rw(m_tc0100scn, FUNC(tc0100scn_device::ctrl_r), FUNC(tc0100scn_device::ctrl_w));
}
-void taitoz_state::enforce_cpub_map(address_map &map)
+void contcirc_state::enforce_cpub_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x100000, 0x103fff).ram();
@@ -1738,25 +1738,25 @@ void taitoz_state::bshark_cpub_map(address_map &map)
}
-void taitoz_state::sci_map(address_map &map)
+void sci_state::sci_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x100000, 0x107fff).ram();
map(0x108000, 0x10bfff).ram().share("share1");
map(0x10c000, 0x10ffff).ram();
map(0x200000, 0x20000f).rw(m_tc0220ioc, FUNC(tc0220ioc_device::read), FUNC(tc0220ioc_device::write)).umask16(0x00ff);
- map(0x200010, 0x20001f).r(FUNC(taitoz_state::sci_steer_input_r));
-// map(0x400000, 0x400001).w(FUNC(taitoz_state::cpua_ctrl_w)); // ?? doesn't seem to fit what's written
+ map(0x200010, 0x20001f).r(FUNC(sci_state::sci_steer_input_r));
+// map(0x400000, 0x400001).w(FUNC(sci_state::cpua_ctrl_w)); // ?? doesn't seem to fit what's written
map(0x420001, 0x420001).w(m_tc0140syt, FUNC(tc0140syt_device::master_port_w));
map(0x420003, 0x420003).rw(m_tc0140syt, FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w));
map(0x800000, 0x801fff).ram().w("palette", FUNC(palette_device::write16)).share("palette");
map(0xa00000, 0xa0ffff).rw(m_tc0100scn, FUNC(tc0100scn_device::ram_r), FUNC(tc0100scn_device::ram_w)); /* tilemaps */
map(0xa20000, 0xa2000f).rw(m_tc0100scn, FUNC(tc0100scn_device::ctrl_r), FUNC(tc0100scn_device::ctrl_w));
map(0xc00000, 0xc03fff).ram().share("spriteram");
- map(0xc08000, 0xc08001).rw(FUNC(taitoz_state::sci_spriteframe_r), FUNC(taitoz_state::sci_spriteframe_w));
+ map(0xc08000, 0xc08001).rw(FUNC(sci_state::sci_spriteframe_r), FUNC(sci_state::sci_spriteframe_w));
}
-void taitoz_state::sci_cpub_map(address_map &map)
+void sci_state::sci_cpub_map(address_map &map)
{
map(0x000000, 0x01ffff).rom();
map(0x200000, 0x203fff).ram();
@@ -1765,24 +1765,24 @@ void taitoz_state::sci_cpub_map(address_map &map)
}
-void taitoz_state::nightstr_map(address_map &map)
+void nightstr_state::nightstr_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x100000, 0x10ffff).ram();
map(0x110000, 0x113fff).ram().share("share1");
map(0x400000, 0x40000f).rw(m_tc0220ioc, FUNC(tc0220ioc_device::read), FUNC(tc0220ioc_device::write)).umask16(0x00ff);
- map(0x800000, 0x800001).w(FUNC(taitoz_state::cpua_ctrl_w));
+ map(0x800000, 0x800001).w(FUNC(nightstr_state::cpua_ctrl_w));
map(0x820001, 0x820001).w(m_tc0140syt, FUNC(tc0140syt_device::master_port_w));
map(0x820003, 0x820003).rw(m_tc0140syt, FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w));
map(0xa00000, 0xa00007).rw(m_tc0110pcr, FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_word_w)); /* palette */
map(0xc00000, 0xc0ffff).rw(m_tc0100scn, FUNC(tc0100scn_device::ram_r), FUNC(tc0100scn_device::ram_w)); /* tilemaps */
map(0xc20000, 0xc2000f).rw(m_tc0100scn, FUNC(tc0100scn_device::ctrl_r), FUNC(tc0100scn_device::ctrl_w));
map(0xd00000, 0xd007ff).ram().share("spriteram");
- map(0xe00000, 0xe00011).w(FUNC(taitoz_state::nightstr_motor_w)); /* Motor outputs */
+ map(0xe00000, 0xe00011).w(FUNC(nightstr_state::nightstr_motor_w)); /* Motor outputs */
map(0xe40000, 0xe4000f).rw("adc", FUNC(adc0808_device::data_r), FUNC(adc0808_device::address_offset_start_w)).umask16(0x00ff);
}
-void taitoz_state::nightstr_cpub_map(address_map &map)
+void nightstr_state::nightstr_cpub_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x100000, 0x103fff).ram();
@@ -1791,12 +1791,12 @@ void taitoz_state::nightstr_cpub_map(address_map &map)
}
-void taitoz_state::aquajack_map(address_map &map)
+void taitoz_z80_sound_state::aquajack_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x100000, 0x103fff).ram();
map(0x104000, 0x107fff).ram().share("share1");
- map(0x200000, 0x200001).w(FUNC(taitoz_state::cpua_ctrl_w)); // not needed, but it's probably like the others
+ map(0x200000, 0x200001).w(FUNC(taitoz_z80_sound_state::cpua_ctrl_w)); // not needed, but it's probably like the others
map(0x300000, 0x300007).rw(m_tc0110pcr, FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_word_w)); /* palette */
map(0x800000, 0x801fff).rw(m_tc0150rod, FUNC(tc0150rod_device::word_r), FUNC(tc0150rod_device::word_w));
map(0xa00000, 0xa0ffff).rw(m_tc0100scn, FUNC(tc0100scn_device::ram_r), FUNC(tc0100scn_device::ram_w)); /* tilemaps */
@@ -1804,7 +1804,7 @@ void taitoz_state::aquajack_map(address_map &map)
map(0xc40000, 0xc403ff).ram().share("spriteram");
}
-void taitoz_state::aquajack_cpub_map(address_map &map)
+void taitoz_z80_sound_state::aquajack_cpub_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x100000, 0x103fff).ram();
@@ -1812,13 +1812,13 @@ void taitoz_state::aquajack_cpub_map(address_map &map)
map(0x200000, 0x20000f).rw(m_tc0220ioc, FUNC(tc0220ioc_device::read), FUNC(tc0220ioc_device::write)).umask16(0x00ff);
map(0x300001, 0x300001).w(m_tc0140syt, FUNC(tc0140syt_device::master_port_w));
map(0x300003, 0x300003).rw(m_tc0140syt, FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w));
- map(0x800800, 0x80083f).r(FUNC(taitoz_state::aquajack_unknown_r)); // Read regularly after write to 800800...
-// map(0x800800, 0x800801).w(FUNC(taitoz_state::taitoz_unknown_w));
-// map(0x900000, 0x900007).rw(FUNC(taitoz_state::taitoz_unknown_r), FUNC(taitoz_state::taitoz_unknown_w));
+ map(0x800800, 0x80083f).r(FUNC(taitoz_z80_sound_state::aquajack_unknown_r)); // Read regularly after write to 800800...
+// map(0x800800, 0x800801).w(FUNC(taitoz_z80_sound_state::taitoz_unknown_w));
+// map(0x900000, 0x900007).rw(FUNC(taitoz_z80_sound_state::taitoz_unknown_r), FUNC(taitoz_z80_sound_state::taitoz_unknown_w));
}
-void taitoz_state::spacegun_map(address_map &map)
+void spacegun_state::spacegun_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x30c000, 0x30ffff).ram();
@@ -1829,7 +1829,7 @@ void taitoz_state::spacegun_map(address_map &map)
map(0xb00000, 0xb00007).rw(m_tc0110pcr, FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_rbswap_word_w)); /* palette */
}
-void taitoz_state::spacegun_cpub_map(address_map &map)
+void spacegun_state::spacegun_cpub_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x20c000, 0x20ffff).ram();
@@ -1838,20 +1838,20 @@ void taitoz_state::spacegun_cpub_map(address_map &map)
map(0xc00000, 0xc00007).rw("ymsnd", FUNC(ym2610_device::read), FUNC(ym2610_device::write)).umask16(0x00ff);
map(0xc0000c, 0xc0000d).noprw(); // interrupt controller?
map(0xc0000e, 0xc0000f).noprw();
- map(0xc20000, 0xc20007).w(FUNC(taitoz_state::pancontrol_w)).umask16(0x00ff); /* pan */
- map(0xe00000, 0xe00001).w(FUNC(taitoz_state::spacegun_gun_output_w)); /* gun outputs */
+ map(0xc20000, 0xc20007).w(FUNC(spacegun_state::pancontrol_w)).umask16(0x00ff); /* pan */
+ map(0xe00000, 0xe00001).w(FUNC(spacegun_state::spacegun_gun_output_w)); /* gun outputs */
map(0xf00000, 0xf0000f).rw("adc", FUNC(adc0808_device::data_r), FUNC(adc0808_device::address_offset_start_w)).umask16(0x00ff);
}
-void taitoz_state::dblaxle_map(address_map &map)
+void dblaxle_state::dblaxle_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x200000, 0x203fff).ram();
map(0x210000, 0x21ffff).ram().share("share1");
map(0x400000, 0x40000f).rw(m_tc0510nio, FUNC(tc0510nio_device::halfword_wordswap_r), FUNC(tc0510nio_device::halfword_wordswap_w));
- map(0x400010, 0x40001f).r(FUNC(taitoz_state::dblaxle_steer_input_r));
- map(0x600000, 0x600001).w(FUNC(taitoz_state::dblaxle_cpua_ctrl_w)); /* could this be causing int6 ? */
+ map(0x400010, 0x40001f).r(FUNC(dblaxle_state::dblaxle_steer_input_r));
+ map(0x600000, 0x600001).w(FUNC(dblaxle_state::dblaxle_cpua_ctrl_w)); /* could this be causing int6 ? */
map(0x620001, 0x620001).w(m_tc0140syt, FUNC(tc0140syt_device::master_port_w));
map(0x620003, 0x620003).rw(m_tc0140syt, FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w));
map(0x800000, 0x801fff).ram().w("palette", FUNC(palette_device::write16)).share("palette");
@@ -1859,10 +1859,10 @@ void taitoz_state::dblaxle_map(address_map &map)
map(0xa00000, 0xa0ffff).rw(m_tc0480scp, FUNC(tc0480scp_device::ram_r), FUNC(tc0480scp_device::ram_w)); /* tilemaps */
map(0xa30000, 0xa3002f).rw(m_tc0480scp, FUNC(tc0480scp_device::ctrl_r), FUNC(tc0480scp_device::ctrl_w));
map(0xc00000, 0xc03fff).ram().share("spriteram"); /* mostly unused ? */
- map(0xc08000, 0xc08001).rw(FUNC(taitoz_state::sci_spriteframe_r), FUNC(taitoz_state::sci_spriteframe_w)); /* set in int6, seems to stay zero */
+ //map(0xc08000, 0xc08001).rw(FUNC(dblaxle_state::sci_spriteframe_r), FUNC(dblaxle_state::sci_spriteframe_w)); /* set in int6, seems to stay zero */
}
-void taitoz_state::dblaxle_cpub_map(address_map &map)
+void dblaxle_state::dblaxle_cpub_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x100000, 0x103fff).ram();
@@ -1872,24 +1872,24 @@ void taitoz_state::dblaxle_cpub_map(address_map &map)
}
-void taitoz_state::racingb_map(address_map &map)
+void sci_state::racingb_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x100000, 0x103fff).ram();
map(0x110000, 0x11ffff).ram().share("share1");
map(0x300000, 0x30000f).rw(m_tc0510nio, FUNC(tc0510nio_device::halfword_wordswap_r), FUNC(tc0510nio_device::halfword_wordswap_w));
- map(0x300010, 0x30001f).r(FUNC(taitoz_state::dblaxle_steer_input_r));
- map(0x500002, 0x500003).w(FUNC(taitoz_state::cpua_ctrl_w));
+ map(0x300010, 0x30001f).r(FUNC(sci_state::dblaxle_steer_input_r));
+ map(0x500002, 0x500003).w(FUNC(sci_state::cpua_ctrl_w));
map(0x520001, 0x520001).w(m_tc0140syt, FUNC(tc0140syt_device::master_port_w));
map(0x520003, 0x520003).rw(m_tc0140syt, FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w));
map(0x700000, 0x701fff).ram().w("palette", FUNC(palette_device::write16)).share("palette");
map(0x900000, 0x90ffff).rw(m_tc0480scp, FUNC(tc0480scp_device::ram_r), FUNC(tc0480scp_device::ram_w)); /* tilemaps */
map(0x930000, 0x93002f).rw(m_tc0480scp, FUNC(tc0480scp_device::ctrl_r), FUNC(tc0480scp_device::ctrl_w));
map(0xb00000, 0xb03fff).ram().share("spriteram"); /* mostly unused ? */
- map(0xb08000, 0xb08001).rw(FUNC(taitoz_state::sci_spriteframe_r), FUNC(taitoz_state::sci_spriteframe_w)); /* alternates 0/0x100 */
+ map(0xb08000, 0xb08001).rw(FUNC(sci_state::sci_spriteframe_r), FUNC(sci_state::sci_spriteframe_w)); /* alternates 0/0x100 */
}
-void taitoz_state::racingb_cpub_map(address_map &map)
+void sci_state::racingb_cpub_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x400000, 0x403fff).ram();
@@ -1901,7 +1901,7 @@ void taitoz_state::racingb_cpub_map(address_map &map)
/***************************************************************************/
-void taitoz_state::z80_sound_map(address_map &map)
+void taitoz_z80_sound_state::z80_sound_map(address_map &map)
{
map(0x0000, 0x3fff).rom();
map(0x4000, 0x7fff).bankr("z80bank");
@@ -1909,11 +1909,11 @@ void taitoz_state::z80_sound_map(address_map &map)
map(0xe000, 0xe003).rw("ymsnd", FUNC(ym2610_device::read), FUNC(ym2610_device::write));
map(0xe200, 0xe200).nopr().w(m_tc0140syt, FUNC(tc0140syt_device::slave_port_w));
map(0xe201, 0xe201).rw(m_tc0140syt, FUNC(tc0140syt_device::slave_comm_r), FUNC(tc0140syt_device::slave_comm_w));
- map(0xe400, 0xe403).w(FUNC(taitoz_state::pancontrol_w)); /* pan */
+ map(0xe400, 0xe403).w(FUNC(taitoz_z80_sound_state::pancontrol_w)); /* pan */
map(0xea00, 0xea00).nopr();
map(0xee00, 0xee00).nopw(); /* ? */
map(0xf000, 0xf000).nopw(); /* ? */
- map(0xf200, 0xf200).w(FUNC(taitoz_state::sound_bankswitch_w));
+ map(0xf200, 0xf200).w(FUNC(taitoz_z80_sound_state::sound_bankswitch_w));
}
@@ -3133,20 +3133,23 @@ void taitoz_state::device_post_load()
void taitoz_state::machine_start()
{
- if (m_z80bank)
- {
- int banks = memregion("audiocpu")->bytes() / 0x4000;
- m_z80bank->configure_entries(0, banks, memregion("audiocpu")->base(), 0x4000);
- }
-
save_item(NAME(m_cpua_ctrl));
+}
- /* these are specific to various games: we ought to split the inits */
- save_item(NAME(m_sci_int6));
- save_item(NAME(m_ioc220_port));
+void taitoz_z80_sound_state::machine_start()
+{
+ taitoz_state::machine_start();
+
+ int banks = memregion("audiocpu")->bytes() / 0x4000;
+ m_z80bank->configure_entries(0, banks, memregion("audiocpu")->base(), 0x4000);
+}
+
+void contcirc_state::machine_start()
+{
+ taitoz_z80_sound_state::machine_start();
- // 3d scope on contcirc/enforceja
m_shutter_out.resolve();
+
m_shutter_toggle = 0;
m_shutter_control = 0;
@@ -3154,18 +3157,57 @@ void taitoz_state::machine_start()
save_item(NAME(m_shutter_control));
}
-MACHINE_START_MEMBER(taitoz_state,chasehq)
+void chasehq_state::machine_start()
{
- machine_start();
+ taitoz_z80_sound_state::machine_start();
m_lamps.resolve();
}
+void sci_state::machine_start()
+{
+ taitoz_z80_sound_state::machine_start();
+
+ save_item(NAME(m_sci_int6));
+}
+
+void nightstr_state::machine_start()
+{
+ taitoz_z80_sound_state::machine_start();
+
+ m_motor_dir.resolve();
+ m_motor_speed.resolve();
+ m_motor_debug.resolve();
+}
+
+void spacegun_state::machine_start()
+{
+ taitoz_state::machine_start();
+
+ m_recoil.resolve();
+
+ m_eep_latch = 0;
+
+ save_item(NAME(m_eep_latch));
+}
+
+void dblaxle_state::machine_start()
+{
+ taitoz_z80_sound_state::machine_start();
+
+ m_wheel_vibration.resolve();
+}
+
void taitoz_state::machine_reset()
{
m_cpua_ctrl = 0xff;
+}
+
+void sci_state::machine_reset()
+{
+ taitoz_z80_sound_state::machine_reset();
+
m_sci_int6 = 0;
- m_ioc220_port = 0;
}
void taitoz_state::screen_config(machine_config &config, int vdisp_start, int vdisp_end)
@@ -3177,36 +3219,34 @@ void taitoz_state::screen_config(machine_config &config, int vdisp_start, int vd
m_screen->set_raw(XTAL(26'686'000)/4, 424, 0, 320, 262, vdisp_start, vdisp_end);
}
-void taitoz_state::contcirc(machine_config &config)
+void contcirc_state::contcirc(machine_config &config)
{
M68000(config, m_maincpu, 12000000); /* 12 MHz ??? */
- m_maincpu->set_addrmap(AS_PROGRAM, &taitoz_state::contcirc_map);
- m_maincpu->set_vblank_int("screen", FUNC(taitoz_state::irq6_line_hold));
+ m_maincpu->set_addrmap(AS_PROGRAM, &contcirc_state::contcirc_map);
+ m_maincpu->set_vblank_int("screen", FUNC(contcirc_state::irq6_line_hold));
Z80(config, m_audiocpu, 16000000/4); /* 4 MHz ??? */
- m_audiocpu->set_addrmap(AS_PROGRAM, &taitoz_state::z80_sound_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &contcirc_state::z80_sound_map);
M68000(config, m_subcpu, 12000000); /* 12 MHz ??? */
- m_subcpu->set_addrmap(AS_PROGRAM, &taitoz_state::contcirc_cpub_map);
- m_subcpu->set_vblank_int("screen", FUNC(taitoz_state::irq6_line_hold));
+ m_subcpu->set_addrmap(AS_PROGRAM, &contcirc_state::contcirc_cpub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(contcirc_state::irq6_line_hold));
TC0040IOC(config, m_tc0040ioc, 0);
m_tc0040ioc->read_0_callback().set_ioport("DSWA");
m_tc0040ioc->read_1_callback().set_ioport("DSWB");
m_tc0040ioc->read_2_callback().set_ioport("IN0");
m_tc0040ioc->read_3_callback().set_ioport("IN1");
- m_tc0040ioc->write_4_callback().set(FUNC(taitoz_state::coin_control_w));
+ m_tc0040ioc->write_4_callback().set(FUNC(contcirc_state::coin_control_w));
m_tc0040ioc->read_7_callback().set_ioport("IN2");
screen_config(config, 24, 248);
- m_screen->set_screen_update(FUNC(taitoz_state::screen_update_contcirc));
+ m_screen->set_screen_update(FUNC(contcirc_state::screen_update_contcirc));
m_screen->set_palette(m_tc0110pcr);
- m_screen->screen_vblank().set(FUNC(taitoz_state::scope_vblank));
+ m_screen->screen_vblank().set(FUNC(contcirc_state::scope_vblank));
GFXDECODE(config, m_gfxdecode, m_tc0110pcr, gfx_taitoz);
- MCFG_VIDEO_START_OVERRIDE(taitoz_state,taitoz)
-
TC0100SCN(config, m_tc0100scn, 0);
m_tc0100scn->set_palette(m_tc0110pcr);
@@ -3237,39 +3277,35 @@ void taitoz_state::contcirc(machine_config &config)
m_tc0140syt->set_slave_tag(m_audiocpu);
}
-void taitoz_state::chasehq(machine_config &config)
+void chasehq_state::chasehq(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, 12000000); /* 12 MHz ??? */
- m_maincpu->set_addrmap(AS_PROGRAM, &taitoz_state::chasehq_map);
- m_maincpu->set_vblank_int("screen", FUNC(taitoz_state::irq4_line_hold));
+ m_maincpu->set_addrmap(AS_PROGRAM, &chasehq_state::chasehq_map);
+ m_maincpu->set_vblank_int("screen", FUNC(chasehq_state::irq4_line_hold));
Z80(config, m_audiocpu, 16000000/4); /* 4 MHz ??? */
- m_audiocpu->set_addrmap(AS_PROGRAM, &taitoz_state::z80_sound_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &chasehq_state::z80_sound_map);
M68000(config, m_subcpu, 12000000); /* 12 MHz ??? */
- m_subcpu->set_addrmap(AS_PROGRAM, &taitoz_state::chq_cpub_map);
- m_subcpu->set_vblank_int("screen", FUNC(taitoz_state::irq4_line_hold));
-
- MCFG_MACHINE_START_OVERRIDE(taitoz_state,chasehq)
+ m_subcpu->set_addrmap(AS_PROGRAM, &chasehq_state::chasehq_cpub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(chasehq_state::irq4_line_hold));
TC0040IOC(config, m_tc0040ioc, 0);
m_tc0040ioc->read_0_callback().set_ioport("DSWA");
m_tc0040ioc->read_1_callback().set_ioport("DSWB");
m_tc0040ioc->read_2_callback().set_ioport("IN0");
m_tc0040ioc->read_3_callback().set_ioport("IN1");
- m_tc0040ioc->write_4_callback().set(FUNC(taitoz_state::coin_control_w));
+ m_tc0040ioc->write_4_callback().set(FUNC(chasehq_state::coin_control_w));
m_tc0040ioc->read_7_callback().set_ioport("IN2");
/* video hardware */
screen_config(config, 16, 256);
- m_screen->set_screen_update(FUNC(taitoz_state::screen_update_chasehq));
+ m_screen->set_screen_update(FUNC(chasehq_state::screen_update_chasehq));
m_screen->set_palette(m_tc0110pcr);
GFXDECODE(config, m_gfxdecode, m_tc0110pcr, gfx_chasehq);
- MCFG_VIDEO_START_OVERRIDE(taitoz_state,taitoz)
-
TC0100SCN(config, m_tc0100scn, 0);
m_tc0100scn->set_palette(m_tc0110pcr);
@@ -3300,19 +3336,19 @@ void taitoz_state::chasehq(machine_config &config)
m_tc0140syt->set_slave_tag(m_audiocpu);
}
-void taitoz_state::enforce(machine_config &config)
+void contcirc_state::enforce(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, 12000000); /* 12 MHz ??? */
- m_maincpu->set_addrmap(AS_PROGRAM, &taitoz_state::enforce_map);
- m_maincpu->set_vblank_int("screen", FUNC(taitoz_state::irq6_line_hold));
+ m_maincpu->set_addrmap(AS_PROGRAM, &contcirc_state::enforce_map);
+ m_maincpu->set_vblank_int("screen", FUNC(contcirc_state::irq6_line_hold));
Z80(config, m_audiocpu, 16000000/4); /* 4 MHz ??? */
- m_audiocpu->set_addrmap(AS_PROGRAM, &taitoz_state::z80_sound_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &contcirc_state::z80_sound_map);
M68000(config, m_subcpu, 12000000); /* 12 MHz ??? */
- m_subcpu->set_addrmap(AS_PROGRAM, &taitoz_state::enforce_cpub_map);
- m_subcpu->set_vblank_int("screen", FUNC(taitoz_state::irq6_line_hold));
+ m_subcpu->set_addrmap(AS_PROGRAM, &contcirc_state::enforce_cpub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(contcirc_state::irq6_line_hold));
config.set_maximum_quantum(attotime::from_hz(600));
@@ -3321,19 +3357,17 @@ void taitoz_state::enforce(machine_config &config)
m_tc0040ioc->read_1_callback().set_ioport("DSWB");
m_tc0040ioc->read_2_callback().set_ioport("IN0");
m_tc0040ioc->read_3_callback().set_ioport("IN1");
- m_tc0040ioc->write_4_callback().set(FUNC(taitoz_state::coin_control_w));
+ m_tc0040ioc->write_4_callback().set(FUNC(contcirc_state::coin_control_w));
m_tc0040ioc->read_7_callback().set_ioport("IN2");
/* video hardware */
screen_config(config, 24, 248);
- m_screen->set_screen_update(FUNC(taitoz_state::screen_update_contcirc));
+ m_screen->set_screen_update(FUNC(contcirc_state::screen_update_contcirc));
m_screen->set_palette(m_tc0110pcr);
- m_screen->screen_vblank().set(FUNC(taitoz_state::scope_vblank));
+ m_screen->screen_vblank().set(FUNC(contcirc_state::scope_vblank));
GFXDECODE(config, m_gfxdecode, m_tc0110pcr, gfx_taitoz);
- MCFG_VIDEO_START_OVERRIDE(taitoz_state,taitoz)
-
TC0100SCN(config, m_tc0100scn, 0);
m_tc0100scn->set_palette(m_tc0110pcr);
@@ -3392,8 +3426,6 @@ void taitoz_state::bshark_base(machine_config &config)
GFXDECODE(config, m_gfxdecode, "palette", gfx_taitoz);
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 4096);
- MCFG_VIDEO_START_OVERRIDE(taitoz_state,taitoz)
-
TC0100SCN(config, m_tc0100scn, 0);
m_tc0100scn->set_palette("palette");
@@ -3437,19 +3469,19 @@ void taitoz_state::bsharkjjs(machine_config &config)
}
-void taitoz_state::sci(machine_config &config)
+void sci_state::sci(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, 12000000); /* 12 MHz ??? */
- m_maincpu->set_addrmap(AS_PROGRAM, &taitoz_state::sci_map);
- m_maincpu->set_vblank_int("screen", FUNC(taitoz_state::sci_interrupt));
+ m_maincpu->set_addrmap(AS_PROGRAM, &sci_state::sci_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sci_state::sci_interrupt));
Z80(config, m_audiocpu, 16000000/4); /* 4 MHz ??? */
- m_audiocpu->set_addrmap(AS_PROGRAM, &taitoz_state::z80_sound_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &sci_state::z80_sound_map);
M68000(config, m_subcpu, 12000000); /* 12 MHz ??? */
- m_subcpu->set_addrmap(AS_PROGRAM, &taitoz_state::sci_cpub_map);
- m_subcpu->set_vblank_int("screen", FUNC(taitoz_state::irq4_line_hold));
+ m_subcpu->set_addrmap(AS_PROGRAM, &sci_state::sci_cpub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(sci_state::irq4_line_hold));
config.set_maximum_quantum(attotime::from_hz(3000));
@@ -3458,19 +3490,17 @@ void taitoz_state::sci(machine_config &config)
m_tc0220ioc->read_1_callback().set_ioport("DSWB");
m_tc0220ioc->read_2_callback().set_ioport("IN0");
m_tc0220ioc->read_3_callback().set_ioport("IN1");
- m_tc0220ioc->write_4_callback().set(FUNC(taitoz_state::coin_control_w));
+ m_tc0220ioc->write_4_callback().set(FUNC(sci_state::coin_control_w));
m_tc0220ioc->read_7_callback().set_ioport("IN2");
/* video hardware */
screen_config(config, 16, 256);
- m_screen->set_screen_update(FUNC(taitoz_state::screen_update_sci));
+ m_screen->set_screen_update(FUNC(sci_state::screen_update_sci));
m_screen->set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_taitoz);
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 4096);
- MCFG_VIDEO_START_OVERRIDE(taitoz_state,taitoz)
-
TC0100SCN(config, m_tc0100scn, 0);
m_tc0100scn->set_palette("palette");
@@ -3499,19 +3529,19 @@ void taitoz_state::sci(machine_config &config)
m_tc0140syt->set_slave_tag(m_audiocpu);
}
-void taitoz_state::nightstr(machine_config &config)
+void nightstr_state::nightstr(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, 12000000); /* 12 MHz ??? */
- m_maincpu->set_addrmap(AS_PROGRAM, &taitoz_state::nightstr_map);
- m_maincpu->set_vblank_int("screen", FUNC(taitoz_state::irq4_line_hold));
+ m_maincpu->set_addrmap(AS_PROGRAM, &nightstr_state::nightstr_map);
+ m_maincpu->set_vblank_int("screen", FUNC(nightstr_state::irq4_line_hold));
Z80(config, m_audiocpu, 16000000/4); /* 4 MHz ??? */
- m_audiocpu->set_addrmap(AS_PROGRAM, &taitoz_state::z80_sound_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &nightstr_state::z80_sound_map);
M68000(config, m_subcpu, 12000000); /* 12 MHz ??? */
- m_subcpu->set_addrmap(AS_PROGRAM, &taitoz_state::nightstr_cpub_map);
- m_subcpu->set_vblank_int("screen", FUNC(taitoz_state::irq4_line_hold));
+ m_subcpu->set_addrmap(AS_PROGRAM, &nightstr_state::nightstr_cpub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(nightstr_state::irq4_line_hold));
config.set_maximum_quantum(attotime::from_hz(6000));
@@ -3527,18 +3557,16 @@ void taitoz_state::nightstr(machine_config &config)
m_tc0220ioc->read_1_callback().set_ioport("DSWB");
m_tc0220ioc->read_2_callback().set_ioport("IN0");
m_tc0220ioc->read_3_callback().set_ioport("IN1");
- m_tc0220ioc->write_4_callback().set(FUNC(taitoz_state::coin_control_w));
+ m_tc0220ioc->write_4_callback().set(FUNC(nightstr_state::coin_control_w));
m_tc0220ioc->read_7_callback().set_ioport("IN2");
/* video hardware */
screen_config(config, 16, 256);
- m_screen->set_screen_update(FUNC(taitoz_state::screen_update_chasehq));
+ m_screen->set_screen_update(FUNC(nightstr_state::screen_update_chasehq));
m_screen->set_palette(m_tc0110pcr);
GFXDECODE(config, m_gfxdecode, m_tc0110pcr, gfx_chasehq);
- MCFG_VIDEO_START_OVERRIDE(taitoz_state,taitoz)
-
TC0100SCN(config, m_tc0100scn, 0);
m_tc0100scn->set_palette(m_tc0110pcr);
@@ -3569,19 +3597,19 @@ void taitoz_state::nightstr(machine_config &config)
m_tc0140syt->set_slave_tag(m_audiocpu);
}
-void taitoz_state::aquajack(machine_config &config)
+void taitoz_z80_sound_state::aquajack(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, 12000000); /* 12 MHz ??? */
- m_maincpu->set_addrmap(AS_PROGRAM, &taitoz_state::aquajack_map);
- m_maincpu->set_vblank_int("screen", FUNC(taitoz_state::irq4_line_hold));
+ m_maincpu->set_addrmap(AS_PROGRAM, &taitoz_z80_sound_state::aquajack_map);
+ m_maincpu->set_vblank_int("screen", FUNC(taitoz_z80_sound_state::irq4_line_hold));
Z80(config, m_audiocpu, 16000000/4); /* 4 MHz ??? */
- m_audiocpu->set_addrmap(AS_PROGRAM, &taitoz_state::z80_sound_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &taitoz_z80_sound_state::z80_sound_map);
M68000(config, m_subcpu, 12000000); /* 12 MHz ??? */
- m_subcpu->set_addrmap(AS_PROGRAM, &taitoz_state::aquajack_cpub_map);
- m_subcpu->set_vblank_int("screen", FUNC(taitoz_state::irq4_line_hold));
+ m_subcpu->set_addrmap(AS_PROGRAM, &taitoz_z80_sound_state::aquajack_cpub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(taitoz_z80_sound_state::irq4_line_hold));
config.set_maximum_quantum(attotime::from_hz(30000));
@@ -3590,18 +3618,16 @@ void taitoz_state::aquajack(machine_config &config)
m_tc0220ioc->read_1_callback().set_ioport("DSWB");
m_tc0220ioc->read_2_callback().set_ioport("IN0");
m_tc0220ioc->read_3_callback().set_ioport("IN1");
- m_tc0220ioc->write_4_callback().set(FUNC(taitoz_state::coin_control_w));
+ m_tc0220ioc->write_4_callback().set(FUNC(taitoz_z80_sound_state::coin_control_w));
m_tc0220ioc->read_7_callback().set_ioport("IN2");
/* video hardware */
screen_config(config, 16, 256);
- m_screen->set_screen_update(FUNC(taitoz_state::screen_update_aquajack));
+ m_screen->set_screen_update(FUNC(taitoz_z80_sound_state::screen_update_aquajack));
m_screen->set_palette(m_tc0110pcr);
GFXDECODE(config, m_gfxdecode, m_tc0110pcr, gfx_taitoz);
- MCFG_VIDEO_START_OVERRIDE(taitoz_state,taitoz)
-
TC0100SCN(config, m_tc0100scn, 0);
m_tc0100scn->set_palette(m_tc0110pcr);
@@ -3632,16 +3658,16 @@ void taitoz_state::aquajack(machine_config &config)
m_tc0140syt->set_slave_tag(m_audiocpu);
}
-void taitoz_state::spacegun(machine_config &config)
+void spacegun_state::spacegun(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, 16000000); /* 16 MHz ??? */
- m_maincpu->set_addrmap(AS_PROGRAM, &taitoz_state::spacegun_map);
- m_maincpu->set_vblank_int("screen", FUNC(taitoz_state::irq4_line_hold));
+ m_maincpu->set_addrmap(AS_PROGRAM, &spacegun_state::spacegun_map);
+ m_maincpu->set_vblank_int("screen", FUNC(spacegun_state::irq4_line_hold));
M68000(config, m_subcpu, 16000000); /* 16 MHz ??? */
- m_subcpu->set_addrmap(AS_PROGRAM, &taitoz_state::spacegun_cpub_map);
- m_subcpu->set_vblank_int("screen", FUNC(taitoz_state::irq4_line_hold));
+ m_subcpu->set_addrmap(AS_PROGRAM, &spacegun_state::spacegun_cpub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(spacegun_state::irq4_line_hold));
EEPROM_93C46_16BIT(config, m_eeprom).default_data(spacegun_default_eeprom, 128);
@@ -3657,13 +3683,13 @@ void taitoz_state::spacegun(machine_config &config)
m_tc0510nio->read_1_callback().set_ioport("DSWB");
m_tc0510nio->read_2_callback().set_ioport("IN0");
m_tc0510nio->read_3_callback().set(m_eeprom, FUNC(eeprom_serial_93cxx_device::do_read)).lshift(7);
- m_tc0510nio->write_3_callback().set(FUNC(taitoz_state::spacegun_eeprom_w));
- m_tc0510nio->write_4_callback().set(FUNC(taitoz_state::coin_control_w));
+ m_tc0510nio->write_3_callback().set(FUNC(spacegun_state::spacegun_eeprom_w));
+ m_tc0510nio->write_4_callback().set(FUNC(spacegun_state::coin_control_w));
m_tc0510nio->read_7_callback().set_ioport("IN2");
/* video hardware */
screen_config(config, 16, 256);
- m_screen->set_screen_update(FUNC(taitoz_state::screen_update_spacegun));
+ m_screen->set_screen_update(FUNC(spacegun_state::screen_update_spacegun));
m_screen->set_palette(m_tc0110pcr);
GFXDECODE(config, m_gfxdecode, m_tc0110pcr, gfx_taitoz);
@@ -3693,19 +3719,19 @@ void taitoz_state::spacegun(machine_config &config)
FILTER_VOLUME(config, "2610.2.l").add_route(ALL_OUTPUTS, "lspeaker", 1.0);
}
-void taitoz_state::dblaxle(machine_config &config)
+void dblaxle_state::dblaxle(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(32'000'000)/2);
- m_maincpu->set_addrmap(AS_PROGRAM, &taitoz_state::dblaxle_map);
- m_maincpu->set_vblank_int("screen", FUNC(taitoz_state::irq4_line_hold));
+ m_maincpu->set_addrmap(AS_PROGRAM, &dblaxle_state::dblaxle_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dblaxle_state::irq4_line_hold));
Z80(config, m_audiocpu, XTAL(32'000'000)/8);
- m_audiocpu->set_addrmap(AS_PROGRAM, &taitoz_state::z80_sound_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &dblaxle_state::z80_sound_map);
M68000(config, m_subcpu, XTAL(32'000'000)/2);
- m_subcpu->set_addrmap(AS_PROGRAM, &taitoz_state::dblaxle_cpub_map);
- m_subcpu->set_vblank_int("screen", FUNC(taitoz_state::irq4_line_hold));
+ m_subcpu->set_addrmap(AS_PROGRAM, &dblaxle_state::dblaxle_cpub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(dblaxle_state::irq4_line_hold));
// make quantum time to be a multiple of the xtal (fixes road layer stuck on continue)
config.set_maximum_quantum(attotime::from_hz(XTAL(32'000'000)/1024));
@@ -3715,19 +3741,17 @@ void taitoz_state::dblaxle(machine_config &config)
m_tc0510nio->read_1_callback().set_ioport("DSWB");
m_tc0510nio->read_2_callback().set_ioport("IN0");
m_tc0510nio->read_3_callback().set_ioport("IN1");
- m_tc0510nio->write_4_callback().set(FUNC(taitoz_state::coin_control_w));
+ m_tc0510nio->write_4_callback().set(FUNC(dblaxle_state::coin_control_w));
m_tc0510nio->read_7_callback().set_ioport("IN2");
/* video hardware */
screen_config(config, 16, 256);
- m_screen->set_screen_update(FUNC(taitoz_state::screen_update_dblaxle));
+ m_screen->set_screen_update(FUNC(dblaxle_state::screen_update_dblaxle));
m_screen->set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_taitoz);
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 4096);
- MCFG_VIDEO_START_OVERRIDE(taitoz_state,taitoz)
-
TC0480SCP(config, m_tc0480scp, 0);
m_tc0480scp->set_palette("palette");
m_tc0480scp->set_offsets(0x1f, 0x08);
@@ -3757,19 +3781,19 @@ void taitoz_state::dblaxle(machine_config &config)
m_tc0140syt->set_slave_tag(m_audiocpu);
}
-void taitoz_state::racingb(machine_config &config)
+void sci_state::racingb(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(32'000'000)/2);
- m_maincpu->set_addrmap(AS_PROGRAM, &taitoz_state::racingb_map);
- m_maincpu->set_vblank_int("screen", FUNC(taitoz_state::sci_interrupt));
+ m_maincpu->set_addrmap(AS_PROGRAM, &sci_state::racingb_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sci_state::sci_interrupt));
Z80(config, m_audiocpu, XTAL(32'000'000)/8);
- m_audiocpu->set_addrmap(AS_PROGRAM, &taitoz_state::z80_sound_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &sci_state::z80_sound_map);
M68000(config, m_subcpu, XTAL(32'000'000)/2);
- m_subcpu->set_addrmap(AS_PROGRAM, &taitoz_state::racingb_cpub_map);
- m_subcpu->set_vblank_int("screen", FUNC(taitoz_state::irq4_line_hold));
+ m_subcpu->set_addrmap(AS_PROGRAM, &sci_state::racingb_cpub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(sci_state::irq4_line_hold));
config.set_maximum_quantum(attotime::from_hz(600));
@@ -3778,19 +3802,17 @@ void taitoz_state::racingb(machine_config &config)
m_tc0510nio->read_1_callback().set_ioport("DSWB");
m_tc0510nio->read_2_callback().set_ioport("IN0");
m_tc0510nio->read_3_callback().set_ioport("IN1");
- m_tc0510nio->write_4_callback().set(FUNC(taitoz_state::coin_control_w));
+ m_tc0510nio->write_4_callback().set(FUNC(sci_state::coin_control_w));
m_tc0510nio->read_7_callback().set_ioport("IN2");
/* video hardware */
screen_config(config, 16, 256);
- m_screen->set_screen_update(FUNC(taitoz_state::screen_update_racingb));
+ m_screen->set_screen_update(FUNC(sci_state::screen_update_racingb));
m_screen->set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_taitoz);
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 4096);
- MCFG_VIDEO_START_OVERRIDE(taitoz_state,taitoz)
-
TC0480SCP(config, m_tc0480scp, 0);
m_tc0480scp->set_palette("palette");
m_tc0480scp->set_offsets(0x1f, 0x08);
@@ -5539,55 +5561,47 @@ ROM_START( racingbj )
ROM_END
-void taitoz_state::init_bshark()
-{
- m_eep_latch = 0;
-
- save_item(NAME(m_eep_latch));
-}
-
-
-GAMEL(1987, contcirc, 0, contcirc, contcirc, taitoz_state, empty_init, ROT0, "Taito Corporation Japan", "Continental Circus (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_contcirc )
-GAMEL(1987, contcircu, contcirc, contcirc, contcrcu, taitoz_state, empty_init, ROT0, "Taito America Corporation", "Continental Circus (US set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_contcirc )
-GAMEL(1987, contcircua, contcirc, contcirc, contcrcj, taitoz_state, empty_init, ROT0, "Taito America Corporation", "Continental Circus (US set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_contcirc )
-GAMEL(1987, contcircj, contcirc, contcirc, contcrcj, taitoz_state, empty_init, ROT0, "Taito Corporation", "Continental Circus (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_contcirc )
+GAMEL(1987, contcirc, 0, contcirc, contcirc, contcirc_state, empty_init, ROT0, "Taito Corporation Japan", "Continental Circus (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_contcirc )
+GAMEL(1987, contcircu, contcirc, contcirc, contcrcu, contcirc_state, empty_init, ROT0, "Taito America Corporation", "Continental Circus (US set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_contcirc )
+GAMEL(1987, contcircua, contcirc, contcirc, contcrcj, contcirc_state, empty_init, ROT0, "Taito America Corporation", "Continental Circus (US set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_contcirc )
+GAMEL(1987, contcircj, contcirc, contcirc, contcrcj, contcirc_state, empty_init, ROT0, "Taito Corporation", "Continental Circus (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_contcirc )
-GAMEL(1988, chasehq, 0, chasehq, chasehq, taitoz_state, empty_init, ROT0, "Taito Corporation Japan", "Chase H.Q. (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
-GAMEL(1988, chasehqj, chasehq, chasehq, chasehqj, taitoz_state, empty_init, ROT0, "Taito Corporation", "Chase H.Q. (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
-GAMEL(1988, chasehqju, chasehq, chasehq, chasehq, taitoz_state, empty_init, ROT0, "Taito Corporation", "Chase H.Q. (Japan, upright?)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq ) // same code rev as Chase H.Q. (World)
-GAMEL(1988, chasehqu, chasehq, chasehq, chasehq, taitoz_state, empty_init, ROT0, "Taito America Corporation", "Chase H.Q. (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
+GAMEL(1988, chasehq, 0, chasehq, chasehq, chasehq_state, empty_init, ROT0, "Taito Corporation Japan", "Chase H.Q. (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
+GAMEL(1988, chasehqj, chasehq, chasehq, chasehqj, chasehq_state, empty_init, ROT0, "Taito Corporation", "Chase H.Q. (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
+GAMEL(1988, chasehqju, chasehq, chasehq, chasehq, chasehq_state, empty_init, ROT0, "Taito Corporation", "Chase H.Q. (Japan, upright?)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq ) // same code rev as Chase H.Q. (World)
+GAMEL(1988, chasehqu, chasehq, chasehq, chasehq, chasehq_state, empty_init, ROT0, "Taito America Corporation", "Chase H.Q. (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
-GAME( 1988, enforce, 0, enforce, enforce, taitoz_state, empty_init, ROT0, "Taito Corporation Japan", "Enforce (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1988, enforcej, enforce, enforce, enforcej, taitoz_state, empty_init, ROT0, "Taito Corporation", "Enforce (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAMEL(1988, enforceja, enforce, enforce, enforceja, taitoz_state, empty_init, ROT0, "Taito Corporation", "Enforce (Japan, Analog Controls)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_enforceja )
+GAME( 1988, enforce, 0, enforce, enforce, contcirc_state, empty_init, ROT0, "Taito Corporation Japan", "Enforce (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1988, enforcej, enforce, enforce, enforcej, contcirc_state, empty_init, ROT0, "Taito Corporation", "Enforce (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAMEL(1988, enforceja, enforce, enforce, enforceja, contcirc_state, empty_init, ROT0, "Taito Corporation", "Enforce (Japan, Analog Controls)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_enforceja )
-GAME( 1989, bshark, 0, bshark, bshark, taitoz_state, init_bshark, ORIENTATION_FLIP_X, "Taito Corporation Japan", "Battle Shark (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1989, bsharku, bshark, bshark, bsharku, taitoz_state, init_bshark, ORIENTATION_FLIP_X, "Taito America Corporation", "Battle Shark (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1989, bsharkj, bshark, bshark, bsharkj, taitoz_state, init_bshark, ORIENTATION_FLIP_X, "Taito Corporation", "Battle Shark (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1989, bsharkjjs, bshark, bsharkjjs, bsharkjjs, taitoz_state, init_bshark, ORIENTATION_FLIP_X, "Taito Corporation", "Battle Shark (Japan, Joystick)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1989, bshark, 0, bshark, bshark, taitoz_state, empty_init, ORIENTATION_FLIP_X, "Taito Corporation Japan", "Battle Shark (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1989, bsharku, bshark, bshark, bsharku, taitoz_state, empty_init, ORIENTATION_FLIP_X, "Taito America Corporation", "Battle Shark (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1989, bsharkj, bshark, bshark, bsharkj, taitoz_state, empty_init, ORIENTATION_FLIP_X, "Taito Corporation", "Battle Shark (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1989, bsharkjjs, bshark, bsharkjjs, bsharkjjs, taitoz_state, empty_init, ORIENTATION_FLIP_X, "Taito Corporation", "Battle Shark (Japan, Joystick)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAMEL(1989, sci, 0, sci, sci, taitoz_state, empty_init, ROT0, "Taito Corporation Japan", "Special Criminal Investigation (World set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
-GAMEL(1989, scia, sci, sci, sci, taitoz_state, empty_init, ROT0, "Taito Corporation Japan", "Special Criminal Investigation (World set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
-GAMEL(1989, scij, sci, sci, scij, taitoz_state, empty_init, ROT0, "Taito Corporation", "Special Criminal Investigation (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
-GAMEL(1989, sciu, sci, sci, sciu, taitoz_state, empty_init, ROT0, "Taito America Corporation", "Special Criminal Investigation (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
-GAMEL(1991, scin, sci, sci, sci, taitoz_state, empty_init, ROT0, "hack (Negro Torino)", "Super Special Criminal Investigation (Negro Torino hack)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
+GAMEL(1989, sci, 0, sci, sci, sci_state, empty_init, ROT0, "Taito Corporation Japan", "Special Criminal Investigation (World set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
+GAMEL(1989, scia, sci, sci, sci, sci_state, empty_init, ROT0, "Taito Corporation Japan", "Special Criminal Investigation (World set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
+GAMEL(1989, scij, sci, sci, scij, sci_state, empty_init, ROT0, "Taito Corporation", "Special Criminal Investigation (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
+GAMEL(1989, sciu, sci, sci, sciu, sci_state, empty_init, ROT0, "Taito America Corporation", "Special Criminal Investigation (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
+GAMEL(1991, scin, sci, sci, sci, sci_state, empty_init, ROT0, "hack (Negro Torino)", "Super Special Criminal Investigation (Negro Torino hack)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_chasehq )
-GAME( 1989, nightstr, 0, nightstr, nightstr, taitoz_state, empty_init, ROT0, "Taito Corporation Japan", "Night Striker (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1989, nightstrj, nightstr, nightstr, nghtstrj, taitoz_state, empty_init, ROT0, "Taito Corporation", "Night Striker (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1989, nightstru, nightstr, nightstr, nghtstru, taitoz_state, empty_init, ROT0, "Taito America Corporation", "Night Striker (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1989, nightstr, 0, nightstr, nightstr, nightstr_state, empty_init, ROT0, "Taito Corporation Japan", "Night Striker (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1989, nightstrj, nightstr, nightstr, nghtstrj, nightstr_state, empty_init, ROT0, "Taito Corporation", "Night Striker (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1989, nightstru, nightstr, nightstr, nghtstru, nightstr_state, empty_init, ROT0, "Taito America Corporation", "Night Striker (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1990, aquajack, 0, aquajack, aquajack, taitoz_state, empty_init, ROT0, "Taito Corporation Japan", "Aqua Jack (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1990, aquajacku, aquajack, aquajack, aquajack, taitoz_state, empty_init, ROT0, "Taito America Corporation", "Aqua Jack (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1990, aquajackj, aquajack, aquajack, aquajckj, taitoz_state, empty_init, ROT0, "Taito Corporation", "Aqua Jack (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1990, aquajack, 0, aquajack, aquajack, taitoz_z80_sound_state, empty_init, ROT0, "Taito Corporation Japan", "Aqua Jack (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1990, aquajacku, aquajack, aquajack, aquajack, taitoz_z80_sound_state, empty_init, ROT0, "Taito America Corporation", "Aqua Jack (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1990, aquajackj, aquajack, aquajack, aquajckj, taitoz_z80_sound_state, empty_init, ROT0, "Taito Corporation", "Aqua Jack (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1990, spacegun, 0, spacegun, spacegun, taitoz_state, init_bshark, ORIENTATION_FLIP_X, "Taito Corporation Japan", "Space Gun (World)", MACHINE_SUPPORTS_SAVE )
-GAME( 1990, spacegunj, spacegun, spacegun, spacegnj, taitoz_state, init_bshark, ORIENTATION_FLIP_X, "Taito Corporation", "Space Gun (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1990, spacegunu, spacegun, spacegun, spacegnu, taitoz_state, init_bshark, ORIENTATION_FLIP_X, "Taito America Corporation", "Space Gun (US)", MACHINE_SUPPORTS_SAVE )
+GAME( 1990, spacegun, 0, spacegun, spacegun, spacegun_state, empty_init, ORIENTATION_FLIP_X, "Taito Corporation Japan", "Space Gun (World)", MACHINE_SUPPORTS_SAVE )
+GAME( 1990, spacegunj, spacegun, spacegun, spacegnj, spacegun_state, empty_init, ORIENTATION_FLIP_X, "Taito Corporation", "Space Gun (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1990, spacegunu, spacegun, spacegun, spacegnu, spacegun_state, empty_init, ORIENTATION_FLIP_X, "Taito America Corporation", "Space Gun (US)", MACHINE_SUPPORTS_SAVE )
-GAMEL(1991, dblaxle, 0, dblaxle, dblaxles, taitoz_state, empty_init, ROT0, "Taito America Corporation", "Double Axle (US, Rev 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_dblaxle )
-GAMEL(1991, dblaxleu, dblaxle, dblaxle, dblaxles, taitoz_state, empty_init, ROT0, "Taito America Corporation", "Double Axle (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_dblaxle )
-GAMEL(1991, dblaxleul, dblaxle, dblaxle, dblaxle, taitoz_state, empty_init, ROT0, "Taito America Corporation", "Double Axle (US, Rev 1, Linkable)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_LAN, layout_dblaxle )
-GAMEL(1991, pwheelsj, dblaxle, dblaxle, pwheelsj, taitoz_state, empty_init, ROT0, "Taito Corporation", "Power Wheels (Japan, Rev 2, Linkable)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_LAN, layout_dblaxle )
+GAMEL(1991, dblaxle, 0, dblaxle, dblaxles, dblaxle_state, empty_init, ROT0, "Taito America Corporation", "Double Axle (US, Rev 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_dblaxle )
+GAMEL(1991, dblaxleu, dblaxle, dblaxle, dblaxles, dblaxle_state, empty_init, ROT0, "Taito America Corporation", "Double Axle (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_dblaxle )
+GAMEL(1991, dblaxleul, dblaxle, dblaxle, dblaxle, dblaxle_state, empty_init, ROT0, "Taito America Corporation", "Double Axle (US, Rev 1, Linkable)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_LAN, layout_dblaxle )
+GAMEL(1991, pwheelsj, dblaxle, dblaxle, pwheelsj, dblaxle_state, empty_init, ROT0, "Taito Corporation", "Power Wheels (Japan, Rev 2, Linkable)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_LAN, layout_dblaxle )
-GAMEL(1991, racingb, 0, racingb, racingb, taitoz_state, empty_init, ROT0, "Taito Corporation Japan", "Racing Beat (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_LAN, layout_dblaxle )
-GAMEL(1991, racingbj, racingb, racingb, racingb, taitoz_state, empty_init, ROT0, "Taito Corporation", "Racing Beat (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_LAN, layout_dblaxle )
+GAMEL(1991, racingb, 0, racingb, racingb, sci_state, empty_init, ROT0, "Taito Corporation Japan", "Racing Beat (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_LAN, layout_dblaxle )
+GAMEL(1991, racingbj, racingb, racingb, racingb, sci_state, empty_init, ROT0, "Taito Corporation", "Racing Beat (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_LAN, layout_dblaxle )
diff --git a/src/mame/drivers/taitopjc.cpp b/src/mame/drivers/taitopjc.cpp
index a57165fa656..73b415f918b 100644
--- a/src/mame/drivers/taitopjc.cpp
+++ b/src/mame/drivers/taitopjc.cpp
@@ -563,7 +563,7 @@ void taitopjc_state::dsp_w(offs_t offset, uint64_t data, uint64_t mem_mask)
void taitopjc_state::ppc603e_mem(address_map &map)
{
- map(0x00000000, 0x003fffff).ram().share(m_main_ram); // Work RAM
+ map(0x00000000, 0x003fffff).ram().share(m_main_ram); // Work RAM
map(0x40000000, 0x4000000f).rw(FUNC(taitopjc_state::video_r), FUNC(taitopjc_state::video_w));
map(0x80000000, 0x80003fff).rw(FUNC(taitopjc_state::dsp_r), FUNC(taitopjc_state::dsp_w));
map(0xc0000000, 0xc0003fff).rw(FUNC(taitopjc_state::ppc_common_r), FUNC(taitopjc_state::ppc_common_w));
@@ -748,7 +748,7 @@ void taitopjc_state::tms_io_map(address_map &map)
map(0x0058, 0x0058).w(m_tc0780fpa, FUNC(tc0780fpa_device::poly_fifo_w));
map(0x005a, 0x005a).w(m_tc0780fpa, FUNC(tc0780fpa_device::tex_w));
map(0x005b, 0x005b).rw(m_tc0780fpa, FUNC(tc0780fpa_device::tex_addr_r), FUNC(tc0780fpa_device::tex_addr_w));
- map(0x005e, 0x005e).noprw(); // ?? 0x0001 written every frame
+ map(0x005e, 0x005e).noprw(); // ?? 0x0001 written every frame
map(0x005f, 0x005f).r(FUNC(taitopjc_state::dsp_rom_r));
}
diff --git a/src/mame/drivers/taitotz.cpp b/src/mame/drivers/taitotz.cpp
index 1a049476644..2f0751fb486 100644
--- a/src/mame/drivers/taitotz.cpp
+++ b/src/mame/drivers/taitotz.cpp
@@ -1256,7 +1256,7 @@ void taitotz_renderer::render_tnl_object(uint32_t address, float scale, uint8_t
int index = 0;
do
{
- taitotz_polydata &extra = object_data_alloc();
+ taitotz_polydata &extra = object_data().next();
int num_verts;
@@ -1417,7 +1417,7 @@ void taitotz_renderer::push_direct_poly_fifo(uint32_t data)
if (m_direct_fifo_ptr >= expected_size)
{
vertex_t v[8];
- taitotz_polydata &extra = object_data_alloc();
+ taitotz_polydata &extra = object_data().next();
int index = 4;
for (int i=0; i < num_verts; i++)
diff --git a/src/mame/drivers/tamag1.cpp b/src/mame/drivers/tamag1.cpp
index 2daaca7a477..10e8933af58 100644
--- a/src/mame/drivers/tamag1.cpp
+++ b/src/mame/drivers/tamag1.cpp
@@ -1,17 +1,19 @@
// license:BSD-3-Clause
// copyright-holders:hap
// thanks-to:digshadow, segher
-/***************************************************************************
+/*******************************************************************************
Bandai Tamagotchi generation 1 hardware
* PCB label TMG-M1
* Seiko Epson E0C6S46 MCU under epoxy
-***************************************************************************/
+*******************************************************************************/
#include "emu.h"
+
#include "cpu/e0c6200/e0c6s46.h"
#include "sound/spkrdev.h"
+
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@@ -19,6 +21,8 @@
#include "tama.lh"
+namespace {
+
class tamag1_state : public driver_device
{
public:
@@ -48,11 +52,9 @@ void tamag1_state::machine_start()
}
-/***************************************************************************
-
- Video
-
-***************************************************************************/
+/*******************************************************************************
+ Video
+*******************************************************************************/
E0C6S46_PIXEL_UPDATE(tamag1_state::pixel_update)
{
@@ -88,11 +90,9 @@ void tamag1_state::tama_palette(palette_device &palette) const
-/***************************************************************************
-
- Inputs
-
-***************************************************************************/
+/*******************************************************************************
+ Input Ports
+*******************************************************************************/
INPUT_CHANGED_MEMBER(tamag1_state::input_changed)
{
@@ -113,11 +113,9 @@ INPUT_PORTS_END
-/***************************************************************************
-
- Machine Config
-
-***************************************************************************/
+/*******************************************************************************
+ Machine Configs
+*******************************************************************************/
void tamag1_state::tama(machine_config &config)
{
@@ -145,20 +143,25 @@ void tamag1_state::tama(machine_config &config)
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
+/*******************************************************************************
+ ROM Definitions
+*******************************************************************************/
ROM_START( tama )
ROM_REGION( 0x3000, "maincpu", 0 )
- ROM_LOAD( "tama.b", 0x0000, 0x3000, CRC(5c864cb1) SHA1(4b4979cf92dc9d2fb6d7295a38f209f3da144f72) )
+ ROM_LOAD( "tama.bin", 0x0000, 0x3000, CRC(5c864cb1) SHA1(4b4979cf92dc9d2fb6d7295a38f209f3da144f72) )
ROM_REGION( 0x3000, "maincpu:test", 0 )
- ROM_LOAD( "test.b", 0x0000, 0x3000, CRC(4372220e) SHA1(6e13d015113e16198c0059b9d0c38d7027ae7324) ) // this rom is on the die too, test pin enables it?
+ ROM_LOAD( "test.bin", 0x0000, 0x3000, CRC(4372220e) SHA1(6e13d015113e16198c0059b9d0c38d7027ae7324) ) // this rom is on the die too, test pin enables it?
ROM_END
+} // anonymous namespace
+
+
+
+/*******************************************************************************
+ Drivers
+*******************************************************************************/
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
CONS( 1997, tama, 0, 0, tama, tama, tamag1_state, empty_init, "Bandai", "Tamagotchi (USA)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/tank8.cpp b/src/mame/drivers/tank8.cpp
index 6cf03a3083e..c86d24db67e 100644
--- a/src/mame/drivers/tank8.cpp
+++ b/src/mame/drivers/tank8.cpp
@@ -351,7 +351,7 @@ void tank8_state::tank8(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- DISCRETE(config, m_discrete, tank8_discrete).add_route(ALL_OUTPUTS, "mono", 0.80);
+ DISCRETE(config, m_discrete, tank8_discrete).add_route(ALL_OUTPUTS, "mono", 0.3);
}
diff --git a/src/mame/drivers/taxidriv.cpp b/src/mame/drivers/taxidriv.cpp
index d539c7b3240..131532e1e63 100644
--- a/src/mame/drivers/taxidriv.cpp
+++ b/src/mame/drivers/taxidriv.cpp
@@ -12,15 +12,78 @@ OTHER: 5 * M5L8255AP
***************************************************************************/
#include "emu.h"
-#include "includes/taxidriv.h"
#include "cpu/z80/z80.h"
#include "machine/i8255.h"
#include "sound/ay8910.h"
+
+#include "emupal.h"
#include "screen.h"
#include "speaker.h"
+namespace {
+
+class taxidriv_state : public driver_device
+{
+public:
+ taxidriv_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_gfxdecode(*this, "gfxdecode"),
+ m_palette(*this, "palette"),
+ m_vram(*this, "vram%u", 0U),
+ m_scroll(*this, "scroll"),
+ m_servcoin(*this, "SERVCOIN")
+ { }
+
+ void taxidriv(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<gfxdecode_device> m_gfxdecode;
+ required_device<palette_device> m_palette;
+
+ required_shared_ptr_array<uint8_t, 8> m_vram;
+ required_shared_ptr<uint8_t> m_scroll;
+
+ required_ioport m_servcoin;
+
+ int m_s1;
+ int m_s2;
+ int m_s3;
+ int m_s4;
+ int m_latchA;
+ int m_latchB;
+ int m_bghide;
+ int m_spritectrl[9];
+
+ uint8_t p0a_r();
+ uint8_t p0c_r();
+ void p0b_w(uint8_t data);
+ void p0c_w(uint8_t data);
+ uint8_t p1b_r();
+ uint8_t p1c_r();
+ void p1a_w(uint8_t data);
+ void p1c_w(uint8_t data);
+ uint8_t p8910_0a_r();
+ uint8_t p8910_1a_r();
+ void p8910_0b_w(uint8_t data);
+ template <unsigned Offset> void spritectrl_w(uint8_t data);
+
+ void taxidriv_palette(palette_device &palette) const;
+
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void cpu2_map(address_map &map);
+ void cpu3_map(address_map &map);
+ void cpu3_port_map(address_map &map);
+ void main_map(address_map &map);
+};
+
+
void taxidriv_state::machine_start()
{
save_item(NAME(m_s1));
@@ -33,16 +96,6 @@ void taxidriv_state::machine_start()
save_item(NAME(m_spritectrl));
}
-void taxidriv_state::p2a_w(uint8_t data) { spritectrl_w(0,data); }
-void taxidriv_state::p2b_w(uint8_t data) { spritectrl_w(1,data); }
-void taxidriv_state::p2c_w(uint8_t data) { spritectrl_w(2,data); }
-void taxidriv_state::p3a_w(uint8_t data) { spritectrl_w(3,data); }
-void taxidriv_state::p3b_w(uint8_t data) { spritectrl_w(4,data); }
-void taxidriv_state::p3c_w(uint8_t data) { spritectrl_w(5,data); }
-void taxidriv_state::p4a_w(uint8_t data) { spritectrl_w(6,data); }
-void taxidriv_state::p4b_w(uint8_t data) { spritectrl_w(7,data); }
-void taxidriv_state::p4c_w(uint8_t data) { spritectrl_w(8,data); }
-
uint8_t taxidriv_state::p0a_r()
{
@@ -51,7 +104,7 @@ uint8_t taxidriv_state::p0a_r()
uint8_t taxidriv_state::p0c_r()
{
- return (m_s1 << 7);
+ return m_s1 << 7;
}
void taxidriv_state::p0b_w(uint8_t data)
@@ -79,7 +132,7 @@ uint8_t taxidriv_state::p1b_r()
uint8_t taxidriv_state::p1c_r()
{
- return (m_s2 << 7) | (m_s4 << 6) | ((ioport("SERVCOIN")->read() & 1) << 4);
+ return (m_s2 << 7) | (m_s4 << 6) | ((m_servcoin->read() & 1) << 4);
}
void taxidriv_state::p1a_w(uint8_t data)
@@ -110,27 +163,159 @@ void taxidriv_state::p8910_0b_w(uint8_t data)
m_s4 = data & 1;
}
+
+template <unsigned Offset>
+void taxidriv_state::spritectrl_w(uint8_t data)
+{
+ m_spritectrl[Offset] = data;
+}
+
+
+uint32_t taxidriv_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ if (m_bghide)
+ {
+ bitmap.fill(0, cliprect);
+
+
+ /* kludge to fix scroll after death */
+ m_scroll[0] = m_scroll[1] = m_scroll[2] = m_scroll[3] = 0;
+ m_spritectrl[2] = m_spritectrl[5] = m_spritectrl[8] = 0;
+ }
+ else
+ {
+ for (int offs = 0;offs < 0x400;offs++)
+ {
+ int sx = offs % 32;
+ int sy = offs / 32;
+
+ m_gfxdecode->gfx(3)->opaque(bitmap,cliprect,
+ m_vram[3][offs],
+ 0,
+ 0,0,
+ (sx*8-m_scroll[0])&0xff,(sy*8-m_scroll[1])&0xff);
+ }
+
+ for (int offs = 0;offs < 0x400;offs++)
+ {
+ int sx = offs % 32;
+ int sy = offs / 32;
+
+ m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
+ m_vram[2][offs]+256*m_vram[2][offs+0x400],
+ 0,
+ 0,0,
+ (sx*8-m_scroll[2])&0xff,(sy*8-m_scroll[3])&0xff,0);
+ }
+
+ if (m_spritectrl[2] & 4)
+ {
+ for (int offs = 0;offs < 0x1000;offs++)
+ {
+ int sx = ((offs/2) % 64-m_spritectrl[0]-256*(m_spritectrl[2]&1))&0x1ff;
+ int sy = ((offs/2) / 64-m_spritectrl[1]-128*(m_spritectrl[2]&2))&0x1ff;
+
+ int color = (m_vram[5][offs/4]>>(2*(offs&3)))&0x03;
+ if (color)
+ {
+ if (sx > 0 && sx < 256 && sy > 0 && sy < 256)
+ bitmap.pix(sy, sx) = color;
+ }
+ }
+ }
+
+ if (m_spritectrl[5] & 4)
+ {
+ for (int offs = 0;offs < 0x1000;offs++)
+ {
+ int sx = ((offs/2) % 64-m_spritectrl[3]-256*(m_spritectrl[5]&1))&0x1ff;
+ int sy = ((offs/2) / 64-m_spritectrl[4]-128*(m_spritectrl[5]&2))&0x1ff;
+
+ int color = (m_vram[6][offs/4]>>(2*(offs&3)))&0x03;
+ if (color)
+ {
+ if (sx > 0 && sx < 256 && sy > 0 && sy < 256)
+ bitmap.pix(sy, sx) = color;
+ }
+ }
+ }
+
+ if (m_spritectrl[8] & 4)
+ {
+ for (int offs = 0;offs < 0x1000;offs++)
+ {
+ int sx = ((offs/2) % 64-m_spritectrl[6]-256*(m_spritectrl[8]&1))&0x1ff;
+ int sy = ((offs/2) / 64-m_spritectrl[7]-128*(m_spritectrl[8]&2))&0x1ff;
+
+ int color = (m_vram[7][offs/4]>>(2*(offs&3)))&0x03;
+ if (color)
+ {
+ if (sx > 0 && sx < 256 && sy > 0 && sy < 256)
+ bitmap.pix(sy, sx) = color;
+ }
+ }
+ }
+
+ for (int offs = 0;offs < 0x400;offs++)
+ {
+ int sx = offs % 32;
+ int sy = offs / 32;
+
+ m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
+ m_vram[1][offs],
+ 0,
+ 0,0,
+ sx*8,sy*8,0);
+ }
+
+ for (int offs = 0;offs < 0x2000;offs++)
+ {
+ int sx = (offs/2) % 64;
+ int sy = (offs/2) / 64;
+
+ int color = (m_vram[4][offs/4]>>(2*(offs&3)))&0x03;
+ if (color)
+ {
+ bitmap.pix(sy, sx) = 2 * color;
+ }
+ }
+ }
+
+ for (int offs = 0;offs < 0x400;offs++)
+ {
+ int sx = offs % 32;
+ int sy = offs / 32;
+
+ m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
+ m_vram[0][offs],
+ 0,
+ 0,0,
+ sx*8,sy*8,0);
+ }
+ return 0;
+}
+
void taxidriv_state::main_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
- map(0x8000, 0x8fff).ram(); /* ??? */
- map(0x9000, 0x9fff).ram(); /* ??? */
- map(0xa000, 0xafff).ram(); /* ??? */
- map(0xb000, 0xbfff).ram(); /* ??? */
- map(0xc000, 0xc7ff).ram().share("vram4"); /* radar bitmap */
- map(0xc800, 0xcfff).writeonly().share("vram5"); /* "sprite1" bitmap */
- map(0xd000, 0xd7ff).writeonly().share("vram6"); /* "sprite2" bitmap */
- map(0xd800, 0xdfff).ram().share("vram7"); /* "sprite3" bitmap */
- map(0xe000, 0xe3ff).ram().share("vram1"); /* car tilemap */
- map(0xe400, 0xebff).ram().share("vram2"); /* bg1 tilemap */
- map(0xec00, 0xefff).ram().share("vram0"); /* fg tilemap */
- map(0xf000, 0xf3ff).ram().share("vram3"); /* bg2 tilemap */
+ map(0x8000, 0x8fff).ram(); // ???
+ map(0x9000, 0x9fff).ram(); // ???
+ map(0xa000, 0xafff).ram(); // ???
+ map(0xb000, 0xbfff).ram(); // ???
+ map(0xc000, 0xc7ff).ram().share(m_vram[4]); // radar bitmap
+ map(0xc800, 0xcfff).writeonly().share(m_vram[5]); // "sprite1" bitmap
+ map(0xd000, 0xd7ff).writeonly().share(m_vram[6]); // "sprite2" bitmap
+ map(0xd800, 0xdfff).ram().share(m_vram[7]); // "sprite3" bitmap
+ map(0xe000, 0xe3ff).ram().share(m_vram[1]); // car tilemap
+ map(0xe400, 0xebff).ram().share(m_vram[2]); // bg1 tilemap
+ map(0xec00, 0xefff).ram().share(m_vram[0]); // fg tilemap
+ map(0xf000, 0xf3ff).ram().share(m_vram[3]); // bg2 tilemap
map(0xf400, 0xf403).rw("ppi8255_0", FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0xf480, 0xf483).rw("ppi8255_2", FUNC(i8255_device::read), FUNC(i8255_device::write)); /* "sprite1" placement */
- map(0xf500, 0xf503).rw("ppi8255_3", FUNC(i8255_device::read), FUNC(i8255_device::write)); /* "sprite2" placement */
- map(0xf580, 0xf583).rw("ppi8255_4", FUNC(i8255_device::read), FUNC(i8255_device::write)); /* "sprite3" placement */
- //map(0xf780, 0xf781).writeonly(); /* more scroll registers? */
- map(0xf782, 0xf787).writeonly().share("scroll"); /* bg scroll (three copies always identical) */
+ map(0xf480, 0xf483).rw("ppi8255_2", FUNC(i8255_device::read), FUNC(i8255_device::write)); // "sprite1" placement
+ map(0xf500, 0xf503).rw("ppi8255_3", FUNC(i8255_device::read), FUNC(i8255_device::write)); // "sprite2" placement
+ map(0xf580, 0xf583).rw("ppi8255_4", FUNC(i8255_device::read), FUNC(i8255_device::write)); // "sprite3" placement
+ //map(0xf780, 0xf781).writeonly(); // more scroll registers?
+ map(0xf782, 0xf787).writeonly().share("scroll"); // bg scroll (three copies always identical)
map(0xf800, 0xffff).ram();
}
@@ -363,19 +548,19 @@ void taxidriv_state::taxidriv(machine_config &config)
ppi1.out_pc_callback().set(FUNC(taxidriv_state::p1c_w));
i8255_device &ppi2(I8255A(config, "ppi8255_2"));
- ppi2.out_pa_callback().set(FUNC(taxidriv_state::p2a_w));
- ppi2.out_pb_callback().set(FUNC(taxidriv_state::p2b_w));
- ppi2.out_pc_callback().set(FUNC(taxidriv_state::p2c_w));
+ ppi2.out_pa_callback().set(FUNC(taxidriv_state::spritectrl_w<0>));
+ ppi2.out_pb_callback().set(FUNC(taxidriv_state::spritectrl_w<1>));
+ ppi2.out_pc_callback().set(FUNC(taxidriv_state::spritectrl_w<2>));
i8255_device &ppi3(I8255A(config, "ppi8255_3"));
- ppi3.out_pa_callback().set(FUNC(taxidriv_state::p3a_w));
- ppi3.out_pb_callback().set(FUNC(taxidriv_state::p3b_w));
- ppi3.out_pc_callback().set(FUNC(taxidriv_state::p3c_w));
+ ppi3.out_pa_callback().set(FUNC(taxidriv_state::spritectrl_w<3>));
+ ppi3.out_pb_callback().set(FUNC(taxidriv_state::spritectrl_w<4>));
+ ppi3.out_pc_callback().set(FUNC(taxidriv_state::spritectrl_w<5>));
i8255_device &ppi4(I8255A(config, "ppi8255_4"));
- ppi4.out_pa_callback().set(FUNC(taxidriv_state::p4a_w));
- ppi4.out_pb_callback().set(FUNC(taxidriv_state::p4b_w));
- ppi4.out_pc_callback().set(FUNC(taxidriv_state::p4c_w));
+ ppi4.out_pa_callback().set(FUNC(taxidriv_state::spritectrl_w<6>));
+ ppi4.out_pb_callback().set(FUNC(taxidriv_state::spritectrl_w<7>));
+ ppi4.out_pc_callback().set(FUNC(taxidriv_state::spritectrl_w<8>));
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -447,5 +632,7 @@ ROM_START( taxidriv )
ROM_LOAD( "tbp18s030.ic2", 0x0000, 0x020, CRC(c366a9c5) SHA1(d38581e5c425cab4a4f216d99651e86d8034a7d2) ) // color prom located at edge of pcb
ROM_END
+} // anonymous namespace
+
GAME( 1984, taxidriv, 0, taxidriv, taxidriv, taxidriv_state, empty_init, ROT90, "Graphic Techno", "Taxi Driver", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/thunderj.cpp b/src/mame/drivers/thunderj.cpp
index e82d772a168..6ad4469637b 100644
--- a/src/mame/drivers/thunderj.cpp
+++ b/src/mame/drivers/thunderj.cpp
@@ -282,7 +282,7 @@ void thunderj_state::thunderj(machine_config &config)
ATARI_JSA_II(config, m_jsa, 0);
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_6);
m_jsa->test_read_cb().set_ioport("260012").bit(1);
- m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_jsa->add_route(ALL_OUTPUTS, "mono", 0.8);
}
diff --git a/src/mame/drivers/ti74.cpp b/src/mame/drivers/ti74.cpp
index 9934f8a7cfb..21422f5e644 100644
--- a/src/mame/drivers/ti74.cpp
+++ b/src/mame/drivers/ti74.cpp
@@ -148,7 +148,7 @@ DEVICE_IMAGE_LOAD_MEMBER(ti74_state::cart_load)
// max size is 32KB
if (size > 0x8000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid file size");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid file size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/timex.cpp b/src/mame/drivers/timex.cpp
index a5bb629ca0f..70b3bfb824f 100644
--- a/src/mame/drivers/timex.cpp
+++ b/src/mame/drivers/timex.cpp
@@ -608,12 +608,12 @@ DEVICE_IMAGE_LOAD_MEMBER( ts2068_state::cart_load )
if (size % 0x2000 != 9)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "File corrupted");
+ image.seterror(image_error::INVALIDIMAGE, "File corrupted");
return image_init_result::FAIL;
}
if (!image.loaded_through_softlist())
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Loading from softlist is not supported yet");
+ image.seterror(image_error::UNSUPPORTED, "Loading from softlist is not supported yet");
return image_init_result::FAIL;
}
@@ -628,7 +628,7 @@ DEVICE_IMAGE_LOAD_MEMBER( ts2068_state::cart_load )
if (chunks_in_file * 0x2000 + 0x09 != size)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "File corrupted");
+ image.seterror(image_error::INVALIDIMAGE, "File corrupted");
return image_init_result::FAIL;
}
@@ -652,7 +652,7 @@ DEVICE_IMAGE_LOAD_MEMBER( ts2068_state::cart_load )
break;
default:
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Cart type not supported");
+ image.seterror(image_error::INVALIDIMAGE, "Cart type not supported");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/tispeak.cpp b/src/mame/drivers/tispeak.cpp
index 707690af65a..b858d0e60c5 100644
--- a/src/mame/drivers/tispeak.cpp
+++ b/src/mame/drivers/tispeak.cpp
@@ -551,7 +551,7 @@ DEVICE_IMAGE_LOAD_MEMBER(tispeak_state::cart_load)
if (size > m_cart_max_size)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid file size");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid file size");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/tmspoker.cpp b/src/mame/drivers/tmspoker.cpp
index 25c9eee6b63..77a7f923837 100644
--- a/src/mame/drivers/tmspoker.cpp
+++ b/src/mame/drivers/tmspoker.cpp
@@ -157,7 +157,7 @@
'-------------------'
- Both program ROMs are sharing the same adressing space.
+ Both program ROMs are sharing the same addressing space.
The switch placed below the program ROMs is connected to each PD /PGM line,
so you can switch between 2 different programs.
@@ -215,8 +215,7 @@
#include "tilemap.h"
-#define MASTER_CLOCK XTAL(6'000'000) /* confirmed */
-
+namespace {
class tmspoker_state : public driver_device
{
@@ -224,6 +223,7 @@ public:
tmspoker_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
+ m_gamebank(*this, "gamebank"),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_outlatch(*this, "outlatch%u", 0U),
@@ -241,22 +241,23 @@ protected:
private:
required_shared_ptr<uint8_t> m_videoram;
+ required_memory_bank m_gamebank;
tilemap_t *m_bg_tilemap;
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device_array<ls259_device, 4> m_outlatch;
required_ioport_array<3> m_inputs;
- void tmspoker_videoram_w(offs_t offset, uint8_t data);
- //void debug_w(uint8_t data);
+ void videoram_w(offs_t offset, uint8_t data);
+ [[maybe_unused]] void debug_w(uint8_t data);
uint8_t inputs_r(offs_t offset);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
- void tmspoker_palette(palette_device &palette) const;
- uint32_t screen_update_tmspoker(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- INTERRUPT_GEN_MEMBER(tmspoker_interrupt);
+ void palette(palette_device &palette) const;
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ INTERRUPT_GEN_MEMBER(interrupt);
- void tmspoker_cru_map(address_map &map);
- void tmspoker_map(address_map &map);
+ void cru_map(address_map &map);
+ void prg_map(address_map &map);
};
@@ -264,7 +265,7 @@ private:
* Video Hardware *
*************************/
-void tmspoker_state::tmspoker_videoram_w(offs_t offset, uint8_t data)
+void tmspoker_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
@@ -289,13 +290,13 @@ void tmspoker_state::video_start()
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(tmspoker_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
}
-uint32_t tmspoker_state::screen_update_tmspoker(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+uint32_t tmspoker_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
-void tmspoker_state::tmspoker_palette(palette_device &palette) const
+void tmspoker_state::palette(palette_device &palette) const
{
}
@@ -304,12 +305,12 @@ void tmspoker_state::tmspoker_palette(palette_device &palette) const
* Read / Write Handlers *
**************************/
-//void tmspoker_state::debug_w(uint8_t data)
-//{
-// popmessage("written : %02X", data);
-//}
+void tmspoker_state::debug_w(uint8_t data)
+{
+ popmessage("written : %02X", data);
+}
-INTERRUPT_GEN_MEMBER(tmspoker_state::tmspoker_interrupt)
+INTERRUPT_GEN_MEMBER(tmspoker_state::interrupt)
{
m_maincpu->set_input_line(INT_9980A_LEVEL1, ASSERT_LINE);
// MZ: The TMS9980A uses level-triggered interrupts, so this
@@ -328,8 +329,7 @@ INTERRUPT_GEN_MEMBER(tmspoker_state::tmspoker_interrupt)
void tmspoker_state::machine_start()
{
- uint8_t *ROM = memregion("maincpu")->base();
- membank("bank1")->configure_entries(0, 2, &ROM[0], 0x1000);
+ m_gamebank->configure_entries(0, 2, memregion("maincpu")->base(), 0x1000);
}
@@ -339,7 +339,7 @@ void tmspoker_state::machine_reset()
popmessage("ROM Bank: %02X", seldsw);
- membank("bank1")->set_entry(seldsw);
+ m_gamebank->set_entry(seldsw);
}
@@ -357,13 +357,13 @@ void tmspoker_state::machine_reset()
// 098E: RT 045B
//
-void tmspoker_state::tmspoker_map(address_map &map)
+void tmspoker_state::prg_map(address_map &map)
{
map.global_mask(0x3fff);
- map(0x0000, 0x0fff).bankr("bank1");
+ map(0x0000, 0x0fff).bankr(m_gamebank);
map(0x2800, 0x2800).nopr().w("crtc", FUNC(mc6845_device::address_w));
map(0x2801, 0x2801).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
- map(0x3000, 0x33ff).ram().w(FUNC(tmspoker_state::tmspoker_videoram_w)).share("videoram");
+ map(0x3000, 0x33ff).ram().w(FUNC(tmspoker_state::videoram_w)).share(m_videoram);
map(0x3800, 0x3fff).ram(); //NVRAM?
map(0x2000, 0x20ff).ram(); //color RAM?
}
@@ -379,7 +379,7 @@ uint8_t tmspoker_state::inputs_r(offs_t offset)
return 1;
}
-void tmspoker_state::tmspoker_cru_map(address_map &map)
+void tmspoker_state::cru_map(address_map &map)
{
map(0x0c80, 0x0c8f).w(m_outlatch[0], FUNC(ls259_device::write_d0));
map(0x0c90, 0x0c9f).r(FUNC(tmspoker_state::inputs_r)).w(m_outlatch[1], FUNC(ls259_device::write_d0));
@@ -551,12 +551,12 @@ INPUT_PORTS_END
static const gfx_layout charlayout =
{
8, 8,
- RGN_FRAC(1,1), /* 256 tiles */
+ RGN_FRAC(1,1), // 256 tiles
1,
{ 0 },
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
- 8*8 /* every char takes 8 consecutive bytes */
+ 8*8 // every char takes 8 consecutive bytes
};
@@ -565,7 +565,7 @@ static const gfx_layout charlayout =
******************************/
static GFXDECODE_START( gfx_tmspoker )
- GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 16 )
+ GFXDECODE_ENTRY( "chars", 0, charlayout, 0, 16 )
GFXDECODE_END
@@ -576,28 +576,28 @@ GFXDECODE_END
void tmspoker_state::tmspoker(machine_config &config)
{
// CPU TMS9980A; no line connections
- TMS9980A(config, m_maincpu, MASTER_CLOCK);
- m_maincpu->set_addrmap(AS_PROGRAM, &tmspoker_state::tmspoker_map);
- m_maincpu->set_addrmap(AS_IO, &tmspoker_state::tmspoker_cru_map);
- m_maincpu->set_vblank_int("screen", FUNC(tmspoker_state::tmspoker_interrupt));
+ TMS9980A(config, m_maincpu, 6_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tmspoker_state::prg_map);
+ m_maincpu->set_addrmap(AS_IO, &tmspoker_state::cru_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tmspoker_state::interrupt));
LS259(config, m_outlatch[0]);
LS259(config, m_outlatch[1]);
LS259(config, m_outlatch[2]);
LS259(config, m_outlatch[3]);
- /* video hardware */
+ // video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(subseconds::from_usec(0));
screen.set_size(32*8, 32*8);
screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
- screen.set_screen_update(FUNC(tmspoker_state::screen_update_tmspoker));
+ screen.set_screen_update(FUNC(tmspoker_state::screen_update));
GFXDECODE(config, m_gfxdecode, "palette", gfx_tmspoker);
- PALETTE(config, "palette", FUNC(tmspoker_state::tmspoker_palette), 256);
+ PALETTE(config, "palette", FUNC(tmspoker_state::palette), 256);
- mc6845_device &crtc(MC6845(config, "crtc", MASTER_CLOCK/4)); /* guess */
+ mc6845_device &crtc(MC6845(config, "crtc", 6_MHz_XTAL / 4)); // guess
crtc.set_screen("screen");
crtc.set_show_border_area(false);
crtc.set_char_width(8);
@@ -609,14 +609,13 @@ void tmspoker_state::tmspoker(machine_config &config)
*************************/
ROM_START( tmspoker )
- ROM_REGION( 0x4000, "maincpu", 0 ) /* TMS9980 selectable code */
-
- ROM_LOAD( "0.bin", 0x0800, 0x0800, CRC(a20ae6cb) SHA1(d47780119b4ebb16dc759a50dfc880ddbc6a1112) ) /* Program 1 */
+ ROM_REGION( 0x4000, "maincpu", 0 ) // TMS9980 selectable code
+ ROM_LOAD( "0.bin", 0x0800, 0x0800, CRC(a20ae6cb) SHA1(d47780119b4ebb16dc759a50dfc880ddbc6a1112) ) // Program 1
ROM_CONTINUE( 0x0000, 0x0800 )
- ROM_LOAD( "8.bin", 0x1800, 0x0800, CRC(0c0a7159) SHA1(92cc3dc32a5bf4a7fa197e72c3931e583c96ef33) ) /* Program 2 */
+ ROM_LOAD( "8.bin", 0x1800, 0x0800, CRC(0c0a7159) SHA1(92cc3dc32a5bf4a7fa197e72c3931e583c96ef33) ) // Program 2
ROM_CONTINUE( 0x1000, 0x0800 )
- ROM_REGION( 0x0800, "gfx1", 0 )
+ ROM_REGION( 0x0800, "chars", 0 )
ROM_LOAD( "3.bin", 0x0000, 0x0800, CRC(55458dae) SHA1(bf96d1b287292ff89bc2dbd9451a88a2ab941f3e) )
ROM_REGION( 0x0100, "proms", 0 )
@@ -630,7 +629,7 @@ ROM_END
void tmspoker_state::init_bus()
{
- /* still need to decode the addressing lines */
+ // still need to decode the addressing lines
/* text found in the ROM (A at 6, B at 8, etc: consistent with gfx rom byte offsets) suggests
that the lower address lines are good already:
@@ -648,6 +647,8 @@ void tmspoker_state::init_bus()
*/
}
+} // Anonymous namespace
+
/*************************
* Game Drivers *
diff --git a/src/mame/drivers/toaplan1.cpp b/src/mame/drivers/toaplan1.cpp
index 0b34dbd6184..83a57dd7294 100644
--- a/src/mame/drivers/toaplan1.cpp
+++ b/src/mame/drivers/toaplan1.cpp
@@ -1969,8 +1969,10 @@ void toaplan1_rallybik_state::rallybik(machine_config &config)
m_screen->screen_vblank().set(FUNC(toaplan1_rallybik_state::screen_vblank));
TOAPLAN_SCU(config, m_spritegen, 0);
+ m_spritegen->set_screen(m_screen);
m_spritegen->set_palette(m_palette);
m_spritegen->set_xoffsets(31, 15);
+ m_spritegen->set_pri_callback(FUNC(toaplan1_rallybik_state::pri_cb));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_rallybik);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, (64*16)+(64*16));
diff --git a/src/mame/drivers/toaplan2.cpp b/src/mame/drivers/toaplan2.cpp
index 6769ec1ea4e..20c6f6057c8 100644
--- a/src/mame/drivers/toaplan2.cpp
+++ b/src/mame/drivers/toaplan2.cpp
@@ -3373,7 +3373,7 @@ void toaplan2_state::ghox(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 1.0); // verified on pcb
+ YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5); // verified on pcb
}
/* probably dogyuun, vfive and kbash use the same decryption table;
@@ -3821,7 +3821,7 @@ void toaplan2_state::vfive(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 1.0); // verified on PCB
+ YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5); // verified on PCB
}
@@ -3863,10 +3863,10 @@ void toaplan2_state::batsugun(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5);
+ YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.4);
OKIM6295(config, m_oki[0], 32_MHz_XTAL/8, okim6295_device::PIN7_LOW);
- m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
+ m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.4);
}
void toaplan2_state::pwrkick(machine_config &config)
@@ -3998,10 +3998,10 @@ void toaplan2_state::snowbro2(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 1.0);
+ YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5);
OKIM6295(config, m_oki[0], 27_MHz_XTAL/10, okim6295_device::PIN7_HIGH);
- m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
}
@@ -4095,11 +4095,11 @@ void toaplan2_state::bgaregga(machine_config &config)
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0);
m_soundlatch->set_separate_acknowledge(true);
- YM2151(config, "ymsnd", 32_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5);
+ YM2151(config, "ymsnd", 32_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.35);
OKIM6295(config, m_oki[0], 32_MHz_XTAL/16, okim6295_device::PIN7_HIGH);
m_oki[0]->set_addrmap(0, &toaplan2_state::raizing_oki<0>);
- m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.7);
}
@@ -4162,15 +4162,15 @@ void toaplan2_state::batrider(machine_config &config)
GENERIC_LATCH_8(config, "soundlatch3");
GENERIC_LATCH_8(config, "soundlatch4");
- YM2151(config, "ymsnd", 32_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5); // 4MHz, 32MHz Oscillator (verified)
+ YM2151(config, "ymsnd", 32_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.25); // 4MHz, 32MHz Oscillator (verified)
OKIM6295(config, m_oki[0], 32_MHz_XTAL/10, okim6295_device::PIN7_HIGH);
m_oki[0]->set_addrmap(0, &toaplan2_state::raizing_oki<0>);
- m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
OKIM6295(config, m_oki[1], 32_MHz_XTAL/10, okim6295_device::PIN7_LOW);
m_oki[1]->set_addrmap(0, &toaplan2_state::raizing_oki<1>);
- m_oki[1]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki[1]->add_route(ALL_OUTPUTS, "mono", 0.5);
}
diff --git a/src/mame/drivers/tubep.cpp b/src/mame/drivers/tubep.cpp
index 78fa0b8ff55..c34ae4e3109 100644
--- a/src/mame/drivers/tubep.cpp
+++ b/src/mame/drivers/tubep.cpp
@@ -150,7 +150,6 @@ void tubep_state::main_cpu_irq_line_clear_w(uint8_t data)
{
m_maincpu->set_input_line(0, CLEAR_LINE);
LOGIRQ("CPU#0 VBLANK int clear at scanline=%3i\n", m_curr_scanline);
- return;
}
@@ -182,7 +181,6 @@ void tubep_state::second_cpu_irq_line_clear_w(uint8_t data)
{
m_slave->set_input_line(0, CLEAR_LINE);
LOGIRQ("CPU#1 VBLANK int clear at scanline=%3i\n", m_curr_scanline);
- return;
}
@@ -320,27 +318,10 @@ TIMER_CALLBACK_MEMBER(tubep_state::tubep_scanline_callback)
-/*************************************
- *
- * Save state setup
- *
- *************************************/
-
-void tubep_state::tubep_setup_save_state()
-{
- /* Set up save state */
- save_item(NAME(m_ls74));
- save_item(NAME(m_ls377));
-}
-
-
-
void tubep_state::machine_start()
{
- /* Create interrupt timer */
+ // Create interrupt timer
m_interrupt_timer = timer_alloc(TIMER_TUBEP_SCANLINE);
-
- tubep_setup_save_state();
}
@@ -396,7 +377,15 @@ void rjammer_state::rjammer_main_portmap(address_map &map)
map(0xd0, 0xd7).w("mainlatch", FUNC(ls259_device::write_d0));
map(0xe0, 0xe0).w(FUNC(rjammer_state::main_cpu_irq_line_clear_w)); /* clear IRQ interrupt */
- map(0xf0, 0xf0).w("soundlatch", FUNC(generic_latch_8_device::write));
+ map(0xf0, 0xf0).w(FUNC(rjammer_state::soundlatch_nmi_w));
+}
+
+void rjammer_state::soundlatch_nmi_w(uint8_t data)
+{
+ m_soundlatch->write(data);
+
+ // LS138 decode output is connected directly to NMI
+ m_soundcpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
@@ -481,15 +470,22 @@ TIMER_CALLBACK_MEMBER(tubep_state::rjammer_scanline_callback)
void rjammer_state::machine_start()
{
- /* Create interrupt timer */
+ // Create interrupt timer
m_interrupt_timer = timer_alloc(TIMER_RJAMMER_SCANLINE);
- tubep_setup_save_state();
+ // Set up save state
+ save_item(NAME(m_msm5205_toggle));
}
void rjammer_state::machine_reset()
{
m_interrupt_timer->adjust(m_screen->time_until_pos(0));
+
+ m_msm5205_toggle = false;
+ m_adpcm_mux->select_w(0);
+
+ rjammer_voice_startstop_w(0);
+ rjammer_voice_frequency_select_w(0);
}
@@ -505,36 +501,30 @@ void rjammer_state::rjammer_voice_startstop_w(uint8_t data)
/* bit 0 of data selects voice start/stop (reset pin on MSM5205)*/
// 0 -stop; 1-start
m_msm->reset_w((data & 1)^1);
-
- return;
}
void rjammer_state::rjammer_voice_frequency_select_w(uint8_t data)
{
- /* bit 0 of data selects voice frequency on MSM5205 */
+ // bit 0 of data selects voice frequency on MSM5205 (pin 1)
// 0 -4 KHz; 1- 8KHz
if (data & 1)
- m_msm->playmode_w(msm5205_device::S48_4B); /* 8 KHz */
+ m_msm->playmode_w(msm5205_device::S48_4B); // 8 KHz
else
- m_msm->playmode_w(msm5205_device::S96_4B); /* 4 KHz */
+ m_msm->playmode_w(msm5205_device::S96_4B); // 4 KHz
}
-WRITE_LINE_MEMBER(rjammer_state::rjammer_adpcm_vck)
+WRITE_LINE_MEMBER(rjammer_state::rjammer_adpcm_vck_w)
{
- m_ls74 = (m_ls74 + 1) & 1;
-
- if (m_ls74 == 1)
+ if (state)
{
- m_msm->data_w((m_ls377 >> 0) & 15);
- m_soundcpu->set_input_line(0, ASSERT_LINE);
- }
- else
- {
- m_msm->data_w((m_ls377 >> 4) & 15);
- }
+ m_msm5205_toggle = !m_msm5205_toggle;
+ m_adpcm_mux->select_w(m_msm5205_toggle);
+ if (m_msm5205_toggle)
+ m_soundcpu->set_input_line(0, ASSERT_LINE);
+ }
}
@@ -543,15 +533,13 @@ void rjammer_state::rjammer_voice_input_w(uint8_t data)
/* 8 bits of adpcm data for MSM5205 */
/* need to buffer the data, and switch two nibbles on two following interrupts*/
- m_ls377 = data;
-
+ m_adpcm_mux->ba_w(data);
/* NOTE: game resets interrupt line on ANY access to ANY I/O port.
I do it here because this port (0x80) is first one accessed
in the interrupt routine.
*/
m_soundcpu->set_input_line(0, CLEAR_LINE );
- return;
}
@@ -559,7 +547,6 @@ void rjammer_state::rjammer_voice_intensity_control_w(uint8_t data)
{
/* 4 LSB bits select the intensity (analog circuit that alters the output from MSM5205) */
/* need to buffer the data */
- return;
}
@@ -883,21 +870,21 @@ void tubep_state::tubepb(machine_config &config)
void rjammer_state::rjammer(machine_config &config)
{
/* basic machine hardware */
- Z80(config, m_maincpu, 16000000 / 4); /* 4 MHz */
+ Z80(config, m_maincpu, 16_MHz_XTAL / 4); /* 4 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &rjammer_state::rjammer_main_map);
m_maincpu->set_addrmap(AS_IO, &rjammer_state::rjammer_main_portmap);
- Z80(config, m_slave, 16000000 / 4); /* 4 MHz */
+ Z80(config, m_slave, 16_MHz_XTAL / 4); /* 4 MHz */
m_slave->set_addrmap(AS_PROGRAM, &rjammer_state::rjammer_second_map);
m_slave->set_addrmap(AS_IO, &rjammer_state::rjammer_second_portmap);
- Z80(config, m_soundcpu, 19968000 / 8); /* X2 19968000 Hz divided by LS669 (on Qc output) (signal RH0) */
+ Z80(config, m_soundcpu, 19968000 / 8); // X2 19968000 Hz (schematic says 20 MHz?) divided by LS669 (on Qc output) (signal RH0)
m_soundcpu->set_addrmap(AS_PROGRAM, &rjammer_state::rjammer_sound_map);
m_soundcpu->set_addrmap(AS_IO, &rjammer_state::rjammer_sound_portmap);
- GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_soundcpu, INPUT_LINE_NMI);
+ GENERIC_LATCH_8(config, m_soundlatch);
- NSC8105(config, m_mcu, 6000000); /* 6 MHz Xtal - divided internally ??? */
+ NSC8105(config, m_mcu, 6_MHz_XTAL); /* 6 MHz Xtal - divided internally ??? */
m_mcu->set_ram_enable(false);
m_mcu->set_addrmap(AS_PROGRAM, &rjammer_state::nsc_map);
@@ -908,9 +895,7 @@ void rjammer_state::rjammer(machine_config &config)
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
- m_screen->set_refresh_hz(60);
- m_screen->set_size(256, 264);
- m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_raw(19968000 / 4, 320, 0, 256, 264, 16, 240);
m_screen->set_screen_update(FUNC(rjammer_state::screen_update_rjammer));
m_screen->set_palette("palette");
@@ -922,22 +907,24 @@ void rjammer_state::rjammer(machine_config &config)
ay8910_device &ay1(AY8910(config, "ay1", 19968000 / 8 / 2));
ay1.port_a_write_callback().set(FUNC(rjammer_state::ay8910_portA_0_w));
ay1.port_b_write_callback().set(FUNC(rjammer_state::ay8910_portB_0_w));
- ay1.add_route(ALL_OUTPUTS, "mono", 0.10);
+ ay1.add_route(ALL_OUTPUTS, "mono", 0.075);
ay8910_device &ay2(AY8910(config, "ay2", 19968000 / 8 / 2));
ay2.port_a_write_callback().set(FUNC(rjammer_state::ay8910_portA_1_w));
ay2.port_b_write_callback().set(FUNC(rjammer_state::ay8910_portB_1_w));
- ay2.add_route(ALL_OUTPUTS, "mono", 0.10);
+ ay2.add_route(ALL_OUTPUTS, "mono", 0.075);
ay8910_device &ay3(AY8910(config, "ay3", 19968000 / 8 / 2));
ay3.port_a_write_callback().set(FUNC(rjammer_state::ay8910_portA_2_w));
ay3.port_b_write_callback().set(FUNC(rjammer_state::ay8910_portB_2_w));
- ay3.add_route(ALL_OUTPUTS, "mono", 0.10);
+ ay3.add_route(ALL_OUTPUTS, "mono", 0.075);
+
+ MSM5205(config, m_msm, 384_kHz_XTAL);
+ m_msm->vck_callback().set(FUNC(rjammer_state::rjammer_adpcm_vck_w));
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); // 8 KHz (changes at run time)
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.325);
- MSM5205(config, m_msm, 384000);
- m_msm->vck_legacy_callback().set(FUNC(rjammer_state::rjammer_adpcm_vck)); /* VCK function */
- m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz (changes at run time) */
- m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
+ LS157(config, m_adpcm_mux).out_callback().set(m_msm, FUNC(msm5205_device::data_w)); // 9G (fed by LS377 @ 10G)
}
diff --git a/src/mame/drivers/twincobr.cpp b/src/mame/drivers/twincobr.cpp
index 40f2d998445..17b2a24557f 100644
--- a/src/mame/drivers/twincobr.cpp
+++ b/src/mame/drivers/twincobr.cpp
@@ -688,8 +688,10 @@ void twincobr_state::twincobr(machine_config &config)
crtc.set_char_width(2);
TOAPLAN_SCU(config, m_spritegen, 0);
+ m_spritegen->set_screen(m_screen);
m_spritegen->set_palette(m_palette);
m_spritegen->set_xoffsets(31, 15);
+ m_spritegen->set_pri_callback(FUNC(twincobr_state::pri_cb));
BUFFERED_SPRITERAM16(config, m_spriteram16);
diff --git a/src/mame/drivers/tx0.cpp b/src/mame/drivers/tx0.cpp
index 1d3d4be1807..80754e6813c 100644
--- a/src/mame/drivers/tx0.cpp
+++ b/src/mame/drivers/tx0.cpp
@@ -416,6 +416,7 @@ public:
virtual const char *file_extensions() const noexcept override { return "tap,rim"; }
virtual image_init_result call_load() override;
+ virtual image_init_result call_create(int format_type, util::option_resolution *format_options) override;
virtual void call_unload() override;
protected:
@@ -517,27 +518,30 @@ tx0_magtape_image_device::tx0_magtape_image_device(const machine_config &mconfig
*/
image_init_result tx0_readtape_image_device::call_load()
{
- /* reader unit */
- m_tx0->m_tape_reader.fd = this;
+ if (m_tx0)
+ {
+ /* reader unit */
+ m_tx0->m_tape_reader.fd = this;
- /* start motor */
- m_tx0->m_tape_reader.motor_on = 1;
+ /* start motor */
+ m_tx0->m_tape_reader.motor_on = 1;
/* restart reader IO when necessary */
/* note that this function may be called before tx0_init_machine, therefore
before tape_reader.timer is allocated. It does not matter, as the clutch is never
down at power-up, but we must not call timer_enable with a nullptr parameter! */
- if (m_tx0->m_tape_reader.timer)
- {
- if (m_tx0->m_tape_reader.motor_on && m_tx0->m_tape_reader.rcl)
- {
- /* delay is approximately 1/400s */
- m_tx0->m_tape_reader.timer->adjust(attotime::from_usec(2500));
- }
- else
+ if (m_tx0->m_tape_reader.timer)
{
- m_tx0->m_tape_reader.timer->enable(0);
+ if (m_tx0->m_tape_reader.motor_on && m_tx0->m_tape_reader.rcl)
+ {
+ /* delay is approximately 1/400s */
+ m_tx0->m_tape_reader.timer->adjust(attotime::from_usec(2500));
+ }
+ else
+ {
+ m_tx0->m_tape_reader.timer->enable(0);
+ }
}
}
@@ -547,13 +551,16 @@ image_init_result tx0_readtape_image_device::call_load()
void tx0_readtape_image_device::call_unload()
{
/* reader unit */
- m_tx0->m_tape_reader.fd = nullptr;
+ if (m_tx0)
+ {
+ m_tx0->m_tape_reader.fd = nullptr;
- /* stop motor */
- m_tx0->m_tape_reader.motor_on = 0;
+ /* stop motor */
+ m_tx0->m_tape_reader.motor_on = 0;
- if (m_tx0->m_tape_reader.timer)
- m_tx0->m_tape_reader.timer->enable(0);
+ if (m_tx0->m_tape_reader.timer)
+ m_tx0->m_tape_reader.timer->enable(0);
+ }
}
/*
@@ -573,7 +580,10 @@ int tx0_state::tape_read(uint8_t *reply)
void tx0_state::tape_write(uint8_t data)
{
if (m_tape_puncher.fd)
+ {
+ data |= 0200;
m_tape_puncher.fd->fwrite(& data, 1);
+ }
}
/*
@@ -650,15 +660,22 @@ TIMER_CALLBACK_MEMBER(tx0_state::reader_callback)
image_init_result tx0_punchtape_image_device::call_load()
{
/* punch unit */
- m_tx0->m_tape_puncher.fd = this;
+ if (m_tx0)
+ m_tx0->m_tape_puncher.fd = this;
return image_init_result::PASS;
}
+image_init_result tx0_punchtape_image_device::call_create(int format_type, util::option_resolution *format_options)
+{
+ return call_load();
+}
+
void tx0_punchtape_image_device::call_unload()
{
/* punch unit */
- m_tx0->m_tape_puncher.fd = nullptr;
+ if (m_tx0)
+ m_tx0->m_tape_puncher.fd = nullptr;
}
TIMER_CALLBACK_MEMBER(tx0_state::puncher_callback)
@@ -726,14 +743,16 @@ WRITE_LINE_MEMBER( tx0_state::tx0_io_p7h )
image_init_result tx0_printer_image_device::call_load()
{
/* open file */
- m_tx0->m_typewriter.fd = this;
+ if (m_tx0)
+ m_tx0->m_typewriter.fd = this;
return image_init_result::PASS;
}
void tx0_printer_image_device::call_unload()
{
- m_tx0->m_typewriter.fd = nullptr;
+ if (m_tx0)
+ m_tx0->m_typewriter.fd = nullptr;
}
/*
@@ -743,7 +762,7 @@ void tx0_state::typewriter_out(uint8_t data)
{
tx0_typewriter_drawchar(data);
if (m_typewriter.fd)
- m_typewriter.fd->fwrite(& data, 1);
+ m_typewriter.fd->fwrite(&data, 1);
}
/*
@@ -862,18 +881,21 @@ void tx0_magtape_image_device::device_start()
*/
image_init_result tx0_magtape_image_device::call_load()
{
- m_tx0->m_magtape.img = this;
+ if (m_tx0)
+ {
+ m_tx0->m_magtape.img = this;
- m_tx0->m_magtape.irg_pos = MTIRGP_END;
+ m_tx0->m_magtape.irg_pos = MTIRGP_END;
- /* restart IO when necessary */
- /* note that this function may be called before tx0_init_machine, therefore
- before magtape.timer is allocated. We must not call timer_enable with a
- nullptr parameter! */
- if (m_tx0->m_magtape.timer)
- {
- if (m_tx0->m_magtape.state == MTS_SELECTING)
- m_tx0->schedule_select();
+ /* restart IO when necessary */
+ /* note that this function may be called before tx0_init_machine, therefore
+ before magtape.timer is allocated. We must not call timer_enable with a
+ nullptr parameter! */
+ if (m_tx0->m_magtape.timer)
+ {
+ if (m_tx0->m_magtape.state == MTS_SELECTING)
+ m_tx0->schedule_select();
+ }
}
return image_init_result::PASS;
@@ -881,18 +903,21 @@ image_init_result tx0_magtape_image_device::call_load()
void tx0_magtape_image_device::call_unload()
{
- m_tx0->m_magtape.img = nullptr;
-
- if (m_tx0->m_magtape.timer)
+ if (m_tx0)
{
- if (m_tx0->m_magtape.state == MTS_SELECTING)
- /* I/O has not actually started, we can cancel the selection */
- m_tx0->m_tape_reader.timer->enable(0);
- if ((m_tx0->m_magtape.state == MTS_SELECTED) || ((m_tx0->m_magtape.state == MTS_SELECTING) && (m_tx0->m_magtape.command == 2)))
- { /* unit has become unavailable */
- m_tx0->m_magtape.state = MTS_UNSELECTING;
- m_tx0->m_maincpu->set_state_int(TX0_PF, m_tx0->m_maincpu->state_int(TX0_PF) | PF_RWC);
- m_tx0->schedule_unselect();
+ m_tx0->m_magtape.img = nullptr;
+
+ if (m_tx0->m_magtape.timer)
+ {
+ if (m_tx0->m_magtape.state == MTS_SELECTING)
+ /* I/O has not actually started, we can cancel the selection */
+ m_tx0->m_tape_reader.timer->enable(0);
+ if ((m_tx0->m_magtape.state == MTS_SELECTED) || ((m_tx0->m_magtape.state == MTS_SELECTING) && (m_tx0->m_magtape.command == 2)))
+ { /* unit has become unavailable */
+ m_tx0->m_magtape.state = MTS_UNSELECTING;
+ m_tx0->m_maincpu->set_state_int(TX0_PF, m_tx0->m_maincpu->state_int(TX0_PF) | PF_RWC);
+ m_tx0->schedule_unselect();
+ }
}
}
}
@@ -1427,9 +1452,7 @@ void tx0_state::tx0_keyboard()
;
charcode = (i << 4) + j;
/* shuffle and insert data into LR */
- /* BTW, I am not sure how the char code is combined with the
- previous LR */
- lr = (1 << 17) | ((charcode & 040) << 10) | ((charcode & 020) << 8) | ((charcode & 010) << 6) | ((charcode & 004) << 4) | ((charcode & 002) << 2) | ((charcode & 001) << 1);
+ lr = (1 << 17) | (charcode << 11) | m_maincpu->state_int(TX0_LR);
/* write modified LR */
m_maincpu->set_state_int(TX0_LR, lr);
tx0_typewriter_drawchar(charcode); /* we want to echo input */
@@ -1586,7 +1609,7 @@ void tx0_state::tx0_64kw(machine_config &config)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_tx0);
PALETTE(config, m_palette, FUNC(tx0_state::tx0_palette), total_colors_needed + sizeof(tx0_pens), total_colors_needed);
- SOFTWARE_LIST(config, "ptp_list").set_original("tx0_ptp").set_filter("64");
+ SOFTWARE_LIST(config, "ptp_list").set_original("tx0_ptp").set_filter("64,OLDCODE");
}
void tx0_state::tx0_8kw(machine_config &config)
@@ -1611,7 +1634,7 @@ void tx0_state::tx0_8kw(machine_config &config)
/* dummy interrupt: handles input */
m_maincpu->set_vblank_int("screen", FUNC(tx0_state::tx0_interrupt));
- SOFTWARE_LIST(config.replace(), "ptp_list").set_original("tx0_ptp").set_filter("8");
+ SOFTWARE_LIST(config.replace(), "ptp_list").set_original("tx0_ptp").set_filter("8,NEWCODE");
}
ROM_START(tx0_64kw)
diff --git a/src/mame/drivers/ultim809.cpp b/src/mame/drivers/ultim809.cpp
index 8f7e2220cc8..29b69bbb1ba 100644
--- a/src/mame/drivers/ultim809.cpp
+++ b/src/mame/drivers/ultim809.cpp
@@ -36,14 +36,19 @@ Status:
****************************************************************************************************/
#include "emu.h"
+
+#include "bus/rs232/rs232.h"
#include "cpu/m6809/m6809.h"
-#include "video/tms9928a.h"
#include "machine/6522via.h"
-#include "sound/ay8910.h"
#include "machine/ins8250.h"
-#include "bus/rs232/rs232.h"
+#include "sound/ay8910.h"
+#include "video/tms9928a.h"
+
#include "speaker.h"
+
+namespace {
+
class ultim809_state : public driver_device
{
public:
@@ -61,9 +66,11 @@ public:
DECLARE_INPUT_CHANGED_MEMBER(nmi_button);
+protected:
+ virtual void machine_start() override;
+
private:
void mem_map(address_map &map);
- virtual void machine_start() override;
std::unique_ptr<u8[]> m_ram;
required_device<cpu_device> m_maincpu;
required_device<via6522_device> m_via;
@@ -168,6 +175,9 @@ ROM_START( ultim809 )
ROM_LOAD( "ultim809.u9", 0x0000, 0x2000, CRC(b827aaf1) SHA1(64d9e94542d8ff13f64a4d787508eef7b64d4946) )
ROM_END
+} // anonymous namespace
+
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/ultrsprt.cpp b/src/mame/drivers/ultrsprt.cpp
index 315951ef4fa..12f5d0225f4 100644
--- a/src/mame/drivers/ultrsprt.cpp
+++ b/src/mame/drivers/ultrsprt.cpp
@@ -18,6 +18,8 @@
#include "speaker.h"
+namespace {
+
class ultrsprt_state : public driver_device
{
public:
@@ -30,11 +32,16 @@ public:
m_palette(*this, "palette"),
m_eeprom(*this, "eeprom"),
m_upd(*this, "upd%u", 1),
+ m_vrambank(*this, "vram"),
m_service(*this, "SERVICE")
{ }
void ultrsprt(machine_config &config);
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
private:
static const u32 VRAM_PAGES = 2;
static const u32 VRAM_PAGE_BYTES = 512 * 1024;
@@ -47,6 +54,8 @@ private:
required_device<eeprom_serial_93cxx_device> m_eeprom;
required_device_array<upd4701_device, 2> m_upd;
+ required_memory_bank m_vrambank;
+
required_ioport m_service;
u8 eeprom_r();
@@ -55,13 +64,10 @@ private:
u16 upd2_r(offs_t offset);
void int_ack_w(u32 data);
- u32 screen_update_ultrsprt(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void sound_map(address_map &map);
- void ultrsprt_map(address_map &map);
-
- virtual void machine_start() override;
- virtual void machine_reset() override;
+ void main_map(address_map &map);
std::unique_ptr<u8[]> m_vram;
u32 m_cpu_vram_page;
@@ -70,7 +76,7 @@ private:
/*****************************************************************************/
-u32 ultrsprt_state::screen_update_ultrsprt(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 ultrsprt_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 const *const vram = m_vram.get() + (m_cpu_vram_page ^ 1) * VRAM_PAGE_BYTES;
@@ -126,7 +132,7 @@ void ultrsprt_state::eeprom_w(u8 data)
u32 vram_page = (data & 0x08) >> 3;
if (vram_page != m_cpu_vram_page)
{
- membank("vram")->set_entry(vram_page);
+ m_vrambank->set_entry(vram_page);
m_cpu_vram_page = vram_page;
}
@@ -151,16 +157,16 @@ u16 ultrsprt_state::upd2_r(offs_t offset)
/*****************************************************************************/
-void ultrsprt_state::ultrsprt_map(address_map &map)
+void ultrsprt_state::main_map(address_map &map)
{
- map(0x00000000, 0x0007ffff).bankrw("vram");
+ map(0x00000000, 0x0007ffff).bankrw(m_vrambank);
map(0x70000000, 0x70000000).rw(FUNC(ultrsprt_state::eeprom_r), FUNC(ultrsprt_state::eeprom_w));
map(0x70000020, 0x70000023).r(FUNC(ultrsprt_state::upd1_r));
map(0x70000040, 0x70000043).r(FUNC(ultrsprt_state::upd2_r));
map(0x70000080, 0x7000008f).rw(m_k056800, FUNC(k056800_device::host_r), FUNC(k056800_device::host_w));
map(0x700000c0, 0x700000cf).nopw(); // Written following DMA interrupt - unused int ack?
map(0x700000e0, 0x700000e3).w(FUNC(ultrsprt_state::int_ack_w));
- map(0x7f000000, 0x7f01ffff).ram().share("workram");
+ map(0x7f000000, 0x7f01ffff).ram().share(m_workram);
map(0x7f700000, 0x7f703fff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette");
map(0x7f800000, 0x7f9fffff).mirror(0x00600000).rom().region("program", 0);
}
@@ -212,15 +218,15 @@ INPUT_PORTS_END
void ultrsprt_state::machine_start()
{
- /* set conservative DRC options */
+ // set conservative DRC options
m_maincpu->ppcdrc_set_options(PPCDRC_COMPATIBLE_OPTIONS);
- /* configure fast RAM regions for DRC */
+ // configure fast RAM regions for DRC
m_maincpu->ppcdrc_add_fastram(0xff000000, 0xff01ffff, false, m_workram);
m_vram = std::make_unique<u8[]>(VRAM_PAGE_BYTES * VRAM_PAGES);
- membank("vram")->configure_entries(0, VRAM_PAGES, m_vram.get(), VRAM_PAGE_BYTES);
+ m_vrambank->configure_entries(0, VRAM_PAGES, m_vram.get(), VRAM_PAGE_BYTES);
save_pointer(NAME(m_vram), VRAM_PAGE_BYTES * VRAM_PAGES);
save_item(NAME(m_cpu_vram_page));
@@ -231,7 +237,7 @@ void ultrsprt_state::machine_reset()
m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
m_cpu_vram_page = 0;
- membank("vram")->set_entry(m_cpu_vram_page);
+ m_vrambank->set_entry(m_cpu_vram_page);
}
@@ -239,9 +245,9 @@ void ultrsprt_state::machine_reset()
void ultrsprt_state::ultrsprt(machine_config &config)
{
- /* basic machine hardware */
+ // basic machine hardware
PPC403GA(config, m_maincpu, 25000000);
- m_maincpu->set_addrmap(AS_PROGRAM, &ultrsprt_state::ultrsprt_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ultrsprt_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(ultrsprt_state::irq1_line_assert));
M68000(config, m_audiocpu, 8000000); // Unconfirmed
@@ -257,17 +263,17 @@ void ultrsprt_state::ultrsprt(machine_config &config)
m_upd[1]->set_portx_tag("P2X");
m_upd[1]->set_porty_tag("P2Y");
- /* video hardware */
+ // video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60); // TODO: Determine correct timings
screen.set_size(640, 480);
screen.set_visarea(0, 511, 0, 399);
- screen.set_screen_update(FUNC(ultrsprt_state::screen_update_ultrsprt));
+ screen.set_screen_update(FUNC(ultrsprt_state::screen_update));
screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 8192);
- /* sound hardware */
+ // sound hardware
K056800(config, m_k056800, XTAL(18'432'000));
m_k056800->int_callback().set_inputline(m_audiocpu, M68K_IRQ_6);
@@ -284,16 +290,16 @@ void ultrsprt_state::ultrsprt(machine_config &config)
/*****************************************************************************/
ROM_START( fiveside )
- ROM_REGION32_BE(0x200000, "program", 0) /* PowerPC program ROMs */
+ ROM_REGION32_BE(0x200000, "program", 0) // PowerPC program ROMs
ROM_LOAD32_BYTE("479uaa01.bin", 0x000000, 0x80000, CRC(1bc4893d) SHA1(2c9df38ecb7efa7b686221ee98fa3aad9a63e152))
ROM_LOAD32_BYTE("479uaa02.bin", 0x000001, 0x80000, CRC(ae74a6d0) SHA1(6113c2eea1628b22737c7b87af0e673d94984e88))
ROM_LOAD32_BYTE("479uaa03.bin", 0x000002, 0x80000, CRC(5c0b176f) SHA1(9560259bc081d4cfd72eb485c3fdcecf484ba7a8))
ROM_LOAD32_BYTE("479uaa04.bin", 0x000003, 0x80000, CRC(01a3e4cb) SHA1(819df79909d57fa12481698ffdb32b00586131d8))
- ROM_REGION(0x20000, "audiocpu", 0) /* M68K program */
+ ROM_REGION(0x20000, "audiocpu", 0) // M68K program
ROM_LOAD("479_a05.bin", 0x000000, 0x20000, CRC(251ae299) SHA1(5ffd74357e3c6ddb3a208c39a3b32b53fea90282))
- ROM_REGION(0x100000, "k054539", 0) /* Sound ROMs */
+ ROM_REGION(0x100000, "k054539", 0) // Sound ROMs
ROM_LOAD("479_a06.bin", 0x000000, 0x80000, CRC(8d6ac8a2) SHA1(7c4b8bd47cddc766cbdb6a486acc9221be55b579))
ROM_LOAD("479_a07.bin", 0x080000, 0x80000, CRC(75835df8) SHA1(105b95c16f2ce6902c2e4c9c2fd9f2f7a848c546))
@@ -301,5 +307,8 @@ ROM_START( fiveside )
ROM_LOAD( "fiveside.nv", 0x0000, 0x0080, CRC(aad11072) SHA1(8f777ee47801faa7ce8420c3052034720225aae7) )
ROM_END
+} // Anonymous namespace
+
+
// Undumped: Ultra Hockey
GAME(1995, fiveside, 0, ultrsprt, ultrsprt, ultrsprt_state, empty_init, ROT90, "Konami", "Five a Side Soccer (ver UAA)", 0)
diff --git a/src/mame/drivers/unkhorse.cpp b/src/mame/drivers/unkhorse.cpp
index aab761e1024..b037f617958 100644
--- a/src/mame/drivers/unkhorse.cpp
+++ b/src/mame/drivers/unkhorse.cpp
@@ -1,6 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:hap, Tomasz Slanina
-/***************************************************************************
+/*******************************************************************************
unknown Japanese horse gambling game
probably early 80s, manufacturer unknown
@@ -17,17 +17,21 @@ TODO:
* 6-pos dipswitch on the pcb, only 4 are known at the moment
- confirm colors and sound pitch
-***************************************************************************/
+*******************************************************************************/
#include "emu.h"
+
#include "cpu/i8085/i8085.h"
#include "machine/i8155.h"
#include "sound/spkrdev.h"
+
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
+namespace {
+
class horse_state : public driver_device
{
public:
@@ -48,7 +52,7 @@ private:
required_shared_ptr<uint8_t> m_vram;
std::unique_ptr<uint8_t[]> m_colorram;
- uint8_t m_output;
+ uint8_t m_output = 0;
uint8_t colorram_r(offs_t offset) { return m_colorram[(offset >> 2 & 0x1e0) | (offset & 0x1f)] | 0x0f; }
void colorram_w(offs_t offset, uint8_t data) { m_colorram[(offset >> 2 & 0x1e0) | (offset & 0x1f)] = data & 0xf0; }
@@ -70,11 +74,9 @@ void horse_state::machine_start()
-/***************************************************************************
-
- Video
-
-***************************************************************************/
+/*******************************************************************************
+ Video
+*******************************************************************************/
uint32_t horse_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
@@ -95,11 +97,9 @@ uint32_t horse_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap,
-/***************************************************************************
-
- I/O
-
-***************************************************************************/
+/*******************************************************************************
+ I/O
+*******************************************************************************/
void horse_state::horse_map(address_map &map)
{
@@ -131,11 +131,9 @@ void horse_state::output_w(uint8_t data)
-/***************************************************************************
-
- Inputs
-
-***************************************************************************/
+/*******************************************************************************
+ Input Ports
+*******************************************************************************/
static INPUT_PORTS_START( horse )
PORT_START("IN.0")
@@ -186,11 +184,9 @@ INPUT_PORTS_END
-/***************************************************************************
-
- Machine Config
-
-***************************************************************************/
+/*******************************************************************************
+ Machine Configs
+*******************************************************************************/
void horse_state::horse(machine_config &config)
{
@@ -222,11 +218,9 @@ void horse_state::horse(machine_config &config)
-/***************************************************************************
-
- Game drivers
-
-***************************************************************************/
+/*******************************************************************************
+ ROM Definitions
+*******************************************************************************/
ROM_START( unkhorse )
ROM_REGION( 0x04000, "maincpu", 0 )
@@ -239,5 +233,13 @@ ROM_START( unkhorse )
ROM_LOAD( "h7.bin", 0x3000, 0x0800, CRC(db21fc82) SHA1(38cf58c4d33da3e919d058abb482566c8f70d276) )
ROM_END
+} // anonymous namespace
+
+
+
+/*******************************************************************************
+ Drivers
+*******************************************************************************/
-GAME( 1981?, unkhorse, 0, horse, horse, horse_state, empty_init, ROT270, "<unknown>", "unknown Japanese horse gambling game", MACHINE_SUPPORTS_SAVE ) // copyright not shown, datecodes on pcb suggests early-1981
+// YEAR NAME PARENT MACHINE INPUT CLASS INIT SCREEN COMPANY FULLNAME FLAGS
+GAME( 1981?, unkhorse, 0, horse, horse, horse_state, empty_init, ROT270, "<unknown>", "unknown Japanese horse gambling game", MACHINE_SUPPORTS_SAVE ) // copyright not shown, datecodes on pcb suggests early-1981
diff --git a/src/mame/drivers/v6809.cpp b/src/mame/drivers/v6809.cpp
index 31892911ce1..30dfa1bd523 100644
--- a/src/mame/drivers/v6809.cpp
+++ b/src/mame/drivers/v6809.cpp
@@ -46,6 +46,7 @@ ToDo:
*******************************************************************************************/
#include "emu.h"
+
#include "cpu/m6809/m6809.h"
#include "imagedev/floppy.h"
#include "machine/6821pia.h"
@@ -57,11 +58,14 @@ ToDo:
#include "machine/wd_fdc.h"
#include "sound/spkrdev.h"
#include "video/mc6845.h"
+
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
+namespace {
+
class v6809_state : public driver_device
{
public:
@@ -81,10 +85,11 @@ public:
void v6809(machine_config &config);
-private:
- virtual void machine_reset() override;
+protected:
virtual void machine_start() override;
+ virtual void machine_reset() override;
+private:
DECLARE_WRITE_LINE_MEMBER(speaker_en_w);
DECLARE_WRITE_LINE_MEMBER(speaker_w);
u8 pb_r();
@@ -368,6 +373,9 @@ ROM_START( v6809 )
ROM_RELOAD(0x0800, 0x0800)
ROM_END
+} // anonymous namespace
+
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/vc4000.cpp b/src/mame/drivers/vc4000.cpp
index b3c8427ed8d..bace6ae8ab2 100644
--- a/src/mame/drivers/vc4000.cpp
+++ b/src/mame/drivers/vc4000.cpp
@@ -410,7 +410,7 @@ QUICKLOAD_LOAD_MEMBER(vc4000_state::quickload_cb)
read_ = image.fread( &quick_data[0], quick_length);
if (read_ != quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Cannot read the file");
+ image.seterror(image_error::INVALIDIMAGE, "Cannot read the file");
image.message(" Cannot read the file");
}
else
@@ -419,7 +419,7 @@ QUICKLOAD_LOAD_MEMBER(vc4000_state::quickload_cb)
{
if (quick_data[0] != 2)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid header");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid header");
image.message(" Invalid header");
}
else
@@ -429,13 +429,13 @@ QUICKLOAD_LOAD_MEMBER(vc4000_state::quickload_cb)
if (quick_length < 0x5)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ image.seterror(image_error::INVALIDIMAGE, "File too short");
image.message(" File too short");
}
else
if ((quick_length + quick_addr - 5) > 0x1600)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too long");
+ image.seterror(image_error::INVALIDIMAGE, "File too long");
image.message(" File too long");
}
else
@@ -460,7 +460,7 @@ QUICKLOAD_LOAD_MEMBER(vc4000_state::quickload_cb)
{
if (quick_data[0] != 0)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid header");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid header");
image.message(" Invalid header");
}
else
@@ -469,19 +469,19 @@ QUICKLOAD_LOAD_MEMBER(vc4000_state::quickload_cb)
if (exec_addr >= quick_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Exec address beyond end of file");
+ image.seterror(image_error::INVALIDIMAGE, "Exec address beyond end of file");
image.message(" Exec address beyond end of file");
}
else
if (quick_length < 0x904)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ image.seterror(image_error::INVALIDIMAGE, "File too short");
image.message(" File too short");
}
else
if (quick_length > 0x2000)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too long");
+ image.seterror(image_error::INVALIDIMAGE, "File too long");
image.message(" File too long");
}
else
diff --git a/src/mame/drivers/vicdual.cpp b/src/mame/drivers/vicdual.cpp
index 6d70518df4a..c3a9bd468e6 100644
--- a/src/mame/drivers/vicdual.cpp
+++ b/src/mame/drivers/vicdual.cpp
@@ -3663,7 +3663,7 @@ ROM_START( carnival )
ROM_LOAD( "epr-666.u1", 0x3c00, 0x0400, CRC(4eec7fae) SHA1(cdc858165136c55b01511805c9d4dc6bc598fe1f) )
ROM_REGION( 0x0020, "proms", 0 )
- ROM_LOAD( "316-633", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) )
+ ROM_LOAD( "316-0633.u49", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) )
ROM_REGION( 0x0400, "audiocpu", 0 ) /* sound ROM */
ROM_LOAD( "epr-412.u5", 0x0000, 0x0400, CRC(0dbaa2b0) SHA1(eae7fc362a0ff8f908c42e093c7dbb603659373c) )
@@ -3692,7 +3692,7 @@ ROM_START( carnivalb )
ROM_LOAD( "epr-666.u1", 0x3c00, 0x0400, CRC(4eec7fae) SHA1(cdc858165136c55b01511805c9d4dc6bc598fe1f) )
ROM_REGION( 0x0020, "proms", 0 )
- ROM_LOAD( "316-633", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) )
+ ROM_LOAD( "316-0633.u49", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) )
ROM_REGION( 0x0400, "audiocpu", 0 ) /* sound ROM */
ROM_LOAD( "carnival_b.u5", 0x0000, 0x0400, CRC(422abb43) SHA1(edb6f74ccf9382624353e927ac225e1455bb1144) )
@@ -3721,7 +3721,7 @@ ROM_START( carnivalc )
ROM_LOAD( "epr-516.u1", 0x3c00, 0x0400, CRC(7c32b352) SHA1(8cb472a7f71a301417c6a8e4a26a9bdcd43b6062) )
ROM_REGION( 0x0020, "proms", 0 )
- ROM_LOAD( "316-633", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) )
+ ROM_LOAD( "316-0633.u49", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) )
ROM_REGION( 0x0400, "audiocpu", 0 ) /* sound ROM */
ROM_LOAD( "epr-412.u5", 0x0000, 0x0400, CRC(0dbaa2b0) SHA1(eae7fc362a0ff8f908c42e093c7dbb603659373c) )
@@ -3730,6 +3730,35 @@ ROM_START( carnivalc )
ROM_LOAD( "316-0206.u14", 0x0000, 0x0020, CRC(9617d796) SHA1(7cff2741866095ff42eadd8022bea349ec8d2f39) ) /* control PROM */
ROM_END
+ROM_START( carnivalca ) // S-97095-P + 97093-P-B
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "epr-479.u33", 0x0000, 0x0400, CRC(620bff59) SHA1(87d3b4991cacb0a8cd7eeef652eb3f1c1eaadb17) )
+ ROM_LOAD( "epr-480.u32", 0x0400, 0x0400, CRC(90768717) SHA1(a34e6c28d486614b0a084a088d75feb8ecb6ef15) )
+ ROM_LOAD( "epr-481.u31", 0x0800, 0x0400, CRC(5c903af9) SHA1(5f11c6c800cfb012ba592b890d9849cc03192aaa) )
+ ROM_LOAD( "epr-482.u30", 0x0c00, 0x0400, CRC(fb2398a1) SHA1(abab2cd43054b719b0bee0f7452908df062e34bc) )
+ ROM_LOAD( "epr-483.u29", 0x1000, 0x0400, CRC(306f50d2) SHA1(93faa3e2a8e49f3afb591a2fe7bb401278a354e2) )
+ ROM_LOAD( "epr-484.u28", 0x1400, 0x0400, CRC(e80a6ebc) SHA1(5ef94a2ee7040b56951ef68ee4198f64af1449b0) )
+ ROM_LOAD( "epr-485.u27", 0x1800, 0x0400, CRC(993e2885) SHA1(82a04258d5c25bddb6556a73f0e85a9af9d510d2) )
+ ROM_LOAD( "epr-486.u26", 0x1c00, 0x0400, CRC(e6b7eb05) SHA1(1b998cdf39d38437b5d32958dbde80b29c1b2736) )
+ ROM_LOAD( "epr-487.u8", 0x2000, 0x0400, CRC(41abf6f8) SHA1(1a02c268368ea761113c831d4a6dfc0a1853ebc7) )
+ ROM_LOAD( "epr-488.u7", 0x2400, 0x0400, CRC(b0288f2a) SHA1(c02311f4f640a17b68cc10ca01ab3e919a9355b0) )
+ ROM_LOAD( "epr-489.u6", 0x2800, 0x0400, CRC(c9c529ab) SHA1(98bb99afc1e23dff13ab73c051beec44750eb1b3) )
+ ROM_LOAD( "epr-490.u5", 0x2c00, 0x0400, CRC(9d4ffe25) SHA1(b0dec556f16d505190b8703c367ecb4d07147156) )
+ ROM_LOAD( "epr-491.u4", 0x3000, 0x0400, CRC(5d086aec) SHA1(d7b9125b0f9dd71d5ffcac321ec2c0f3f7953031) )
+ ROM_LOAD( "epr-492.u3", 0x3400, 0x0400, CRC(0e20e4a5) SHA1(82c8ad21a72c8dff81eb4bb97e64faff33a8b46f) )
+ ROM_LOAD( "epr-493.u2", 0x3800, 0x0400, CRC(b4a7c5c9) SHA1(832597a2b586bffebaf2d67be8dff316d8120974) )
+ ROM_LOAD( "epr-494.u1", 0x3c00, 0x0400, NO_DUMP ) // missing on PCB, but listed on the ROM sheet it came with
+
+ ROM_REGION( 0x0020, "proms", 0 )
+ ROM_LOAD( "pr-62.u49", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) )
+
+ ROM_REGION( 0x0400, "audiocpu", 0 )
+ ROM_LOAD( "epr-412.u5", 0x0000, 0x0400, BAD_DUMP CRC(0dbaa2b0) SHA1(eae7fc362a0ff8f908c42e093c7dbb603659373c) ) // not dumped for this set (sound PCB wasn't available), so taken from carnivalc
+
+ ROM_REGION( 0x0020, "user1", 0 )
+ ROM_LOAD( "bin.u14", 0x0000, 0x0020, CRC(e60a7960) SHA1(b8b8716e859c57c35310efc4594262afedb84823) ) // control PROM, possibly pr-34 but unreadable
+ROM_END
+
ROM_START( carnivalh )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "epr-155.u48", 0x0000, 0x0800, CRC(0a5f1f65) SHA1(7830157ad378f92a8069debf78d50b9deafb4d40) )
@@ -3742,7 +3771,7 @@ ROM_START( carnivalh )
ROM_LOAD( "epr-162.u41", 0x3800, 0x0800, CRC(56e1c120) SHA1(24816b6a9bc238571ab8ea79bb876cf249ed4d60) )
ROM_REGION( 0x0020, "proms", 0 )
- ROM_LOAD( "pr-62.u44", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) ) /* Same as 316-633 */
+ ROM_LOAD( "pr-62.u44", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) ) /* Same as 316-0633 */
ROM_REGION( 0x0400, "audiocpu", 0 ) /* sound ROM */
ROM_LOAD( "epr-412.u5", 0x0000, 0x0400, CRC(0dbaa2b0) SHA1(eae7fc362a0ff8f908c42e093c7dbb603659373c) )
@@ -3764,7 +3793,7 @@ ROM_START( carnivalha )
ROM_LOAD( "epr-162.u41", 0x3800, 0x0800, CRC(56e1c120) SHA1(24816b6a9bc238571ab8ea79bb876cf249ed4d60) )
ROM_REGION( 0x0020, "proms", 0 )
- ROM_LOAD( "pr-62.u44", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) ) /* Same as 316-633 */
+ ROM_LOAD( "pr-62.u44", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) ) /* Same as 316-0633 */
ROM_REGION( 0x0400, "audiocpu", 0 ) /* sound ROM */
ROM_LOAD( "epr-412.u5", 0x0000, 0x0400, CRC(0dbaa2b0) SHA1(eae7fc362a0ff8f908c42e093c7dbb603659373c) )
@@ -3794,7 +3823,7 @@ ROM_START( verbena )
ROM_LOAD( "1v.u1", 0x3c00, 0x0400, CRC(6e10c057) SHA1(743a28bb6f4f395fd3db36d5e40acc3475f55f5d) ) // handwritten label
ROM_REGION( 0x0020, "proms", 0 )
- ROM_LOAD( "mmi6331.u4", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) ) // == 316-633 / pr-62.u44
+ ROM_LOAD( "mmi6331.u4", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) ) // == 316-0633 / pr-62.u44
ROM_REGION( 0x0400, "audiocpu", 0 ) /* sound ROM */
ROM_LOAD( "sound.u25", 0x0000, 0x0400, CRC(0dbaa2b0) SHA1(eae7fc362a0ff8f908c42e093c7dbb603659373c) ) // == epr-412.u5 - 2708
@@ -4115,6 +4144,33 @@ ROM_START( alphaho )
ROM_LOAD( "alphaho.col", 0x0000, 0x0020, BAD_DUMP CRC(67104ea9) SHA1(26b6bd2a1973b83bb9af4e3385d8cb14cb3f62f2) ) // wasn't dumped for this set, use the one from sspacaho (the game Data East cloned and modified) for now
ROM_END
+ROM_START( alphahob ) // PCB marked NNS
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "03.bin", 0x0000, 0x0400, CRC(87de1bb0) SHA1(63626ac2b1f1419fd93dca33417834922ffc8634) )
+ ROM_LOAD( "13.bin", 0x0400, 0x0400, CRC(bd6dbd8e) SHA1(a001392b32be8218d5aebb1c02fc88a41ce995b0) )
+ ROM_LOAD( "16.bin", 0x0800, 0x0400, CRC(4c043d8b) SHA1(72f7db24fc60dae9879d8daf01ef2bb14e9597aa) )
+ ROM_LOAD( "04.bin", 0x0c00, 0x0400, CRC(10005956) SHA1(2e742b1764520c3de5b44018f94dc6476c9a4e84) )
+ ROM_LOAD( "05.bin", 0x1000, 0x0400, CRC(bbdaf42a) SHA1(57e5e72613c0852bc91e12a5713d93c222ed5b32) )
+ ROM_LOAD( "06.bin", 0x1400, 0x0400, CRC(07d4c69a) SHA1(7bb7dad200526a642debe3406ef9c0a74f6fc374) )
+ ROM_LOAD( "07.bin", 0x1800, 0x0400, CRC(8f766b30) SHA1(91e4c8ccb479dcd89f1c76f619bfac832ca7910e) )
+ ROM_LOAD( "08.bin", 0x1c00, 0x0400, CRC(88032202) SHA1(64e087c0a9a97f19c1c5ba5ca1d249d38efab391) )
+ ROM_LOAD( "01.bin", 0x2000, 0x0400, CRC(eb8278b3) SHA1(6349c64f718fc23f78788a612378681d9e6ef69b) )
+ ROM_LOAD( "09.bin", 0x2400, 0x0400, CRC(e5f622f7) SHA1(57858b6abbf34fc4ab2b19a469cbd945a0e14a0e) )
+ ROM_LOAD( "11.bin", 0x2800, 0x0400, CRC(5673be86) SHA1(d8f6bcc0231163c40c217e73dff9dd410fcd488c) )
+ ROM_LOAD( "12.bin", 0x2c00, 0x0400, CRC(939903c6) SHA1(2a570b9880bb8594501fa9b3d1320e5ad2abc86a) )
+ ROM_LOAD( "02.bin", 0x3000, 0x0400, CRC(404f120c) SHA1(7359c819f8a355783c00a972cb65a10aeff6bde4) )
+ ROM_LOAD( "14.bin", 0x3400, 0x0400, CRC(be76baac) SHA1(4b6a46c9484cfc90fa405f8568df44cfc96b1d7a) )
+ ROM_LOAD( "15.bin", 0x3800, 0x0400, CRC(ced0a642) SHA1(7f90803af926861261c9467fda293093409aff83) )
+ ROM_LOAD( "10.bin", 0x3c00, 0x0400, CRC(ba978bca) SHA1(69ee157d1aee8cf323d15630b99cff2747ed0189) )
+
+ ROM_REGION( 0x0020, "proms", 0 )
+ ROM_LOAD( "prom.u49", 0x0000, 0x0020, CRC(67104ea9) SHA1(26b6bd2a1973b83bb9af4e3385d8cb14cb3f62f2) )
+
+ ROM_REGION( 0x0040, "timing_proms", 0 )
+ ROM_LOAD( "prom.u14", 0x0000, 0x0020, CRC(e60a7960) SHA1(b8b8716e859c57c35310efc4594262afedb84823) ) // control PROM
+ ROM_LOAD( "prom.u15", 0x0020, 0x0020, CRC(a1506b9d) SHA1(037c3db2ea40eca459e8acba9d1506dd28d72d10) ) // sequence PROM
+ROM_END
+
// Wanted uses 2 sound boards. One from Head On and one from Space Attack. The sound board has the name printed on the bottom
// together with the Sega Gremlin logo and other numbers.
@@ -4188,6 +4244,7 @@ GAME( 1980, spacetrkc, spacetrk, spacetrk, spacetrkc, vicdual_state, empty_i
GAME( 1980, carnival, 0, carnival, carnival, carnival_state, empty_init, ROT270, "Sega", "Carnival (upright, AY8912 music)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1980, carnivalb, carnival, carnivalb, carnival, carnival_state, empty_init, ROT270, "Sega", "Carnival (upright, PIT8253 music)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1980, carnivalc, carnival, carnival, carnivalc, carnival_state, empty_init, ROT270, "Sega", "Carnival (cocktail)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1980, carnivalca, carnival, carnival, carnivalc, carnival_state, empty_init, ROT270, "Sega", "Carnival (cocktail, earlier)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // one missing ROM
GAME( 1980, carnivalh, carnival, carnivalh, carnivalh, carnivalh_state, empty_init, ROT270, "Sega", "Carnival (Head On hardware, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1980, carnivalha, carnival, carnivalh, carnivalh, carnivalh_state, empty_init, ROT270, "Sega", "Carnival (Head On hardware, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1980, verbena, carnival, carnival, carnival, carnival_state, empty_init, ROT270, "bootleg (Cocamatic)", "Verbena (bootleg of Carnival)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
@@ -4201,4 +4258,5 @@ GAME( 1980, digger, 0, digger, digger, vicdual_state, empty_i
GAME( 1981, pulsar, 0, pulsar, pulsar, vicdual_state, empty_init, ROT270, "Sega", "Pulsar", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1979, heiankyo, 0, heiankyo, heiankyo, vicdual_state, empty_init, ROT270, "Denki Onkyo", "Heiankyo Alien", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 19??, alphaho, 0, alphaho, alphaho, vicdual_state, empty_init, ROT270, "Data East Corporation", "Alpha Fighter / Head On", MACHINE_WRONG_COLORS | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 19??, alphahob, alphaho, alphaho, alphaho, vicdual_state, empty_init, ROT270, "bootleg", "Missile / Circuit (bootleg of Alpha Fighter / Head On)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1982, wantsega, 0, carhntds, wantsega, vicdual_state, empty_init, ROT270, "Sega", "Wanted (Sega)", MACHINE_NO_SOUND | MACHINE_IMPERFECT_CONTROLS | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/videopkr.cpp b/src/mame/drivers/videopkr.cpp
index 7cbd4fa2b97..caff149c74c 100644
--- a/src/mame/drivers/videopkr.cpp
+++ b/src/mame/drivers/videopkr.cpp
@@ -315,7 +315,6 @@ public:
, m_maincpu(*this, "maincpu")
, m_soundcpu(*this, "soundcpu")
, m_gfxdecode(*this, "gfxdecode")
- , m_aysnd(*this, "aysnd")
, m_digits(*this, "digit%u", 0U)
, m_lamps(*this, "lamp%u", 0U)
{ }
@@ -323,15 +322,13 @@ public:
void videopkr(machine_config &config);
void blckjack(machine_config &config);
void videodad(machine_config &config);
- void babypkr(machine_config &config);
void fortune1(machine_config &config);
- void bpoker(machine_config &config);
protected:
virtual void machine_start() override;
virtual void video_start() override;
-private:
+//private:
uint8_t videopkr_io_r(offs_t offset);
void videopkr_io_w(offs_t offset, uint8_t data);
uint8_t videopkr_p1_data_r();
@@ -344,14 +341,9 @@ private:
void sound_io_w(uint8_t data);
uint8_t sound_p2_r();
void sound_p2_w(uint8_t data);
- uint8_t baby_sound_p0_r();
- void baby_sound_p0_w(uint8_t data);
- uint8_t baby_sound_p1_r();
- void baby_sound_p3_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
void videopkr_palette(palette_device &palette) const;
DECLARE_VIDEO_START(vidadcba);
- void babypkr_palette(palette_device &palette) const;
void fortune1_palette(palette_device &palette) const;
uint32_t screen_update_videopkr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(sound_t1_callback);
@@ -361,10 +353,6 @@ private:
void i8039_map(address_map &map);
void i8039_sound_mem(address_map &map);
void i8039_sound_port(address_map &map);
- void i8051_sound_mem(address_map &map);
- void i8051_sound_port(address_map &map);
- void i8751_io_port(address_map &map);
- void i8751_map(address_map &map);
memory_share_creator<uint8_t> m_data_ram;
memory_share_creator<uint8_t> m_video_ram;
@@ -395,17 +383,50 @@ private:
unsigned long m_count2;
unsigned long m_count3;
unsigned long m_count4;
- uint8_t m_sbp0;
tilemap_t *m_bg_tilemap;
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_soundcpu;
required_device<gfxdecode_device> m_gfxdecode;
- optional_device<ay8910_device> m_aysnd;
output_finder<28> m_digits;
output_finder<14> m_lamps;
};
+class babypkr_state : public videopkr_state
+{
+public:
+ babypkr_state(const machine_config &mconfig, device_type type, const char *tag)
+ : videopkr_state(mconfig, type, tag)
+ , m_aysnd(*this, "aysnd")
+ , m_top_lamps(*this, "TOP_%u", 1U)
+ {
+ }
+
+ void babypkr(machine_config &config);
+ void bpoker(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ uint8_t baby_sound_p0_r();
+ void baby_sound_p0_w(uint8_t data);
+ uint8_t baby_sound_p1_r();
+ void baby_sound_p3_w(uint8_t data);
+ void babypkr_palette(palette_device &palette) const;
+
+ void i8751_map(address_map &map);
+ void i8751_io_port(address_map &map);
+ void i8051_sound_mem(address_map &map);
+ void i8051_sound_port(address_map &map);
+
+ required_device<ay8910_device> m_aysnd;
+ output_finder<3> m_top_lamps;
+
+ uint8_t m_sbp0;
+};
+
+
#define DATA_NVRAM_SIZE 0x100
/*************************
@@ -468,7 +489,7 @@ void videopkr_state::videopkr_palette(palette_device &palette) const
}
}
-void videopkr_state::babypkr_palette(palette_device &palette) const
+void babypkr_state::babypkr_palette(palette_device &palette) const
{
uint8_t const *const color_prom = memregion("proms")->base();
for (int j = 0; j < palette.entries(); j++)
@@ -875,17 +896,17 @@ void videopkr_state::sound_p2_w(uint8_t data)
/* Baby Sound Handlers */
-uint8_t videopkr_state::baby_sound_p0_r()
+uint8_t babypkr_state::baby_sound_p0_r()
{
return m_sbp0;
}
-void videopkr_state::baby_sound_p0_w(uint8_t data)
+void babypkr_state::baby_sound_p0_w(uint8_t data)
{
m_sbp0 = data;
}
-uint8_t videopkr_state::baby_sound_p1_r()
+uint8_t babypkr_state::baby_sound_p1_r()
{
m_c_io = (m_p1 >> 5) & 1;
m_hp_1 = (~m_p24_data >> 6) & 1;
@@ -895,14 +916,11 @@ uint8_t videopkr_state::baby_sound_p1_r()
return m_c_io | (m_hp_1 << 1) | (m_hp_2 << 2) | (m_bell << 3) | (m_aux3 << 4) | 0xe0;
}
-void videopkr_state::baby_sound_p3_w(uint8_t data)
+void babypkr_state::baby_sound_p3_w(uint8_t data)
{
- uint8_t lmp_ports, ay_intf;
- lmp_ports = data >> 1 & 0x07;
-
- output().set_value("TOP_1", (lmp_ports >> 0) & 1);
- output().set_value("TOP_2", (lmp_ports >> 1) & 1);
- output().set_value("TOP_3", (lmp_ports >> 2) & 1);
+ m_top_lamps[0] = BIT(data, 1);
+ m_top_lamps[1] = BIT(data, 2);
+ m_top_lamps[2] = BIT(data, 3);
if (!(data & 0x10))
{
@@ -910,8 +928,7 @@ void videopkr_state::baby_sound_p3_w(uint8_t data)
logerror("AY3-8910: Reset\n");
}
- ay_intf = (data >> 5) & 0x07;
-
+ uint8_t ay_intf = (data >> 5) & 0x07;
switch (ay_intf)
{
case 0x00: break;
@@ -953,12 +970,12 @@ void videopkr_state::i8039_io_port(address_map &map)
map(0x00, 0xff).rw(FUNC(videopkr_state::videopkr_io_r), FUNC(videopkr_state::videopkr_io_w));
}
-void videopkr_state::i8751_map(address_map &map)
+void babypkr_state::i8751_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
}
-void videopkr_state::i8751_io_port(address_map &map)
+void babypkr_state::i8751_io_port(address_map &map)
{
map(0x0000, 0x0fff).ram(); // NVRAM?
map(0x8000, 0x8000).noprw(); // ???
@@ -979,12 +996,12 @@ void videopkr_state::i8039_sound_port(address_map &map)
}
-void videopkr_state::i8051_sound_mem(address_map &map)
+void babypkr_state::i8051_sound_mem(address_map &map)
{
map(0x0000, 0x0fff).rom();
}
-void videopkr_state::i8051_sound_port(address_map &map)
+void babypkr_state::i8051_sound_port(address_map &map)
{
map(0x0000, 0x1ff).ram();
}
@@ -1212,6 +1229,7 @@ void videopkr_state::machine_start()
{
m_digits.resolve();
m_lamps.resolve();
+
m_vp_sound_p2 = 0xff; /* default P2 latch value */
m_sound_latch = 0xff; /* default sound data latch value */
m_p24_data = 0xff;
@@ -1227,6 +1245,13 @@ void videopkr_state::machine_start()
subdevice<nvram_device>("nvram")->set_base(m_data_ram, sizeof(m_data_ram));
}
+void babypkr_state::machine_start()
+{
+ videopkr_state::machine_start();
+
+ m_top_lamps.resolve();
+}
+
/************************
* Machine Drivers *
************************/
@@ -1303,8 +1328,19 @@ void videopkr_state::videodad(machine_config &config)
MCFG_VIDEO_START_OVERRIDE(videopkr_state,vidadcba)
}
+void videopkr_state::fortune1(machine_config &config)
+{
+ videopkr(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(CPU_CLOCK_ALT);
+
+ /* video hardware */
+ subdevice<palette_device>("palette")->set_init(FUNC(videopkr_state::fortune1_palette));
+}
+
-void videopkr_state::babypkr(machine_config &config)
+void babypkr_state::babypkr(machine_config &config)
{
videopkr(config);
@@ -1313,43 +1349,34 @@ void videopkr_state::babypkr(machine_config &config)
/* most likely romless or eprom */
i8031_device &soundcpu(I8031(config.replace(), m_soundcpu, CPU_CLOCK));
- soundcpu.set_addrmap(AS_PROGRAM, &videopkr_state::i8051_sound_mem);
- soundcpu.set_addrmap(AS_IO, &videopkr_state::i8051_sound_port);
- soundcpu.port_in_cb<0>().set(FUNC(videopkr_state::baby_sound_p0_r));
- soundcpu.port_out_cb<0>().set(FUNC(videopkr_state::baby_sound_p0_w));
- soundcpu.port_in_cb<1>().set(FUNC(videopkr_state::baby_sound_p1_r));
+ soundcpu.set_addrmap(AS_PROGRAM, &babypkr_state::i8051_sound_mem);
+ soundcpu.set_addrmap(AS_IO, &babypkr_state::i8051_sound_port);
+ soundcpu.port_in_cb<0>().set(FUNC(babypkr_state::baby_sound_p0_r));
+ soundcpu.port_out_cb<0>().set(FUNC(babypkr_state::baby_sound_p0_w));
+ soundcpu.port_in_cb<1>().set(FUNC(babypkr_state::baby_sound_p1_r));
soundcpu.port_out_cb<2>().set("dac", FUNC(dac_byte_interface::data_w));
- soundcpu.port_out_cb<3>().set(FUNC(videopkr_state::baby_sound_p3_w));
+ soundcpu.port_out_cb<3>().set(FUNC(babypkr_state::baby_sound_p3_w));
/* video hardware */
screen_device &screen(*subdevice<screen_device>("screen"));
screen.set_size(32*16, 32*8);
screen.set_visarea(5*16, 31*16-1, 3*8, 29*8-1);
- subdevice<palette_device>("palette")->set_init(FUNC(videopkr_state::babypkr_palette));
+ subdevice<palette_device>("palette")->set_init(FUNC(babypkr_state::babypkr_palette));
m_gfxdecode->set_info(gfx_videodad);
- MCFG_VIDEO_START_OVERRIDE(videopkr_state,vidadcba)
-
- AY8910(config, m_aysnd, CPU_CLOCK / 6).add_route(ALL_OUTPUTS, "speaker", 0.3); /* no ports used */
-}
-
-void videopkr_state::fortune1(machine_config &config)
-{
- videopkr(config);
+ MCFG_VIDEO_START_OVERRIDE(babypkr_state,vidadcba)
- /* basic machine hardware */
- m_maincpu->set_clock(CPU_CLOCK_ALT);
-
- subdevice<palette_device>("palette")->set_init(FUNC(videopkr_state::fortune1_palette));
+ AY8910(config, m_aysnd, CPU_CLOCK / 6); // no ports used
+ m_aysnd->add_route(ALL_OUTPUTS, "speaker", 0.3);
}
-void videopkr_state::bpoker(machine_config &config)
+void babypkr_state::bpoker(machine_config &config)
{
babypkr(config);
i8751_device &maincpu(I8751(config.replace(), m_maincpu, XTAL(6'000'000)));
- maincpu.set_addrmap(AS_PROGRAM, &videopkr_state::i8751_map);
- maincpu.set_addrmap(AS_IO, &videopkr_state::i8751_io_port);
+ maincpu.set_addrmap(AS_PROGRAM, &babypkr_state::i8751_map);
+ maincpu.set_addrmap(AS_IO, &babypkr_state::i8751_io_port);
maincpu.port_in_cb<0>().set_constant(0); // ???
maincpu.port_in_cb<1>().set_constant(0); // ???
maincpu.port_out_cb<1>().set_nop(); // ???
@@ -1590,6 +1617,6 @@ GAMEL( 1984, fortune1, videopkr, fortune1, videopkr, videopkr_state, empty_init,
GAMEL( 1984, blckjack, videopkr, blckjack, blckjack, videopkr_state, empty_init, ROT0, "InterFlip", "Black Jack", 0, layout_blckjack )
GAMEL( 1987, videodad, videopkr, videodad, videodad, videopkr_state, empty_init, ROT0, "InterFlip", "Video Dado", 0, layout_videodad )
GAMEL( 1987, videocba, videopkr, videodad, videocba, videopkr_state, empty_init, ROT0, "InterFlip", "Video Cordoba", 0, layout_videocba )
-GAMEL( 1987, babypkr, videopkr, babypkr, babypkr, videopkr_state, empty_init, ROT0, "Recreativos Franco", "Baby Poker", 0, layout_babypkr )
-GAMEL( 1987, babydad, videopkr, babypkr, babydad, videopkr_state, empty_init, ROT0, "Recreativos Franco", "Baby Dado", 0, layout_babydad )
-GAMEL( 198?, bpoker, videopkr, bpoker, babypkr, videopkr_state, empty_init, ROT0, "Recreativos Franco", "Video Poker (v1403)", MACHINE_NOT_WORKING, layout_babypkr )
+GAMEL( 1987, babypkr, videopkr, babypkr, babypkr, babypkr_state, empty_init, ROT0, "Recreativos Franco", "Baby Poker", 0, layout_babypkr )
+GAMEL( 1987, babydad, videopkr, babypkr, babydad, babypkr_state, empty_init, ROT0, "Recreativos Franco", "Baby Dado", 0, layout_babydad )
+GAMEL( 198?, bpoker, videopkr, bpoker, babypkr, babypkr_state, empty_init, ROT0, "Recreativos Franco", "Video Poker (v1403)", MACHINE_NOT_WORKING, layout_babypkr )
diff --git a/src/mame/drivers/vigilant.cpp b/src/mame/drivers/vigilant.cpp
index 6c543ba3789..4158ddfa479 100644
--- a/src/mame/drivers/vigilant.cpp
+++ b/src/mame/drivers/vigilant.cpp
@@ -161,9 +161,9 @@ static INPUT_PORTS_START( vigilant )
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_START("IN2")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
@@ -171,9 +171,9 @@ static INPUT_PORTS_START( vigilant )
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_COCKTAIL
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_COIN2 )
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
PORT_START("DSW1")
PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2")
@@ -521,12 +521,12 @@ void vigilant_state::vigilant(machine_config &config)
ym2151_device &ymsnd(YM2151(config, "ymsnd", 3.579545_MHz_XTAL));
ymsnd.irq_handler().set("soundirq", FUNC(rst_neg_buffer_device::rst28_w));
- ymsnd.add_route(0, "lspeaker", 0.55);
- ymsnd.add_route(1, "rspeaker", 0.55);
+ ymsnd.add_route(0, "lspeaker", 0.28);
+ ymsnd.add_route(1, "rspeaker", 0.28);
dac_8bit_r2r_device &dac(DAC_8BIT_R2R(config, "dac", 0)); // unknown DAC
- dac.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
- dac.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+ dac.add_route(ALL_OUTPUTS, "lspeaker", 0.5);
+ dac.add_route(ALL_OUTPUTS, "rspeaker", 0.5);
}
void vigilant_state::buccanrs(machine_config &config)
@@ -637,12 +637,12 @@ void vigilant_state::kikcubic(machine_config &config)
ym2151_device &ymsnd(YM2151(config, "ymsnd", 3.579545_MHz_XTAL));
ymsnd.irq_handler().set("soundirq", FUNC(rst_neg_buffer_device::rst28_w));
- ymsnd.add_route(0, "lspeaker", 0.55);
- ymsnd.add_route(1, "rspeaker", 0.55);
+ ymsnd.add_route(0, "lspeaker", 0.28);
+ ymsnd.add_route(1, "rspeaker", 0.28);
dac_8bit_r2r_device &dac(DAC_8BIT_R2R(config, "dac", 0)); // unknown DAC
- dac.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
- dac.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+ dac.add_route(ALL_OUTPUTS, "lspeaker", 0.5);
+ dac.add_route(ALL_OUTPUTS, "rspeaker", 0.5);
}
diff --git a/src/mame/drivers/viper.cpp b/src/mame/drivers/viper.cpp
index 343bb83e675..861e94c0db6 100644
--- a/src/mame/drivers/viper.cpp
+++ b/src/mame/drivers/viper.cpp
@@ -16,7 +16,7 @@
IRQ0: ??? (Task 4)
IRQ1: unused
IRQ2: ??? Possibly UART? Accesses registers at 0xffe00008...f
- IRQ3: ??? (Task 5, sound?)
+ IRQ3: Sound (Task 5)
IRQ4: Voodoo3 Currently only for User Interrupt Command, maybe a more extensive handler gets installed later?
I2C: ??? (no task switch) what drives this? network? U13 (ADC838) test fails if I2C doesn't work
@@ -37,6 +37,13 @@
0x08: unknown mem pointer, task stack pointer?
0x0c: pointer to task PC (also top of stack?)
+ Sound:
+ 0x00001320: A flag that's used when sound effects(?) are being played
+ 0x00001324: Pointer to the data cache buffer to be used for loading and mixing BGM/SE.
+ Each buffer is 0x800 bytes in size and the game will switch between the two every IRQ3(?).
+ The original audio typically seems to be ADPCM which is then decoded and mixed in software.
+ 0x00001330: L/R channel PCM data when a sound effect is played? Seems to be the last result when mixing down buffers.
+
0x00000310: Global timer 0 IRQ handler
0x00000320: Global timer 1 IRQ handler
@@ -75,27 +82,45 @@
TODO:
- needs a proper way to dump security dongles, anything but p9112 has placeholder ROM for ds2430.
+ - figure out why games randomly crash (IRQ related?)
+
+ Other notes:
+ - "Distribution error" means there's a region mismatch.
+ - Games that hang randomly seem to hang on IRQ16 possibly? You can see "IRQ16 taken" but it hangs before you see "IRQ16 cleared".
+ - Hold TEST while booting (from the very start) to initialize the RTC for most games.
+ - It seems that p911 has 3 unique regional images: U/E, K/A, and J. If you try booting, for example, U region on a K/A image, it won't find some files and will error out with "distribution error".
Game status:
- ppp2nd Boots in-game, no sound or DVD support, crashes when going into song selection screen
- boxingm Goes to attract mode when ran with memory card check. Coins up.
- code1d,b RTC self check bad
- gticlub2,ea Attract mode works. Coins up. Hangs in car selection.
- jpark3 POST?: Shows "Now loading..." then black screen (sets global timer 1 on EPIC) - with IRQ3 crashes at first 3d frame
- mocapglf Sensor I/O error
- mocapb,j Crash after self checks
- p911 "Distribution error"
- p911e,j,uc,kc Hangs at POST, with IRQ3 it crashes at first 3d frame
- p9112 RTC self check bad
+ boxingm Goes in-game. Controllers are not emulated. Various graphical glitches.
+ jpark3 Goes in-game. Controllers are not emulated. Various graphical glitches.
+ mocapb,j Goes in-game. Controllers are not emulated. Various graphical glitches. Random crashes.
+ ppp2nd,a Fully playable with graphical glitches. No network or DVD support. Crashes when returning to game mode from test menu.
+ p911(all) Goes in-game. Controllers are not emulated. Various graphical glitches.
+ tsurugi,j Goes in-game. Controllers are not emulated. Various graphical glitches.
+
+ gticlub2,ea Attract mode works. Coins up. Hangs in various places. Will crash with "network error" after stage is selected.
+ thrild2,a Attract mode with partial graphics. Coins up. Hangs in various places.
+
+ sscopefh Graphics heavily glitched. Gun controller is not emulated. Sensor error and hopper error stop it from working.
+
+ mfightc,c Requires touch panel emulation. Gets stuck at "Waiting for central monitor, checking serial...".
+ xtrial Hangs at "Please set the time for the bookkeeping" message.
+
+ p9112 RTC self check bad.
+ The game checks the checksum of 0x157d4d0-0x157d4ee against the checksum that should be at 0x157d4ee-0x157d4ef,
+ but this part of memory is never written to after its initial clearing on boot.
+ If 0xffff is placed at 0x157d4ee then the game will pass the RTC check.
+ The game will later complain about "Hardware Error: Security Key Error" if you try starting the game.
+ code1d,b Can boot but crashes randomly and quickly so it's hard to do anything.
+
+ mocapglf Security code error
sscopex/sogeki Security code error
- sscopefh Needs gun inputs.
- thrild2,a Attract mode with partial graphics. Coins up. Hangs in car selection screen.
- thrild2c Inf loop on blue screen
- tsurugi Goes to attract mode when ran with memory card check. Coins up.
- tsurugij No NVRAM
- wcombat Stuck on network check
- xtrial Attract mode. Hangs.
- mfightc,c Passes POST. Waits for network connection from main unit? Spams writes to 0xffe08000 (8-bit)
+
+ wcombat Can boot into a test menu by using a combination of dipswitches, but it says "serial check bad". Can't boot normally.
+ wcombatu Bootable when dipsw 4 is set to on. Controls not implemented so it's not possible to pass nickname selection screen. Freezes when test button is pressed.
+ thrild2c,ac Inf loop on blue screen
+
+
===========================================================================================================================
@@ -286,6 +311,16 @@ Player 2 gun connects to the same pin numbers on the solder side.
Jurassic Park III also uses 2 additional buttons for escaping left and right. These are wired to buttons on the Jamma
connector.
+Additionally on the 28-WAY connector is...
+Pin 7 parts side - Serial TX
+Pin 7 solder side - Serial RX
+Pin 8 solder side - GND (used by serial)
+
+Pin 9 parts side - SP_LP (outputs to SP-F, front speaker)
+Pin 9 solder side - SP_LN
+Pin 9 parts side - SP_RP (output splits into SP-BL and SP-BR, rear speaker(s))
+Pin 9 solder side - SP_RN
+
Measurements
------------
@@ -355,6 +390,7 @@ some other components. It will be documented at a later date.
#include "machine/lpci.h"
#include "machine/timekpr.h"
#include "machine/timer.h"
+#include "sound/dmadac.h"
#include "video/voodoo_banshee.h"
#include "emupal.h"
#include "screen.h"
@@ -385,7 +421,8 @@ public:
m_workram(*this, "workram"),
m_ds2430_rom(*this, "ds2430"),
m_io_ports(*this, "IN%u", 0U),
- m_io_ppp_sensors(*this, "SENSOR%u", 1U)
+ m_io_ppp_sensors(*this, "SENSOR%u", 1U),
+ m_dmadac(*this, { "dacr", "dacl" })
{
}
@@ -395,7 +432,6 @@ public:
void init_viper();
void init_vipercf();
void init_viperhd();
- void init_viperppp();
DECLARE_READ_LINE_MEMBER(ds2430_unk_r);
@@ -458,6 +494,10 @@ private:
uint16_t m_unk_serial_data_r;
uint8_t m_unk_serial_regs[0x80];
uint64_t m_e00008_data;
+ uint32_t m_sound_buffer_offset;
+ bool m_sound_irq_enabled;
+
+ TIMER_DEVICE_CALLBACK_MEMBER(sound_timer_callback);
// MPC8240 EPIC, to be device-ified
enum
@@ -574,6 +614,7 @@ private:
required_region_ptr<uint8_t> m_ds2430_rom;
required_ioport_array<8> m_io_ports;
optional_ioport_array<4> m_io_ppp_sensors;
+ required_device_array<dmadac_sound_device, 2> m_dmadac;
uint32_t mpc8240_pci_r(int function, int reg, uint32_t mem_mask);
void mpc8240_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask);
@@ -2074,7 +2115,8 @@ void viper_state::viper_map(address_map &map)
map(0xffe00008, 0xffe0000f).rw(FUNC(viper_state::e00008_r), FUNC(viper_state::e00008_w));
map(0xffe08000, 0xffe08007).noprw();
map(0xffe10000, 0xffe10007).r(FUNC(viper_state::input_r));
- map(0xffe28000, 0xffe28007).nopw(); // ppp2nd lamps
+ map(0xffe28000, 0xffe28007).nopw(); // ppp2nd leds
+ map(0xffe28008, 0xffe2801f).nopw(); // boxingm reads and writes here to read the pad sensor values
map(0xffe30000, 0xffe31fff).rw("m48t58", FUNC(timekeeper_device::read), FUNC(timekeeper_device::write));
map(0xffe40000, 0xffe4000f).noprw();
map(0xffe50000, 0xffe50007).w(FUNC(viper_state::unk2_w));
@@ -2084,12 +2126,14 @@ void viper_state::viper_map(address_map &map)
map(0xffe88000, 0xffe88007).w(FUNC(viper_state::unk1b_w));
map(0xffe98000, 0xffe98007).noprw();
map(0xffe9a000, 0xffe9bfff).ram(); // World Combat uses this
+ map(0xffea0000, 0xffea0007).noprw(); // Gun sensor? Read heavily by p9112
map(0xfff00000, 0xfff3ffff).rom().region("user1", 0); // Boot ROM
}
void viper_state::viper_ppp_map(address_map &map)
{
viper_map(map);
+ map(0xff400108, 0xff40012f).nopw(); // ppp2nd lamps
map(0xff400200, 0xff40023f).r(FUNC(viper_state::ppp_sensor_r));
}
@@ -2114,10 +2158,10 @@ static INPUT_PORTS_START( viper )
PORT_DIPNAME( 0x02, 0x02, "DIP3" ) PORT_DIPLOCATION("SW:3")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW:2")
- PORT_DIPSETTING( 0x04, DEF_STR( Yes ) )
- PORT_DIPSETTING( 0x00, DEF_STR( No ) )
- PORT_DIPNAME( 0x08, 0x00, "DIP1" ) PORT_DIPLOCATION("SW:1")
+ PORT_DIPNAME( 0x04, 0x04, "DIP2" ) PORT_DIPLOCATION("SW:2")
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, "DIP1" ) PORT_DIPLOCATION("SW:1")
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@@ -2127,7 +2171,7 @@ static INPUT_PORTS_START( viper )
PORT_START("IN3")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
- PORT_SERVICE_NO_TOGGLE( 0x02, IP_ACTIVE_LOW ) /* Test Button */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Test Button")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 )
@@ -2229,6 +2273,14 @@ INPUT_PORTS_END
INPUT_PORTS_START( thrild2 )
PORT_INCLUDE( viper )
+ PORT_MODIFY("IN2")
+ PORT_DIPNAME( 0x04, 0x00, "Calibrate Controls On Boot" ) PORT_DIPLOCATION("SW:2") // Game crashes during boot when this is on
+ PORT_DIPSETTING( 0x04, DEF_STR( Yes ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPNAME( 0x08, 0x00, "Memory Card Check On Boot" ) PORT_DIPLOCATION("SW:1")
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+
PORT_MODIFY("IN3")
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Shift Down")
@@ -2256,10 +2308,15 @@ INPUT_PORTS_END
INPUT_PORTS_START( boxingm )
PORT_INCLUDE( viper )
+ PORT_MODIFY("IN2")
+ PORT_DIPNAME( 0x04, 0x04, "Calibrate Pads On Boot" ) PORT_DIPLOCATION("SW:2")
+ PORT_DIPSETTING( 0x04, DEF_STR( Yes ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+
PORT_MODIFY("IN4")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("BodyPad L")
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Select R")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Select L")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Select R")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("BodyPad L")
PORT_MODIFY("IN5")
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("BodyPad R")
@@ -2283,15 +2340,88 @@ INPUT_PORTS_END
INPUT_PORTS_START( p911 )
PORT_INCLUDE( viper )
+ PORT_MODIFY("IN2")
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW:2")
+ PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( No ) )
+ PORT_DIPNAME( 0x08, 0x00, "Memory Card Check On Boot" ) PORT_DIPLOCATION("SW:1")
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+
PORT_MODIFY("IN4")
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Gun Trigger")
PORT_MODIFY("IN5")
- // one of these is P2 SHT2 (checks and fails serial if pressed)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // P2 SHT2 (checks and fails serial if pressed)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
+INPUT_PORTS_START( mfightc )
+ PORT_INCLUDE( viper )
+
+ PORT_MODIFY("IN2")
+ PORT_DIPNAME( 0x01, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW:2")
+ PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( No ) )
+
+ PORT_MODIFY("IN4")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // If off, will get stuck after RTC OK
+
+ PORT_MODIFY("IN5")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // if off tries to check UART
+INPUT_PORTS_END
+
+INPUT_PORTS_START( mocapglf )
+ PORT_INCLUDE( viper )
+
+ PORT_MODIFY("IN4")
+ PORT_DIPNAME( 0x40, 0x40, "Show Diagnostics On Boot" ) // Shows UART status, lamp status, and accelerometer values
+ PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( No ) )
+
+INPUT_PORTS_END
+
+INPUT_PORTS_START( mocapb )
+ PORT_INCLUDE( viper )
+
+ PORT_MODIFY("IN2")
+ PORT_DIPNAME( 0x08, 0x00, "Memory Card Check On Boot" ) PORT_DIPLOCATION("SW:1")
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+
+ PORT_MODIFY("IN4")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Left Button")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Right Button")
+
+ PORT_MODIFY("IN5")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // P2 SHT2 (checks and fails serial if pressed)
+INPUT_PORTS_END
+
+INPUT_PORTS_START( sscopefh )
+ PORT_INCLUDE( viper )
+
+ PORT_MODIFY("IN2")
+ PORT_DIPNAME( 0x04, 0x00, "DIP2" ) PORT_DIPLOCATION("SW:2") // Without this switched on, the screen will be static
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, "Memory Card Check On Boot" ) PORT_DIPLOCATION("SW:1")
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+
+ PORT_MODIFY("IN3")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Refill Key")
+
+ PORT_MODIFY("IN4")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_NAME("Credit 2 Pounds") // Currency probably changes between regions
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_NAME("Credit 1 Pound") // Can be used in refill mode to insert coins into the hopper
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN5 ) PORT_NAME("Credit 0.50 Pounds")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Gun Trigger")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN6 ) PORT_NAME("Credit 0.20 Pounds")
+
+ PORT_MODIFY("IN5")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // P2 SHT2 (checks and fails serial if pressed)
+INPUT_PORTS_END
+
INPUT_PORTS_START( tsurugi )
PORT_INCLUDE( viper )
@@ -2304,6 +2434,58 @@ INPUT_PORTS_START( tsurugi )
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // sensor grip (1) horizontal (0) vertical
INPUT_PORTS_END
+INPUT_PORTS_START( wcombat )
+ PORT_INCLUDE( viper )
+
+ PORT_MODIFY("IN2")
+ PORT_DIPNAME( 0x01, 0x00, "DIP4" ) PORT_DIPLOCATION("SW:4") // Skip device check? wcombatu is playable when this is set
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW:2")
+ PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( No ) )
+ PORT_DIPNAME( 0x08, 0x00, "Memory Card Check On Boot" ) PORT_DIPLOCATION("SW:1")
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+
+ PORT_MODIFY("IN3")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 )
+
+ PORT_MODIFY("IN4")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // X flip screen
+INPUT_PORTS_END
+
+INPUT_PORTS_START( xtrial )
+ PORT_INCLUDE( viper )
+
+ PORT_MODIFY("IN2")
+ PORT_DIPNAME( 0x04, 0x00, "Calibrate Controls On Boot" ) PORT_DIPLOCATION("SW:2") // Game crashes during boot when this is on
+ PORT_DIPSETTING( 0x04, DEF_STR( Yes ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPNAME( 0x08, 0x00, "Memory Card Check On Boot" ) PORT_DIPLOCATION("SW:1") // Crashes at 45% when card checks are enabled
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+INPUT_PORTS_END
+
+INPUT_PORTS_START( code1d )
+ PORT_INCLUDE( viper )
+
+ PORT_MODIFY("IN2")
+ PORT_DIPNAME( 0x01, 0x00, "DIP4" ) PORT_DIPLOCATION("SW:4") // Unknown, but without this set the game won't display anything besides a blue screen
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x00, "Calibrate Controls On Boot" ) PORT_DIPLOCATION("SW:2") // Game crashes during boot when this is on
+ PORT_DIPSETTING( 0x04, DEF_STR( Yes ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPNAME( 0x08, 0x00, "Memory Card Check On Boot" ) PORT_DIPLOCATION("SW:1")
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+
+ PORT_MODIFY("IN4")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Action Button")
+
+INPUT_PORTS_END
+
/*****************************************************************************/
INTERRUPT_GEN_MEMBER(viper_state::viper_vblank)
@@ -2324,7 +2506,39 @@ WRITE_LINE_MEMBER(viper_state::voodoo_vblank)
WRITE_LINE_MEMBER(viper_state::voodoo_pciint)
{
if (state)
+ {
+ // This is a hack.
+ // There's no obvious (to me) trigger for when it's safe to start the audio interrupts, but after testing all of the games that can boot, it's safe to start audio interrupts once pciint is triggering.
+ m_sound_irq_enabled = true;
+
mpc8240_interrupt(MPC8240_IRQ4);
+ }
+}
+
+TIMER_DEVICE_CALLBACK_MEMBER(viper_state::sound_timer_callback)
+{
+ if (!m_sound_irq_enabled)
+ {
+ // If IRQ3 is triggered too soon into the boot process then it'll freeze on the blue boot screen.
+ return;
+ }
+
+ mpc8240_interrupt(MPC8240_IRQ3);
+
+ // Get samples from memory
+ int32_t* samplePtr = (int32_t*)(m_workram + (m_sound_buffer_offset >> 3));
+ for (int i = 0; i < 2; i++)
+ {
+ m_dmadac[i]->transfer(
+ i,
+ 1,
+ 2,
+ 0x800 / 4 / 2, // Each buffer is 0x800 bytes in size, containing stereo 32-bit audio
+ samplePtr
+ );
+ }
+
+ m_sound_buffer_offset ^= 0x800;
}
void viper_state::machine_start()
@@ -2346,6 +2560,8 @@ void viper_state::machine_start()
save_item(NAME(m_unk_serial_data));
save_item(NAME(m_unk_serial_data_r));
save_item(NAME(m_unk_serial_regs));
+ save_item(NAME(m_sound_buffer_offset));
+ save_item(NAME(m_sound_irq_enabled));
save_item(NAME(m_ds2430_unk_status));
save_item(NAME(m_ds2430_data));
@@ -2398,6 +2614,16 @@ void viper_state::machine_reset()
identify_device[51] = 0x0200; /* 51: PIO data transfer cycle timing mode */
identify_device[67] = 0x00f0; /* 67: minimum PIO transfer cycle time without flow control */
+ m_sound_buffer_offset = 0xfff800; // The games swap between 0xfff800 and 0xfff000 every IRQ3 call
+ m_sound_irq_enabled = false;
+
+ for (int i = 0; i < 2; i++)
+ {
+ m_dmadac[i]->initialize_state();
+ m_dmadac[i]->set_frequency(44100);
+ m_dmadac[i]->enable(1);
+ }
+
m_ds2430_unk_status = 1;
}
@@ -2439,8 +2665,16 @@ void viper_state::viper(machine_config &config)
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
+ DMADAC(config, "dacl").add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ DMADAC(config, "dacr").add_route(ALL_OUTPUTS, "rspeaker", 1.0);
M48T58(config, "m48t58", 0);
+
+ // Each IRQ3 will update the data buffers with 256 samples, and the playback rate is always 44100hz.
+ // The frequency is picked such that the DMADAC buffer should never overflow or underflow.
+ // Note that adjusting this value has gameplay consequences for ppp2nd: the gameplay's note and animation timings are tied directly to values updated using IRQ3,
+ // so having IRQ3 trigger too quickly or too slowly will mean that the gameplay will either be too fast or too slow.
+ TIMER(config, "sound_timer").configure_periodic(FUNC(viper_state::sound_timer_callback), attotime::from_hz(44100.0 / 256));
}
void viper_state::viper_ppp(machine_config &config)
@@ -2475,7 +2709,8 @@ void viper_state::init_vipercf()
uint16_t viper_state::ppp_sensor_r(offs_t offset)
{
- switch(offset) {
+ switch(offset)
+ {
case 0x06: return m_io_ppp_sensors[0]->read();
case 0x0e: return m_io_ppp_sensors[1]->read();
case 0x16: return m_io_ppp_sensors[2]->read();
@@ -2678,23 +2913,36 @@ ROM_START(p911) //*
ROM_LOAD("ds2430.u3", 0x00, 0x28, BAD_DUMP CRC(f1511505) SHA1(ed7cd9b2763b3e377df9663943160f9871f65105))
ROM_REGION(0x2000, "m48t58", ROMREGION_ERASE00) /* M48T58 Timekeeper NVRAM */
- ROM_LOAD("a00uad_nvram.u39", 0x000000, 0x2000, CRC(cca056ca) SHA1(de1a00d84c1311d48bbe6d24f5b36e22ecf5e85a))
+ ROM_LOAD("a00aae_nvram.u39", 0x000000, 0x2000, BAD_DUMP CRC(9ecd75a3) SHA1(f9db35b91d4ef7fd61f21382fc62a6428d0b0c52))
+
+ DISK_REGION( "ata:0:hdd:image" )
+ DISK_IMAGE( "a00uad02", 0, SHA1(6acb8dc41920e7025b87034a3a62b185ef0109d9) ) // Actually is AAE/KAE
+ROM_END
+
+ROM_START(p911k) //*
+ VIPER_BIOS
+
+ ROM_REGION(0x28, "ds2430", ROMREGION_ERASE00) /* DS2430 */
+ ROM_LOAD("ds2430.u3", 0x00, 0x28, BAD_DUMP CRC(f1511505) SHA1(ed7cd9b2763b3e377df9663943160f9871f65105))
+
+ ROM_REGION(0x2000, "m48t58", ROMREGION_ERASE00) /* M48T58 Timekeeper NVRAM */
+ ROM_LOAD("a00kae_nvram.u39", 0x000000, 0x2000, BAD_DUMP CRC(157e0361) SHA1(a4e301f1c73d148b3c18c9c02b67692ffdd6a664))
DISK_REGION( "ata:0:hdd:image" )
- DISK_IMAGE( "a00uad02", 0, SHA1(6acb8dc41920e7025b87034a3a62b185ef0109d9) )
+ DISK_IMAGE( "a00uad02", 0, SHA1(6acb8dc41920e7025b87034a3a62b185ef0109d9) ) // Actually is AAE/KAE
ROM_END
-ROM_START(p911uc) //*
+ROM_START(p911ac) //*
VIPER_BIOS
ROM_REGION(0x28, "ds2430", ROMREGION_ERASE00) /* DS2430 */
ROM_LOAD("ds2430.u3", 0x00, 0x28, BAD_DUMP CRC(f1511505) SHA1(ed7cd9b2763b3e377df9663943160f9871f65105))
ROM_REGION(0x2000, "m48t58", ROMREGION_ERASE00) /* M48T58 Timekeeper NVRAM */
- ROM_LOAD("a00uac_nvram.u39", 0x000000, 0x2000, NO_DUMP )
+ ROM_LOAD("a00aac_nvram.u39", 0x000000, 0x2000, BAD_DUMP CRC(d65742ce) SHA1(20055c0b701c62b0f01cfe619d07bd9532cc3b45))
DISK_REGION( "ata:0:hdd:image" )
- DISK_IMAGE( "a00uac02", 0, SHA1(b268789416dbf8886118a634b911f0ee254970de) )
+ DISK_IMAGE( "a00uac02", 0, SHA1(b268789416dbf8886118a634b911f0ee254970de) ) // a00uac02 and a00kac02 are the same image
ROM_END
ROM_START(p911kc) //*
@@ -2710,17 +2958,30 @@ ROM_START(p911kc) //*
DISK_IMAGE( "a00kac02", 0, SHA1(b268789416dbf8886118a634b911f0ee254970de) )
ROM_END
-ROM_START(p911e) //*
+ROM_START(p911ud) //*
VIPER_BIOS
ROM_REGION(0x28, "ds2430", ROMREGION_ERASE00) /* DS2430 */
ROM_LOAD("ds2430.u3", 0x00, 0x28, BAD_DUMP CRC(f1511505) SHA1(ed7cd9b2763b3e377df9663943160f9871f65105))
ROM_REGION(0x2000, "m48t58", ROMREGION_ERASE00) /* M48T58 Timekeeper NVRAM */
- ROM_LOAD("a00eaa_nvram.u39", 0x000000, 0x2000, CRC(4f3497b6) SHA1(3045c54f98dff92cdf3a1fc0cd4c76ba82d632d7) )
+ ROM_LOAD("a00uad_nvram.u39", 0x000000, 0x2000, BAD_DUMP CRC(c4f44a70) SHA1(d7946606bf72ca7a6f391c4832205ae6fb1ebd95) )
+
+ DISK_REGION( "ata:0:hdd:image" )
+ DISK_IMAGE( "a00eaa02", 0, SHA1(81565a2dce2e2b0a7927078a784354948af1f87c) ) // Is actually UAD/EAD
+ROM_END
+
+ROM_START(p911ed) //*
+ VIPER_BIOS
+
+ ROM_REGION(0x28, "ds2430", ROMREGION_ERASE00) /* DS2430 */
+ ROM_LOAD("ds2430.u3", 0x00, 0x28, BAD_DUMP CRC(f1511505) SHA1(ed7cd9b2763b3e377df9663943160f9871f65105))
+
+ ROM_REGION(0x2000, "m48t58", ROMREGION_ERASE00) /* M48T58 Timekeeper NVRAM */
+ ROM_LOAD("a00ead_nvram.u39", 0x000000, 0x2000, BAD_DUMP CRC(0314fc96) SHA1(cbf421bb37f0a122944fbccf8f4c80380c89e094) )
DISK_REGION( "ata:0:hdd:image" )
- DISK_IMAGE( "a00eaa02", 0, SHA1(81565a2dce2e2b0a7927078a784354948af1f87c) )
+ DISK_IMAGE( "a00eaa02", 0, SHA1(81565a2dce2e2b0a7927078a784354948af1f87c) ) // Is actually UAD/EAD
ROM_END
ROM_START(p911ea)
@@ -2903,7 +3164,7 @@ ROM_START(tsurugij) //*
ROM_LOAD("ds2430.u3", 0x00, 0x28, BAD_DUMP CRC(f1511505) SHA1(ed7cd9b2763b3e377df9663943160f9871f65105))
ROM_REGION(0x2000, "m48t58", ROMREGION_ERASE00) /* M48T58 Timekeeper NVRAM */
- ROM_LOAD("a30jac_nvram.u39", 0x00000, 0x2000, NO_DUMP )
+ ROM_LOAD("a30jac_nvram.u39", 0x00000, 0x2000, BAD_DUMP CRC(0e2c0e61) SHA1(d77670e214f618652e67fa91e644750894a0c5c7))
DISK_REGION( "ata:0:hdd:image" )
DISK_IMAGE( "a30c02", 0, SHA1(533b5669b00884a800df9ba29651777a76559862) )
@@ -2919,7 +3180,7 @@ ROM_START(tsurugie)
ROM_LOAD("nvram.u39", 0x000000, 0x2000, NO_DUMP )
DISK_REGION( "ata:0:hdd:image" )
- DISK_IMAGE( "a30eab02", 0, SHA1(fcc5b69f89e246f26ca4b8546cc409d3488bbdd9) )
+ DISK_IMAGE( "a30eab02", 0, SHA1(fcc5b69f89e246f26ca4b8546cc409d3488bbdd9) ) // Incomplete dump? Is half the size of the other dumps
ROM_END
/* This CF card has sticker C22D02 */
@@ -3074,7 +3335,7 @@ ROM_START(mfightcc) //*
ROM_LOAD("ds2430.u3", 0x00, 0x28, BAD_DUMP CRC(f1511505) SHA1(ed7cd9b2763b3e377df9663943160f9871f65105))
ROM_REGION(0x2000, "m48t58", ROMREGION_ERASE00) /* M48T58 Timekeeper NVRAM */
- ROM_LOAD("c09jac_nvram.u39", 0x00000, 0x2000, NO_DUMP )
+ ROM_LOAD("c09jac_nvram.u39", 0x00000, 0x2000, BAD_DUMP CRC(2d100e2b) SHA1(209764130ec3279fe17fe98de6cd0780b80c148f))
DISK_REGION( "ata:0:hdd:image" )
DISK_IMAGE( "c09c04", 0, SHA1(bf5f7447d74399d34edd4eb6dfcca7f6fc2154f2) )
@@ -3089,44 +3350,46 @@ ROM_END
/* Viper BIOS */
GAME(1999, kviper, 0, viper, viper, viper_state, init_viper, ROT0, "Konami", "Konami Viper BIOS", MACHINE_IS_BIOS_ROOT)
-GAME(2001, ppp2nd, kviper, viper_ppp, ppp2nd, viper_state, init_viperhd, ROT0, "Konami", "ParaParaParadise 2nd Mix (JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, ppp2nda, ppp2nd, viper_ppp, ppp2nd, viper_state, init_viperhd, ROT0, "Konami", "ParaParaParadise 2nd Mix (AAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-
-GAME(2001, boxingm, kviper, viper, boxingm, viper_state, init_vipercf, ROT0, "Konami", "Boxing Mania: Ashita no Joe (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2000, code1d, kviper, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Code One Dispatch (ver D)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2000, code1db, code1d, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Code One Dispatch (ver B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, gticlub2, kviper, viper, gticlub2, viper_state, init_vipercf, ROT0, "Konami", "GTI Club: Corso Italiano (ver JAB)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, gticlub2ea,gticlub2, viper, gticlub2ea, viper_state, init_vipercf, ROT0, "Konami", "GTI Club: Corso Italiano (ver EAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, jpark3, kviper, viper, jpark3, viper_state, init_vipercf, ROT0, "Konami", "Jurassic Park 3 (ver EBC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, jpark3u, jpark3, viper, jpark3, viper_state, init_vipercf, ROT0, "Konami", "Jurassic Park 3 (ver UA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, mocapglf, kviper, viper, viper, viper_state, init_vipercf, ROT90, "Konami", "Mocap Golf (ver UAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, mocapb, kviper, viper, viper, viper_state, init_vipercf, ROT90, "Konami", "Mocap Boxing (ver AAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, mocapbj, mocapb, viper, viper, viper_state, init_vipercf, ROT90, "Konami", "Mocap Boxing (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, p911, kviper, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver UAD)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, p911uc, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver UAC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, p911kc, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver KAC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, p911e, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 24/7 (ver EAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, p911ea, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 24/7 (ver EAA, alt)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, p911j, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Keisatsukan Shinjuku 24ji (ver JAC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, p9112, kviper, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 2 (VER. UAA:B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, sscopex, kviper, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Silent Scope EX (ver UAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, sogeki, sscopex, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Sogeki (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2002, sscopefh, kviper, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Silent Scope Fortune Hunter", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, thrild2, kviper, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver EBB)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, thrild2j, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, thrild2a, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, thrild2ab, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA, alt)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, thrild2ac, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA, alt 2)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2001, thrild2c, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver EAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2002, tsurugi, kviper, viper, tsurugi, viper_state, init_vipercf, ROT0, "Konami", "Tsurugi (ver EAB)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2002, tsurugie, tsurugi, viper, tsurugi, viper_state, init_vipercf, ROT0, "Konami", "Tsurugi (ver EAB, alt)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2002, tsurugij, tsurugi, viper, tsurugi, viper_state, init_vipercf, ROT0, "Konami", "Tsurugi (ver JAC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2002, wcombat, kviper, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver AAD:B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2002, wcombatb, wcombat, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver AAD:B, alt)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2002, wcombatk, wcombat, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver KBC:B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2002, wcombatu, wcombat, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "World Combat / Warzaid (ver UCD:B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2002, wcombatj, wcombat, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2002, xtrial, kviper, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Xtrial Racing (ver JAB)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-
-GAME(2002, mfightc, kviper, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Mahjong Fight Club (ver JAD)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
-GAME(2002, mfightcc, mfightc, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Mahjong Fight Club (ver JAC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
+GAME(2001, ppp2nd, kviper, viper_ppp, ppp2nd, viper_state, init_viperhd, ROT0, "Konami", "ParaParaParadise 2nd Mix (JAA)", MACHINE_NOT_WORKING)
+GAME(2001, ppp2nda, ppp2nd, viper_ppp, ppp2nd, viper_state, init_viperhd, ROT0, "Konami", "ParaParaParadise 2nd Mix (AAA)", MACHINE_NOT_WORKING)
+
+GAME(2001, boxingm, kviper, viper, boxingm, viper_state, init_vipercf, ROT0, "Konami", "Boxing Mania: Ashita no Joe (ver JAA)", MACHINE_NOT_WORKING)
+GAME(2000, code1d, kviper, viper, code1d, viper_state, init_vipercf, ROT0, "Konami", "Code One Dispatch Ver 1.21 (ver UAD)", MACHINE_NOT_WORKING)
+GAME(2000, code1db, code1d, viper, code1d, viper_state, init_vipercf, ROT0, "Konami", "Code One Dispatch Ver 1.16 (ver UAB)", MACHINE_NOT_WORKING)
+GAME(2001, gticlub2, kviper, viper, gticlub2, viper_state, init_vipercf, ROT0, "Konami", "GTI Club: Corso Italiano (ver JAB)", MACHINE_NOT_WORKING)
+GAME(2001, gticlub2ea,gticlub2, viper, gticlub2ea, viper_state, init_vipercf, ROT0, "Konami", "GTI Club: Corso Italiano (ver EAA)", MACHINE_NOT_WORKING)
+GAME(2001, jpark3, kviper, viper, jpark3, viper_state, init_vipercf, ROT0, "Konami", "Jurassic Park 3 (ver EBC)", MACHINE_NOT_WORKING)
+GAME(2001, jpark3u, jpark3, viper, jpark3, viper_state, init_vipercf, ROT0, "Konami", "Jurassic Park 3 (ver UBC)", MACHINE_NOT_WORKING)
+GAME(2001, mocapglf, kviper, viper, mocapglf, viper_state, init_vipercf, ROT90, "Konami", "Mocap Golf (ver UAA)", MACHINE_NOT_WORKING)
+GAME(2001, mocapb, kviper, viper, mocapb, viper_state, init_vipercf, ROT90, "Konami", "Mocap Boxing (ver AAB)", MACHINE_NOT_WORKING)
+GAME(2001, mocapbj, mocapb, viper, mocapb, viper_state, init_vipercf, ROT90, "Konami", "Mocap Boxing (ver JAA)", MACHINE_NOT_WORKING)
+GAME(2001, p911, kviper, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver AAE)", MACHINE_NOT_WORKING)
+GAME(2001, p911k, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver KAE)", MACHINE_NOT_WORKING)
+GAME(2001, p911ac, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver AAC)", MACHINE_NOT_WORKING)
+GAME(2001, p911kc, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver KAC)", MACHINE_NOT_WORKING)
+GAME(2001, p911ud, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 24/7 (ver UAD)", MACHINE_NOT_WORKING)
+GAME(2001, p911ed, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 24/7 (ver EAD)", MACHINE_NOT_WORKING)
+GAME(2001, p911ea, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 24/7 (ver EAD, alt)", MACHINE_NOT_WORKING)
+GAME(2001, p911j, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Keisatsukan Shinjuku 24ji (ver JAE)", MACHINE_NOT_WORKING)
+GAME(2001, p9112, kviper, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 2 (VER. UAA:B)", MACHINE_NOT_WORKING)
+GAME(2001, sscopex, kviper, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Silent Scope EX (ver UAA)", MACHINE_NOT_WORKING)
+GAME(2001, sogeki, sscopex, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Sogeki (ver JAA)", MACHINE_NOT_WORKING)
+GAME(2002, sscopefh, kviper, viper, sscopefh, viper_state, init_vipercf, ROT0, "Konami", "Silent Scope Fortune Hunter (ver EAA)", MACHINE_NOT_WORKING)
+GAME(2001, thrild2, kviper, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver EBB)", MACHINE_NOT_WORKING)
+GAME(2001, thrild2j, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver JAA)", MACHINE_NOT_WORKING)
+GAME(2001, thrild2a, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA)", MACHINE_NOT_WORKING)
+GAME(2001, thrild2ab, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA, alt)", MACHINE_NOT_WORKING)
+GAME(2001, thrild2ac, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA, alt 2)", MACHINE_NOT_WORKING)
+GAME(2001, thrild2c, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver EAA)", MACHINE_NOT_WORKING)
+GAME(2002, tsurugi, kviper, viper, tsurugi, viper_state, init_vipercf, ROT0, "Konami", "Tsurugi (ver EAB)", MACHINE_NOT_WORKING)
+GAME(2002, tsurugie, tsurugi, viper, tsurugi, viper_state, init_vipercf, ROT0, "Konami", "Tsurugi (ver EAB, alt)", MACHINE_NOT_WORKING)
+GAME(2002, tsurugij, tsurugi, viper, tsurugi, viper_state, init_vipercf, ROT0, "Konami", "Tsurugi (ver JAC)", MACHINE_NOT_WORKING)
+GAME(2002, wcombat, kviper, viper, wcombat, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver AAD:B)", MACHINE_NOT_WORKING)
+GAME(2002, wcombatb, wcombat, viper, wcombat, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver AAD:B, alt)", MACHINE_NOT_WORKING)
+GAME(2002, wcombatk, wcombat, viper, wcombat, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver KBC:B)", MACHINE_NOT_WORKING)
+GAME(2002, wcombatu, wcombat, viper, wcombat, viper_state, init_vipercf, ROT0, "Konami", "World Combat / Warzaid (ver UCD:B)", MACHINE_NOT_WORKING)
+GAME(2002, wcombatj, wcombat, viper, wcombat, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver JAA)", MACHINE_NOT_WORKING)
+GAME(2002, xtrial, kviper, viper, xtrial, viper_state, init_vipercf, ROT0, "Konami", "Xtrial Racing (ver JAB)", MACHINE_NOT_WORKING)
+
+GAME(2002, mfightc, kviper, viper, mfightc, viper_state, init_vipercf, ROT0, "Konami", "Mahjong Fight Club (ver JAD)", MACHINE_NOT_WORKING)
+GAME(2002, mfightcc, mfightc, viper, mfightc, viper_state, init_vipercf, ROT0, "Konami", "Mahjong Fight Club (ver JAC)", MACHINE_NOT_WORKING)
diff --git a/src/mame/drivers/vsmileb.cpp b/src/mame/drivers/vsmileb.cpp
index 96c5f6af26f..b95684fd770 100644
--- a/src/mame/drivers/vsmileb.cpp
+++ b/src/mame/drivers/vsmileb.cpp
@@ -4,6 +4,22 @@
V-Tech V.Smile Baby console emulation
+ System is currently marked as not-working due to severe audio issues, as
+ narration-related voice clips are all cut off too early in every game.
+
+ The issue appears to be due to improper handling of the "Fast Rampdown"
+ feature in the SPG2xx audio device, but due to the poor quality of SunPlus
+ developer documentation, it's unclear as to what part of the implementation
+ is wrong.
+
+ If the Fast Rampdown feature is disabled in the audio device entirely,
+ voice clips play out without issue.
+
+ Although bad audio is not usually a reason for marking a driver as
+ non-working, due to the nature of the V.Smile Baby and its target users,
+ having properly-narrated voices is critical to the overall experience of
+ the system.
+
*******************************************************************************/
#include "emu.h"
@@ -103,9 +119,9 @@ static INPUT_PORTS_START( vsmileb )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_EXIT) PORT_NAME("Exit")
PORT_START("MODE")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Play Time") PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, sw_mode<0x0400>, 0) // three-position function switch
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Watch & Learn") PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, sw_mode<0x0800>, 0)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Learn & Explore") PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, sw_mode<0x0c00>, 0)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_1) PORT_NAME("Play Time") PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, sw_mode<0x0400>, 0) // three-position function switch
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_2) PORT_NAME("Watch & Learn") PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, sw_mode<0x0800>, 0)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_3) PORT_NAME("Learn & Explore") PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, sw_mode<0x0c00>, 0)
PORT_START("LOGO")
PORT_DIPNAME( 0x10, 0x10, "VTech Intro" )
@@ -180,12 +196,12 @@ ROM_START( vsmilebfp )
ROM_LOAD16_WORD_SWAP( "vsmilebabybios_france_patoune.bin", 0x000000, 0x800000, CRC(57757602) SHA1(a7495e1c6b2edaeb63bf1c658575689304f15804) )
ROM_END
-// year, name, parent, compat, machine, input, class, init, company, fullname, flags
-CONS( 2005, vsmileb, 0, 0, vsmileb, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (USA)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2005, vsmilebsw ,vsmileb, 0, vsmilebp,vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (Sweden)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+// year, name, parent, compat, machine, input, class, init, company, fullname, flags
+CONS( 2005, vsmileb, 0, 0, vsmileb, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (USA)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+CONS( 2005, vsmilebsw, vsmileb, 0, vsmilebp, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (Sweden)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
// These have a game in the BIOS ROM, supplied as a 'Romless cart' with the device, so probably triggers a switch. Currently always banked in.
-CONS( 2005, vsmilebs, vsmileb, 0, vsmileb, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (Spain, with 'Aventuras en el Bosque de los Cien Acres')", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2005, vsmilebg, vsmileb, 0, vsmileb, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (Germany, with 'Puuhs Hundert-Morgen-Wald')", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2005, vsmilebf, vsmileb, 0, vsmileb, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (France, with 'Winnie et ses amis dans la Foret des Reves Bleus')", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2005, vsmilebfp, vsmileb, 0, vsmileb, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (France, with 'En Ville avec l'ourson Patoune')", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2005, vsmilebs, vsmileb, 0, vsmileb, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (Spain, with 'Aventuras en el Bosque de los Cien Acres')", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+CONS( 2005, vsmilebg, vsmileb, 0, vsmileb, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (Germany, with 'Puuhs Hundert-Morgen-Wald')", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+CONS( 2005, vsmilebf, vsmileb, 0, vsmileb, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (France, with 'Winnie et ses amis dans la Foret des Reves Bleus')", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+CONS( 2005, vsmilebfp, vsmileb, 0, vsmileb, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (France, with 'En Ville avec l'ourson Patoune')", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/vtech1.cpp b/src/mame/drivers/vtech1.cpp
index 101f3b4a214..029c7417461 100644
--- a/src/mame/drivers/vtech1.cpp
+++ b/src/mame/drivers/vtech1.cpp
@@ -184,7 +184,7 @@ SNAPSHOT_LOAD_MEMBER(vtech1_base_state::snapshot_cb)
// verify
if (space.read_byte(addr) != to_write)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Insufficient RAM to load snapshot");
+ image.seterror(image_error::INVALIDIMAGE, "Insufficient RAM to load snapshot");
image.message("Insufficient RAM to load snapshot (%d bytes needed) [%s]", size, pgmname);
return image_init_result::FAIL;
@@ -214,7 +214,7 @@ SNAPSHOT_LOAD_MEMBER(vtech1_base_state::snapshot_cb)
break;
default:
- image.seterror(IMAGE_ERROR_UNSUPPORTED, "Snapshot format not supported.");
+ image.seterror(image_error::INVALIDIMAGE, "Snapshot format not supported.");
image.message("Snapshot format not supported.");
return image_init_result::FAIL;
}
diff --git a/src/mame/drivers/wardner.cpp b/src/mame/drivers/wardner.cpp
index 8862a2c11ba..f40ae26dbd7 100644
--- a/src/mame/drivers/wardner.cpp
+++ b/src/mame/drivers/wardner.cpp
@@ -433,8 +433,10 @@ void wardner_state::wardner(machine_config &config)
crtc.set_char_width(2);
TOAPLAN_SCU(config, m_spritegen, 0);
+ m_spritegen->set_screen(m_screen);
m_spritegen->set_palette(m_palette);
m_spritegen->set_xoffsets(32, 14);
+ m_spritegen->set_pri_callback(FUNC(wardner_state::pri_cb));
BUFFERED_SPRITERAM8(config, m_spriteram8);
diff --git a/src/mame/drivers/wpc_95.cpp b/src/mame/drivers/wpc_95.cpp
index a3f464cb3f1..9684bda5b31 100644
--- a/src/mame/drivers/wpc_95.cpp
+++ b/src/mame/drivers/wpc_95.cpp
@@ -21,15 +21,15 @@ class wpc_95_state : public driver_device
{
public:
wpc_95_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- maincpu(*this, "maincpu"),
- dcs(*this, "dcs"),
- rombank(*this, "rombank"),
- mainram(*this, "mainram"),
- nvram(*this, "nvram"),
- pic(*this, "pic"),
- lamp(*this, "lamp"),
- out(*this, "out")
+ : driver_device(mconfig, type, tag)
+ , maincpu(*this, "maincpu")
+ , dcs(*this, "dcs")
+ , rombank(*this, "rombank")
+ , mainram(*this, "mainram")
+ , nvram(*this, "nvram")
+ , pic(*this, "pic")
+ , lamp(*this, "lamp")
+ , out(*this, "out")
{ }
void wpc_95(machine_config &config);
diff --git a/src/mame/drivers/x07.cpp b/src/mame/drivers/x07.cpp
index ee604bb7542..a5a65d2ef7c 100644
--- a/src/mame/drivers/x07.cpp
+++ b/src/mame/drivers/x07.cpp
@@ -1063,7 +1063,7 @@ DEVICE_IMAGE_LOAD_MEMBER( x07_state::card_load )
if (strcmp(card_type, "xp140"))
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported card type");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported card type");
return image_init_result::FAIL;
}
}
diff --git a/src/mame/drivers/xexex.cpp b/src/mame/drivers/xexex.cpp
index 087843ca611..e5ab2814aee 100644
--- a/src/mame/drivers/xexex.cpp
+++ b/src/mame/drivers/xexex.cpp
@@ -524,17 +524,17 @@ void xexex_state::xexex(machine_config &config)
K054321(config, m_k054321, "lspeaker", "rspeaker");
ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(32'000'000)/8)); // 4MHz
- ymsnd.add_route(0, "filter1_l", 0.50);
- ymsnd.add_route(0, "filter1_r", 0.50);
- ymsnd.add_route(1, "filter2_l", 0.50);
- ymsnd.add_route(1, "filter2_r", 0.50);
+ ymsnd.add_route(0, "filter1_l", 0.2);
+ ymsnd.add_route(0, "filter1_r", 0.2);
+ ymsnd.add_route(1, "filter2_l", 0.2);
+ ymsnd.add_route(1, "filter2_r", 0.2);
K054539(config, m_k054539, XTAL(18'432'000));
m_k054539->set_analog_callback(FUNC(xexex_state::ym_set_mixing));
- m_k054539->add_route(0, "lspeaker", 1.0);
- m_k054539->add_route(0, "rspeaker", 1.0);
- m_k054539->add_route(1, "lspeaker", 1.0);
- m_k054539->add_route(1, "rspeaker", 1.0);
+ m_k054539->add_route(0, "lspeaker", 0.4);
+ m_k054539->add_route(0, "rspeaker", 0.4);
+ m_k054539->add_route(1, "lspeaker", 0.4);
+ m_k054539->add_route(1, "rspeaker", 0.4);
FILTER_VOLUME(config, "filter1_l").add_route(ALL_OUTPUTS, "lspeaker", 1.0);
FILTER_VOLUME(config, "filter1_r").add_route(ALL_OUTPUTS, "rspeaker", 1.0);
diff --git a/src/mame/drivers/ympsr16.cpp b/src/mame/drivers/ympsr16.cpp
new file mode 100644
index 00000000000..8ca257be9cc
--- /dev/null
+++ b/src/mame/drivers/ympsr16.cpp
@@ -0,0 +1,143 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*******************************************************************************
+
+ Skeleton driver for Yamaha PSR-16 & related keyboards.
+
+ These are based on the YM3420AD or YM3420BF "CPU and FM Tone Generator",
+ a 65C02-based SoC which includes 256 bytes of internal RAM, 16 KB of
+ internal ROM (enabled only on PSR-36?), a MIDI UART and a DAC.
+
+*******************************************************************************/
+
+#include "emu.h"
+//#include "bus/midi/midi.h"
+#include "cpu/m6502/m65c02.h"
+
+namespace {
+
+class yamaha_psr16_state : public driver_device
+{
+public:
+ yamaha_psr16_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ {
+ }
+
+ void psr16(machine_config &config);
+ void psr36(machine_config &config);
+ void pss680(machine_config &config);
+
+private:
+ u8 busy_r();
+
+ void common_map(address_map &map);
+ void psr16_map(address_map &map);
+ void psr36_map(address_map &map);
+ void pss680_map(address_map &map);
+
+ required_device<cpu_device> m_maincpu;
+};
+
+
+u8 yamaha_psr16_state::busy_r()
+{
+ // Code waits for bit 7 of $0200 to go low before writing to $02XX
+ return 0;
+}
+
+void yamaha_psr16_state::common_map(address_map &map)
+{
+ map(0x0000, 0x00ff).mirror(0x100).ram();
+ map(0x0200, 0x0200).r(FUNC(yamaha_psr16_state::busy_r));
+ map(0x0310, 0x0312).nopw();
+ map(0x0318, 0x0318).nopr();
+ map(0x0319, 0x031a).nopw();
+ map(0x031b, 0x031b).nopr();
+ map(0x0327, 0x0327).nopw();
+}
+
+void yamaha_psr16_state::psr16_map(address_map &map)
+{
+ common_map(map);
+ map(0xc000, 0xffff).rom().region("program", 0);
+}
+
+void yamaha_psr16_state::psr36_map(address_map &map)
+{
+ common_map(map);
+ map(0x2000, 0x27ff).ram();
+ map(0x4000, 0x7fff).rom().region("program", 0x4000);
+ map(0x8000, 0xbfff).rom().region("program", 0);
+ map(0xc000, 0xffff).rom().region("maincpu", 0);
+}
+
+void yamaha_psr16_state::pss680_map(address_map &map)
+{
+ common_map(map);
+ map(0x1800, 0x1802).nopw();
+ map(0x1810, 0x1811).nopr();
+ map(0x2000, 0x3fff).ram();
+ map(0x4000, 0x7fff).rom().region("program", 0x8000);
+ map(0x8000, 0xffff).rom().region("program", 0);
+}
+
+
+
+static INPUT_PORTS_START(psr16)
+INPUT_PORTS_END
+
+void yamaha_psr16_state::psr16(machine_config &config)
+{
+ M65C02(config, m_maincpu, 2'000'000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &yamaha_psr16_state::psr16_map);
+}
+
+void yamaha_psr16_state::psr36(machine_config &config)
+{
+ psr16(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &yamaha_psr16_state::psr36_map);
+}
+
+void yamaha_psr16_state::pss680(machine_config &config)
+{
+ psr16(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &yamaha_psr16_state::pss680_map);
+}
+
+ROM_START(psr16)
+ ROM_REGION(0x4000, "program", 0)
+ ROM_LOAD("yamaha_xe988a0_7247-h001.bin", 0x0000, 0x4000, CRC(20c5c0b2) SHA1(d7a066b680b7d4cfded62d4d50808c21784774d0)) // 28-pin mask ROM
+ROM_END
+
+ROM_START(psr36)
+ ROM_REGION(0x4000, "maincpu", 0)
+ ROM_LOAD("ym3420bf_internal.bin", 0x0000, 0x4000, NO_DUMP)
+ ROM_FILL(0x3ffa, 1, 0x07)
+ ROM_FILL(0x3ffb, 1, 0x40)
+ ROM_FILL(0x3ffc, 1, 0x00)
+ ROM_FILL(0x3ffd, 1, 0x40)
+ ROM_FILL(0x3ffe, 1, 0x04)
+ ROM_FILL(0x3fff, 1, 0x40)
+
+ ROM_REGION(0x20000, "program", 0)
+ ROM_LOAD("yamaha_xe137c0_7247-h005.bin", 0x00000, 0x20000, CRC(b9566cd5) SHA1(e35979299de2442d62e039d45b54bf77e9571f49)) // 28-pin mask ROM (second 32K is copy of first 32K; last half is all zero fill)
+
+ ROM_REGION(0x20000, "waves", 0)
+ ROM_LOAD("yamaha_xe137b0_4881-7554.bin", 0x00000, 0x20000, CRC(6fe1382e) SHA1(82320d0a6c14825d790c0d67263786f767b7c318)) // 28-pin mask ROM (drum samples)
+ROM_END
+
+ROM_START(pss680)
+ ROM_REGION(0x40000, "program", 0)
+ ROM_LOAD("yamaha_xe416d0-093.bin", 0x00000, 0x40000, CRC(150d1392) SHA1(d578324cfae73cd5f6c628eb3044be07684bc5d0)) // 32-pin mask ROM
+
+ ROM_REGION(0x40000, "waves", 0)
+ ROM_LOAD("yamaha_xe405b0-070.bin", 0x00000, 0x40000, CRC(53336c52) SHA1(6bcad44fc93cfa5cd603cf24adfd736a911d3509)) // 32-pin mask ROM
+ROM_END
+
+} // anonymous namespace
+
+SYST(1988, psr16, 0, 0, psr16, psr16, yamaha_psr16_state, empty_init, "Yamaha", "PSR-16", MACHINE_IS_SKELETON)
+SYST(1988, psr36, 0, 0, psr36, psr16, yamaha_psr16_state, empty_init, "Yamaha", "PSR-36", MACHINE_IS_SKELETON)
+SYST(1988, pss680, 0, 0, pss680, psr16, yamaha_psr16_state, empty_init, "Yamaha", "PSS-680", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/ympsr40.cpp b/src/mame/drivers/ympsr40.cpp
new file mode 100644
index 00000000000..3b14fb7cbc0
--- /dev/null
+++ b/src/mame/drivers/ympsr40.cpp
@@ -0,0 +1,64 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*******************************************************************************
+
+ Skeleton driver for Yamaha PSR-40 PortaSound keyboard.
+
+*******************************************************************************/
+
+#include "emu.h"
+#include "cpu/z80/z80.h"
+#include "machine/i8255.h"
+#include "machine/nvram.h"
+
+namespace {
+
+class yamaha_psr40_state : public driver_device
+{
+public:
+ yamaha_psr40_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ {
+ }
+
+ void psr40(machine_config &config);
+
+private:
+ void mem_map(address_map &map);
+
+ required_device<cpu_device> m_maincpu;
+};
+
+
+void yamaha_psr40_state::mem_map(address_map &map)
+{
+ map(0x0000, 0x7fff).rom().region("program", 0);
+ map(0x8000, 0x87ff).mirror(0x1800).ram().share("nvram");
+ //map(0xa000, 0xa01f).mirror(0x1fe0).rw("ge7", FUNC(ig10771_device::read), FUNC(ig10771_device::write));
+ map(0xa01e, 0xa01f).nopr();
+ map(0xc000, 0xc003).mirror(0x1ffc).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
+}
+
+
+static INPUT_PORTS_START(psr40)
+INPUT_PORTS_END
+
+void yamaha_psr40_state::psr40(machine_config &config)
+{
+ Z80(config, m_maincpu, 4'000'000); // unknown clock
+ m_maincpu->set_addrmap(AS_PROGRAM, &yamaha_psr40_state::mem_map);
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // TC5517APL + battery?
+
+ I8255(config, "ppi");
+}
+
+ROM_START(psr40)
+ ROM_REGION(0x8000, "program", 0)
+ ROM_LOAD("yamaha_xa004a0_6133-7836.ic4", 0x0000, 0x8000, CRC(7ac4a729) SHA1(e792aabe816d8c46bcc683f0e9220ca50c0faaac)) // 28-pin custom-marked ROM
+ROM_END
+
+} // anonymous namespace
+
+SYST(1985, psr40, 0, 0, psr40, psr40, yamaha_psr40_state, empty_init, "Yamaha", "PSR-40", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/z1013.cpp b/src/mame/drivers/z1013.cpp
index 6d0456303ed..a4d9f04c875 100644
--- a/src/mame/drivers/z1013.cpp
+++ b/src/mame/drivers/z1013.cpp
@@ -380,7 +380,7 @@ SNAPSHOT_LOAD_MEMBER(z1013_state::snapshot_cb)
{ }
else
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Not a Z1013 image");
+ image.seterror(image_error::INVALIDIMAGE, "Not a Z1013 image");
image.message(" Not a Z1013 image");
return image_init_result::FAIL;
}
@@ -392,7 +392,7 @@ SNAPSHOT_LOAD_MEMBER(z1013_state::snapshot_cb)
m_maincpu->set_state_int(Z80_PC, runaddr);
else
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Loaded but cannot run");
+ image.seterror(image_error::INVALIDIMAGE, "Loaded but cannot run");
image.message(" Loaded but cannot run");
}
diff --git a/src/mame/includes/20pacgal.h b/src/mame/includes/20pacgal.h
index bc4d1eb2177..9300d10dbf5 100644
--- a/src/mame/includes/20pacgal.h
+++ b/src/mame/includes/20pacgal.h
@@ -14,6 +14,7 @@
#include "machine/eepromser.h"
#include "machine/intelfsh.h"
+#include "sound/dac.h"
#include "sound/namco.h"
#include "emupal.h"
@@ -31,7 +32,8 @@ public:
m_mainbank(*this, "mainbank"),
m_maincpu(*this, "maincpu"),
m_eeprom(*this, "eeprom"),
- m_palette(*this, "palette")
+ m_palette(*this, "palette"),
+ m_dac(*this, "dac")
{ }
void _20pacgal(machine_config &config);
@@ -58,6 +60,7 @@ protected:
required_device<cpu_device> m_maincpu;
required_device<eeprom_serial_93cxx_device> m_eeprom;
required_device<palette_device> m_palette;
+ required_device<dac_8bit_r2r_device> m_dac;
/* memory */
std::unique_ptr<uint8_t[]> m_sprite_gfx_ram;
diff --git a/src/mame/includes/4enraya.h b/src/mame/includes/4enraya.h
index 99500685ab3..64fcd601d1b 100644
--- a/src/mame/includes/4enraya.h
+++ b/src/mame/includes/4enraya.h
@@ -76,9 +76,11 @@ public:
}
void unkpacg(machine_config &config);
+ void unkpacga(machine_config &config);
private:
void unkpacg_main_map(address_map &map);
+ void unkpacga_main_map(address_map &map);
void unkpacg_main_portmap(address_map &map);
void driver_init() override;
diff --git a/src/mame/includes/atarig42.h b/src/mame/includes/atarig42.h
index 10593d42166..7390d25b1db 100644
--- a/src/mame/includes/atarig42.h
+++ b/src/mame/includes/atarig42.h
@@ -93,6 +93,7 @@ class atarig42_0x400_state : public atarig42_state
{
public:
using atarig42_state::atarig42_state;
+ void init_dangerex();
void init_guardian();
void atarig42_0x400(machine_config &config);
diff --git a/src/mame/includes/cchasm.h b/src/mame/includes/cchasm.h
deleted file mode 100644
index a2ad5f54d75..00000000000
--- a/src/mame/includes/cchasm.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Mathis Rosenhauer
-
-/*************************************************************************
-
- Cinematronics Cosmic Chasm hardware
-
-*************************************************************************/
-
-#include "cpu/z80/z80.h"
-#include "machine/gen_latch.h"
-#include "machine/z80ctc.h"
-#include "sound/dac.h"
-#include "video/vector.h"
-#include "screen.h"
-
-class cchasm_state : public driver_device
-{
-public:
- enum
- {
- TIMER_REFRESH_END
- };
-
- cchasm_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_ctc(*this, "ctc"),
- m_audiocpu(*this, "audiocpu"),
- m_dac1(*this, "dac1"),
- m_dac2(*this, "dac2"),
- m_vector(*this, "vector"),
- m_screen(*this, "screen"),
- m_soundlatch(*this, "soundlatch"),
- m_soundlatch2(*this, "soundlatch2"),
- m_soundlatch3(*this, "soundlatch3"),
- m_soundlatch4(*this, "soundlatch4"),
- m_ram(*this, "ram") { }
-
- required_device<cpu_device> m_maincpu;
- required_device<z80ctc_device> m_ctc;
- required_device<z80_device> m_audiocpu;
- required_device<dac_bit_interface> m_dac1;
- required_device<dac_bit_interface> m_dac2;
- required_device<vector_device> m_vector;
- required_device<screen_device> m_screen;
- required_device<generic_latch_8_device> m_soundlatch;
- required_device<generic_latch_8_device> m_soundlatch2;
- required_device<generic_latch_8_device> m_soundlatch3;
- required_device<generic_latch_8_device> m_soundlatch4;
-
- required_shared_ptr<uint16_t> m_ram;
-
- int m_sound_flags;
- int m_coin_flag;
- int m_output[2];
- int m_xcenter;
- int m_ycenter;
- emu_timer *m_refresh_end_timer;
-
- void led_w(offs_t offset, uint16_t data);
- void refresh_control_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
- void reset_coin_flag_w(uint8_t data);
- uint8_t coin_sound_r();
- uint8_t soundlatch2_r();
- void soundlatch4_w(uint8_t data);
- void io_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
- uint16_t io_r(offs_t offset);
- DECLARE_WRITE_LINE_MEMBER(ctc_timer_1_w);
- DECLARE_WRITE_LINE_MEMBER(ctc_timer_2_w);
-
- INPUT_CHANGED_MEMBER(set_coin_flag);
-
- virtual void video_start() override;
- virtual void sound_start() override;
-
- void refresh();
-
- void cchasm(machine_config &config);
- void memmap(address_map &map);
- void sound_memmap(address_map &map);
- void sound_portmap(address_map &map);
-protected:
- virtual void device_timer(timer_instance const &timer) override;
-};
diff --git a/src/mame/includes/exidy.h b/src/mame/includes/exidy.h
deleted file mode 100644
index f5189b7cd1b..00000000000
--- a/src/mame/includes/exidy.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
-/*************************************************************************
-
- Exidy 6502 hardware
-
-*************************************************************************/
-
-#include "sound/dac.h"
-#include "sound/samples.h"
-#include "emupal.h"
-#include "screen.h"
-
-#define EXIDY_MASTER_CLOCK (XTAL(11'289'000))
-#define EXIDY_CPU_CLOCK (EXIDY_MASTER_CLOCK / 16)
-#define EXIDY_PIXEL_CLOCK (EXIDY_MASTER_CLOCK / 2)
-#define EXIDY_HTOTAL (0x150)
-#define EXIDY_HBEND (0x000)
-#define EXIDY_HBSTART (0x100)
-#define EXIDY_HSEND (0x140)
-#define EXIDY_HSSTART (0x120)
-#define EXIDY_VTOTAL (0x118)
-#define EXIDY_VBEND (0x000)
-#define EXIDY_VBSTART (0x100)
-#define EXIDY_VSEND (0x108)
-#define EXIDY_VSSTART (0x100)
-
-
-class exidy_state : public driver_device
-{
-public:
- enum
- {
- TIMER_COLLISION_IRQ
- };
-
- exidy_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_dac(*this, "dac"),
- m_samples(*this, "samples"),
- m_gfxdecode(*this, "gfxdecode"),
- m_screen(*this, "screen"),
- m_palette(*this, "palette"),
- m_videoram(*this, "videoram"),
- m_sprite1_xpos(*this, "sprite1_xpos"),
- m_sprite1_ypos(*this, "sprite1_ypos"),
- m_sprite2_xpos(*this, "sprite2_xpos"),
- m_sprite2_ypos(*this, "sprite2_ypos"),
- m_spriteno(*this, "spriteno"),
- m_sprite_enable(*this, "sprite_enable"),
- m_color_latch(*this, "color_latch"),
- m_characterram(*this, "characterram") { }
-
- void base(machine_config &config);
- void mtrap(machine_config &config);
- void venture(machine_config &config);
- void fax(machine_config &config);
- void teetert(machine_config &config);
- void sidetrac(machine_config &config);
- void spectar(machine_config &config);
- void spectar_audio(machine_config &config);
- void rallys(machine_config &config);
- void pepper2(machine_config &config);
- void targ(machine_config &config);
- void targ_audio(machine_config &config);
-
- void init_fax();
- void init_sidetrac();
- void init_pepper2();
- void init_targ();
- void init_rallys();
- void init_mtrap();
- void init_teetert();
- void init_venture();
- void init_spectar();
- void init_phantoma();
-
- DECLARE_CUSTOM_INPUT_MEMBER(teetert_input_r);
-
-private:
- required_device<cpu_device> m_maincpu;
- optional_device<dac_bit_interface> m_dac;
- optional_device<samples_device> m_samples;
- required_device<gfxdecode_device> m_gfxdecode;
- required_device<screen_device> m_screen;
- required_device<palette_device> m_palette;
-
- required_shared_ptr<uint8_t> m_videoram;
- required_shared_ptr<uint8_t> m_sprite1_xpos;
- required_shared_ptr<uint8_t> m_sprite1_ypos;
- required_shared_ptr<uint8_t> m_sprite2_xpos;
- required_shared_ptr<uint8_t> m_sprite2_ypos;
- required_shared_ptr<uint8_t> m_spriteno;
- required_shared_ptr<uint8_t> m_sprite_enable;
- required_shared_ptr<uint8_t> m_color_latch;
- optional_shared_ptr<uint8_t> m_characterram;
-
- uint8_t m_last_dial;
- uint8_t m_collision_mask;
- uint8_t m_collision_invert;
- int m_is_2bpp;
- uint8_t m_int_condition;
- bitmap_ind16 m_background_bitmap;
- bitmap_ind16 m_motion_object_1_vid;
- bitmap_ind16 m_motion_object_2_vid;
- bitmap_ind16 m_motion_object_2_clip;
-
- void fax_bank_select_w(uint8_t data);
- uint8_t exidy_interrupt_r();
- void mtrap_ocl_w(uint8_t data);
-
- virtual void video_start() override;
- DECLARE_MACHINE_START(teetert);
-
- uint32_t screen_update_exidy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
-
- INTERRUPT_GEN_MEMBER(exidy_vblank_interrupt);
-
- void exidy_video_config(uint8_t _collision_mask, uint8_t _collision_invert, int _is_2bpp);
- inline void latch_condition(int collision);
- inline void set_1_color(int index, int which);
- void set_colors();
- void draw_background();
- inline int sprite_1_enabled();
- void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
- void check_collision();
-
- /* Targ and Spectar samples */
- int m_max_freq;
- uint8_t m_port_1_last;
- uint8_t m_port_2_last;
- uint8_t m_tone_freq;
- uint8_t m_tone_active;
- uint8_t m_tone_pointer;
- void targ_audio_1_w(uint8_t data);
- void targ_audio_2_w(uint8_t data);
- void spectar_audio_2_w(uint8_t data);
- void adjust_sample(uint8_t freq);
- void common_audio_start(int freq);
- SAMPLES_START_CB_MEMBER(spectar_audio_start);
- SAMPLES_START_CB_MEMBER(targ_audio_start);
-
- void exidy_map(address_map &map);
- void fax_map(address_map &map);
- void mtrap_map(address_map &map);
- void pepper2_map(address_map &map);
- void rallys_map(address_map &map);
- void sidetrac_map(address_map &map);
- void spectar_map(address_map &map);
- void targ_map(address_map &map);
- void venture_map(address_map &map);
-
-protected:
- virtual void device_timer(timer_instance const &timer) override;
-};
diff --git a/src/mame/includes/funkyjet.h b/src/mame/includes/funkyjet.h
deleted file mode 100644
index 73dce7d7c81..00000000000
--- a/src/mame/includes/funkyjet.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Bryan McPhail
-/*************************************************************************
-
- Funky Jet
-
-*************************************************************************/
-#ifndef MAME_INCLUDES_FUNKYJET_H
-#define MAME_INCLUDES_FUNKYJET_H
-
-#pragma once
-
-// mame
-#include "machine/deco146.h"
-#include "video/deco16ic.h"
-#include "video/decospr.h"
-
-// devices
-#include "cpu/h6280/h6280.h"
-
-// emu
-#include "screen.h"
-
-
-class funkyjet_state : public driver_device
-{
-public:
- funkyjet_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_spriteram(*this, "spriteram")
- , m_pf_rowscroll(*this, "pf%u_rowscroll", 1)
- , m_screen(*this, "screen")
- , m_maincpu(*this, "maincpu")
- , m_audiocpu(*this, "audiocpu")
- , m_deco146(*this, "ioprot")
- , m_sprgen(*this, "spritegen")
- , m_deco_tilegen(*this, "tilegen")
- { }
-
- void funkyjet(machine_config &config);
-
- void init_funkyjet();
-
-private:
- // memory pointers
- required_shared_ptr<uint16_t> m_spriteram;
- required_shared_ptr_array<uint16_t, 2> m_pf_rowscroll;
-
- // devices
- required_device<screen_device> m_screen;
- required_device<cpu_device> m_maincpu;
- required_device<h6280_device> m_audiocpu;
- required_device<deco146_device> m_deco146;
- required_device<decospr_device> m_sprgen;
- required_device<deco16ic_device> m_deco_tilegen;
-
- uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
-
- uint16_t funkyjet_protection_region_0_146_r(offs_t offset);
- void funkyjet_protection_region_0_146_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
- void funkyjet_map(address_map &map);
- void sound_map(address_map &map);
-};
-
-#endif // MAME_INCLUDES_FUNKYJET_H
diff --git a/src/mame/includes/goldstar.h b/src/mame/includes/goldstar.h
index c0cea98794d..f4787d28e9a 100644
--- a/src/mame/includes/goldstar.h
+++ b/src/mame/includes/goldstar.h
@@ -203,10 +203,12 @@ public:
void amcoe1(machine_config &config);
void chryangl(machine_config &config);
void ss2001(machine_config &config);
+ void super7(machine_config &config);
void amcoe1_portmap(address_map &map);
void amcoe2_portmap(address_map &map);
void cm_portmap(address_map &map);
void cm97_portmap(address_map &map);
+ void super7_portmap(address_map &map);
void chryangl_decrypted_opcodes_map(address_map &map);
void ss2001_portmap(address_map &map);
@@ -294,6 +296,7 @@ public:
void init_cb3();
void init_cb3e();
+ void init_cb3f();
void init_cherrys();
void init_chrygld();
void init_chry10();
@@ -314,6 +317,7 @@ protected:
void dump_to_file(uint8_t *rom);
uint8_t cb3_decrypt(uint8_t cipherText, uint16_t address);
+ uint8_t cb3f_decrypt(uint8_t cipherText, uint16_t address);
uint8_t chry10_decrypt(uint8_t cipherText);
};
diff --git a/src/mame/includes/gp32.h b/src/mame/includes/gp32.h
index 105567636e0..7f61a27403b 100644
--- a/src/mame/includes/gp32.h
+++ b/src/mame/includes/gp32.h
@@ -106,7 +106,7 @@ public:
m_io_in1(*this, "IN1"),
m_screen(*this, "screen"),
m_palette(*this, "palette")
- {
+ {
std::fill(std::begin(m_s3c240x_lcd_regs), std::end(m_s3c240x_lcd_regs), 0);
std::fill(std::begin(m_s3c240x_uart_0_regs), std::end(m_s3c240x_uart_0_regs), 0);
std::fill(std::begin(m_s3c240x_uart_1_regs), std::end(m_s3c240x_uart_1_regs), 0);
diff --git a/src/mame/includes/hanaawas.h b/src/mame/includes/hanaawas.h
deleted file mode 100644
index 8c5ca328efa..00000000000
--- a/src/mame/includes/hanaawas.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Zsolt Vasvari
-/*************************************************************************
-
- Hana Awase
-
-*************************************************************************/
-#ifndef MAME_INCLUDES_HANAAWAS_H
-#define MAME_INCLUDES_HANAAWAS_H
-
-#pragma once
-
-#include "emupal.h"
-#include "tilemap.h"
-
-class hanaawas_state : public driver_device
-{
-public:
- hanaawas_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_videoram(*this, "videoram"),
- m_colorram(*this, "colorram"),
- m_maincpu(*this, "maincpu"),
- m_gfxdecode(*this, "gfxdecode")
- { }
-
- void hanaawas(machine_config &config);
-
-private:
- /* memory pointers */
- required_shared_ptr<uint8_t> m_videoram;
- required_shared_ptr<uint8_t> m_colorram;
-
- /* video-related */
- tilemap_t *m_bg_tilemap;
-
- /* misc */
- int m_mux;
- uint8_t m_coin_settings;
- uint8_t m_coin_impulse;
- uint8_t hanaawas_input_port_0_r();
- void hanaawas_inputs_mux_w(uint8_t data);
- void hanaawas_videoram_w(offs_t offset, uint8_t data);
- void hanaawas_colorram_w(offs_t offset, uint8_t data);
- void key_matrix_status_w(uint8_t data);
- void irq_ack_w(uint8_t data);
- TILE_GET_INFO_MEMBER(get_bg_tile_info);
- virtual void machine_start() override;
- virtual void machine_reset() override;
- virtual void video_start() override;
- void hanaawas_palette(palette_device &palette) const;
- uint32_t screen_update_hanaawas(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void hanaawas_portB_w(uint8_t data);
- required_device<cpu_device> m_maincpu;
- required_device<gfxdecode_device> m_gfxdecode;
- void hanaawas_map(address_map &map);
- void io_map(address_map &map);
-};
-
-#endif // MAME_INCLUDES_HANAAWAS_H
diff --git a/src/mame/includes/harddriv.h b/src/mame/includes/harddriv.h
index 95d60d38a87..5a8b23eea63 100644
--- a/src/mame/includes/harddriv.h
+++ b/src/mame/includes/harddriv.h
@@ -306,6 +306,8 @@ protected:
optional_device<mc68681_device> m_duartn68681;
required_device<adc0808_device> m_adc8;
output_finder<2> m_lamps;
+ output_finder<4> m_sel;
+ output_finder<> m_wheel;
uint8_t m_hd34010_host_access;
diff --git a/src/mame/includes/hng64.h b/src/mame/includes/hng64.h
index 13ed54c51a1..6d77879759b 100644
--- a/src/mame/includes/hng64.h
+++ b/src/mame/includes/hng64.h
@@ -5,38 +5,19 @@
#pragma once
-#include "machine/msm6242.h"
-#include "machine/timer.h"
#include "cpu/mips/mips3.h"
#include "cpu/nec/v5x.h"
-#include "sound/l7a1045_l6028_dsp_a.h"
-#include "video/poly.h"
#include "cpu/tlcs870/tlcs870.h"
#include "machine/mb8421.h"
+#include "machine/msm6242.h"
+#include "machine/timer.h"
+#include "sound/l7a1045_l6028_dsp_a.h"
+#include "video/poly.h"
+
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
-enum hng64trans_t
-{
- HNG64_TILEMAP_NORMAL = 1,
- HNG64_TILEMAP_ADDITIVE,
- HNG64_TILEMAP_ALPHA
-};
-
-struct blit_parameters
-{
- bitmap_rgb32 * bitmap;
- rectangle cliprect;
- uint32_t tilemap_priority_code;
- uint8_t mask;
- uint8_t value;
- uint8_t alpha;
- hng64trans_t drawformat;
-};
-
-#define HNG64_MASTER_CLOCK 50000000
-
/////////////////
/// 3d Engine ///
@@ -141,14 +122,7 @@ class hng64_lamps_device : public device_t
public:
hng64_lamps_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- auto lamps0_out_cb() { return m_lamps_out_cb[0].bind(); }
- auto lamps1_out_cb() { return m_lamps_out_cb[1].bind(); }
- auto lamps2_out_cb() { return m_lamps_out_cb[2].bind(); }
- auto lamps3_out_cb() { return m_lamps_out_cb[3].bind(); }
- auto lamps4_out_cb() { return m_lamps_out_cb[4].bind(); }
- auto lamps5_out_cb() { return m_lamps_out_cb[5].bind(); }
- auto lamps6_out_cb() { return m_lamps_out_cb[6].bind(); }
- auto lamps7_out_cb() { return m_lamps_out_cb[7].bind(); }
+ template <unsigned N> auto lamps_out_cb() { return m_lamps_out_cb[N].bind(); }
void lamps_w(offs_t offset, uint8_t data) { m_lamps_out_cb[offset](data); }
@@ -191,7 +165,6 @@ public:
m_idt7133_dpram(*this, "com_ram"),
m_gfxdecode(*this, "gfxdecode"),
m_in(*this, "IN%u", 0U),
- m_an_in(*this, "AN%u", 0U),
m_samsho64_3d_hack(0),
m_roadedge_3d_hack(0)
{ }
@@ -214,17 +187,36 @@ public:
required_device<palette_device> m_palette;
private:
+ static constexpr int HNG64_MASTER_CLOCK = 50'000'000;
+
/* TODO: NOT measured! */
- const int PIXEL_CLOCK = (HNG64_MASTER_CLOCK*2)/4; // x 2 is due to the interlaced screen ...
+ static constexpr int PIXEL_CLOCK = (HNG64_MASTER_CLOCK*2)/4; // x 2 is due to the interlaced screen ...
- const int HTOTAL = 0x200+0x100;
- const int HBEND = 0;
- const int HBSTART = 0x200;
+ static constexpr int HTOTAL = 0x200+0x100;
+ static constexpr int HBEND = 0;
+ static constexpr int HBSTART = 0x200;
- const int VTOTAL = 264*2;
- const int VBEND = 0;
- const int VBSTART = 224*2;
+ static constexpr int VTOTAL = 264*2;
+ static constexpr int VBEND = 0;
+ static constexpr int VBSTART = 224*2;
+ enum hng64trans_t
+ {
+ HNG64_TILEMAP_NORMAL = 1,
+ HNG64_TILEMAP_ADDITIVE,
+ HNG64_TILEMAP_ALPHA
+ };
+
+ struct blit_parameters
+ {
+ bitmap_rgb32 * bitmap;
+ rectangle cliprect;
+ uint32_t tilemap_priority_code;
+ uint8_t mask;
+ uint8_t value;
+ uint8_t alpha;
+ hng64trans_t drawformat;
+ };
required_device<mips3_device> m_maincpu;
required_device<v53a_device> m_audiocpu;
@@ -257,17 +249,8 @@ private:
required_device<gfxdecode_device> m_gfxdecode;
required_ioport_array<8> m_in;
- required_ioport_array<8> m_an_in;
-
- void hng64_default_lamps0_w(uint8_t data) { logerror("lamps0 %02x\n", data); }
- void hng64_default_lamps1_w(uint8_t data) { logerror("lamps1 %02x\n", data); }
- void hng64_default_lamps2_w(uint8_t data) { logerror("lamps2 %02x\n", data); }
- void hng64_default_lamps3_w(uint8_t data) { logerror("lamps3 %02x\n", data); }
- void hng64_default_lamps4_w(uint8_t data) { logerror("lamps4 %02x\n", data); }
- void hng64_default_lamps5_w(uint8_t data) { logerror("lamps5 %02x\n", data); }
- void hng64_default_lamps6_w(uint8_t data) { logerror("lamps6 %02x\n", data); }
- void hng64_default_lamps7_w(uint8_t data) { logerror("lamps7 %02x\n", data); }
+ template <unsigned N> void hng64_default_lamps_w(uint8_t data) { logerror("lamps%u %02x\n", N, data); }
void hng64_drive_lamps7_w(uint8_t data);
void hng64_drive_lamps6_w(uint8_t data);
@@ -405,16 +388,6 @@ private:
// unknown access
void ioport4_w(uint8_t data);
- // analog input access
- uint8_t anport0_r();
- uint8_t anport1_r();
- uint8_t anport2_r();
- uint8_t anport3_r();
- uint8_t anport4_r();
- uint8_t anport5_r();
- uint8_t anport6_r();
- uint8_t anport7_r();
-
DECLARE_WRITE_LINE_MEMBER( sio0_w );
uint8_t m_port7;
@@ -470,6 +443,7 @@ private:
uint32_t startx, uint32_t starty, int incxx, int incxy, int incyx, int incyy,
int wraparound, uint32_t flags, uint8_t priority, uint8_t priority_mask, hng64trans_t drawformat);
+ static void hng64_configure_blit_parameters(blit_parameters *blit, tilemap_t *tmap, bitmap_rgb32 &dest, const rectangle &cliprect, uint32_t flags, uint8_t priority, uint8_t priority_mask, hng64trans_t drawformat);
diff --git a/src/mame/includes/kncljoe.h b/src/mame/includes/kncljoe.h
index 331d95499c1..b73796af13f 100644
--- a/src/mame/includes/kncljoe.h
+++ b/src/mame/includes/kncljoe.h
@@ -2,16 +2,19 @@
// copyright-holders:Ernesto Corvi
/*************************************************************************
- Knuckle Joe
+ Knuckle Joe
*************************************************************************/
-#ifndef MAME_INCLUDES_BLOODBRO_H
-#define MAME_INCLUDES_BLOODBRO_H
+
+#ifndef MAME_INCLUDES_KNCLJOE_H
+#define MAME_INCLUDES_KNCLJOE_H
#pragma once
+#include "cpu/m6800/m6801.h"
#include "machine/gen_latch.h"
#include "sound/ay8910.h"
+
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
@@ -53,7 +56,7 @@ private:
/* devices */
required_device<cpu_device> m_maincpu;
- required_device<cpu_device> m_soundcpu;
+ required_device<m6803_cpu_device> m_soundcpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
@@ -82,4 +85,4 @@ private:
void sound_map(address_map &map);
};
-#endif // MAME_INCLUDES_BLOODBRO_H
+#endif // MAME_INCLUDES_KNCLJOE_H
diff --git a/src/mame/includes/megadriv.h b/src/mame/includes/megadriv.h
index 45d9da2dc01..3baa118e0e6 100644
--- a/src/mame/includes/megadriv.h
+++ b/src/mame/includes/megadriv.h
@@ -73,7 +73,6 @@ struct genesis_z80_vars
genesis_z80_vars m_genz80;
int m_version_hi_nibble;
- void init_megadriv_c2();
void init_megadrie();
void init_megadriv();
void init_megadrij();
diff --git a/src/mame/includes/n8080.h b/src/mame/includes/n8080.h
index 50b20014732..466c8e9a105 100644
--- a/src/mame/includes/n8080.h
+++ b/src/mame/includes/n8080.h
@@ -19,6 +19,7 @@ public:
n8080_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
+ m_prom(*this, "proms"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_n8080_dac(*this, "n8080_dac"),
@@ -37,9 +38,9 @@ protected:
virtual void delayed_sound_1(int data);
virtual void delayed_sound_2(int data);
-//private:
/* memory pointers */
required_shared_ptr<uint8_t> m_videoram;
+ optional_memory_region m_prom;
/* video-related */
int m_sheriff_color_mode;
@@ -58,7 +59,7 @@ protected:
int m_inte;
/* devices */
- required_device<i8080_cpu_device> m_maincpu;
+ required_device<i8080a_cpu_device> m_maincpu;
required_device<i8035_device> m_audiocpu;
optional_device<dac_bit_interface> m_n8080_dac;
optional_device<sn76477_device> m_sn;
@@ -97,7 +98,8 @@ class spacefev_state : public n8080_state
{
public:
spacefev_state(const machine_config &mconfig, device_type type, const char *tag) :
- n8080_state(mconfig, type, tag)
+ n8080_state(mconfig, type, tag),
+ m_video_conf(*this, "VIDEO")
{ }
void spacefev(machine_config &config);
@@ -114,6 +116,8 @@ protected:
virtual void delayed_sound_2(int data) override;
private:
+ required_ioport m_video_conf;
+
void spacefev_sound(machine_config &config);
TIMER_DEVICE_CALLBACK_MEMBER(vco_voltage_timer);
@@ -158,7 +162,8 @@ public:
helifire_state(const machine_config &mconfig, device_type type, const char *tag) :
n8080_state(mconfig, type, tag),
m_dac(*this, "helifire_dac"),
- m_colorram(*this, "colorram")
+ m_colorram(*this, "colorram"),
+ m_pot(*this, "POT%u", 0)
{ }
void helifire(machine_config &config);
@@ -191,6 +196,7 @@ private:
required_device<dac_8bit_r2r_device> m_dac;
required_shared_ptr<uint8_t> m_colorram;
+ required_ioport_array<2> m_pot;
int m_dac_phase;
double m_dac_volume;
diff --git a/src/mame/includes/namcona1.h b/src/mame/includes/namcona1.h
index 68859632533..fde88d22077 100644
--- a/src/mame/includes/namcona1.h
+++ b/src/mame/includes/namcona1.h
@@ -188,11 +188,19 @@ public:
void c70(machine_config &config);
void namcona2(machine_config &config);
+ void zelos(machine_config &config);
void init_knckhead();
void init_emeralda();
void init_numanath();
void init_quiztou();
+ void init_zelos();
+
+private:
+ u16 m_zelos_ctrl;
+
+ void zelos_ctrl_w(u16 data);
+ void zelos_main_map(address_map &map);
};
class xday2_namcona2_state : public namcona2_state
diff --git a/src/mame/includes/namcos2.h b/src/mame/includes/namcos2.h
index 82077a7105c..e6d634d4b3e 100644
--- a/src/mame/includes/namcos2.h
+++ b/src/mame/includes/namcos2.h
@@ -106,7 +106,6 @@ public:
void init_finehour();
void init_finallap();
void init_dirtfoxj();
- void init_marvlanj();
void init_sws92();
void init_dsaber();
void init_assault();
diff --git a/src/mame/includes/pc8801.h b/src/mame/includes/pc8801.h
index 321c76f0671..619d06a43e1 100644
--- a/src/mame/includes/pc8801.h
+++ b/src/mame/includes/pc8801.h
@@ -254,6 +254,7 @@ private:
void fdc_8255_c_w(uint8_t data);
uint8_t opn_porta_r();
uint8_t opn_portb_r();
+ void opna_map(address_map &map);
IRQ_CALLBACK_MEMBER(pc8801_irq_callback);
DECLARE_WRITE_LINE_MEMBER(pc8801_sound_irq);
};
diff --git a/src/mame/includes/pc9801.h b/src/mame/includes/pc9801.h
index 6211e697b9b..c33282530df 100644
--- a/src/mame/includes/pc9801.h
+++ b/src/mame/includes/pc9801.h
@@ -1,5 +1,11 @@
// license:BSD-3-Clause
// copyright-holders:Angelo Salese,Carl
+/******************************************
+ *
+ * NEC PC-9801
+ *
+ ******************************************/
+
#ifndef MAME_INCLUDES_PC9801_H
#define MAME_INCLUDES_PC9801_H
@@ -9,6 +15,7 @@
#include "cpu/i86/i286.h"
#include "cpu/i86/i86.h"
#include "cpu/nec/nec.h"
+#include "cpu/nec/v5x.h"
#include "imagedev/floppy.h"
#include "machine/am9517a.h"
@@ -17,12 +24,13 @@
#include "machine/i8251.h"
#include "machine/i8255.h"
#include "machine/output_latch.h"
+#include "machine/pc9801_memsw.h"
#include "machine/pic8259.h"
#include "machine/pit8253.h"
#include "machine/ram.h"
#include "machine/timer.h"
#include "machine/upd1990a.h"
-#include "machine/pc9801_memsw.h"
+#include "machine/upd4991a.h"
#include "machine/upd765.h"
#include "bus/scsi/pc9801_sasi.h"
@@ -37,6 +45,7 @@
#include "video/upd7220.h"
#include "bus/cbus/pc9801_26.h"
+#include "bus/cbus/pc9801_55.h"
#include "bus/cbus/pc9801_86.h"
#include "bus/cbus/pc9801_118.h"
#include "bus/cbus/pc9801_amd98.h"
@@ -61,8 +70,7 @@
#include "formats/dip_dsk.h"
#include "formats/nfd_dsk.h"
-
-#define UPD1990A_TAG "upd1990a"
+#define RTC_TAG "rtc"
#define UPD8251_TAG "upd8251"
#define SASIBUS_TAG "sasi"
@@ -77,156 +85,136 @@
#define ANALOG_256_MODE (0x20 >> 1)
#define GDC_IS_5MHz (0x84 >> 1)
-class pc9801_state : public driver_device
+class pc98_base_state : public driver_device
{
public:
- pc9801_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_dmac(*this, "i8237"),
- m_pit8253(*this, "pit8253"),
- m_pic1(*this, "pic8259_master"),
- m_pic2(*this, "pic8259_slave"),
- m_ppi_sys(*this, "ppi8255_sys"),
- m_ppi_prn(*this, "ppi8255_prn"),
- m_fdc_2hd(*this, "upd765_2hd"),
- m_fdc_2dd(*this, "upd765_2dd"),
- m_rtc(*this, UPD1990A_TAG),
- m_memsw(*this, "memsw"),
- m_keyb(*this, "keyb"),
- m_sio(*this, UPD8251_TAG),
- m_hgdc1(*this, "upd7220_chr"),
- m_hgdc2(*this, "upd7220_btm"),
- m_sasibus(*this, SASIBUS_TAG),
- m_sasi_data_out(*this, "sasi_data_out"),
- m_sasi_data_in(*this, "sasi_data_in"),
- m_sasi_ctrl_in(*this, "sasi_ctrl_in"),
- m_ide(*this, "ide%u", 1U),
- m_video_ram_1(*this, "video_ram_1"),
- m_video_ram_2(*this, "video_ram_2"),
- m_ext_gvram(*this, "ext_gvram"),
- m_beeper(*this, "beeper"),
- m_dac(*this, "dac"),
- m_ram(*this, RAM_TAG),
- m_ipl(*this, "ipl_bank"),
- m_gfxdecode(*this, "gfxdecode"),
- m_palette(*this, "palette"),
- m_screen(*this, "screen")
+ pc98_base_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_gfxdecode(*this, "gfxdecode")
+ , m_palette(*this, "palette")
+ , m_screen(*this, "screen")
+ , m_keyb(*this, "keyb")
+ , m_rtc(*this, RTC_TAG)
+ , m_ppi_sys(*this, "ppi_sys")
+ , m_ppi_prn(*this, "ppi_prn")
+ , m_beeper(*this, "beeper")
{
}
- void pc9801(machine_config &config);
+ DECLARE_CUSTOM_INPUT_MEMBER(system_type_r);
- void pc9801vm(machine_config &config);
+protected:
+ required_device<gfxdecode_device> m_gfxdecode;
+ required_device<palette_device> m_palette;
+ required_device<screen_device> m_screen;
+ required_device<pc9801_kbd_device> m_keyb;
+ optional_device<upd1990a_device> m_rtc;
+ required_device<i8255_device> m_ppi_sys;
+ required_device<i8255_device> m_ppi_prn;
+ optional_device<beep_device> m_beeper;
- void pc9801ux(machine_config &config);
- void pc9801rs(machine_config &config);
+ void rtc_w(uint8_t data);
+ void ppi_sys_beep_portc_w(uint8_t data);
- void pc9801bx2(machine_config &config);
+ static void floppy_formats(format_registration &fr);
- void pc9821(machine_config &config);
- void pc9821as(machine_config &config);
- void pc9821ap2(machine_config &config);
- void pc9821xa16(machine_config &config);
- void pc9821ra20(machine_config &config);
- void pc9821ra333(machine_config &config);
- void pc9821v20(machine_config &config);
+ u8 m_sys_type;
+};
- void pc386m(machine_config &config);
- void pc486mu(machine_config &config);
- void pc486se(machine_config &config);
+class pc9801_state : public pc98_base_state
+{
+public:
+ pc9801_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc98_base_state(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_ipl(*this, "ipl_bank")
+ , m_dmac(*this, "i8237")
+ , m_pit(*this, "pit")
+ , m_dsw1(*this, "DSW1")
+ , m_dsw2(*this, "DSW2")
+ , m_ppi_mouse(*this, "ppi_mouse")
+ , m_fdc_2hd(*this, "upd765_2hd")
+ , m_fdc_2dd(*this, "upd765_2dd")
+ , m_ram(*this, RAM_TAG)
+ , m_hgdc(*this, "hgdc%d", 1)
+ , m_video_ram(*this, "video_ram_%d", 1)
+ , m_cbus(*this, "cbus%d", 0)
+ , m_pic1(*this, "pic8259_master")
+ , m_pic2(*this, "pic8259_slave")
+ , m_memsw(*this, "memsw")
+ , m_sio(*this, UPD8251_TAG)
+ , m_sasibus(*this, SASIBUS_TAG)
+ , m_sasi_data_out(*this, "sasi_data_out")
+ , m_sasi_data_in(*this, "sasi_data_in")
+ , m_sasi_ctrl_in(*this, "sasi_ctrl_in")
+ {
+ }
+
+ void pc9801(machine_config &config);
- DECLARE_CUSTOM_INPUT_MEMBER(system_type_r);
void init_pc9801_kanji();
- void init_pc9801vm_kanji();
+// Device declarations
protected:
- virtual void video_start() override;
-
- void pc9801_keyboard(machine_config &config);
- void pc9801_mouse(machine_config &config);
- void pc9801_cbus(machine_config &config);
- void pc9801_sasi(machine_config &config);
- void pc9801_ide(machine_config &config);
- void pc9801_common(machine_config &config);
- void pc9801_pit_clock(machine_config &config, const XTAL clock);
-
-private:
- static void cdrom_headphones(device_t *device);
-
required_device<cpu_device> m_maincpu;
+ optional_device<address_map_bank_device> m_ipl;
required_device<am9517a_device> m_dmac;
- required_device<pit8253_device> m_pit8253;
- required_device<pic8259_device> m_pic1;
- required_device<pic8259_device> m_pic2;
- required_device<i8255_device> m_ppi_sys;
- required_device<i8255_device> m_ppi_prn;
+ required_device<pit8253_device> m_pit;
+ required_ioport m_dsw1;
+ required_ioport m_dsw2;
+ required_device<i8255_device> m_ppi_mouse;
+ // TODO: should really be one FDC
+ // (I/O $90-$93 is a "simplified" version)
required_device<upd765a_device> m_fdc_2hd;
optional_device<upd765a_device> m_fdc_2dd;
- required_device<upd1990a_device> m_rtc;
+ optional_device<ram_device> m_ram;
+ required_device_array<upd7220_device, 2> m_hgdc;
+ required_shared_ptr_array<uint16_t, 2> m_video_ram;
+ required_device_array<pc9801_slot_device, 2> m_cbus;
+ required_device<pic8259_device> m_pic1;
+ required_device<pic8259_device> m_pic2;
+private:
required_device<pc9801_memsw_device> m_memsw;
- required_device<pc9801_kbd_device> m_keyb;
required_device<i8251_device> m_sio;
- required_device<upd7220_device> m_hgdc1;
- required_device<upd7220_device> m_hgdc2;
optional_device<scsi_port_device> m_sasibus;
optional_device<output_latch_device> m_sasi_data_out;
optional_device<input_buffer_device> m_sasi_data_in;
optional_device<input_buffer_device> m_sasi_ctrl_in;
- optional_device_array<ata_interface_device, 2> m_ide;
- required_shared_ptr<uint16_t> m_video_ram_1;
- required_shared_ptr<uint16_t> m_video_ram_2;
- optional_shared_ptr<uint32_t> m_ext_gvram;
- optional_device<beep_device> m_beeper;
-// optional_device<dac_1bit_device> m_dac;
- optional_device<speaker_sound_device> m_dac;
- optional_device<ram_device> m_ram;
- optional_device<address_map_bank_device> m_ipl;
- required_device<gfxdecode_device> m_gfxdecode;
- required_device<palette_device> m_palette;
- required_device<screen_device> m_screen;
- void rtc_w(uint8_t data);
- void dmapg4_w(offs_t offset, uint8_t data);
- void dmapg8_w(offs_t offset, uint8_t data);
- void nmi_ctrl_w(offs_t offset, uint8_t data);
- void vrtc_clear_w(uint8_t data);
- void pc9801_video_ff_w(uint8_t data);
- uint8_t txt_scrl_r(offs_t offset);
- void txt_scrl_w(offs_t offset, uint8_t data);
- uint8_t grcg_r(offs_t offset);
- void grcg_w(offs_t offset, uint8_t data);
- void egc_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+// Infrastructure declaration
+protected:
+ DECLARE_MACHINE_START(pc9801_common);
+ DECLARE_MACHINE_RESET(pc9801_common);
+
+ void pc9801_keyboard(machine_config &config);
+ void pc9801_mouse(machine_config &config);
+ void pc9801_cbus(machine_config &config);
+ void pc9801_sasi(machine_config &config);
+ void pc9801_common(machine_config &config);
+ void config_floppy_525hd(machine_config &config);
+ void config_floppy_35hd(machine_config &config);
+
+ void pit_clock_config(machine_config &config, const XTAL clock);
+
+ void pc9801_common_io(address_map &map);
+ void ipl_bank(address_map &map);
+
uint8_t pc9801_a0_r(offs_t offset);
void pc9801_a0_w(offs_t offset, uint8_t data);
- uint8_t fdc_2hd_ctrl_r();
- void fdc_2hd_ctrl_w(uint8_t data);
- uint8_t fdc_2dd_ctrl_r();
- void fdc_2dd_ctrl_w(uint8_t data);
- uint16_t tvram_r(offs_t offset, uint16_t mem_mask = ~0);
- void tvram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
- uint8_t gvram_r(offs_t offset);
- void gvram_w(offs_t offset, uint8_t data);
- void pc9801rs_mouse_freq_w(offs_t offset, uint8_t data);
- uint16_t grcg_gvram_r(offs_t offset, uint16_t mem_mask = ~0);
- void grcg_gvram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
- uint16_t grcg_gvram0_r(offs_t offset, uint16_t mem_mask = ~0);
- void grcg_gvram0_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+ u8 unk_r(offs_t offset);
+ uint8_t f0_r(offs_t offset);
- uint16_t pc9821_grcg_gvram_r(offs_t offset, uint16_t mem_mask = ~0);
- void pc9821_grcg_gvram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
- uint16_t pc9821_grcg_gvram0_r(offs_t offset, uint16_t mem_mask = ~0);
- void pc9821_grcg_gvram0_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+ uint8_t m_nmi_ff;
- uint16_t upd7220_grcg_r(offs_t offset, uint16_t mem_mask = ~0);
- void upd7220_grcg_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+ virtual u8 ppi_prn_portb_r();
- uint8_t ide_ctrl_r();
- void ide_ctrl_w(uint8_t data);
- uint16_t ide_cs0_r(offs_t offset, uint16_t mem_mask = ~0);
- void ide_cs0_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
- uint16_t ide_cs1_r(offs_t offset, uint16_t mem_mask = ~0);
- void ide_cs1_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+private:
+ void pc9801_io(address_map &map);
+ void pc9801_map(address_map &map);
+
+ void nmi_ctrl_w(offs_t offset, uint8_t data);
+
+ u8 ppi_sys_portb_r();
void sasi_data_w(uint8_t data);
uint8_t sasi_data_r();
@@ -235,84 +223,46 @@ private:
uint8_t sasi_status_r();
void sasi_ctrl_w(uint8_t data);
- uint8_t pc9801rs_knjram_r(offs_t offset);
- void pc9801rs_knjram_w(offs_t offset, uint8_t data);
- void pc9801rs_bank_w(offs_t offset, uint8_t data);
- uint8_t f0_r(offs_t offset);
-
- uint8_t a20_ctrl_r(offs_t offset);
- void a20_ctrl_w(offs_t offset, uint8_t data);
- uint8_t fdc_mode_ctrl_r();
- void fdc_mode_ctrl_w(uint8_t data);
-// uint8_t pc9801rs_2dd_r();
-// void pc9801rs_2dd_w(uint8_t data);
- void pc9801rs_video_ff_w(offs_t offset, uint8_t data);
- void pc9801rs_a0_w(offs_t offset, uint8_t data);
- void pc9821_video_ff_w(offs_t offset, uint8_t data);
- uint8_t pc9821_a0_r(offs_t offset);
- void pc9821_a0_w(offs_t offset, uint8_t data);
- uint8_t access_ctrl_r(offs_t offset);
- void access_ctrl_w(offs_t offset, uint8_t data);
- uint8_t midi_r();
// uint8_t winram_r();
// void winram_w(uint8_t data);
+
+ DECLARE_MACHINE_START(pc9801f);
+ DECLARE_MACHINE_RESET(pc9801f);
+
+// PIC
+protected:
uint8_t pic_r(offs_t offset);
void pic_w(offs_t offset, uint8_t data);
+private:
+ uint8_t get_slave_ack(offs_t offset);
- uint8_t sdip_0_r(offs_t offset);
- uint8_t sdip_1_r(offs_t offset);
- uint8_t sdip_2_r(offs_t offset);
- uint8_t sdip_3_r(offs_t offset);
- uint8_t sdip_4_r(offs_t offset);
- uint8_t sdip_5_r(offs_t offset);
- uint8_t sdip_6_r(offs_t offset);
- uint8_t sdip_7_r(offs_t offset);
- uint8_t sdip_8_r(offs_t offset);
- uint8_t sdip_9_r(offs_t offset);
- uint8_t sdip_a_r(offs_t offset);
- uint8_t sdip_b_r(offs_t offset);
-
- void sdip_0_w(offs_t offset, uint8_t data) ;
- void sdip_1_w(offs_t offset, uint8_t data) ;
- void sdip_2_w(offs_t offset, uint8_t data) ;
- void sdip_3_w(offs_t offset, uint8_t data) ;
- void sdip_4_w(offs_t offset, uint8_t data) ;
- void sdip_5_w(offs_t offset, uint8_t data) ;
- void sdip_6_w(offs_t offset, uint8_t data) ;
- void sdip_7_w(offs_t offset, uint8_t data) ;
- void sdip_8_w(offs_t offset, uint8_t data) ;
- void sdip_9_w(offs_t offset, uint8_t data) ;
- void sdip_a_w(offs_t offset, uint8_t data) ;
- void sdip_b_w(offs_t offset, uint8_t data) ;
-
- uint8_t as_unkdev_data_r(offs_t offset);
- void as_unkdev_data_w(offs_t offset, uint8_t data);
- void as_unkdev_addr_w(offs_t offset, uint8_t data);
-
- uint8_t window_bank_r(offs_t offset);
- void window_bank_w(offs_t offset, uint8_t data);
- uint16_t timestamp_r(offs_t offset);
- uint8_t ext2_video_ff_r();
- void ext2_video_ff_w(uint8_t data);
+// FDC
+protected:
+ uint8_t fdc_2hd_ctrl_r();
+ void fdc_2hd_ctrl_w(uint8_t data);
- static void floppy_formats(format_registration &fr);
- UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
- UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text );
+ u8 m_fdc_2hd_ctrl;
- DECLARE_MACHINE_START(pc9801_common);
- DECLARE_MACHINE_START(pc9801f);
- DECLARE_MACHINE_START(pc9801rs);
- DECLARE_MACHINE_START(pc9801bx2);
- DECLARE_MACHINE_START(pc9821);
- DECLARE_MACHINE_START(pc9821ap2);
- DECLARE_MACHINE_RESET(pc9801_common);
- DECLARE_MACHINE_RESET(pc9801f);
- DECLARE_MACHINE_RESET(pc9801rs);
- DECLARE_MACHINE_RESET(pc9821);
+ bool fdc_drive_ready_r(upd765a_device *fdc);
+private:
+ DECLARE_WRITE_LINE_MEMBER(fdc_2dd_irq);
+
+ uint8_t fdc_2dd_ctrl_r();
+ void fdc_2dd_ctrl_w(uint8_t data);
+
+ u8 m_fdc_2dd_ctrl;
+
+// DMA
+protected:
+ uint8_t m_dma_offset[4];
+ uint8_t m_dma_autoinc[4];
+ int m_dack;
+
+private:
+ void dmapg4_w(offs_t offset, uint8_t data);
+
+ inline void set_dma_channel(int channel, int state);
- void pc9801_palette(palette_device &palette) const;
- DECLARE_WRITE_LINE_MEMBER(vrtc_irq);
- uint8_t get_slave_ack(offs_t offset);
DECLARE_WRITE_LINE_MEMBER(dma_hrq_changed);
DECLARE_WRITE_LINE_MEMBER(tc_w);
uint8_t dma_read_byte(offs_t offset);
@@ -321,71 +271,73 @@ private:
DECLARE_WRITE_LINE_MEMBER(dack1_w);
DECLARE_WRITE_LINE_MEMBER(dack2_w);
DECLARE_WRITE_LINE_MEMBER(dack3_w);
- void ppi_sys_beep_portc_w(uint8_t data);
- void ppi_sys_dac_portc_w(uint8_t data);
-
- DECLARE_WRITE_LINE_MEMBER(fdc_2dd_irq);
- DECLARE_WRITE_LINE_MEMBER(pc9801rs_fdc_irq);
- DECLARE_WRITE_LINE_MEMBER(pc9801rs_fdc_drq);
-
- uint8_t ppi_mouse_porta_r();
- void ppi_mouse_porta_w(uint8_t data);
- void ppi_mouse_portb_w(uint8_t data);
- void ppi_mouse_portc_w(uint8_t data);
- TIMER_DEVICE_CALLBACK_MEMBER( mouse_irq_cb );
- uint8_t unk_r();
-
- uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- uint32_t a20_286(bool state);
- void ipl_bank(address_map &map);
- void pc9801_common_io(address_map &map);
- void pc9801_io(address_map &map);
- void pc9801_map(address_map &map);
- void pc9801rs_io(address_map &map);
- void pc9801rs_map(address_map &map);
- void pc9801ux_io(address_map &map);
- void pc9801ux_map(address_map &map);
- void pc9821_io(address_map &map);
- void pc9821_map(address_map &map);
- void pc9821as_io(address_map &map);
+// Video
+protected:
void upd7220_1_map(address_map &map);
void upd7220_2_map(address_map &map);
- void upd7220_grcg_2_map(address_map &map);
- enum
- {
- TIMER_VBIRQ
- };
+ UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
+
+ virtual void video_start() override;
+ void pc9801_palette(palette_device &palette) const;
- inline void set_dma_channel(int channel, int state);
uint8_t *m_char_rom;
uint8_t *m_kanji_rom;
- uint8_t m_dma_offset[4];
- uint8_t m_dma_autoinc[4];
- int m_dack;
+ struct {
+ uint8_t mode;
+ uint8_t tile[4], tile_index;
+ }m_grcg;
- uint8_t m_video_ff[8],m_gfx_ff;
- uint8_t m_txt_scroll_reg[8];
- uint8_t m_pal_clut[4];
+ enum
+ {
+ TIMER_VBIRQ,
+ TIMER_FDC_TRIGGER
+ };
- std::unique_ptr<uint16_t[]> m_tvram;
+ uint16_t tvram_r(offs_t offset, uint16_t mem_mask = ~0);
+ void tvram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+ uint8_t gvram_r(offs_t offset);
+ void gvram_w(offs_t offset, uint8_t data);
+ uint8_t grcg_r(offs_t offset);
+ void grcg_w(offs_t offset, uint8_t data);
+
+ void pc9801_video_ff_w(uint8_t data);
uint16_t m_font_addr;
- uint8_t m_font_line;
uint16_t m_font_lr;
+ uint8_t m_video_ff[8];
+ // TODO: move to derived state
+ uint8_t m_ex_video_ff[128];
+ u8 m_vram_bank;
+ u8 m_vram_disp;
- uint8_t m_fdc_2dd_ctrl,m_fdc_2hd_ctrl;
- uint8_t m_nmi_ff;
+private:
+ UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text );
+
+ DECLARE_WRITE_LINE_MEMBER(vrtc_irq);
+ void vrtc_clear_w(uint8_t data);
+ uint8_t txt_scrl_r(offs_t offset);
+ void txt_scrl_w(offs_t offset, uint8_t data);
+
+ // TODO: make this virtual
+ // (necessary for H98 high-reso mode, PC9821-E02, SVGA binds)
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- uint8_t m_vram_bank;
- uint8_t m_vram_disp;
+ uint8_t m_font_line;
+ std::unique_ptr<uint16_t[]> m_tvram;
+ uint8_t m_gfx_ff;
+ uint8_t m_txt_scroll_reg[8];
+ uint8_t m_pal_clut[4];
+// SASI
uint8_t m_sasi_data;
int m_sasi_data_enable;
uint8_t m_sasi_ctrl;
+// Mouse
+protected:
struct{
uint8_t control;
uint8_t lx, ly;
@@ -395,41 +347,130 @@ private:
uint8_t freq_index;
}m_mouse;
- uint8_t m_ide_sel;
+private:
+ u8 ppi_mouse_porta_r();
+ void ppi_mouse_porta_w(uint8_t data);
+ void ppi_mouse_portb_w(uint8_t data);
+ void ppi_mouse_portc_w(uint8_t data);
+
+ TIMER_DEVICE_CALLBACK_MEMBER( mouse_irq_cb );
+};
+
+/**********************************************************
+ *
+ * VM class
+ *
+ **********************************************************/
+
+class pc9801vm_state : public pc9801_state
+{
+public:
+ pc9801vm_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc9801_state(mconfig, type, tag)
+ , m_dsw3(*this, "DSW3")
+ , m_ide(*this, "ide%u", 1U)
+ , m_dac1bit(*this, "dac1bit")
+ {
+ }
+
+ void pc9801vm(machine_config &config);
+
+ void pc9801ux(machine_config &config);
+ void pc9801vx(machine_config &config);
+ void pc9801rs(machine_config &config);
+
+ void init_pc9801vm_kanji();
+
+protected:
+ void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ void pc9801rs_io(address_map &map);
+ void pc9801rs_map(address_map &map);
+
+ uint16_t grcg_gvram_r(offs_t offset, uint16_t mem_mask = ~0);
+ void grcg_gvram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+ uint16_t grcg_gvram0_r(offs_t offset, uint16_t mem_mask = ~0);
+ void grcg_gvram0_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+
+ uint16_t upd7220_grcg_r(offs_t offset, uint16_t mem_mask = ~0);
+ void upd7220_grcg_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+
+ void upd7220_grcg_2_map(address_map &map);
+
+ void pc9801_ide(machine_config &config);
+ static void cdrom_headphones(device_t *device);
+
+ void pc9801rs_video_ff_w(offs_t offset, uint8_t data);
+ void pc9801rs_a0_w(offs_t offset, uint8_t data);
+
+ uint8_t ide_ctrl_r();
+ void ide_ctrl_w(uint8_t data);
+ uint16_t ide_cs0_r(offs_t offset, uint16_t mem_mask = ~0);
+ void ide_cs0_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+ uint16_t ide_cs1_r(offs_t offset, uint16_t mem_mask = ~0);
+ void ide_cs1_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+
+ void dmapg8_w(offs_t offset, uint8_t data);
+
+ uint16_t timestamp_r(offs_t offset);
+
+ void ppi_sys_dac_portc_w(uint8_t data);
+ virtual u8 ppi_prn_portb_r() override;
+
+ DECLARE_MACHINE_START(pc9801rs);
+ DECLARE_MACHINE_RESET(pc9801rs);
+
+ u8 m_gate_a20;
+ u8 m_dma_access_ctrl;
+ u8 m_ide_sel;
// starting from PC9801VF/U buzzer is substituted with a DAC1BIT
- bool m_dac_disable;
+ bool m_dac1bit_disable;
- /* PC9801RS specific, move to specific state */
- uint8_t m_gate_a20; //A20 line
- uint8_t m_access_ctrl; // DMA related
- uint8_t m_fdc_ctrl;
- uint8_t m_ex_video_ff[128];
+ required_ioport m_dsw3;
+private:
+ optional_device_array<ata_interface_device, 2> m_ide;
+// optional_device<dac_1bit_device> m_dac1bit;
+ required_device<speaker_sound_device> m_dac1bit;
+
+ void pc9801ux_io(address_map &map);
+ void pc9801ux_map(address_map &map);
+
+ uint32_t a20_286(bool state);
+
+ uint8_t pc9801rs_knjram_r(offs_t offset);
+ void pc9801rs_knjram_w(offs_t offset, uint8_t data);
+ void pc9801rs_bank_w(offs_t offset, uint8_t data);
+ uint8_t midi_r();
+
+ // 286-based machines except for PC98XA
+ u8 dma_access_ctrl_r(offs_t offset);
+ void dma_access_ctrl_w(offs_t offset, u8 data);
+
+ uint8_t a20_ctrl_r(offs_t offset);
+ void a20_ctrl_w(offs_t offset, uint8_t data);
+
+ template <unsigned port> u8 fdc_2hd_2dd_ctrl_r();
+ template <unsigned port> void fdc_2hd_2dd_ctrl_w(u8 data);
+
+ DECLARE_WRITE_LINE_MEMBER(fdc_irq_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
+
+ emu_timer *m_fdc_timer;
+
+ u8 m_fdc_mode;
+ u8 fdc_mode_r();
+ void fdc_mode_w(u8 data);
+ void fdc_set_density_mode(bool is_2hd);
+
+protected:
struct {
uint8_t pal_entry;
uint8_t r[16],g[16],b[16];
}m_analog16;
- struct {
- uint8_t pal_entry;
- uint8_t r[0x100],g[0x100],b[0x100];
- uint16_t bank[2];
- }m_analog256;
- struct {
- uint8_t mode;
- uint8_t tile[4], tile_index;
- }m_grcg;
-
- void egc_blit_w(uint32_t offset, uint16_t data, uint16_t mem_mask);
- uint16_t egc_blit_r(uint32_t offset, uint16_t mem_mask);
-
-
- /* PC9821 specific */
- uint8_t m_sdip[24], m_sdip_bank;
- uint8_t m_unkdev0468[0x100], m_unkdev0468_addr;
- uint8_t m_pc9821_window_bank;
- uint8_t m_ext2_ff;
- uint8_t m_sys_type;
+private:
+ // EGC, PC9801VX onward
struct {
uint16_t regs[8];
uint16_t pat[4];
@@ -440,13 +481,76 @@ private:
bool init;
} m_egc;
- uint16_t m_pc9821_256vram_bank;
+protected:
+ void egc_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+private:
+ void egc_blit_w(uint32_t offset, uint16_t data, uint16_t mem_mask);
+ uint16_t egc_blit_r(uint32_t offset, uint16_t mem_mask);
- uint8_t m_sdip_read(uint16_t port, uint8_t sdip_offset);
- void m_sdip_write(uint16_t port, uint8_t sdip_offset,uint8_t data);
uint16_t egc_do_partial_op(int plane, uint16_t src, uint16_t pat, uint16_t dst) const;
uint16_t egc_shift(int plane, uint16_t val);
uint16_t egc_color_pat(int plane) const;
+
+protected:
+ u8 mouse_freq_r(offs_t offset);
+ void mouse_freq_w(offs_t offset, u8 data);
+
+ u8 ppi_mouse_portb_r();
+ u8 ppi_mouse_portc_r();
+};
+
+class pc9801us_state : public pc9801vm_state
+{
+public:
+ pc9801us_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc9801vm_state(mconfig, type, tag)
+ {
+ }
+ void pc9801us(machine_config &config);
+
+protected:
+ void pc9801us_io(address_map &map);
+
+ DECLARE_MACHINE_START(pc9801us);
+
+
+ // SDIP, PC9801DA onward
+protected:
+ u8 m_sdip[24];
+private:
+ u8 m_sdip_bank;
+ template<unsigned port> u8 sdip_r(offs_t offset);
+ template<unsigned port> void sdip_w(offs_t offset, u8 data);
+ void sdip_bank_w(offs_t offset, u8 data);
+};
+
+/**********************************************************
+ *
+ * BX class ("98Fellow")
+ *
+ **********************************************************/
+
+class pc9801bx_state : public pc9801us_state
+{
+public:
+ pc9801bx_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc9801us_state(mconfig, type, tag)
+ {
+ }
+
+ void pc9801bx2(machine_config &config);
+
+protected:
+ void pc9801bx2_io(address_map &map);
+ void pc9801bx2_map(address_map &map);
+
+ DECLARE_MACHINE_START(pc9801bx2);
+ DECLARE_MACHINE_RESET(pc9801bx2);
+
+private:
+ u8 i486_cpu_mode_r(offs_t offset);
+ u8 gdc_31kHz_r(offs_t offset);
+ void gdc_31kHz_w(offs_t offset, u8 data);
};
#endif // MAME_INCLUDES_PC9801_H
diff --git a/src/mame/includes/pc9801_epson.h b/src/mame/includes/pc9801_epson.h
new file mode 100644
index 00000000000..d251b7764e9
--- /dev/null
+++ b/src/mame/includes/pc9801_epson.h
@@ -0,0 +1,58 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese,Carl
+/******************************************
+ *
+ * Epson PC98 clones
+ *
+ ******************************************/
+
+#ifndef MAME_INCLUDES_PC9801_EPSON_H
+#define MAME_INCLUDES_PC9801_EPSON_H
+
+#pragma once
+
+#include "includes/pc9801.h"
+
+class pc98_epson_state : public pc9801vm_state
+{
+public:
+ pc98_epson_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc9801vm_state(mconfig, type, tag)
+ , m_shadow_ipl(*this, "shadow_ipl_%u", 0)
+ {
+ }
+
+ void pc386m(machine_config &config);
+ void pc486mu(machine_config &config);
+ void pc486se(machine_config &config);
+
+protected:
+ void pc386m_ipl_bank(address_map &map);
+
+ void pc386m_io(address_map &map);
+ void pc386m_map(address_map &map);
+ void pc486se_io(address_map &map);
+ void pc486se_map(address_map &map);
+
+// virtual void machine_start() override;
+// virtual void machine_reset() override;
+
+ DECLARE_MACHINE_START(pc98_epson);
+ DECLARE_MACHINE_RESET(pc98_epson);
+
+private:
+ void epson_ipl_bank_w(offs_t offset, u8 data);
+ void epson_itf_bank_w(offs_t offset, u8 data);
+ void epson_a20_w(offs_t offset, u8 data);
+ void epson_vram_bank_w(offs_t offset, u8 data);
+
+ required_shared_ptr_array<uint16_t, 2> m_shadow_ipl;
+
+ template <unsigned which> void shadow_ipl_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+
+ u8 m_shadow_ipl_bank;
+ bool m_itf_bank_enable;
+// u8 m_itf_bank;
+};
+
+#endif // MAME_INCLUDES_PC9801_EPSON_H
diff --git a/src/mame/includes/pc9821.h b/src/mame/includes/pc9821.h
new file mode 100644
index 00000000000..0ef7c4da1d4
--- /dev/null
+++ b/src/mame/includes/pc9821.h
@@ -0,0 +1,193 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese,Carl
+/******************************************
+ *
+ * NEC PC-9821
+ *
+ ******************************************/
+
+#ifndef MAME_INCLUDES_PC9821_H
+#define MAME_INCLUDES_PC9821_H
+
+#pragma once
+
+#include "includes/pc9801.h"
+
+class pc9821_state : public pc9801bx_state
+{
+public:
+ pc9821_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc9801bx_state(mconfig, type, tag)
+ , m_ext_gvram(*this, "ext_gvram")
+ {
+ }
+
+ void pc9821(machine_config &config);
+
+protected:
+ void pc9821_io(address_map &map);
+ void pc9821_map(address_map &map);
+
+ DECLARE_MACHINE_START(pc9821);
+ DECLARE_MACHINE_RESET(pc9821);
+private:
+ required_shared_ptr<uint32_t> m_ext_gvram;
+
+ uint16_t pc9821_grcg_gvram_r(offs_t offset, uint16_t mem_mask = ~0);
+ void pc9821_grcg_gvram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+ uint16_t pc9821_grcg_gvram0_r(offs_t offset, uint16_t mem_mask = ~0);
+ void pc9821_grcg_gvram0_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+ void pc9821_video_ff_w(offs_t offset, uint8_t data);
+ uint8_t pc9821_a0_r(offs_t offset);
+ void pc9821_a0_w(offs_t offset, uint8_t data);
+ uint8_t window_bank_r(offs_t offset);
+ void window_bank_w(offs_t offset, uint8_t data);
+ uint8_t ext2_video_ff_r();
+ void ext2_video_ff_w(uint8_t data);
+
+ uint8_t m_pc9821_window_bank;
+ uint8_t m_ext2_ff;
+
+ struct {
+ uint8_t pal_entry;
+ uint8_t r[0x100],g[0x100],b[0x100];
+ uint16_t bank[2];
+ }m_analog256;
+
+ void pc9821_egc_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+
+ UPD7220_DISPLAY_PIXELS_MEMBER( pegc_display_pixels );
+};
+
+// MATE A
+
+class pc9821_mate_a_state : public pc9821_state
+{
+public:
+ pc9821_mate_a_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc9821_state(mconfig, type, tag)
+ {
+ }
+
+ void pc9821as(machine_config &config);
+ void pc9821ap2(machine_config &config);
+
+protected:
+ void pc9821as_io(address_map &map);
+
+private:
+ DECLARE_MACHINE_START(pc9821ap2);
+
+ // Ap, As, Ae only
+ u8 ext_sdip_data_r(offs_t offset);
+ void ext_sdip_data_w(offs_t offset, u8 data);
+ void ext_sdip_address_w(offs_t offset, u8 data);
+ void ext_sdip_access_w(offs_t offset, u8 data);
+
+ uint8_t m_ext_sdip[0x100], m_ext_sdip_addr;
+};
+
+// CanBe
+
+class pc9821_canbe_state : public pc9821_state
+{
+public:
+ pc9821_canbe_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc9821_state(mconfig, type, tag)
+ {
+ }
+
+ void pc9821ce2(machine_config &config);
+ void pc9821cx3(machine_config &config);
+
+protected:
+ void pc9821cx3_map(address_map &map);
+ void pc9821cx3_io(address_map &map);
+
+private:
+ void remote_addr_w(offs_t offset, u8 data);
+ u8 remote_data_r(offs_t offset);
+ void remote_data_w(offs_t offset, u8 data);
+
+ DECLARE_MACHINE_START(pc9821_canbe);
+
+ struct {
+ u8 index;
+ }m_remote;
+};
+
+// class pc9821_cereb_state : public pc9821_canbe_state
+
+// Mate B
+
+// class pc9821_mate_b_state : public pc9821_state
+
+// Mate X (NB: should be subclass of Mate B)
+
+class pc9821_mate_x_state : public pc9821_state
+{
+public:
+ pc9821_mate_x_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc9821_state(mconfig, type, tag)
+ {
+ }
+
+ void pc9821xa16(machine_config &config);
+ void pc9821xs(machine_config &config);
+};
+
+// Mate R
+
+class pc9821_mate_r_state : public pc9821_mate_x_state
+{
+public:
+ pc9821_mate_r_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc9821_mate_x_state(mconfig, type, tag)
+ {
+ }
+
+ void pc9821ra20(machine_config &config);
+ void pc9821ra266(machine_config &config);
+ void pc9821ra333(machine_config &config);
+};
+
+class pc9821_valuestar_state : public pc9821_mate_x_state
+{
+public:
+ pc9821_valuestar_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc9821_mate_x_state(mconfig, type, tag)
+ {
+ }
+
+ void pc9821v13(machine_config &config);
+ void pc9821v20(machine_config &config);
+};
+
+// 9821NOTE
+
+class pc9821_note_state : public pc9821_state
+{
+public:
+ pc9821_note_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc9821_state(mconfig, type, tag)
+ {
+ }
+
+ void pc9821ne(machine_config &config);
+};
+
+class pc9821_note_lavie_state : public pc9821_note_state
+{
+public:
+ pc9821_note_lavie_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc9821_note_state(mconfig, type, tag)
+ {
+ }
+
+ void pc9821nr15(machine_config &config);
+ void pc9821nr166(machine_config &config);
+ void pc9821nw150(machine_config &config);
+};
+
+
+#endif // MAME_INCLUDES_PC9821_H
diff --git a/src/mame/includes/pc98ha.h b/src/mame/includes/pc98ha.h
new file mode 100644
index 00000000000..d7b0d2dc00f
--- /dev/null
+++ b/src/mame/includes/pc98ha.h
@@ -0,0 +1,104 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/******************************************
+ *
+ * NEC "Handy98" 1st gen portables
+ *
+ ******************************************/
+
+#ifndef MAME_INCLUDES_PC98HA_H
+#define MAME_INCLUDES_PC98HA_H
+
+#pragma once
+
+#include "includes/pc9801.h"
+
+class pc98lt_state : public pc98_base_state
+{
+public:
+ pc98lt_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc98_base_state(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_fdc(*this, "upd765")
+ , m_gvram(*this, "gvram")
+ , m_bram_bank(*this, "bram_bank")
+ , m_dict_bank(*this, "dict_bank")
+ , m_kanji_bank(*this, "kanji_bank")
+ , m_romdrv_bank(*this, "romdrv_bank")
+ {
+ }
+
+ void lt_config(machine_config &config);
+
+protected:
+ void lt_map(address_map &map);
+ void lt_io(address_map &map);
+
+ required_device<v50_device> m_maincpu;
+
+ virtual void machine_start() override;
+// virtual void machine_reset() override;
+private:
+ required_device<upd765a_device> m_fdc;
+ required_shared_ptr<uint16_t> m_gvram;
+ std::unique_ptr<uint16_t[]> m_bram_ptr;
+ required_memory_bank m_bram_bank;
+ required_memory_bank m_dict_bank;
+ required_memory_bank m_kanji_bank;
+ required_memory_bank m_romdrv_bank;
+
+ void lt_palette(palette_device &palette) const;
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ u8 power_status_r();
+ void power_control_w(offs_t offset, u8 data);
+ u8 floppy_mode_r(offs_t offset);
+ void floppy_mode_w(offs_t offset, u8 data);
+ u8 fdc_ctrl_r(offs_t offset);
+ void fdc_ctrl_w(offs_t offset, u8 data);
+
+ u8 m_romdrv_bank_reg;
+ u8 m_bram_banks;
+ u8 m_bram_bank_reg;
+ u8 m_dict_bank_reg;
+
+ u8 m_floppy_mode;
+ u8 m_fdc_ctrl;
+};
+
+class pc98ha_state : public pc98lt_state
+{
+public:
+ pc98ha_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pc98lt_state(mconfig, type, tag)
+ , m_ems_banks(*this, "ems_bank%u", 1U)
+ , m_ext_view(*this, "ext_io")
+ , m_ramdrv_bank(*this, "ramdrv_bank")
+ , m_rtc_pio(*this, "prtc")
+ {
+ }
+
+ void ha_config(machine_config &config);
+
+protected:
+ void ha_map(address_map &map);
+ void ha_io(address_map &map);
+
+ virtual void machine_start() override;
+private:
+ required_memory_bank_array<4> m_ems_banks;
+ memory_view m_ext_view;
+ required_memory_bank m_ramdrv_bank;
+ required_device<upd4991a_device> m_rtc_pio;
+
+ std::unique_ptr<uint16_t[]> m_ems_ram;
+
+ void ext_view_bank_w(offs_t offset, u8 data);
+ void ext_view_sel_w(offs_t offset, u8 data);
+ void ems_bank_w(offs_t offset, u8 data);
+ u8 memcard_status_1_r(offs_t offset);
+ u8 memcard_status_2_r(offs_t offset);
+ u8 m_ext_view_sel;
+};
+
+#endif // MAME_INCLUDES_PC9801_EPSON_H
diff --git a/src/mame/includes/redalert.h b/src/mame/includes/redalert.h
index 3d017355cde..04748852b3f 100644
--- a/src/mame/includes/redalert.h
+++ b/src/mame/includes/redalert.h
@@ -8,8 +8,7 @@
ask. - Mike Balfour (mab22@po.cwru.edu)
To Do:
- - Device-ify video and audio hardware to turn optional_devices into
- required_devices.
+ - Device-ify video hardware.
****************************************************************************/
@@ -18,11 +17,6 @@
#pragma once
-#include "cpu/i8085/i8085.h"
-#include "machine/6821pia.h"
-#include "machine/gen_latch.h"
-#include "sound/ay8910.h"
-#include "sound/hc55516.h"
#include "screen.h"
class redalert_state : public driver_device
@@ -35,15 +29,7 @@ public:
m_video_control(*this, "video_control"),
m_bitmap_color(*this, "bitmap_color"),
m_maincpu(*this, "maincpu"),
- m_audiocpu(*this, "audiocpu"),
- m_voicecpu(*this, "voice"),
- m_ay8910(*this, "aysnd"),
- m_ay(*this, "ay%u", 1U),
- m_cvsd(*this, "cvsd"),
- m_sndpia(*this, "sndpia"),
- m_screen(*this, "screen"),
- m_soundlatch(*this, "soundlatch"),
- m_soundlatch2(*this, "soundlatch2")
+ m_screen(*this, "screen")
{
}
@@ -52,19 +38,12 @@ public:
void ww3_video(machine_config &config);
void panther_video(machine_config &config);
void demoneye_video(machine_config &config);
- void redalert_audio_m37b(machine_config &config);
- void redalert_audio_voice(machine_config &config);
- void redalert_audio(machine_config &config);
- void ww3_audio(machine_config &config);
- void panther_audio(machine_config &config);
- void demoneye_audio(machine_config &config);
void demoneye(machine_config &config);
void ww3(machine_config &config);
void panther(machine_config &config);
void redalert(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
- DECLARE_CUSTOM_INPUT_MEMBER(sound_status_r);
private:
required_shared_ptr<uint8_t> m_bitmap_videoram;
@@ -73,15 +52,7 @@ private:
required_shared_ptr<uint8_t> m_bitmap_color;
required_device<cpu_device> m_maincpu;
- required_device<cpu_device> m_audiocpu;
- optional_device<i8085a_cpu_device> m_voicecpu;
- optional_device<ay8910_device> m_ay8910;
- optional_device_array<ay8910_device, 2> m_ay;
- optional_device<hc55516_device> m_cvsd;
- optional_device<pia6821_device> m_sndpia;
required_device<screen_device> m_screen;
- required_device<generic_latch_8_device> m_soundlatch;
- optional_device<generic_latch_8_device> m_soundlatch2;
std::unique_ptr<uint8_t[]> m_bitmap_colorram;
uint8_t m_control_xor;
@@ -89,11 +60,6 @@ private:
void redalert_interrupt_clear_w(uint8_t data);
uint8_t panther_interrupt_clear_r();
void redalert_bitmap_videoram_w(offs_t offset, uint8_t data);
- void redalert_audio_command_w(uint8_t data);
- uint8_t redalert_ay8910_latch_1_r();
- void redalert_ay8910_latch_2_w(uint8_t data);
- void redalert_voice_command_w(uint8_t data);
- void demoneye_audio_command_w(uint8_t data);
DECLARE_VIDEO_START(redalert);
DECLARE_VIDEO_START(ww3);
DECLARE_VIDEO_START(demoneye);
@@ -101,42 +67,19 @@ private:
uint32_t screen_update_demoneye(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_panther(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(redalert_vblank_interrupt);
- TIMER_CALLBACK_MEMBER(audio_irq_on);
- TIMER_CALLBACK_MEMBER(audio_irq_off);
- void redalert_analog_w(uint8_t data);
- void redalert_AY8910_w(uint8_t data);
- DECLARE_WRITE_LINE_MEMBER(sod_callback);
- DECLARE_READ_LINE_MEMBER(sid_callback);
- void demoneye_ay8910_latch_1_w(uint8_t data);
- uint8_t demoneye_ay8910_latch_2_r();
- void demoneye_ay8910_data_w(uint8_t data);
void get_redalert_pens(pen_t *pens);
void get_panther_pens(pen_t *pens);
void get_demoneye_pens(pen_t *pens);
void demoneye_bitmap_layer_w(offs_t offset, uint8_t data);
void demoneye_bitmap_ypos_w(u8 data);
- virtual void sound_start() override;
-
void redalert_main_map(address_map &map);
void ww3_main_map(address_map &map);
void panther_main_map(address_map &map);
void demoneye_main_map(address_map &map);
- void redalert_audio_map(address_map &map);
- void panther_audio_map(address_map &map);
- void demoneye_audio_map(address_map &map);
-
- void redalert_voice_map(address_map &map);
-
- emu_timer *m_audio_irq_on_timer;
- emu_timer *m_audio_irq_off_timer;
-
- uint8_t m_ay8910_latch_1;
- uint8_t m_ay8910_latch_2;
u8 m_demoneye_bitmap_reg[4];
u8 m_demoneye_bitmap_yoffs;
- u8 m_sound_hs;
};
#endif // MAME_INCLUDES_REDALERT_H
diff --git a/src/mame/includes/taito_z.h b/src/mame/includes/taito_z.h
index 0855196e333..426c11612e7 100644
--- a/src/mame/includes/taito_z.h
+++ b/src/mame/includes/taito_z.h
@@ -28,11 +28,8 @@ public:
driver_device(mconfig, type, tag),
m_spriteram(*this, "spriteram"),
m_spritemap(*this, "spritemap"),
- m_z80bank(*this, "z80bank"),
m_maincpu(*this, "maincpu"),
- m_audiocpu(*this, "audiocpu"),
m_subcpu(*this, "sub"),
- m_eeprom(*this, "eeprom"),
m_tc0480scp(*this, "tc0480scp"),
m_tc0150rod(*this, "tc0150rod"),
m_tc0100scn(*this, "tc0100scn"),
@@ -48,10 +45,7 @@ public:
m_brake(*this, "BRAKE"),
m_steer(*this, "STEER"),
m_stickx(*this, "STICKX"),
- m_sticky(*this, "STICKY"),
- m_io_eepromout(*this, "EEPROMOUT"),
- m_lamps(*this, "lamp%u", 0U),
- m_shutter_out(*this, "shutter%u", 0U)
+ m_sticky(*this, "STICKY")
{ }
DECLARE_CUSTOM_INPUT_MEMBER(gas_pedal_r);
@@ -59,56 +53,29 @@ public:
template <int axis> DECLARE_CUSTOM_INPUT_MEMBER(adstick_r);
void bshark_base(machine_config &config);
- void sci(machine_config &config);
- void spacegun(machine_config &config);
- void chasehq(machine_config &config);
- void dblaxle(machine_config &config);
void bshark(machine_config &config);
- void aquajack(machine_config &config);
- void nightstr(machine_config &config);
- void contcirc(machine_config &config);
- void racingb(machine_config &config);
void bsharkjjs(machine_config &config);
- void enforce(machine_config &config);
-
- void init_bshark();
protected:
- virtual void device_timer(timer_instance const &timer) override;
virtual void device_post_load() override;
virtual void machine_start() override;
virtual void machine_reset() override;
+
void screen_config(machine_config &config, int vdisp_start, int vdisp_end);
-private:
- enum
- {
- TIMER_TAITOZ_INTERRUPT6,
- };
+ void cpua_ctrl_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void coin_control_w(u8 data);
+ void pancontrol_w(offs_t offset, u8 data);
+
+ void bshark_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs);
/* memory pointers */
required_shared_ptr<u16> m_spriteram;
required_region_ptr<u16> m_spritemap;
- optional_memory_bank m_z80bank;
-
- /* video-related */
- int m_sci_spriteframe;
- int m_road_palbank;
-
- /* misc */
- u16 m_cpua_ctrl;
- s32 m_sci_int6;
- s32 m_ioc220_port;
- u8 m_eep_latch;
- int m_shutter_toggle;
- u8 m_shutter_control;
-
/* devices */
required_device<cpu_device> m_maincpu;
- optional_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_subcpu;
- optional_device<eeprom_serial_93cxx_device> m_eeprom;
optional_device<tc0480scp_device> m_tc0480scp;
optional_device<tc0150rod_device> m_tc0150rod;
optional_device<tc0100scn_device> m_tc0100scn;
@@ -125,71 +92,252 @@ private:
optional_ioport m_steer;
optional_ioport m_stickx;
optional_ioport m_sticky;
- optional_ioport m_io_eepromout;
- output_finder<2> m_lamps;
+
+ /* misc */
+ u16 m_cpua_ctrl;
+
+private:
+ u32 screen_update_bshark(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void parse_cpu_control();
+
+ void bshark_cpub_map(address_map &map);
+ void bshark_map(address_map &map);
+ void bsharkjjs_map(address_map &map);
+};
+
+
+class taitoz_z80_sound_state : public taitoz_state
+{
+public:
+ taitoz_z80_sound_state(const machine_config &mconfig, device_type type, const char *tag) :
+ taitoz_state(mconfig, type, tag),
+ m_audiocpu(*this, "audiocpu"),
+ m_z80bank(*this, "z80bank")
+ {
+ }
+
+ void aquajack(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+ u16 dblaxle_steer_input_r(offs_t offset);
+
+ u32 screen_update_chasehq(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ void z80_sound_map(address_map &map);
+
+ required_device<cpu_device> m_audiocpu;
+
+private:
+ u16 aquajack_unknown_r();
+ void sound_bankswitch_w(u8 data);
+
+ void chasehq_draw_sprites_16x16(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs);
+ void aquajack_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect,int y_offs);
+ u32 screen_update_aquajack(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ void aquajack_map(address_map &map);
+ void aquajack_cpub_map(address_map &map);
+
+ required_memory_bank m_z80bank;
+};
+
+
+class contcirc_state : public taitoz_z80_sound_state
+{
+public:
+ contcirc_state(const machine_config &mconfig, device_type type, const char *tag) :
+ taitoz_z80_sound_state(mconfig, type, tag),
+ m_shutter_out(*this, "shutter%u", 0U)
+ {
+ }
+
+ void contcirc(machine_config &config);
+ void enforce(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void video_start() override;
+
+private:
+ u8 contcirc_input_bypass_r();
+ void contcirc_out_w(u8 data);
+ DECLARE_WRITE_LINE_MEMBER(scope_vblank);
+
+ void contcirc_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs);
+ u32 screen_update_contcirc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ void contcirc_map(address_map &map);
+ void contcirc_cpub_map(address_map &map);
+ void enforce_map(address_map &map);
+ void enforce_cpub_map(address_map &map);
+
output_finder<2> m_shutter_out;
- void cpua_ctrl_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ int m_road_palbank;
+ int m_shutter_toggle;
+ u8 m_shutter_control;
+};
+
+
+class chasehq_state : public taitoz_z80_sound_state
+{
+public:
+ chasehq_state(const machine_config &mconfig, device_type type, const char *tag) :
+ taitoz_z80_sound_state(mconfig, type, tag),
+ m_unknown_io(*this, "UNK%u", 1U),
+ m_lamps(*this, "lamp%u", 0U)
+ {
+ }
+
+ void chasehq(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
void chasehq_cpua_ctrl_w(offs_t offset, u16 data, u16 mem_mask = ~0);
- void dblaxle_cpua_ctrl_w(offs_t offset, u16 data, u16 mem_mask = ~0);
- void spacegun_eeprom_w(u8 data);
- u8 contcirc_input_bypass_r();
u8 chasehq_input_bypass_r();
- u16 sci_steer_input_r(offs_t offset);
- void spacegun_gun_output_w(u16 data);
- u16 dblaxle_steer_input_r(offs_t offset);
u16 chasehq_motor_r(offs_t offset);
void chasehq_motor_w(offs_t offset, u16 data);
- void nightstr_motor_w(offs_t offset, u16 data);
- void coin_control_w(u8 data);
- u16 aquajack_unknown_r();
- void sound_bankswitch_w(u8 data);
- void pancontrol_w(offs_t offset, u8 data);
+
+ void chasehq_map(address_map &map);
+ void chasehq_cpub_map(address_map &map);
+
+ required_ioport_array<4> m_unknown_io;
+ output_finder<2> m_lamps;
+};
+
+
+class sci_state : public taitoz_z80_sound_state
+{
+public:
+ sci_state(const machine_config &mconfig, device_type type, const char *tag) :
+ taitoz_z80_sound_state(mconfig, type, tag)
+ {
+ }
+
+ void sci(machine_config &config);
+ void racingb(machine_config &config);
+
+protected:
+ enum
+ {
+ TIMER_TAITOZ_INTERRUPT6,
+ };
+
+ virtual void device_timer(timer_instance const &timer) override;
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+ virtual void video_start() override;
+
+private:
+ u16 sci_steer_input_r(offs_t offset);
u16 sci_spriteframe_r();
void sci_spriteframe_w(u16 data);
- void contcirc_out_w(u8 data);
- DECLARE_WRITE_LINE_MEMBER(scope_vblank);
- DECLARE_VIDEO_START(taitoz);
- DECLARE_MACHINE_START(chasehq);
- u32 screen_update_contcirc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- u32 screen_update_chasehq(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- u32 screen_update_bshark(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- u32 screen_update_sci(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- u32 screen_update_aquajack(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- u32 screen_update_spacegun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- u32 screen_update_dblaxle(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- u32 screen_update_racingb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
INTERRUPT_GEN_MEMBER(sci_interrupt);
- void contcirc_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs);
- void chasehq_draw_sprites_16x16(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs);
- void bshark_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs);
+
void sci_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs);
- void aquajack_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect,int y_offs);
- void spacegun_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect,int y_offs);
- void parse_cpu_control();
+ u32 screen_update_sci(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update_racingb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void aquajack_cpub_map(address_map &map);
- void aquajack_map(address_map &map);
- void bshark_cpub_map(address_map &map);
- void bshark_map(address_map &map);
- void bsharkjjs_map(address_map &map);
- void chasehq_map(address_map &map);
- void chq_cpub_map(address_map &map);
- void contcirc_cpub_map(address_map &map);
- void contcirc_map(address_map &map);
- void dblaxle_cpub_map(address_map &map);
- void dblaxle_map(address_map &map);
- void enforce_cpub_map(address_map &map);
- void enforce_map(address_map &map);
- void nightstr_cpub_map(address_map &map);
- void nightstr_map(address_map &map);
- void racingb_cpub_map(address_map &map);
- void racingb_map(address_map &map);
- void sci_cpub_map(address_map &map);
void sci_map(address_map &map);
- void spacegun_cpub_map(address_map &map);
+ void sci_cpub_map(address_map &map);
+ void racingb_map(address_map &map);
+ void racingb_cpub_map(address_map &map);
+
+ int m_sci_spriteframe;
+ s32 m_sci_int6;
+};
+
+
+class nightstr_state : public taitoz_z80_sound_state
+{
+public:
+ nightstr_state(const machine_config &mconfig, device_type type, const char *tag) :
+ taitoz_z80_sound_state(mconfig, type, tag),
+ m_motor_dir(*this, "Motor_%u_Direction", 1U),
+ m_motor_speed(*this, "Motor_%u_Speed", 1U),
+ m_motor_debug(*this, "motor_debug")
+ {
+ }
+
+ void nightstr(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void nightstr_motor_w(offs_t offset, u16 data);
+
+ void nightstr_map(address_map &map);
+ void nightstr_cpub_map(address_map &map);
+
+ output_finder<3> m_motor_dir;
+ output_finder<3> m_motor_speed;
+ output_finder<> m_motor_debug;
+};
+
+
+class spacegun_state : public taitoz_state
+{
+public:
+ spacegun_state(const machine_config &mconfig, device_type type, const char *tag) :
+ taitoz_state(mconfig, type, tag),
+ m_eeprom(*this, "eeprom"),
+ m_io_eepromout(*this, "EEPROMOUT"),
+ m_recoil(*this, "Player%u_Gun_Recoil", 1U)
+ {
+ }
+
+ void spacegun(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void spacegun_eeprom_w(u8 data);
+ void spacegun_gun_output_w(u16 data);
+
+ void spacegun_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect,int y_offs);
+ u32 screen_update_spacegun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
void spacegun_map(address_map &map);
- void z80_sound_map(address_map &map);
+ void spacegun_cpub_map(address_map &map);
+
+ required_device<eeprom_serial_93cxx_device> m_eeprom;
+ required_ioport m_io_eepromout;
+ output_finder<2> m_recoil;
+
+ u8 m_eep_latch;
+};
+
+
+class dblaxle_state : public taitoz_z80_sound_state
+{
+public:
+ dblaxle_state(const machine_config &mconfig, device_type type, const char *tag) :
+ taitoz_z80_sound_state(mconfig, type, tag),
+ m_wheel_vibration(*this, "Wheel_Vibration")
+ {
+ }
+
+ void dblaxle(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void dblaxle_cpua_ctrl_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+
+ u32 screen_update_dblaxle(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ void dblaxle_map(address_map &map);
+ void dblaxle_cpub_map(address_map &map);
+
+ output_finder<> m_wheel_vibration;
};
#endif // MAME_INCLUDES_TAITO_Z_H
diff --git a/src/mame/includes/taxidriv.h b/src/mame/includes/taxidriv.h
deleted file mode 100644
index 9c7a2834396..00000000000
--- a/src/mame/includes/taxidriv.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Nicola Salmoria
-#ifndef MAME_INCLUDES_TAXIDRIV_H
-#define MAME_INCLUDES_TAXIDRIV_H
-
-#pragma once
-
-#include "emupal.h"
-
-class taxidriv_state : public driver_device
-{
-public:
- taxidriv_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_gfxdecode(*this, "gfxdecode"),
- m_palette(*this, "palette"),
- m_vram0(*this, "vram0"),
- m_vram1(*this, "vram1"),
- m_vram2(*this, "vram2"),
- m_vram3(*this, "vram3"),
- m_vram4(*this, "vram4"),
- m_vram5(*this, "vram5"),
- m_vram6(*this, "vram6"),
- m_vram7(*this, "vram7"),
- m_scroll(*this, "scroll")
- { }
-
- void taxidriv(machine_config &config);
-
-protected:
- virtual void machine_start() override;
-
-private:
- required_device<cpu_device> m_maincpu;
- required_device<gfxdecode_device> m_gfxdecode;
- required_device<palette_device> m_palette;
-
- required_shared_ptr<uint8_t> m_vram0;
- required_shared_ptr<uint8_t> m_vram1;
- required_shared_ptr<uint8_t> m_vram2;
- required_shared_ptr<uint8_t> m_vram3;
- required_shared_ptr<uint8_t> m_vram4;
- required_shared_ptr<uint8_t> m_vram5;
- required_shared_ptr<uint8_t> m_vram6;
- required_shared_ptr<uint8_t> m_vram7;
- required_shared_ptr<uint8_t> m_scroll;
-
- int m_s1;
- int m_s2;
- int m_s3;
- int m_s4;
- int m_latchA;
- int m_latchB;
- int m_bghide;
- int m_spritectrl[9];
-
- void p2a_w(uint8_t data);
- void p2b_w(uint8_t data);
- void p2c_w(uint8_t data);
- void p3a_w(uint8_t data);
- void p3b_w(uint8_t data);
- void p3c_w(uint8_t data);
- void p4a_w(uint8_t data);
- void p4b_w(uint8_t data);
- void p4c_w(uint8_t data);
- uint8_t p0a_r();
- uint8_t p0c_r();
- void p0b_w(uint8_t data);
- void p0c_w(uint8_t data);
- uint8_t p1b_r();
- uint8_t p1c_r();
- void p1a_w(uint8_t data);
- void p1c_w(uint8_t data);
- uint8_t p8910_0a_r();
- uint8_t p8910_1a_r();
- void p8910_0b_w(uint8_t data);
- void spritectrl_w(offs_t offset, uint8_t data);
-
- void taxidriv_palette(palette_device &palette) const;
-
- uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void cpu2_map(address_map &map);
- void cpu3_map(address_map &map);
- void cpu3_port_map(address_map &map);
- void main_map(address_map &map);
-};
-
-#endif // MAME_INCLUDES_TAXIDRIV_H
diff --git a/src/mame/includes/toaplan1.h b/src/mame/includes/toaplan1.h
index 69939380a22..c1092f814ef 100644
--- a/src/mame/includes/toaplan1.h
+++ b/src/mame/includes/toaplan1.h
@@ -178,6 +178,7 @@ private:
DECLARE_WRITE_LINE_MEMBER(coin_lockout_1_w);
DECLARE_WRITE_LINE_MEMBER(coin_lockout_2_w);
u16 tileram_r(offs_t offset);
+ void pri_cb(u8 priority, u32 &pri_mask);
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank);
diff --git a/src/mame/includes/tubep.h b/src/mame/includes/tubep.h
index e2555f37247..16da35e7463 100644
--- a/src/mame/includes/tubep.h
+++ b/src/mame/includes/tubep.h
@@ -7,6 +7,7 @@
#include "cpu/m6800/m6800.h"
#include "machine/gen_latch.h"
+#include "machine/74157.h"
#include "sound/msm5205.h"
#include "emupal.h"
#include "screen.h"
@@ -21,7 +22,6 @@ public:
m_slave(*this, "slave"),
m_mcu(*this, "mcu"),
m_soundlatch(*this, "soundlatch"),
- m_msm(*this, "msm"),
m_screen(*this, "screen"),
m_textram(*this, "textram"),
m_backgroundram(*this, "backgroundram"),
@@ -47,14 +47,11 @@ protected:
required_device<cpu_device> m_slave;
required_device<m6802_cpu_device> m_mcu;
required_device<generic_latch_8_device> m_soundlatch;
- optional_device<msm5205_device> m_msm;
required_device<screen_device> m_screen;
required_shared_ptr<uint8_t> m_textram;
optional_shared_ptr<uint8_t> m_backgroundram;
required_shared_ptr<uint8_t> m_sprite_colorsharedram;
- uint8_t m_ls74;
- uint8_t m_ls377;
emu_timer *m_interrupt_timer;
emu_timer *m_sprite_timer;
int m_curr_scanline;
@@ -128,6 +125,8 @@ class rjammer_state : public tubep_state
public:
rjammer_state(const machine_config &mconfig, device_type type, const char *tag) :
tubep_state(mconfig, type, tag),
+ m_msm(*this, "msm"),
+ m_adpcm_mux(*this, "adpcm_mux"),
m_rjammer_backgroundram(*this, "rjammer_bgram")
{ }
@@ -138,6 +137,7 @@ protected:
virtual void machine_reset() override;
private:
+ void soundlatch_nmi_w(uint8_t data);
void rjammer_background_LS377_w(uint8_t data);
void rjammer_background_page_w(uint8_t data);
@@ -147,7 +147,7 @@ private:
void rjammer_voice_input_w(uint8_t data);
void rjammer_voice_intensity_control_w(uint8_t data);
- DECLARE_WRITE_LINE_MEMBER(rjammer_adpcm_vck);
+ DECLARE_WRITE_LINE_MEMBER(rjammer_adpcm_vck_w);
uint32_t screen_update_rjammer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@@ -160,7 +160,11 @@ private:
void rjammer_sound_map(address_map &map);
void rjammer_sound_portmap(address_map &map);
- optional_shared_ptr<uint8_t> m_rjammer_backgroundram;
+ required_device<msm5205_device> m_msm;
+ required_device<ls157_device> m_adpcm_mux;
+ required_shared_ptr<uint8_t> m_rjammer_backgroundram;
+
+ bool m_msm5205_toggle;
};
#endif // MAME_INCLUDES_TUBEP_H
diff --git a/src/mame/includes/twincobr.h b/src/mame/includes/twincobr.h
index 7785d92d0c5..208281b9408 100644
--- a/src/mame/includes/twincobr.h
+++ b/src/mame/includes/twincobr.h
@@ -121,6 +121,7 @@ protected:
void wardner_videoram_w(offs_t offset, u8 data);
u8 wardner_sprite_r(offs_t offset);
void wardner_sprite_w(offs_t offset, u8 data);
+ void pri_cb(u8 priority, u32 &pri_mask);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
diff --git a/src/mame/includes/xbox_nv2a.h b/src/mame/includes/xbox_nv2a.h
index 58fe3ba937d..24dbb38d37b 100644
--- a/src/mame/includes/xbox_nv2a.h
+++ b/src/mame/includes/xbox_nv2a.h
@@ -576,7 +576,7 @@ public:
memset(pgraph, 0, sizeof(pgraph));
memset(ramin, 0, sizeof(ramin));
computedilated();
- objectdata = &(rasterizer.object_data_alloc());
+ objectdata = &(rasterizer.object_data().next());
objectdata->data = this;
combiner.used = 0;
primitives_total_count = 0;
diff --git a/src/mame/layout/ave_arb.lay b/src/mame/layout/ave_arb.lay
index b47777f432b..9e5932947ac 100644
--- a/src/mame/layout/ave_arb.lay
+++ b/src/mame/layout/ave_arb.lay
@@ -112,12 +112,12 @@ license:CC0
<element name="text_s3"><text string="Take Back" align="1"><color red="0.55" green="0.55" blue="0.55" /></text></element>
<element name="text_s4"><text string="Clear" align="1"><color red="0.55" green="0.55" blue="0.55" /></text></element>
- <element name="text_r11"><text string="[P]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r21"><text string="[N]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r31"><text string="[B]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r41"><text string="[R]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r51"><text string="[Q]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r61"><text string="[K]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r11"><image file="chess/wp.svg"><color alpha="0.8" /></image></element>
+ <element name="text_r21"><image file="chess/wn.svg"><color alpha="0.8" /></image></element>
+ <element name="text_r31"><image file="chess/wb.svg"><color alpha="0.8" /></image></element>
+ <element name="text_r41"><image file="chess/wr.svg"><color alpha="0.8" /></image></element>
+ <element name="text_r51"><image file="chess/wq.svg"><color alpha="0.8" /></image></element>
+ <element name="text_r61"><image file="chess/wk.svg"><color alpha="0.8" /></image></element>
<element name="text_r71"><text string="W"><color red="0.81" green="0.8" blue="0.79" /></text></element> <!-- White -->
<element name="text_r81"><text string="B"><color red="0.81" green="0.8" blue="0.79" /></text></element> <!-- Black -->
@@ -152,6 +152,8 @@ license:CC0
</element>
<element name="piece" defstate="0">
+ <rect><color alpha="0" /></rect> <!-- force unit square element bounds -->
+
<image file="chess/wp.svg" state="1"/>
<image file="chess/wn.svg" state="2"/>
<image file="chess/wb.svg" state="3"/>
@@ -166,20 +168,47 @@ license:CC0
<image file="chess/bq.svg" state="11"/>
<image file="chess/bk.svg" state="12"/>
- <!-- selected pieces -->
- <image file="chess/wp.svg" state="13"><color alpha="0.5" /></image>
- <image file="chess/wn.svg" state="14"><color alpha="0.5" /></image>
- <image file="chess/wb.svg" state="15"><color alpha="0.5" /></image>
- <image file="chess/wr.svg" state="16"><color alpha="0.5" /></image>
- <image file="chess/wq.svg" state="17"><color alpha="0.5" /></image>
- <image file="chess/wk.svg" state="18"><color alpha="0.5" /></image>
+ <!-- checkers pieces in same gfx style (for kings, just use the chess kings) -->
+ <disk state="13">
+ <bounds x="0.12" y="0.12" width="0.76" height="0.76" />
+ <color red="0" green="0" blue="0" />
+ </disk>
+ <disk state="13">
+ <bounds x="0.16" y="0.16" width="0.68" height="0.68" />
+ <color red="1" green="1" blue="1" />
+ </disk>
+ <disk state="14">
+ <bounds x="0.12" y="0.12" width="0.76" height="0.76" />
+ <color red="0" green="0" blue="0" />
+ </disk>
- <image file="chess/bp.svg" state="19"><color alpha="0.5" /></image>
- <image file="chess/bn.svg" state="20"><color alpha="0.5" /></image>
- <image file="chess/bb.svg" state="21"><color alpha="0.5" /></image>
- <image file="chess/br.svg" state="22"><color alpha="0.5" /></image>
- <image file="chess/bq.svg" state="23"><color alpha="0.5" /></image>
- <image file="chess/bk.svg" state="24"><color alpha="0.5" /></image>
+ <!-- selected pieces -->
+ <image file="chess/wp.svg" state="15"><color alpha="0.5" /></image>
+ <image file="chess/wn.svg" state="16"><color alpha="0.5" /></image>
+ <image file="chess/wb.svg" state="17"><color alpha="0.5" /></image>
+ <image file="chess/wr.svg" state="18"><color alpha="0.5" /></image>
+ <image file="chess/wq.svg" state="19"><color alpha="0.5" /></image>
+ <image file="chess/wk.svg" state="20"><color alpha="0.5" /></image>
+
+ <image file="chess/bp.svg" state="21"><color alpha="0.5" /></image>
+ <image file="chess/bn.svg" state="22"><color alpha="0.5" /></image>
+ <image file="chess/bb.svg" state="23"><color alpha="0.5" /></image>
+ <image file="chess/br.svg" state="24"><color alpha="0.5" /></image>
+ <image file="chess/bq.svg" state="25"><color alpha="0.5" /></image>
+ <image file="chess/bk.svg" state="26"><color alpha="0.5" /></image>
+
+ <disk state="27">
+ <bounds x="0.12" y="0.12" width="0.76" height="0.76" />
+ <color red="0.28" green="0.165" blue="0.06" />
+ </disk>
+ <disk state="27">
+ <bounds x="0.16" y="0.16" width="0.68" height="0.68" />
+ <color red="0.78" green="0.666" blue="0.56" />
+ </disk>
+ <disk state="28">
+ <bounds x="0.12" y="0.12" width="0.76" height="0.76" />
+ <color red="0.28" green="0.165" blue="0.06" />
+ </disk>
</element>
<group name="sb_board">
@@ -349,10 +378,10 @@ license:CC0
</element>
<group name="sb_ui">
- <bounds x="0" y="0" width="10" height="80" />
+ <bounds x="0" y="0" width="10" height="81" />
<element ref="cblack"><bounds x="0" y="0" width="10" height="1" /></element>
<element ref="cblack"><bounds x="0" y="7" width="10" height="1" /></element>
- <element ref="cblack"><bounds x="0" y="79" width="10" height="1" /></element>
+ <element ref="cblack"><bounds x="0" y="80" width="10" height="1" /></element>
<element ref="text_uit1"><bounds x="0" y="2" width="10" height="2" /></element>
<element ref="text_uit2"><bounds x="0" y="4" width="10" height="2" /></element>
@@ -368,64 +397,70 @@ license:CC0
<element ref="hlub" inputtag="board:UI" inputmask="0x100"><bounds x="1" y="15" width="8" height="2.5" /><color alpha="0.25" /></element>
<!-- spawn -->
- <element ref="text_uis1"><bounds x="0" y="20.5" width="10" height="2" /></element>
- <element ref="cwhite"><bounds x="1" y="23" width="8" height="12" /></element>
- <element ref="cwhite"><bounds x="1" y="36" width="8" height="12" /></element>
-
- <element name="piece_ui1" ref="piece"><bounds x="1" y="23" width="4" height="4" /></element>
- <element name="piece_ui2" ref="piece"><bounds x="1" y="27" width="4" height="4" /></element>
- <element name="piece_ui3" ref="piece"><bounds x="1" y="31" width="4" height="4" /></element>
- <element name="piece_ui4" ref="piece"><bounds x="5" y="23" width="4" height="4" /></element>
- <element name="piece_ui5" ref="piece"><bounds x="5" y="27" width="4" height="4" /></element>
- <element name="piece_ui6" ref="piece"><bounds x="5" y="31" width="4" height="4" /></element>
- <element name="piece_ui7" ref="piece"><bounds x="1" y="36" width="4" height="4" /></element>
- <element name="piece_ui8" ref="piece"><bounds x="1" y="40" width="4" height="4" /></element>
- <element name="piece_ui9" ref="piece"><bounds x="1" y="44" width="4" height="4" /></element>
- <element name="piece_ui10" ref="piece"><bounds x="5" y="36" width="4" height="4" /></element>
- <element name="piece_ui11" ref="piece"><bounds x="5" y="40" width="4" height="4" /></element>
- <element name="piece_ui12" ref="piece"><bounds x="5" y="44" width="4" height="4" /></element>
-
- <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0001"><bounds x="1" y="23" width="4" height="4" /><color alpha="0.25" /></element>
- <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0002"><bounds x="1" y="27" width="4" height="4" /><color alpha="0.25" /></element>
- <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0004"><bounds x="1" y="31" width="4" height="4" /><color alpha="0.25" /></element>
- <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0008"><bounds x="5" y="23" width="4" height="4" /><color alpha="0.25" /></element>
- <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0010"><bounds x="5" y="27" width="4" height="4" /><color alpha="0.25" /></element>
- <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0020"><bounds x="5" y="31" width="4" height="4" /><color alpha="0.25" /></element>
- <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0040"><bounds x="1" y="36" width="4" height="4" /><color alpha="0.25" /></element>
- <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0080"><bounds x="1" y="40" width="4" height="4" /><color alpha="0.25" /></element>
- <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0100"><bounds x="1" y="44" width="4" height="4" /><color alpha="0.25" /></element>
- <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0200"><bounds x="5" y="36" width="4" height="4" /><color alpha="0.25" /></element>
- <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0400"><bounds x="5" y="40" width="4" height="4" /><color alpha="0.25" /></element>
- <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0800"><bounds x="5" y="44" width="4" height="4" /><color alpha="0.25" /></element>
+ <element ref="text_uis1"><bounds x="0" y="19.5" width="10" height="2" /></element>
+ <element ref="cwhite"><bounds x="1" y="22" width="8" height="12" /></element>
+ <element ref="cwhite"><bounds x="1" y="35" width="8" height="12" /></element>
+
+ <element name="piece_ui1" ref="piece"><bounds x="1" y="22" width="4" height="4" /></element>
+ <element name="piece_ui2" ref="piece"><bounds x="1" y="26" width="4" height="4" /></element>
+ <element name="piece_ui3" ref="piece"><bounds x="1" y="30" width="4" height="4" /></element>
+ <element name="piece_ui4" ref="piece"><bounds x="5" y="22" width="4" height="4" /></element>
+ <element name="piece_ui5" ref="piece"><bounds x="5" y="26" width="4" height="4" /></element>
+ <element name="piece_ui6" ref="piece"><bounds x="5" y="30" width="4" height="4" /></element>
+ <element name="piece_ui7" ref="piece"><bounds x="1" y="35" width="4" height="4" /></element>
+ <element name="piece_ui8" ref="piece"><bounds x="1" y="39" width="4" height="4" /></element>
+ <element name="piece_ui9" ref="piece"><bounds x="1" y="43" width="4" height="4" /></element>
+ <element name="piece_ui10" ref="piece"><bounds x="5" y="35" width="4" height="4" /></element>
+ <element name="piece_ui11" ref="piece"><bounds x="5" y="39" width="4" height="4" /></element>
+ <element name="piece_ui12" ref="piece"><bounds x="5" y="43" width="4" height="4" /></element>
+
+ <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0001"><bounds x="1" y="22" width="4" height="4" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0002"><bounds x="1" y="26" width="4" height="4" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0004"><bounds x="1" y="30" width="4" height="4" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0008"><bounds x="5" y="22" width="4" height="4" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0010"><bounds x="5" y="26" width="4" height="4" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0020"><bounds x="5" y="30" width="4" height="4" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0040"><bounds x="1" y="35" width="4" height="4" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0080"><bounds x="1" y="39" width="4" height="4" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0100"><bounds x="1" y="43" width="4" height="4" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0200"><bounds x="5" y="35" width="4" height="4" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0400"><bounds x="5" y="39" width="4" height="4" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:SPAWN" inputmask="0x0800"><bounds x="5" y="43" width="4" height="4" /><color alpha="0.25" /></element>
+
+ <element ref="cwhite"><bounds x="1" y="48" width="8" height="4" /></element>
+ <element name="piece_ui13" ref="piece"><bounds x="1" y="48" width="4" height="4" /></element>
+ <element name="piece_ui14" ref="piece"><bounds x="5" y="48" width="4" height="4" /></element>
+ <element ref="hlub" inputtag="board:SPAWN" inputmask="0x1000"><bounds x="1" y="48" width="4" height="4" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:SPAWN" inputmask="0x2000"><bounds x="5" y="48" width="4" height="4" /><color alpha="0.25" /></element>
<!-- hand -->
- <element ref="text_uih1"><bounds x="0" y="51" width="10" height="2" /></element>
- <element ref="cblack"><bounds x="1" y="53.5" width="8" height="6" /></element>
- <element name="piece_ui0" ref="piece"><bounds x="2" y="53.5" width="6" height="6" /></element>
+ <element ref="text_uih1"><bounds x="0" y="54" width="10" height="2" /></element>
+ <element ref="cblack"><bounds x="1" y="56.5" width="8" height="6" /></element>
+ <element name="piece_ui0" ref="piece"><bounds x="2" y="56.5" width="6" height="6" /></element>
- <element ref="cwhite"><bounds x="1" y="60.5" width="8" height="2.5" /></element>
- <element ref="text_uih2"><bounds x="1.5" y="60.75" width="7" height="2" /></element>
- <element ref="hlub" inputtag="board:UI" inputmask="0x08"><bounds x="1" y="60.5" width="8" height="2.5" /><color alpha="0.25" /></element>
+ <element ref="cwhite"><bounds x="1" y="63.5" width="8" height="2.5" /></element>
+ <element ref="text_uih2"><bounds x="1.5" y="63.75" width="7" height="2" /></element>
+ <element ref="hlub" inputtag="board:UI" inputmask="0x08"><bounds x="1" y="63.5" width="8" height="2.5" /><color alpha="0.25" /></element>
<!-- undo -->
- <element ref="text_uiu1"><bounds x="0" y="66" width="10" height="2" /></element>
- <element ref="cwhite"><bounds x="1" y="68.5" width="1.7" height="6" /></element>
- <element ref="cwhite"><bounds x="3.1" y="68.5" width="1.7" height="6" /></element>
- <element ref="cwhite"><bounds x="5.2" y="68.5" width="1.7" height="6" /></element>
- <element ref="cwhite"><bounds x="7.3" y="68.5" width="1.7" height="6" /></element>
- <element ref="text_uiu2a"><bounds x="1" y="69.5" width="1.7" height="4" /></element>
- <element ref="text_uiu2b"><bounds x="3.1" y="69.5" width="1.7" height="4" /></element>
- <element ref="text_uiu2c"><bounds x="5.2" y="69.5" width="1.7" height="4" /></element>
- <element ref="text_uiu2d"><bounds x="7.3" y="69.5" width="1.7" height="4" /></element>
-
- <element ref="hlub" inputtag="board:UI" inputmask="0x10"><bounds x="1" y="68.5" width="1.7" height="6" /><color alpha="0.25" /></element>
- <element ref="hlub" inputtag="board:UI" inputmask="0x20"><bounds x="3.1" y="68.5" width="1.7" height="6" /><color alpha="0.25" /></element>
- <element ref="hlub" inputtag="board:UI" inputmask="0x40"><bounds x="5.2" y="68.5" width="1.7" height="6" /><color alpha="0.25" /></element>
- <element ref="hlub" inputtag="board:UI" inputmask="0x80"><bounds x="7.3" y="68.5" width="1.7" height="6" /><color alpha="0.25" /></element>
-
- <element name="count_ui0" ref="text_uiu3a"><bounds x="0" y="75" width="4" height="2" /></element>
- <element name="count_ui1" ref="text_uiu3c"><bounds x="6" y="75" width="4" height="2" /></element>
- <element ref="text_uiu3b"><bounds x="4" y="75" width="2" height="2" /></element>
+ <element ref="text_uiu1"><bounds x="0" y="68" width="10" height="2" /></element>
+ <element ref="cwhite"><bounds x="1" y="70.5" width="1.7" height="6" /></element>
+ <element ref="cwhite"><bounds x="3.1" y="70.5" width="1.7" height="6" /></element>
+ <element ref="cwhite"><bounds x="5.2" y="70.5" width="1.7" height="6" /></element>
+ <element ref="cwhite"><bounds x="7.3" y="70.5" width="1.7" height="6" /></element>
+ <element ref="text_uiu2a"><bounds x="1" y="71.5" width="1.7" height="4" /></element>
+ <element ref="text_uiu2b"><bounds x="3.1" y="71.5" width="1.7" height="4" /></element>
+ <element ref="text_uiu2c"><bounds x="5.2" y="71.5" width="1.7" height="4" /></element>
+ <element ref="text_uiu2d"><bounds x="7.3" y="71.5" width="1.7" height="4" /></element>
+
+ <element ref="hlub" inputtag="board:UI" inputmask="0x10"><bounds x="1" y="70.5" width="1.7" height="6" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:UI" inputmask="0x20"><bounds x="3.1" y="70.5" width="1.7" height="6" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:UI" inputmask="0x40"><bounds x="5.2" y="70.5" width="1.7" height="6" /><color alpha="0.25" /></element>
+ <element ref="hlub" inputtag="board:UI" inputmask="0x80"><bounds x="7.3" y="70.5" width="1.7" height="6" /><color alpha="0.25" /></element>
+
+ <element name="count_ui0" ref="text_uiu3a"><bounds x="0" y="77" width="4" height="2" /></element>
+ <element name="count_ui1" ref="text_uiu3c"><bounds x="6" y="77" width="4" height="2" /></element>
+ <element ref="text_uiu3b"><bounds x="4" y="77" width="2" height="2" /></element>
</group>
@@ -438,10 +473,9 @@ license:CC0
<element ref="black"><bounds x="3" y="2.5" width="81" height="81" /></element>
<group ref="sb_board"><bounds x="3.5" y="3" width="80" height="80" /></group>
- <group ref="sb_ui"><bounds x="-12" y="3" width="10" height="80" /></group>
-
- <!-- chessboard coords -->
+ <group ref="sb_ui"><bounds x="-12" y="2.5" width="10" height="81" /></group>
+ <!-- chessboard coords -->
<element ref="text_8"><bounds x="0.2" y="7" width="2" height="2" /></element>
<element ref="text_7"><bounds x="0.2" y="17" width="2" height="2" /></element>
<element ref="text_6"><bounds x="0.2" y="27" width="2" height="2" /></element>
@@ -460,8 +494,7 @@ license:CC0
<element ref="text_g"><bounds x="67.5" y="84.5" width="2" height="2" /></element>
<element ref="text_h"><bounds x="77.5" y="84.5" width="2" height="2" /></element>
- <!-- right side -->
-
+ <!-- right side -->
<element ref="text_l0"><bounds x="88.6" y="22.65" width="2.5" height="1.5" /></element>
<element ref="text_l1"><bounds x="88.6" y="25.65" width="2.5" height="1.5" /></element>
<element ref="text_l2"><bounds x="88.6" y="28.65" width="2.5" height="1.5" /></element>
@@ -470,12 +503,12 @@ license:CC0
<element ref="text_l5"><bounds x="88.6" y="37.65" width="2.5" height="1.5" /></element>
<element ref="text_l6"><bounds x="88.6" y="43.15" width="2.5" height="1.5" /></element>
- <element ref="text_r11"><bounds x="92.25" y="22.65" width="3.5" height="1.5" /></element>
- <element ref="text_r21"><bounds x="92.25" y="25.65" width="3.5" height="1.5" /></element>
- <element ref="text_r31"><bounds x="92.25" y="28.65" width="3.5" height="1.5" /></element>
- <element ref="text_r41"><bounds x="92.25" y="31.65" width="3.5" height="1.5" /></element>
- <element ref="text_r51"><bounds x="92.25" y="34.65" width="3.5" height="1.5" /></element>
- <element ref="text_r61"><bounds x="92.25" y="37.65" width="3.5" height="1.5" /></element>
+ <element ref="text_r11"><bounds x="92.6" y="22.2" width="2.3" height="2.3" /></element>
+ <element ref="text_r21"><bounds x="92.6" y="25.2" width="2.3" height="2.3" /></element>
+ <element ref="text_r31"><bounds x="92.6" y="28.2" width="2.3" height="2.3" /></element>
+ <element ref="text_r41"><bounds x="92.6" y="31.2" width="2.3" height="2.3" /></element>
+ <element ref="text_r51"><bounds x="92.6" y="34.2" width="2.3" height="2.3" /></element>
+ <element ref="text_r61"><bounds x="92.6" y="37.2" width="2.3" height="2.3" /></element>
<element ref="text_r71"><bounds x="92.5" y="43.15" width="3" height="1.5" /></element>
<element ref="text_r81"><bounds x="92.5" y="46.15" width="3" height="1.5" /></element>
diff --git a/src/mame/layout/barni.lay b/src/mame/layout/barni.lay
new file mode 100644
index 00000000000..05c41381204
--- /dev/null
+++ b/src/mame/layout/barni.lay
@@ -0,0 +1,94 @@
+<?xml version="1.0"?>
+<!--
+license:CC0
+copyright-holders:Robbbert
+-->
+<mamelayout version="2">
+ <element name="digit" defstate="0">
+ <led7seg>
+ <color red="0.75" green="0" blue="0.0" />
+ </led7seg>
+ </element>
+ <element name="red_led" defstate="0">
+ <disk state="1">
+ <color red="0.75" green="0.0" blue="0.0" />
+ </disk>
+ <disk state="0">
+ <color red="0.09375" green="0.0" blue="0.0" />
+ </disk>
+ </element>
+
+ <group name="7x7">
+ <repeat count="7">
+ <param name="n" start="~s~" increment="1" />
+ <param name="x" start="~t~" increment="20" />
+ <param name="y" start="~u~" increment="0" />
+ <element name="digit~n~" ref="digit">
+ <bounds x="~x~" y="~y~" width="18" height="24" />
+ </element>
+ </repeat>
+ </group>
+
+ <group name="2x7">
+ <repeat count="2">
+ <param name="n" start="~s~" increment="1" />
+ <param name="x" start="~t~" increment="20" />
+ <param name="y" start="60" increment="0" />
+ <element name="digit~n~" ref="digit">
+ <bounds x="~x~" y="~y~" width="18" height="24" />
+ </element>
+ </repeat>
+ </group>
+
+ <view name="Standard">
+ <bounds left="5" top="5" right="520" bottom="140" />
+
+ <!-- Player 1 -->
+ <param name="s" value="0" /><!-- first digit number -->
+ <param name="t" value="30" /><!-- first x-coordinate -->
+ <param name="u" value="30" /><!-- first y-coordinate -->
+ <group ref="7x7"></group>
+
+ <!-- Player 2 -->
+ <param name="s" value="8" />
+ <param name="t" value="360" />
+ <param name="u" value="30" />
+ <group ref="7x7"></group>
+
+ <!-- Player 3 -->
+ <param name="s" value="16" />
+ <param name="t" value="30" />
+ <param name="u" value="90" />
+ <group ref="7x7"></group>
+
+ <!-- Player 4 -->
+ <param name="s" value="24" />
+ <param name="t" value="360" />
+ <param name="u" value="90" />
+ <group ref="7x7"></group>
+
+ <!-- Ball in play -->
+ <param name="s" value="32" />
+ <param name="t" value="190" />
+ <group ref="2x7"></group>
+
+ <!-- Credits -->
+ <param name="s" value="34" />
+ <param name="t" value="240" />
+ <group ref="2x7"></group>
+
+ <!-- Match -->
+ <param name="s" value="36" />
+ <param name="t" value="290" />
+ <group ref="2x7"></group>
+
+ <!-- From here is incomplete -->
+ <!-- Player-up LED -->
+ <element name="led5" ref="red_led"><!-- Player 1's turn -->
+ <bounds x="40" y="12" width="7" height="7" />
+ </element>
+ <element name="led6" ref="red_led">
+ <bounds x="310" y="12" width="7" height="7" />
+ </element>
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/fidel_dsc.lay b/src/mame/layout/fidel_dsc.lay
index 12f80735c69..b971b307438 100644
--- a/src/mame/layout/fidel_dsc.lay
+++ b/src/mame/layout/fidel_dsc.lay
@@ -302,12 +302,29 @@ license:CC0
<bounds x="0.1" y="0.1" width="0.8" height="0.8" />
<color red="1" green="0.9" blue="0.6" />
</disk>
+ <disk state="1">
+ <bounds x="0.18" y="0.18" width="0.64" height="0.64" />
+ <color red="0.9" green="0.72" blue="0.54" />
+ </disk>
+ <disk state="1">
+ <bounds x="0.2" y="0.2" width="0.6" height="0.6" />
+ <color red="1" green="0.9" blue="0.6" />
+ </disk>
+
<disk state="2">
<bounds x="0.1" y="0.1" width="0.8" height="0.8" />
<color red="1" green="0.9" blue="0.6" />
</disk>
+ <disk state="2">
+ <bounds x="0.18" y="0.18" width="0.64" height="0.64" />
+ <color red="0.9" green="0.72" blue="0.54" />
+ </disk>
+ <disk state="2">
+ <bounds x="0.2" y="0.2" width="0.6" height="0.6" />
+ <color red="1" green="0.9" blue="0.6" />
+ </disk>
<text state="2" string="[K]">
- <bounds x="0.12" y="0.2" width="0.8" height="0.55" />
+ <bounds x="0.13" y="0.28" width="0.8" height="0.4" />
<color red="0.75" green="0.4" blue="0" />
</text>
@@ -315,40 +332,91 @@ license:CC0
<bounds x="0.1" y="0.1" width="0.8" height="0.8" />
<color red="0.3" green="0.1" blue="0" />
</disk>
+ <disk state="3">
+ <bounds x="0.18" y="0.18" width="0.64" height="0.64" />
+ <color red="0.4" green="0.2" blue="0.05" />
+ </disk>
+ <disk state="3">
+ <bounds x="0.2" y="0.2" width="0.6" height="0.6" />
+ <color red="0.3" green="0.1" blue="0" />
+ </disk>
+
<disk state="4">
<bounds x="0.1" y="0.1" width="0.8" height="0.8" />
<color red="0.3" green="0.1" blue="0" />
</disk>
+ <disk state="4">
+ <bounds x="0.18" y="0.18" width="0.64" height="0.64" />
+ <color red="0.4" green="0.2" blue="0.05" />
+ </disk>
+ <disk state="4">
+ <bounds x="0.2" y="0.2" width="0.6" height="0.6" />
+ <color red="0.3" green="0.1" blue="0" />
+ </disk>
<text state="4" string="[K]">
- <bounds x="0.12" y="0.2" width="0.8" height="0.55" />
+ <bounds x="0.13" y="0.28" width="0.8" height="0.4" />
<color red="0.75" green="0.2" blue="0" />
</text>
<!-- selected pieces -->
<disk state="5">
<bounds x="0.1" y="0.1" width="0.8" height="0.8" />
- <color red="0.8" green="0.7" blue="0.4" />
+ <color red="0.7" green="0.63" blue="0.42" />
+ </disk>
+ <disk state="5">
+ <bounds x="0.18" y="0.18" width="0.64" height="0.64" />
+ <color red="0.63" green="0.504" blue="0.378" />
</disk>
+ <disk state="5">
+ <bounds x="0.2" y="0.2" width="0.6" height="0.6" />
+ <color red="0.7" green="0.63" blue="0.42" />
+ </disk>
+
<disk state="6">
<bounds x="0.1" y="0.1" width="0.8" height="0.8" />
- <color red="0.8" green="0.7" blue="0.4" />
+ <color red="0.7" green="0.63" blue="0.42" />
+ </disk>
+ <disk state="6">
+ <bounds x="0.18" y="0.18" width="0.64" height="0.64" />
+ <color red="0.63" green="0.504" blue="0.378" />
+ </disk>
+ <disk state="6">
+ <bounds x="0.2" y="0.2" width="0.6" height="0.6" />
+ <color red="0.7" green="0.63" blue="0.42" />
</disk>
<text state="6" string="[K]">
- <bounds x="0.12" y="0.2" width="0.8" height="0.55" />
- <color red="0.6" green="0.25" blue="0" />
+ <bounds x="0.13" y="0.28" width="0.8" height="0.4" />
+ <color red="0.525" green="0.28" blue="0" />
</text>
<disk state="7">
<bounds x="0.1" y="0.1" width="0.8" height="0.8" />
- <color red="0.45" green="0.2" blue="0.1" />
+ <color red="0.44" green="0.28" blue="0.14" />
</disk>
+ <disk state="7">
+ <bounds x="0.18" y="0.18" width="0.64" height="0.64" />
+ <color red="0.52" green="0.36" blue="0.24" />
+ </disk>
+ <disk state="7">
+ <bounds x="0.2" y="0.2" width="0.6" height="0.6" />
+ <color red="0.44" green="0.28" blue="0.14" />
+ </disk>
+
<disk state="8">
<bounds x="0.1" y="0.1" width="0.8" height="0.8" />
- <color red="0.45" green="0.2" blue="0.1" />
+ <color red="0.44" green="0.28" blue="0.14" />
+ </disk>
+ <disk state="8">
+ <bounds x="0.18" y="0.18" width="0.64" height="0.64" />
+ <color red="0.52" green="0.36" blue="0.24" />
+ </disk>
+ <disk state="8">
+ <bounds x="0.2" y="0.2" width="0.6" height="0.6" />
+ <color red="0.44" green="0.28" blue="0.14" />
</disk>
<text state="8" string="[K]">
- <bounds x="0.12" y="0.2" width="0.8" height="0.55" />
- <color red="0.9" green="0.35" blue="0.1" />
+ <bounds x="0.13" y="0.28" width="0.8" height="0.4" />
+ <color red="0.8" green="0.52" blue="0.14" />
</text>
</element>
@@ -542,8 +610,7 @@ license:CC0
<group ref="sb_board"><bounds x="3" y="3" width="100" height="100" /></group>
<group ref="sb_ui"><bounds x="-14.75" y="13.625" width="12.5" height="78.75" /></group>
- <!-- right side -->
-
+ <!-- right side -->
<element ref="btn_white"><bounds x="107" y="14.5" width="7" height="7" /></element>
<element ref="btn_white"><bounds x="107" y="24.5" width="7" height="7" /></element>
<element ref="btn_white"><bounds x="107" y="34.5" width="7" height="7" /></element>
@@ -572,8 +639,7 @@ license:CC0
<element ref="hlb" inputtag="IN.1" inputmask="0x01"><bounds x="107" y="84.5" width="7" height="7" /><color alpha="0.3" /></element>
<element ref="hlb" inputtag="IN.0" inputmask="0x80"><bounds x="107" y="94.5" width="7" height="7" /><color alpha="0.3" /></element>
- <!-- 7seg leds -->
-
+ <!-- 7seg leds -->
<element name="digit3" ref="digit">
<bounds x="84.18" y="-11.5" width="5.66" height="8.5" />
</element>
diff --git a/src/mame/layout/gts1.lay b/src/mame/layout/gts1.lay
index 7a8cb1a3075..dc276022324 100644
--- a/src/mame/layout/gts1.lay
+++ b/src/mame/layout/gts1.lay
@@ -20,94 +20,94 @@ license:CC0
<bounds left="0" top="25" right="325" bottom="205" />
<!-- Top Row -->
- <element name="digit8_5" ref="digit8_">
+ <element name="digit8_13" ref="digit8_">
<bounds left="10" top="45" right="30" bottom="84" />
</element>
- <element name="digit8_4" ref="digit8_">
+ <element name="digit8_12" ref="digit8_">
<bounds left="34" top="45" right="54" bottom="84" />
</element>
- <element name="digit8_3" ref="digit8_">
+ <element name="digit8_11" ref="digit8_">
<bounds left="58" top="45" right="78" bottom="84" />
</element>
- <element name="digit8_2" ref="digit8_">
+ <element name="digit8_10" ref="digit8_">
<bounds left="87" top="45" right="107" bottom="84" />
</element>
- <element name="digit8_1" ref="digit8_">
+ <element name="digit8_9" ref="digit8_">
<bounds left="111" top="45" right="131" bottom="84" />
</element>
- <element name="digit8_0" ref="digit8_">
+ <element name="digit8_8" ref="digit8_">
<bounds left="135" top="45" right="155" bottom="84" />
</element>
- <element name="digit8_13" ref="digit8_">
+ <element name="digit8_5" ref="digit8_">
<bounds left="170" top="45" right="190" bottom="84" />
</element>
- <element name="digit8_12" ref="digit8_">
+ <element name="digit8_4" ref="digit8_">
<bounds left="194" top="45" right="214" bottom="84" />
</element>
- <element name="digit8_11" ref="digit8_">
+ <element name="digit8_3" ref="digit8_">
<bounds left="218" top="45" right="238" bottom="84" />
</element>
- <element name="digit8_10" ref="digit8_">
+ <element name="digit8_2" ref="digit8_">
<bounds left="247" top="45" right="267" bottom="84" />
</element>
- <element name="digit8_9" ref="digit8_">
+ <element name="digit8_1" ref="digit8_">
<bounds left="271" top="45" right="291" bottom="84" />
</element>
- <element name="digit8_8" ref="digit8_">
+ <element name="digit8_0" ref="digit8_">
<bounds left="295" top="45" right="315" bottom="84" />
</element>
<!-- Bottom Row -->
- <element name="digit8_21" ref="digit8_">
+ <element name="digit8_29" ref="digit8_">
<bounds left="10" top="100" right="30" bottom="139" />
</element>
- <element name="digit8_20" ref="digit8_">
+ <element name="digit8_28" ref="digit8_">
<bounds left="34" top="100" right="54" bottom="139" />
</element>
- <element name="digit8_19" ref="digit8_">
+ <element name="digit8_27" ref="digit8_">
<bounds left="58" top="100" right="78" bottom="139" />
</element>
- <element name="digit8_18" ref="digit8_">
+ <element name="digit8_26" ref="digit8_">
<bounds left="87" top="100" right="107" bottom="139" />
</element>
- <element name="digit8_17" ref="digit8_">
+ <element name="digit8_25" ref="digit8_">
<bounds left="111" top="100" right="131" bottom="139" />
</element>
- <element name="digit8_16" ref="digit8_">
+ <element name="digit8_24" ref="digit8_">
<bounds left="135" top="100" right="155" bottom="139" />
</element>
<!-- Digits 22 and 23 are not used -->
- <element name="digit8_29" ref="digit8_">
+ <element name="digit8_21" ref="digit8_">
<bounds left="170" top="100" right="190" bottom="139" />
</element>
- <element name="digit8_28" ref="digit8_">
+ <element name="digit8_20" ref="digit8_">
<bounds left="194" top="100" right="214" bottom="139" />
</element>
- <element name="digit8_27" ref="digit8_">
+ <element name="digit8_19" ref="digit8_">
<bounds left="218" top="100" right="238" bottom="139" />
</element>
- <element name="digit8_26" ref="digit8_">
+ <element name="digit8_18" ref="digit8_">
<bounds left="247" top="100" right="267" bottom="139" />
</element>
- <element name="digit8_25" ref="digit8_">
+ <element name="digit8_17" ref="digit8_">
<bounds left="271" top="100" right="291" bottom="139" />
</element>
- <element name="digit8_24" ref="digit8_">
+ <element name="digit8_16" ref="digit8_">
<bounds left="295" top="100" right="315" bottom="139" />
</element>
<!-- Digits 30 and 31 are not used -->
<!-- 4 digit display -->
- <element name="digit7_15" ref="digit7_">
+ <element name="digit7_7" ref="digit7_">
<bounds left="121" top="155" right="136" bottom="189" />
</element>
- <element name="digit7_14" ref="digit7_">
+ <element name="digit7_6" ref="digit7_">
<bounds left="140" top="155" right="155" bottom="189" />
</element>
- <element name="digit7_7" ref="digit7_">
+ <element name="digit7_15" ref="digit7_">
<bounds left="170" top="155" right="185" bottom="189" />
</element>
- <element name="digit7_6" ref="digit7_">
+ <element name="digit7_14" ref="digit7_">
<bounds left="189" top="155" right="204" bottom="189" />
</element>
</view>
diff --git a/src/mame/layout/mephisto_alm32.lay b/src/mame/layout/mephisto_alm32.lay
index fe82c2b9431..45e4e4c9b00 100644
--- a/src/mame/layout/mephisto_alm32.lay
+++ b/src/mame/layout/mephisto_alm32.lay
@@ -343,15 +343,6 @@ license:CC0
<element ref="hlub" inputtag="board:board:SPAWN" inputmask="0x0400"><bounds x="5" y="39" width="4" height="4" /><color alpha="0.25" /></element>
<element ref="hlub" inputtag="board:board:SPAWN" inputmask="0x0800"><bounds x="5" y="43" width="4" height="4" /><color alpha="0.25" /></element>
- <!-- hand -->
- <element ref="text_uih1"><bounds x="0" y="54" width="10" height="2" /></element>
- <element ref="cblack"><bounds x="1" y="56.5" width="8" height="6" /></element>
- <element name="piece_ui0" ref="piece"><bounds x="2" y="56.5" width="6" height="6" /></element>
-
- <element ref="cwhite"><bounds x="1" y="63.5" width="8" height="2.5" /></element>
- <element ref="text_uih2"><bounds x="1.5" y="63.75" width="7" height="2" /></element>
- <element ref="hlub" inputtag="board:board:UI" inputmask="0x08"><bounds x="1" y="63.5" width="8" height="2.5" /><color alpha="0.25" /></element>
-
<element ref="cwhite"><bounds x="1" y="48" width="8" height="4" /></element>
<element name="piece_ui13" ref="piece"><bounds x="1" y="48" width="4" height="4" /></element>
<element name="piece_ui14" ref="piece"><bounds x="5" y="48" width="4" height="4" /></element>
@@ -361,6 +352,15 @@ license:CC0
<element ref="wmask1" inputtag="FAKE" inputmask="1" inputraw="yes"><bounds x="5" y="48" width="4" height="4" /></element>
<element ref="wmask2" blend="multiply"><bounds x="1" y="48" width="8" height="4" /></element>
+ <!-- hand -->
+ <element ref="text_uih1"><bounds x="0" y="54" width="10" height="2" /></element>
+ <element ref="cblack"><bounds x="1" y="56.5" width="8" height="6" /></element>
+ <element name="piece_ui0" ref="piece"><bounds x="2" y="56.5" width="6" height="6" /></element>
+
+ <element ref="cwhite"><bounds x="1" y="63.5" width="8" height="2.5" /></element>
+ <element ref="text_uih2"><bounds x="1.5" y="63.75" width="7" height="2" /></element>
+ <element ref="hlub" inputtag="board:board:UI" inputmask="0x08"><bounds x="1" y="63.5" width="8" height="2.5" /><color alpha="0.25" /></element>
+
<!-- undo -->
<element ref="text_uiu1"><bounds x="0" y="68" width="10" height="2" /></element>
<element ref="cwhite"><bounds x="1" y="70.5" width="1.7" height="6" /></element>
diff --git a/src/mame/layout/spirit76.lay b/src/mame/layout/spirit76.lay
new file mode 100644
index 00000000000..5e62d6f734b
--- /dev/null
+++ b/src/mame/layout/spirit76.lay
@@ -0,0 +1,97 @@
+<?xml version="1.0"?>
+<!--
+license:CC0
+copyright-holders:Robbbert
+-->
+<mamelayout version="2">
+ <element name="digit" defstate="0">
+ <led7seg>
+ <color red="0.75" green="0" blue="0.0" />
+ </led7seg>
+ </element>
+ <element name="red_led" defstate="0">
+ <disk state="1">
+ <color red="0.75" green="0.0" blue="0.0" />
+ </disk>
+ <disk state="0">
+ <color red="0.09375" green="0.0" blue="0.0" />
+ </disk>
+ </element>
+
+ <element name="T1"><text string="FIRST PLAYER"><color red="1.0" green="1.0" blue="1.0" /></text></element>
+ <element name="T2"><text string="SECOND PLAYER"><color red="1.0" green="1.0" blue="1.0" /></text></element>
+ <element name="T3"><text string="BALL"><color red="1.0" green="1.0" blue="1.0" /></text></element>
+ <element name="T4"><text string="CREDIT"><color red="1.0" green="1.0" blue="1.0" /></text></element>
+
+ <group name="6x7">
+ <repeat count="6">
+ <param name="n" start="~s~" increment="1" />
+ <param name="x" start="~t~" increment="20" />
+ <element name="digit~n~" ref="digit">
+ <bounds x="~x~" y="30" width="18" height="24" />
+ </element>
+ </repeat>
+ </group>
+
+ <group name="2x7">
+ <repeat count="2">
+ <param name="n" start="~s~" increment="1" />
+ <param name="x" start="200" increment="20" />
+ <param name="y" start="~t~" increment="0" />
+ <element name="digit~n~" ref="digit">
+ <bounds x="~x~" y="~y~" width="18" height="24" />
+ </element>
+ </repeat>
+ </group>
+
+ <group name="balls">
+ <repeat count="5">
+ <param name="n" start="0" increment="1" />
+ <param name="y" start="26" increment="10" />
+ <element name="led~n~" ref="red_led">
+ <bounds x="183" y="~y~" width="6" height="6" />
+ </element>
+ </repeat>
+ </group>
+
+ <view name="Standard">
+ <bounds left="5" top="5" right="445" bottom="87" />
+
+ <!-- Player 1 -->
+ <param name="s" value="0" /><!-- first digit number -->
+ <param name="t" value="30" /><!-- first x-coordinate -->
+ <group ref="6x7"></group>
+
+ <!-- Player 2 -->
+ <param name="s" value="10" />
+ <param name="t" value="300" />
+ <group ref="6x7"></group>
+
+ <!-- Ball in play -->
+ <group ref="balls"></group>
+
+ <!-- Credits -->
+ <param name="s" value="8" />
+ <param name="t" value="20" />
+ <group ref="2x7"></group>
+
+ <!-- Match -->
+ <param name="s" value="6" />
+ <param name="t" value="55" />
+ <group ref="2x7"></group>
+
+ <!-- Text Labels -->
+ <element ref="T1"><bounds left="30" right="150" top="10" bottom="20" /></element>
+ <element ref="T2"><bounds left="290" right="420" top="10" bottom="20" /></element>
+ <element ref="T3"><bounds left="174" right="190" top="8" bottom="16" /></element>
+ <element ref="T4"><bounds left="200" right="240" top="8" bottom="16" /></element>
+
+ <!-- Player-up LED -->
+ <element name="led5" ref="red_led"><!-- Player 1's turn -->
+ <bounds x="40" y="12" width="7" height="7" />
+ </element>
+ <element name="led6" ref="red_led">
+ <bounds x="310" y="12" width="7" height="7" />
+ </element>
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/ti5100.lay b/src/mame/layout/ti5100.lay
new file mode 100644
index 00000000000..94a31f840bf
--- /dev/null
+++ b/src/mame/layout/ti5100.lay
@@ -0,0 +1,57 @@
+<?xml version="1.0"?>
+<!--
+license:CC0
+-->
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="blackd"><disk><color red="0" green="0" blue="0" /></disk></element>
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="0.2" green="1.0" blue="0.85" /></led7seg>
+ </element>
+
+ <element name="seg_dp" defstate="0">
+ <disk state="0"><color red="0.0235" green="0.1255" blue="0.1059" /></disk>
+ <disk state="1"><color red="0.2" green="1.0" blue="0.85" /></disk>
+ </element>
+ <element name="seg_r" defstate="0">
+ <rect state="0"><color red="0.0235" green="0.1255" blue="0.1059" /></rect>
+ <rect state="1"><color red="0.2" green="1.0" blue="0.85" /></rect>
+ </element>
+
+ <element name="seg_left" defstate="0">
+ <text string="&#x2190;" state="1"><color red="0.2" green="1.0" blue="0.85" /></text>
+ <text string="&#x2190;" state="0"><color red="0.0235" green="0.1255" blue="0.1059" /></text>
+ </element>
+ <element name="seg_m" defstate="0">
+ <text state="1" string="M"><color red="0.2" green="1.0" blue="0.85" /></text>
+ <text state="0" string="M"><color red="0.0235" green="0.1255" blue="0.1059" /></text>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="9.6" right="130.5" top="0" bottom="15" />
+
+ <repeat count="10">
+ <param name="i" start="9" increment="-1" />
+ <param name="x1" start="20" increment="11" />
+ <param name="x2" start="28.3" increment="11" />
+ <param name="x3" start="29.2" increment="11" />
+ <element name="digit~i~" ref="digit"><bounds x="~x1~" y="0" width="10" height="15" /></element>
+
+ <!-- add dp/comma segments -->
+ <element ref="blackd"><bounds x="~x2~" y="13.3" width="2.1" height="2.1" /></element>
+ <element name="~i~.7" ref="seg_dp"><bounds x="~x3~" y="11.6" width="1.5" height="1.5" /></element>
+ <element name="~i~.8" ref="seg_r"><bounds x="~x3~" y="13.5" width="0.75" height="1.5" /></element>
+ </repeat>
+
+ <element name="10.1" ref="seg_m"><bounds x="8.7" y="-0.7" width="10" height="8" /></element>
+ <element name="10.0" ref="seg_left"><bounds x="8.7" y="7.2" width="10" height="6.5" /></element>
+ <element name="10.6" ref="seg_r"><bounds x="10.6" y="6.85" width="6" height="1.3" /></element>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/machine/6883sam.cpp b/src/mame/machine/6883sam.cpp
index b505a1f097e..8afe9271f72 100644
--- a/src/mame/machine/6883sam.cpp
+++ b/src/mame/machine/6883sam.cpp
@@ -384,7 +384,6 @@ void sam6883_device::internal_write(offs_t offset, uint8_t data)
if (xorval & (SAM_STATE_F6|SAM_STATE_F5|SAM_STATE_F4|SAM_STATE_F3|SAM_STATE_F2|SAM_STATE_F1|SAM_STATE_F0))
{
- /* Video frame buffer address changed */
LOGFBITS("%s: SAM F Address: $%04x\n",
machine().describe_context(),
display_offset());
@@ -392,7 +391,6 @@ void sam6883_device::internal_write(offs_t offset, uint8_t data)
if (xorval & (SAM_STATE_V0|SAM_STATE_V1|SAM_STATE_V2))
{
- /* Video frame buffer address changed */
LOGVBITS("%s: SAM V Bits: $%02x\n",
machine().describe_context(),
(m_sam_state & (SAM_STATE_V0|SAM_STATE_V1|SAM_STATE_V2)));
@@ -400,7 +398,6 @@ void sam6883_device::internal_write(offs_t offset, uint8_t data)
if (xorval & (SAM_STATE_P1))
{
- /* Video frame buffer address changed */
LOGPBITS("%s: SAM P1 Bit: $%02x\n",
machine().describe_context(),
(m_sam_state & (SAM_STATE_P1)) >> 10);
@@ -408,7 +405,6 @@ void sam6883_device::internal_write(offs_t offset, uint8_t data)
if (xorval & (SAM_STATE_TY))
{
- /* Video frame buffer address changed */
LOGTBITS("%s: SAM TY Bits: $%02x\n",
machine().describe_context(),
(m_sam_state & (SAM_STATE_TY)) >> 15);
@@ -416,7 +412,6 @@ void sam6883_device::internal_write(offs_t offset, uint8_t data)
if (xorval & (SAM_STATE_M0|SAM_STATE_M1))
{
- /* Video frame buffer address changed */
LOGMBITS("%s: SAM M Bits: $%02x\n",
machine().describe_context(),
(m_sam_state & (SAM_STATE_M0|SAM_STATE_M1)) >> 9);
@@ -424,7 +419,6 @@ void sam6883_device::internal_write(offs_t offset, uint8_t data)
if (xorval & (SAM_STATE_R0|SAM_STATE_R1))
{
- /* Video frame buffer address changed */
LOGRBITS("%s: SAM R Bits: $%02x\n",
machine().describe_context(),
(m_sam_state & (SAM_STATE_R0|SAM_STATE_R1)) >> 11);
diff --git a/src/mame/machine/amstrad.cpp b/src/mame/machine/amstrad.cpp
index 2ea082e8d13..f83717f8339 100644
--- a/src/mame/machine/amstrad.cpp
+++ b/src/mame/machine/amstrad.cpp
@@ -2246,12 +2246,9 @@ void amstrad_state::amstrad_handle_snapshot(unsigned char *pSnapshot)
RegData = (pSnapshot[0x021] & 0x0ff) | ((pSnapshot[0x022] & 0x0ff)<<8);
m_maincpu->set_state_int(Z80_SP, RegData);
- m_maincpu->set_state_int(STATE_GENSP, RegData);
RegData = (pSnapshot[0x023] & 0x0ff) | ((pSnapshot[0x024] & 0x0ff)<<8);
-
m_maincpu->set_state_int(Z80_PC, RegData);
-// m_maincpu->set_state_int(REG_SP, RegData);
RegData = (pSnapshot[0x025] & 0x0ff);
m_maincpu->set_state_int(Z80_IM, RegData);
@@ -3319,7 +3316,7 @@ DEVICE_IMAGE_LOAD_MEMBER(amstrad_state::amstrad_plus_cartridge)
logerror("IMG: raw CPC+ cartridge file\n");
if (size % 0x4000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Attempt to load a raw binary with some block smaller than 16kB in size");
+ image.seterror(image_error::INVALIDIMAGE, "Attempt to load a raw binary with some block smaller than 16kB in size");
return image_init_result::FAIL;
}
else
@@ -3350,7 +3347,7 @@ DEVICE_IMAGE_LOAD_MEMBER(amstrad_state::amstrad_plus_cartridge)
// Is RIFF format (*.cpr)
if (strncmp((char*)(header + 8), "AMS!", 4) != 0)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Not an Amstrad CPC cartridge image (despite RIFF header)");
+ image.seterror(image_error::INVALIDIMAGE, "Not an Amstrad CPC cartridge image (despite RIFF header)");
return image_init_result::FAIL;
}
diff --git a/src/mame/machine/apple2common.cpp b/src/mame/machine/apple2common.cpp
index 8d89fc2081d..6ac4845dd00 100644
--- a/src/mame/machine/apple2common.cpp
+++ b/src/mame/machine/apple2common.cpp
@@ -809,7 +809,7 @@ offs_t apple2_common_device::dasm_override_GS(std::ostream &stream, offs_t pc, c
return 10 | util::disasm_interface::SUPPORTED | util::disasm_interface::STEP_OVER;
}
item++;
- }
+ }
}
offs_t rv = com_long_op(stream, pc, opcodes, "jsl");
diff --git a/src/mame/machine/cchasm.cpp b/src/mame/machine/cchasm.cpp
deleted file mode 100644
index 4a6ce9a397c..00000000000
--- a/src/mame/machine/cchasm.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Mathis Rosenhauer
-/***************************************************************************
-
- Cinematronics Cosmic Chasm hardware
-
-***************************************************************************/
-
-#include "emu.h"
-#include "includes/cchasm.h"
-
-void cchasm_state::led_w(offs_t offset, uint16_t data)
-{
- /*logerror("LED write %x to %x\n", data, offset);*/
-}
diff --git a/src/mame/machine/electron.cpp b/src/mame/machine/electron.cpp
index 1adbc0e27a2..35179d967ce 100644
--- a/src/mame/machine/electron.cpp
+++ b/src/mame/machine/electron.cpp
@@ -655,7 +655,7 @@ image_init_result electronsp_state::load_rom(device_image_interface &image, gene
// socket accepts 8K and 16K ROM only
if (size != 0x2000 && size != 0x4000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only 8K/16K is supported");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid size: Only 8K/16K is supported");
return image_init_result::FAIL;
}
diff --git a/src/mame/machine/gamecom.cpp b/src/mame/machine/gamecom.cpp
index 7697114dbc2..757dad76dd7 100644
--- a/src/mame/machine/gamecom.cpp
+++ b/src/mame/machine/gamecom.cpp
@@ -627,7 +627,7 @@ image_init_result gamecom_state::common_load(device_image_interface &image, gene
if (size != 0x008000 && size != 0x040000 && size != 0x080000
&& size != 0x100000 && size != 0x1c0000 && size != 0x200000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
diff --git a/src/mame/machine/harddriv.cpp b/src/mame/machine/harddriv.cpp
index 26b2d672c40..f553d384486 100644
--- a/src/mame/machine/harddriv.cpp
+++ b/src/mame/machine/harddriv.cpp
@@ -37,6 +37,8 @@
void harddriv_state::device_start()
{
m_lamps.resolve();
+ m_sel.resolve();
+ m_wheel.resolve();
m_xsdp_sport1_irq_off_callback.init(*this, FUNC(harddriv_state::xsdp_sport1_irq_off_callback));
m_deferred_adsp_bank_switch.init(*this, FUNC(harddriv_state::deferred_adsp_bank_switch));
@@ -363,24 +365,24 @@ void harddriv_state::hd68k_wr1_write(offs_t offset, uint16_t data)
data = data >> 8;
switch (m_sel_select)
{
- case 1: /* SEL1 */
- m_sel1_data = data;
- machine().output().set_value("SEL1", m_sel1_data);
+ case 1: /* SEL1 */
+ m_sel1_data = data;
+ m_sel[0] = m_sel1_data;
break;
- case 2: /* SEL2 */
- m_sel2_data = data;
- machine().output().set_value("SEL2", m_sel2_data);
+ case 2: /* SEL2 */
+ m_sel2_data = data;
+ m_sel[1] = m_sel2_data;
break;
- case 3: /* SEL3 */
- m_sel3_data = data;
- machine().output().set_value("SEL3", m_sel3_data);
+ case 3: /* SEL3 */
+ m_sel3_data = data;
+ m_sel[2] = m_sel3_data;
break;
- case 4: /* SEL4 */
- m_sel4_data = data;
- machine().output().set_value("SEL4", m_sel4_data);
+ case 4: /* SEL4 */
+ m_sel4_data = data;
+ m_sel[3] = m_sel4_data;
break;
}
} else {
@@ -393,7 +395,7 @@ void harddriv_state::hd68k_wr2_write(offs_t offset, uint16_t data)
{
if (offset == 0) {
// logerror("Steering Wheel Latch = %02X\n", data);
- machine().output().set_value("wheel", data >> 8);
+ m_wheel = data >> 8;
} else {
logerror("/WR2(%04X)=%02X\n", offset, data);
}
diff --git a/src/mame/machine/jvs13551.cpp b/src/mame/machine/jvs13551.cpp
index 877ccd6302f..e76875b499d 100644
--- a/src/mame/machine/jvs13551.cpp
+++ b/src/mame/machine/jvs13551.cpp
@@ -28,14 +28,16 @@ INPUT_PORTS_END
ROM_START( jvs13551 )
// TMP90PH44N firmwares
ROM_REGION( 0x4000, "iomcu", ROMREGION_ERASE )
- // Sega 838-13683-93
- ROM_LOAD( "sp5001.bin", 0x0000, 0x4000, CRC(3456c8cc) SHA1(f3b66ab1d2eab32e97b46077e3ed2ab5b2982325))
- // Sega 838-13683-93 Rev.B
- ROM_LOAD( "sp5001-b.bin", 0x0000, 0x4000, CRC(28b5fb84) SHA1(8784024548d24b6a43057f06de1d53ce3a34eb12))
- // Sega 838-13683-02
- ROM_LOAD( "sp5002-a.bin", 0x0000, 0x4000, CRC(72983a0f) SHA1(aa13276347bc643ef93e81e9ab7c905deb16c415))
- // Sega 837-13551-92 0007 Type1
- ROM_LOAD( "315-6215.bin", 0x0000, 0x4000, CRC(98202738) SHA1(8c4dc85438298e31e25f69542804a78ff0e20962))
+ // Sega 838-13683-93 (838-13683 ;Ver1.04;98/12)
+ ROM_LOAD( "sp5001.bin", 0x0000, 0x4000, CRC(3456c8cc) SHA1(f3b66ab1d2eab32e97b46077e3ed2ab5b2982325) )
+ // Sega 838-13683-91 Rev.A (838-13683A ;Ver1.06;99/03)
+ ROM_LOAD( "sp5001-a.bin", 0x0000, 0x4000, CRC(b52d3777) SHA1(eb882a0d4fde5d8a9fb118cb6e3547b0e9f7bfea) )
+ // Sega 838-13683-93 Rev.B (838-13683B ;Ver1.07;99/06)
+ ROM_LOAD( "sp5001-b.bin", 0x0000, 0x4000, CRC(28b5fb84) SHA1(8784024548d24b6a43057f06de1d53ce3a34eb12) )
+ // Sega 838-13683-02 (838-13683D ;Ver1.09;99/11)
+ ROM_LOAD( "sp5002-a.bin", 0x0000, 0x4000, CRC(72983a0f) SHA1(aa13276347bc643ef93e81e9ab7c905deb16c415) )
+ // Sega 837-13551-92 0007 Type1 (837-13551 ;Ver1.00;98/10)
+ ROM_LOAD( "315-6215.bin", 0x0000, 0x4000, CRC(98202738) SHA1(8c4dc85438298e31e25f69542804a78ff0e20962) )
ROM_END
const tiny_rom_entry *sega_837_13551_device::device_rom_region() const
diff --git a/src/mame/machine/m1comm.cpp b/src/mame/machine/m1comm.cpp
index e43d5251845..64e763e41f7 100644
--- a/src/mame/machine/m1comm.cpp
+++ b/src/mame/machine/m1comm.cpp
@@ -560,7 +560,7 @@ int m1comm_device::read_frame(int dataSize)
// try to read a message
std::uint32_t recv = 0;
- osd_file::error filerr = m_line_rx->read(m_buffer0, 0, dataSize, recv);
+ std::error_condition filerr = m_line_rx->read(m_buffer0, 0, dataSize, recv);
if (recv > 0)
{
// check if message complete
@@ -581,14 +581,14 @@ int m1comm_device::read_frame(int dataSize)
togo -= recv;
offset += recv;
}
- else if (filerr == osd_file::error::NONE && recv == 0)
+ else if (!filerr && recv == 0)
{
togo = 0;
}
}
}
}
- else if (filerr == osd_file::error::NONE && recv == 0)
+ else if (!filerr && recv == 0)
{
if (m_linkalive == 0x01)
{
@@ -619,11 +619,11 @@ void m1comm_device::send_frame(int dataSize){
if (!m_line_tx)
return;
- osd_file::error filerr;
+ std::error_condition filerr;
std::uint32_t written;
filerr = m_line_tx->write(&m_buffer0, 0, dataSize, written);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
if (m_linkalive == 0x01)
{
diff --git a/src/mame/machine/m2comm.cpp b/src/mame/machine/m2comm.cpp
index 4008cd9fd3f..dd25325f6f6 100644
--- a/src/mame/machine/m2comm.cpp
+++ b/src/mame/machine/m2comm.cpp
@@ -632,7 +632,7 @@ int m2comm_device::read_frame(int dataSize)
// try to read a message
std::uint32_t recv = 0;
- osd_file::error filerr = m_line_rx->read(m_buffer0, 0, dataSize, recv);
+ std::error_condition filerr = m_line_rx->read(m_buffer0, 0, dataSize, recv);
if (recv > 0)
{
// check if message complete
@@ -653,14 +653,14 @@ int m2comm_device::read_frame(int dataSize)
togo -= recv;
offset += recv;
}
- else if (filerr == osd_file::error::NONE && recv == 0)
+ else if (!filerr && recv == 0)
{
togo = 0;
}
}
}
}
- else if (filerr == osd_file::error::NONE && recv == 0)
+ else if (!filerr && recv == 0)
{
if (m_linkalive == 0x01)
{
@@ -687,11 +687,11 @@ void m2comm_device::send_frame(int dataSize){
if (!m_line_tx)
return;
- osd_file::error filerr;
+ std::error_condition filerr;
std::uint32_t written;
filerr = m_line_tx->write(&m_buffer0, 0, dataSize, written);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
if (m_linkalive == 0x01)
{
diff --git a/src/mame/machine/mbee.cpp b/src/mame/machine/mbee.cpp
index a70c470c445..c6a9ec55763 100644
--- a/src/mame/machine/mbee.cpp
+++ b/src/mame/machine/mbee.cpp
@@ -731,7 +731,7 @@ image_init_result mbee_state::load_cart(device_image_interface &image, generic_s
// "mbp" roms
if ((size == 0) || (size > 0x4000))
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported ROM size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported ROM size");
return image_init_result::FAIL;
}
@@ -744,7 +744,7 @@ image_init_result mbee_state::load_cart(device_image_interface &image, generic_s
logerror ("Rom header = %02X %02X %02X\n", slot->read_rom(0), slot->read_rom(1), slot->read_rom(2));
if ((slot->read_rom(0) != 0xc3) || ((slot->read_rom(2) & 0xe0) != 0xc0))
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Not a PAK rom");
+ image.seterror(image_error::INVALIDIMAGE, "Not a PAK rom");
slot->call_unload();
return image_init_result::FAIL;
}
@@ -754,7 +754,7 @@ image_init_result mbee_state::load_cart(device_image_interface &image, generic_s
// "mbn" roms
if ((size == 0) || (size > 0x2000))
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported ROM size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported ROM size");
return image_init_result::FAIL;
}
m_pak_extended[pak_index] = (size > 0x1000) ? true : false;
@@ -768,7 +768,7 @@ image_init_result mbee_state::load_cart(device_image_interface &image, generic_s
{
if ((slot->read_rom(0) != 0xc3) || ((slot->read_rom(2) & 0xf0) != 0xe0))
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Not a NET rom");
+ image.seterror(image_error::INVALIDIMAGE, "Not a NET rom");
slot->call_unload();
return image_init_result::FAIL;
}
diff --git a/src/mame/machine/megadriv.cpp b/src/mame/machine/megadriv.cpp
index 8b9db71df13..4353afff049 100644
--- a/src/mame/machine/megadriv.cpp
+++ b/src/mame/machine/megadriv.cpp
@@ -1035,20 +1035,6 @@ void md_base_state::megadriv_init_common()
m_megadrive_io_write_data_port_ptr = write16sm_delegate(*this, FUNC(md_base_state::megadrive_io_write_data_port_3button));
}
-void md_base_state::init_megadriv_c2()
-{
- megadriv_init_common();
-
- m_vdp->set_use_cram(0); // C2 uses its own palette ram
- m_vdp->set_vdp_pal(false);
- m_vdp->set_framerate(60);
- m_vdp->set_total_scanlines(262);
-
- m_version_hi_nibble = 0x20; // JPN NTSC no-SCD
-}
-
-
-
void md_base_state::init_megadriv()
{
megadriv_init_common();
diff --git a/src/mame/machine/midyunit.cpp b/src/mame/machine/midyunit.cpp
index 5744f4e4758..0b0f6893474 100644
--- a/src/mame/machine/midyunit.cpp
+++ b/src/mame/machine/midyunit.cpp
@@ -139,25 +139,25 @@ void midyunit_state::term2_sound_w(offs_t offset, uint16_t data)
/* Flash Lamp Output Data */
if ( ((data & 0x800) != 0x800) && ((data & 0x400) == 0x400 ) )
{
- output().set_value("Left_Flash_1", data & 0x1);
- output().set_value("Left_Flash_2", (data & 0x2) >> 1);
- output().set_value("Left_Flash_3", (data & 0x4) >> 2);
- output().set_value("Left_Flash_4", (data & 0x8) >> 3);
- output().set_value("Right_Flash_1", (data & 0x10) >> 4);
- output().set_value("Right_Flash_2", (data & 0x20) >> 5);
- output().set_value("Right_Flash_3", (data & 0x40) >> 6);
- output().set_value("Right_Flash_4", (data & 0x80) >> 7);
+ output().set_value("Left_Flash_1", data & 0x1);
+ output().set_value("Left_Flash_2", (data & 0x2) >> 1);
+ output().set_value("Left_Flash_3", (data & 0x4) >> 2);
+ output().set_value("Left_Flash_4", (data & 0x8) >> 3);
+ output().set_value("Right_Flash_1", (data & 0x10) >> 4);
+ output().set_value("Right_Flash_2", (data & 0x20) >> 5);
+ output().set_value("Right_Flash_3", (data & 0x40) >> 6);
+ output().set_value("Right_Flash_4", (data & 0x80) >> 7);
}
/* Gun Output Data */
if ( ((data & 0x800) == 0x800) && ((data & 0x400) != 0x400 ) )
{
- output().set_value("Left_Gun_Recoil", data & 0x1);
- output().set_value("Right_Gun_Recoil", (data & 0x2) >> 1);
- output().set_value("Left_Gun_Green_Led", (~data & 0x20) >> 5);
- output().set_value("Left_Gun_Red_Led", (~data & 0x10) >> 4);
- output().set_value("Right_Gun_Green_Led", (~data & 0x80) >> 7);
- output().set_value("Right_Gun_Red_Led", (~data & 0x40) >> 6);
+ output().set_value("Left_Gun_Recoil", data & 0x1);
+ output().set_value("Right_Gun_Recoil", (data & 0x2) >> 1);
+ output().set_value("Left_Gun_Green_Led", (~data & 0x20) >> 5);
+ output().set_value("Left_Gun_Red_Led", (~data & 0x10) >> 4);
+ output().set_value("Right_Gun_Green_Led", (~data & 0x80) >> 7);
+ output().set_value("Right_Gun_Red_Led", (~data & 0x40) >> 6);
}
if (offset == 0)
diff --git a/src/mame/machine/mtx.cpp b/src/mame/machine/mtx.cpp
index 8c0c086aab0..3cccaa3d7bf 100644
--- a/src/mame/machine/mtx.cpp
+++ b/src/mame/machine/mtx.cpp
@@ -397,7 +397,7 @@ DEVICE_IMAGE_LOAD_MEMBER( mtx_state::extrom_load )
if (size > 0x80000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported rom size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported rom size");
return image_init_result::FAIL;
}
@@ -417,7 +417,7 @@ DEVICE_IMAGE_LOAD_MEMBER( mtx_state::rompak_load )
if (size > 0x2000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
return image_init_result::FAIL;
}
@@ -441,7 +441,7 @@ SNAPSHOT_LOAD_MEMBER(mtx_state::snapshot_cb)
// verify first byte
if (data[0] != 0xff)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, nullptr);
+ image.seterror(image_error::INVALIDIMAGE, nullptr);
return image_init_result::FAIL;
}
@@ -488,7 +488,7 @@ QUICKLOAD_LOAD_MEMBER(mtx_state::quickload_cb)
if (image.length() < 4)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ image.seterror(image_error::INVALIDIMAGE, "File too short");
return image_init_result::FAIL;
}
@@ -497,13 +497,13 @@ QUICKLOAD_LOAD_MEMBER(mtx_state::quickload_cb)
if (image.length() < code_length)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ image.seterror(image_error::INVALIDIMAGE, "File too short");
return image_init_result::FAIL;
}
if (code_base < 0x4000 || (code_base + code_length) >= 0x10000)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid code base and length");
+ image.seterror(image_error::INVALIDIMAGE, "Invalid code base and length");
return image_init_result::FAIL;
}
diff --git a/src/mame/machine/nb1413m3.cpp b/src/mame/machine/nb1413m3.cpp
index 8cdd3e9ae6f..a9c930499bd 100644
--- a/src/mame/machine/nb1413m3.cpp
+++ b/src/mame/machine/nb1413m3.cpp
@@ -202,8 +202,8 @@ uint8_t nb1413m3_device::sndrom_r(address_space &space, offs_t offset)
{
int rombank;
- /* get top 8 bits of the I/O port address */
- offset = (offset << 8) | (space.device().state().state_int(Z80_BC) >> 8);
+ // get top 8 bits of the I/O port address (FIXME: do this the correct way with 16-bit addressing)
+ offset = (offset << 8) | (downcast<z80_device &>(space.device()).state_int(Z80_BC) >> 8);
switch (m_nb1413m3_type)
{
diff --git a/src/mame/machine/nes.cpp b/src/mame/machine/nes.cpp
index 2393557500b..62282c255be 100644
--- a/src/mame/machine/nes.cpp
+++ b/src/mame/machine/nes.cpp
@@ -106,6 +106,7 @@ void nes_state::machine_start()
static const int w_ex_pcbs[] =
{
+ BMC_N32_4IN1,
BTL_SMB2JB,
BTL_YUNG08,
UNL_AC08,
diff --git a/src/mame/machine/s32comm.cpp b/src/mame/machine/s32comm.cpp
index b53448b46d3..420b7d54471 100644
--- a/src/mame/machine/s32comm.cpp
+++ b/src/mame/machine/s32comm.cpp
@@ -266,7 +266,7 @@ int s32comm_device::read_frame(int dataSize)
// try to read a message
std::uint32_t recv = 0;
- osd_file::error filerr = m_line_rx->read(m_buffer0, 0, dataSize, recv);
+ std::error_condition filerr = m_line_rx->read(m_buffer0, 0, dataSize, recv);
if (recv > 0)
{
// check if message complete
@@ -287,14 +287,14 @@ int s32comm_device::read_frame(int dataSize)
togo -= recv;
offset += recv;
}
- else if (filerr == osd_file::error::NONE && recv == 0)
+ else if (!filerr && recv == 0)
{
togo = 0;
}
}
}
}
- else if (filerr == osd_file::error::NONE && recv == 0)
+ else if (!filerr && recv == 0)
{
if (m_linkalive == 0x01)
{
@@ -322,11 +322,11 @@ void s32comm_device::send_frame(int dataSize){
if (!m_line_tx)
return;
- osd_file::error filerr;
+ std::error_condition filerr;
std::uint32_t written;
filerr = m_line_tx->write(&m_buffer0, 0, dataSize, written);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
if (m_linkalive == 0x01)
{
diff --git a/src/mame/machine/sorcerer.cpp b/src/mame/machine/sorcerer.cpp
index d0e12239892..125feb970b4 100644
--- a/src/mame/machine/sorcerer.cpp
+++ b/src/mame/machine/sorcerer.cpp
@@ -601,7 +601,7 @@ QUICKLOAD_LOAD_MEMBER(sorcerer_state::quickload_cb)
// check size
if (image.length() != 0x1001c)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Snapshot must be 65564 bytes");
+ image.seterror(image_error::INVALIDIMAGE, "Snapshot must be 65564 bytes");
image.message("Snapshot must be 65564 bytes");
return image_init_result::FAIL;
}
@@ -656,7 +656,7 @@ QUICKLOAD_LOAD_MEMBER(sorcerer_state::quickload_cb)
m_maincpu->set_state_int(Z80_IFF2, header[19]&4 ? 1 : 0);
m_maincpu->set_state_int(Z80_R, header[20]);
m_maincpu->set_state_int(Z80_AF, header[21] | (header[22] << 8));
- m_maincpu->set_state_int(STATE_GENSP, header[23] | (header[24] << 8));
+ m_maincpu->set_state_int(Z80_SP, header[23] | (header[24] << 8));
m_maincpu->set_state_int(Z80_IM, header[25]);
m_maincpu->set_pc(header[26] | (header[27] << 8));
}
diff --git a/src/mame/machine/thomson.cpp b/src/mame/machine/thomson.cpp
index ec4603b2f81..cd8182d5c9c 100644
--- a/src/mame/machine/thomson.cpp
+++ b/src/mame/machine/thomson.cpp
@@ -281,7 +281,7 @@ DEVICE_IMAGE_LOAD_MEMBER( thomson_state::to7_cartridge )
m_thom_cart_nb_banks = 4;
else
{
- image.seterror(IMAGE_ERROR_UNSUPPORTED, string_format("Invalid cartridge size %u", size).c_str());
+ image.seterror(image_error::INVALIDIMAGE, string_format("Invalid cartridge size %u", size).c_str());
return image_init_result::FAIL;
}
@@ -289,7 +289,7 @@ DEVICE_IMAGE_LOAD_MEMBER( thomson_state::to7_cartridge )
{
if ( image.fread( pos, size ) != size )
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Read error");
+ image.seterror(image_error::INVALIDIMAGE, "Read error");
return image_init_result::FAIL;
}
}
@@ -1389,7 +1389,7 @@ DEVICE_IMAGE_LOAD_MEMBER( thomson_state::mo5_cartridge )
m_thom_cart_nb_banks = 4;
else
{
- image.seterror(IMAGE_ERROR_UNSUPPORTED, string_format("Invalid cartridge size %d", size).c_str());
+ image.seterror(image_error::INVALIDIMAGE, string_format("Invalid cartridge size %d", size).c_str());
return image_init_result::FAIL;
}
@@ -1397,7 +1397,7 @@ DEVICE_IMAGE_LOAD_MEMBER( thomson_state::mo5_cartridge )
{
if ( image.fread(pos, size ) != size )
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Read error");
+ image.seterror(image_error::INVALIDIMAGE, "Read error");
return image_init_result::FAIL;
}
}
diff --git a/src/mame/machine/vtech2.cpp b/src/mame/machine/vtech2.cpp
index 3ac1e62ce3f..0e8a2bea126 100644
--- a/src/mame/machine/vtech2.cpp
+++ b/src/mame/machine/vtech2.cpp
@@ -54,7 +54,7 @@ DEVICE_IMAGE_LOAD_MEMBER( vtech2_state::cart_load )
if (m_cart_size > 0x10000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Cartridge bigger than 64k");
+ image.seterror(image_error::INVALIDIMAGE, "Cartridge bigger than 64k");
m_cart_size = 0;
return image_init_result::FAIL;
}
diff --git a/src/mame/machine/z80bin.cpp b/src/mame/machine/z80bin.cpp
index ba24d545d1f..c14cf196819 100644
--- a/src/mame/machine/z80bin.cpp
+++ b/src/mame/machine/z80bin.cpp
@@ -23,7 +23,7 @@ image_init_result z80bin_load_file(device_image_interface &image, address_space
{
if (ch == EOF)
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Unexpected EOF while getting file name");
+ image.seterror(image_error::INVALIDIMAGE, "Unexpected EOF while getting file name");
image.message(" Unexpected EOF while getting file name");
return image_init_result::FAIL;
}
@@ -32,7 +32,7 @@ image_init_result z80bin_load_file(device_image_interface &image, address_space
{
if (i >= (std::size(pgmname) - 1))
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File name too long");
+ image.seterror(image_error::INVALIDIMAGE, "File name too long");
image.message(" File name too long");
return image_init_result::FAIL;
}
@@ -46,7 +46,7 @@ image_init_result z80bin_load_file(device_image_interface &image, address_space
if (image.fread(args, sizeof(args)) != sizeof(args))
{
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Unexpected EOF while getting file size");
+ image.seterror(image_error::INVALIDIMAGE, "Unexpected EOF while getting file size");
image.message(" Unexpected EOF while getting file size");
return image_init_result::FAIL;
}
@@ -66,7 +66,7 @@ image_init_result z80bin_load_file(device_image_interface &image, address_space
if (image.fread(&data, 1) != 1)
{
snprintf(message, std::size(message), "%s: Unexpected EOF while writing byte to %04X", pgmname, (unsigned) j);
- image.seterror(IMAGE_ERROR_INVALIDIMAGE, message);
+ image.seterror(image_error::INVALIDIMAGE, message);
image.message("%s: Unexpected EOF while writing byte to %04X", pgmname, (unsigned) j);
return image_init_result::FAIL;
}
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 7be1d5ed54d..60892757b98 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -110,6 +110,8 @@ sprtdart // (c) 1993 Compumatic / Desarrollos y Recambios
4enraya // (c) 1990 IDSA
4enrayaa //
unkpacg // (c) 19?? ???
+unkpacga //
+unkpacgb //
unksig // 1998?
unksiga // 1998?
@@ -1885,6 +1887,7 @@ deepfrz // (c) 2009
deepfrzu // (c) 2009
deltabel // (c) 2005
deltaqn // (c) 2004
+diamhrts // (c) 2007
dimeye // (c) 2004
dimeyece // (c) 2004
di4ever // (c) 2002
@@ -2924,6 +2927,7 @@ pitfightb // bootleg
pitfightj // Japan
@source:atarig42.cpp
+dangerex // (proto) (c) 1992
guardian // 136092 (c) 1992
roadriot // 136089 (c) 1991
roadriota // 136089 (c) 1991
@@ -11591,6 +11595,7 @@ deathsml // (c) 2007 Cave (AMI license) - 2007/10/09 MAST
dfkbl // (c) 2010 Cave (AMI license) - 2010/1/18 BLACK LABEL
dsmbl // (c) 2008 Cave (AMI license) - 2008/10/06 MEGABLACK LABEL VER
espgal2 // (c) 2005 Cave (AMI license) - 2005/11/14 MASTER VER
+espgal2a // (c) 2005 Cave (AMI license) - 2005/11/14 MASTER VER
futari10 // (c) 2006 Cave (AMI license) - 2006/10/23 MASTER VER.
futari15 // (c) 2006 Cave (AMI license) - 2006/12/8.MASTER VER. 1.54.
futari15a // (c) 2006 Cave (AMI license) - 2006/12/8 MASTER VER 1.54
@@ -14121,6 +14126,7 @@ funkyjeta // MAT (c) 1992 Data East (Mitchell license) (Wo
funkyjeta2 // MAT (c) 1992 Data East (Mitchell license) (World) - Rev unverified - alternative demo
funkyjetj // MAT (c) 1992 Data East (Mitchell license) (Japan, Rev 2)
sotsugyo // (c) 1995 Mitchell (Atlus license)
+sotsugyok // (c) 1996 Mitchell (Korea)
@source:funtech.cpp
fts2in1
@@ -15325,6 +15331,9 @@ nfsug // Need For Speed: Underground Install (2 Discs)
@source:gluck2.cpp
gluck2 // 1992 Yung Yu / CYE
+@source:gm1000.cpp
+gm1000 //
+
@source:gmaster.cpp
gmaster // Hartung Gamemaster
@@ -15522,6 +15531,7 @@ cb3b // (c) 199? Dyna Electronics
cb3c // (c) 199? Dyna Electronics
cb3d // (c) 199? Dyna Electronics
cb3e // 199? bootleg
+cb3f // 199? bootleg
cherry96 // bootleg
chry10 // bootleg
chryangl // (c) 199? Dyna Electronics
@@ -16557,6 +16567,7 @@ ti1270 // Texas Instruments
ti1680 // Texas Instruments
ti25503 // Texas Instruments
ti30 // Texas Instruments
+ti5100 // Texas Instruments
tibusan // Texas Instruments
timaze // Texas Instruments
tiprog // Texas Instruments
@@ -16962,6 +16973,7 @@ klxyj // (c) 200?
lhzb3 // (c) 200?
lhzb4 // (c) 200?
mgfx // (c) 200?
+qlgs // (c) 1999
sddz // (c) 200?
sdwx // (c) 2002
slqz3 // (c) 1999
@@ -19140,6 +19152,7 @@ fnkyfish // (c) 1981 Sun Electronics
kangaroo // (c) 1982 Sun Electronics
kangarooa // 136008 (c) 1982 Atari
kangaroob // (bootleg)
+kangarool // (c) 1982 Sun Electronics (Loewen Automaten license)
@source:karnov.cpp
chelnov // (c) 1988 Data East USA (World)
@@ -19572,6 +19585,13 @@ gtfrk11m // 2004 - Guitar Freaks 11th Mix (G*D39 VER. JAA
gtfrk3ma // 2000 - Guitar Freaks 3rd Mix (GE949 VER. JAB)
gtfrk3mb // 2000 - Guitar Freaks 3rd Mix - security cassette versionup (949JAZ02)
gtrfrk2m // 1999 - Guitar Freaks 2nd Mix Ver 1.01 (GQ883 VER. JAD)
+gtrfrk2ma // 1999 - Guitar Freaks 2nd Mix (GQ883 VER. EAA)
+gtrfrk2mua // 1999 - Guitar Freaks 2nd Mix (GQ883 VER. UAA)
+gtrfrk2mja // 1999 - Guitar Freaks 2nd Mix (GQ883 VER. JAA)
+gtrfrk2mka // 1999 - Guitar Freaks 2nd Mix (GQ883 VER. KAA)
+gtrfrk2maa // 1999 - Guitar Freaks 2nd Mix (GQ883 VER. AAA)
+gtrfrk2ml1 // 1999 - Guitar Freaks Link Kit 1 (GE929 VER. JAA)
+gtrfrk2ml2 // 1999 - Guitar Freaks Link Kit 2 (GC929 VER. JBB)
gtrfrk3m // 2000 - Guitar Freaks 3rd Mix (GE949 VER. JAC)
gtrfrk4m // 2000 - Guitar Freaks 4th Mix (G*A24 VER. JAA)
gtrfrk5m // 2001 - Guitar Freaks 5th Mix (G*A26 VER. JAA)
@@ -19580,10 +19600,14 @@ gtrfrk7m // 2001 - Guitar Freaks 7th Mix (G*B17 VER. JAA)
gtrfrk8m // 2002 - Guitar Freaks 8th Mix power-up ver. (G*C08 VER. JBA)
gtrfrk8ma // 2002 - Guitar Freaks 8th Mix (G*C08 VER. JAA)
gtrfrk9m // 2003 - Guitar Freaks 9th Mix (G*C39 VER. JAA)
-gtrfrks // 1999 - Guitar Freaks (GQ886 VER. EAC)
-gtrfrksa // 1999 - Guitar Freaks (GQ886 VER. AAC)
-gtrfrksj // 1999 - Guitar Freaks (GQ886 VER. JAC)
-gtrfrksu // 1999 - Guitar Freaks (GQ886 VER. UAC)
+gtrfrks // 1999 - Guitar Freaks Ver 1.01 (GQ886 VER. EAD)
+gtrfrksa // 1999 - Guitar Freaks Ver 1.01 (GQ886 VER. AAD)
+gtrfrksj // 1999 - Guitar Freaks Ver 1.01 (GQ886 VER. JAD)
+gtrfrksu // 1999 - Guitar Freaks Ver 1.01 (GQ886 VER. UAD)
+gtrfrksc // 1999 - Guitar Freaks (GQ886 VER. EAC)
+gtrfrksac // 1999 - Guitar Freaks (GQ886 VER. AAC)
+gtrfrksjc // 1999 - Guitar Freaks (GQ886 VER. JAC)
+gtrfrksuc // 1999 - Guitar Freaks (GQ886 VER. UAC)
gunmania // 2000 - GunMania (GL906 VER. JAA)
strgchmp // 1997 - Steering Champ (GQ710 97/12/18 VER. UAA)
hndlchmp // 1997 - Handle Champ (GQ710 97/12/18 VER. SAA)
@@ -23011,6 +23035,7 @@ sport2k //
bigappg // (c) 1986 Merit / Big Apple Games
casino5 // (c) 1989 Merit
casino5a // (c) 1984 Merit
+casino5b // (c) 1984 Merit
chkndraw // (c) 1984 Merit
chkndrawa // (c) 1984 Merit
couple // (c) 1988 Merit
@@ -23558,13 +23583,14 @@ bublpong // bootleg on enhanced hardware
missb2 // bootleg on enhanced hardware
@source:missbamby.cpp
+basket // (c) 198? IGOA S.A.
goldfrts //
gwinner // (c) 1983 Reben
luckyplr // (c) 1981 Cirsa
minisupf // (c) 1981 Cirsa
msbamby // (c) 198? Automatics Pasqual
-trebol // 1985 Regama
-unkslot // (c) 198? MGA or Costa Net?
+multy // (c) 1987 Deta
+trebol // (c) 1985 Regama
@source:missile.cpp
mcombat // bootleg
@@ -31447,6 +31473,8 @@ swcourtb // bootleg (Playmark?)
swcourtj // (c) 1992 (Japan)
tinklpit // (c) 1993 (Japan)
xday2 // (c) 1995 (Japan)
+zelos // (c) 1994 (Japan)
+zelost // (c) 1994 (Japan)
@source:namconb1.cpp
gslgr94j // (c) 1994 (Japan)
@@ -31727,8 +31755,8 @@ kyukaidk // (c) 1990 (Japan, new version)
kyukaidko // (c) 1990 (Japan, old version)
luckywld // (c) 1992
luckywldj // (c) 1992
-marvland // (c) 1989 (US)
-marvlandj // (c) 1989 (Japan)
+marvland // (c) 1989 (Japan)
+marvlandup // (c) 1989 (US)
metlhawk // (c) 1988
metlhawkj // (c) 1988
mirninja // (c) 1988 (Japan)
@@ -33371,6 +33399,9 @@ onetwoe // (c) 1997 Barko
c5000 // 1981
c8002 //
+@source:opercoin.cpp
+multibaby // (c) 1990 oper Coin
+
@source:opwolf.cpp
opwolf // B20 (c) 1987 Taito Corporation Japan (World)
opwolfa // B20 (c) 1987 Taito Corporation Japan (World)
@@ -33826,28 +33857,43 @@ pc8801mk2sr //
pc88va //
pc88va2 //
+@source:pc98ha.cpp
+pc98lt // 1989
+pc98ha // 1990
+
@source:pc9801.cpp
-pc386m //
-pc486mu //
-pc486se // 1993
pc9801bx2 // 1993
pc9801f // 1983
pc9801rs // 1989
pc9801rx // 1988
+pc9801us // 1992
pc9801ux // 1987
pc9801vm // 1985
-pc9801vm11 //
-pc9821 //
-pc9821ap2 //
-pc9821as //
-pc9821ce2 //
-pc9821ne //
-pc9821ra20 //
-pc9821ra333 //
-pc9821v13 //
-pc9821v20 //
-pc9821xa16 //
-pc9821xs //
+pc9801vm11 // 1985
+pc9801vx // 1986
+
+@source:pc9801_epson.cpp
+pc386m // 1990
+pc486se // 1993
+pc486mu // 1994
+
+@source:pc9821.cpp
+pc9821 // 1992
+pc9821ap2 // 1993
+pc9821as // 1993
+pc9821ce2 // 1994
+pc9821cx3 // 1995
+pc9821ne // 1994
+pc9821nr15 // 1996
+pc9821nr166 // 1997
+pc9821nw150 // 1997
+pc9821ra20 // 1996
+pc9821ra266 // 1997
+pc9821ra333 // 1998
+pc9821v13 // 1998
+pc9821v20 // 1998
+pc9821xa16 // 1996
+pc9821xs // 1994
@source:pcat_dyn.cpp
toursol // (c) 1995 Dynamo
@@ -34654,6 +34700,7 @@ ketarrs151 // hack
ketb //
ketbl //
killbld // (c) 1998 The Killing Blade
+killbld100 //
killbld104 //
killbld106 //
killbldp // (c) 2004 Killing Blade Plus
@@ -36039,7 +36086,9 @@ rf51w14cg // (c) 2003 Recreativos Franco
unkrfslt //
@source:rfslotsmcs48.cpp
-ajofrin // (c) 198? Recreativos Franco
+ajofrin // (c) 1981 Recreativos Franco
+babyfrts // (c) 198? Recreativos Franco
+babyfrts25 // (c) 198? recreativos Franco
@source:rfslotspcpent.cpp
rfsantafeg // (c) 2014 Recreativos Franco
@@ -37108,10 +37157,12 @@ columns // (c) 1990 Sega
columns2 // (c) 1990 Sega
columnsj // (c) 1990 Sega
columnsu // (c) 1990 Sega
+headonch // (c) 1994 Sega
ichir // (c) 1994 Sega
ichirj // (c) 1994 Sega
ichirjbl // bootleg
ichirk // (c) 1994 Sega
+ooparts // (c) 1992 Success
pclubj //
pclubjv2 //
pclub //
@@ -37128,6 +37179,7 @@ ribbitj // (c) 1991 Sega
soniccar // (c) 1991 Sega
sonicpop // (c) 1993 Sega
sonicfgt // (c) 1993 Sega
+ssonicbr // (c) 1992 Sega
stkclmns // (c) 1994 Sega
stkclmnsj // (c) 1994 Sega
tantr // (c) 1992 Sega
@@ -38399,6 +38451,7 @@ bdream97 // Bootleg?
butrfly // (c) 1995 Bordun International
gallag50 // Bootleg?
leader // Bootleg?
+leadera // Bootleg?
madzoo // (c) 1995 Bordun International
mbutrfly // (c) 1999 (Bordun International?)
miaction // (c) Vegas
@@ -38408,6 +38461,7 @@ rolla //
score5 // Z Games
skylncr // (c) 1995 Bordun International
sonikfig // Z Games
+speedway //
sstar97 // (c) 199? Bordun International
superb2k // Random Games
tigerslt // Bootleg?
@@ -38880,6 +38934,7 @@ comil //
decathln
decathlna
doraglob // (c) 2007 VTech
+doraglobg
doraphon // (c) 2006 VTech
dreamlss
fordrace
@@ -38925,9 +38980,10 @@ icanpian //
@source:spg2xx_jakks.cpp
jak_batm // The Batman, 2004
-jak_wall //
jak_mk
jak_mpacw
+jak_sbjd
+jak_wall
@source:spg2xx_jakks_gkr.cpp
jak_capc //
@@ -40132,6 +40188,7 @@ bublbob2 // 1994.?? D90 (c) 1994 Taito Corporation Japan
bublbob2o // 1994.?? D90 (c) 1994 Taito Corporation Japan (World)
bublbob2p // prototype
bubsymphb // bootleg
+bubsymphba // bootleg
bubsymphe // 1994.?? D90 (c) 1994 Taito Corporation Japan (Europe)
bubsymphj // 1994.10 D90 (c) 1994 Taito Corporation (Japan)
bubsymphu // 1994.10 D90 (c) 1994 Taito America Corporation (US)
@@ -41940,6 +41997,7 @@ vic20p // Commodore VIC 20 (PAL)
@source:vicdual.cpp
alphaho // Data East
+alphahob // bootleg
brdrlinb // Karateco bootleg
brdrline // (c) 1980 Sega
brdrlinet // (c) 1981 Sega
@@ -41949,6 +42007,7 @@ carhntds //
carnival // 651-666 (c) 1980 Sega
carnivalb //
carnivalc // 501-516 (c) 1980 Sega
+carnivalca // 479-494 (c) 1980 Sega
carnivalh //
carnivalha //
depthch // 50-55 [1977 Gremlin?]
@@ -42084,11 +42143,13 @@ mocapbj // 2001
mocapglf // 2001
p911 // 2001
p9112 // 2001
-p911e // 2001
+p911ac // 2001
p911ea // 2001
+p911ed // 2001
p911j // 2001
+p911k // 2001
p911kc // 2001
-p911uc // 2001
+p911ud // 2001
ppp2nd // 2001
ppp2nda // 2001
sogeki // 2001
@@ -43432,6 +43493,14 @@ mu100 // 1997 MU-100
mu100r // 1997 MU-100 Rackable version
mu100b // 1998 MU-100B
+@source:ympsr16.cpp
+psr16 // 1988 PSR-16
+psr36 // 1988 PSR-36
+pss680 // 1988 PSS-680
+
+@source:ympsr40.cpp
+psr40 // 1985 PSR-40
+
@source:ympsr60.cpp
psr60 // 1985 PSR-60
psr70 // 1985 PSR-70
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index 7fb74ae0944..6f5a06ed7b2 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -371,6 +371,7 @@ gimix.cpp
gizmondo.cpp
gkidabc.cpp
glcx.cpp
+gm1000.cpp
gmaster.cpp
gnat10.cpp
goupil.cpp
@@ -766,6 +767,9 @@ pc8401a.cpp
pc8801.cpp
pc88va.cpp
pc9801.cpp
+pc9801_epson.cpp
+pc9821.cpp
+pc98ha.cpp
pcd.cpp
pce.cpp
pce220.cpp
@@ -1194,6 +1198,8 @@ ymmu100.cpp
ymmu5.cpp
ymmu50.cpp
ymmu80.cpp
+ympsr16.cpp
+ympsr40.cpp
ympsr60.cpp
ympsr340.cpp
ymsy35.cpp
diff --git a/src/mame/video/3dom2_te.cpp b/src/mame/video/3dom2_te.cpp
index 3af39e82e2d..2c799dfc9d1 100644
--- a/src/mame/video/3dom2_te.cpp
+++ b/src/mame/video/3dom2_te.cpp
@@ -1502,21 +1502,6 @@ uint32_t nr_invert(uint32_t num, uint32_t & shift_amount)
//-------------------------------------------------
-// clamp -
-//-------------------------------------------------
-
-uint32_t clamp(int32_t v, int32_t min, int32_t max)
-{
- if (v < min)
- return min;
- else if (v > max)
- return max;
-
- return v;
-}
-
-
-//-------------------------------------------------
// walk_edges -
//-------------------------------------------------
@@ -1664,10 +1649,10 @@ void m2_te_device::walk_edges(uint32_t wrange)
}
// Clamp to 8.11
- r = clamp(r, 0, 0x0007ffff);
- g = clamp(g, 0, 0x0007ffff);
- b = clamp(b, 0, 0x0007ffff);
- a = clamp(a, 0, 0x0007ffff);
+ r = std::clamp<int32_t>(r, 0, 0x0007ffff);
+ g = std::clamp<int32_t>(g, 0, 0x0007ffff);
+ b = std::clamp<int32_t>(b, 0, 0x0007ffff);
+ a = std::clamp<int32_t>(a, 0, 0x0007ffff);
}
if (!(m_es.es_cntl & TEMASTER_MODE_DTEXT))
@@ -1684,8 +1669,8 @@ void m2_te_device::walk_edges(uint32_t wrange)
}
// Clamp to 10.13
- uw = clamp(uw, 0, 0x007fffff);
- vw = clamp(vw, 0, 0x007fffff);
+ uw = std::clamp<int32_t>(uw, 0, 0x007fffff);
+ vw = std::clamp<int32_t>(vw, 0, 0x007fffff);
}
if (!(m_es.es_cntl & ESCNTL_PERSPECTIVEOFF))
@@ -1696,7 +1681,7 @@ void m2_te_device::walk_edges(uint32_t wrange)
w += step_back ? m_es.slope_w - m_es.ddx_w : m_es.slope_w;
// Clamp to 0.23
- w = clamp(w, 0, 0x007fffff);
+ w = std::clamp<int32_t>(w, 0, 0x007fffff);
}
// Update Y
@@ -1924,8 +1909,8 @@ void m2_te_device::addr_calc(uint32_t u, uint32_t v, uint32_t lod,
u_max &= u_mask;
v_max &= v_mask;
- u0 = clamp(u0, 0, u_max);
- v0 = clamp(v0, 0, v_max);
+ u0 = std::min(u0, u_max);
+ v0 = std::min(v0, v_max);
// LOD
uint32_t lodmax = m_tm.tex_addr_cntl & TXTADDRCNTL_LODMAX_MASK;
@@ -3256,17 +3241,17 @@ void m2_te_device::walk_span(uint32_t wrange, bool omit_right,
}
// Clamp to 11.8
- r = clamp(r, 0, 0x0007ffff);
- g = clamp(g, 0, 0x0007ffff);
- b = clamp(b, 0, 0x0007ffff);
- a = clamp(a, 0, 0x0007ffff);
+ r = std::clamp<int32_t>(r, 0, 0x0007ffff);
+ g = std::clamp<int32_t>(g, 0, 0x0007ffff);
+ b = std::clamp<int32_t>(b, 0, 0x0007ffff);
+ a = std::clamp<int32_t>(a, 0, 0x0007ffff);
// Clamp to 10.13
- uw = clamp(uw, 0, 0x007fffff);
- vw = clamp(vw, 0, 0x007fffff);
+ uw = std::clamp<int32_t>(uw, 0, 0x007fffff);
+ vw = std::clamp<int32_t>(vw, 0, 0x007fffff);
// Clamp to 0.23
- w = clamp(w, 0, 0x007fffff);
+ w = std::clamp<int32_t>(w, 0, 0x007fffff);
#if TEST_TIMING
g_statistics[STAT_PIXELS_PROCESSED]++;
diff --git a/src/mame/video/astrocde.cpp b/src/mame/video/astrocde.cpp
index 3cc11b497a6..8c2f1a1df3d 100644
--- a/src/mame/video/astrocde.cpp
+++ b/src/mame/video/astrocde.cpp
@@ -113,9 +113,9 @@ void astrocde_state::astrocade_palette(palette_device &palette) const
int b = (by + y) * 255;
// clamp and store
- r = (std::min)((std::max)(r, 0), 255);
- g = (std::min)((std::max)(g, 0), 255);
- b = (std::min)((std::max)(b, 0), 255);
+ r = std::clamp(r, 0, 255);
+ g = std::clamp(g, 0, 255);
+ b = std::clamp(b, 0, 255);
palette.set_pen_color(color * 16 + luma, rgb_t(r, g, b));
}
}
diff --git a/src/mame/video/atarig42.cpp b/src/mame/video/atarig42.cpp
index 9c62b353e9c..374486412ba 100644
--- a/src/mame/video/atarig42.cpp
+++ b/src/mame/video/atarig42.cpp
@@ -92,8 +92,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(atarig42_state::scanline_update)
{
int scanline = param;
- if (scanline == 0) logerror("-------\n");
-
/* keep in range */
int offset = (scanline / 8) * 64 + 48;
if (offset >= 0x800)
diff --git a/src/mame/video/avgdvg.cpp b/src/mame/video/avgdvg.cpp
index 29bf376cc78..b0c2eb04086 100644
--- a/src/mame/video/avgdvg.cpp
+++ b/src/mame/video/avgdvg.cpp
@@ -16,8 +16,10 @@
#include "emu.h"
#include "avgdvg.h"
+
#include "screen.h"
+
/*************************************
*
* Macros and defines
@@ -817,9 +819,13 @@ int avg_mhavoc_device::handler_7() // mhavoc_strobe3
const u8 g = bit1 * 0xcb;
const u8 b = bit0 * 0xcb;
+ int x = m_xpos;
+ int y = m_ypos;
+ apply_flipping(x, y);
+
vg_add_point_buf(
- m_xpos,
- m_ypos,
+ x,
+ y,
rgb_t(r, g, b),
(((m_int_latch >> 1) == 1) ? m_intensity : m_int_latch & 0xe) << 4);
m_spkl_shift = (BIT(m_spkl_shift, 6) ^ BIT(m_spkl_shift, 5) ^ 1) | (m_spkl_shift << 1);
@@ -842,9 +848,13 @@ int avg_mhavoc_device::handler_7() // mhavoc_strobe3
const u8 g = bit1 * 0xcb;
const u8 b = bit0 * 0xcb;
+ int x = m_xpos;
+ int y = m_ypos;
+ apply_flipping(x, y);
+
vg_add_point_buf(
- m_xpos,
- m_ypos,
+ x,
+ y,
rgb_t(r, g, b),
(((m_int_latch >> 1) == 1) ? m_intensity : m_int_latch & 0xe) << 4);
}
diff --git a/src/mame/video/cchasm.cpp b/src/mame/video/cchasm.cpp
deleted file mode 100644
index a1a867c2c7e..00000000000
--- a/src/mame/video/cchasm.cpp
+++ /dev/null
@@ -1,136 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Mathis Rosenhauer
-/***************************************************************************
-
- Cinematronics Cosmic Chasm hardware
-
-***************************************************************************/
-
-#include "emu.h"
-#include "includes/cchasm.h"
-
-#define HALT 0
-#define JUMP 1
-#define COLOR 2
-#define SCALEY 3
-#define POSY 4
-#define SCALEX 5
-#define POSX 6
-#define LENGTH 7
-
-
-void cchasm_state::device_timer(timer_instance const &timer)
-{
- switch (timer.id())
- {
- case TIMER_REFRESH_END:
- m_maincpu->set_input_line(2, ASSERT_LINE);
- break;
- default:
- throw emu_fatalerror("Unknown id in cchasm_state::device_timer");
- }
-}
-
-
-void cchasm_state::refresh ()
-{
- int pc = 0;
- int done = 0;
- int opcode, data;
- int currentx = 0, currenty = 0;
- int scalex = 0, scaley = 0;
- int color = 0;
- int total_length = 1; /* length of all lines drawn in a frame */
- int move = 0;
-
- m_vector->clear_list();
-
- while (!done)
- {
- data = m_ram[pc];
- opcode = data >> 12;
- data &= 0xfff;
- if ((opcode > COLOR) && (data & 0x800))
- data |= 0xfffff000;
-
- pc++;
-
- switch (opcode)
- {
- case HALT:
- done=1;
- break;
- case JUMP:
- pc = data - 0xb00;
- logerror("JUMP to %x\n", data);
- break;
- case COLOR:
- color = vector_device::color444(data ^ 0xfff);
- break;
- case SCALEY:
- scaley = data << 5;
- break;
- case POSY:
- move = 1;
- currenty = m_ycenter + (data << 16);
- break;
- case SCALEX:
- scalex = data << 5;
- break;
- case POSX:
- move = 1;
- currentx = m_xcenter - (data << 16);
- break;
- case LENGTH:
- if (move)
- {
- m_vector->add_point (currentx, currenty, 0, 0);
- move = 0;
- }
-
- currentx -= data * scalex;
- currenty += data * scaley;
-
- total_length += abs(data);
-
- if (color)
- m_vector->add_point (currentx, currenty, color, 0xff);
- else
- move = 1;
- break;
- default:
- logerror("Unknown refresh proc opcode %x with data %x at pc = %x\n", opcode, data, pc-2);
- done = 1;
- break;
- }
- }
- /* Refresh processor runs with 6 MHz */
- m_refresh_end_timer->adjust(attotime::from_hz(6000000) * total_length);
-}
-
-
-void cchasm_state::refresh_control_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- if (ACCESSING_BITS_8_15)
- {
- switch (data >> 8)
- {
- case 0x37:
- refresh();
- break;
- case 0xf7:
- m_maincpu->set_input_line(2, CLEAR_LINE);
- break;
- }
- }
-}
-
-void cchasm_state::video_start()
-{
- const rectangle &visarea = m_screen->visible_area();
-
- m_xcenter=visarea.xcenter() << 16;
- m_ycenter=visarea.ycenter() << 16;
-
- m_refresh_end_timer = timer_alloc(TIMER_REFRESH_END);
-}
diff --git a/src/mame/video/exidy.cpp b/src/mame/video/exidy.cpp
deleted file mode 100644
index 302c92d3599..00000000000
--- a/src/mame/video/exidy.cpp
+++ /dev/null
@@ -1,374 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
-/*************************************************************************
-
- Exidy 6502 hardware
-
-*************************************************************************/
-
-#include "emu.h"
-#include "includes/exidy.h"
-
-
-
-/*************************************
- *
- * Video configuration
- *
- *************************************/
-
-void exidy_state::exidy_video_config(uint8_t _collision_mask, uint8_t _collision_invert, int _is_2bpp)
-{
- m_collision_mask = _collision_mask;
- m_collision_invert = _collision_invert;
- m_is_2bpp = _is_2bpp;
-}
-
-
-
-/*************************************
- *
- * Video startup
- *
- *************************************/
-
-void exidy_state::video_start()
-{
- m_screen->register_screen_bitmap(m_background_bitmap);
- m_motion_object_1_vid.allocate(16, 16);
- m_motion_object_2_vid.allocate(16, 16);
- m_motion_object_2_clip.allocate(16, 16);
-
- save_item(NAME(m_collision_mask));
- save_item(NAME(m_collision_invert));
- save_item(NAME(m_is_2bpp));
- save_item(NAME(m_int_condition));
- save_item(NAME(m_background_bitmap));
- save_item(NAME(m_motion_object_1_vid));
- save_item(NAME(m_motion_object_2_vid));
- save_item(NAME(m_motion_object_2_clip));
-}
-
-
-
-/*************************************
- *
- * Interrupt generation
- *
- *************************************/
-
-inline void exidy_state::latch_condition(int collision)
-{
- collision ^= m_collision_invert;
- m_int_condition = (ioport("INTSOURCE")->read() & ~0x1c) | (collision & m_collision_mask);
-}
-
-
-INTERRUPT_GEN_MEMBER(exidy_state::exidy_vblank_interrupt)
-{
- /* latch the current condition */
- latch_condition(0);
- m_int_condition &= ~0x80;
-
- /* set the IRQ line */
- device.execute().set_input_line(0, ASSERT_LINE);
-}
-
-
-
-uint8_t exidy_state::exidy_interrupt_r()
-{
- /* clear any interrupts */
- m_maincpu->set_input_line(0, CLEAR_LINE);
-
- /* return the latched condition */
- return m_int_condition;
-}
-
-
-
-/*************************************
- *
- * Palette handling
- *
- *************************************/
-
-inline void exidy_state::set_1_color(int index, int which)
-{
- m_palette->set_pen_color(index,
- pal1bit(m_color_latch[2] >> which),
- pal1bit(m_color_latch[1] >> which),
- pal1bit(m_color_latch[0] >> which));
-}
-
-void exidy_state::set_colors()
-{
- /* motion object 1 */
- set_1_color(0, 0);
- set_1_color(1, 7);
-
- /* motion object 2 */
- set_1_color(2, 0);
- set_1_color(3, 6);
-
- /* characters */
- set_1_color(4, 4);
- set_1_color(5, 3);
- set_1_color(6, 2);
- set_1_color(7, 1);
-}
-
-
-
-/*************************************
- *
- * Background update
- *
- *************************************/
-
-void exidy_state::draw_background()
-{
- const u8 *cram = m_characterram ? (u8 *)m_characterram : memregion("maincpu")->base() + 0x4800;
- offs_t offs;
-
- pen_t off_pen = 0;
-
- for (offs = 0; offs < 0x400; offs++)
- {
- uint8_t y = offs >> 5 << 3;
- uint8_t const code = m_videoram[offs];
-
- pen_t on_pen_1, on_pen_2;
- if (m_is_2bpp)
- {
- on_pen_1 = 4 + ((code >> 6) & 0x02);
- on_pen_2 = 5 + ((code >> 6) & 0x02);
- }
- else
- {
- on_pen_1 = 4 + ((code >> 6) & 0x03);
- on_pen_2 = off_pen; /* unused */
- }
-
- for (uint8_t cy = 0; cy < 8; cy++)
- {
- uint8_t x = offs << 3;
-
- if (m_is_2bpp)
- {
- uint8_t data1 = cram[0x000 | (code << 3) | cy];
- uint8_t data2 = cram[0x800 | (code << 3) | cy];
-
- for (int i = 0; i < 8; i++)
- {
- if (data1 & 0x80)
- m_background_bitmap.pix(y, x) = (data2 & 0x80) ? on_pen_2 : on_pen_1;
- else
- m_background_bitmap.pix(y, x) = off_pen;
-
- x++;
- data1 <<= 1;
- data2 <<= 1;
- }
- }
- /* 1bpp */
- else
- {
- uint8_t data = cram[(code << 3) | cy];
-
- for (int i = 0; i < 8; i++)
- {
- m_background_bitmap.pix(y, x) = (data & 0x80) ? on_pen_1 : off_pen;
-
- x++;
- data <<= 1;
- }
- }
-
- y++;
- }
- }
-}
-
-
-
-/*************************************
- *
- * Sprite hardware
- *
- *************************************/
-
-inline int exidy_state::sprite_1_enabled()
-{
- /* if the collision_mask is 0x00, then we are on old hardware that always has */
- /* sprite 1 enabled regardless */
- return (!(*m_sprite_enable & 0x80) || (*m_sprite_enable & 0x10) || (m_collision_mask == 0x00));
-}
-
-
-void exidy_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- /* draw sprite 2 first */
- int sprite_set_2 = ((*m_sprite_enable & 0x40) != 0);
-
- int sx = 236 - *m_sprite2_xpos - 4;
- int sy = 244 - *m_sprite2_ypos - 4;
-
- m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
- ((*m_spriteno >> 4) & 0x0f) + 32 + 16 * sprite_set_2, 1,
- 0, 0, sx, sy, 0);
-
- /* draw sprite 1 next */
- if (sprite_1_enabled())
- {
- int sprite_set_1 = ((*m_sprite_enable & 0x20) != 0);
-
- sx = 236 - *m_sprite1_xpos - 4;
- sy = 244 - *m_sprite1_ypos - 4;
-
- if (sy < 0) sy = 0;
-
- m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
- (*m_spriteno & 0x0f) + 16 * sprite_set_1, 0,
- 0, 0, sx, sy, 0);
- }
-
-}
-
-
-
-/*************************************
- *
- * Collision detection
- *
- *************************************/
-
-/***************************************************************************
-
- Exidy hardware checks for two types of collisions based on the video
- signals. If the Motion Object 1 and Motion Object 2 signals are on at
- the same time, an M1M2 collision bit gets set. If the Motion Object 1
- and Background Character signals are on at the same time, an M1CHAR
- collision bit gets set. So effectively, there's a pixel-by-pixel
- collision check comparing Motion Object 1 (the player) to the
- background and to the other Motion Object (typically a bad guy).
-
-***************************************************************************/
-
-void exidy_state::device_timer(timer_instance const &timer)
-{
- switch (timer.id())
- {
- case TIMER_COLLISION_IRQ:
- /* latch the collision bits */
- latch_condition(timer.param());
-
- /* set the IRQ line */
- m_maincpu->set_input_line(0, ASSERT_LINE);
-
- break;
- default:
- throw emu_fatalerror("Unknown id in exidy_state::device_timer");
- }
-}
-
-
-void exidy_state::check_collision()
-{
- uint8_t sprite_set_1 = ((*m_sprite_enable & 0x20) != 0);
- uint8_t sprite_set_2 = ((*m_sprite_enable & 0x40) != 0);
- const rectangle clip(0, 15, 0, 15);
- int org_1_x = 0, org_1_y = 0;
- int org_2_x = 0, org_2_y = 0;
- int count = 0;
-
- /* if there is nothing to detect, bail */
- if (m_collision_mask == 0)
- return;
-
- /* draw sprite 1 */
- m_motion_object_1_vid.fill(0xff, clip);
- if (sprite_1_enabled())
- {
- org_1_x = 236 - *m_sprite1_xpos - 4;
- org_1_y = 244 - *m_sprite1_ypos - 4;
- m_gfxdecode->gfx(0)->transpen(m_motion_object_1_vid,clip,
- (*m_spriteno & 0x0f) + 16 * sprite_set_1, 0,
- 0, 0, 0, 0, 0);
- }
-
- /* draw sprite 2 */
- m_motion_object_2_vid.fill(0xff, clip);
- org_2_x = 236 - *m_sprite2_xpos - 4;
- org_2_y = 244 - *m_sprite2_ypos - 4;
- m_gfxdecode->gfx(0)->transpen(m_motion_object_2_vid,clip,
- ((*m_spriteno >> 4) & 0x0f) + 32 + 16 * sprite_set_2, 0,
- 0, 0, 0, 0, 0);
-
- /* draw sprite 2 clipped to sprite 1's location */
- m_motion_object_2_clip.fill(0xff, clip);
- if (sprite_1_enabled())
- {
- int sx = org_2_x - org_1_x;
- int sy = org_2_y - org_1_y;
- m_gfxdecode->gfx(0)->transpen(m_motion_object_2_clip,clip,
- ((*m_spriteno >> 4) & 0x0f) + 32 + 16 * sprite_set_2, 0,
- 0, 0, sx, sy, 0);
- }
-
- /* scan for collisions */
- for (int sy = 0; sy < 16; sy++)
- for (int sx = 0; sx < 16; sx++)
- {
- if (m_motion_object_1_vid.pix(sy, sx) != 0xff)
- {
- uint8_t current_collision_mask = 0;
-
- /* check for background collision (M1CHAR) */
- if (m_background_bitmap.pix(org_1_y + sy, org_1_x + sx) != 0)
- current_collision_mask |= 0x04;
-
- /* check for motion object collision (M1M2) */
- if (m_motion_object_2_clip.pix(sy, sx) != 0xff)
- current_collision_mask |= 0x10;
-
- /* if we got one, trigger an interrupt */
- if ((current_collision_mask & m_collision_mask) && (count++ < 128))
- timer_set(m_screen->time_until_pos(org_1_x + sx, org_1_y + sy), TIMER_COLLISION_IRQ, current_collision_mask);
- }
-
- if (m_motion_object_2_vid.pix(sy, sx) != 0xff)
- {
- /* check for background collision (M2CHAR) */
- if (m_background_bitmap.pix(org_2_y + sy, org_2_x + sx) != 0)
- if ((m_collision_mask & 0x08) && (count++ < 128))
- timer_set(m_screen->time_until_pos(org_2_x + sx, org_2_y + sy), TIMER_COLLISION_IRQ, 0x08);
- }
- }
-}
-
-
-
-/*************************************
- *
- * Standard screen refresh callback
- *
- *************************************/
-
-uint32_t exidy_state::screen_update_exidy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- /* refresh the colors from the palette (static or dynamic) */
- set_colors();
-
- /* update the background and draw it */
- draw_background();
- copybitmap(bitmap, m_background_bitmap, 0, 0, 0, 0, cliprect);
-
- /* draw the sprites */
- draw_sprites(bitmap, cliprect);
-
- /* check for collision, this will set the appropriate bits in collision_mask */
- check_collision();
-
- return 0;
-}
diff --git a/src/mame/video/funkyjet.cpp b/src/mame/video/funkyjet.cpp
deleted file mode 100644
index 00bc1975d1b..00000000000
--- a/src/mame/video/funkyjet.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Bryan McPhail
-/***************************************************************************
-
- Funky Jet Video emulation - Bryan McPhail, mish@tendril.co.uk
-
-***************************************************************************/
-
-#include "emu.h"
-#include "includes/funkyjet.h"
-
-/******************************************************************************/
-
-uint32_t funkyjet_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- // Similar to chinatwn and tumblep, see video/supbtime.cpp
- //
- // This causes a 2 pixel gap on the left side of the first stage of all worlds in funkyjet
- // but allows subsequent stages to be centered and avoids corruption on the world select
- // screen after each world. It also correctly aligns the graphics in sotsugyo.
- //
- // The 2 pixel gap on the first stage of each world has been verified to occur on hardware.
- // (it can easily be seen by moving your player sprite to the far left)
- //
- // it is unclear where this offset comes from, but real hardware videos confirm it is needed
-
- m_deco_tilegen->set_scrolldx(0, 0, 1, 1);
- m_deco_tilegen->set_scrolldx(0, 1, 1, 1);
- m_deco_tilegen->set_scrolldx(1, 0, 1, 1);
- m_deco_tilegen->set_scrolldx(1, 1, 1, 1);
-
- uint16_t flip = m_deco_tilegen->pf_control_r(0);
-
- flip_screen_set(BIT(flip, 7));
- m_sprgen->set_flip_screen(BIT(flip, 7));
- m_deco_tilegen->pf_update(m_pf_rowscroll[0], m_pf_rowscroll[1]);
-
- bitmap.fill(768, cliprect);
- m_deco_tilegen->tilemap_2_draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0);
- m_deco_tilegen->tilemap_1_draw(screen, bitmap, cliprect, 0, 0);
- m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram, 0x400);
- return 0;
-}
diff --git a/src/mame/video/gaelco3d.cpp b/src/mame/video/gaelco3d.cpp
index eb68c90a615..fc2a0b2fdeb 100644
--- a/src/mame/video/gaelco3d.cpp
+++ b/src/mame/video/gaelco3d.cpp
@@ -124,7 +124,7 @@ void gaelco3d_state::gaelco3d_renderer::render_poly(screen_device &screen, uint3
float voz_base = tms3203x_device::fp_to_float(polydata[7]) * 256.0f - midx * voz_dx - midy * voz_dy;
float ooz_base = tms3203x_device::fp_to_float(polydata[8]) - midx * ooz_dx - midy * ooz_dy;
float uoz_base = tms3203x_device::fp_to_float(polydata[9]) * 256.0f - midx * uoz_dx - midy * uoz_dy;
- gaelco3d_object_data &object = object_data_alloc();
+ gaelco3d_object_data &object = object_data().next();
int color = (polydata[10] & 0x7f) << 8;
vertex_t vert[MAX_VERTICES];
uint32_t data;
diff --git a/src/mame/video/galastrm.cpp b/src/mame/video/galastrm.cpp
index e175c134959..26794c430f5 100644
--- a/src/mame/video/galastrm.cpp
+++ b/src/mame/video/galastrm.cpp
@@ -403,7 +403,7 @@ void galastrm_renderer::tc0610_rotate_draw(bitmap_ind16 &srcbitmap, const rectan
vert[3].p[0] = (float)(lx - 1) * 65536.0f;
vert[3].p[1] = 0.0;
- gs_poly_data& extra = object_data_alloc();
+ gs_poly_data& extra = object_data().next();
extra.texbase = &srcbitmap;
render_polygon<4, 2>(clip, render_delegate(&galastrm_renderer::tc0610_draw_scanline, this), vert);
diff --git a/src/mame/video/gime.cpp b/src/mame/video/gime.cpp
index 8fb6a11f580..64557772c6f 100644
--- a/src/mame/video/gime.cpp
+++ b/src/mame/video/gime.cpp
@@ -103,9 +103,16 @@
#define LOG_GIME (1U << 2)
#define LOG_TIMER (1U << 3)
#define LOG_PALETTE (1U << 4)
+#define LOG_MMU (1U << 5)
+#define LOG_FBITS (1U << 6)
+#define LOG_VBITS (1U << 7)
+#define LOG_PBITS (1U << 8)
+#define LOG_TBITS (1U << 9)
+#define LOG_MBITS (1U << 10)
+#define LOG_RBITS (1U << 11)
#define VERBOSE (0)
-//#define VERBOSE (LOG_INT_MASKING|LOG_GIME|LOG_TIMER)
+//#define VERBOSE (LOG_GIME|LOG_PBITS|LOG_PBITS|LOG_MMU)
#include "logmacro.h"
@@ -113,6 +120,13 @@
#define LOGGIME(...) LOGMASKED(LOG_GIME, __VA_ARGS__)
#define LOGTIMER(...) LOGMASKED(LOG_TIMER, __VA_ARGS__)
#define LOGPALETTE(...) LOGMASKED(LOG_PALETTE, __VA_ARGS__)
+#define LOGMMU(...) LOGMASKED(LOG_MMU, __VA_ARGS__)
+#define LOGFBITS(...) LOGMASKED(LOG_FBITS, __VA_ARGS__)
+#define LOGVBITS(...) LOGMASKED(LOG_VBITS, __VA_ARGS__)
+#define LOGPBITS(...) LOGMASKED(LOG_PBITS, __VA_ARGS__)
+#define LOGTBITS(...) LOGMASKED(LOG_TBITS, __VA_ARGS__)
+#define LOGMBITS(...) LOGMASKED(LOG_MBITS, __VA_ARGS__)
+#define LOGRBITS(...) LOGMASKED(LOG_RBITS, __VA_ARGS__)
@@ -531,16 +545,19 @@ void gime_device::update_memory(int bank)
// bank 8 is really $FE00-$FEFF; it is weird so adjust for it
offs_t offset;
+ bool force_ram;
bool enable_mmu = (m_gime_registers[0] & 0x40) ? true : false;
if (bank == 8)
{
bank = 7;
offset = 0x1E00;
+ force_ram = (m_gime_registers[0] & 0x08);
enable_mmu = enable_mmu && !(m_gime_registers[0] & 0x08);
}
else
{
offset = 0x0000;
+ force_ram = false;
}
// is the MMU enabled at $FF90?
@@ -565,7 +582,7 @@ void gime_device::update_memory(int bank)
// are we actually in ROM?
uint8_t *memory;
bool is_read_only;
- if (((block & 0x3F) >= 0x3C) && !(m_sam_state & SAM_STATE_TY))
+ if (((block & 0x3F) >= 0x3C) && !(m_sam_state & SAM_STATE_TY) && !force_ram)
{
// we're in ROM
const uint8_t rom_mode = m_gime_registers[0] & 3;
@@ -1023,6 +1040,8 @@ inline void gime_device::write_mmu_register(offs_t offset, uint8_t data)
m_mmu[offset] = data;
update_memory(offset & 0x07);
}
+
+ LOGMMU("%s: MMU Write: $%04x <== $%02X\n",describe_context(), 0xffa0+offset, data );
}
@@ -1077,6 +1096,48 @@ inline void gime_device::write_sam_register(offs_t offset)
if (xorval & (SAM_STATE_R1|SAM_STATE_R0))
update_cpu_clock();
+
+ if (xorval & (SAM_STATE_F6|SAM_STATE_F5|SAM_STATE_F4|SAM_STATE_F3|SAM_STATE_F2|SAM_STATE_F1|SAM_STATE_F0))
+ {
+ LOGFBITS("%s: SAM F Address: $%04x\n",
+ describe_context(),
+ display_offset());
+ }
+
+ if (xorval & (SAM_STATE_V0|SAM_STATE_V1|SAM_STATE_V2))
+ {
+ LOGVBITS("%s: SAM V Bits: $%02x\n",
+ describe_context(),
+ (m_sam_state & (SAM_STATE_V0|SAM_STATE_V1|SAM_STATE_V2)));
+ }
+
+ if (xorval & (SAM_STATE_P1))
+ {
+ LOGPBITS("%s: SAM P1 Bit: $%02x\n",
+ describe_context(),
+ (m_sam_state & (SAM_STATE_P1)) >> 10);
+ }
+
+ if (xorval & (SAM_STATE_TY))
+ {
+ LOGTBITS("%s: SAM TY Bits: $%02x\n",
+ describe_context(),
+ (m_sam_state & (SAM_STATE_TY)) >> 15);
+ }
+
+ if (xorval & (SAM_STATE_M0|SAM_STATE_M1))
+ {
+ LOGMBITS("%s: SAM M Bits: $%02x\n",
+ describe_context(),
+ (m_sam_state & (SAM_STATE_M0|SAM_STATE_M1)) >> 9);
+ }
+
+ if (xorval & (SAM_STATE_R0|SAM_STATE_R1))
+ {
+ LOGRBITS("%s: SAM R Bits: $%02x\n",
+ describe_context(),
+ (m_sam_state & (SAM_STATE_R0|SAM_STATE_R1)) >> 11);
+ }
}
@@ -1986,8 +2047,8 @@ const uint8_t gime_device::hires_font[128][12] =
{ 0x10, 0x28, 0x00, 0x44, 0x44, 0x4C, 0x34, 0x00}, { 0x20, 0x10, 0x44, 0x44, 0x44, 0x4C, 0x34, 0x00},
{ 0x38, 0x4C, 0x54, 0x54, 0x54, 0x64, 0x38, 0x00}, { 0x44, 0x38, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00},
{ 0x28, 0x44, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00}, { 0x38, 0x40, 0x38, 0x44, 0x38, 0x04, 0x38, 0x00},
- { 0x08, 0x14, 0x10, 0x38, 0x10, 0x50, 0x3C, 0x00}, { 0x10, 0x10, 0x7C, 0x10, 0x10, 0x00, 0x7C, 0x00},
- { 0x10, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x08, 0x14, 0x10, 0x38, 0x10, 0x10, 0x20, 0x40},
+ { 0x08, 0x14, 0x10, 0x38, 0x10, 0x14, 0x78, 0x00}, { 0x10, 0x10, 0x7C, 0x10, 0x10, 0x00, 0x7C, 0x00},
+ { 0x10, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x08, 0x14, 0x10, 0x38, 0x10, 0x10, 0x50, 0x20},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00},
{ 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x28, 0x28, 0x7C, 0x28, 0x7C, 0x28, 0x28, 0x00},
{ 0x10, 0x3C, 0x50, 0x38, 0x14, 0x78, 0x10, 0x00}, { 0x60, 0x64, 0x08, 0x10, 0x20, 0x4C, 0x0C, 0x00},
diff --git a/src/mame/video/hanaawas.cpp b/src/mame/video/hanaawas.cpp
deleted file mode 100644
index 3bb542efed1..00000000000
--- a/src/mame/video/hanaawas.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Zsolt Vasvari
-/***************************************************************************
-
- video.c
-
- Functions to emulate the video hardware of the machine.
-
-***************************************************************************/
-
-#include "emu.h"
-#include "includes/hanaawas.h"
-
-/***************************************************************************
-
- Convert the color PROMs into a more useable format.
-
-***************************************************************************/
-
-void hanaawas_state::hanaawas_palette(palette_device &palette) const
-{
- uint8_t const *color_prom = memregion("proms")->base();
-
- // create a lookup table for the palette
- for (int i = 0; i < 0x10; i++)
- {
- int bit0, bit1, bit2;
-
- /* red component */
- bit0 = BIT(color_prom[i], 0);
- bit1 = BIT(color_prom[i], 1);
- bit2 = BIT(color_prom[i], 2);
- int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
-
- /* green component */
- bit0 = BIT(color_prom[i], 3);
- bit1 = BIT(color_prom[i], 4);
- bit2 = BIT(color_prom[i], 5);
- int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
-
- /* blue component */
- bit0 = 0;
- bit1 = BIT(color_prom[i], 6);
- bit2 = BIT(color_prom[i], 7);
- int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
-
- palette.set_indirect_color(i, rgb_t(r, g, b));
- }
-
- // color_prom now points to the beginning of the lookup table
- color_prom += 0x20;
-
- // character lookup table. The 1bpp tiles really only use colors 0-0x0f and the 3bpp ones 0x10-0x1f
- for (int i = 0; i < 0x100; i++)
- {
- int const swapped_i = bitswap<8>(i, 2,7,6,5,4,3,1,0);
- uint8_t const ctabentry = color_prom[swapped_i] & 0x0f;
- palette.set_pen_indirect(i, ctabentry);
- }
-}
-
-void hanaawas_state::hanaawas_videoram_w(offs_t offset, uint8_t data)
-{
- m_videoram[offset] = data;
- m_bg_tilemap->mark_tile_dirty(offset);
-}
-
-void hanaawas_state::hanaawas_colorram_w(offs_t offset, uint8_t data)
-{
- m_colorram[offset] = data;
-
- /* dirty both current and next offsets */
- m_bg_tilemap->mark_tile_dirty(offset);
- m_bg_tilemap->mark_tile_dirty((offset + (flip_screen() ? -1 : 1)) & 0x03ff);
-}
-
-void hanaawas_state::hanaawas_portB_w(uint8_t data)
-{
- /* bit 7 is flip screen */
- if (flip_screen() != (~data & 0x80))
- {
- flip_screen_set(~data & 0x80);
- machine().tilemap().mark_all_dirty();
- }
-}
-
-TILE_GET_INFO_MEMBER(hanaawas_state::get_bg_tile_info)
-{
- /* the color is determined by the current color byte, but the bank is via the previous one!!! */
- int offset = (tile_index + (flip_screen() ? 1 : -1)) & 0x3ff;
- int attr = m_colorram[offset];
- int gfxbank = (attr & 0x40) >> 6;
- int code = m_videoram[tile_index] + ((attr & 0x20) << 3);
- int color = m_colorram[tile_index] & 0x1f;
-
- tileinfo.set(gfxbank, code, color, 0);
-}
-
-void hanaawas_state::video_start()
-{
- m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(hanaawas_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
-}
-
-uint32_t hanaawas_state::screen_update_hanaawas(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
- return 0;
-}
diff --git a/src/mame/video/hng64.cpp b/src/mame/video/hng64.cpp
index 75df4d40985..78e5f22fbe4 100644
--- a/src/mame/video/hng64.cpp
+++ b/src/mame/video/hng64.cpp
@@ -176,7 +176,7 @@ void hng64_state::hng64_videoram_w(offs_t offset, uint32_t data, uint32_t mem_ma
/* internal set of transparency states for rendering */
-static void hng64_configure_blit_parameters(blit_parameters *blit, tilemap_t *tmap, bitmap_rgb32 &dest, const rectangle &cliprect, uint32_t flags, uint8_t priority, uint8_t priority_mask, hng64trans_t drawformat)
+void hng64_state::hng64_configure_blit_parameters(blit_parameters *blit, tilemap_t *tmap, bitmap_rgb32 &dest, const rectangle &cliprect, uint32_t flags, uint8_t priority, uint8_t priority_mask, hng64trans_t drawformat)
{
/* start with nothing */
memset(blit, 0, sizeof(*blit));
diff --git a/src/mame/video/hng64_3d.hxx b/src/mame/video/hng64_3d.hxx
index 32e1d31a318..5920a190f5b 100644
--- a/src/mame/video/hng64_3d.hxx
+++ b/src/mame/video/hng64_3d.hxx
@@ -1400,7 +1400,7 @@ void hng64_poly_renderer::drawShaded(polygon *p)
rOptions.texPageVertOffset = p->texPageVertOffset;
// Pass the render data into the rasterizer
- hng64_poly_data& renderData = object_data_alloc();
+ hng64_poly_data& renderData = object_data().next();
renderData = rOptions;
const rectangle& visibleArea = m_state.m_screen->visible_area();
diff --git a/src/mame/video/k001005.cpp b/src/mame/video/k001005.cpp
index e23fccc9fd1..32a24cb25ca 100644
--- a/src/mame/video/k001005.cpp
+++ b/src/mame/video/k001005.cpp
@@ -429,7 +429,7 @@ int k001005_renderer::parse_polygon(int index, uint32_t cmd)
while ((fifo[index] & 0xffff0000) != 0x80000000 && index < m_3dfifo_ptr)
{
- k001005_polydata& extra = object_data_alloc();
+ k001005_polydata& extra = object_data().next();
bool last_vertex = false;
bool is_quad = false;
diff --git a/src/mame/video/k053244_k053245.cpp b/src/mame/video/k053244_k053245.cpp
index 0ca46f52847..fdd82c3344b 100644
--- a/src/mame/video/k053244_k053245.cpp
+++ b/src/mame/video/k053244_k053245.cpp
@@ -42,7 +42,6 @@ main ram and the buffer.
*****************************************************************************/
DEFINE_DEVICE_TYPE(K053244, k05324x_device, "k05324x", "K053244/053245 Sprite Generator")
-decltype(K053244) K053245 = K053244;
const gfx_layout k05324x_device::spritelayout =
{
diff --git a/src/mame/video/k053244_k053245.h b/src/mame/video/k053244_k053245.h
index 1f01fd71a8a..bc534d7a2df 100644
--- a/src/mame/video/k053244_k053245.h
+++ b/src/mame/video/k053244_k053245.h
@@ -64,6 +64,6 @@ private:
DECLARE_DEVICE_TYPE(K053244, k05324x_device)
-DECLARE_DEVICE_TYPE(K053245, k05324x_device)
+static auto &K053245 = K053244;
#endif // MAME_VIDEO_K053244_K053245_H
diff --git a/src/mame/video/k053246_k053247_k055673.cpp b/src/mame/video/k053246_k053247_k055673.cpp
index fcd27f1f065..a6f0d92748e 100644
--- a/src/mame/video/k053246_k053247_k055673.cpp
+++ b/src/mame/video/k053246_k053247_k055673.cpp
@@ -1045,7 +1045,6 @@ void k055673_device::device_start()
DEFINE_DEVICE_TYPE(K053247, k053247_device, "k053247", "K053246/K053247 Sprite Generator")
-decltype(K053247) K053246 = K053247;
k053247_device::k053247_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: k053247_device(mconfig, K053247, tag, owner, clock)
diff --git a/src/mame/video/k053246_k053247_k055673.h b/src/mame/video/k053246_k053247_k055673.h
index 0be6f634af9..32b866335a8 100644
--- a/src/mame/video/k053246_k053247_k055673.h
+++ b/src/mame/video/k053246_k053247_k055673.h
@@ -449,7 +449,7 @@ protected:
};
DECLARE_DEVICE_TYPE(K053247, k053247_device)
-DECLARE_DEVICE_TYPE(K053246, k053247_device)
+static auto &K053246 = K053247;
class k055673_device : public k053247_device
{
diff --git a/src/mame/video/kncljoe.cpp b/src/mame/video/kncljoe.cpp
index ccbcc5ab44f..1edd294cf12 100644
--- a/src/mame/video/kncljoe.cpp
+++ b/src/mame/video/kncljoe.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Ernesto Corvi
/***************************************************************************
-Knuckle Joe - (c) 1985 Taito Corporation
+ Knuckle Joe
***************************************************************************/
@@ -120,7 +120,6 @@ void kncljoe_state::kncljoe_videoram_w(offs_t offset, uint8_t data)
void kncljoe_state::kncljoe_control_w(uint8_t data)
{
- int i;
/*
0x01 screen flip
0x02 coin counter#1
@@ -137,27 +136,19 @@ void kncljoe_state::kncljoe_control_w(uint8_t data)
machine().bookkeeping().coin_counter_w(0, data & 0x02);
machine().bookkeeping().coin_counter_w(1, data & 0x20);
- i = (data & 0x10) >> 4;
- if (m_tile_bank != i)
+ if (m_tile_bank != BIT(data, 4))
{
- m_tile_bank = i;
+ m_tile_bank = BIT(data, 4);
m_bg_tilemap->mark_all_dirty();
}
- i = (data & 0x04) >> 2;
- if (m_sprite_bank != i)
- {
- m_sprite_bank = i;
- memset(memregion("maincpu")->base() + 0xf100, 0, 0x180);
- }
+ m_sprite_bank = BIT(data, 2);
}
void kncljoe_state::kncljoe_scroll_w(offs_t offset, uint8_t data)
{
- int scrollx;
-
m_scrollregs[offset] = data;
- scrollx = m_scrollregs[0] | m_scrollregs[1] << 8;
+ int scrollx = m_scrollregs[0] | m_scrollregs[1] << 8;
m_bg_tilemap->set_scrollx(0, scrollx);
m_bg_tilemap->set_scrollx(1, scrollx);
m_bg_tilemap->set_scrollx(2, scrollx);
@@ -174,42 +165,27 @@ void kncljoe_state::kncljoe_scroll_w(offs_t offset, uint8_t data)
void kncljoe_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
- uint8_t *spriteram = m_spriteram;
- rectangle clip = cliprect;
gfx_element *gfx = m_gfxdecode->gfx(1 + m_sprite_bank);
- int i, j;
- static const int pribase[4]={0x0180, 0x0080, 0x0100, 0x0000};
- const rectangle &visarea = m_screen->visible_area();
- /* score covers sprites */
- if (m_flipscreen)
- {
- if (clip.max_y > visarea.max_y - 64)
- clip.max_y = visarea.max_y - 64;
- }
- else
+ for (int i = 0; i < 4; i++)
{
- if (clip.min_y < visarea.min_y + 64)
- clip.min_y = visarea.min_y + 64;
- }
+ // clip vertical strip for each layer
+ rectangle clip = cliprect;
+ clip.min_y = m_flipscreen ? (191 - i * 64) : (i * 64 + 1);
+ clip.max_y = clip.min_y + 63;
+ clip &= cliprect;
- for (i = 0; i < 4; i++)
- for (j = 0x7c; j >= 0; j -= 4)
+ for (int j = 0x7c; j >= 0; j -= 4)
{
- int offs = pribase[i] + j;
- int sy = spriteram[offs];
- int sx = spriteram[offs + 3];
- int code = spriteram[offs + 2];
- int attr = spriteram[offs + 1];
+ int offs = bitswap<2>(~i, 0, 1) << 7 | j;
+ int sy = m_spriteram[offs] + 1;
+ int sx = m_spriteram[offs + 3];
+ int attr = m_spriteram[offs + 1];
+ int code = m_spriteram[offs + 2] | ((attr & 0x10) << 5) | ((attr & 0x20) << 3);
int flipx = attr & 0x40;
int flipy = !(attr & 0x80);
int color = attr & 0x0f;
- if (attr & 0x10)
- code += 512;
- if (attr & 0x20)
- code += 256;
-
if (m_flipscreen)
{
flipx = !flipx;
@@ -227,6 +203,7 @@ void kncljoe_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprec
flipx,flipy,
sx,sy,0);
}
+ }
}
uint32_t kncljoe_state::screen_update_kncljoe(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
diff --git a/src/mame/video/midtunit.cpp b/src/mame/video/midtunit.cpp
index c49a3daa102..35c57aa7999 100644
--- a/src/mame/video/midtunit.cpp
+++ b/src/mame/video/midtunit.cpp
@@ -902,7 +902,7 @@ void midtunit_video_device::log_bitmap(int command, int bpp, bool Skip)
char name_buf[256];
snprintf(name_buf, 255, "0x%08x.png", raw_offset);
auto const filerr = file.open(name_buf);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
return;
}
@@ -1029,7 +1029,7 @@ void midtunit_video_device::log_bitmap(int command, int bpp, bool Skip)
snprintf(name_buf, 255, "0x%08x.json", raw_offset);
auto const jsonerr = json.open(name_buf);
- if (jsonerr != osd_file::error::NONE)
+ if (jsonerr)
{
return;
}
diff --git a/src/mame/video/midvunit.cpp b/src/mame/video/midvunit.cpp
index 5593c87dbb0..8c2b227edaf 100644
--- a/src/mame/video/midvunit.cpp
+++ b/src/mame/video/midvunit.cpp
@@ -358,7 +358,7 @@ void midvunit_renderer::process_dma_queue()
}
/* set up the object data for this triangle */
- midvunit_object_data &objectdata = object_data_alloc();
+ midvunit_object_data &objectdata = object_data().next();
objectdata.destbase = &m_state.m_videoram[(m_state.m_page_control & 4) ? 0x40000 : 0x00000];
objectdata.texbase = (uint8_t *)m_state.m_textureram.target() + (m_state.m_dma_data[14] * 256);
objectdata.pixdata = pixdata;
diff --git a/src/mame/video/midzeus.cpp b/src/mame/video/midzeus.cpp
index 35b5a4b8af3..6919d177604 100644
--- a/src/mame/video/midzeus.cpp
+++ b/src/mame/video/midzeus.cpp
@@ -579,7 +579,7 @@ void midzeus_state::zeus_register_update(offs_t offset)
// m_zeusbase[0x46] = ??? = 0x00000000
// m_zeusbase[0x4c] = ??? = 0x00808080 (brightness?)
// m_zeusbase[0x4e] = ??? = 0x00808080 (brightness?)
- mz_poly_extra_data& extra = m_poly->object_data_alloc();
+ mz_poly_extra_data& extra = m_poly->object_data().next();
poly_vertex vert[4];
vert[0].x = (int16_t)m_zeusbase[0x08];
@@ -1159,7 +1159,7 @@ void midzeus_renderer::zeus_draw_quad(int long_fmt, const uint32_t *databuffer,
clipvert[i].y += 0.0005f;
}
- mz_poly_extra_data& extra = m_state.m_poly->object_data_alloc();
+ mz_poly_extra_data& extra = m_state.m_poly->object_data().next();
if (ctrl_word & 0x01000000)
{
diff --git a/src/mame/video/model2.cpp b/src/mame/video/model2.cpp
index 4f97141cb89..2c2b6387274 100644
--- a/src/mame/video/model2.cpp
+++ b/src/mame/video/model2.cpp
@@ -771,7 +771,7 @@ void model2_state::model2_3d_process_triangle( raster_state *raster, u32 attr )
void model2_renderer::model2_3d_render(triangle *tri, const rectangle &cliprect)
{
model2_renderer *poly = m_state.m_poly.get();
- m2_poly_extra_data& extra = poly->object_data_alloc();
+ m2_poly_extra_data& extra = poly->object_data().next();
u8 renderer;
/* select renderer based on attributes (bit15 = checker, bit14 = textured, bit13 = transparent */
diff --git a/src/mame/video/model3.cpp b/src/mame/video/model3.cpp
index 8b58c2a2b12..980a682721c 100644
--- a/src/mame/video/model3.cpp
+++ b/src/mame/video/model3.cpp
@@ -2055,7 +2055,7 @@ void model3_renderer::draw_opaque_triangles(const m3_triangle* tris, int num_tri
v[i].p[4] = tri->v[i].p[2];
}
- model3_polydata &extra = object_data_alloc();
+ model3_polydata &extra = object_data().next();
extra.texture = tri->texture;
extra.transparency = tri->transparency;
extra.texture_param = tri->param;
@@ -2083,7 +2083,7 @@ void model3_renderer::draw_opaque_triangles(const m3_triangle* tris, int num_tri
v[i].p[1] = tri->v[i].p[2];
}
- model3_polydata &extra = object_data_alloc();
+ model3_polydata &extra = object_data().next();
extra.color = tri->color;
render_triangle<2>(cliprect, render_delegate(&model3_renderer::draw_scanline_solid, this), v[0], v[1], v[2]);
@@ -2120,7 +2120,7 @@ void model3_renderer::draw_alpha_triangles(const m3_triangle* tris, int num_tris
v[i].p[4] = tri->v[i].p[2];
}
- model3_polydata &extra = object_data_alloc();
+ model3_polydata &extra = object_data().next();
extra.texture = tri->texture;
extra.transparency = tri->transparency;
extra.texture_param = tri->param;
@@ -2137,7 +2137,7 @@ void model3_renderer::draw_alpha_triangles(const m3_triangle* tris, int num_tris
v[i].p[1] = tri->v[i].p[2];
}
- model3_polydata &extra = object_data_alloc();
+ model3_polydata &extra = object_data().next();
extra.color = tri->color;
extra.transparency = tri->transparency;
diff --git a/src/mame/video/n64.cpp b/src/mame/video/n64.cpp
index ea42b9786c9..659355c5be4 100644
--- a/src/mame/video/n64.cpp
+++ b/src/mame/video/n64.cpp
@@ -33,8 +33,8 @@ TODO:
#include <algorithm>
#define LOG_RDP_EXECUTION 0
-#define DEBUG_RDP_PIXEL 0
-#define DRAW_FRAME_COUNTER 0
+#define DEBUG_RDP_PIXEL 0
+#define DRAW_FRAME_COUNTER 0
#if DEBUG_RDP_PIXEL
static bool s_debug_drawing = false;
@@ -2140,7 +2140,7 @@ void n64_rdp::draw_triangle(uint64_t *cmd_buf, bool shade, bool texture, bool zb
{
if(new_object)
{
- object = &object_data_alloc();
+ object = &object_data().next();
memcpy(object->m_tmem, m_tmem.get(), 0x1000);
new_object = false;
}
@@ -2549,16 +2549,16 @@ void n64_rdp::cmd_load_block(uint64_t *cmd_buf)
/*uint16_t tl_masked = tl & 0x3ff;
int32_t load_edge_walker_data[10] = {
- ((cmd_buf[0] >> 32) & 0xff000000) | (0x10 << 19) | (tilenum << 16) | ((tl_masked << 2) | 3),
- (((tl_masked << 2) | 3) << 16) | (tl_masked << 2),
- sh << 16,
- sl << 16,
- sh << 16,
- ((sl << 3) << 16) | (tl << 3),
- (dxt & 0xff) << 8,
- ((0x80 >> wstate->ti_size) << 16) | (dxt >> 8),
- 0x20,
- 0x20
+ ((cmd_buf[0] >> 32) & 0xff000000) | (0x10 << 19) | (tilenum << 16) | ((tl_masked << 2) | 3),
+ (((tl_masked << 2) | 3) << 16) | (tl_masked << 2),
+ sh << 16,
+ sl << 16,
+ sh << 16,
+ ((sl << 3) << 16) | (tl << 3),
+ (dxt & 0xff) << 8,
+ ((0x80 >> wstate->ti_size) << 16) | (dxt >> 8),
+ 0x20,
+ 0x20
};
do_load_edge_walker(load_edge_walker_data);*/
@@ -3016,7 +3016,7 @@ void n64_rdp::cmd_set_combine(uint64_t *cmd_buf)
/*static const char *s_suba_rgb[16] = { "Combined", "TEX0C", "TEX1C", "PRIMC", "SHADEC", "ENVC", "ONE", "NOISE", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO" };
static const char *s_subb_rgb[16] = { "Combined", "TEX0C", "TEX1C", "PRIMC", "SHADEC", "ENVC", "KEYC", "K4", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO" };
static const char *s_mul_rgb[32] = { "Combined", "TEX0C", "TEX1C", "PRIMC", "SHADEC", "ENVC", "KEYS", "CombinedA", "TEX0A", "TEX1A", "PRIMA", "SHADEA", "ENVA", "LODF", "PLODF", "K5",
- "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO" };
+ "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO", "ZERO" };
static const char *s_add_rgb[8] = { "Combined", "TEX0C", "TEX1C", "PRIMC", "SHADEC", "ENVC", "ONE", "ZERO" };
static const char *s_sub_a[16] = { "CombinedA", "TEX0A", "TEX1A", "PRIMA", "SHADEA", "ENVA", "ONE", "ZERO" };
static const char *s_mul_a[16] = { "LODF", "TEX0A", "TEX1A", "PRIMA", "SHADEA", "ENVA", "PLODF", "ZERO" };
@@ -3302,19 +3302,19 @@ void n64_rdp::render_spans(int32_t start, int32_t end, int32_t tilenum, bool fli
switch(m_other_modes.cycle_type)
{
case CYCLE_TYPE_1:
- render_triangle_custom(clip, render_delegate(&n64_rdp::span_draw_1cycle, this), start, (end - start) + 1, spans + offset);
+ render_extents<8>(clip, render_delegate(&n64_rdp::span_draw_1cycle, this), start, (end - start) + 1, spans + offset);
break;
case CYCLE_TYPE_2:
- render_triangle_custom(clip, render_delegate(&n64_rdp::span_draw_2cycle, this), start, (end - start) + 1, spans + offset);
+ render_extents<8>(clip, render_delegate(&n64_rdp::span_draw_2cycle, this), start, (end - start) + 1, spans + offset);
break;
case CYCLE_TYPE_COPY:
- render_triangle_custom(clip, render_delegate(&n64_rdp::span_draw_copy, this), start, (end - start) + 1, spans + offset);
+ render_extents<8>(clip, render_delegate(&n64_rdp::span_draw_copy, this), start, (end - start) + 1, spans + offset);
break;
case CYCLE_TYPE_FILL:
- render_triangle_custom(clip, render_delegate(&n64_rdp::span_draw_fill, this), start, (end - start) + 1, spans + offset);
+ render_extents<8>(clip, render_delegate(&n64_rdp::span_draw_fill, this), start, (end - start) + 1, spans + offset);
break;
}
wait("render spans");
diff --git a/src/mame/video/n64types.h b/src/mame/video/n64types.h
index 0f16eec4176..4fd845593f1 100644
--- a/src/mame/video/n64types.h
+++ b/src/mame/video/n64types.h
@@ -306,7 +306,7 @@ struct rdp_span_aux
uint8_t* m_tmem; /* pointer to texture cache for this polygon */
bool m_start_span;
rgbaint_t m_clamp_diff[8];
- combine_modes_t m_combine;
+ combine_modes_t m_combine;
};
struct z_decompress_entry_t
diff --git a/src/mame/video/n8080.cpp b/src/mame/video/n8080.cpp
index c84feb75c92..742b46a5036 100644
--- a/src/mame/video/n8080.cpp
+++ b/src/mame/video/n8080.cpp
@@ -33,11 +33,11 @@ void helifire_state::helifire_palette(palette_device &palette) const
{
int const level = 0xff * exp(-3 * i / 255.); // capacitor discharge
- palette.set_pen_color(0x000 + 8 + i, rgb_t(0x00, 0x00, level)); // shades of blue
- palette.set_pen_color(0x100 + 8 + i, rgb_t(0x00, 0xc0, level)); // shades of blue w/ green star
+ palette.set_pen_color(0x000 + 8 + i, rgb_t(0x00, 0x00, level)); // shades of blue
+ palette.set_pen_color(0x100 + 8 + i, rgb_t(0x00, 0xc0, level)); // shades of blue w/ green star
- palette.set_pen_color(0x200 + 8 + i, rgb_t(level, 0x00, 0x00)); // shades of red
- palette.set_pen_color(0x300 + 8 + i, rgb_t(level, 0xc0, 0x00)); // shades of red w/ green star
+ palette.set_pen_color(0x200 + 8 + i, rgb_t(level, 0x00, 0x00)); // shades of red
+ palette.set_pen_color(0x300 + 8 + i, rgb_t(level, 0xc0, 0x00)); // shades of red w/ green star
}
}
@@ -126,10 +126,11 @@ void helifire_state::video_start()
uint32_t spacefev_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
+ const bool mono = bool(m_video_conf->read());
uint8_t mask = flip_screen() ? 0xff : 0x00;
uint8_t const *pRAM = m_videoram;
- uint8_t const *const pPROM = memregion("proms")->base();
+ uint8_t const *const pPROM = m_prom->base();
for (int y = 0; y < 256; y++)
{
@@ -154,12 +155,12 @@ uint32_t spacefev_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
{
static const uint8_t ufo_color[] =
{
- 1, /* red */
- 2, /* green */
- 7, /* white */
- 3, /* yellow */
- 5, /* magenta */
- 6, /* cyan */
+ 1, // red
+ 2, // green
+ 7, // white
+ 3, // yellow
+ 5, // magenta
+ 6, // cyan
};
int cycle = screen.frame_number() / 32;
@@ -176,6 +177,9 @@ uint32_t spacefev_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
}
}
+ if (mono)
+ color = 7; // force B&W here
+
for (int n = 0; n < 8; n++)
{
pLine[(x + n) ^ mask] = (pRAM[x >> 3] & (1 << n)) ? color : 0;
@@ -193,7 +197,7 @@ uint32_t sheriff_state::screen_update(screen_device &screen, bitmap_ind16 &bitma
uint8_t mask = flip_screen() ? 0xff : 0x00;
uint8_t const *pRAM = m_videoram;
- uint8_t const *const pPROM = memregion("proms")->base();
+ uint8_t const *const pPROM = m_prom->base();
for (int y = 0; y < 256; y++)
{
@@ -226,8 +230,8 @@ uint32_t sheriff_state::screen_update(screen_device &screen, bitmap_ind16 &bitma
uint32_t helifire_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- int SUN_BRIGHTNESS = ioport("POT0")->read();
- int SEA_BRIGHTNESS = ioport("POT1")->read();
+ const int SUN_BRIGHTNESS = m_pot[0]->read();
+ const int SEA_BRIGHTNESS = m_pot[1]->read();
static const int wave[8] = { 0, 1, 2, 2, 2, 1, 0, 0 };
@@ -240,16 +244,14 @@ uint32_t helifire_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
int level = 120 + wave[m_mv & 7];
- /* draw sky */
-
+ // draw sky
for (int x = level; x < 256; x++)
{
pLine[x] = 0x200 + 8 + SUN_BRIGHTNESS + x - level;
}
- /* draw stars */
-
- if (m_mv % 8 == 4) /* upper half */
+ // draw stars
+ if (m_mv % 8 == 4) // upper half
{
int step = (320 * (m_mv - 0)) % sizeof m_LSFR;
@@ -262,7 +264,7 @@ uint32_t helifire_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
pLine[0x80 + data] |= 0x100;
}
- if (m_mv % 8 == 5) /* lower half */
+ if (m_mv % 8 == 5) // lower half
{
int step = (320 * (m_mv - 1)) % sizeof m_LSFR;
@@ -275,15 +277,13 @@ uint32_t helifire_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
pLine[0x00 + data] |= 0x100;
}
- /* draw sea */
-
+ // draw sea
for (int x = 0; x < level; x++)
{
pLine[x] = 8 + SEA_BRIGHTNESS + x;
}
- /* draw foreground */
-
+ // draw foreground
for (int x = 0; x < 256; x += 8)
{
int offset = 32 * y + (x >> 3);
@@ -307,8 +307,7 @@ uint32_t helifire_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
}
}
- /* next line */
-
+ // next line
next_line();
}
diff --git a/src/mame/video/namcos22.cpp b/src/mame/video/namcos22.cpp
index 754bbe4c646..a852f922a72 100644
--- a/src/mame/video/namcos22.cpp
+++ b/src/mame/video/namcos22.cpp
@@ -293,7 +293,7 @@ void namcos22_renderer::poly3d_drawquad(screen_device &screen, bitmap_rgb32 &bit
}
}
- namcos22_object_data &extra = object_data_alloc();
+ namcos22_object_data &extra = object_data().next();
int flags = node->data.quad.flags;
int color = node->data.quad.color;
int cz_adjust = node->data.quad.cz_adjust;
@@ -420,7 +420,7 @@ void namcos22_renderer::poly3d_drawsprite(
float fsw = sprite_screen_width;
float fsh = sprite_screen_height;
- namcos22_object_data &extra = object_data_alloc();
+ namcos22_object_data &extra = object_data().next();
vertex_t vert[4];
extra.fadefactor = 0;
diff --git a/src/mame/video/pc9801.cpp b/src/mame/video/pc9801.cpp
index 11fe98b7d60..655c1eeea41 100644
--- a/src/mame/video/pc9801.cpp
+++ b/src/mame/video/pc9801.cpp
@@ -30,8 +30,10 @@ uint32_t pc9801_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap
bitmap.fill(m_palette->black_pen(), cliprect);
/* graphics */
- m_hgdc2->screen_update(screen, bitmap, cliprect);
- m_hgdc1->screen_update(screen, bitmap, cliprect);
+ if(m_video_ff[DISPLAY_REG] != 0)
+ m_hgdc[1]->screen_update(screen, bitmap, cliprect);
+ m_hgdc[0]->screen_update(screen, bitmap, cliprect);
+
return 0;
}
@@ -46,39 +48,21 @@ UPD7220_DISPLAY_PIXELS_MEMBER( pc9801_state::hgdc_display_pixels )
{
rgb_t const *const palette = m_palette->palette()->entry_list_raw();
- if(m_video_ff[DISPLAY_REG] == 0) //screen is off
- return;
-
uint8_t colors16_mode = (m_ex_video_ff[ANALOG_16_MODE]) ? 16 : 8;
- if(m_ex_video_ff[ANALOG_256_MODE])
+ for(int xi=0;xi<16;xi++)
{
- uint8_t *ext_gvram = (uint8_t *)m_ext_gvram.target();
- for(int xi=0;xi<16;xi++)
- {
- int res_x = x + xi;
- int res_y = y;
+ int res_x = x + xi;
+ int res_y = y;
- uint8_t pen = ext_gvram[(address)*16+xi+(m_vram_disp*0x40000)];
+ uint8_t pen;
- bitmap.pix(res_y, res_x) = palette[pen + 0x20];
- }
- }
- else
- {
- for(int xi=0;xi<16;xi++)
- {
- int res_x = x + xi;
- int res_y = y;
-
- uint8_t pen;
- pen = ((m_video_ram_2[((address & 0x3fff) + (0x4000) + ((m_vram_disp*0x20000)>>1))] >> xi) & 1) ? 1 : 0;
- pen|= ((m_video_ram_2[((address & 0x3fff) + (0x8000) + ((m_vram_disp*0x20000)>>1))] >> xi) & 1) ? 2 : 0;
- pen|= ((m_video_ram_2[((address & 0x3fff) + (0xc000) + ((m_vram_disp*0x20000)>>1))] >> xi) & 1) ? 4 : 0;
- if(m_ex_video_ff[ANALOG_16_MODE])
- pen|= ((m_video_ram_2[((address & 0x3fff) + (0) + ((m_vram_disp*0x20000)>>1))] >> xi) & 1) ? 8 : 0;
- bitmap.pix(res_y, res_x) = palette[pen + colors16_mode];
- }
+ pen = ((m_video_ram[1][((address & 0x3fff) + (0x4000) + ((m_vram_disp*0x20000)>>1))] >> xi) & 1) ? 1 : 0;
+ pen|= ((m_video_ram[1][((address & 0x3fff) + (0x8000) + ((m_vram_disp*0x20000)>>1))] >> xi) & 1) ? 2 : 0;
+ pen|= ((m_video_ram[1][((address & 0x3fff) + (0xc000) + ((m_vram_disp*0x20000)>>1))] >> xi) & 1) ? 4 : 0;
+ if(m_ex_video_ff[ANALOG_16_MODE])
+ pen|= ((m_video_ram[1][((address & 0x3fff) + (0) + ((m_vram_disp*0x20000)>>1))] >> xi) & 1) ? 8 : 0;
+ bitmap.pix(res_y, res_x) = palette[pen + colors16_mode];
}
}
@@ -107,8 +91,8 @@ UPD7220_DRAW_TEXT_LINE_MEMBER( pc9801_state::hgdc_draw_text )
uint8_t kanji_sel = 0;
uint8_t kanji_lr = 0;
- uint16_t tile = m_video_ram_1[tile_addr & 0xfff] & 0xff;
- uint8_t knj_tile = m_video_ram_1[tile_addr & 0xfff] >> 8;
+ uint16_t tile = m_video_ram[0][tile_addr & 0xfff] & 0xff;
+ uint8_t knj_tile = m_video_ram[0][tile_addr & 0xfff] >> 8;
if(knj_tile)
{
/* Note: bit 7 doesn't really count, if a kanji is enabled then the successive tile is always the second part of it.
@@ -135,7 +119,7 @@ UPD7220_DRAW_TEXT_LINE_MEMBER( pc9801_state::hgdc_draw_text )
{
/* Rori Rori Rolling definitely uses different colors for brake stop PCG elements,
assume that all attributes are recalculated on different strips */
- uint8_t attr = (m_video_ram_1[((tile_addr+kanji_lr) & 0xfff) | 0x1000] & 0xff);
+ uint8_t attr = (m_video_ram[0][((tile_addr+kanji_lr) & 0xfff) | 0x1000] & 0xff);
uint8_t secret = (attr & 1) ^ 1;
uint8_t blink = attr & 2;
@@ -310,7 +294,7 @@ uint8_t pc9801_state::pc9801_a0_r(offs_t offset)
{
case 0x00:
case 0x02:
- return m_hgdc2->read((offset & 2) >> 1);
+ return m_hgdc[1]->read((offset & 2) >> 1);
/* TODO: double check these two */
case 0x04:
return m_vram_disp & 1;
@@ -355,7 +339,7 @@ void pc9801_state::pc9801_a0_w(offs_t offset, uint8_t data)
{
case 0x00:
case 0x02:
- m_hgdc2->write((offset & 2) >> 1,data);
+ m_hgdc[1]->write((offset & 2) >> 1,data);
return;
case 0x04:
m_vram_disp = data & 1;
@@ -452,7 +436,7 @@ void pc9801_state::tvram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
else if(m_video_ff[MEMSW_REG] && ACCESSING_BITS_0_7)
m_memsw->write(offset & 0x0f, data & 0xff);
- COMBINE_DATA(&m_video_ram_1[offset]); //TODO: check me
+ COMBINE_DATA(&m_video_ram[0][offset]); //TODO: check me
}
/*************************************************
@@ -464,15 +448,15 @@ void pc9801_state::tvram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
/* +0x8000 is trusted (bank 0 is actually used by 16 colors mode) */
uint8_t pc9801_state::gvram_r(offs_t offset)
{
- return bitswap<8>(m_video_ram_2[(offset>>1)+0x04000+m_vram_bank*0x10000] >> ((offset & 1) << 3),0,1,2,3,4,5,6,7);
+ return bitswap<8>(m_video_ram[1][(offset>>1)+0x04000+m_vram_bank*0x10000] >> ((offset & 1) << 3),0,1,2,3,4,5,6,7);
}
void pc9801_state::gvram_w(offs_t offset, uint8_t data)
{
- uint16_t ram = m_video_ram_2[(offset>>1)+0x04000+m_vram_bank*0x10000];
+ uint16_t ram = m_video_ram[1][(offset>>1)+0x04000+m_vram_bank*0x10000];
int mask = (offset & 1) << 3;
data = bitswap<8>(data,0,1,2,3,4,5,6,7);
- m_video_ram_2[(offset>>1)+0x04000+m_vram_bank*0x10000] = (ram & (0xff00 >> mask)) | (data << mask);
+ m_video_ram[1][(offset>>1)+0x04000+m_vram_bank*0x10000] = (ram & (0xff00 >> mask)) | (data << mask);
}
/*************************************************
@@ -481,12 +465,12 @@ void pc9801_state::gvram_w(offs_t offset, uint8_t data)
*
************************************************/
-uint16_t pc9801_state::upd7220_grcg_r(offs_t offset, uint16_t mem_mask)
+uint16_t pc9801vm_state::upd7220_grcg_r(offs_t offset, uint16_t mem_mask)
{
uint16_t res = 0;
if(!(m_grcg.mode & 0x80) || machine().side_effects_disabled())
- res = m_video_ram_2[offset];
+ res = m_video_ram[1][offset];
else if(m_ex_video_ff[2])
res = egc_blit_r(offset, mem_mask);
else if(!(m_grcg.mode & 0x40))
@@ -499,7 +483,7 @@ uint16_t pc9801_state::upd7220_grcg_r(offs_t offset, uint16_t mem_mask)
{
if((m_grcg.mode & (1 << i)) == 0)
{
- res |= m_video_ram_2[offset | (((i + 1) & 3) * 0x4000)] ^ (m_grcg.tile[i] | m_grcg.tile[i] << 8);
+ res |= m_video_ram[1][offset | (((i + 1) & 3) * 0x4000)] ^ (m_grcg.tile[i] | m_grcg.tile[i] << 8);
}
}
@@ -509,16 +493,16 @@ uint16_t pc9801_state::upd7220_grcg_r(offs_t offset, uint16_t mem_mask)
return res;
}
-void pc9801_state::upd7220_grcg_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+void pc9801vm_state::upd7220_grcg_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
if(!(m_grcg.mode & 0x80))
- COMBINE_DATA(&m_video_ram_2[offset]);
+ COMBINE_DATA(&m_video_ram[1][offset]);
else if(m_ex_video_ff[2])
egc_blit_w(offset, data, mem_mask);
else
{
int i;
- uint8_t *vram = (uint8_t *)m_video_ram_2.target();
+ uint8_t *vram = (uint8_t *)m_video_ram[1].target();
offset = (offset << 1) & 0x27fff;
if(m_grcg.mode & 0x40) // RMW
@@ -563,7 +547,7 @@ void pc9801_state::upd7220_grcg_w(offs_t offset, uint16_t data, uint16_t mem_mas
*
************************************************/
-uint16_t pc9801_state::egc_color_pat(int plane) const
+uint16_t pc9801vm_state::egc_color_pat(int plane) const
{
uint8_t color = 0;
switch((m_egc.regs[1] >> 13) & 3)
@@ -582,7 +566,7 @@ uint16_t pc9801_state::egc_color_pat(int plane) const
return BIT(color, plane) ? 0xffff : 0;
}
-uint16_t pc9801_state::egc_shift(int plane, uint16_t val)
+uint16_t pc9801vm_state::egc_shift(int plane, uint16_t val)
{
int src_off = m_egc.regs[6] & 0xf, dst_off = (m_egc.regs[6] >> 4) & 0xf;
int left = src_off - dst_off, right = dst_off - src_off;
@@ -616,7 +600,7 @@ uint16_t pc9801_state::egc_shift(int plane, uint16_t val)
return out;
}
-uint16_t pc9801_state::egc_do_partial_op(int plane, uint16_t src, uint16_t pat, uint16_t dst) const
+uint16_t pc9801vm_state::egc_do_partial_op(int plane, uint16_t src, uint16_t pat, uint16_t dst) const
{
uint16_t out = 0;
@@ -631,7 +615,7 @@ uint16_t pc9801_state::egc_do_partial_op(int plane, uint16_t src, uint16_t pat,
return out;
}
-void pc9801_state::egc_blit_w(uint32_t offset, uint16_t data, uint16_t mem_mask)
+void pc9801vm_state::egc_blit_w(uint32_t offset, uint16_t data, uint16_t mem_mask)
{
uint16_t mask = m_egc.regs[4] & mem_mask, out = 0;
bool dir = !(m_egc.regs[6] & 0x1000);
@@ -684,7 +668,7 @@ void pc9801_state::egc_blit_w(uint32_t offset, uint16_t data, uint16_t mem_mask)
src = egc_shift(i, data);
if((m_egc.regs[2] & 0x300) == 0x200)
- pat = m_video_ram_2[offset + (((i + 1) & 3) * 0x4000)];
+ pat = m_video_ram[1][offset + (((i + 1) & 3) * 0x4000)];
switch((m_egc.regs[2] >> 11) & 3)
{
@@ -692,7 +676,7 @@ void pc9801_state::egc_blit_w(uint32_t offset, uint16_t data, uint16_t mem_mask)
out = data;
break;
case 1:
- out = egc_do_partial_op(i, src, pat, m_video_ram_2[offset + (((i + 1) & 3) * 0x4000)]);
+ out = egc_do_partial_op(i, src, pat, m_video_ram[1][offset + (((i + 1) & 3) * 0x4000)]);
break;
case 2:
out = pat;
@@ -702,8 +686,8 @@ void pc9801_state::egc_blit_w(uint32_t offset, uint16_t data, uint16_t mem_mask)
return;
}
- m_video_ram_2[offset + (((i + 1) & 3) * 0x4000)] &= ~mask;
- m_video_ram_2[offset + (((i + 1) & 3) * 0x4000)] |= out & mask;
+ m_video_ram[1][offset + (((i + 1) & 3) * 0x4000)] &= ~mask;
+ m_video_ram[1][offset + (((i + 1) & 3) * 0x4000)] |= out & mask;
}
}
if(mem_mask != 0xffff)
@@ -731,36 +715,36 @@ void pc9801_state::egc_blit_w(uint32_t offset, uint16_t data, uint16_t mem_mask)
}
}
-uint16_t pc9801_state::egc_blit_r(uint32_t offset, uint16_t mem_mask)
+uint16_t pc9801vm_state::egc_blit_r(uint32_t offset, uint16_t mem_mask)
{
uint32_t plane_off = offset & 0x13fff;
if((m_egc.regs[2] & 0x300) == 0x100)
{
- m_egc.pat[0] = m_video_ram_2[plane_off + 0x4000];
- m_egc.pat[1] = m_video_ram_2[plane_off + (0x4000 * 2)];
- m_egc.pat[2] = m_video_ram_2[plane_off + (0x4000 * 3)];
- m_egc.pat[3] = m_video_ram_2[plane_off];
+ m_egc.pat[0] = m_video_ram[1][plane_off + 0x4000];
+ m_egc.pat[1] = m_video_ram[1][plane_off + (0x4000 * 2)];
+ m_egc.pat[2] = m_video_ram[1][plane_off + (0x4000 * 3)];
+ m_egc.pat[3] = m_video_ram[1][plane_off];
}
//TODO: this needs another look
/*if(m_egc.first && !m_egc.init)
{
- m_egc.leftover[0] = m_egc.leftover[1] = m_egc.leftover[2] = m_egc.leftover[3] = 0;
- if(((m_egc.regs[6] >> 4) & 0xf) >= (m_egc.regs[6] & 0xf)) // check if we have enough bits
- m_egc.init = true;
+ m_egc.leftover[0] = m_egc.leftover[1] = m_egc.leftover[2] = m_egc.leftover[3] = 0;
+ if(((m_egc.regs[6] >> 4) & 0xf) >= (m_egc.regs[6] & 0xf)) // check if we have enough bits
+ m_egc.init = true;
}*/
m_egc.init = true;
for(int i = 0; i < 4; i++)
- m_egc.src[i] = egc_shift(i, m_video_ram_2[plane_off + (((i + 1) & 3) * 0x4000)]);
+ m_egc.src[i] = egc_shift(i, m_video_ram[1][plane_off + (((i + 1) & 3) * 0x4000)]);
if(BIT(m_egc.regs[2], 13))
{
uint16_t ret;
// docs say vram is compared to the foreground color register but 4a2 13-14 must be 2
// guess that the other values probably work too
- ret = ~(egc_color_pat(0) ^ m_video_ram_2[plane_off + 0x4000]);
- ret &= ~(egc_color_pat(1) ^ m_video_ram_2[plane_off + (0x4000 * 2)]);
- ret &= ~(egc_color_pat(2) ^ m_video_ram_2[plane_off + (0x4000 * 3)]);
- ret &= ~(egc_color_pat(3) ^ m_video_ram_2[plane_off]);
+ ret = ~(egc_color_pat(0) ^ m_video_ram[1][plane_off + 0x4000]);
+ ret &= ~(egc_color_pat(1) ^ m_video_ram[1][plane_off + (0x4000 * 2)]);
+ ret &= ~(egc_color_pat(2) ^ m_video_ram[1][plane_off + (0x4000 * 3)]);
+ ret &= ~(egc_color_pat(3) ^ m_video_ram[1][plane_off]);
return ret;
}
else
diff --git a/src/mame/video/taito_z.cpp b/src/mame/video/taito_z.cpp
index 8063788df87..d3a1afa8219 100644
--- a/src/mame/video/taito_z.cpp
+++ b/src/mame/video/taito_z.cpp
@@ -2,29 +2,39 @@
// copyright-holders:David Graves
#include "emu.h"
#include "includes/taito_z.h"
-#include "screen.h"
+
/**********************************************************/
-VIDEO_START_MEMBER(taitoz_state,taitoz)
+void contcirc_state::video_start()
{
+ taitoz_z80_sound_state::video_start();
+
m_road_palbank = 3;
- m_sci_spriteframe = 0;
save_item(NAME(m_road_palbank));
+}
+
+void sci_state::video_start()
+{
+ taitoz_z80_sound_state::video_start();
+
+ m_sci_spriteframe = 0;
+
save_item(NAME(m_sci_spriteframe));
}
+
/********************************************************
SPRITE READ AND WRITE HANDLERS
********************************************************/
-u16 taitoz_state::sci_spriteframe_r()
+u16 sci_state::sci_spriteframe_r()
{
- return (m_sci_spriteframe << 8);
+ return m_sci_spriteframe << 8;
}
-void taitoz_state::sci_spriteframe_w(u16 data)
+void sci_state::sci_spriteframe_w(u16 data)
{
m_sci_spriteframe = (data >> 8) & 0xff;
}
@@ -144,7 +154,7 @@ confirmed
********************************************************/
-void taitoz_state::contcirc_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs)
+void contcirc_state::contcirc_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs)
{
int sprites_flipscreen = 0;
static const u32 primasks[2] = { 0xf0, 0xfc };
@@ -232,7 +242,7 @@ void taitoz_state::contcirc_draw_sprites_16x8(screen_device &screen, bitmap_ind1
-void taitoz_state::chasehq_draw_sprites_16x16(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs)
+void taitoz_z80_sound_state::chasehq_draw_sprites_16x16(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs)
{
int sprites_flipscreen = 0;
static const u32 primasks[2] = { 0xf0, 0xfc };
@@ -498,7 +508,7 @@ void taitoz_state::bshark_draw_sprites_16x8(screen_device &screen, bitmap_ind16
-void taitoz_state::sci_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs)
+void sci_state::sci_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs)
{
int sprites_flipscreen = 0;
static const u32 primasks[2] = { 0xf0, 0xfc };
@@ -595,7 +605,7 @@ void taitoz_state::sci_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bi
-void taitoz_state::aquajack_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect,int y_offs)
+void taitoz_z80_sound_state::aquajack_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect,int y_offs)
{
int sprites_flipscreen = 0;
static const u32 primasks[2] = { 0xf0, 0xfc };
@@ -682,7 +692,7 @@ void taitoz_state::aquajack_draw_sprites_16x8(screen_device &screen, bitmap_ind1
-void taitoz_state::spacegun_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect,int y_offs)
+void spacegun_state::spacegun_draw_sprites_16x8(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect,int y_offs)
{
int sprites_flipscreen = 0;
static const u32 primasks[2] = { 0xf0, 0xfc };
@@ -772,7 +782,7 @@ void taitoz_state::spacegun_draw_sprites_16x8(screen_device &screen, bitmap_ind1
SCREEN REFRESH
**************************************************************/
-void taitoz_state::contcirc_out_w(u8 data)
+void contcirc_state::contcirc_out_w(u8 data)
{
/* bit 0 = reset sub CPU */
m_audiocpu->set_input_line(INPUT_LINE_RESET, BIT(data, 0) ? CLEAR_LINE : ASSERT_LINE);
@@ -790,7 +800,7 @@ void taitoz_state::contcirc_out_w(u8 data)
m_road_palbank = (data & 0xc0) >> 6;
}
-WRITE_LINE_MEMBER(taitoz_state::scope_vblank)
+WRITE_LINE_MEMBER(contcirc_state::scope_vblank)
{
if (state)
{
@@ -811,7 +821,7 @@ WRITE_LINE_MEMBER(taitoz_state::scope_vblank)
}
}
-u32 taitoz_state::screen_update_contcirc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 contcirc_state::screen_update_contcirc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 layer[3];
@@ -837,7 +847,7 @@ u32 taitoz_state::screen_update_contcirc(screen_device &screen, bitmap_ind16 &bi
/* Nightstr and ChaseHQ */
-u32 taitoz_state::screen_update_chasehq(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 taitoz_z80_sound_state::screen_update_chasehq(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 layer[3];
@@ -887,7 +897,7 @@ u32 taitoz_state::screen_update_bshark(screen_device &screen, bitmap_ind16 &bitm
}
-u32 taitoz_state::screen_update_sci(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 sci_state::screen_update_sci(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 layer[3];
@@ -912,7 +922,7 @@ u32 taitoz_state::screen_update_sci(screen_device &screen, bitmap_ind16 &bitmap,
}
-u32 taitoz_state::screen_update_aquajack(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 taitoz_z80_sound_state::screen_update_aquajack(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 layer[3];
@@ -937,7 +947,7 @@ u32 taitoz_state::screen_update_aquajack(screen_device &screen, bitmap_ind16 &bi
}
-u32 taitoz_state::screen_update_spacegun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 spacegun_state::screen_update_spacegun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 layer[3];
@@ -962,7 +972,7 @@ u32 taitoz_state::screen_update_spacegun(screen_device &screen, bitmap_ind16 &bi
}
-u32 taitoz_state::screen_update_dblaxle(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 dblaxle_state::screen_update_dblaxle(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 layer[5];
u16 priority;
@@ -997,7 +1007,7 @@ u32 taitoz_state::screen_update_dblaxle(screen_device &screen, bitmap_ind16 &bit
}
-u32 taitoz_state::screen_update_racingb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 sci_state::screen_update_racingb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 layer[5];
u16 priority;
diff --git a/src/mame/video/taxidriv.cpp b/src/mame/video/taxidriv.cpp
deleted file mode 100644
index ddf06c509a5..00000000000
--- a/src/mame/video/taxidriv.cpp
+++ /dev/null
@@ -1,136 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Nicola Salmoria
-#include "emu.h"
-#include "includes/taxidriv.h"
-
-
-void taxidriv_state::spritectrl_w(offs_t offset, uint8_t data)
-{
- m_spritectrl[offset] = data;
-}
-
-
-
-uint32_t taxidriv_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- if (m_bghide)
- {
- bitmap.fill(0, cliprect);
-
-
- /* kludge to fix scroll after death */
- m_scroll[0] = m_scroll[1] = m_scroll[2] = m_scroll[3] = 0;
- m_spritectrl[2] = m_spritectrl[5] = m_spritectrl[8] = 0;
- }
- else
- {
- for (int offs = 0;offs < 0x400;offs++)
- {
- int sx = offs % 32;
- int sy = offs / 32;
-
- m_gfxdecode->gfx(3)->opaque(bitmap,cliprect,
- m_vram3[offs],
- 0,
- 0,0,
- (sx*8-m_scroll[0])&0xff,(sy*8-m_scroll[1])&0xff);
- }
-
- for (int offs = 0;offs < 0x400;offs++)
- {
- int sx = offs % 32;
- int sy = offs / 32;
-
- m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
- m_vram2[offs]+256*m_vram2[offs+0x400],
- 0,
- 0,0,
- (sx*8-m_scroll[2])&0xff,(sy*8-m_scroll[3])&0xff,0);
- }
-
- if (m_spritectrl[2] & 4)
- {
- for (int offs = 0;offs < 0x1000;offs++)
- {
- int sx = ((offs/2) % 64-m_spritectrl[0]-256*(m_spritectrl[2]&1))&0x1ff;
- int sy = ((offs/2) / 64-m_spritectrl[1]-128*(m_spritectrl[2]&2))&0x1ff;
-
- int color = (m_vram5[offs/4]>>(2*(offs&3)))&0x03;
- if (color)
- {
- if (sx > 0 && sx < 256 && sy > 0 && sy < 256)
- bitmap.pix(sy, sx) = color;
- }
- }
- }
-
- if (m_spritectrl[5] & 4)
- {
- for (int offs = 0;offs < 0x1000;offs++)
- {
- int sx = ((offs/2) % 64-m_spritectrl[3]-256*(m_spritectrl[5]&1))&0x1ff;
- int sy = ((offs/2) / 64-m_spritectrl[4]-128*(m_spritectrl[5]&2))&0x1ff;
-
- int color = (m_vram6[offs/4]>>(2*(offs&3)))&0x03;
- if (color)
- {
- if (sx > 0 && sx < 256 && sy > 0 && sy < 256)
- bitmap.pix(sy, sx) = color;
- }
- }
- }
-
- if (m_spritectrl[8] & 4)
- {
- for (int offs = 0;offs < 0x1000;offs++)
- {
- int sx = ((offs/2) % 64-m_spritectrl[6]-256*(m_spritectrl[8]&1))&0x1ff;
- int sy = ((offs/2) / 64-m_spritectrl[7]-128*(m_spritectrl[8]&2))&0x1ff;
-
- int color = (m_vram7[offs/4]>>(2*(offs&3)))&0x03;
- if (color)
- {
- if (sx > 0 && sx < 256 && sy > 0 && sy < 256)
- bitmap.pix(sy, sx) = color;
- }
- }
- }
-
- for (int offs = 0;offs < 0x400;offs++)
- {
- int sx = offs % 32;
- int sy = offs / 32;
-
- m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
- m_vram1[offs],
- 0,
- 0,0,
- sx*8,sy*8,0);
- }
-
- for (int offs = 0;offs < 0x2000;offs++)
- {
- int sx = (offs/2) % 64;
- int sy = (offs/2) / 64;
-
- int color = (m_vram4[offs/4]>>(2*(offs&3)))&0x03;
- if (color)
- {
- bitmap.pix(sy, sx) = 2 * color;
- }
- }
- }
-
- for (int offs = 0;offs < 0x400;offs++)
- {
- int sx = offs % 32;
- int sy = offs / 32;
-
- m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
- m_vram0[offs],
- 0,
- 0,0,
- sx*8,sy*8,0);
- }
- return 0;
-}
diff --git a/src/mame/video/tc0780fpa.cpp b/src/mame/video/tc0780fpa.cpp
index 431478cafa2..26cf36f9fda 100644
--- a/src/mame/video/tc0780fpa.cpp
+++ b/src/mame/video/tc0780fpa.cpp
@@ -1,5 +1,5 @@
// license:LGPL-2.1+
-// copyright-holders:Ville Linde, Angelo Salese, hap
+// copyright-holders:Ville Linde, Angelo Salese
// Taito TC0780FPA Polygon Renderer
@@ -125,7 +125,7 @@ void tc0780fpa_renderer::render_texture_scan(int32_t scanline, const extent_t &e
}
else
{
- iu = (tex_base_x + (((int)u >> 4) & 0x3f)) & 0x7ff;
+ iu = (tex_base_x + (((int)u >> 4) & ((0x08 << tex_wrap_x) - 1))) & 0x7ff;
}
if (!tex_wrap_y)
@@ -134,7 +134,7 @@ void tc0780fpa_renderer::render_texture_scan(int32_t scanline, const extent_t &e
}
else
{
- iv = (tex_base_y + (((int)v >> 4) & 0x3f)) & 0x7ff;
+ iv = (tex_base_y + (((int)v >> 4) & ((0x08 << tex_wrap_y) - 1))) & 0x7ff;
}
texel = m_texture[(iv * 2048) + iu];
@@ -156,7 +156,6 @@ void tc0780fpa_renderer::render_texture_scan(int32_t scanline, const extent_t &e
void tc0780fpa_renderer::render(uint16_t *polygon_fifo, int length)
{
vertex_t vert[4];
- int i;
uint16_t cmd = polygon_fifo[0];
@@ -207,7 +206,7 @@ void tc0780fpa_renderer::render(uint16_t *polygon_fifo, int length)
// 0x0b: Vertex 3 X
// 0x0c: Vertex 3 Z
- for (i=0; i < 3; i++)
+ for (int i=0; i < 3; i++)
{
vert[i].p[1] = polygon_fifo[ptr++];
vert[i].y = (int16_t)(polygon_fifo[ptr++]);
@@ -255,18 +254,18 @@ void tc0780fpa_renderer::render(uint16_t *polygon_fifo, int length)
// 0x12: Vertex 3 X
// 0x13: Vertex 3 Z
- tc0780fpa_polydata &extra = object_data_alloc();
+ tc0780fpa_polydata &extra = object_data().next();
uint16_t texbase = polygon_fifo[ptr++];
extra.tex_base_x = ((texbase >> 0) & 0xff) << 4;
extra.tex_base_y = ((texbase >> 8) & 0xff) << 4;
- extra.tex_wrap_x = (cmd & 0xc0) ? 1 : 0;
- extra.tex_wrap_y = (cmd & 0x30) ? 1 : 0;
+ extra.tex_wrap_x = (cmd >> 6) & 3;
+ extra.tex_wrap_y = (cmd >> 4) & 3;
- for (i=0; i < 3; i++)
+ for (int i=0; i < 3; i++)
{
- vert[i].p[3] = polygon_fifo[ptr++] + 0.5; // palette
+ vert[i].p[3] = polygon_fifo[ptr++] + 0.5; // palette
vert[i].p[2] = (int16_t)(polygon_fifo[ptr++]);
vert[i].p[1] = (int16_t)(polygon_fifo[ptr++]);
vert[i].y = (int16_t)(polygon_fifo[ptr++]);
@@ -302,7 +301,7 @@ void tc0780fpa_renderer::render(uint16_t *polygon_fifo, int length)
// 0x0f: Vertex 4 X
// 0x10: Vertex 4 Z
- for (i=0; i < 4; i++)
+ for (int i=0; i < 4; i++)
{
vert[i].p[1] = polygon_fifo[ptr++];
vert[i].y = (int16_t)(polygon_fifo[ptr++]);
@@ -357,18 +356,18 @@ void tc0780fpa_renderer::render(uint16_t *polygon_fifo, int length)
// 0x18: Vertex 4 X
// 0x19: Vertex 4 Z
- tc0780fpa_polydata &extra = object_data_alloc();
+ tc0780fpa_polydata &extra = object_data().next();
uint16_t texbase = polygon_fifo[ptr++];
extra.tex_base_x = ((texbase >> 0) & 0xff) << 4;
extra.tex_base_y = ((texbase >> 8) & 0xff) << 4;
- extra.tex_wrap_x = (cmd & 0xc0) ? 1 : 0;
- extra.tex_wrap_y = (cmd & 0x30) ? 1 : 0;
+ extra.tex_wrap_x = (cmd >> 6) & 3;
+ extra.tex_wrap_y = (cmd >> 4) & 3;
- for (i=0; i < 4; i++)
+ for (int i=0; i < 4; i++)
{
- vert[i].p[3] = polygon_fifo[ptr++] + 0.5; // palette
+ vert[i].p[3] = polygon_fifo[ptr++] + 0.5; // palette
vert[i].p[2] = (int16_t)(polygon_fifo[ptr++]);
vert[i].p[1] = (int16_t)(polygon_fifo[ptr++]);
vert[i].y = (int16_t)(polygon_fifo[ptr++]);
@@ -376,7 +375,7 @@ void tc0780fpa_renderer::render(uint16_t *polygon_fifo, int length)
vert[i].p[0] = (uint16_t)(polygon_fifo[ptr++]);
}
- if (vert[0].p[0] < 0x8000 && vert[1].p[0] < 0x8000 && vert[2].p[0] < 0x8000 && vert[3].p[0] < 0x8000)
+ if (vert[0].p[0] < 0xc000 && vert[1].p[0] < 0xc000 && vert[2].p[0] < 0xc000 && vert[3].p[0] < 0xc000)
{
render_polygon<4, 4>(m_cliprect, render_delegate(&tc0780fpa_renderer::render_texture_scan, this), vert);
}
diff --git a/src/mame/video/toaplan1.cpp b/src/mame/video/toaplan1.cpp
index a3ce5ddc52e..47d00a00064 100644
--- a/src/mame/video/toaplan1.cpp
+++ b/src/mame/video/toaplan1.cpp
@@ -229,7 +229,6 @@ void toaplan1_state::register_common()
void toaplan1_rallybik_state::video_start()
{
- m_spritegen->alloc_sprite_bitmap(*m_screen);
m_spritegen->gfx(0)->set_colorbase(64*16);
create_tilemaps();
@@ -671,6 +670,18 @@ void toaplan1_state::log_vram()
Sprite Handlers
***************************************************************************/
+void toaplan1_rallybik_state::pri_cb(u8 priority, u32 &pri_mask)
+{
+ switch (priority)
+ {
+ case 0: pri_mask = GFX_PMASK_1|GFX_PMASK_2|GFX_PMASK_4|GFX_PMASK_8; break; // disable?
+ case 1: pri_mask = GFX_PMASK_2|GFX_PMASK_4|GFX_PMASK_8; break; // over tilemap priority ~0x4, under tilemap priority 0x5~
+ case 2: pri_mask = GFX_PMASK_4|GFX_PMASK_8; break; // over tilemap priority ~0x8, under tilemap priority 0x9~
+ case 3: pri_mask = GFX_PMASK_8; break; // over tilemap priority ~0xc, under tilemap priority 0xd~
+ }
+}
+
+
void toaplan1_state::draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
u16 *source = (u16 *)m_buffered_spriteram.get();
@@ -744,26 +755,24 @@ u32 toaplan1_rallybik_state::screen_update(screen_device &screen, bitmap_rgb32 &
{
log_vram();
- m_spritegen->draw_sprites_to_tempbitmap(cliprect, m_buffered_spriteram.get(), m_spriteram.bytes());
+ screen.priority().fill(0, cliprect);
// first draw everything, including "disabled" tiles and priority 0
- m_tilemap[0]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0);
+ m_tilemap[0]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 1);
// then draw the higher priority layers in order
for (int priority = 1; priority < 16; priority++)
{
- m_tilemap[3]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(priority), 0);
- m_tilemap[2]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(priority), 0);
- m_tilemap[1]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(priority), 0);
- m_tilemap[0]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(priority), 0);
-
- //if (pririoty==0x00) m_spritegen->copy_sprites_from_tempbitmap(bitmap,cliprect,0);
- if (priority==0x04) m_spritegen->copy_sprites_from_tempbitmap(bitmap,cliprect,1);
- if (priority==0x08) m_spritegen->copy_sprites_from_tempbitmap(bitmap,cliprect,2);
- if (priority==0x0c) m_spritegen->copy_sprites_from_tempbitmap(bitmap,cliprect,3);
-
+ // get priority mask
+ // value: 0x1 (tilemap priority 0x0~0x4), 0x2 (tilemap priority 0x5~0x8), 0x4 (tilemap priority 0x9~0xc), 0x8 (tilemap priority 0xd~)
+ int primask = 1 << (((priority - 1) >> 2));
+ m_tilemap[3]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(priority), primask);
+ m_tilemap[2]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(priority), primask);
+ m_tilemap[1]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(priority), primask);
+ m_tilemap[0]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(priority), primask);
}
+ m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram.get(), m_spriteram.bytes());
return 0;
}
diff --git a/src/mame/video/toaplan_scu.cpp b/src/mame/video/toaplan_scu.cpp
index a7bb72c6e3b..815e8fc99aa 100644
--- a/src/mame/video/toaplan_scu.cpp
+++ b/src/mame/video/toaplan_scu.cpp
@@ -1,8 +1,8 @@
// license:BSD-3-Clause
// copyright-holders:Quench
/* Toaplan Sprite Controller 'SCU'
- used by video/twincobr.c (including wardner)
- and rallybik in toaplan1.c
+ used by video/twincobr.cpp (including wardner)
+ and rallybik in toaplan1.cpp
*/
@@ -32,31 +32,28 @@ GFXDECODE_END
toaplan_scu_device::toaplan_scu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, TOAPLAN_SCU, tag, owner, clock)
, device_gfx_interface(mconfig, *this, gfxinfo)
+ , device_video_interface(mconfig, *this)
+ , m_pri_cb(*this)
{
}
void toaplan_scu_device::device_start()
{
+ m_pri_cb.resolve();
}
void toaplan_scu_device::device_reset()
{
}
-void toaplan_scu_device::alloc_sprite_bitmap(screen_device &screen)
-{
- screen.register_screen_bitmap(m_temp_spritebitmap);
-}
-
/***************************************************************************
Sprite Handlers
***************************************************************************/
-void toaplan_scu_device::draw_sprites_to_tempbitmap(const rectangle &cliprect, u16* spriteram, u32 bytes)
+template<class BitmapClass>
+void toaplan_scu_device::draw_sprites_common(BitmapClass &bitmap, const rectangle &cliprect, u16* spriteram, u32 bytes)
{
- m_temp_spritebitmap.fill(0, cliprect);
-
- for (int offs = 0; offs < bytes / 2; offs += 4)
+ for (int offs = (bytes / 2) - 4; offs >= 0; offs -= 4)
{
const u16 attribute = spriteram[offs + 1];
const int priority = (attribute & 0x0c00) >> 10;
@@ -69,49 +66,34 @@ void toaplan_scu_device::draw_sprites_to_tempbitmap(const rectangle &cliprect, u
{
const u32 sprite = spriteram[offs] & 0x7ff;
u32 color = attribute & 0x3f;
- color |= priority << 6; // encode colour
+ u32 pri_mask = 0; // priority mask
+ if (!m_pri_cb.isnull())
+ m_pri_cb(priority, pri_mask);
int sx = spriteram[offs + 2] >> 7;
const int flipx = attribute & 0x100;
if (flipx) sx -= m_xoffs_flipped;
const int flipy = attribute & 0x200;
- gfx(0)->transpen_raw(m_temp_spritebitmap, cliprect,
+ gfx(0)->prio_transpen(bitmap, cliprect,
sprite,
- color << 4 /* << 4 because using _raw */ ,
+ color,
flipx, flipy,
- sx - m_xoffs, sy - 16, 0);
+ sx - m_xoffs, sy - 16, screen().priority(), pri_mask, 0);
}
}
-
}
-/***************************************************************************
- Draw the game screen in the given bitmap.
-***************************************************************************/
-
-void toaplan_scu_device::copy_sprites_from_tempbitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect, int priority)
+void toaplan_scu_device::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, u16* spriteram, u32 bytes)
{
- pen_t const *const pens = &palette().pen(gfx(0)->colorbase());
-
- for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
- {
- u16 const *const srcline = &m_temp_spritebitmap.pix(y);
- u32 *const dstline = &bitmap.pix(y);
+ draw_sprites_common(bitmap, cliprect, spriteram, bytes);
+}
- for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
- {
- const u16 pix = srcline[x];
-
- if ((pix >> (4 + 6)) == priority)
- {
- if (pix & 0xf)
- {
- dstline[x] = pens[pix & 0x3ff];
- }
- }
- }
- }
+void toaplan_scu_device::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, u16* spriteram, u32 bytes)
+{
+ draw_sprites_common(bitmap, cliprect, spriteram, bytes);
}
+
+
diff --git a/src/mame/video/toaplan_scu.h b/src/mame/video/toaplan_scu.h
index 4844f239af7..cbd9b0e9832 100644
--- a/src/mame/video/toaplan_scu.h
+++ b/src/mame/video/toaplan_scu.h
@@ -6,32 +6,35 @@
#pragma once
-
-class toaplan_scu_device : public device_t, public device_gfx_interface
+class toaplan_scu_device : public device_t, public device_gfx_interface, public device_video_interface
{
public:
toaplan_scu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ typedef device_delegate<void (u8 priority, u32 &pri_mask)> pri_cb_delegate;
+
// configuration
void set_xoffsets(int xoffs, int xoffs_flipped)
{
m_xoffs = xoffs;
m_xoffs_flipped = xoffs_flipped;
}
+ template <typename... T> void set_pri_callback(T &&... args) { m_pri_cb.set(std::forward<T>(args)...); }
- void draw_sprites_to_tempbitmap(const rectangle &cliprect, u16* spriteram, u32 bytes);
- void copy_sprites_from_tempbitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect, int priority);
- void alloc_sprite_bitmap(screen_device &screen);
+ void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, u16* spriteram, u32 bytes);
+ void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, u16* spriteram, u32 bytes);
protected:
virtual void device_start() override;
virtual void device_reset() override;
private:
+ template<class BitmapClass> void draw_sprites_common(BitmapClass &bitmap, const rectangle &cliprect, u16* spriteram, u32 bytes);
+
static const gfx_layout spritelayout;
DECLARE_GFXDECODE_MEMBER(gfxinfo);
- bitmap_ind16 m_temp_spritebitmap;
+ pri_cb_delegate m_pri_cb;
int m_xoffs;
int m_xoffs_flipped;
};
diff --git a/src/mame/video/twincobr.cpp b/src/mame/video/twincobr.cpp
index d6432cc3643..4159174a534 100644
--- a/src/mame/video/twincobr.cpp
+++ b/src/mame/video/twincobr.cpp
@@ -78,8 +78,6 @@ void twincobr_state::twincobr_create_tilemaps()
void twincobr_state::video_start()
{
- m_spritegen->alloc_sprite_bitmap(*m_screen);
-
/* the video RAM is accessed via ports, it's not memory mapped */
m_txvideoram_size = 0x0800;
m_bgvideoram_size = 0x2000; /* banked two times 0x1000 */
@@ -364,22 +362,21 @@ void twincobr_state::log_vram()
}
-u32 twincobr_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+void twincobr_state::pri_cb(u8 priority, u32 &pri_mask)
{
- log_vram();
-
- u16 *buffered_spriteram16;
- u32 bytes;
- if (m_spriteram16 != nullptr)
- {
- buffered_spriteram16 = m_spriteram16->buffer();
- bytes = m_spriteram16->bytes();
- }
- else
+ switch (priority)
{
- buffered_spriteram16 = reinterpret_cast<u16 *>(m_spriteram8->buffer());
- bytes = m_spriteram8->bytes();
+ case 0: pri_mask = GFX_PMASK_1|GFX_PMASK_2|GFX_PMASK_4; break; // disable?
+ case 1: pri_mask = GFX_PMASK_2|GFX_PMASK_4; break; // over background, under foreground/text
+ case 2: pri_mask = GFX_PMASK_4; break; // over background/foreground, under text
+ case 3: pri_mask = 0; break; // over everything
}
+}
+
+
+u32 twincobr_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ log_vram();
if (!m_display_on)
{
@@ -387,14 +384,25 @@ u32 twincobr_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, c
}
else
{
- m_spritegen->draw_sprites_to_tempbitmap(cliprect, buffered_spriteram16, bytes);
-
- m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0);
- m_spritegen->copy_sprites_from_tempbitmap(bitmap,cliprect,1);
- m_fg_tilemap->draw(screen, bitmap, cliprect, 0,0);
- m_spritegen->copy_sprites_from_tempbitmap(bitmap,cliprect,2);
- m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0);
- m_spritegen->copy_sprites_from_tempbitmap(bitmap,cliprect,3);
+ screen.priority().fill(0, cliprect);
+
+ u16 *buffered_spriteram16;
+ u32 bytes;
+ if (m_spriteram16 != nullptr)
+ {
+ buffered_spriteram16 = m_spriteram16->buffer();
+ bytes = m_spriteram16->bytes();
+ }
+ else
+ {
+ buffered_spriteram16 = reinterpret_cast<u16 *>(m_spriteram8->buffer());
+ bytes = m_spriteram8->bytes();
+ }
+
+ m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE,1);
+ m_fg_tilemap->draw(screen, bitmap, cliprect, 0,2);
+ m_tx_tilemap->draw(screen, bitmap, cliprect, 0,4);
+ m_spritegen->draw_sprites(bitmap, cliprect, buffered_spriteram16, bytes);
}
return 0;
diff --git a/src/mame/video/tx0.cpp b/src/mame/video/tx0.cpp
index 619697226bf..4b06ccf9942 100644
--- a/src/mame/video/tx0.cpp
+++ b/src/mame/video/tx0.cpp
@@ -56,8 +56,8 @@ WRITE_LINE_MEMBER(tx0_state::screen_vblank_tx0)
void tx0_state::tx0_plot(int x, int y)
{
/* compute pixel coordinates and plot */
- x = x*crt_window_width/0777;
- y = y*crt_window_height/0777;
+ x = (x ^ 0400) * crt_window_width / 0777;
+ y = (y ^ 0400) * crt_window_height / 0777;
m_crt->plot(x, y);
}
diff --git a/src/mame/video/xbox_nv2a.cpp b/src/mame/video/xbox_nv2a.cpp
index 56bbea3ad0d..51cf7366b09 100644
--- a/src/mame/video/xbox_nv2a.cpp
+++ b/src/mame/video/xbox_nv2a.cpp
@@ -4319,7 +4319,7 @@ float nv2a_renderer::combiner_map_input_function(Combiner::MapFunction code, flo
case 0: // unsigned identity
return std::max(0.0f, value);
case 1: // unsigned invert
- return 1.0f - std::min(std::max(value, 0.0f), 1.0f);
+ return 1.0f - std::clamp(value, 0.0f, 1.0f);
case 2: // expand normal
return 2.0f * std::max(0.0f, value) - 1.0f;
case 3: // expand negate
@@ -4348,9 +4348,9 @@ void nv2a_renderer::combiner_map_input_function_array(Combiner::MapFunction code
data[2] = std::max(0.0f, data[2]);
break;
case 1:
- data[0] = 1.0f - std::min(std::max(data[0], 0.0f), 1.0f);
- data[1] = 1.0f - std::min(std::max(data[1], 0.0f), 1.0f);
- data[2] = 1.0f - std::min(std::max(data[2], 0.0f), 1.0f);
+ data[0] = 1.0f - std::clamp(data[0], 0.0f, 1.0f);
+ data[1] = 1.0f - std::clamp(data[1], 0.0f, 1.0f);
+ data[2] = 1.0f - std::clamp(data[2], 0.0f, 1.0f);
break;
case 2:
data[0] = 2.0f * std::max(0.0f, data[0]) - 1.0f;
@@ -4697,9 +4697,9 @@ void nv2a_renderer::combiner_compute_rgb_outputs(int id, int stage_number)
m = 0;
combiner_function_AB(id, combiner.work[id].functions.RGBop1);
}
- combiner.work[id].functions.RGBop1[0] = std::max(std::min((combiner.work[id].functions.RGBop1[0] + bias) * scale, 1.0f), -1.0f);
- combiner.work[id].functions.RGBop1[1] = std::max(std::min((combiner.work[id].functions.RGBop1[1] + bias) * scale, 1.0f), -1.0f);
- combiner.work[id].functions.RGBop1[2] = std::max(std::min((combiner.work[id].functions.RGBop1[2] + bias) * scale, 1.0f), -1.0f);
+ combiner.work[id].functions.RGBop1[0] = std::clamp((combiner.work[id].functions.RGBop1[0] + bias) * scale, -1.0f, 1.0f);
+ combiner.work[id].functions.RGBop1[1] = std::clamp((combiner.work[id].functions.RGBop1[1] + bias) * scale, -1.0f, 1.0f);
+ combiner.work[id].functions.RGBop1[2] = std::clamp((combiner.work[id].functions.RGBop1[2] + bias) * scale, -1.0f, 1.0f);
// second
if (combiner.setup.stage[n].mapout_rgb.CD_dotproduct) {
m = m | 1;
@@ -4707,18 +4707,18 @@ void nv2a_renderer::combiner_compute_rgb_outputs(int id, int stage_number)
}
else
combiner_function_CD(id, combiner.work[id].functions.RGBop2);
- combiner.work[id].functions.RGBop2[0] = std::max(std::min((combiner.work[id].functions.RGBop2[0] + bias) * scale, 1.0f), -1.0f);
- combiner.work[id].functions.RGBop2[1] = std::max(std::min((combiner.work[id].functions.RGBop2[1] + bias) * scale, 1.0f), -1.0f);
- combiner.work[id].functions.RGBop2[2] = std::max(std::min((combiner.work[id].functions.RGBop2[2] + bias) * scale, 1.0f), -1.0f);
+ combiner.work[id].functions.RGBop2[0] = std::clamp((combiner.work[id].functions.RGBop2[0] + bias) * scale, -1.0f, 1.0f);
+ combiner.work[id].functions.RGBop2[1] = std::clamp((combiner.work[id].functions.RGBop2[1] + bias) * scale, -1.0f, 1.0f);
+ combiner.work[id].functions.RGBop2[2] = std::clamp((combiner.work[id].functions.RGBop2[2] + bias) * scale, -1.0f, 1.0f);
// third
if (m == 0) {
if (combiner.setup.stage[n].mapout_rgb.muxsum)
combiner_function_ABmuxCD(id, combiner.work[id].functions.RGBop3);
else
combiner_function_ABsumCD(id, combiner.work[id].functions.RGBop3);
- combiner.work[id].functions.RGBop3[0] = std::max(std::min((combiner.work[id].functions.RGBop3[0] + bias) * scale, 1.0f), -1.0f);
- combiner.work[id].functions.RGBop3[1] = std::max(std::min((combiner.work[id].functions.RGBop3[1] + bias) * scale, 1.0f), -1.0f);
- combiner.work[id].functions.RGBop3[2] = std::max(std::min((combiner.work[id].functions.RGBop3[2] + bias) * scale, 1.0f), -1.0f);
+ combiner.work[id].functions.RGBop3[0] = std::clamp((combiner.work[id].functions.RGBop3[0] + bias) * scale, -1.0f, 1.0f);
+ combiner.work[id].functions.RGBop3[1] = std::clamp((combiner.work[id].functions.RGBop3[1] + bias) * scale, -1.0f, 1.0f);
+ combiner.work[id].functions.RGBop3[2] = std::clamp((combiner.work[id].functions.RGBop3[2] + bias) * scale, -1.0f, 1.0f);
}
}
@@ -4749,10 +4749,10 @@ void nv2a_renderer::combiner_compute_alpha_outputs(int id, int stage_number)
}
// first
combiner.work[id].functions.Aop1 = combiner.work[id].variables.A[3] * combiner.work[id].variables.B[3];
- combiner.work[id].functions.Aop1 = std::max(std::min((combiner.work[id].functions.Aop1 + bias) * scale, 1.0f), -1.0f);
+ combiner.work[id].functions.Aop1 = std::clamp((combiner.work[id].functions.Aop1 + bias) * scale, -1.0f, 1.0f);
// second
combiner.work[id].functions.Aop2 = combiner.work[id].variables.C[3] * combiner.work[id].variables.D[3];
- combiner.work[id].functions.Aop2 = std::max(std::min((combiner.work[id].functions.Aop2 + bias) * scale, 1.0f), -1.0f);
+ combiner.work[id].functions.Aop2 = std::clamp((combiner.work[id].functions.Aop2 + bias) * scale, -1.0f, 1.0f);
// third
if (combiner.setup.stage[n].mapout_alpha.muxsum) {
if (combiner.work[id].registers.spare0[3] >= 0.5f)
@@ -4762,7 +4762,7 @@ void nv2a_renderer::combiner_compute_alpha_outputs(int id, int stage_number)
}
else
combiner.work[id].functions.Aop3 = combiner.work[id].variables.A[3] * combiner.work[id].variables.B[3] + combiner.work[id].variables.C[3] * combiner.work[id].variables.D[3];
- combiner.work[id].functions.Aop3 = std::max(std::min((combiner.work[id].functions.Aop3 + bias) * scale, 1.0f), -1.0f);
+ combiner.work[id].functions.Aop3 = std::clamp((combiner.work[id].functions.Aop3 + bias) * scale, -1.0f, 1.0f);
}
WRITE_LINE_MEMBER(nv2a_renderer::vblank_callback)
diff --git a/src/osd/asio.h b/src/osd/asio.h
index 3ee31a467d7..d59a90b8929 100644
--- a/src/osd/asio.h
+++ b/src/osd/asio.h
@@ -17,7 +17,7 @@
#pragma GCC diagnostic ignored "-Wunused-variable"
#endif
-#if defined(WIN32) && !defined(_WIN32_WINNT)
+#if defined(_WIN32) && !defined(_WIN32_WINNT)
#if defined(OSD_WINDOWS)
#define _WIN32_WINNT 0x0501
#else
diff --git a/src/osd/modules/debugger/debuggdbstub.cpp b/src/osd/modules/debugger/debuggdbstub.cpp
index 8a6dc2226e3..55f09087f35 100644
--- a/src/osd/modules/debugger/debuggdbstub.cpp
+++ b/src/osd/modules/debugger/debuggdbstub.cpp
@@ -421,6 +421,7 @@ class debug_gdbstub : public osd_module, public debug_module
public:
debug_gdbstub()
: osd_module(OSD_DEBUG_PROVIDER, "gdbstub"), debug_module(),
+ m_readbuf_state(PACKET_START),
m_machine(nullptr),
m_maincpu(nullptr),
m_state(nullptr),
@@ -647,7 +648,8 @@ void debug_gdbstub::wait_for_debugger(device_t &device, bool firststop)
if ( it == gdb_register_maps.end() )
fatalerror("gdbstub: cpuname %s not found in gdb stub descriptions\n", cpuname);
- m_state = &m_maincpu->state();
+ m_maincpu->interface(m_state);
+ assert(m_state != nullptr);
m_memory = &m_maincpu->memory();
m_address_space = &m_memory->space(AS_PROGRAM);
m_debugger_cpu = &m_machine->debugger().cpu();
@@ -706,8 +708,8 @@ void debug_gdbstub::wait_for_debugger(device_t &device, bool firststop)
#endif
std::string socket_name = string_format("socket.localhost:%d", m_debugger_port);
- osd_file::error filerr = m_socket.open(socket_name);
- if ( filerr != osd_file::error::NONE )
+ std::error_condition const filerr = m_socket.open(socket_name);
+ if ( filerr )
fatalerror("gdbstub: failed to start listening on port %d\n", m_debugger_port);
osd_printf_info("gdbstub: listening on port %d\n", m_debugger_port);
diff --git a/src/osd/modules/debugger/debugimgui.cpp b/src/osd/modules/debugger/debugimgui.cpp
index 23cc8ef66ba..1046118899c 100644
--- a/src/osd/modules/debugger/debugimgui.cpp
+++ b/src/osd/modules/debugger/debugimgui.cpp
@@ -844,23 +844,23 @@ void debug_imgui::draw_memory(debug_area* view_ptr, bool* opened)
auto* mem = downcast<debug_view_memory*>(view_ptr->view);
bool physical = mem->physical();
bool rev = mem->reverse();
- int format = mem->get_data_format();
+ debug_view_memory::data_format format = mem->get_data_format();
uint32_t chunks = mem->chunks_per_row();
- if(ImGui::MenuItem("1-byte chunks", nullptr,(format == 1) ? true : false))
- mem->set_data_format(1);
- if(ImGui::MenuItem("2-byte chunks", nullptr,(format == 2) ? true : false))
- mem->set_data_format(2);
- if(ImGui::MenuItem("4-byte chunks", nullptr,(format == 4) ? true : false))
- mem->set_data_format(4);
- if(ImGui::MenuItem("8-byte chunks", nullptr,(format == 8) ? true : false))
- mem->set_data_format(8);
- if(ImGui::MenuItem("32-bit floating point", nullptr,(format == 9) ? true : false))
- mem->set_data_format(9);
- if(ImGui::MenuItem("64-bit floating point", nullptr,(format == 10) ? true : false))
- mem->set_data_format(10);
- if(ImGui::MenuItem("80-bit floating point", nullptr,(format == 11) ? true : false))
- mem->set_data_format(11);
+ if(ImGui::MenuItem("1-byte chunks", nullptr,(format == debug_view_memory::data_format::HEX_8BIT) ? true : false))
+ mem->set_data_format(debug_view_memory::data_format::HEX_8BIT);
+ if(ImGui::MenuItem("2-byte chunks", nullptr,(format == debug_view_memory::data_format::HEX_16BIT) ? true : false))
+ mem->set_data_format(debug_view_memory::data_format::HEX_16BIT);
+ if(ImGui::MenuItem("4-byte chunks", nullptr,(format == debug_view_memory::data_format::HEX_32BIT) ? true : false))
+ mem->set_data_format(debug_view_memory::data_format::HEX_32BIT);
+ if(ImGui::MenuItem("8-byte chunks", nullptr,(format == debug_view_memory::data_format::HEX_64BIT) ? true : false))
+ mem->set_data_format(debug_view_memory::data_format::HEX_64BIT);
+ if(ImGui::MenuItem("32-bit floating point", nullptr,(format == debug_view_memory::data_format::FLOAT_32BIT) ? true : false))
+ mem->set_data_format(debug_view_memory::data_format::FLOAT_32BIT);
+ if(ImGui::MenuItem("64-bit floating point", nullptr,(format == debug_view_memory::data_format::FLOAT_64BIT) ? true : false))
+ mem->set_data_format(debug_view_memory::data_format::FLOAT_64BIT);
+ if(ImGui::MenuItem("80-bit floating point", nullptr,(format == debug_view_memory::data_format::FLOAT_80BIT) ? true : false))
+ mem->set_data_format(debug_view_memory::data_format::FLOAT_80BIT);
ImGui::Separator();
if(ImGui::MenuItem("Logical addresses", nullptr,!physical))
mem->set_physical(false);
@@ -938,7 +938,7 @@ void debug_imgui::mount_image()
{
if(m_selected_file != nullptr)
{
- osd_file::error err;
+ std::error_condition err;
switch(m_selected_file->type)
{
case file_entry_type::DRIVE:
@@ -947,7 +947,7 @@ void debug_imgui::mount_image()
util::zippath_directory::ptr dir;
err = util::zippath_directory::open(m_selected_file->fullpath, dir);
}
- if(err == osd_file::error::NONE)
+ if(!err)
{
m_filelist_refresh = true;
strcpy(m_path,m_selected_file->fullpath.c_str());
@@ -989,8 +989,8 @@ void debug_imgui::refresh_filelist()
m_filelist_refresh = false;
util::zippath_directory::ptr dir;
- osd_file::error const err = util::zippath_directory::open(m_path,dir);
- if(err == osd_file::error::NONE)
+ std::error_condition const err = util::zippath_directory::open(m_path,dir);
+ if(!err)
{
int x = 0;
// add drives
@@ -1109,8 +1109,8 @@ void debug_imgui::draw_mount_dialog(const char* label)
m_filelist_refresh = true;
ImGui::Separator();
- ImVec2 listbox_size;
- listbox_size.x = 0.0f;
+ ImVec2 listbox_size;
+ listbox_size.x = 0.0f;
listbox_size.y = ImGui::GetTextLineHeightWithSpacing() * 15.25f;
if(ImGui::BeginListBox("##filelist",listbox_size))
diff --git a/src/osd/modules/debugger/debugqt.cpp b/src/osd/modules/debugger/debugqt.cpp
index 09ddf4ce95d..8fb2838e007 100644
--- a/src/osd/modules/debugger/debugqt.cpp
+++ b/src/osd/modules/debugger/debugqt.cpp
@@ -33,7 +33,7 @@
#include "qt/deviceinformationwindow.h"
class debug_qt : public osd_module, public debug_module
-#if defined(WIN32) && !defined(SDLMAME_WIN32)
+#if defined(_WIN32) && !defined(SDLMAME_WIN32)
, public QAbstractNativeEventFilter
#endif
{
@@ -50,7 +50,7 @@ public:
virtual void init_debugger(running_machine &machine);
virtual void wait_for_debugger(device_t &device, bool firststop);
virtual void debugger_update();
-#if defined(WIN32) && !defined(SDLMAME_WIN32)
+#if defined(_WIN32) && !defined(SDLMAME_WIN32)
virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *) Q_DECL_OVERRIDE;
#endif
private:
@@ -230,7 +230,7 @@ void bring_main_window_to_front()
// Core functionality
//============================================================
-#if defined(WIN32) && !defined(SDLMAME_WIN32)
+#if defined(_WIN32) && !defined(SDLMAME_WIN32)
bool winwindow_qt_filter(void *message);
bool debug_qt::nativeEventFilter(const QByteArray &eventType, void *message, long *)
@@ -246,7 +246,7 @@ void debug_qt::init_debugger(running_machine &machine)
{
// If you're starting from scratch, create a new qApp
new QApplication(qtArgc, qtArgv);
-#if defined(WIN32) && !defined(SDLMAME_WIN32)
+#if defined(_WIN32) && !defined(SDLMAME_WIN32)
QAbstractEventDispatcher::instance()->installNativeEventFilter(this);
#endif
}
@@ -276,7 +276,7 @@ void debug_qt::init_debugger(running_machine &machine)
#if defined(SDLMAME_UNIX) || defined(SDLMAME_WIN32)
extern int sdl_entered_debugger;
-#elif defined(WIN32)
+#elif defined(_WIN32)
void winwindow_update_cursor_state(running_machine &machine);
#endif
@@ -343,7 +343,7 @@ void debug_qt::wait_for_debugger(device_t &device, bool firststop)
// all the QT windows are already gone.
gather_save_configurations();
}
-#if defined(WIN32) && !defined(SDLMAME_WIN32)
+#if defined(_WIN32) && !defined(SDLMAME_WIN32)
winwindow_update_cursor_state(*m_machine); // make sure the cursor isn't hidden while in debugger
#endif
}
diff --git a/src/osd/modules/debugger/osx/memoryview.mm b/src/osd/modules/debugger/osx/memoryview.mm
index 0db48236b79..17d0ea639d4 100644
--- a/src/osd/modules/debugger/osx/memoryview.mm
+++ b/src/osd/modules/debugger/osx/memoryview.mm
@@ -35,7 +35,7 @@
if (action == @selector(showChunkSize:))
{
- [item setState:((tag == memview->get_data_format()) ? NSOnState : NSOffState)];
+ [item setState:((tag == int(memview->get_data_format())) ? NSOnState : NSOffState)];
return YES;
}
else if (action == @selector(showPhysicalAddresses:))
@@ -176,7 +176,7 @@
- (IBAction)showChunkSize:(id)sender {
- downcast<debug_view_memory *>(view)->set_data_format([sender tag]);
+ downcast<debug_view_memory *>(view)->set_data_format(debug_view_memory::data_format([sender tag]));
}
@@ -206,7 +206,7 @@
debug_view_memory *const memView = downcast<debug_view_memory *>(view);
node->set_attribute_int("reverse", memView->reverse() ? 1 : 0);
node->set_attribute_int("addressmode", memView->physical() ? 1 : 0);
- node->set_attribute_int("dataformat", memView->get_data_format());
+ node->set_attribute_int("dataformat", int(memView->get_data_format()));
node->set_attribute_int("rowchunks", memView->chunks_per_row());
}
@@ -216,43 +216,60 @@
debug_view_memory *const memView = downcast<debug_view_memory *>(view);
memView->set_reverse(0 != node->get_attribute_int("reverse", memView->reverse() ? 1 : 0));
memView->set_physical(0 != node->get_attribute_int("addressmode", memView->physical() ? 1 : 0));
- memView->set_data_format(node->get_attribute_int("dataformat", memView->get_data_format()));
+ memView->set_data_format(debug_view_memory::data_format(node->get_attribute_int("dataformat", int(memView->get_data_format()))));
memView->set_chunks_per_row(node->get_attribute_int("rowchunks", memView->chunks_per_row()));
}
- (void)insertActionItemsInMenu:(NSMenu *)menu atIndex:(NSInteger)index {
- NSInteger tag;
- for (tag = 1; tag <= 8; tag <<= 1) {
- NSString *title = [NSString stringWithFormat:@"%ld-byte Chunks", (long)tag];
- NSMenuItem *chunkItem = [menu insertItemWithTitle:title
- action:@selector(showChunkSize:)
- keyEquivalent:[NSString stringWithFormat:@"%ld", (long)tag]
- atIndex:index++];
- [chunkItem setTarget:self];
- [chunkItem setTag:tag];
- }
+ NSMenuItem *chunkItem1 = [menu insertItemWithTitle:@"1-byte Chunks"
+ action:@selector(showChunkSize:)
+ keyEquivalent:@"1"
+ atIndex:index++];
+ [chunkItem1 setTarget:self];
+ [chunkItem1 setTag:int(debug_view_memory::data_format::HEX_8BIT)];
+
+ NSMenuItem *chunkItem2 = [menu insertItemWithTitle:@"2-byte Chunks"
+ action:@selector(showChunkSize:)
+ keyEquivalent:@"2"
+ atIndex:index++];
+ [chunkItem2 setTarget:self];
+ [chunkItem2 setTag:int(debug_view_memory::data_format::HEX_16BIT)];
- NSMenuItem *chunkItem = [menu insertItemWithTitle:@"32-bit floats"
+ NSMenuItem *chunkItem4 = [menu insertItemWithTitle:@"4-byte Chunks"
+ action:@selector(showChunkSize:)
+ keyEquivalent:@"4"
+ atIndex:index++];
+ [chunkItem4 setTarget:self];
+ [chunkItem4 setTag:int(debug_view_memory::data_format::HEX_32BIT)];
+
+ NSMenuItem *chunkItem8 = [menu insertItemWithTitle:@"8-byte Chunks"
+ action:@selector(showChunkSize:)
+ keyEquivalent:@"8"
+ atIndex:index++];
+ [chunkItem8 setTarget:self];
+ [chunkItem8 setTag:int(debug_view_memory::data_format::HEX_64BIT)];
+
+ NSMenuItem *chunkItem9 = [menu insertItemWithTitle:@"32-bit floats"
action:@selector(showChunkSize:)
keyEquivalent:@"F"
atIndex:index++];
- [chunkItem setTarget:self];
- [chunkItem setTag:9];
+ [chunkItem9 setTarget:self];
+ [chunkItem9 setTag:int(debug_view_memory::data_format::FLOAT_32BIT)];
- NSMenuItem *chunkItem2 = [menu insertItemWithTitle:@"64-bit floats"
+ NSMenuItem *chunkItem10 = [menu insertItemWithTitle:@"64-bit floats"
action:@selector(showChunkSize:)
keyEquivalent:@"D"
atIndex:index++];
- [chunkItem2 setTarget:self];
- [chunkItem2 setTag:10];
+ [chunkItem10 setTarget:self];
+ [chunkItem10 setTag:int(debug_view_memory::data_format::FLOAT_64BIT)];
- NSMenuItem *chunkItem3 = [menu insertItemWithTitle:@"80-bit floats"
+ NSMenuItem *chunkItem11 = [menu insertItemWithTitle:@"80-bit floats"
action:@selector(showChunkSize:)
keyEquivalent:@"E"
atIndex:index++];
- [chunkItem3 setTarget:self];
- [chunkItem3 setTag:11];
+ [chunkItem11 setTarget:self];
+ [chunkItem11 setTag:int(debug_view_memory::data_format::FLOAT_80BIT)];
[menu insertItem:[NSMenuItem separatorItem] atIndex:index++];
diff --git a/src/osd/modules/debugger/qt/memorywindow.cpp b/src/osd/modules/debugger/qt/memorywindow.cpp
index 9989ac6d66d..c4b4ce9a429 100644
--- a/src/osd/modules/debugger/qt/memorywindow.cpp
+++ b/src/osd/modules/debugger/qt/memorywindow.cpp
@@ -178,13 +178,13 @@ void MemoryWindow::memoryRegionChanged(int index)
debug_view_memory *memView = downcast<debug_view_memory*>(m_memTable->view());
switch (memView->get_data_format())
{
- case 1: dataFormatMenuItem("formatActOne")->setChecked(true); break;
- case 2: dataFormatMenuItem("formatActTwo")->setChecked(true); break;
- case 4: dataFormatMenuItem("formatActFour")->setChecked(true); break;
- case 8: dataFormatMenuItem("formatActEight")->setChecked(true); break;
- case 9: dataFormatMenuItem("formatAct32bitFloat")->setChecked(true); break;
- case 10: dataFormatMenuItem("formatAct64bitFloat")->setChecked(true); break;
- case 11: dataFormatMenuItem("formatAct80bitFloat")->setChecked(true); break;
+ case debug_view_memory::data_format::HEX_8BIT: dataFormatMenuItem("formatActOne")->setChecked(true); break;
+ case debug_view_memory::data_format::HEX_16BIT: dataFormatMenuItem("formatActTwo")->setChecked(true); break;
+ case debug_view_memory::data_format::HEX_32BIT: dataFormatMenuItem("formatActFour")->setChecked(true); break;
+ case debug_view_memory::data_format::HEX_64BIT: dataFormatMenuItem("formatActEight")->setChecked(true); break;
+ case debug_view_memory::data_format::FLOAT_32BIT: dataFormatMenuItem("formatAct32bitFloat")->setChecked(true); break;
+ case debug_view_memory::data_format::FLOAT_64BIT: dataFormatMenuItem("formatAct64bitFloat")->setChecked(true); break;
+ case debug_view_memory::data_format::FLOAT_80BIT: dataFormatMenuItem("formatAct80bitFloat")->setChecked(true); break;
default: break;
}
}
@@ -214,19 +214,19 @@ void MemoryWindow::formatChanged(QAction* changedTo)
debug_view_memory *memView = downcast<debug_view_memory*>(m_memTable->view());
if (changedTo->text() == "1-byte chunks")
- memView->set_data_format(1);
+ memView->set_data_format(debug_view_memory::data_format::HEX_8BIT);
else if (changedTo->text() == "2-byte chunks")
- memView->set_data_format(2);
+ memView->set_data_format(debug_view_memory::data_format::HEX_16BIT);
else if (changedTo->text() == "4-byte chunks")
- memView->set_data_format(4);
+ memView->set_data_format(debug_view_memory::data_format::HEX_32BIT);
else if (changedTo->text() == "8-byte chunks")
- memView->set_data_format(8);
+ memView->set_data_format(debug_view_memory::data_format::HEX_64BIT);
else if (changedTo->text() == "32 bit floating point")
- memView->set_data_format(9);
+ memView->set_data_format(debug_view_memory::data_format::FLOAT_32BIT);
else if (changedTo->text() == "64 bit floating point")
- memView->set_data_format(10);
+ memView->set_data_format(debug_view_memory::data_format::FLOAT_64BIT);
else if (changedTo->text() == "80 bit floating point")
- memView->set_data_format(11);
+ memView->set_data_format(debug_view_memory::data_format::FLOAT_80BIT);
m_memTable->viewport()->update();
}
diff --git a/src/osd/modules/debugger/win/memoryviewinfo.cpp b/src/osd/modules/debugger/win/memoryviewinfo.cpp
index 9575a128c33..15dc46ebb98 100644
--- a/src/osd/modules/debugger/win/memoryviewinfo.cpp
+++ b/src/osd/modules/debugger/win/memoryviewinfo.cpp
@@ -9,8 +9,6 @@
#include "emu.h"
#include "memoryviewinfo.h"
-#include "debug/dvmemory.h"
-
#include "strconv.h"
@@ -25,7 +23,7 @@ memoryview_info::~memoryview_info()
}
-uint8_t memoryview_info::data_format() const
+debug_view_memory::data_format memoryview_info::data_format() const
{
return view<debug_view_memory>()->get_data_format();
}
@@ -54,7 +52,7 @@ void memoryview_info::set_expression(const std::string &string)
view<debug_view_memory>()->set_expression(string);
}
-void memoryview_info::set_data_format(uint8_t dataformat)
+void memoryview_info::set_data_format(debug_view_memory::data_format dataformat)
{
view<debug_view_memory>()->set_data_format(dataformat);
}
diff --git a/src/osd/modules/debugger/win/memoryviewinfo.h b/src/osd/modules/debugger/win/memoryviewinfo.h
index 7766da9ac30..95436e507e6 100644
--- a/src/osd/modules/debugger/win/memoryviewinfo.h
+++ b/src/osd/modules/debugger/win/memoryviewinfo.h
@@ -11,9 +11,10 @@
#pragma once
#include "debugwin.h"
-
#include "debugviewinfo.h"
+#include "debug/dvmemory.h"
+
#include <string>
@@ -23,13 +24,13 @@ public:
memoryview_info(debugger_windows_interface &debugger, debugwin_info &owner, HWND parent);
virtual ~memoryview_info();
- uint8_t data_format() const;
+ debug_view_memory::data_format data_format() const;
uint32_t chunks_per_row() const;
bool reverse() const;
bool physical() const;
void set_expression(const std::string &string);
- void set_data_format(uint8_t dataformat);
+ void set_data_format(debug_view_memory::data_format dataformat);
void set_chunks_per_row(uint32_t rowchunks);
void set_reverse(bool reverse);
void set_physical(bool physical);
diff --git a/src/osd/modules/debugger/win/memorywininfo.cpp b/src/osd/modules/debugger/win/memorywininfo.cpp
index 18f28252f12..a103b3b353b 100644
--- a/src/osd/modules/debugger/win/memorywininfo.cpp
+++ b/src/osd/modules/debugger/win/memorywininfo.cpp
@@ -180,13 +180,13 @@ void memorywin_info::update_menu()
auto *const memview = downcast<memoryview_info *>(m_views[0].get());
HMENU const menu = GetMenu(window());
- CheckMenuItem(menu, ID_1_BYTE_CHUNKS, MF_BYCOMMAND | (memview->data_format() == 1 ? MF_CHECKED : MF_UNCHECKED));
- CheckMenuItem(menu, ID_2_BYTE_CHUNKS, MF_BYCOMMAND | (memview->data_format() == 2 ? MF_CHECKED : MF_UNCHECKED));
- CheckMenuItem(menu, ID_4_BYTE_CHUNKS, MF_BYCOMMAND | (memview->data_format() == 4 ? MF_CHECKED : MF_UNCHECKED));
- CheckMenuItem(menu, ID_8_BYTE_CHUNKS, MF_BYCOMMAND | (memview->data_format() == 8 ? MF_CHECKED : MF_UNCHECKED));
- CheckMenuItem(menu, ID_FLOATING_POINT_32BIT, MF_BYCOMMAND | (memview->data_format() == 9 ? MF_CHECKED : MF_UNCHECKED));
- CheckMenuItem(menu, ID_FLOATING_POINT_64BIT, MF_BYCOMMAND | (memview->data_format() == 10 ? MF_CHECKED : MF_UNCHECKED));
- CheckMenuItem(menu, ID_FLOATING_POINT_80BIT, MF_BYCOMMAND | (memview->data_format() == 11 ? MF_CHECKED : MF_UNCHECKED));
+ CheckMenuItem(menu, ID_1_BYTE_CHUNKS, MF_BYCOMMAND | (memview->data_format() == debug_view_memory::data_format::HEX_8BIT ? MF_CHECKED : MF_UNCHECKED));
+ CheckMenuItem(menu, ID_2_BYTE_CHUNKS, MF_BYCOMMAND | (memview->data_format() == debug_view_memory::data_format::HEX_16BIT ? MF_CHECKED : MF_UNCHECKED));
+ CheckMenuItem(menu, ID_4_BYTE_CHUNKS, MF_BYCOMMAND | (memview->data_format() == debug_view_memory::data_format::HEX_32BIT ? MF_CHECKED : MF_UNCHECKED));
+ CheckMenuItem(menu, ID_8_BYTE_CHUNKS, MF_BYCOMMAND | (memview->data_format() == debug_view_memory::data_format::HEX_64BIT ? MF_CHECKED : MF_UNCHECKED));
+ CheckMenuItem(menu, ID_FLOATING_POINT_32BIT, MF_BYCOMMAND | (memview->data_format() == debug_view_memory::data_format::FLOAT_32BIT ? MF_CHECKED : MF_UNCHECKED));
+ CheckMenuItem(menu, ID_FLOATING_POINT_64BIT, MF_BYCOMMAND | (memview->data_format() == debug_view_memory::data_format::FLOAT_64BIT ? MF_CHECKED : MF_UNCHECKED));
+ CheckMenuItem(menu, ID_FLOATING_POINT_80BIT, MF_BYCOMMAND | (memview->data_format() == debug_view_memory::data_format::FLOAT_80BIT ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(menu, ID_LOGICAL_ADDRESSES, MF_BYCOMMAND | (memview->physical() ? MF_UNCHECKED : MF_CHECKED));
CheckMenuItem(menu, ID_PHYSICAL_ADDRESSES, MF_BYCOMMAND | (memview->physical() ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(menu, ID_REVERSE_VIEW, MF_BYCOMMAND | (memview->reverse() ? MF_CHECKED : MF_UNCHECKED));
@@ -220,31 +220,31 @@ bool memorywin_info::handle_command(WPARAM wparam, LPARAM lparam)
switch (LOWORD(wparam))
{
case ID_1_BYTE_CHUNKS:
- memview->set_data_format(1);
+ memview->set_data_format(debug_view_memory::data_format::HEX_8BIT);
return true;
case ID_2_BYTE_CHUNKS:
- memview->set_data_format(2);
+ memview->set_data_format(debug_view_memory::data_format::HEX_16BIT);
return true;
case ID_4_BYTE_CHUNKS:
- memview->set_data_format(4);
+ memview->set_data_format(debug_view_memory::data_format::HEX_32BIT);
return true;
case ID_8_BYTE_CHUNKS:
- memview->set_data_format(8);
+ memview->set_data_format(debug_view_memory::data_format::HEX_64BIT);
return true;
case ID_FLOATING_POINT_32BIT:
- memview->set_data_format(9);
+ memview->set_data_format(debug_view_memory::data_format::FLOAT_32BIT);
return true;
case ID_FLOATING_POINT_64BIT:
- memview->set_data_format(10);
+ memview->set_data_format(debug_view_memory::data_format::FLOAT_64BIT);
return true;
case ID_FLOATING_POINT_80BIT:
- memview->set_data_format(11);
+ memview->set_data_format(debug_view_memory::data_format::FLOAT_80BIT);
return true;
case ID_LOGICAL_ADDRESSES:
diff --git a/src/osd/modules/file/posixdir.cpp b/src/osd/modules/file/posixdir.cpp
index 9cd29a84600..63a02925bf1 100644
--- a/src/osd/modules/file/posixdir.cpp
+++ b/src/osd/modules/file/posixdir.cpp
@@ -22,7 +22,7 @@
#endif
#endif
-#ifdef WIN32
+#ifdef _WIN32
#define _FILE_OFFSET_BITS 64
#endif
@@ -63,13 +63,13 @@ namespace {
// CONSTANTS
//============================================================
-#if defined(WIN32)
+#if defined(_WIN32)
constexpr char PATHSEPCH = '\\';
#else
constexpr char PATHSEPCH = '/';
#endif
-#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(__EMSCRIPTEN__) || defined(__ANDROID__) || defined(WIN32) || defined(SDLMAME_NO64BITIO)
+#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(__EMSCRIPTEN__) || defined(__ANDROID__) || defined(_WIN32) || defined(SDLMAME_NO64BITIO)
using sdl_dirent = struct dirent;
using sdl_stat = struct stat;
#define sdl_readdir readdir
diff --git a/src/osd/modules/file/posixdomain.cpp b/src/osd/modules/file/posixdomain.cpp
deleted file mode 100644
index 13d564d1738..00000000000
--- a/src/osd/modules/file/posixdomain.cpp
+++ /dev/null
@@ -1,208 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Olivier Galibert, R. Belmont, Vas Crabb
-//============================================================
-//
-// sdldomain.c - SDL socket (unix) access functions
-//
-// SDLMAME by Olivier Galibert and R. Belmont
-//
-//============================================================
-
-#include "posixfile.h"
-
-#include <cassert>
-#include <cerrno>
-#include <cstdio>
-#include <cstring>
-
-#include <sys/select.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-
-namespace {
-char const *const posixfile_domain_identifier = "domain.";
-
-
-class posix_osd_domain : public osd_file
-{
-public:
- posix_osd_domain(posix_osd_domain const &) = delete;
- posix_osd_domain(posix_osd_domain &&) = delete;
- posix_osd_domain& operator=(posix_osd_domain const &) = delete;
- posix_osd_domain& operator=(posix_osd_domain &&) = delete;
-
- posix_osd_domain(int sock, bool listening)
- : m_sock(sock)
- , m_listening(listening)
- {
- assert(m_sock >= 0);
- }
-
- virtual ~posix_osd_domain()
- {
- ::close(m_sock);
- }
-
- virtual error read(void *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) override
- {
- fd_set readfds;
- FD_ZERO(&readfds);
- FD_SET(m_sock, &readfds);
-
- struct timeval timeout;
- timeout.tv_sec = timeout.tv_usec = 0;
-
- if (select(m_sock + 1, &readfds, nullptr, nullptr, &timeout) < 0)
- {
- char line[80];
- std::sprintf(line, "%s : %s : %d ", __func__, __FILE__, __LINE__);
- std::perror(line);
- return errno_to_file_error(errno);
- }
- else if (FD_ISSET(m_sock, &readfds))
- {
- if (!m_listening)
- {
- // connected socket
- ssize_t const result = ::read(m_sock, buffer, count);
- if (result < 0)
- {
- return errno_to_file_error(errno);
- }
- else
- {
- actual = std::uint32_t(size_t(result));
- return error::NONE;
- }
- }
- else
- {
- // listening socket
- int const accepted = ::accept(m_sock, nullptr, nullptr);
- if (accepted < 0)
- {
- return errno_to_file_error(errno);
- }
- else
- {
- ::close(m_sock);
- m_sock = accepted;
- m_listening = false;
- actual = 0;
-
- return error::NONE;
- }
- }
- }
- else
- {
- return error::FAILURE;
- }
- }
-
- virtual error write(void const *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) override
- {
- ssize_t const result = ::write(m_sock, buffer, count);
- if (result < 0)
- return errno_to_file_error(errno);
-
- actual = std::uint32_t(size_t(result));
- return error::NONE;
- }
-
- virtual error truncate(std::uint64_t offset) override
- {
- // doesn't make sense on socket
- return error::INVALID_ACCESS;
- }
-
- virtual error flush() override
- {
- // there's no simple way to flush buffers on a socket anyway
- return error::NONE;
- }
-
-private:
- int m_sock;
- bool m_listening;
-};
-
-} // anonymous namespace
-
-
-bool posix_check_domain_path(std::string const &path)
-{
- if (strncmp(path.c_str(), posixfile_domain_identifier, strlen(posixfile_domain_identifier)) == 0)
- return true;
- return false;
-}
-
-
-osd_file::error posix_open_domain(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize)
-{
- struct sockaddr_un sau;
- memset(&sau, 0, sizeof(sau));
- sau.sun_family = AF_UNIX;
- strncpy(sau.sun_path, &path.c_str()[strlen(posixfile_domain_identifier)], sizeof(sau.sun_path)-1);
-
- int const sock = ::socket(AF_UNIX, SOCK_STREAM, 0);
- if (sock < 0)
- return errno_to_file_error(errno);
-
- fcntl(sock, F_SETFL, O_NONBLOCK);
-
- // listening socket support
- if (openflags & OPEN_FLAG_CREATE)
- {
- if (::bind(sock, reinterpret_cast<struct sockaddr const *>(&sau), sizeof(struct sockaddr_un)) < 0)
- {
- int const err = errno;
- ::close(sock);
- return errno_to_file_error(err);
- }
-
- // start to listen...
- if (::listen(sock, 1) < 0)
- {
- int const err = errno;
- ::close(sock);
- return errno_to_file_error(err);
- }
-
- // mark socket as "listening"
- try
- {
- file = std::make_unique<posix_osd_domain>(sock, true);
- filesize = 0;
- return osd_file::error::NONE;
- }
- catch (...)
- {
- ::close(sock);
- return osd_file::error::OUT_OF_MEMORY;
- }
- }
- else
- {
- if (::connect(sock, reinterpret_cast<struct sockaddr const *>(&sau), sizeof(struct sockaddr_un)) < 0)
- {
- ::close(sock);
- return osd_file::error::ACCESS_DENIED; // have to return this value or bitb won't try to bind on connect failure
- }
- try
- {
- file = std::make_unique<posix_osd_domain>(sock, false);
- filesize = 0;
- return osd_file::error::NONE;
- }
- catch (...)
- {
- ::close(sock);
- return osd_file::error::OUT_OF_MEMORY;
- }
- }
-}
diff --git a/src/osd/modules/file/posixfile.cpp b/src/osd/modules/file/posixfile.cpp
index ffdd4c4d477..580288c7d10 100644
--- a/src/osd/modules/file/posixfile.cpp
+++ b/src/osd/modules/file/posixfile.cpp
@@ -22,7 +22,7 @@
#endif
#endif
-#ifdef WIN32
+#ifdef _WIN32
#define _FILE_OFFSET_BITS 64
#endif
@@ -64,11 +64,12 @@
namespace {
+
//============================================================
// CONSTANTS
//============================================================
-#if defined(WIN32)
+#if defined(_WIN32)
constexpr char PATHSEPCH = '\\';
constexpr char INVPATHSEPCH = '/';
#else
@@ -85,7 +86,7 @@ public:
posix_osd_file& operator=(posix_osd_file const &) = delete;
posix_osd_file& operator=(posix_osd_file &&) = delete;
- posix_osd_file(int fd) : m_fd(fd)
+ posix_osd_file(int fd) noexcept : m_fd(fd)
{
assert(m_fd >= 0);
}
@@ -95,68 +96,68 @@ public:
::close(m_fd);
}
- virtual error read(void *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) override
+ virtual std::error_condition read(void *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) noexcept override
{
ssize_t result;
#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(__EMSCRIPTEN__) || defined(__ANDROID__)
result = ::pread(m_fd, buffer, size_t(count), off_t(std::make_unsigned_t<off_t>(offset)));
-#elif defined(WIN32) || defined(SDLMAME_NO64BITIO)
+#elif defined(_WIN32) || defined(SDLMAME_NO64BITIO)
if (lseek(m_fd, off_t(std::make_unsigned_t<off_t>(offset)), SEEK_SET) < 0)
- return errno_to_file_error(errno)
+ return std::error_condition(errno, std::generic_category());
result = ::read(m_fd, buffer, size_t(count));
#else
result = ::pread64(m_fd, buffer, size_t(count), off64_t(offset));
#endif
if (result < 0)
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
actual = std::uint32_t(std::size_t(result));
- return error::NONE;
+ return std::error_condition();
}
- virtual error write(void const *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) override
+ virtual std::error_condition write(void const *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) noexcept override
{
ssize_t result;
#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(__EMSCRIPTEN__) || defined(__ANDROID__)
result = ::pwrite(m_fd, buffer, size_t(count), off_t(std::make_unsigned_t<off_t>(offset)));
-#elif defined(WIN32) || defined(SDLMAME_NO64BITIO)
+#elif defined(_WIN32) || defined(SDLMAME_NO64BITIO)
if (lseek(m_fd, off_t(std::make_unsigned_t<off_t>(offset)), SEEK_SET) < 0)
- return errno_to_file_error(errno)
+ return std::error_condition(errno, std::generic_category());
result = ::write(m_fd, buffer, size_t(count));
#else
result = ::pwrite64(m_fd, buffer, size_t(count), off64_t(offset));
#endif
if (result < 0)
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
actual = std::uint32_t(std::size_t(result));
- return error::NONE;
+ return std::error_condition();
}
- virtual error truncate(std::uint64_t offset) override
+ virtual std::error_condition truncate(std::uint64_t offset) noexcept override
{
int result;
-#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(__EMSCRIPTEN__) || defined(WIN32) || defined(SDLMAME_NO64BITIO) || defined(__ANDROID__)
+#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(__EMSCRIPTEN__) || defined(_WIN32) || defined(SDLMAME_NO64BITIO) || defined(__ANDROID__)
result = ::ftruncate(m_fd, off_t(std::make_unsigned_t<off_t>(offset)));
#else
result = ::ftruncate64(m_fd, off64_t(offset));
#endif
if (result < 0)
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
- return error::NONE;
+ return std::error_condition();
}
- virtual error flush() override
+ virtual std::error_condition flush() noexcept override
{
// no user-space buffering on unistd I/O
- return error::NONE;
+ return std::error_condition();
}
private:
@@ -168,9 +169,9 @@ private:
// is_path_separator
//============================================================
-bool is_path_separator(char c)
+bool is_path_separator(char c) noexcept
{
-#if defined(WIN32)
+#if defined(_WIN32)
return (c == PATHSEPCH) || (c == INVPATHSEPCH);
#else
return c == PATHSEPCH;
@@ -182,31 +183,36 @@ bool is_path_separator(char c)
// create_path_recursive
//============================================================
-osd_file::error create_path_recursive(std::string const &path)
+std::error_condition create_path_recursive(std::string_view path) noexcept
{
// if there's still a separator, and it's not the root, nuke it and recurse
auto const sep = path.rfind(PATHSEPCH);
- if ((sep != std::string::npos) && (sep > 0) && (path[sep - 1] != PATHSEPCH))
+ if ((sep != std::string_view::npos) && (sep > 0) && (path[sep - 1] != PATHSEPCH))
{
- osd_file::error const err = create_path_recursive(path.substr(0, sep));
- if (err != osd_file::error::NONE)
+ std::error_condition err = create_path_recursive(path.substr(0, sep));
+ if (err)
return err;
}
+ // need a NUL-terminated version of the subpath
+ std::string p;
+ try { p = path; }
+ catch (...) { return std::errc::not_enough_memory; }
+
// if the path already exists, we're done
struct stat st;
- if (!::stat(path.c_str(), &st))
- return osd_file::error::NONE;
+ if (!::stat(p.c_str(), &st))
+ return std::error_condition();
// create the path
-#ifdef WIN32
- if (mkdir(path.c_str()) < 0)
+#ifdef _WIN32
+ if (mkdir(p.c_str()) < 0)
#else
- if (mkdir(path.c_str(), 0777) < 0)
+ if (mkdir(p.c_str(), 0777) < 0)
#endif
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
else
- return osd_file::error::NONE;
+ return std::error_condition();
}
} // anonymous namespace
@@ -216,7 +222,7 @@ osd_file::error create_path_recursive(std::string const &path)
// osd_file::open
//============================================================
-osd_file::error osd_file::open(std::string const &path, std::uint32_t openflags, ptr &file, std::uint64_t &filesize)
+std::error_condition osd_file::open(std::string const &path, std::uint32_t openflags, ptr &file, std::uint64_t &filesize) noexcept
{
std::string dst;
if (posix_check_socket_path(path))
@@ -239,23 +245,24 @@ osd_file::error osd_file::open(std::string const &path, std::uint32_t openflags,
}
else
{
- return error::INVALID_ACCESS;
+ return std::errc::invalid_argument;
}
-#if defined(WIN32)
+#if defined(_WIN32)
access |= O_BINARY;
#endif
// convert the path into something compatible
dst = path;
-#if defined(WIN32)
+#if defined(_WIN32)
for (auto it = dst.begin(); it != dst.end(); ++it)
*it = (INVPATHSEPCH == *it) ? PATHSEPCH : *it;
#endif
- osd_subst_env(dst, dst);
+ try { osd_subst_env(dst, dst); }
+ catch (...) { return std::errc::not_enough_memory; }
// attempt to open the file
int fd = -1;
-#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(__HAIKU__) || defined(WIN32) || defined(SDLMAME_NO64BITIO) || defined(__ANDROID__)
+#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(__HAIKU__) || defined(_WIN32) || defined(SDLMAME_NO64BITIO) || defined(__ANDROID__)
fd = ::open(dst.c_str(), access, 0666);
#else
fd = ::open64(dst.c_str(), access, 0666);
@@ -263,6 +270,9 @@ osd_file::error osd_file::open(std::string const &path, std::uint32_t openflags,
if (fd < 0)
{
+ // save the error from the first attempt to open the file
+ std::error_condition openerr(errno, std::generic_category());
+
// create the path if necessary
if ((openflags & OPEN_FLAG_CREATE) && (openflags & OPEN_FLAG_CREATE_PATHS))
{
@@ -270,29 +280,33 @@ osd_file::error osd_file::open(std::string const &path, std::uint32_t openflags,
if (pathsep != std::string::npos)
{
// create the path up to the file
- osd_file::error const error = create_path_recursive(dst.substr(0, pathsep));
+ std::error_condition const createrr = create_path_recursive(dst.substr(0, pathsep));
// attempt to reopen the file
- if (error == osd_file::error::NONE)
+ if (!createrr)
{
-#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(__HAIKU__) || defined(WIN32) || defined(SDLMAME_NO64BITIO) || defined(__ANDROID__)
+#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(__HAIKU__) || defined(_WIN32) || defined(SDLMAME_NO64BITIO) || defined(__ANDROID__)
fd = ::open(dst.c_str(), access, 0666);
#else
fd = ::open64(dst.c_str(), access, 0666);
#endif
}
+ if (fd < 0)
+ {
+ openerr.assign(errno, std::generic_category());
+ }
}
}
// if we still failed, clean up and free
if (fd < 0)
{
- return errno_to_file_error(errno);
+ return openerr;
}
}
// get the file size
-#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(__HAIKU__) || defined(WIN32) || defined(SDLMAME_NO64BITIO) || defined(__ANDROID__)
+#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(__HAIKU__) || defined(_WIN32) || defined(SDLMAME_NO64BITIO) || defined(__ANDROID__)
struct stat st;
if (::fstat(fd, &st) < 0)
#else
@@ -300,22 +314,20 @@ osd_file::error osd_file::open(std::string const &path, std::uint32_t openflags,
if (::fstat64(fd, &st) < 0)
#endif
{
- int const error = errno;
+ std::error_condition staterr(errno, std::generic_category());
::close(fd);
- return errno_to_file_error(error);
+ return staterr;
}
- filesize = std::uint64_t(std::make_unsigned_t<decltype(st.st_size)>(st.st_size));
- try
- {
- file = std::make_unique<posix_osd_file>(fd);
- return error::NONE;
- }
- catch (...)
+ osd_file::ptr result(new (std::nothrow) posix_osd_file(fd));
+ if (!result)
{
::close(fd);
- return error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
}
+ file = std::move(result);
+ filesize = std::uint64_t(std::make_unsigned_t<decltype(st.st_size)>(st.st_size));
+ return std::error_condition();
}
@@ -323,9 +335,9 @@ osd_file::error osd_file::open(std::string const &path, std::uint32_t openflags,
// osd_file::openpty
//============================================================
-osd_file::error osd_file::openpty(ptr &file, std::string &name)
+std::error_condition osd_file::openpty(ptr &file, std::string &name) noexcept
{
- std::uint64_t filesize;
+ std::uint64_t filesize;
return posix_open_ptty(OPEN_FLAG_READ | OPEN_FLAG_WRITE, file, filesize, name);
}
@@ -334,12 +346,12 @@ osd_file::error osd_file::openpty(ptr &file, std::string &name)
// osd_file::remove
//============================================================
-osd_file::error osd_file::remove(std::string const &filename)
+std::error_condition osd_file::remove(std::string const &filename) noexcept
{
if (::unlink(filename.c_str()) < -1)
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
else
- return error::NONE;
+ return std::error_condition();
}
@@ -347,7 +359,7 @@ osd_file::error osd_file::remove(std::string const &filename)
// osd_get_physical_drive_geometry
//============================================================
-bool osd_get_physical_drive_geometry(const char *filename, uint32_t *cylinders, uint32_t *heads, uint32_t *sectors, uint32_t *bps)
+bool osd_get_physical_drive_geometry(const char *filename, uint32_t *cylinders, uint32_t *heads, uint32_t *sectors, uint32_t *bps) noexcept
{
return false; // no, no way, huh-uh, forget it
}
@@ -359,7 +371,7 @@ bool osd_get_physical_drive_geometry(const char *filename, uint32_t *cylinders,
std::unique_ptr<osd::directory::entry> osd_stat(const std::string &path)
{
-#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(__HAIKU__) || defined(WIN32) || defined(SDLMAME_NO64BITIO) || defined(__ANDROID__)
+#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(__HAIKU__) || defined(_WIN32) || defined(SDLMAME_NO64BITIO) || defined(__ANDROID__)
struct stat st;
int const err = ::stat(path.c_str(), &st);
#else
@@ -389,58 +401,58 @@ std::unique_ptr<osd::directory::entry> osd_stat(const std::string &path)
// osd_get_full_path
//============================================================
-osd_file::error osd_get_full_path(std::string &dst, std::string const &path)
+std::error_condition osd_get_full_path(std::string &dst, std::string const &path) noexcept
{
try
{
-#if defined(WIN32)
+#if defined(_WIN32)
std::vector<char> path_buffer(MAX_PATH);
if (::_fullpath(&path_buffer[0], path.c_str(), MAX_PATH))
{
dst = &path_buffer[0];
- return osd_file::error::NONE;
+ return std::error_condition();
}
else
{
- return osd_file::error::FAILURE;
+ return std::errc::io_error; // TODO: better error reporting?
}
#else
std::unique_ptr<char, void (*)(void *)> canonical(::realpath(path.c_str(), nullptr), &std::free);
if (canonical)
{
dst = canonical.get();
- return osd_file::error::NONE;
+ return std::error_condition();
}
std::vector<char> path_buffer(PATH_MAX);
if (::realpath(path.c_str(), &path_buffer[0]))
{
dst = &path_buffer[0];
- return osd_file::error::NONE;
+ return std::error_condition();
}
else if (path[0] == PATHSEPCH)
{
dst = path;
- return osd_file::error::NONE;
+ return std::error_condition();
}
else
{
while (!::getcwd(&path_buffer[0], path_buffer.size()))
{
if (errno != ERANGE)
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
else
path_buffer.resize(path_buffer.size() * 2);
}
dst.assign(&path_buffer[0]).push_back(PATHSEPCH);
dst.append(path);
- return osd_file::error::NONE;
+ return std::error_condition();
}
#endif
}
catch (...)
{
- return osd_file::error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
}
}
@@ -449,11 +461,11 @@ osd_file::error osd_get_full_path(std::string &dst, std::string const &path)
// osd_is_absolute_path
//============================================================
-bool osd_is_absolute_path(std::string const &path)
+bool osd_is_absolute_path(std::string const &path) noexcept
{
if (!path.empty() && is_path_separator(path[0]))
return true;
-#if !defined(WIN32)
+#if !defined(_WIN32)
else if (!path.empty() && (path[0] == '.') && (!path[1] || is_path_separator(path[1]))) // FIXME: why is this even here? foo/./bar is a valid way to refer to foo/bar
return true;
#elif !defined(UNDER_CE)
@@ -492,12 +504,12 @@ std::vector<std::string> osd_get_volume_names()
// osd_is_valid_filename_char
//============================================================
-bool osd_is_valid_filename_char(char32_t uchar)
+bool osd_is_valid_filename_char(char32_t uchar) noexcept
{
// The only one that's actually invalid is the slash
// The other two are just problematic because they're the escape character and path separator
return osd_is_valid_filepath_char(uchar)
-#if defined(WIN32)
+#if defined(_WIN32)
&& uchar != PATHSEPCH
&& uchar != INVPATHSEPCH
#else
@@ -512,12 +524,12 @@ bool osd_is_valid_filename_char(char32_t uchar)
// osd_is_valid_filepath_char
//============================================================
-bool osd_is_valid_filepath_char(char32_t uchar)
+bool osd_is_valid_filepath_char(char32_t uchar) noexcept
{
// One could argue that colon should be in here too because it functions as path separator
return uchar >= 0x20
&& !(uchar >= '\x7F' && uchar <= '\x9F')
-#if defined(WIN32)
+#if defined(_WIN32)
&& uchar != '<'
&& uchar != '>'
&& uchar != '\"'
@@ -527,39 +539,3 @@ bool osd_is_valid_filepath_char(char32_t uchar)
#endif
&& uchar_isvalid(uchar);
}
-
-
-//============================================================
-// errno_to_file_error
-//============================================================
-
-osd_file::error errno_to_file_error(int error)
-{
- switch (error)
- {
- case 0:
- return osd_file::error::NONE;
-
- case ENOENT:
- case ENOTDIR:
- return osd_file::error::NOT_FOUND;
-
- case EACCES:
- case EROFS:
-#ifndef WIN32
- case ETXTBSY:
-#endif
- case EEXIST:
- case EPERM:
- case EISDIR:
- case EINVAL:
- return osd_file::error::ACCESS_DENIED;
-
- case ENFILE:
- case EMFILE:
- return osd_file::error::TOO_MANY_FILES;
-
- default:
- return osd_file::error::FAILURE;
- }
-}
diff --git a/src/osd/modules/file/posixfile.h b/src/osd/modules/file/posixfile.h
index d47c03d691e..eb6f010859e 100644
--- a/src/osd/modules/file/posixfile.h
+++ b/src/osd/modules/file/posixfile.h
@@ -7,25 +7,29 @@
// SDLMAME by Olivier Galibert and R. Belmont
//
//============================================================
+#ifndef MAME_OSD_MODULES_FILE_POSIXFILE_H
+#define MAME_OSD_MODULES_FILE_POSIXFILE_H
+#pragma once
#include "osdfile.h"
#include <cstdint>
#include <string>
+#include <system_error>
//============================================================
// PROTOTYPES
//============================================================
-bool posix_check_socket_path(std::string const &path);
-osd_file::error posix_open_socket(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize);
+bool posix_check_socket_path(std::string const &path) noexcept;
+std::error_condition posix_open_socket(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize) noexcept;
-bool posix_check_domain_path(std::string const &path);
-osd_file::error posix_open_domain(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize);
+bool posix_check_domain_path(std::string const &path) noexcept;
+std::error_condition posix_open_domain(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize) noexcept;
-bool posix_check_ptty_path(std::string const &path);
-osd_file::error posix_open_ptty(std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize, std::string &name);
+bool posix_check_ptty_path(std::string const &path) noexcept;
+std::error_condition posix_open_ptty(std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize, std::string &name) noexcept;
-osd_file::error errno_to_file_error(int error);
+#endif // MAME_OSD_MODULES_FILE_POSIXFILE_H
diff --git a/src/osd/modules/file/posixptty.cpp b/src/osd/modules/file/posixptty.cpp
index 5ecb37057ad..57ff069a2ce 100644
--- a/src/osd/modules/file/posixptty.cpp
+++ b/src/osd/modules/file/posixptty.cpp
@@ -52,7 +52,7 @@ public:
posix_osd_ptty& operator=(posix_osd_ptty const &) = delete;
posix_osd_ptty& operator=(posix_osd_ptty &&) = delete;
- posix_osd_ptty(int fd) : m_fd(fd)
+ posix_osd_ptty(int fd) noexcept : m_fd(fd)
{
assert(m_fd >= 0);
}
@@ -62,36 +62,36 @@ public:
::close(m_fd);
}
- virtual error read(void *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) override
+ virtual std::error_condition read(void *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) noexcept override
{
ssize_t const result = ::read(m_fd, buffer, count);
if (result < 0)
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
actual = std::uint32_t(size_t(result));
- return error::NONE;
+ return std::error_condition();
}
- virtual error write(void const *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) override
+ virtual std::error_condition write(void const *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) noexcept override
{
ssize_t const result = ::write(m_fd, buffer, count);
if (result < 0)
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
actual = std::uint32_t(size_t(result));
- return error::NONE;
+ return std::error_condition();
}
- virtual error truncate(std::uint64_t offset) override
+ virtual std::error_condition truncate(std::uint64_t offset) noexcept override
{
// doesn't make sense on ptty
- return error::INVALID_ACCESS;
+ return std::errc::bad_file_descriptor;
}
- virtual error flush() override
+ virtual std::error_condition flush() noexcept override
{
// no userspace buffers on read/write
- return error::NONE;
+ return std::error_condition();
}
private:
@@ -101,17 +101,18 @@ private:
} // anonymous namespace
-bool posix_check_ptty_path(std::string const &path)
+bool posix_check_ptty_path(std::string const &path) noexcept
{
return strncmp(path.c_str(), posix_ptty_identifier, strlen(posix_ptty_identifier)) == 0;
}
-osd_file::error posix_open_ptty(std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize, std::string &name)
+std::error_condition posix_open_ptty(std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize, std::string &name) noexcept
{
#if defined(__ANDROID__)
- return osd_file::error::FAILURE;
+ return std::errc::not_supported; // TODO: revisit this error code
#else // defined(__ANDROID__)
+ // TODO: handling of the slave path is insecure - should use ptsname_r/ttyname_r in a loop
#if (defined(sun) || defined(__sun)) && (defined(__SVR4) || defined(__svr4__))
int access = O_NOCTTY;
if (openflags & OPEN_FLAG_WRITE)
@@ -119,11 +120,11 @@ osd_file::error posix_open_ptty(std::uint32_t openflags, osd_file::ptr &file, st
else if (openflags & OPEN_FLAG_READ)
access |= O_RDONLY;
else
- return osd_file::error::INVALID_ACCESS;
+ return std::errc::invalid_argument;
int const masterfd = ::posix_openpt(access);
if (masterfd < 0)
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
// grant access to slave device and check that it can be opened
char const *slavepath;
@@ -133,9 +134,9 @@ osd_file::error posix_open_ptty(std::uint32_t openflags, osd_file::ptr &file, st
((slavepath = ::ptsname(masterfd)) == nullptr) ||
((slavefd = ::open(slavepath, O_RDWR | O_NOCTTY)) < 0))
{
- int const err = errno;
+ std::error_condition err(errno, std::generic_category());
::close(masterfd);
- return errno_to_file_error(err);
+ return err;
}
// check that it's possible to stack BSD-compatibility STREAMS modules
@@ -143,20 +144,20 @@ osd_file::error posix_open_ptty(std::uint32_t openflags, osd_file::ptr &file, st
(::ioctl(slavefd, I_PUSH, "ldterm") < 0) ||
(::ioctl(slavefd, I_PUSH, "ttcompat") < 0))
{
- int const err = errno;
+ std::error_condition err(errno, std::generic_category());
::close(slavefd);
::close(masterfd);
- return errno_to_file_error(err);
+ return err;
}
#else
struct termios tios;
std::memset(&tios, 0, sizeof(tios));
- ::cfmakeraw(&tios);
+ ::cfmakeraw(&tios); // TODO: this is a non-standard BSDism - should set flags some other way
int masterfd = -1, slavefd = -1;
char slavepath[PATH_MAX];
if (::openpty(&masterfd, &slavefd, slavepath, &tios, nullptr) < 0)
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
#endif
::close(slavefd);
@@ -164,16 +165,16 @@ osd_file::error posix_open_ptty(std::uint32_t openflags, osd_file::ptr &file, st
int const oldflags = ::fcntl(masterfd, F_GETFL, 0);
if (oldflags < 0)
{
- int const err = errno;
+ std::error_condition err(errno, std::generic_category());
::close(masterfd);
- return errno_to_file_error(err);
+ return err;
}
if (::fcntl(masterfd, F_SETFL, oldflags | O_NONBLOCK) < 0)
{
- int const err = errno;
+ std::error_condition err(errno, std::generic_category());
::close(masterfd);
- return errno_to_file_error(err);
+ return err;
}
try
@@ -181,12 +182,12 @@ osd_file::error posix_open_ptty(std::uint32_t openflags, osd_file::ptr &file, st
name = slavepath;
file = std::make_unique<posix_osd_ptty>(masterfd);
filesize = 0;
- return osd_file::error::NONE;
+ return std::error_condition();
}
catch (...)
{
::close(masterfd);
- return osd_file::error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
}
#endif // defined(__ANDROID__)
}
diff --git a/src/osd/modules/file/posixsocket.cpp b/src/osd/modules/file/posixsocket.cpp
index 2ce5ad05d5c..6a23e747ea1 100644
--- a/src/osd/modules/file/posixsocket.cpp
+++ b/src/osd/modules/file/posixsocket.cpp
@@ -2,7 +2,8 @@
// copyright-holders:Olivier Galibert, R. Belmont, Vas Crabb
//============================================================
//
-// sdlsocket.c - SDL socket (inet) access functions
+// sdlsocket.c - SDL socket (inet, unix domain) access
+// functions
//
// SDLMAME by Olivier Galibert and R. Belmont
//
@@ -16,17 +17,21 @@
#include <cstring>
#include <arpa/inet.h>
+#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <sys/time.h>
+#include <sys/un.h>
#include <unistd.h>
namespace {
+
char const *const posixfile_socket_identifier = "socket.";
+char const *const posixfile_domain_identifier = "domain.";
class posix_osd_socket : public osd_file
@@ -37,7 +42,7 @@ public:
posix_osd_socket& operator=(posix_osd_socket const &) = delete;
posix_osd_socket& operator=(posix_osd_socket &&) = delete;
- posix_osd_socket(int sock, bool listening)
+ posix_osd_socket(int sock, bool listening) noexcept
: m_sock(sock)
, m_listening(listening)
{
@@ -49,7 +54,7 @@ public:
::close(m_sock);
}
- virtual error read(void *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) override
+ virtual std::error_condition read(void *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) noexcept override
{
fd_set readfds;
FD_ZERO(&readfds);
@@ -58,12 +63,9 @@ public:
struct timeval timeout;
timeout.tv_sec = timeout.tv_usec = 0;
- if (select(m_sock + 1, &readfds, nullptr, nullptr, &timeout) < 0)
+ if (::select(m_sock + 1, &readfds, nullptr, nullptr, &timeout) < 0)
{
- char line[80];
- std::sprintf(line, "%s : %s : %d ", __func__, __FILE__, __LINE__);
- std::perror(line);
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
}
else if (FD_ISSET(m_sock, &readfds))
{
@@ -73,12 +75,12 @@ public:
ssize_t const result = ::read(m_sock, buffer, count);
if (result < 0)
{
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
}
else
{
actual = std::uint32_t(size_t(result));
- return error::NONE;
+ return std::error_condition();
}
}
else
@@ -87,7 +89,7 @@ public:
int const accepted = ::accept(m_sock, nullptr, nullptr);
if (accepted < 0)
{
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
}
else
{
@@ -96,36 +98,38 @@ public:
m_listening = false;
actual = 0;
- return error::NONE;
+ return std::error_condition();
}
}
}
else
{
- return error::FAILURE;
+ // no data available
+ actual = 0;
+ return std::errc::operation_would_block;
}
}
- virtual error write(void const *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) override
+ virtual std::error_condition write(void const *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) noexcept override
{
ssize_t const result = ::write(m_sock, buffer, count);
if (result < 0)
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
actual = std::uint32_t(size_t(result));
- return error::NONE;
+ return std::error_condition();
}
- virtual error truncate(std::uint64_t offset) override
+ virtual std::error_condition truncate(std::uint64_t offset) noexcept override
{
// doesn't make sense on socket
- return error::INVALID_ACCESS;
+ return std::errc::bad_file_descriptor;
}
- virtual error flush() override
+ virtual std::error_condition flush() noexcept override
{
// there's no simple way to flush buffers on a socket anyway
- return error::NONE;
+ return std::error_condition();
}
private:
@@ -133,6 +137,54 @@ private:
bool m_listening;
};
+
+template <typename T>
+std::error_condition create_socket(T const &sa, int sock, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize) noexcept
+{
+ osd_file::ptr result;
+ if (openflags & OPEN_FLAG_CREATE)
+ {
+ // listening socket support
+ // bind socket...
+ if (::bind(sock, reinterpret_cast<struct sockaddr const *>(&sa), sizeof(sa)) < 0)
+ {
+ std::error_condition binderr(errno, std::generic_category());
+ ::close(sock);
+ return binderr;
+ }
+
+ // start to listen...
+ if (::listen(sock, 1) < 0)
+ {
+ std::error_condition lstnerr(errno, std::generic_category());
+ ::close(sock);
+ return lstnerr;
+ }
+
+ // mark socket as "listening"
+ result.reset(new (std::nothrow) posix_osd_socket(sock, true));
+ }
+ else
+ {
+ if (::connect(sock, reinterpret_cast<struct sockaddr const *>(&sa), sizeof(sa)) < 0)
+ {
+ std::error_condition connerr(errno, std::generic_category());
+ ::close(sock);
+ return connerr;
+ }
+ result.reset(new (std::nothrow) posix_osd_socket(sock, false));
+ }
+
+ if (!result)
+ {
+ ::close(sock);
+ return std::errc::not_enough_memory;
+ }
+ file = std::move(result);
+ filesize = 0;
+ return std::error_condition();
+}
+
} // anonymous namespace
@@ -141,7 +193,7 @@ private:
specification has the format "socket." host ":" port. Host may be simple
or fully qualified. Port must be between 1 and 65535.
*/
-bool posix_check_socket_path(std::string const &path)
+bool posix_check_socket_path(std::string const &path) noexcept
{
if (strncmp(path.c_str(), posixfile_socket_identifier, strlen(posixfile_socket_identifier)) == 0 &&
strchr(path.c_str(), ':') != nullptr) return true;
@@ -149,7 +201,15 @@ bool posix_check_socket_path(std::string const &path)
}
-osd_file::error posix_open_socket(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize)
+bool posix_check_domain_path(std::string const &path) noexcept
+{
+ if (strncmp(path.c_str(), posixfile_domain_identifier, strlen(posixfile_domain_identifier)) == 0)
+ return true;
+ return false;
+}
+
+
+std::error_condition posix_open_socket(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize) noexcept
{
char hostname[256];
int port;
@@ -157,7 +217,7 @@ osd_file::error posix_open_socket(std::string const &path, std::uint32_t openfla
struct hostent const *const localhost = ::gethostbyname(hostname);
if (!localhost)
- return osd_file::error::NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
struct sockaddr_in sai;
memset(&sai, 0, sizeof(sai));
@@ -167,75 +227,38 @@ osd_file::error posix_open_socket(std::string const &path, std::uint32_t openfla
int const sock = ::socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0)
- return errno_to_file_error(errno);
+ return std::error_condition(errno, std::generic_category());
int const flag = 1;
- if (::setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast<const char *>(&flag), sizeof(flag)) < 0)
+ if ((::setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast<const char *>(&flag), sizeof(flag)) < 0) ||
+ (::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<const char *>(&flag), sizeof(flag)) < 0))
{
- int const err = errno;
+ std::error_condition sockopterr(errno, std::generic_category());
::close(sock);
- return errno_to_file_error(err);
+ return sockopterr;
}
- if (::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<const char *>(&flag), sizeof(flag)) < 0)
- {
- int const err = errno;
- ::close(sock);
- return errno_to_file_error(err);
- }
+ return create_socket(sai, sock, openflags, file, filesize);
+}
- // listening socket support
- if (openflags & OPEN_FLAG_CREATE)
- {
- //printf("Listening for client at '%s' on port '%d'\n", hostname, port);
- // bind socket...
- if (::bind(sock, reinterpret_cast<struct sockaddr const *>(&sai), sizeof(struct sockaddr)) < 0)
- {
- int const err = errno;
- ::close(sock);
- return errno_to_file_error(err);
- }
+std::error_condition posix_open_domain(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize) noexcept
+{
+ struct sockaddr_un sau;
+ memset(&sau, 0, sizeof(sau));
+ sau.sun_family = AF_UNIX;
+ strncpy(sau.sun_path, &path.c_str()[strlen(posixfile_domain_identifier)], sizeof(sau.sun_path)-1);
- // start to listen...
- if (::listen(sock, 1) < 0)
- {
- int const err = errno;
- ::close(sock);
- return errno_to_file_error(err);
- }
+ int const sock = ::socket(AF_UNIX, SOCK_STREAM, 0);
+ if (sock < 0)
+ return std::error_condition(errno, std::generic_category());
- // mark socket as "listening"
- try
- {
- file = std::make_unique<posix_osd_socket>(sock, true);
- filesize = 0;
- return osd_file::error::NONE;
- }
- catch (...)
- {
- ::close(sock);
- return osd_file::error::OUT_OF_MEMORY;
- }
- }
- else
+ if (fcntl(sock, F_SETFL, O_NONBLOCK) < 0)
{
- //printf("Connecting to server '%s' on port '%d'\n", hostname, port);
- if (::connect(sock, reinterpret_cast<struct sockaddr const *>(&sai), sizeof(struct sockaddr)) < 0)
- {
- ::close(sock);
- return osd_file::error::ACCESS_DENIED; // have to return this value or bitb won't try to bind on connect failure
- }
- try
- {
- file = std::make_unique<posix_osd_socket>(sock, false);
- filesize = 0;
- return osd_file::error::NONE;
- }
- catch (...)
- {
- ::close(sock);
- return osd_file::error::OUT_OF_MEMORY;
- }
+ std::error_condition cntlerr(errno, std::generic_category());
+ ::close(sock);
+ return cntlerr;
}
+
+ return create_socket(sau, sock, openflags, file, filesize);
}
diff --git a/src/osd/modules/file/stdfile.cpp b/src/osd/modules/file/stdfile.cpp
index 96d7e53ebbe..4fd4662b884 100644
--- a/src/osd/modules/file/stdfile.cpp
+++ b/src/osd/modules/file/stdfile.cpp
@@ -10,12 +10,14 @@
#include "osdfile.h"
#include <cassert>
+#include <cerrno>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
+#include <limits>
#include <string>
-#include <cstdio> // for fileno
+#include <stdio.h> // for fileno
#include <unistd.h> // for ftruncate
@@ -25,7 +27,10 @@ class std_osd_file : public osd_file
{
public:
- std_osd_file(FILE *f) : m_file(f) { assert(m_file); }
+ std_osd_file(FILE *f) noexcept : m_file(f)
+ {
+ assert(m_file);
+ }
//============================================================
// osd_close
@@ -34,59 +39,81 @@ public:
virtual ~std_osd_file() override
{
// close the file handle
- if (m_file) std::fclose(m_file);
+ if (m_file)
+ std::fclose(m_file);
}
//============================================================
// osd_read
//============================================================
- virtual error read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) override
+ virtual std::error_condition read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) noexcept override
{
- // seek to the new location; note that most fseek implementations are limited to 32 bits
+ // seek to the new location; note that most fseek implementations are limited to the range of long int
+ if (std::numeric_limits<long>::max() < offset)
+ return std::errc::invalid_argument;
if (std::fseek(m_file, offset, SEEK_SET) < 0)
- return error::FAILURE;
+ return std::error_condition(errno, std::generic_category());
// perform the read
std::size_t const count = std::fread(buffer, 1, length, m_file);
+ if ((count < length) && std::ferror(m_file))
+ {
+ std::clearerr(m_file);
+ return std::error_condition(errno, std::generic_category());
+ }
actual = count;
- return error::NONE;
+ return std::error_condition();
}
//============================================================
// osd_write
//============================================================
- virtual error write(const void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) override
+ virtual std::error_condition write(const void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) noexcept override
{
- // seek to the new location; note that most fseek implementations are limited to 32 bits
+ // seek to the new location; note that most fseek implementations are limited to the range of long int
+ if (std::numeric_limits<long>::max() < offset)
+ return std::errc::invalid_argument;
if (std::fseek(m_file, offset, SEEK_SET) < 0)
- return error::FAILURE;
+ return std::error_condition(errno, std::generic_category());
// perform the write
std::size_t const count = std::fwrite(buffer, 1, length, m_file);
+ if (count < length)
+ {
+ std::clearerr(m_file);
+ return std::error_condition(errno, std::generic_category());
+ }
actual = count;
- return error::NONE;
+ return std::error_condition();
}
//============================================================
// osd_truncate
//============================================================
- error truncate(std::uint64_t offset) override
+ virtual std::error_condition truncate(std::uint64_t offset) noexcept override
{
- return (ftruncate(fileno(m_file), offset) < 0) ? error::FAILURE : error::NONE;
+ // this is present in POSIX but not C/C++
+ if (::ftruncate(::fileno(m_file), offset) < 0)
+ return std::error_condition(errno, std::generic_category());
+ else
+ return std::error_condition();
}
//============================================================
// osd_fflush
//============================================================
- virtual error flush() override
+ virtual std::error_condition flush() noexcept override
{
- return (std::fflush(m_file) == EOF) ? error::FAILURE : error::NONE;
+ if (!std::fflush(m_file))
+ return std::error_condition();
+ else
+ return std::error_condition(errno, std::generic_category());
}
private:
@@ -100,7 +127,7 @@ private:
// osd_open
//============================================================
-osd_file::error osd_file::open(std::string const &path, std::uint32_t openflags, ptr &file, std::uint64_t &filesize)
+std::error_condition osd_file::open(std::string const &path, std::uint32_t openflags, ptr &file, std::uint64_t &filesize) noexcept
{
// based on the flags, choose a mode
const char *mode;
@@ -114,12 +141,12 @@ osd_file::error osd_file::open(std::string const &path, std::uint32_t openflags,
else if (openflags & OPEN_FLAG_READ)
mode = "rb";
else
- return error::INVALID_ACCESS;
+ return std::errc::invalid_argument;
// open the file
FILE *const fileptr = std::fopen(path.c_str(), mode);
if (!fileptr)
- return error::NOT_FOUND;
+ return std::error_condition(errno, std::generic_category());
// get the size -- note that most fseek/ftell implementations are limited to 32 bits
long length;
@@ -127,21 +154,20 @@ osd_file::error osd_file::open(std::string const &path, std::uint32_t openflags,
((length = std::ftell(fileptr)) < 0) ||
(std::fseek(fileptr, 0, SEEK_SET) < 0))
{
+ std::error_condition err(errno, std::generic_category());
std::fclose(fileptr);
- return error::FAILURE;
+ return err;
}
- try
- {
- file = std::make_unique<std_osd_file>(fileptr);
- filesize = std::int64_t(length);
- return error::NONE;
- }
- catch (...)
+ osd_file::ptr result(new (std::nothrow) std_osd_file(fileptr));
+ if (!result)
{
std::fclose(fileptr);
- return error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
}
+ file = std::move(result);
+ filesize = std::int64_t(length);
+ return std::error_condition();
}
@@ -149,9 +175,9 @@ osd_file::error osd_file::open(std::string const &path, std::uint32_t openflags,
// osd_openpty
//============================================================
-osd_file::error osd_file::openpty(ptr &file, std::string &name)
+std::error_condition osd_file::openpty(ptr &file, std::string &name) noexcept
{
- return error::FAILURE;
+ return std::errc::not_supported;
}
@@ -159,9 +185,12 @@ osd_file::error osd_file::openpty(ptr &file, std::string &name)
// osd_rmfile
//============================================================
-osd_file::error osd_file::remove(std::string const &filename)
+std::error_condition osd_file::remove(std::string const &filename) noexcept
{
- return (std::remove(filename.c_str()) < 0) ? error::FAILURE : error::NONE;
+ if (!std::remove(filename.c_str()))
+ return std::error_condition();
+ else
+ return std::error_condition(errno, std::generic_category());
}
@@ -169,7 +198,7 @@ osd_file::error osd_file::remove(std::string const &filename)
// osd_get_physical_drive_geometry
//============================================================
-bool osd_get_physical_drive_geometry(const char *filename, uint32_t *cylinders, uint32_t *heads, uint32_t *sectors, uint32_t *bps)
+bool osd_get_physical_drive_geometry(const char *filename, uint32_t *cylinders, uint32_t *heads, uint32_t *sectors, uint32_t *bps) noexcept
{
// there is no standard way of doing this, so we always return false, indicating
// that a given path is not a physical drive
@@ -181,7 +210,7 @@ bool osd_get_physical_drive_geometry(const char *filename, uint32_t *cylinders,
// osd_uchar_from_osdchar
//============================================================
-int osd_uchar_from_osdchar(char32_t *uchar, const char *osdchar, size_t count)
+int osd_uchar_from_osdchar(char32_t *uchar, const char *osdchar, size_t count) noexcept
{
// we assume a standard 1:1 mapping of characters to the first 256 unicode characters
*uchar = (uint8_t)*osdchar;
@@ -221,13 +250,14 @@ osd_directory_entry *osd_stat(const std::string &path)
// osd_get_full_path
//============================================================
-osd_file::error osd_get_full_path(std::string &dst, std::string const &path)
+std::error_condition osd_get_full_path(std::string &dst, std::string const &path) noexcept
{
// derive the full path of the file in an allocated string
// for now just fake it since we don't presume any underlying file system
- dst = path;
+ try { dst = path; }
+ catch (...) { return std::errc::not_enough_memory; }
- return osd_file::error::NONE;
+ return std::error_condition();
}
@@ -235,7 +265,7 @@ osd_file::error osd_get_full_path(std::string &dst, std::string const &path)
// osd_is_absolute_path
//============================================================
-bool osd_is_absolute_path(std::string const &path)
+bool osd_is_absolute_path(std::string const &path) noexcept
{
// assume no for everything
return false;
diff --git a/src/osd/modules/file/winfile.cpp b/src/osd/modules/file/winfile.cpp
index 4c265be613d..be4fa6f70c3 100644
--- a/src/osd/modules/file/winfile.cpp
+++ b/src/osd/modules/file/winfile.cpp
@@ -6,7 +6,6 @@
//
//============================================================
-
#include "winfile.h"
// MAMEOS headers
@@ -45,7 +44,7 @@ public:
win_osd_file& operator=(win_osd_file const &) = delete;
win_osd_file& operator=(win_osd_file &&) = delete;
- win_osd_file(HANDLE handle) : m_handle(handle)
+ win_osd_file(HANDLE handle) noexcept : m_handle(handle)
{
assert(m_handle);
assert(INVALID_HANDLE_VALUE != m_handle);
@@ -57,7 +56,7 @@ public:
CloseHandle(m_handle);
}
- virtual error read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) override
+ virtual std::error_condition read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) noexcept override
{
// attempt to set the file pointer
LARGE_INTEGER largeOffset;
@@ -71,10 +70,10 @@ public:
return win_error_to_file_error(GetLastError());
actual = result;
- return error::NONE;
+ return std::error_condition();
}
- virtual error write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) override
+ virtual std::error_condition write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) noexcept override
{
// attempt to set the file pointer
LARGE_INTEGER largeOffset;
@@ -88,10 +87,10 @@ public:
return win_error_to_file_error(GetLastError());
actual = result;
- return error::NONE;
+ return std::error_condition();
}
- virtual error truncate(std::uint64_t offset) override
+ virtual std::error_condition truncate(std::uint64_t offset) noexcept override
{
// attempt to set the file pointer
LARGE_INTEGER largeOffset;
@@ -103,13 +102,13 @@ public:
if (!SetEndOfFile(m_handle))
return win_error_to_file_error(GetLastError());
else
- return error::NONE;
+ return std::error_condition();
}
- virtual error flush() override
+ virtual std::error_condition flush() noexcept override
{
// shouldn't be any userspace buffers on the file handle
- return error::NONE;
+ return std::error_condition();
}
private:
@@ -162,11 +161,11 @@ DWORD create_path_recursive(TCHAR *path)
// osd_open
//============================================================
-osd_file::error osd_file::open(std::string const &orig_path, uint32_t openflags, ptr &file, std::uint64_t &filesize)
+std::error_condition osd_file::open(std::string const &orig_path, uint32_t openflags, ptr &file, std::uint64_t &filesize) noexcept
{
std::string path;
try { osd_subst_env(path, orig_path); }
- catch (...) { return error::OUT_OF_MEMORY; }
+ catch (...) { return std::errc::not_enough_memory; }
if (win_check_socket_path(path))
return win_open_socket(path, openflags, file, filesize);
@@ -174,10 +173,11 @@ osd_file::error osd_file::open(std::string const &orig_path, uint32_t openflags,
return win_open_ptty(path, openflags, file, filesize);
// convert path to TCHAR
- osd::text::tstring t_path = osd::text::to_tstring(path);
+ osd::text::tstring t_path;
+ try { t_path = osd::text::to_tstring(path); }
+ catch (...) { return std::errc::not_enough_memory; }
- // convert the path into something Windows compatible (the actual interesting part appears
- // to have been commented out???)
+ // convert the path into something Windows compatible (the actual interesting part appears to have been commented out???)
for (auto iter = t_path.begin(); iter != t_path.end(); iter++)
*iter = /* ('/' == *iter) ? '\\' : */ *iter;
@@ -187,7 +187,8 @@ osd_file::error osd_file::open(std::string const &orig_path, uint32_t openflags,
{
disposition = (!is_path_to_physical_drive(path.c_str()) && (openflags & OPEN_FLAG_CREATE)) ? CREATE_ALWAYS : OPEN_EXISTING;
access = (openflags & OPEN_FLAG_READ) ? (GENERIC_READ | GENERIC_WRITE) : GENERIC_WRITE;
- if (is_path_to_physical_drive(path.c_str())) access |= GENERIC_READ;
+ if (is_path_to_physical_drive(path.c_str()))
+ access |= GENERIC_READ;
sharemode = FILE_SHARE_READ;
}
else if (openflags & OPEN_FLAG_READ)
@@ -198,7 +199,7 @@ osd_file::error osd_file::open(std::string const &orig_path, uint32_t openflags,
}
else
{
- return error::INVALID_ACCESS;
+ return std::errc::invalid_argument;
}
// attempt to open the file
@@ -262,17 +263,15 @@ osd_file::error osd_file::open(std::string const &orig_path, uint32_t openflags,
}
}
- try
- {
- file = std::make_unique<win_osd_file>(h);
- filesize = (std::uint64_t(upper) << 32) | lower;
- return error::NONE;
- }
- catch (...)
+ osd_file::ptr result(new (std::nothrow) win_osd_file(h));
+ if (!result)
{
CloseHandle(h);
- return error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
}
+ file = std::move(result);
+ filesize = (std::uint64_t(upper) << 32) | lower;
+ return std::error_condition();
}
@@ -281,9 +280,9 @@ osd_file::error osd_file::open(std::string const &orig_path, uint32_t openflags,
// osd_openpty
//============================================================
-osd_file::error osd_file::openpty(ptr &file, std::string &name)
+std::error_condition osd_file::openpty(ptr &file, std::string &name) noexcept
{
- return error::FAILURE;
+ return std::errc::not_supported; // TODO: revisit this error code
}
@@ -292,11 +291,13 @@ osd_file::error osd_file::openpty(ptr &file, std::string &name)
// osd_rmfile
//============================================================
-osd_file::error osd_file::remove(std::string const &filename)
+std::error_condition osd_file::remove(std::string const &filename) noexcept
{
- osd::text::tstring tempstr = osd::text::to_tstring(filename);
+ osd::text::tstring tempstr;
+ try { tempstr = osd::text::to_tstring(filename); }
+ catch (...) { return std::errc::not_enough_memory; }
- error filerr = error::NONE;
+ std::error_condition filerr;
if (!DeleteFile(tempstr.c_str()))
filerr = win_error_to_file_error(GetLastError());
@@ -309,7 +310,7 @@ osd_file::error osd_file::remove(std::string const &filename)
// osd_get_physical_drive_geometry
//============================================================
-bool osd_get_physical_drive_geometry(const char *filename, uint32_t *cylinders, uint32_t *heads, uint32_t *sectors, uint32_t *bps)
+bool osd_get_physical_drive_geometry(const char *filename, uint32_t *cylinders, uint32_t *heads, uint32_t *sectors, uint32_t *bps) noexcept
{
DISK_GEOMETRY dg;
DWORD bytesRead;
@@ -321,10 +322,17 @@ bool osd_get_physical_drive_geometry(const char *filename, uint32_t *cylinders,
return false;
// do a create file on the drive
- auto t_filename = osd::text::to_tstring(filename);
- file = CreateFile(t_filename.c_str(), GENERIC_READ, FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, nullptr);
- if (file == INVALID_HANDLE_VALUE)
+ try
+ {
+ auto t_filename = osd::text::to_tstring(filename);
+ file = CreateFile(t_filename.c_str(), GENERIC_READ, FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, nullptr);
+ if (file == INVALID_HANDLE_VALUE)
+ return false;
+ }
+ catch (...)
+ {
return false;
+ }
// device I/O control should return the geometry
result = DeviceIoControl(file, IOCTL_DISK_GET_DRIVE_GEOMETRY, nullptr, 0, &dg, sizeof(dg), &bytesRead, nullptr);
@@ -399,22 +407,29 @@ std::unique_ptr<osd::directory::entry> osd_stat(const std::string &path)
// osd_get_full_path
//============================================================
-osd_file::error osd_get_full_path(std::string &dst, std::string const &path)
+std::error_condition osd_get_full_path(std::string &dst, std::string const &path) noexcept
{
- // get the length of the full path
- std::wstring const w_path(osd::text::to_wstring(path));
- DWORD const length(GetFullPathNameW(w_path.c_str(), 0, nullptr, nullptr));
- if (!length)
- return win_error_to_file_error(GetLastError());
+ try
+ {
+ // get the length of the full path
+ std::wstring const w_path(osd::text::to_wstring(path));
+ DWORD const length(GetFullPathNameW(w_path.c_str(), 0, nullptr, nullptr));
+ if (!length)
+ return win_error_to_file_error(GetLastError());
- // allocate a buffer and get the canonical path
- std::unique_ptr<wchar_t []> buffer(std::make_unique<wchar_t []>(length));
- if (!GetFullPathNameW(w_path.c_str(), length, buffer.get(), nullptr))
- return win_error_to_file_error(GetLastError());
+ // allocate a buffer and get the canonical path
+ std::unique_ptr<wchar_t []> buffer(std::make_unique<wchar_t []>(length));
+ if (!GetFullPathNameW(w_path.c_str(), length, buffer.get(), nullptr))
+ return win_error_to_file_error(GetLastError());
- // convert the result back to UTF-8
- osd::text::from_wstring(dst, buffer.get());
- return osd_file::error::NONE;
+ // convert the result back to UTF-8
+ osd::text::from_wstring(dst, buffer.get());
+ return std::error_condition();
+ }
+ catch (...)
+ {
+ return std::errc::not_enough_memory; // the string conversions can throw bad_alloc
+ }
}
@@ -423,7 +438,7 @@ osd_file::error osd_get_full_path(std::string &dst, std::string const &path)
// osd_is_absolute_path
//============================================================
-bool osd_is_absolute_path(std::string const &path)
+bool osd_is_absolute_path(std::string const &path) noexcept
{
return !PathIsRelativeW(osd::text::to_wstring(path).c_str());
}
@@ -493,7 +508,7 @@ std::vector<std::string> osd_get_volume_names()
// osd_is_valid_filename_char
//============================================================
-bool osd_is_valid_filename_char(char32_t uchar)
+bool osd_is_valid_filename_char(char32_t uchar) noexcept
{
return osd_is_valid_filepath_char(uchar)
&& uchar != '/'
@@ -507,7 +522,7 @@ bool osd_is_valid_filename_char(char32_t uchar)
// osd_is_valid_filepath_char
//============================================================
-bool osd_is_valid_filepath_char(char32_t uchar)
+bool osd_is_valid_filepath_char(char32_t uchar) noexcept
{
return uchar >= 0x20
&& uchar != '<'
@@ -526,39 +541,62 @@ bool osd_is_valid_filepath_char(char32_t uchar)
// win_error_to_file_error
//============================================================
-osd_file::error win_error_to_file_error(DWORD error)
+std::error_condition win_error_to_file_error(DWORD error) noexcept
{
- osd_file::error filerr;
-
- // convert a Windows error to a osd_file::error
+ // TODO: work out if there's a better way to do this
switch (error)
{
case ERROR_SUCCESS:
- filerr = osd_file::error::NONE;
- break;
+ return std::error_condition();
+
+ case ERROR_INVALID_HANDLE:
+ return std::errc::bad_file_descriptor;
case ERROR_OUTOFMEMORY:
- filerr = osd_file::error::OUT_OF_MEMORY;
- break;
+ return std::errc::not_enough_memory;
+
+ case ERROR_NOT_SUPPORTED:
+ return std::errc::not_supported;
case ERROR_FILE_NOT_FOUND:
- case ERROR_FILENAME_EXCED_RANGE:
case ERROR_PATH_NOT_FOUND:
case ERROR_INVALID_NAME:
- filerr = osd_file::error::NOT_FOUND;
- break;
+ return std::errc::no_such_file_or_directory;
- case ERROR_ACCESS_DENIED:
- filerr = osd_file::error::ACCESS_DENIED;
- break;
+ case ERROR_FILENAME_EXCED_RANGE:
+ return std::errc::filename_too_long;
+ case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
- filerr = osd_file::error::ALREADY_OPEN;
- break;
+ return std::errc::permission_denied;
+
+ case ERROR_ALREADY_EXISTS:
+ return std::errc::file_exists;
+
+ case ERROR_TOO_MANY_OPEN_FILES:
+ return std::errc::too_many_files_open;
+
+ case ERROR_WRITE_FAULT:
+ case ERROR_READ_FAULT:
+ return std::errc::io_error;
+
+ case ERROR_HANDLE_DISK_FULL:
+ case ERROR_DISK_FULL:
+ return std::errc::no_space_on_device;
+
+ case ERROR_PATH_BUSY:
+ case ERROR_BUSY:
+ return std::errc::device_or_resource_busy;
+
+ case ERROR_FILE_TOO_LARGE:
+ return std::errc::file_too_large;
+
+ case ERROR_INVALID_ACCESS:
+ case ERROR_NEGATIVE_SEEK:
+ case ERROR_BAD_ARGUMENTS:
+ return std::errc::invalid_argument;
default:
- filerr = osd_file::error::FAILURE;
- break;
+ return std::error_condition(error, std::system_category());
}
- return filerr;
}
diff --git a/src/osd/modules/file/winfile.h b/src/osd/modules/file/winfile.h
index 927cb299545..83f0814733d 100644
--- a/src/osd/modules/file/winfile.h
+++ b/src/osd/modules/file/winfile.h
@@ -5,13 +5,16 @@
// winfile.h - File access functions
//
//============================================================
-#ifndef MAME_OSD_WINDOWS_WINFILE_H
-#define MAME_OSD_WINDOWS_WINFILE_H
+#ifndef MAME_OSD_MODULES_FILE_WINFILE_H
+#define MAME_OSD_MODULES_FILE_WINFILE_H
+
+#pragma once
#include "osdfile.h"
#include <cstdint>
#include <string>
+#include <system_error>
#include <winsock2.h>
@@ -20,15 +23,15 @@
// PROTOTYPES
//============================================================
-bool win_init_sockets();
-void win_cleanup_sockets();
+bool win_init_sockets() noexcept;
+void win_cleanup_sockets() noexcept;
-bool win_check_socket_path(std::string const &path);
-osd_file::error win_open_socket(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize);
+bool win_check_socket_path(std::string const &path) noexcept;
+std::error_condition win_open_socket(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize) noexcept;
-bool win_check_ptty_path(std::string const &path);
-osd_file::error win_open_ptty(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize);
+bool win_check_ptty_path(std::string const &path) noexcept;
+std::error_condition win_open_ptty(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize) noexcept;
-osd_file::error win_error_to_file_error(DWORD error);
+std::error_condition win_error_to_file_error(DWORD error) noexcept;
-#endif // MAME_OSD_WINDOWS_WINFILE_H
+#endif // MAME_OSD_MODULES_FILE_WINFILE_H
diff --git a/src/osd/modules/file/winptty.cpp b/src/osd/modules/file/winptty.cpp
index 65650fd4bfe..7feeacce137 100644
--- a/src/osd/modules/file/winptty.cpp
+++ b/src/osd/modules/file/winptty.cpp
@@ -15,6 +15,7 @@
namespace {
+
char const *const winfile_ptty_identifier = "\\\\.\\pipe\\";
@@ -26,7 +27,7 @@ public:
win_osd_ptty& operator=(win_osd_ptty const &) = delete;
win_osd_ptty& operator=(win_osd_ptty &&) = delete;
- win_osd_ptty(HANDLE handle) : m_handle(handle)
+ win_osd_ptty(HANDLE handle) noexcept : m_handle(handle)
{
assert(m_handle);
assert(INVALID_HANDLE_VALUE != m_handle);
@@ -39,36 +40,36 @@ public:
CloseHandle(m_handle);
}
- virtual error read(void *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) override
+ virtual std::error_condition read(void *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) noexcept override
{
DWORD bytes_read;
if (!ReadFile(m_handle, buffer, count, &bytes_read, nullptr))
return win_error_to_file_error(GetLastError());
actual = bytes_read;
- return error::NONE;
+ return std::error_condition();
}
- virtual error write(void const *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) override
+ virtual std::error_condition write(void const *buffer, std::uint64_t offset, std::uint32_t count, std::uint32_t &actual) noexcept override
{
DWORD bytes_written;
if (!WriteFile(m_handle, buffer, count, &bytes_written, nullptr))
return win_error_to_file_error(GetLastError());
actual = bytes_written;
- return error::NONE;
+ return std::error_condition();
}
- virtual error truncate(std::uint64_t offset) override
+ virtual std::error_condition truncate(std::uint64_t offset) noexcept override
{
// doesn't make sense for a PTTY
- return error::INVALID_ACCESS;
+ return std::errc::bad_file_descriptor;
}
- virtual error flush() override
+ virtual std::error_condition flush() noexcept override
{
// don't want to wait for client to read all data as implied by FlushFileBuffers
- return error::NONE;
+ return std::error_condition();
}
private:
@@ -78,16 +79,18 @@ private:
} // anonymous namespace
-bool win_check_ptty_path(std::string const &path)
+bool win_check_ptty_path(std::string const &path) noexcept
{
if (strncmp(path.c_str(), winfile_ptty_identifier, strlen(winfile_ptty_identifier)) == 0) return true;
return false;
}
-osd_file::error win_open_ptty(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize)
+std::error_condition win_open_ptty(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize) noexcept
{
- osd::text::tstring t_name = osd::text::to_tstring(path);
+ osd::text::tstring t_name;
+ try { t_name = osd::text::to_tstring(path); }
+ catch (...) { return std::errc::not_enough_memory; }
HANDLE pipe = CreateFileW(t_name.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr);
@@ -96,23 +99,22 @@ osd_file::error win_open_ptty(std::string const &path, std::uint32_t openflags,
if (openflags & OPEN_FLAG_CREATE)
pipe = CreateNamedPipe(t_name.c_str(), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_NOWAIT, 1, 32, 32, 0, nullptr);
if (INVALID_HANDLE_VALUE == pipe)
- return osd_file::error::ACCESS_DENIED;
+ return win_error_to_file_error(GetLastError());
}
else
{
DWORD state = PIPE_NOWAIT;
SetNamedPipeHandleState(pipe, &state, nullptr, nullptr);
+ // TODO: check for error?
}
- try
- {
- file = std::make_unique<win_osd_ptty>(pipe);
- filesize = 0;
- return osd_file::error::NONE;
- }
- catch (...)
+ osd_file::ptr result(new (std::nothrow) win_osd_ptty(pipe));
+ if (!result)
{
CloseHandle(pipe);
- return osd_file::error::OUT_OF_MEMORY;
+ return std::errc::not_enough_memory;
}
+ file = std::move(result);
+ filesize = 0;
+ return std::error_condition();
}
diff --git a/src/osd/modules/file/winsocket.cpp b/src/osd/modules/file/winsocket.cpp
index 948e57db822..d04538963ea 100644
--- a/src/osd/modules/file/winsocket.cpp
+++ b/src/osd/modules/file/winsocket.cpp
@@ -6,7 +6,6 @@
//
//============================================================
-
#include "winfile.h"
// MAMEOS headers
@@ -28,6 +27,7 @@
namespace {
+
char const *const winfile_socket_identifier = "socket.";
@@ -39,7 +39,7 @@ public:
win_osd_socket& operator=(win_osd_socket const &) = delete;
win_osd_socket& operator=(win_osd_socket &&) = delete;
- win_osd_socket(SOCKET s, bool l)
+ win_osd_socket(SOCKET s, bool l) noexcept
: m_socket(s)
, m_listening(l)
{
@@ -51,7 +51,7 @@ public:
closesocket(m_socket);
}
- virtual error read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) override
+ virtual std::error_condition read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) noexcept override
{
fd_set readfds;
FD_ZERO(&readfds);
@@ -62,10 +62,7 @@ public:
if (select(m_socket + 1, &readfds, nullptr, nullptr, &timeout) < 0)
{
- char line[80];
- std::sprintf(line, "win_read_socket : %s : %d ", __FILE__, __LINE__);
- std::perror(line);
- return error::FAILURE;
+ return wsa_error_to_file_error(WSAGetLastError());
}
else if (FD_ISSET(m_socket, &readfds))
{
@@ -80,7 +77,7 @@ public:
else
{
actual = result;
- return error::NONE;
+ return std::error_condition();
}
}
else
@@ -98,50 +95,82 @@ public:
m_listening = false;
actual = 0;
- return error::NONE;
+ return std::error_condition();
}
}
}
else
{
- return error::FAILURE;
+ // no data available
+ actual = 0;
+ return std::errc::operation_would_block;
}
}
- virtual error write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) override
+ virtual std::error_condition write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) noexcept override
{
auto const result = send(m_socket, reinterpret_cast<const char *>(buffer), length, 0);
if (result < 0)
return wsa_error_to_file_error(WSAGetLastError());
actual = result;
- return error::NONE;
+ return std::error_condition();
}
- virtual error truncate(std::uint64_t offset) override
+ virtual std::error_condition truncate(std::uint64_t offset) noexcept override
{
// doesn't make sense for a socket
- return error::INVALID_ACCESS;
+ return std::errc::bad_file_descriptor;
}
- virtual error flush() override
+ virtual std::error_condition flush() noexcept override
{
// no buffers to flush
- return error::NONE;
+ return std::error_condition();
}
- static error wsa_error_to_file_error(int err)
+ static std::error_condition wsa_error_to_file_error(int err)
{
+ // TODO: determine if there's a better way to do this
switch (err)
{
- case 0: return error::NONE;
- case WSAEACCES: return error::ACCESS_DENIED;
- case WSAEADDRINUSE: return error::ALREADY_OPEN;
- case WSAEADDRNOTAVAIL: return error::NOT_FOUND;
- case WSAECONNREFUSED: return error::NOT_FOUND;
- case WSAEHOSTUNREACH: return error::NOT_FOUND;
- case WSAENETUNREACH: return error::NOT_FOUND;
- default: return error::FAILURE;
+ case 0: return std::error_condition();
+ case WSA_NOT_ENOUGH_MEMORY: return std::errc::not_enough_memory;
+ case WSA_INVALID_PARAMETER: return std::errc::invalid_argument;
+ case WSAEINTR: return std::errc::interrupted;
+ case WSAEBADF: return std::errc::bad_file_descriptor;
+ case WSAEACCES: return std::errc::permission_denied;
+ case WSAEFAULT: return std::errc::bad_address;
+ case WSAEINVAL: return std::errc::invalid_argument;
+ case WSAEMFILE: return std::errc::too_many_files_open;
+ case WSAENETRESET: return std::errc::network_reset;
+ case WSAECONNABORTED: return std::errc::connection_aborted;
+ case WSAEWOULDBLOCK: return std::errc::operation_would_block;
+ case WSAEINPROGRESS: return std::errc::operation_in_progress;
+ case WSAEALREADY: return std::errc::connection_already_in_progress;
+ case WSAENOTSOCK: return std::errc::not_a_socket;
+ case WSAEDESTADDRREQ: return std::errc::destination_address_required;
+ case WSAEMSGSIZE: return std::errc::message_size;
+ case WSAEPROTOTYPE: return std::errc::wrong_protocol_type;
+ case WSAENOPROTOOPT: return std::errc::no_protocol_option;
+ case WSAEPROTONOSUPPORT: return std::errc::protocol_not_supported;
+ case WSAEOPNOTSUPP: return std::errc::operation_not_supported;
+ case WSAEAFNOSUPPORT: return std::errc::address_family_not_supported;
+ case WSAEADDRINUSE: return std::errc::address_in_use;
+ case WSAEADDRNOTAVAIL: return std::errc::address_not_available;
+ case WSAENETDOWN: return std::errc::network_down;
+ case WSAENETUNREACH: return std::errc::network_unreachable;
+ case WSAECONNRESET: return std::errc::connection_reset;
+ case WSAENOBUFS: return std::errc::no_buffer_space;
+ case WSAEISCONN: return std::errc::already_connected;
+ case WSAENOTCONN: return std::errc::not_connected;
+ case WSAETIMEDOUT: return std::errc::timed_out;
+ case WSAECONNREFUSED: return std::errc::connection_refused;
+ case WSAEHOSTUNREACH: return std::errc::host_unreachable;
+ case WSAECANCELLED: return std::errc::operation_canceled;
+
+ // TODO: better default error code?
+ default: return std::errc::io_error;
}
}
@@ -153,7 +182,7 @@ private:
} // anonymous namespace
-bool win_init_sockets()
+bool win_init_sockets() noexcept
{
WSADATA wsaData;
WORD const version = MAKEWORD(2, 0);
@@ -179,13 +208,13 @@ bool win_init_sockets()
}
-void win_cleanup_sockets()
+void win_cleanup_sockets() noexcept
{
WSACleanup();
}
-bool win_check_socket_path(std::string const &path)
+bool win_check_socket_path(std::string const &path) noexcept
{
if (strncmp(path.c_str(), winfile_socket_identifier, strlen(winfile_socket_identifier)) == 0 &&
strchr(path.c_str(), ':') != nullptr) return true;
@@ -193,7 +222,7 @@ bool win_check_socket_path(std::string const &path)
}
-osd_file::error win_open_socket(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize)
+std::error_condition win_open_socket(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize) noexcept
{
char hostname[256];
int port;
@@ -201,7 +230,7 @@ osd_file::error win_open_socket(std::string const &path, std::uint32_t openflags
struct hostent const *const localhost = gethostbyname(hostname);
if (!localhost)
- return osd_file::error::NOT_FOUND;
+ return std::errc::no_such_file_or_directory;
struct sockaddr_in sai;
memset(&sai, 0, sizeof(sai));
@@ -222,11 +251,12 @@ osd_file::error win_open_socket(std::string const &path, std::uint32_t openflags
}
// listening socket support
+ osd_file::ptr result;
if (openflags & OPEN_FLAG_CREATE)
{
//printf("Listening for client at '%s' on port '%d'\n", hostname, port);
// bind socket...
- if (bind(sock, reinterpret_cast<struct sockaddr const *>(&sai), sizeof(struct sockaddr)) == SOCKET_ERROR)
+ if (bind(sock, reinterpret_cast<struct sockaddr const *>(&sai), sizeof(sai)) == SOCKET_ERROR)
{
int const err = WSAGetLastError();
closesocket(sock);
@@ -242,36 +272,26 @@ osd_file::error win_open_socket(std::string const &path, std::uint32_t openflags
}
// mark socket as "listening"
- try
- {
- file = std::make_unique<win_osd_socket>(sock, true);
- filesize = 0;
- return osd_file::error::NONE;
- }
- catch (...)
- {
- closesocket(sock);
- return osd_file::error::OUT_OF_MEMORY;
- }
+ result.reset(new (std::nothrow) win_osd_socket(sock, true));
}
else
{
//printf("Connecting to server '%s' on port '%d'\n", hostname, port);
- if (connect(sock, reinterpret_cast<struct sockaddr const *>(&sai), sizeof(struct sockaddr)) == SOCKET_ERROR)
- {
- closesocket(sock);
- return osd_file::error::ACCESS_DENIED; // have to return this value or bitb won't try to bind on connect failure
- }
- try
- {
- file = std::make_unique<win_osd_socket>(sock, false);
- filesize = 0;
- return osd_file::error::NONE;
- }
- catch (...)
+ if (connect(sock, reinterpret_cast<struct sockaddr const *>(&sai), sizeof(sai)) == SOCKET_ERROR)
{
+ int const err = WSAGetLastError();
closesocket(sock);
- return osd_file::error::OUT_OF_MEMORY;
+ return win_osd_socket::wsa_error_to_file_error(err);
}
+ result.reset(new (std::nothrow) win_osd_socket(sock, false));
+ }
+
+ if (!result)
+ {
+ closesocket(sock);
+ return std::errc::not_enough_memory;
}
+ file = std::move(result);
+ filesize = 0;
+ return std::error_condition();
}
diff --git a/src/osd/modules/font/font_sdl.cpp b/src/osd/modules/font/font_sdl.cpp
index a17b87cdc13..5cad4a3fab8 100644
--- a/src/osd/modules/font/font_sdl.cpp
+++ b/src/osd/modules/font/font_sdl.cpp
@@ -90,7 +90,7 @@ bool osd_font_sdl::open(std::string const &font_path, std::string const &_name,
osd_printf_verbose("Searching font %s in -%s path/s\n", family, font_path);
//emu_file file(options().font_path(), OPEN_FLAG_READ);
emu_file file(font_path, OPEN_FLAG_READ);
- if (file.open(family) == osd_file::error::NONE)
+ if (!file.open(family))
{
std::string full_name = file.fullpath();
font = TTF_OpenFont_Magic(full_name, POINT_SIZE, 0);
@@ -193,7 +193,7 @@ bool osd_font_sdl::get_bitmap(char32_t chnum, bitmap_argb32 &bitmap, std::int32_
osd_font_sdl::TTF_Font_ptr osd_font_sdl::TTF_OpenFont_Magic(std::string const &name, int fsize, long index)
{
emu_file file(OPEN_FLAG_READ);
- if (file.open(name) == osd_file::error::NONE)
+ if (!file.open(name))
{
unsigned char const ttf_magic[] = { 0x00, 0x01, 0x00, 0x00, 0x00 };
unsigned char const ttc1_magic[] = { 0x74, 0x74, 0x63, 0x66, 0x00, 0x01, 0x00, 0x00 };
@@ -214,7 +214,7 @@ osd_font_sdl::TTF_Font_ptr osd_font_sdl::TTF_OpenFont_Magic(std::string const &n
bool osd_font_sdl::BDF_Check_Magic(std::string const &name)
{
emu_file file(OPEN_FLAG_READ);
- if (file.open(name) == osd_file::error::NONE)
+ if (!file.open(name))
{
unsigned char const magic[] = { 'S', 'T', 'A', 'R', 'T', 'F', 'O', 'N', 'T' };
unsigned char buffer[sizeof(magic)];
diff --git a/src/osd/modules/input/input_dinput.cpp b/src/osd/modules/input/input_dinput.cpp
index 57a84fab225..8ceb29e21f4 100644
--- a/src/osd/modules/input/input_dinput.cpp
+++ b/src/osd/modules/input/input_dinput.cpp
@@ -550,8 +550,7 @@ int dinput_joystick_device::configure()
//============================================================
dinput_api_helper::dinput_api_helper()
- : m_dinput(nullptr),
- m_dinput_create_prt(nullptr)
+ : m_dinput(nullptr)
{
}
diff --git a/src/osd/modules/input/input_dinput.h b/src/osd/modules/input/input_dinput.h
index 8d983799fcb..8600e73a04d 100644
--- a/src/osd/modules/input/input_dinput.h
+++ b/src/osd/modules/input/input_dinput.h
@@ -46,7 +46,6 @@ class dinput_api_helper
private:
Microsoft::WRL::ComPtr<IDirectInput8> m_dinput;
osd::dynamic_module::ptr m_dinput_dll;
- dinput_create_fn m_dinput_create_prt;
public:
dinput_api_helper();
diff --git a/src/osd/modules/netdev/taptun.cpp b/src/osd/modules/netdev/taptun.cpp
index 6999d6f63ba..c0d99ec750c 100644
--- a/src/osd/modules/netdev/taptun.cpp
+++ b/src/osd/modules/netdev/taptun.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Carl
#if defined(OSD_NET_USE_TAPTUN)
-#if defined(WIN32)
+#if defined(_WIN32)
#include <windows.h>
#include <winioctl.h>
#else
@@ -23,7 +23,7 @@
#define IFF_TAP 0x0002
#define IFF_NO_PI 0x1000
#define TUNSETIFF _IOW('T', 202, int)
-#elif defined(WIN32)
+#elif defined(_WIN32)
#include "tap-windows6/tap-windows.h"
// for some reason this isn't defined in the header, and presumably it changes
@@ -62,7 +62,7 @@ public:
protected:
int recv_dev(uint8_t **buf) override;
private:
-#if defined(WIN32)
+#if defined(_WIN32)
HANDLE m_handle = INVALID_HANDLE_VALUE;
OVERLAPPED m_overlapped;
bool m_receive_pending;
@@ -98,7 +98,7 @@ netdev_tap::netdev_tap(const char *name, class device_network_interface *ifdev,
osd_printf_verbose("netdev_tap: network up!\n");
strncpy(m_ifname, ifr.ifr_name, 10);
fcntl(m_fd, F_SETFL, O_NONBLOCK);
-#elif defined(WIN32)
+#elif defined(_WIN32)
std::wstring device_path(L"" USERMODEDEVICEDIR);
device_path.append(wstring_from_utf8(name));
device_path.append(L"" TAP_WIN_SUFFIX);
@@ -121,7 +121,7 @@ netdev_tap::netdev_tap(const char *name, class device_network_interface *ifdev,
netdev_tap::~netdev_tap()
{
-#if defined(WIN32)
+#if defined(_WIN32)
if (m_handle != INVALID_HANDLE_VALUE)
{
if (m_receive_pending)
@@ -169,7 +169,7 @@ static u32 finalise_frame(u8 buf[], u32 length)
return length;
}
-#if defined(WIN32)
+#if defined(_WIN32)
int netdev_tap::send(uint8_t *buf, int len)
{
OVERLAPPED overlapped = {};
@@ -344,7 +344,7 @@ static CREATE_NETDEV(create_tap)
int taptun_module::init(const osd_options &options)
{
-#if defined(WIN32)
+#if defined(_WIN32)
for (std::wstring &id : get_tap_adapters())
add_netdev(utf8_from_wstring(id).c_str(), utf8_from_wstring(get_connection_name(id)).c_str(), create_tap);
#else
diff --git a/src/osd/modules/render/aviwrite.cpp b/src/osd/modules/render/aviwrite.cpp
index 2626fca9440..24c49e60544 100644
--- a/src/osd/modules/render/aviwrite.cpp
+++ b/src/osd/modules/render/aviwrite.cpp
@@ -80,12 +80,12 @@ void avi_write::begin_avi_recording(const char *name)
// create a new temporary movie file
emu_file tempfile(m_machine.options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- const osd_file::error filerr = (!name || !name[0] || !std::strcmp(name, OSDOPTVAL_AUTO))
+ const std::error_condition filerr = (!name || !name[0] || !std::strcmp(name, OSDOPTVAL_AUTO))
? m_machine.video().open_next(tempfile, "avi")
: tempfile.open(name);
// if we succeeded, make a copy of the name and create the real file over top
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
{
const std::string fullpath = tempfile.fullpath();
tempfile.close();
diff --git a/src/osd/modules/render/bgfx/chain.cpp b/src/osd/modules/render/bgfx/chain.cpp
index 6ff13cffebb..8dbd72a0067 100644
--- a/src/osd/modules/render/bgfx/chain.cpp
+++ b/src/osd/modules/render/bgfx/chain.cpp
@@ -169,5 +169,5 @@ void bgfx_chain::insert_effect(uint32_t index, bgfx_effect *effect, std::string
const uint32_t screen_width = chains.targets().width(TARGET_STYLE_GUEST, m_screen_index);
const uint32_t screen_height = chains.targets().height(TARGET_STYLE_GUEST, m_screen_index);
m_targets.destroy_target("screen", m_screen_index);
- m_targets.create_target("screen", bgfx::TextureFormat::RGBA8, screen_width, screen_height, TARGET_STYLE_GUEST, true, false, 1, m_screen_index);
+ m_targets.create_target("screen", bgfx::TextureFormat::BGRA8, screen_width, screen_height, TARGET_STYLE_GUEST, true, false, 1, m_screen_index);
}
diff --git a/src/osd/modules/render/bgfx/chainmanager.cpp b/src/osd/modules/render/bgfx/chainmanager.cpp
index 43bc463a5e1..2de2870fdd2 100644
--- a/src/osd/modules/render/bgfx/chainmanager.cpp
+++ b/src/osd/modules/render/bgfx/chainmanager.cpp
@@ -47,6 +47,7 @@ chain_manager::chain_manager(running_machine& machine, osd_options& options, tex
, m_slider_notifier(slider_notifier)
, m_screen_count(0)
{
+ m_converters.clear();
refresh_available_chains();
parse_chain_selections(options.bgfx_screen_chains());
init_texture_converters();
@@ -462,14 +463,16 @@ uint32_t chain_manager::update_screen_textures(uint32_t view, render_primitive *
}
}
- bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::RGBA8;
+ bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::BGRA8;
uint16_t pitch = prim.m_rowpixels;
+ int width_div_factor = 1;
+ int width_mul_factor = 1;
const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, prim.m_flags & PRIMFLAG_TEXFORMAT_MASK,
- prim.m_rowpixels, tex_height, prim.m_prim->texture.palette, prim.m_prim->texture.base, &pitch);
+ prim.m_rowpixels, tex_height, prim.m_prim->texture.palette, prim.m_prim->texture.base, pitch, width_div_factor, width_mul_factor);
if (texture == nullptr)
{
- bgfx_texture *texture = new bgfx_texture(full_name, dst_format, tex_width, tex_height, mem, BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT, pitch, prim.m_rowpixels);
+ bgfx_texture *texture = new bgfx_texture(full_name, dst_format, tex_width, tex_height, mem, BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT, pitch, prim.m_rowpixels, width_div_factor, width_mul_factor);
m_textures.add_provider(full_name, texture);
if (prim.m_prim->texture.palette)
diff --git a/src/osd/modules/render/bgfx/inputpair.cpp b/src/osd/modules/render/bgfx/inputpair.cpp
index 9b430607cb8..4f185db86ab 100644
--- a/src/osd/modules/render/bgfx/inputpair.cpp
+++ b/src/osd/modules/render/bgfx/inputpair.cpp
@@ -42,6 +42,7 @@ bgfx_input_pair::bgfx_input_pair(int index, std::string sampler, std::string tex
bgfx_input_pair::~bgfx_input_pair()
{
+ m_slider_state.reset();
}
void bgfx_input_pair::bind(bgfx_effect *effect, const int32_t screen) const
@@ -58,14 +59,14 @@ void bgfx_input_pair::bind(bgfx_effect *effect, const int32_t screen) const
bgfx_uniform *tex_size = effect->uniform("u_tex_size" + std::to_string(m_index));
if (tex_size && provider)
{
- float values[2] = { float(provider->width()), float(provider->height()) };
+ float values[2] = { float(provider->rowpixels()), float(provider->height()) };
tex_size->set(values, sizeof(float) * 2);
}
bgfx_uniform *inv_tex_size = effect->uniform("u_inv_tex_size" + std::to_string(m_index));
if (inv_tex_size && provider)
{
- float values[2] = { 1.0f / float(provider->width()), 1.0f / float(provider->height()) };
+ float values[2] = { 1.0f / float(provider->rowpixels()), 1.0f / float(provider->height()) };
inv_tex_size->set(values, sizeof(float) * 2);
}
diff --git a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc
index 82236d954a3..6ecfbcb1a72 100644
--- a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc
+++ b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc
@@ -9,11 +9,29 @@ $input v_color0, v_texcoord0
SAMPLER2D(s_tex, 0);
SAMPLER2D(s_pal, 1);
+uniform vec4 u_tex_size0;
+uniform vec4 u_inv_tex_size0;
uniform vec4 u_inv_tex_size1;
void main()
{
- vec2 palette_uv = texture2D(s_tex, v_texcoord0).rg;
- palette_uv.xy = (palette_uv.xy * vec2(256.0, 256.0)) * u_inv_tex_size1.xy;
- gl_FragColor = vec4(texture2D(s_pal, palette_uv).rgb, 1.0) * v_color0;
+ vec2 original_uv = v_texcoord0.xy * u_tex_size0.xy * vec2(2.0, 1.0);
+ float mod_val = mod(original_uv.x, 4.0);
+ vec2 rounded_uv = vec2(original_uv.x - mod_val, original_uv.y) * vec2(0.5, 1.0);
+
+ float inv_width = u_inv_tex_size0.x * 0.5;
+
+ vec2 palette_uv = vec2(0.0, 0.0);
+ if (mod_val < 2.0)
+ {
+ palette_uv.x = texture2D(s_tex, rounded_uv * u_inv_tex_size0.xy + vec2(inv_width * 0.5, 0.0)).r;
+ palette_uv.y = texture2D(s_tex, rounded_uv * u_inv_tex_size0.xy + vec2(inv_width * 1.5, 0.0)).r;
+ }
+ else
+ {
+ palette_uv.x = texture2D(s_tex, rounded_uv * u_inv_tex_size0.xy + vec2(inv_width * 2.5, 0.0)).r;
+ palette_uv.y = texture2D(s_tex, rounded_uv * u_inv_tex_size0.xy + vec2(inv_width * 3.5, 0.0)).r;
+ }
+
+ gl_FragColor = vec4(texture2D(s_pal, palette_uv * vec2(256.0, 256.0) * u_inv_tex_size1.xy).rgb, 1.0) * v_color0;
}
diff --git a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc
index 21f3b8816fc..91e3c3ed462 100644
--- a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc
+++ b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc
@@ -8,8 +8,6 @@ $input v_color0, v_texcoord0
// Samplers
SAMPLER2D(s_tex, 0);
-#define round(X) floor((X)+0.5)
-
uniform vec4 u_tex_size0;
uniform vec4 u_inv_tex_size0;
@@ -23,17 +21,17 @@ vec3 ycc_to_rgb(float y, float cb, float cr)
void main()
{
- vec2 size_minus_one = u_tex_size0.xy - vec2(1.0, 1.0);
- vec2 original_uv = round(v_texcoord0.xy * size_minus_one);
+ vec2 half_texel = u_inv_tex_size0.xy * vec2(0.5, 0.5);
+
+ vec2 original_uv = v_texcoord0.xy * u_tex_size0.xy;
float mod_val = mod(original_uv.x, 2.0);
- vec2 rounded_uv = round(vec2(original_uv.x - mod_val, original_uv.y));
- vec2 next_uv = rounded_uv + vec2(1.0, 0.0);
- vec2 srcpix0 = texture2D(s_tex, rounded_uv / size_minus_one).rg;
- vec2 srcpix1 = texture2D(s_tex, next_uv / size_minus_one).rg;
- float cr = srcpix1.r;
- float cb = srcpix0.r;
+ vec2 rounded_uv = vec2(original_uv.x - mod_val, original_uv.y);
+ vec4 srcpix = texture2D(s_tex, rounded_uv * u_inv_tex_size0.xy + half_texel.x);
+
+ float cr = srcpix.r;
+ float cb = srcpix.b;
if (mod_val < 1.0)
- gl_FragColor = vec4(ycc_to_rgb(srcpix0.g, cb, cr), 1.0) * v_color0;
+ gl_FragColor = vec4(ycc_to_rgb(srcpix.g, cb, cr), 1.0) * v_color0;
else
- gl_FragColor = vec4(ycc_to_rgb(srcpix1.g, cb, cr), 1.0) * v_color0;
+ gl_FragColor = vec4(ycc_to_rgb(srcpix.a, cb, cr), 1.0) * v_color0;
}
diff --git a/src/osd/modules/render/bgfx/target.cpp b/src/osd/modules/render/bgfx/target.cpp
index cb912aba9ef..f900f4f99fb 100644
--- a/src/osd/modules/render/bgfx/target.cpp
+++ b/src/osd/modules/render/bgfx/target.cpp
@@ -30,16 +30,24 @@ bgfx_target::bgfx_target(std::string name, bgfx::TextureFormat::Enum format, uin
{
m_width *= m_scale;
m_height *= m_scale;
+
uint32_t wrap_mode = BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP;
uint32_t filter_mode = filter ? (BGFX_SAMPLER_MIN_ANISOTROPIC | BGFX_SAMPLER_MAG_ANISOTROPIC) : (BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT);
+ uint32_t depth_flags = wrap_mode | (BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT);
- m_textures = new bgfx::TextureHandle[m_page_count];
+ m_textures = new bgfx::TextureHandle[m_page_count * 2];
m_targets = new bgfx::FrameBufferHandle[m_page_count];
for (int page = 0; page < m_page_count; page++)
{
m_textures[page] = bgfx::createTexture2D(m_width, m_height, false, 1, format, wrap_mode | filter_mode | BGFX_TEXTURE_RT);
assert(m_textures[page].idx != 0xffff);
- m_targets[page] = bgfx::createFrameBuffer(1, &m_textures[page], false);
+
+ m_textures[m_page_count + page] = bgfx::createTexture2D(m_width, m_height, false, 1, bgfx::TextureFormat::D32F, depth_flags | BGFX_TEXTURE_RT);
+ assert(m_textures[m_page_count + page].idx != 0xffff);
+
+ bgfx::TextureHandle handles[2] = { m_textures[page], m_textures[m_page_count + page] };
+ m_targets[page] = bgfx::createFrameBuffer(2, handles, false);
+
assert(m_targets[page].idx != 0xffff);
}
@@ -64,7 +72,7 @@ bgfx_target::bgfx_target(void *handle, uint16_t width, uint16_t height)
, m_page_count(0)
{
m_targets = new bgfx::FrameBufferHandle[1];
- m_targets[0] = bgfx::createFrameBuffer(handle, width, height);
+ m_targets[0] = bgfx::createFrameBuffer(handle, width, height, bgfx::TextureFormat::Count, bgfx::TextureFormat::D32F);
// No backing texture
}
@@ -81,6 +89,7 @@ bgfx_target::~bgfx_target()
for (int page = 0; page < m_page_count; page++)
{
bgfx::destroy(m_targets[page]);
+ bgfx::destroy(m_textures[m_page_count + page]);
bgfx::destroy(m_textures[page]);
}
delete [] m_textures;
diff --git a/src/osd/modules/render/bgfx/target.h b/src/osd/modules/render/bgfx/target.h
index be6e5884d22..c00fc669337 100644
--- a/src/osd/modules/render/bgfx/target.h
+++ b/src/osd/modules/render/bgfx/target.h
@@ -44,11 +44,13 @@ public:
uint32_t screen_index() const { return m_screen; }
// bgfx_texture_handle_provider
+ virtual bgfx::TextureHandle texture() const override;
+ virtual bool is_target() const override { return true; }
virtual uint16_t width() const override { return m_width; }
virtual uint16_t height() const override { return m_height; }
virtual uint16_t rowpixels() const override { return m_width; }
- virtual bgfx::TextureHandle texture() const override;
- virtual bool is_target() const override { return true; }
+ virtual int width_div_factor() const override { return 1; }
+ virtual int width_mul_factor() const override { return 1; }
private:
std::string m_name;
diff --git a/src/osd/modules/render/bgfx/targetmanager.cpp b/src/osd/modules/render/bgfx/targetmanager.cpp
index adc2ca5acee..3cc90e1fa84 100644
--- a/src/osd/modules/render/bgfx/targetmanager.cpp
+++ b/src/osd/modules/render/bgfx/targetmanager.cpp
@@ -47,11 +47,14 @@ target_manager::~target_manager()
bgfx_target* target_manager::create_target(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, uint32_t style, bool double_buffer, bool filter, uint16_t scale, uint32_t screen)
{
- auto* target = new bgfx_target(name, format, width, height, style, double_buffer, filter, scale, screen);
std::string full_name = name + std::to_string(screen);
- m_targets[full_name] = target;
+ auto iter = m_targets.find(full_name);
+ if (iter != m_targets.end())
+ destroy_target(name, screen);
+ bgfx_target *target = new bgfx_target(name, format, width, height, style, double_buffer, filter, scale, screen);
+ m_targets[full_name] = target;
m_textures.add_provider(full_name, target);
return target;
@@ -60,10 +63,10 @@ bgfx_target* target_manager::create_target(std::string name, bgfx::TextureFormat
void target_manager::destroy_target(std::string name, uint32_t screen)
{
std::string full_name = (screen < 0) ? name : (name + std::to_string(screen));
- if (m_targets[full_name] != nullptr)
+ if (m_targets.find(full_name) != m_targets.end())
{
delete m_targets[full_name];
- m_targets[full_name] = nullptr;
+ m_targets.erase(full_name);
m_textures.remove_provider(full_name);
}
}
@@ -78,12 +81,11 @@ bgfx_target* target_manager::create_backbuffer(void *handle, uint16_t width, uin
bgfx_target* target_manager::target(uint32_t screen, std::string name)
{
std::string full_name = name + std::to_string(screen);
- bgfx_target* target = m_targets[full_name];
- if (target == nullptr)
+ if (m_targets.find(full_name) != m_targets.end())
{
osd_printf_verbose("Warning: Attempting to retrieve a nonexistent target '%s' for screen %d\n", name, screen);
}
- return target;
+ return m_targets[full_name];
}
bool target_manager::update_target_sizes(uint32_t screen, uint16_t width, uint16_t height, uint32_t style)
@@ -133,8 +135,8 @@ void target_manager::rebuild_targets(uint32_t screen, uint32_t style)
const uint16_t scale = target->scale();
const uint16_t width(sizes[screen].width());
const uint16_t height(sizes[screen].height());
- delete target;
+ destroy_target(name, screen);
create_target(name, format, width, height, style, double_buffered, filter, scale, screen);
}
}
@@ -165,7 +167,7 @@ void target_manager::create_target_if_nonexistent(uint32_t screen, std::string n
{
if (style == TARGET_STYLE_CUSTOM) return;
- if (m_targets[name + std::to_string(screen)] != nullptr)
+ if (m_targets.find(name + std::to_string(screen)) != m_targets.end())
{
return;
}
@@ -174,7 +176,7 @@ void target_manager::create_target_if_nonexistent(uint32_t screen, std::string n
uint16_t width(sizes[screen].width());
uint16_t height(sizes[screen].height());
- create_target(name, bgfx::TextureFormat::RGBA8, width, height, style, double_buffered, filter, 1, screen);
+ create_target(name, bgfx::TextureFormat::BGRA8, width, height, style, double_buffered, filter, 1, screen);
}
uint16_t target_manager::width(uint32_t style, uint32_t screen)
diff --git a/src/osd/modules/render/bgfx/targetreader.cpp b/src/osd/modules/render/bgfx/targetreader.cpp
index 71b82383a59..e201f3c5f6e 100644
--- a/src/osd/modules/render/bgfx/targetreader.cpp
+++ b/src/osd/modules/render/bgfx/targetreader.cpp
@@ -60,7 +60,7 @@ bgfx_target* target_reader::read_from_value(const Value& value, std::string pref
break;
}
- return chains.targets().create_target(target_name, bgfx::TextureFormat::RGBA8, width, height, mode, double_buffer, bilinear, scale, screen_index);
+ return chains.targets().create_target(target_name, bgfx::TextureFormat::BGRA8, width, height, mode, double_buffer, bilinear, scale, screen_index);
}
bool target_reader::validate_parameters(const Value& value, std::string prefix)
diff --git a/src/osd/modules/render/bgfx/texture.cpp b/src/osd/modules/render/bgfx/texture.cpp
index 85f1d3645fb..a504c625415 100644
--- a/src/osd/modules/render/bgfx/texture.cpp
+++ b/src/osd/modules/render/bgfx/texture.cpp
@@ -15,6 +15,9 @@ bgfx_texture::bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, u
, m_format(format)
, m_width(width)
, m_height(height)
+ , m_rowpixels(width)
+ , m_width_div_factor(1)
+ , m_width_mul_factor(1)
{
bgfx::TextureInfo info;
bgfx::calcTextureSize(info, width, height, 1, false, false, 1, format);
@@ -32,17 +35,20 @@ bgfx_texture::bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, u
}
}
-bgfx_texture::bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, const bgfx::Memory* data, uint32_t flags, uint16_t pitch, uint16_t rowpixels)
+bgfx_texture::bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, const bgfx::Memory* data, uint32_t flags, uint16_t pitch, uint16_t rowpixels, int width_div_factor, int width_mul_factor)
: m_name(name)
, m_format(format)
, m_width(width)
, m_height(height)
, m_rowpixels(rowpixels ? rowpixels : width)
+ , m_width_div_factor(width_div_factor)
+ , m_width_mul_factor(width_mul_factor)
{
+ int adjusted_width = (m_rowpixels * m_width_mul_factor) / m_width_div_factor;
bgfx::TextureInfo info;
- bgfx::calcTextureSize(info, m_rowpixels, height, 1, false, false, 1, format);
- m_texture = bgfx::createTexture2D(m_rowpixels, height, false, 1, format, flags, nullptr);
- bgfx::updateTexture2D(m_texture, 0, 0, 0, 0, m_rowpixels, height, data, pitch);
+ bgfx::calcTextureSize(info, adjusted_width, height, 1, false, false, 1, format);
+ m_texture = bgfx::createTexture2D(adjusted_width, height, false, 1, format, flags, nullptr);
+ bgfx::updateTexture2D(m_texture, 0, 0, 0, 0, adjusted_width, height, data, pitch);
}
bgfx_texture::~bgfx_texture()
@@ -52,5 +58,5 @@ bgfx_texture::~bgfx_texture()
void bgfx_texture::update(const bgfx::Memory *data, uint16_t pitch)
{
- bgfx::updateTexture2D(m_texture, 0, 0, 0, 0, m_width, m_height, data, pitch);
+ bgfx::updateTexture2D(m_texture, 0, 0, 0, 0, (m_rowpixels * m_width_mul_factor) / m_width_div_factor, m_height, data, pitch);
}
diff --git a/src/osd/modules/render/bgfx/texture.h b/src/osd/modules/render/bgfx/texture.h
index dc96e9acd77..75fedcd3129 100644
--- a/src/osd/modules/render/bgfx/texture.h
+++ b/src/osd/modules/render/bgfx/texture.h
@@ -21,7 +21,7 @@ class bgfx_texture : public bgfx_texture_handle_provider
{
public:
bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, uint32_t flags, void* data);
- bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, const bgfx::Memory* data, uint32_t flags = BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP, uint16_t pitch = UINT16_MAX, uint16_t rowpixels = 0);
+ bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, const bgfx::Memory* data, uint32_t flags = BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP, uint16_t pitch = UINT16_MAX, uint16_t rowpixels = 0, int width_div_factor = 1, int width_mul_factor = 1);
virtual ~bgfx_texture();
// Getters
@@ -29,11 +29,13 @@ public:
bgfx::TextureFormat::Enum format() const { return m_format; }
// bgfx_texture_handle_provider
+ virtual bgfx::TextureHandle texture() const override { return m_texture; }
+ virtual bool is_target() const override { return false; }
virtual uint16_t width() const override { return m_width; }
virtual uint16_t height() const override { return m_height; }
virtual uint16_t rowpixels() const override { return m_rowpixels; }
- virtual bgfx::TextureHandle texture() const override { return m_texture; }
- virtual bool is_target() const override { return false; }
+ virtual int width_div_factor() const override { return m_width_div_factor; }
+ virtual int width_mul_factor() const override { return m_width_mul_factor; }
void update(const bgfx::Memory *data, uint16_t pitch = UINT16_MAX);
@@ -43,6 +45,8 @@ protected:
uint16_t m_width;
uint16_t m_height;
uint16_t m_rowpixels;
+ int m_width_div_factor;
+ int m_width_mul_factor;
bgfx::TextureHandle m_texture;
};
diff --git a/src/osd/modules/render/bgfx/texturehandleprovider.h b/src/osd/modules/render/bgfx/texturehandleprovider.h
index b4b3f561d44..14fb2fe892c 100644
--- a/src/osd/modules/render/bgfx/texturehandleprovider.h
+++ b/src/osd/modules/render/bgfx/texturehandleprovider.h
@@ -25,6 +25,8 @@ public:
virtual uint16_t width() const = 0;
virtual uint16_t height() const = 0;
virtual uint16_t rowpixels() const = 0;
+ virtual int width_div_factor() const = 0;
+ virtual int width_mul_factor() const = 0;
};
#endif // __DRAWBGFX_TEXTURE_HANDLE_PROVIDER__
diff --git a/src/osd/modules/render/bgfx/texturemanager.cpp b/src/osd/modules/render/bgfx/texturemanager.cpp
index d0bcbcb476d..1fe6fe13b60 100644
--- a/src/osd/modules/render/bgfx/texturemanager.cpp
+++ b/src/osd/modules/render/bgfx/texturemanager.cpp
@@ -59,7 +59,7 @@ bgfx_texture* texture_manager::create_png_texture(std::string path, std::string
{
bitmap_argb32 bitmap;
emu_file file(path, OPEN_FLAG_READ);
- if (file.open(file_name) == osd_file::error::NONE)
+ if (!file.open(file_name))
{
render_load_png(bitmap, file);
file.close();
@@ -87,7 +87,7 @@ bgfx_texture* texture_manager::create_png_texture(std::string path, std::string
{
texture_name += std::to_string(screen);
}
- bgfx_texture* texture = create_texture(texture_name, bgfx::TextureFormat::RGBA8, width, height, data, flags);
+ bgfx_texture* texture = create_texture(texture_name, bgfx::TextureFormat::BGRA8, width, height, data, flags);
delete [] data;
@@ -122,8 +122,10 @@ bgfx::TextureHandle texture_manager::create_or_update_mame_texture(uint32_t form
{
bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::BGRA8;
uint16_t pitch = width;
- const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, &pitch);
- bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)width, (uint16_t)height, mem, pitch);
+ int width_div_factor = 1;
+ int width_mul_factor = 1;
+ const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, pitch, width_div_factor, width_mul_factor);
+ bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)((rowpixels * width_mul_factor) / width_div_factor), (uint16_t)height, mem, pitch);
return handle;
}
}
@@ -150,8 +152,10 @@ bgfx::TextureHandle texture_manager::create_or_update_mame_texture(uint32_t form
{
bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::BGRA8;
uint16_t pitch = width;
- const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, &pitch);
- bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)width, (uint16_t)height, mem, pitch);
+ int width_div_factor = 1;
+ int width_mul_factor = 1;
+ const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, pitch, width_div_factor, width_mul_factor);
+ bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)((rowpixels * width_mul_factor) / width_div_factor), (uint16_t)height, mem, pitch);
return handle;
}
}
@@ -161,9 +165,12 @@ bgfx::TextureHandle texture_manager::create_or_update_mame_texture(uint32_t form
bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::BGRA8;
uint16_t pitch = width;
- const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, &pitch);
- handle = bgfx::createTexture2D(width, height, false, 1, dst_format, flags, nullptr);
- bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)width, (uint16_t)height, mem, pitch);
+ int width_div_factor = 1;
+ int width_mul_factor = 1;
+ const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, pitch, width_div_factor, width_mul_factor);
+ const uint16_t adjusted_width = (uint16_t)((rowpixels * width_mul_factor) / width_div_factor);
+ handle = bgfx::createTexture2D(adjusted_width, height, false, 1, dst_format, flags, nullptr);
+ bgfx::updateTexture2D(handle, 0, 0, 0, 0, adjusted_width, (uint16_t)height, mem, pitch);
m_mame_textures[key] = { handle, seqid, width, height };
return handle;
@@ -201,6 +208,6 @@ void texture_manager::remove_provider(std::string name, bool delete_provider)
{
delete m_textures[name];
}
- m_textures[name] = nullptr;
+ m_textures.erase(name);
}
}
diff --git a/src/osd/modules/render/bgfxutil.cpp b/src/osd/modules/render/bgfxutil.cpp
index 9d2bef27901..4fa4b8fbd07 100644
--- a/src/osd/modules/render/bgfxutil.cpp
+++ b/src/osd/modules/render/bgfxutil.cpp
@@ -14,29 +14,47 @@
#include "render.h"
-const bgfx::Memory* bgfx_util::mame_texture_data_to_bgfx_texture_data(bgfx::TextureFormat::Enum &dst_format, uint32_t src_format, int rowpixels, int height, const rgb_t *palette, void *base, uint16_t *out_pitch)
+const bgfx::Memory* bgfx_util::mame_texture_data_to_bgfx_texture_data(bgfx::TextureFormat::Enum &dst_format, uint32_t src_format, int rowpixels, int height, const rgb_t *palette, void *base, uint16_t &out_pitch, int &width_div_factor, int &width_mul_factor)
{
bgfx::TextureInfo info;
+ const bgfx::Memory *data = nullptr;
+
switch (src_format)
{
- case PRIMFLAG_TEXFORMAT(TEXFORMAT_PALETTE16):
case PRIMFLAG_TEXFORMAT(TEXFORMAT_YUY16):
- dst_format = bgfx::TextureFormat::RG8;
- if (out_pitch)
- *out_pitch = rowpixels * 2;
+ dst_format = bgfx::TextureFormat::BGRA8;
+ width_div_factor = 2;
+ width_mul_factor = 1;
+ out_pitch = rowpixels * 2;
+ bgfx::calcTextureSize(info, rowpixels / width_div_factor, height, 1, false, false, 1, dst_format);
+
+ data = bgfx::copy(base, info.storageSize);
+ break;
+ case PRIMFLAG_TEXFORMAT(TEXFORMAT_PALETTE16):
+ dst_format = bgfx::TextureFormat::R8;
+ width_div_factor = 1;
+ width_mul_factor = 2;
+ out_pitch = rowpixels * 2;
+ bgfx::calcTextureSize(info, rowpixels * width_mul_factor, height, 1, false, false, 1, dst_format);
+
+ data = bgfx::copy(base, info.storageSize);
break;
case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32):
case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32):
dst_format = bgfx::TextureFormat::BGRA8;
- if (out_pitch)
- *out_pitch = rowpixels * 4;
+ width_div_factor = 1;
+ width_mul_factor = 1;
+ out_pitch = rowpixels * 4;
+ bgfx::calcTextureSize(info, rowpixels, height, 1, false, false, 1, dst_format);
+
+ data = bgfx::copy(base, info.storageSize);
break;
}
- bgfx::calcTextureSize(info, rowpixels, height, 1, false, false, 1, dst_format);
- return bgfx::copy(base, info.storageSize);
+
+ return data;
}
-const bgfx::Memory* bgfx_util::mame_texture_data_to_argb32(uint32_t src_format, int width, int height, int rowpixels, const rgb_t *palette, void *base)
+const bgfx::Memory* bgfx_util::mame_texture_data_to_bgra32(uint32_t src_format, int width, int height, int rowpixels, const rgb_t *palette, void *base)
{
const bgfx::Memory* mem = bgfx::alloc(rowpixels * height * 4);
auto* dst = reinterpret_cast<uint32_t*>(mem->data);
@@ -48,19 +66,19 @@ const bgfx::Memory* bgfx_util::mame_texture_data_to_argb32(uint32_t src_format,
switch (src_format)
{
case PRIMFLAG_TEXFORMAT(TEXFORMAT_PALETTE16):
- copy_util::copyline_palette16(dst, src16, width, palette);
+ copy_util::copyline_palette16_to_bgra(dst, src16, width, palette);
src16 += rowpixels;
break;
case PRIMFLAG_TEXFORMAT(TEXFORMAT_YUY16):
- copy_util::copyline_yuy16_to_argb(dst, src16, width, palette, 1);
+ copy_util::copyline_yuy16_to_bgra(dst, src16, width, palette, 1);
src16 += rowpixels;
break;
case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32):
- copy_util::copyline_argb32(dst, src32, width, palette);
+ copy_util::copyline_argb32_to_bgra(dst, src32, width, palette);
src32 += rowpixels;
break;
case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32):
- copy_util::copyline_rgb32(dst, src32, width, palette);
+ copy_util::copyline_rgb32_to_bgra(dst, src32, width, palette);
src32 += rowpixels;
break;
default:
diff --git a/src/osd/modules/render/bgfxutil.h b/src/osd/modules/render/bgfxutil.h
index 2f961f6551e..e1b683cd024 100644
--- a/src/osd/modules/render/bgfxutil.h
+++ b/src/osd/modules/render/bgfxutil.h
@@ -11,8 +11,8 @@
class bgfx_util
{
public:
- static const bgfx::Memory* mame_texture_data_to_bgfx_texture_data(bgfx::TextureFormat::Enum &dst_format, uint32_t format, int width, int height, const rgb_t *palette, void *base, uint16_t *out_pitch = nullptr);
- static const bgfx::Memory* mame_texture_data_to_argb32(uint32_t src_format, int width, int height, int rowpixels, const rgb_t *palette, void *base);
+ static const bgfx::Memory* mame_texture_data_to_bgfx_texture_data(bgfx::TextureFormat::Enum &dst_format, uint32_t format, int rowpixels, int height, const rgb_t *palette, void *base, uint16_t &out_pitch, int &width_div_factor, int &width_mul_factor);
+ static const bgfx::Memory* mame_texture_data_to_bgra32(uint32_t src_format, int width, int height, int rowpixels, const rgb_t *palette, void *base);
static uint64_t get_blend_state(uint32_t blend);
};
diff --git a/src/osd/modules/render/copyutil.h b/src/osd/modules/render/copyutil.h
index 715fcba0dca..295b5a10200 100644
--- a/src/osd/modules/render/copyutil.h
+++ b/src/osd/modules/render/copyutil.h
@@ -24,6 +24,15 @@ public:
}
}
+ static inline void copyline_palette16_to_bgra(uint32_t *dst, const uint16_t *src, int width, const rgb_t *palette)
+ {
+ for (int x = 0; x < width; x++)
+ {
+ rgb_t srcpixel = palette[*src++];
+ *dst++ = 0xff000000 | (srcpixel.r() << 16) | (srcpixel.g() << 8) | srcpixel.b();
+ }
+ }
+
static inline void copyline_rgb32(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette)
{
int x;
@@ -49,6 +58,32 @@ public:
}
}
+ static inline void copyline_rgb32_to_bgra(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette)
+ {
+ int x;
+
+ // palette (really RGB map) case
+ if (palette != nullptr)
+ {
+ for (x = 0; x < width; x++)
+ {
+ rgb_t srcpix = *src++;
+ uint32_t val = 0xff000000 | palette[0x200 + srcpix.b()] | palette[0x100 + srcpix.g()] | palette[srcpix.r()];
+ *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16);
+ }
+ }
+
+ // direct case
+ else
+ {
+ for (x = 0; x < width; x++)
+ {
+ rgb_t srcpix = *src++;
+ *dst++ = 0xff000000 | (srcpix.r() << 16) | (srcpix.g() << 8) | srcpix.b();
+ }
+ }
+ }
+
static inline void copyline_argb32(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette)
{
int x;
@@ -73,6 +108,31 @@ public:
}
}
+ static inline void copyline_argb32_to_bgra(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette)
+ {
+ int x;
+ // palette (really RGB map) case
+ if (palette != nullptr)
+ {
+ for (x = 0; x < width; x++)
+ {
+ rgb_t srcpix = *src++;
+ uint32_t val = (srcpix & 0xff000000) | palette[0x200 + srcpix.b()] | palette[0x100 + srcpix.g()] | palette[srcpix.r()];
+ *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16);
+ }
+ }
+
+ // direct case
+ else
+ {
+ for (x = 0; x < width; x++)
+ {
+ rgb_t srcpix = *src++;
+ *dst++ = (srcpix.a() << 24) | (srcpix.r() << 16) | (srcpix.g() << 8) | srcpix.b();
+ }
+ }
+ }
+
static inline uint32_t ycc_to_rgb(uint8_t y, uint8_t cb, uint8_t cr)
{
/* original equations:
@@ -116,14 +176,12 @@ public:
static inline void copyline_yuy16_to_argb(uint32_t *dst, const uint16_t *src, int width, const rgb_t *palette, int xprescale)
{
- int x;
-
assert(width % 2 == 0);
// palette (really RGB map) case
if (palette != nullptr)
{
- for (x = 0; x < width / 2; x++)
+ for (int x = 0; x < width / 2; x++)
{
uint16_t srcpix0 = *src++;
uint16_t srcpix1 = *src++;
@@ -139,7 +197,7 @@ public:
// direct case
else
{
- for (x = 0; x < width; x += 2)
+ for (int x = 0; x < width; x += 2)
{
uint16_t srcpix0 = *src++;
uint16_t srcpix1 = *src++;
@@ -152,6 +210,55 @@ public:
}
}
}
+
+ static inline void copyline_yuy16_to_bgra(uint32_t *dst, const uint16_t *src, int width, const rgb_t *palette, int xprescale)
+ {
+ assert(width % 2 == 0);
+
+ // palette (really RGB map) case
+ if (palette != nullptr)
+ {
+ for (int x = 0; x < width / 2; x++)
+ {
+ uint16_t srcpix0 = *src++;
+ uint16_t srcpix1 = *src++;
+ uint8_t cb = srcpix0 & 0xff;
+ uint8_t cr = srcpix1 & 0xff;
+ for (int x2 = 0; x2 < xprescale; x2++)
+ {
+ uint32_t val = ycc_to_rgb(palette[0x000 + (srcpix0 >> 8)], cb, cr);
+ *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16);
+ }
+ for (int x2 = 0; x2 < xprescale; x2++)
+ {
+ uint32_t val = ycc_to_rgb(palette[0x000 + (srcpix1 >> 8)], cb, cr);
+ *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16);
+ }
+ }
+ }
+
+ // direct case
+ else
+ {
+ for (int x = 0; x < width; x += 2)
+ {
+ uint16_t srcpix0 = *src++;
+ uint16_t srcpix1 = *src++;
+ uint8_t cb = srcpix0 & 0xff;
+ uint8_t cr = srcpix1 & 0xff;
+ for (int x2 = 0; x2 < xprescale; x2++)
+ {
+ uint32_t val = ycc_to_rgb(srcpix0 >> 8, cb, cr);
+ *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16);
+ }
+ for (int x2 = 0; x2 < xprescale; x2++)
+ {
+ uint32_t val = ycc_to_rgb(srcpix1 >> 8, cb, cr);
+ *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16);
+ }
+ }
+ }
+ }
};
#endif // __RENDER_COPYUTIL__
diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp
index 4b1087826b5..6aa69383233 100644
--- a/src/osd/modules/render/d3d/d3dhlsl.cpp
+++ b/src/osd/modules/render/d3d/d3dhlsl.cpp
@@ -353,8 +353,8 @@ void shaders::render_snapshot(IDirect3DSurface9 *surface)
}
emu_file file(machine->options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr = machine->video().open_next(file, "png");
- if (filerr != osd_file::error::NONE)
+ std::error_condition const filerr = machine->video().open_next(file, "png");
+ if (filerr)
return;
// add two text entries describing the image
@@ -722,7 +722,7 @@ int shaders::create_resources()
osd_printf_verbose("Direct3D: Error %08lX during device SetRenderTarget call\n", result);
emu_file file(machine->options().art_path(), OPEN_FLAG_READ);
- if (file.open(options->shadow_mask_texture) == osd_file::error::NONE)
+ if (!file.open(options->shadow_mask_texture))
{
render_load_png(shadow_bitmap, file);
file.close();
@@ -747,7 +747,7 @@ int shaders::create_resources()
d3d->get_texture_manager()->m_texture_list.push_back(std::move(tex));
}
- if (file.open(options->lut_texture) == osd_file::error::NONE)
+ if (!file.open(options->lut_texture))
{
render_load_png(lut_bitmap, file);
file.close();
@@ -770,7 +770,7 @@ int shaders::create_resources()
d3d->get_texture_manager()->m_texture_list.push_back(std::move(tex));
}
- if (file.open(options->ui_lut_texture) == osd_file::error::NONE)
+ if (!file.open(options->ui_lut_texture))
{
render_load_png(ui_lut_bitmap, file);
file.close();
@@ -1098,9 +1098,9 @@ rgb_t shaders::apply_color_convolution(rgb_t color)
b = chroma[2] * saturation + luma;
return rgb_t(
- std::max(0, std::min(255, int(r * 255.0f))),
- std::max(0, std::min(255, int(g * 255.0f))),
- std::max(0, std::min(255, int(b * 255.0f))));
+ std::clamp(int(r * 255.0f), 0, 255),
+ std::clamp(int(g * 255.0f), 0, 255),
+ std::clamp(int(b * 255.0f), 0, 255));
}
int shaders::color_convolution_pass(d3d_render_target *rt, int source_index, poly_info *poly, int vertnum)
diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp
index 7f0cd3d5936..1e34cb1ee7e 100644
--- a/src/osd/modules/render/drawbgfx.cpp
+++ b/src/osd/modules/render/drawbgfx.cpp
@@ -108,8 +108,7 @@ renderer_bgfx::renderer_bgfx(std::shared_ptr<osd_window> w)
renderer_bgfx::~renderer_bgfx()
{
bgfx::reset(0, 0, BGFX_RESET_NONE);
- //bgfx::touch(0);
- //bgfx::frame();
+
if (m_avi_writer != nullptr && m_avi_writer->recording())
{
m_avi_writer->stop();
@@ -125,6 +124,9 @@ renderer_bgfx::~renderer_bgfx()
}
// Cleanup.
+ if (m_ortho_view)
+ delete m_ortho_view;
+
delete m_chains;
delete m_effects;
delete m_shaders;
@@ -174,8 +176,6 @@ static void* sdlNativeWindowHandle(SDL_Window* _window)
return wmi.info.cocoa.window;
# elif BX_PLATFORM_WINDOWS
return wmi.info.win.window;
-# elif BX_PLATFORM_STEAMLINK
- return wmi.info.vivante.window;
# elif BX_PLATFORM_EMSCRIPTEN || BX_PLATFORM_ANDROID
return nullptr;
# endif // BX_PLATFORM_
@@ -200,9 +200,6 @@ inline bool sdlSetWindow(SDL_Window* _window)
# elif BX_PLATFORM_WINDOWS
pd.ndt = NULL;
pd.nwh = wmi.info.win.window;
-# elif BX_PLATFORM_STEAMLINK
- pd.ndt = wmi.info.vivante.display;
- pd.nwh = wmi.info.vivante.window;
# endif // BX_PLATFORM_
pd.context = NULL;
pd.backBuffer = NULL;
@@ -354,7 +351,7 @@ int renderer_bgfx::create()
m_sliders_dirty = true;
uint32_t flags = BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT;
- m_texture_cache = m_textures->create_texture("#cache", bgfx::TextureFormat::RGBA8, CACHE_SIZE, CACHE_SIZE, nullptr, flags);
+ m_texture_cache = m_textures->create_texture("#cache", bgfx::TextureFormat::BGRA8, CACHE_SIZE, CACHE_SIZE, nullptr, flags);
memset(m_white, 0xff, sizeof(uint32_t) * 16 * 16);
m_texinfo.push_back(rectangle_packer::packable_rectangle(WHITE_HASH, PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32), 16, 16, 16, nullptr, m_white));
@@ -396,8 +393,8 @@ void renderer_bgfx::record()
else
{
m_avi_writer->record(m_options.bgfx_avi_name());
- m_avi_target = m_targets->create_target("avibuffer", bgfx::TextureFormat::RGBA8, m_width[0], m_height[0], TARGET_STYLE_CUSTOM, false, true, 1, 0);
- m_avi_texture = bgfx::createTexture2D(m_width[0], m_height[0], false, 1, bgfx::TextureFormat::RGBA8, BGFX_TEXTURE_BLIT_DST | BGFX_TEXTURE_READ_BACK);
+ m_avi_target = m_targets->create_target("avibuffer", bgfx::TextureFormat::BGRA8, m_width[0], m_height[0], TARGET_STYLE_CUSTOM, false, true, 1, 0);
+ m_avi_texture = bgfx::createTexture2D(m_width[0], m_height[0], false, 1, bgfx::TextureFormat::BGRA8, BGFX_TEXTURE_BLIT_DST | BGFX_TEXTURE_READ_BACK);
if (m_avi_view == nullptr)
{
@@ -604,9 +601,9 @@ void renderer_bgfx::render_textured_quad(render_primitive* prim, bgfx::Transient
bgfx::TextureHandle texture = BGFX_INVALID_HANDLE;
if (is_screen)
{
- const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_argb32(prim->flags & PRIMFLAG_TEXFORMAT_MASK
+ const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgra32(prim->flags & PRIMFLAG_TEXFORMAT_MASK
, tex_width, tex_height, prim->texture.rowpixels, prim->texture.palette, prim->texture.base);
- texture = bgfx::createTexture2D(tex_width, tex_height, false, 1, bgfx::TextureFormat::RGBA8, texture_flags, mem);
+ texture = bgfx::createTexture2D(tex_width, tex_height, false, 1, bgfx::TextureFormat::BGRA8, texture_flags, mem);
}
else
{
@@ -1169,10 +1166,12 @@ void renderer_bgfx::process_atlas_packs(std::vector<std::vector<rectangle_packer
continue;
}
m_hash_to_entry[rect.hash()] = rect;
- bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::RGBA8;
+ bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::BGRA8;
uint16_t pitch = rect.width();
- const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, rect.format(), rect.rowpixels(), rect.height(), rect.palette(), rect.base(), &pitch);
- bgfx::updateTexture2D(m_texture_cache->texture(), 0, 0, rect.x(), rect.y(), rect.width(), rect.height(), mem, pitch);
+ int width_div_factor = 1;
+ int width_mul_factor = 1;
+ const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, rect.format(), rect.rowpixels(), rect.height(), rect.palette(), rect.base(), pitch, width_div_factor, width_mul_factor);
+ bgfx::updateTexture2D(m_texture_cache->texture(), 0, 0, rect.x(), rect.y(), (rect.width() * width_mul_factor) / width_div_factor, rect.height(), mem, pitch);
}
}
}
diff --git a/src/osd/modules/sound/coreaudio_sound.cpp b/src/osd/modules/sound/coreaudio_sound.cpp
index dd9c953ceb5..dcc74ec5fe9 100644
--- a/src/osd/modules/sound/coreaudio_sound.cpp
+++ b/src/osd/modules/sound/coreaudio_sound.cpp
@@ -83,7 +83,7 @@ private:
EFFECT_COUNT_MAX = 10
};
- uint32_t clamped_latency() const { return unsigned(std::max(std::min(m_audio_latency, int(LATENCY_MAX)), int(LATENCY_MIN))); }
+ uint32_t clamped_latency() const { return unsigned(std::clamp<int>(m_audio_latency, LATENCY_MIN, LATENCY_MAX)); }
uint32_t buffer_avail() const { return ((m_writepos >= m_playpos) ? m_buffer_size : 0) + m_playpos - m_writepos; }
uint32_t buffer_used() const { return ((m_playpos > m_writepos) ? m_buffer_size : 0) + m_writepos - m_playpos; }
@@ -320,7 +320,7 @@ void sound_coreaudio::update_audio_stream(bool is_throttled, int16_t const *buff
void sound_coreaudio::set_mastervolume(int attenuation)
{
- int const clamped_attenuation = std::max(std::min(attenuation, 0), -32);
+ int const clamped_attenuation = std::clamp(attenuation, -32, 0);
m_scale = (-32 == clamped_attenuation) ? 0 : (int32_t)(pow(10.0, clamped_attenuation / 20.0) * 128);
}
diff --git a/src/osd/modules/sound/direct_sound.cpp b/src/osd/modules/sound/direct_sound.cpp
index 45c3d8a0d44..fcdc13e07df 100644
--- a/src/osd/modules/sound/direct_sound.cpp
+++ b/src/osd/modules/sound/direct_sound.cpp
@@ -359,7 +359,7 @@ void sound_direct_sound::update_audio_stream(
void sound_direct_sound::set_mastervolume(int attenuation)
{
// clamp the attenuation to 0-32 range
- attenuation = std::max(std::min(attenuation, 0), -32);
+ attenuation = std::clamp(attenuation, -32, 0);
// set the master volume
if (m_stream_buffer)
diff --git a/src/osd/modules/sound/pa_sound.cpp b/src/osd/modules/sound/pa_sound.cpp
index 41645318672..ce191b6086a 100644
--- a/src/osd/modules/sound/pa_sound.cpp
+++ b/src/osd/modules/sound/pa_sound.cpp
@@ -24,7 +24,7 @@
#include <climits>
#include <algorithm>
-#ifdef WIN32
+#ifdef _WIN32
#include "pa_win_wasapi.h"
#endif
@@ -192,7 +192,7 @@ int sound_pa::init(osd_options const &options)
m_skip_threshold_ticks = 0;
m_osd_tps = osd_ticks_per_second();
m_buffer_min_ct = INT_MAX;
- m_audio_latency = std::min<int>(std::max<int>(m_audio_latency, LATENCY_MIN), LATENCY_MAX);
+ m_audio_latency = std::clamp<int>(m_audio_latency, LATENCY_MIN, LATENCY_MAX);
try {
m_ab = new audio_buffer<s16>(m_sample_rate, 2);
@@ -216,7 +216,7 @@ int sound_pa::init(osd_options const &options)
// 0 = use default
stream_params.suggestedLatency = options.pa_latency() ? options.pa_latency() : device_info->defaultLowOutputLatency;
-#ifdef WIN32
+#ifdef _WIN32
PaWasapiStreamInfo wasapi_stream_info;
// if requested latency is less than 20 ms, we need to use exclusive mode
diff --git a/src/osd/modules/sound/sdl_sound.cpp b/src/osd/modules/sound/sdl_sound.cpp
index 5ff8f2e6821..19689541858 100644
--- a/src/osd/modules/sound/sdl_sound.cpp
+++ b/src/osd/modules/sound/sdl_sound.cpp
@@ -284,7 +284,7 @@ void sound_sdl::update_audio_stream(bool is_throttled, const int16_t *buffer, in
void sound_sdl::set_mastervolume(int _attenuation)
{
// clamp the attenuation to 0-32 range
- attenuation = std::max(std::min(_attenuation, 0), -32);
+ attenuation = std::clamp(_attenuation, -32, 0);
if (stream_in_initialized)
{
@@ -373,7 +373,7 @@ int sound_sdl::init(const osd_options &options)
sdl_xfer_samples = obtained.samples;
// pin audio latency
- audio_latency = std::max(std::min(m_audio_latency, MAX_AUDIO_LATENCY), 1);
+ audio_latency = std::clamp(m_audio_latency, 1, MAX_AUDIO_LATENCY);
// compute the buffer sizes
stream_buffer_size = (sample_rate() * 2 * sizeof(int16_t) * (2 + audio_latency)) / 30;
diff --git a/src/osd/modules/sound/xaudio2_sound.cpp b/src/osd/modules/sound/xaudio2_sound.cpp
index 9c76e16c07b..40697ac9aaf 100644
--- a/src/osd/modules/sound/xaudio2_sound.cpp
+++ b/src/osd/modules/sound/xaudio2_sound.cpp
@@ -419,7 +419,7 @@ void sound_xaudio2::set_mastervolume(int attenuation)
HRESULT result;
// clamp the attenuation to 0-32 range
- attenuation = std::max(std::min(attenuation, 0), -32);
+ attenuation = std::clamp(attenuation, -32, 0);
// Ranges from 1.0 to XAUDIO2_MAX_VOLUME_LEVEL indicate additional gain
// Ranges from 0 to 1.0 indicate a reduced volume level
diff --git a/src/osd/osdcore.cpp b/src/osd/osdcore.cpp
index 51a9aaf207c..f5860416381 100644
--- a/src/osd/osdcore.cpp
+++ b/src/osd/osdcore.cpp
@@ -6,7 +6,7 @@
#include <chrono>
#if defined(SDLMAME_ANDROID)
-#include <SDL2/SDL.h>
+#include <android/log.h>
#endif
#ifdef _WIN32
@@ -66,7 +66,7 @@ void osd_output::pop(osd_output *delegate)
void osd_vprintf_error(util::format_argument_pack<std::ostream> const &args)
{
#if defined(SDLMAME_ANDROID)
- SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "%s", util::string_format(args).c_str());
+ __android_log_write(ANDROID_LOG_ERROR, "%s", util::string_format(args).c_str());
#else
if (m_ptr >= 0) m_stack[m_ptr]->output_callback(OSD_OUTPUT_CHANNEL_ERROR, args);
#endif
@@ -81,7 +81,7 @@ void osd_vprintf_error(util::format_argument_pack<std::ostream> const &args)
void osd_vprintf_warning(util::format_argument_pack<std::ostream> const &args)
{
#if defined(SDLMAME_ANDROID)
- SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "%s", util::string_format(args).c_str());
+ __android_log_write(ANDROID_LOG_WARN, "%s", util::string_format(args).c_str());
#else
if (m_ptr >= 0) m_stack[m_ptr]->output_callback(OSD_OUTPUT_CHANNEL_WARNING, args);
#endif
@@ -96,7 +96,7 @@ void osd_vprintf_warning(util::format_argument_pack<std::ostream> const &args)
void osd_vprintf_info(util::format_argument_pack<std::ostream> const &args)
{
#if defined(SDLMAME_ANDROID)
- SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "%s", util::string_format(args).c_str());
+ __android_log_write(ANDROID_LOG_INFO, "%s", util::string_format(args).c_str());
#else
if (m_ptr >= 0) m_stack[m_ptr]->output_callback(OSD_OUTPUT_CHANNEL_INFO, args);
#endif
@@ -111,7 +111,7 @@ void osd_vprintf_info(util::format_argument_pack<std::ostream> const &args)
void osd_vprintf_verbose(util::format_argument_pack<std::ostream> const &args)
{
#if defined(SDLMAME_ANDROID)
- SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_VERBOSE, "%s", util::string_format(args).c_str());
+ __android_log_write( ANDROID_LOG_VERBOSE, "%s", util::string_format(args).c_str());
#else
if (m_ptr >= 0) m_stack[m_ptr]->output_callback(OSD_OUTPUT_CHANNEL_VERBOSE, args);
#endif
@@ -126,7 +126,7 @@ void osd_vprintf_verbose(util::format_argument_pack<std::ostream> const &args)
void osd_vprintf_debug(util::format_argument_pack<std::ostream> const &args)
{
#if defined(SDLMAME_ANDROID)
- SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "%s", util::string_format(args).c_str());
+ __android_log_write(ANDROID_LOG_DEBUG, "%s", util::string_format(args).c_str());
#else
if (m_ptr >= 0) m_stack[m_ptr]->output_callback(OSD_OUTPUT_CHANNEL_DEBUG, args);
#endif
@@ -139,7 +139,7 @@ void osd_vprintf_debug(util::format_argument_pack<std::ostream> const &args)
osd_ticks_t osd_ticks()
{
-#ifdef WIN32
+#ifdef _WIN32
LARGE_INTEGER val;
QueryPerformanceCounter(&val);
return val.QuadPart;
@@ -155,7 +155,7 @@ osd_ticks_t osd_ticks()
osd_ticks_t osd_ticks_per_second()
{
-#ifdef WIN32
+#ifdef _WIN32
LARGE_INTEGER val;
QueryPerformanceFrequency(&val);
return val.QuadPart;
@@ -170,7 +170,7 @@ osd_ticks_t osd_ticks_per_second()
void osd_sleep(osd_ticks_t duration)
{
-#ifdef WIN32
+#ifdef _WIN32
// sleep_for appears to oversleep on Windows with gcc 8
Sleep(duration / (osd_ticks_per_second() / 1000));
#else
@@ -190,7 +190,7 @@ void osd_sleep(osd_ticks_t duration)
std::vector<std::string> osd_get_command_line(int argc, char *argv[])
{
std::vector<std::string> results;
-#ifdef WIN32
+#ifdef _WIN32
{
// Get the command line from Windows
int count;
@@ -206,7 +206,7 @@ std::vector<std::string> osd_get_command_line(int argc, char *argv[])
LocalFree(wide_args);
}
-#else // !WIN32
+#else // !_WIN32
{
// for non Windows platforms, we are assuming that arguments are
// already UTF-8; we just need to convert to std::vector<std::string>
@@ -214,6 +214,6 @@ std::vector<std::string> osd_get_command_line(int argc, char *argv[])
for (int i = 0; i < argc; i++)
results.emplace_back(argv[i]);
}
-#endif // WIN32
+#endif // _WIN32
return results;
}
diff --git a/src/osd/osdfile.h b/src/osd/osdfile.h
index ffd4346d7c0..bc3efbde805 100644
--- a/src/osd/osdfile.h
+++ b/src/osd/osdfile.h
@@ -16,6 +16,7 @@
#include <cstdint>
#include <memory>
#include <string>
+#include <system_error>
#include <vector>
@@ -61,47 +62,6 @@ constexpr uint32_t OPEN_FLAG_NO_PRELOAD = 0x0010;
class osd_file
{
public:
- /// \brief Result of a file operation
- ///
- /// Returned by most members of osd_file, and also used by other
- /// classes that access files or other file-like resources.
- enum class error
- {
- /// Operation completed successfully.
- NONE,
-
- /// Operation failed, but there is no more specific code to
- /// describe the failure.
- FAILURE,
-
- /// Operation failed due to an error allocating memory.
- OUT_OF_MEMORY,
-
- /// The requested file, path or resource was not found.
- NOT_FOUND,
-
- /// Current permissions do not allow the requested access.
- ACCESS_DENIED,
-
- /// Requested access is not permitted because the file or
- /// resource is currently open for exclusive access.
- ALREADY_OPEN,
-
- /// Request cannot be completed due to resource exhaustion
- /// (maximum number of open files or other objects has been
- /// reached).
- TOO_MANY_FILES,
-
- /// The request cannot be completed because invalid data was
- /// encountered (for example an inconsistent filesystem, or a
- /// corrupt archive file).
- INVALID_DATA,
-
- /// The requested access mode is invalid, or not appropriate for
- /// the file or resource.
- INVALID_ACCESS
- };
-
/// \brief Smart pointer to a file handle
typedef std::unique_ptr<osd_file> ptr;
@@ -129,7 +89,7 @@ public:
/// Will be zero for stream-like objects (e.g. TCP sockets or
/// named pipes).
/// \return Result of the operation.
- static error open(std::string const &path, std::uint32_t openflags, ptr &file, std::uint64_t &filesize);
+ static std::error_condition open(std::string const &path, std::uint32_t openflags, ptr &file, std::uint64_t &filesize) noexcept;
/// \brief Create a new pseudo-terminal (PTY) pair
///
@@ -140,7 +100,7 @@ public:
/// pseudo-terminal if the operation succeeds. Not valid if the
/// operation fails.
/// \return Result of the operation.
- static error openpty(ptr &file, std::string &name);
+ static std::error_condition openpty(ptr &file, std::string &name) noexcept;
/// \brief Close an open file
virtual ~osd_file() { }
@@ -161,7 +121,7 @@ public:
/// \param [out] actual Receives the number of bytes read if the
/// operation succeeds. Not valid if the operation fails.
/// \return Result of the operation.
- virtual error read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) = 0;
+ virtual std::error_condition read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) noexcept = 0;
/// \brief Write to an open file
///
@@ -176,26 +136,26 @@ public:
/// \param [out] actual Receives the number of bytes written if the
/// operation succeeds. Not valid if the operation fails.
/// \return Result of the operation.
- virtual error write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) = 0;
+ virtual std::error_condition write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) noexcept = 0;
/// \brief Change the size of an open file
///
/// \param [in] offset Desired size of the file.
/// \return Result of the operation.
- virtual error truncate(std::uint64_t offset) = 0;
+ virtual std::error_condition truncate(std::uint64_t offset) noexcept = 0;
/// \brief Flush file buffers
///
/// This flushes any data cached by the application, but does not
/// guarantee that all prior writes have reached persistent storage.
/// \return Result of the operation.
- virtual error flush() = 0;
+ virtual std::error_condition flush() noexcept = 0;
/// \brief Delete a file
///
/// \param [in] filename Path to the file to delete.
/// \return Result of the operation.
- static error remove(std::string const &filename);
+ static std::error_condition remove(std::string const &filename) noexcept;
};
@@ -217,21 +177,21 @@ public:
/// \return true if the filename points to a physical drive and if the
/// values pointed to by cylinders, heads, sectors, and bps are valid;
/// false in any other case
-bool osd_get_physical_drive_geometry(const char *filename, uint32_t *cylinders, uint32_t *heads, uint32_t *sectors, uint32_t *bps);
+bool osd_get_physical_drive_geometry(const char *filename, uint32_t *cylinders, uint32_t *heads, uint32_t *sectors, uint32_t *bps) noexcept;
/// \brief Is the given character legal for filenames?
///
/// \param [in] uchar The character to check.
/// \return Whether this character is legal in a filename.
-bool osd_is_valid_filename_char(char32_t uchar);
+bool osd_is_valid_filename_char(char32_t uchar) noexcept;
/// \brief Is the given character legal for paths?
///
/// \param [in] uchar The character to check.
/// \return Whether this character is legal in a file path.
-bool osd_is_valid_filepath_char(char32_t uchar);
+bool osd_is_valid_filepath_char(char32_t uchar) noexcept;
/***************************************************************************
@@ -301,14 +261,14 @@ std::unique_ptr<osd::directory::entry> osd_stat(std::string const &path);
///
/// \param [in] path The path in question.
/// \return true if the path is absolute, false otherwise.
-bool osd_is_absolute_path(const std::string &path);
+bool osd_is_absolute_path(const std::string &path) noexcept;
/// \brief Retrieves the full path.
/// \param [in] path The path in question.
/// \param [out] dst Reference to receive new path.
/// \return File error.
-osd_file::error osd_get_full_path(std::string &dst, std::string const &path);
+std::error_condition osd_get_full_path(std::string &dst, std::string const &path) noexcept;
/// \brief Retrieves the volume name.
diff --git a/src/osd/strconv.h b/src/osd/strconv.h
index f1eed54a49a..3843ee00f98 100644
--- a/src/osd/strconv.h
+++ b/src/osd/strconv.h
@@ -17,7 +17,7 @@
// FUNCTION PROTOTYPES
//============================================================
-#if defined(WIN32)
+#if defined(_WIN32)
#include <windows.h>
@@ -56,7 +56,7 @@ typedef std::string tstring;
}
}
-#endif // defined(WIN32)
+#endif // defined(_WIN32)
#endif // MAME_OSD_STRCONV_H
diff --git a/src/tools/castool.cpp b/src/tools/castool.cpp
index e03a15203d5..896c0bde5c2 100644
--- a/src/tools/castool.cpp
+++ b/src/tools/castool.cpp
@@ -53,6 +53,7 @@
#include "formats/zx81_p.h"
#include "corestr.h"
+#include "ioprocs.h"
#include <cassert>
#include <cctype>
@@ -162,7 +163,6 @@ int CLIB_DECL main(int argc, char *argv[])
int found =0;
const cassette_image::Format * const *selected_formats = nullptr;
cassette_image::ptr cassette;
- FILE *f;
if (argc > 1)
{
@@ -188,21 +188,26 @@ int CLIB_DECL main(int argc, char *argv[])
return -1;
}
- f = fopen(argv[3], "rb");
+ FILE *f = fopen(argv[3], "rb");
if (!f) {
fprintf(stderr, "File %s not found.\n",argv[3]);
return -1;
}
- if (cassette_image::open_choices(f, &stdio_ioprocs, get_extension(argv[3]), selected_formats, cassette_image::FLAG_READONLY, cassette) != cassette_image::error::SUCCESS) {
+ auto io = util::stdio_read_write(f, 0x00);
+ f = nullptr;
+ if (!io) {
+ fprintf(stderr, "Out of memory.\n");
+ return -1;
+ }
+
+ if (cassette_image::open_choices(std::move(io), get_extension(argv[3]), selected_formats, cassette_image::FLAG_READONLY, cassette) != cassette_image::error::SUCCESS) {
fprintf(stderr, "Invalid format of input file.\n");
- fclose(f);
return -1;
}
cassette->dump(argv[4]);
cassette.reset();
- fclose(f);
goto theend;
}
}
diff --git a/src/tools/chdman.cpp b/src/tools/chdman.cpp
index 835a87c18c3..d1cb963a8f8 100644
--- a/src/tools/chdman.cpp
+++ b/src/tools/chdman.cpp
@@ -39,7 +39,7 @@ using util::string_format;
// CONSTANTS & DEFINES
//**************************************************************************
// MINGW has adopted the MSVC formatting for 64-bit ints as of GCC 4.4 and deprecated it as of GCC 9.3
-#if defined(WIN32) && defined(__GNUC__) && ((__GNUC__ < 9) || ((__GNUC__ == 9) && (__GNUC_MINOR__ < 3)))
+#if defined(_WIN32) && defined(__GNUC__) && ((__GNUC__ < 9) || ((__GNUC__ == 9) && (__GNUC_MINOR__ < 3)))
#define I64FMT "I64"
#elif !defined(__APPLE__) && defined(__LP64__)
#define I64FMT "l"
@@ -294,8 +294,8 @@ public:
return 0;
if (offset + length > m_maxoffset)
length = m_maxoffset - offset;
- chd_error err = m_file.read_bytes(offset, dest, length);
- if (err != CHDERR_NONE)
+ std::error_condition err = m_file.read_bytes(offset, dest, length);
+ if (err)
throw err;
// if we have TOC - detect audio sectors and swap data
@@ -385,9 +385,9 @@ public:
{
m_file.reset();
m_lastfile = m_info.track[tracknum].fname;
- osd_file::error filerr = util::core_file::open(m_lastfile, OPEN_FLAG_READ, m_file);
- if (filerr != osd_file::error::NONE)
- report_error(1, "Error opening input file (%s)'", m_lastfile.c_str());
+ std::error_condition const filerr = util::core_file::open(m_lastfile, OPEN_FLAG_READ, m_file);
+ if (filerr)
+ report_error(1, "Error opening input file (%s): %s", m_lastfile, filerr.message());
}
// iterate over frames
@@ -411,9 +411,9 @@ public:
{
m_file.reset();
m_lastfile = m_info.track[tracknum+1].fname;
- osd_file::error filerr = util::core_file::open(m_lastfile, OPEN_FLAG_READ, m_file);
- if (filerr != osd_file::error::NONE)
- report_error(1, "Error opening input file (%s)'", m_lastfile.c_str());
+ std::error_condition const filerr = util::core_file::open(m_lastfile, OPEN_FLAG_READ, m_file);
+ if (filerr)
+ report_error(1, "Error opening input file (%s): %s", m_lastfile, filerr.message());
}
if (src_frame_start < src_track_end)
@@ -430,7 +430,7 @@ public:
: src_frame_start, SEEK_SET);
uint32_t count = m_file->read(dest, bytesperframe);
if (count != bytesperframe)
- report_error(1, "Error reading input file (%s)'", m_lastfile.c_str());
+ report_error(1, "Error reading input file (%s)'", m_lastfile);
}
// swap if appropriate
@@ -1035,18 +1035,18 @@ static void parse_input_chd_parameters(const parameters_map &params, chd_file &i
auto input_chd_parent_str = params.find(OPTION_INPUT_PARENT);
if (input_chd_parent_str != params.end())
{
- chd_error err = input_parent_chd.open(input_chd_parent_str->second->c_str());
- if (err != CHDERR_NONE)
- report_error(1, "Error opening parent CHD file (%s): %s", input_chd_parent_str->second->c_str(), chd_file::error_string(err));
+ std::error_condition err = input_parent_chd.open(*input_chd_parent_str->second);
+ if (err)
+ report_error(1, "Error opening parent CHD file (%s): %s", *input_chd_parent_str->second, err.message());
}
// process input file
auto input_chd_str = params.find(OPTION_INPUT);
if (input_chd_str != params.end())
{
- chd_error err = input_chd.open(input_chd_str->second->c_str(), writeable, input_parent_chd.opened() ? &input_parent_chd : nullptr);
- if (err != CHDERR_NONE)
- report_error(1, "Error opening CHD file (%s): %s", input_chd_str->second->c_str(), chd_file::error_string(err));
+ std::error_condition err = input_chd.open(*input_chd_str->second, writeable, input_parent_chd.opened() ? &input_parent_chd : nullptr);
+ if (err)
+ report_error(1, "Error opening CHD file (%s): %s", *input_chd_str->second, err.message());
}
}
@@ -1102,8 +1102,8 @@ static void check_existing_output_file(const parameters_map &params, const char
if (params.find(OPTION_OUTPUT_FORCE) == params.end())
{
util::core_file::ptr file;
- osd_file::error filerr = util::core_file::open(filename, OPEN_FLAG_READ, file);
- if (filerr == osd_file::error::NONE)
+ std::error_condition const filerr = util::core_file::open(filename, OPEN_FLAG_READ, file);
+ if (!filerr)
{
file.reset();
report_error(1, "Error: file already exists (%s)\nUse --force (or -f) to force overwriting", filename);
@@ -1123,9 +1123,9 @@ static std::string *parse_output_chd_parameters(const parameters_map &params, ch
auto output_chd_parent_str = params.find(OPTION_OUTPUT_PARENT);
if (output_chd_parent_str != params.end())
{
- chd_error err = output_parent_chd.open(output_chd_parent_str->second->c_str());
- if (err != CHDERR_NONE)
- report_error(1, "Error opening parent CHD file (%s): %s", output_chd_parent_str->second->c_str(), chd_file::error_string(err));
+ std::error_condition err = output_parent_chd.open(*output_chd_parent_str->second);
+ if (err)
+ report_error(1, "Error opening parent CHD file (%s): %s", *output_chd_parent_str->second, err.message());
}
// process output file
@@ -1180,10 +1180,10 @@ static void parse_compression(const parameters_map &params, chd_codec_type compr
{
std::string name(*compression_str->second, start, (end == -1) ? -1 : end - start);
if (name.length() != 4)
- report_error(1, "Invalid compressor '%s' specified", name.c_str());
+ report_error(1, "Invalid compressor '%s' specified", name);
chd_codec_type type = CHD_MAKE_TAG(name[0], name[1], name[2], name[3]);
if (!chd_codec_list::codec_exists(type))
- report_error(1, "Invalid compressor '%s' specified", name.c_str());
+ report_error(1, "Invalid compressor '%s' specified", name);
compression[index++] = type;
if (end == -1)
break;
@@ -1257,16 +1257,16 @@ static void compress_common(chd_file_compressor &chd)
// loop until done
double complete, ratio;
- chd_error err;
- while ((err = chd.compress_continue(complete, ratio)) == CHDERR_WALKING_PARENT || err == CHDERR_COMPRESSING)
- if (err == CHDERR_WALKING_PARENT)
+ std::error_condition err;
+ while ((err = chd.compress_continue(complete, ratio)) == chd_file::error::WALKING_PARENT || err == chd_file::error::COMPRESSING)
+ if (err == chd_file::error::WALKING_PARENT)
progress(false, "Examining parent, %.1f%% complete... \r", 100.0 * complete);
else
progress(false, "Compressing, %.1f%% complete... (ratio=%.1f%%) \r", 100.0 * complete, 100.0 * ratio);
// handle errors
- if (err != CHDERR_NONE)
- report_error(1, "Error during compression: %-40s", chd_file::error_string(err));
+ if (err)
+ report_error(1, "Error during compression: %-40s", err.message());
// final progress update
progress(true, "Compression complete ... final ratio = %.1f%% \n", 100.0 * ratio);
@@ -1447,15 +1447,17 @@ static void do_info(parameters_map &params)
// output cmpression and size information
chd_codec_type compression[4] = { input_chd.compression(0), input_chd.compression(1), input_chd.compression(2), input_chd.compression(3) };
+ uint64_t filesize = 0;
+ input_chd.file().length(filesize);
printf("Logical size: %s bytes\n", big_int_string(input_chd.logical_bytes()).c_str());
printf("Hunk Size: %s bytes\n", big_int_string(input_chd.hunk_bytes()).c_str());
printf("Total Hunks: %s\n", big_int_string(input_chd.hunk_count()).c_str());
printf("Unit Size: %s bytes\n", big_int_string(input_chd.unit_bytes()).c_str());
printf("Total Units: %s\n", big_int_string(input_chd.unit_count()).c_str());
printf("Compression: %s\n", compression_string(compression).c_str());
- printf("CHD size: %s bytes\n", big_int_string(static_cast<util::core_file &>(input_chd).size()).c_str());
+ printf("CHD size: %s bytes\n", big_int_string(filesize).c_str());
if (compression[0] != CHD_CODEC_NONE)
- printf("Ratio: %.1f%%\n", 100.0 * double(static_cast<util::core_file &>(input_chd).size()) / double(input_chd.logical_bytes()));
+ printf("Ratio: %.1f%%\n", 100.0 * double(filesize) / double(input_chd.logical_bytes()));
// add SHA1 output
util::sha1_t overall = input_chd.sha1();
@@ -1477,8 +1479,8 @@ static void do_info(parameters_map &params)
// get the indexed metadata item; stop when we hit an error
chd_metadata_tag metatag;
uint8_t metaflags;
- chd_error err = input_chd.read_metadata(CHDMETATAG_WILDCARD, index, buffer, metatag, metaflags);
- if (err != CHDERR_NONE)
+ std::error_condition err = input_chd.read_metadata(CHDMETATAG_WILDCARD, index, buffer, metatag, metaflags);
+ if (err)
break;
// determine our index
@@ -1523,9 +1525,9 @@ static void do_info(parameters_map &params)
// get info on this hunk
chd_codec_type codec;
uint32_t compbytes;
- chd_error err = input_chd.hunk_info(hunknum, codec, compbytes);
- if (err != CHDERR_NONE)
- report_error(1, "Error getting info on hunk %d: %s", hunknum, chd_file::error_string(err));
+ std::error_condition err = input_chd.hunk_info(hunknum, codec, compbytes);
+ if (err)
+ report_error(1, "Error getting info on hunk %d: %s", hunknum, err.message());
// decode into our data
if (codec > CHD_CODEC_MINI)
@@ -1603,9 +1605,9 @@ static void do_verify(parameters_map &params)
// determine how much to read
uint32_t bytes_to_read = (std::min<uint64_t>)(buffer.size(), input_chd.logical_bytes() - offset);
- chd_error err = input_chd.read_bytes(offset, &buffer[0], bytes_to_read);
- if (err != CHDERR_NONE)
- report_error(1, "Error reading CHD file (%s): %s", params.find(OPTION_INPUT)->second->c_str(), chd_file::error_string(err));
+ std::error_condition err = input_chd.read_bytes(offset, &buffer[0], bytes_to_read);
+ if (err)
+ report_error(1, "Error reading CHD file (%s): %s", *params.find(OPTION_INPUT)->second, err.message());
// add to the checksum
rawsha1.append(&buffer[0], bytes_to_read);
@@ -1665,9 +1667,9 @@ static void do_create_raw(parameters_map &params)
auto input_file_str = params.find(OPTION_INPUT);
if (input_file_str != params.end())
{
- osd_file::error filerr = util::core_file::open(*input_file_str->second, OPEN_FLAG_READ, input_file);
- if (filerr != osd_file::error::NONE)
- report_error(1, "Unable to open file (%s)", input_file_str->second->c_str());
+ std::error_condition const filerr = util::core_file::open(*input_file_str->second, OPEN_FLAG_READ, input_file);
+ if (filerr)
+ report_error(1, "Unable to open file (%s): %s", *input_file_str->second, filerr.message());
}
// process output CHD
@@ -1720,13 +1722,13 @@ static void do_create_raw(parameters_map &params)
{
// create the new CHD
std::unique_ptr<chd_file_compressor> chd(new chd_rawfile_compressor(*input_file, input_start, input_end));
- chd_error err;
+ std::error_condition err;
if (output_parent.opened())
err = chd->create(output_chd_str->c_str(), input_end - input_start, hunk_size, compression, output_parent);
else
err = chd->create(output_chd_str->c_str(), input_end - input_start, hunk_size, unit_size, compression);
- if (err != CHDERR_NONE)
- report_error(1, "Error creating CHD file (%s): %s", output_chd_str->c_str(), chd_file::error_string(err));
+ if (err)
+ report_error(1, "Error creating CHD file (%s): %s", output_chd_str, err.message());
// if we have a parent, copy forward all the metadata
if (output_parent.opened())
@@ -1758,9 +1760,9 @@ static void do_create_hd(parameters_map &params)
auto input_file_str = params.find(OPTION_INPUT);
if (input_file_str != params.end())
{
- osd_file::error filerr = util::core_file::open(*input_file_str->second, OPEN_FLAG_READ, input_file);
- if (filerr != osd_file::error::NONE)
- report_error(1, "Unable to open file (%s)", input_file_str->second->c_str());
+ std::error_condition const filerr = util::core_file::open(*input_file_str->second, OPEN_FLAG_READ, input_file);
+ if (filerr)
+ report_error(1, "Unable to open file (%s): %s", *input_file_str->second, filerr.message());
}
// process output CHD
@@ -1833,13 +1835,13 @@ static void do_create_hd(parameters_map &params)
if (ident_str != params.end())
{
// load the file
- osd_file::error filerr = util::core_file::load(ident_str->second->c_str(), identdata);
- if (filerr != osd_file::error::NONE)
- report_error(1, "Error reading ident file (%s)", ident_str->second->c_str());
+ std::error_condition const filerr = util::core_file::load(*ident_str->second, identdata);
+ if (filerr)
+ report_error(1, "Error reading ident file (%s): %s", *ident_str->second, filerr.message());
// must be at least 14 bytes; extract CHS data from there
if (identdata.size() < 14)
- report_error(1, "Ident file '%s' is invalid (too short)", ident_str->second->c_str());
+ report_error(1, "Ident file '%s' is invalid (too short)", *ident_str->second);
cylinders = (identdata[3] << 8) | identdata[2];
heads = (identdata[7] << 8) | identdata[6];
sectors = (identdata[13] << 8) | identdata[12];
@@ -1870,7 +1872,7 @@ static void do_create_hd(parameters_map &params)
if (output_parent.opened() && cylinders == 0)
{
std::string metadata;
- if (output_parent.read_metadata(HARD_DISK_METADATA_TAG, 0, metadata) != CHDERR_NONE)
+ if (output_parent.read_metadata(HARD_DISK_METADATA_TAG, 0, metadata))
report_error(1, "Unable to find hard disk metadata in parent CHD");
if (sscanf(metadata.c_str(), HARD_DISK_METADATA_FORMAT, &cylinders, &heads, &sectors, &sector_size) != 4)
report_error(1, "Error parsing hard disk metadata in parent CHD");
@@ -1917,26 +1919,26 @@ static void do_create_hd(parameters_map &params)
std::unique_ptr<chd_file_compressor> chd;
if (input_file) chd.reset(new chd_rawfile_compressor(*input_file, input_start, input_end));
else chd.reset(new chd_zero_compressor(input_start, input_end));
- chd_error err;
+ std::error_condition err;
if (output_parent.opened())
err = chd->create(output_chd_str->c_str(), uint64_t(totalsectors) * uint64_t(sector_size), hunk_size, compression, output_parent);
else
err = chd->create(output_chd_str->c_str(), uint64_t(totalsectors) * uint64_t(sector_size), hunk_size, sector_size, compression);
- if (err != CHDERR_NONE)
- report_error(1, "Error creating CHD file (%s): %s", output_chd_str->c_str(), chd_file::error_string(err));
+ if (err)
+ report_error(1, "Error creating CHD file (%s): %s", output_chd_str, err.message());
// add the standard hard disk metadata
std::string metadata = string_format(HARD_DISK_METADATA_FORMAT, cylinders, heads, sectors, sector_size);
err = chd->write_metadata(HARD_DISK_METADATA_TAG, 0, metadata);
- if (err != CHDERR_NONE)
- report_error(1, "Error adding hard disk metadata: %s", chd_file::error_string(err));
+ if (err)
+ report_error(1, "Error adding hard disk metadata: %s", err.message());
// write the ident if present
if (!identdata.empty())
{
err = chd->write_metadata(HARD_DISK_IDENT_METADATA_TAG, 0, identdata);
- if (err != CHDERR_NONE)
- report_error(1, "Error adding hard disk metadata: %s", chd_file::error_string(err));
+ if (err)
+ report_error(1, "Error adding hard disk metadata: %s", err.message());
}
// compress it generically
@@ -1967,9 +1969,9 @@ static void do_create_cd(parameters_map &params)
auto input_file_str = params.find(OPTION_INPUT);
if (input_file_str != params.end())
{
- chd_error err = chdcd_parse_toc(input_file_str->second->c_str(), toc, track_info);
- if (err != CHDERR_NONE)
- report_error(1, "Error parsing input file (%s: %s)\n", input_file_str->second->c_str(), chd_file::error_string(err));
+ std::error_condition err = chdcd_parse_toc(input_file_str->second->c_str(), toc, track_info);
+ if (err)
+ report_error(1, "Error parsing input file (%s: %s)\n", *input_file_str->second, err.message());
}
// process output CHD
@@ -2016,18 +2018,18 @@ static void do_create_cd(parameters_map &params)
{
// create the new CD
chd = new chd_cd_compressor(toc, track_info);
- chd_error err;
+ std::error_condition err;
if (output_parent.opened())
err = chd->create(output_chd_str->c_str(), uint64_t(totalsectors) * uint64_t(CD_FRAME_SIZE), hunk_size, compression, output_parent);
else
err = chd->create(output_chd_str->c_str(), uint64_t(totalsectors) * uint64_t(CD_FRAME_SIZE), hunk_size, CD_FRAME_SIZE, compression);
- if (err != CHDERR_NONE)
- report_error(1, "Error creating CHD file (%s): %s", output_chd_str->c_str(), chd_file::error_string(err));
+ if (err)
+ report_error(1, "Error creating CHD file (%s): %s", *output_chd_str, err.message());
// add the standard CD metadata; we do this even if we have a parent because it might be different
err = cdrom_write_metadata(chd, &toc);
- if (err != CHDERR_NONE)
- report_error(1, "Error adding CD metadata: %s", chd_file::error_string(err));
+ if (err)
+ report_error(1, "Error adding CD metadata: %s", err.message());
// compress it generically
compress_common(*chd);
@@ -2059,7 +2061,7 @@ static void do_create_ld(parameters_map &params)
{
avi_file::error avierr = avi_file::open(*input_file_str->second, input_file);
if (avierr != avi_file::error::NONE)
- report_error(1, "Error opening AVI file (%s): %s\n", input_file_str->second->c_str(), avi_file::error_string(avierr));
+ report_error(1, "Error opening AVI file (%s): %s\n", *input_file_str->second, avi_file::error_string(avierr));
}
const avi_file::movie_info &aviinfo = input_file->get_movie_info();
@@ -2133,19 +2135,19 @@ static void do_create_ld(parameters_map &params)
{
// create the new CHD
chd = new chd_avi_compressor(*input_file, info, input_start, input_end);
- chd_error err;
+ std::error_condition err;
if (output_parent.opened())
err = chd->create(output_chd_str->c_str(), uint64_t(input_end - input_start) * hunk_size, hunk_size, compression, output_parent);
else
err = chd->create(output_chd_str->c_str(), uint64_t(input_end - input_start) * hunk_size, hunk_size, info.bytes_per_frame, compression);
- if (err != CHDERR_NONE)
- report_error(1, "Error creating CHD file (%s): %s", output_chd_str->c_str(), chd_file::error_string(err));
+ if (err)
+ report_error(1, "Error creating CHD file (%s): %s", *output_chd_str, err.message());
// write the core A/V metadata
std::string metadata = string_format(AV_METADATA_FORMAT, info.fps_times_1million / 1000000, info.fps_times_1million % 1000000, info.width, info.height, info.interlaced, info.channels, info.rate);
err = chd->write_metadata(AV_METADATA_TAG, 0, metadata);
- if (err != CHDERR_NONE)
- report_error(1, "Error adding AV metadata: %s\n", chd_file::error_string(err));
+ if (err)
+ report_error(1, "Error adding AV metadata: %s\n", err.message());
// create the compressor and then run it generically
compress_common(*chd);
@@ -2154,8 +2156,8 @@ static void do_create_ld(parameters_map &params)
if (info.height == 524/2 || info.height == 624/2)
{
err = chd->write_metadata(AV_LD_METADATA_TAG, 0, chd->ldframedata(), 0);
- if (err != CHDERR_NONE)
- report_error(1, "Error adding AVLD metadata: %s\n", chd_file::error_string(err));
+ if (err)
+ report_error(1, "Error adding AVLD metadata: %s\n", err.message());
}
delete chd;
}
@@ -2202,15 +2204,15 @@ static void do_copy(parameters_map &params)
chd_codec_type compression[4];
{
std::vector<uint8_t> metadata;
- if (input_chd.read_metadata(HARD_DISK_METADATA_TAG, 0, metadata) == CHDERR_NONE)
+ if (!input_chd.read_metadata(HARD_DISK_METADATA_TAG, 0, metadata))
memcpy(compression, s_default_hd_compression, sizeof(compression));
- else if (input_chd.read_metadata(AV_METADATA_TAG, 0, metadata) == CHDERR_NONE)
+ else if (!input_chd.read_metadata(AV_METADATA_TAG, 0, metadata))
memcpy(compression, s_default_ld_compression, sizeof(compression));
- else if (input_chd.read_metadata(CDROM_OLD_METADATA_TAG, 0, metadata) == CHDERR_NONE ||
- input_chd.read_metadata(CDROM_TRACK_METADATA_TAG, 0, metadata) == CHDERR_NONE ||
- input_chd.read_metadata(CDROM_TRACK_METADATA2_TAG, 0, metadata) == CHDERR_NONE ||
- input_chd.read_metadata(GDROM_OLD_METADATA_TAG, 0, metadata) == CHDERR_NONE ||
- input_chd.read_metadata(GDROM_TRACK_METADATA_TAG, 0, metadata) == CHDERR_NONE)
+ else if (!input_chd.read_metadata(CDROM_OLD_METADATA_TAG, 0, metadata) ||
+ !input_chd.read_metadata(CDROM_TRACK_METADATA_TAG, 0, metadata) ||
+ !input_chd.read_metadata(CDROM_TRACK_METADATA2_TAG, 0, metadata) ||
+ !input_chd.read_metadata(GDROM_OLD_METADATA_TAG, 0, metadata) ||
+ !input_chd.read_metadata(GDROM_TRACK_METADATA_TAG, 0, metadata))
memcpy(compression, s_default_cd_compression, sizeof(compression));
else
memcpy(compression, s_default_raw_compression, sizeof(compression));
@@ -2240,13 +2242,13 @@ static void do_copy(parameters_map &params)
{
// create the new CHD
chd = new chd_chdfile_compressor(input_chd, input_start, input_end);
- chd_error err;
+ std::error_condition err;
if (output_parent.opened())
err = chd->create(output_chd_str->c_str(), input_end - input_start, hunk_size, compression, output_parent);
else
err = chd->create(output_chd_str->c_str(), input_end - input_start, hunk_size, input_chd.unit_bytes(), compression);
- if (err != CHDERR_NONE)
- report_error(1, "Error creating CHD file (%s): %s", output_chd_str->c_str(), chd_file::error_string(err));
+ if (err)
+ report_error(1, "Error creating CHD file (%s): %s", *output_chd_str, err.message());
// clone all the metadata, upgrading where appropriate
std::vector<uint8_t> metadata;
@@ -2255,7 +2257,7 @@ static void do_copy(parameters_map &params)
uint32_t index = 0;
bool redo_cd = false;
bool cdda_swap = false;
- for (err = input_chd.read_metadata(CHDMETATAG_WILDCARD, index++, metadata, metatag, metaflags); err == CHDERR_NONE; err = input_chd.read_metadata(CHDMETATAG_WILDCARD, index++, metadata, metatag, metaflags))
+ for (err = input_chd.read_metadata(CHDMETATAG_WILDCARD, index++, metadata, metatag, metaflags); !err; err = input_chd.read_metadata(CHDMETATAG_WILDCARD, index++, metadata, metatag, metaflags))
{
// if this is an old CD-CHD tag, note that we want to re-do it
if (metatag == CDROM_OLD_METADATA_TAG || metatag == CDROM_TRACK_METADATA_TAG)
@@ -2272,8 +2274,8 @@ static void do_copy(parameters_map &params)
// otherwise, clone it
err = chd->write_metadata(metatag, CHDMETAINDEX_APPEND, metadata, metaflags);
- if (err != CHDERR_NONE)
- report_error(1, "Error writing cloned metadata: %s", chd_file::error_string(err));
+ if (err)
+ report_error(1, "Error writing cloned metadata: %s", err.message());
}
// if we need to re-do the CD metadata, do it now
@@ -2284,8 +2286,8 @@ static void do_copy(parameters_map &params)
report_error(1, "Error upgrading CD metadata");
const cdrom_toc *toc = cdrom_get_toc(cdrom);
err = cdrom_write_metadata(chd, toc);
- if (err != CHDERR_NONE)
- report_error(1, "Error writing upgraded CD metadata: %s", chd_file::error_string(err));
+ if (err)
+ report_error(1, "Error writing upgraded CD metadata: %s", err.message());
if (cdda_swap)
chd->m_toc = toc;
}
@@ -2342,9 +2344,9 @@ static void do_extract_raw(parameters_map &params)
try
{
// process output file
- osd_file::error filerr = util::core_file::open(*output_file_str->second, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, output_file);
- if (filerr != osd_file::error::NONE)
- report_error(1, "Unable to open file (%s)", output_file_str->second->c_str());
+ std::error_condition const filerr = util::core_file::open(*output_file_str->second, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, output_file);
+ if (filerr)
+ report_error(1, "Unable to open file (%s): %s", *output_file_str->second, filerr.message());
// copy all data
std::vector<uint8_t> buffer((TEMP_BUFFER_SIZE / input_chd.hunk_bytes()) * input_chd.hunk_bytes());
@@ -2354,14 +2356,14 @@ static void do_extract_raw(parameters_map &params)
// determine how much to read
uint32_t bytes_to_read = (std::min<uint64_t>)(buffer.size(), input_end - offset);
- chd_error err = input_chd.read_bytes(offset, &buffer[0], bytes_to_read);
- if (err != CHDERR_NONE)
- report_error(1, "Error reading CHD file (%s): %s", params.find(OPTION_INPUT)->second->c_str(), chd_file::error_string(err));
+ std::error_condition err = input_chd.read_bytes(offset, &buffer[0], bytes_to_read);
+ if (err)
+ report_error(1, "Error reading CHD file (%s): %s", *params.find(OPTION_INPUT)->second, err.message());
// write to the output
uint32_t count = output_file->write(&buffer[0], bytes_to_read);
if (count != bytes_to_read)
- report_error(1, "Error writing to file; check disk space (%s)", output_file_str->second->c_str());
+ report_error(1, "Error writing to file; check disk space (%s)", *output_file_str->second);
// advance
offset += bytes_to_read;
@@ -2446,16 +2448,16 @@ static void do_extract_cd(parameters_map &params)
}
// process output file
- osd_file::error filerr = util::core_file::open(*output_file_str->second, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_NO_BOM, output_toc_file);
- if (filerr != osd_file::error::NONE)
- report_error(1, "Unable to open file (%s)", output_file_str->second->c_str());
+ std::error_condition filerr = util::core_file::open(*output_file_str->second, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_NO_BOM, output_toc_file);
+ if (filerr)
+ report_error(1, "Unable to open file (%s): %s", *output_file_str->second, filerr.message());
// process output BIN file
if (mode != MODE_GDI)
{
filerr = util::core_file::open(*output_bin_file_str, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, output_bin_file);
- if (filerr != osd_file::error::NONE)
- report_error(1, "Unable to open file (%s)", output_bin_file_str->c_str());
+ if (filerr)
+ report_error(1, "Unable to open file (%s): %s", *output_bin_file_str, filerr.message());
}
// determine total frames
@@ -2490,8 +2492,8 @@ static void do_extract_cd(parameters_map &params)
output_bin_file.reset();
filerr = util::core_file::open(trackbin_name, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, output_bin_file);
- if (filerr != osd_file::error::NONE)
- report_error(1, "Unable to open file (%s)", trackbin_name.c_str());
+ if (filerr)
+ report_error(1, "Unable to open file (%s): %s", trackbin_name, filerr.message());
outputoffs = 0;
}
@@ -2555,7 +2557,7 @@ static void do_extract_cd(parameters_map &params)
output_bin_file->seek(outputoffs, SEEK_SET);
uint32_t byteswritten = output_bin_file->write(&buffer[0], bufferoffs);
if (byteswritten != bufferoffs)
- report_error(1, "Error writing frame %d to file (%s): %s\n", frame, output_file_str->second->c_str(), chd_file::error_string(CHDERR_WRITE_ERROR));
+ report_error(1, "Error writing frame %d to file (%s): %s\n", frame, *output_file_str->second, "Write error");
outputoffs += bufferoffs;
bufferoffs = 0;
}
@@ -2595,8 +2597,8 @@ static void do_extract_ld(parameters_map &params)
// read core metadata
std::string metadata;
- chd_error err = input_chd.read_metadata(AV_METADATA_TAG, 0, metadata);
- if (err != CHDERR_NONE)
+ std::error_condition err = input_chd.read_metadata(AV_METADATA_TAG, 0, metadata);
+ if (err)
report_error(1, "Unable to find A/V metadata in the input CHD");
// parse the metadata
@@ -2666,7 +2668,7 @@ static void do_extract_ld(parameters_map &params)
// process output file
avi_file::error avierr = avi_file::create(*output_file_str->second, info, output_file);
if (avierr != avi_file::error::NONE)
- report_error(1, "Unable to open file (%s)", output_file_str->second->c_str());
+ report_error(1, "Unable to open file (%s)", *output_file_str->second);
// create the codec configuration
avhuff_decoder::config avconfig;
@@ -2693,11 +2695,12 @@ static void do_extract_ld(parameters_map &params)
input_chd.codec_configure(CHD_CODEC_AVHUFF, AVHUFF_CODEC_DECOMPRESS_CONFIG, &avconfig);
// read the hunk into the buffers
- chd_error err = input_chd.read_hunk(framenum, nullptr);
- if (err != CHDERR_NONE)
+ std::error_condition err = input_chd.read_hunk(framenum, nullptr);
+ if (err)
{
- uint64_t filepos = static_cast<util::core_file &>(input_chd).tell();
- report_error(1, "Error reading hunk %d at offset %d from CHD file (%s): %s\n", framenum, filepos, params.find(OPTION_INPUT)->second->c_str(), chd_file::error_string(err));
+ uint64_t filepos = ~uint64_t(0);
+ input_chd.file().tell(filepos);
+ report_error(1, "Error reading hunk %d at offset %d from CHD file (%s): %s\n", framenum, filepos, *params.find(OPTION_INPUT)->second, err.message());
}
// write audio
@@ -2705,7 +2708,7 @@ static void do_extract_ld(parameters_map &params)
{
avi_file::error avierr = output_file->append_sound_samples(chnum, avconfig.audio[chnum], actsamples, 0);
if (avierr != avi_file::error::NONE)
- report_error(1, "Error writing samples for hunk %d to file (%s): %s\n", framenum, output_file_str->second->c_str(), avi_file::error_string(avierr));
+ report_error(1, "Error writing samples for hunk %d to file (%s): %s\n", framenum, *output_file_str->second, avi_file::error_string(avierr));
}
// write video
@@ -2713,7 +2716,7 @@ static void do_extract_ld(parameters_map &params)
{
avi_file::error avierr = output_file->append_video_frame(fullbitmap);
if (avierr != avi_file::error::NONE)
- report_error(1, "Error writing video for hunk %d to file (%s): %s\n", framenum, output_file_str->second->c_str(), avi_file::error_string(avierr));
+ report_error(1, "Error writing video for hunk %d to file (%s): %s\n", framenum, *output_file_str->second, avi_file::error_string(avierr));
}
}
@@ -2773,9 +2776,9 @@ static void do_add_metadata(parameters_map &params)
std::vector<uint8_t> file;
if (file_str != params.end())
{
- osd_file::error filerr = util::core_file::load(file_str->second->c_str(), file);
- if (filerr != osd_file::error::NONE)
- report_error(1, "Error reading metadata file (%s)", file_str->second->c_str());
+ std::error_condition const filerr = util::core_file::load(*file_str->second, file);
+ if (filerr)
+ report_error(1, "Error reading metadata file (%s): %s", *file_str->second, filerr.message());
}
// make sure we have one or the other
@@ -2799,13 +2802,13 @@ static void do_add_metadata(parameters_map &params)
printf("Data: %s (%d bytes)\n", file_str->second->c_str(), int(file.size()));
// write the metadata
- chd_error err;
+ std::error_condition err;
if (text_str != params.end())
err = input_chd.write_metadata(tag, index, text, flags);
else
err = input_chd.write_metadata(tag, index, file, flags);
- if (err != CHDERR_NONE)
- report_error(1, "Error adding metadata: %s", chd_file::error_string(err));
+ if (err)
+ report_error(1, "Error adding metadata: %s", err.message());
else
printf("Metadata added\n");
}
@@ -2843,9 +2846,9 @@ static void do_del_metadata(parameters_map &params)
printf("Index: %d\n", index);
// write the metadata
- chd_error err = input_chd.delete_metadata(tag, index);
- if (err != CHDERR_NONE)
- report_error(1, "Error removing metadata: %s", chd_file::error_string(err));
+ std::error_condition err = input_chd.delete_metadata(tag, index);
+ if (err)
+ report_error(1, "Error removing metadata: %s", err.message());
else
printf("Metadata removed\n");
}
@@ -2884,9 +2887,9 @@ static void do_dump_metadata(parameters_map &params)
// write the metadata
std::vector<uint8_t> buffer;
- chd_error err = input_chd.read_metadata(tag, index, buffer);
- if (err != CHDERR_NONE)
- report_error(1, "Error reading metadata: %s", chd_file::error_string(err));
+ std::error_condition err = input_chd.read_metadata(tag, index, buffer);
+ if (err)
+ report_error(1, "Error reading metadata: %s", err.message());
// catch errors so we can close & delete the output file
util::core_file::ptr output_file;
@@ -2895,14 +2898,14 @@ static void do_dump_metadata(parameters_map &params)
// create the file
if (output_file_str != params.end())
{
- osd_file::error filerr = util::core_file::open(*output_file_str->second, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, output_file);
- if (filerr != osd_file::error::NONE)
- report_error(1, "Unable to open file (%s)", output_file_str->second->c_str());
+ std::error_condition const filerr = util::core_file::open(*output_file_str->second, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, output_file);
+ if (filerr)
+ report_error(1, "Unable to open file (%s): %s", *output_file_str->second, filerr.message());
// output the metadata
uint32_t count = output_file->write(&buffer[0], buffer.size());
if (count != buffer.size())
- report_error(1, "Error writing file (%s)", output_file_str->second->c_str());
+ report_error(1, "Error writing file (%s)", *output_file_str->second);
output_file.reset();
// provide some feedback
@@ -3056,9 +3059,9 @@ int CLIB_DECL main(int argc, char *argv[])
(*s_command.handler)(parameters);
return 0;
}
- catch (chd_error &err)
+ catch (std::error_condition const &err)
{
- fprintf(stderr, "CHD error occurred (main): %s\n", chd_file::error_string(err));
+ fprintf(stderr, "CHD error occurred (main): %s\n", err.message().c_str());
return 1;
}
catch (fatal_error &err)
diff --git a/src/tools/floptool.cpp b/src/tools/floptool.cpp
index 6e9e2097233..f021e084a62 100644
--- a/src/tools/floptool.cpp
+++ b/src/tools/floptool.cpp
@@ -6,17 +6,19 @@
***************************************************************************/
-#include <cstdio>
-#include <cstring>
+#include "image_handler.h"
+
+#include "corestr.h"
+#include "ioprocs.h"
+
+#include <cassert>
#include <cctype>
+#include <cstdarg>
+#include <cstdio>
#include <cstdlib>
+#include <cstring>
#include <ctime>
-#include <cstdarg>
-#include <cassert>
-#include <map>
-#include "image_handler.h"
-#include "corestr.h"
static formats_table formats;
diff --git a/src/tools/image_handler.cpp b/src/tools/image_handler.cpp
index abb45de2db3..a520383846d 100644
--- a/src/tools/image_handler.cpp
+++ b/src/tools/image_handler.cpp
@@ -4,10 +4,16 @@
// Image generic handler class and helpers
#include "image_handler.h"
+
#include "formats/all.h"
#include "formats/fsblk_vec.h"
#include "formats/fs_unformatted.h"
+#include "ioprocs.h"
+#include "ioprocsfill.h"
+#include "ioprocsvec.h"
+
+
// Fatalerror implementation
emu_fatalerror::emu_fatalerror(util::format_argument_pack<std::ostream> const &args)
@@ -21,70 +27,6 @@ emu_fatalerror::emu_fatalerror(int _exitcode, util::format_argument_pack<std::os
{
}
-// io_generic from vector<u8>
-
-static void ram_closeproc(void *file)
-{
- auto f = (iofile_ram *)file;
- delete f;
-}
-
-static int ram_seekproc(void *file, int64_t offset, int whence)
-{
- auto f = (iofile_ram *)file;
- switch(whence) {
- case SEEK_SET: f->pos = offset; break;
- case SEEK_CUR: f->pos += offset; break;
- case SEEK_END: f->pos = f->data->size() + offset; break;
- }
-
- if(whence == SEEK_CUR)
- f->pos = std::max<int64_t>(f->pos, 0);
- else
- f->pos = std::clamp<int64_t>(f->pos, 0, f->data->size());
- return 0;
-}
-
-static size_t ram_readproc(void *file, void *buffer, size_t length)
-{
- auto f = (iofile_ram *)file;
- size_t l = std::min<std::common_type_t<size_t, int64_t> >(length, f->data->size() - f->pos);
- memcpy(buffer, f->data->data() + f->pos, l);
- return l;
-}
-
-static size_t ram_writeproc(void *file, const void *buffer, size_t length)
-{
- auto f = (iofile_ram *)file;
- size_t l = std::max<std::common_type_t<size_t, int64_t> >(f->pos + length, f->data->size());
- f->data->resize(l);
- memcpy(f->data->data() + f->pos, buffer, length);
- return length;
-}
-
-static uint64_t ram_filesizeproc(void *file)
-{
- auto f = (iofile_ram *)file;
- return f->data->size();
-}
-
-
-static const io_procs iop_ram = {
- ram_closeproc,
- ram_seekproc,
- ram_readproc,
- ram_writeproc,
- ram_filesizeproc
-};
-
-io_generic *ram_open(std::vector<u8> &data)
-{
- iofile_ram *f = new iofile_ram;
- f->data = &data;
- f->pos = 0;
- return new io_generic({ &iop_ram, f });
-}
-
// Format enumeration
@@ -304,45 +246,37 @@ std::vector<std::pair<u8, const floppy_format_info *>> image_handler::identify(c
std::vector<std::pair<u8, const floppy_format_info *>> res;
std::vector<uint32_t> variants;
- std::string msg = util::string_format("Error opening %s for reading", m_on_disk_path);
FILE *f = fopen(m_on_disk_path.c_str(), "rb");
if (!f) {
+ std::string msg = util::string_format("Error opening %s for reading", m_on_disk_path);
perror(msg.c_str());
return res;
}
- io_generic io;
- io.file = f;
- io.procs = &stdio_ioprocs_noclose;
- io.filler = 0xff;
+ auto io = util::stdio_read(f, 0xff);
for(const auto &e : formats.floppy_format_info_by_key) {
- u8 score = e.second->m_format->identify(&io, floppy_image::FF_UNKNOWN, variants);
+ u8 score = e.second->m_format->identify(*io, floppy_image::FF_UNKNOWN, variants);
if(score)
res.emplace_back(std::make_pair(score, e.second));
}
- fclose(f);
-
return res;
}
bool image_handler::floppy_load(const floppy_format_info *format)
{
std::vector<uint32_t> variants;
- std::string msg = util::string_format("Error opening %s for reading", m_on_disk_path);
FILE *f = fopen(m_on_disk_path.c_str(), "rb");
if (!f) {
+ std::string msg = util::string_format("Error opening %s for reading", m_on_disk_path);
perror(msg.c_str());
return true;
}
- io_generic io;
- io.file = f;
- io.procs = &stdio_ioprocs_noclose;
- io.filler = 0xff;
+ auto io = util::stdio_read(f, 0xff);
- return !format->m_format->load(&io, floppy_image::FF_UNKNOWN, variants, &m_floppy_image);
+ return !format->m_format->load(*io, floppy_image::FF_UNKNOWN, variants, &m_floppy_image);
}
bool image_handler::floppy_save(const floppy_format_info *format)
@@ -355,12 +289,9 @@ bool image_handler::floppy_save(const floppy_format_info *format)
return true;
}
- io_generic io;
- io.file = f;
- io.procs = &stdio_ioprocs_noclose;
- io.filler = 0xff;
+ auto io = util::stdio_read_write(f, 0xff);
- return !format->m_format->save(&io, variants, &m_floppy_image);
+ return !format->m_format->save(*io, variants, &m_floppy_image);
}
void image_handler::floppy_create(const floppy_create_info *format, fs_meta_data meta)
@@ -372,14 +303,13 @@ void image_handler::floppy_create(const floppy_create_info *format, fs_meta_data
auto fs = format->m_manager->mount(blockdev);
fs->format(meta);
- auto iog = ram_open(img);
auto source_format = format->m_type();
- source_format->load(iog, floppy_image::FF_UNKNOWN, variants, &m_floppy_image);
+ auto io = util::ram_read(img.data(), img.size(), 0xff);
+ source_format->load(*io, floppy_image::FF_UNKNOWN, variants, &m_floppy_image);
delete source_format;
- delete iog;
-
- } else
+ } else {
fs_unformatted::format(format->m_key, &m_floppy_image);
+ }
}
bool image_handler::floppy_mount_fs(const filesystem_format *format)
@@ -390,11 +320,10 @@ bool image_handler::floppy_mount_fs(const filesystem_format *format)
std::vector<uint32_t> variants;
m_floppy_fs_converter = ci->m_type;
m_sector_image.clear();
- auto iog = ram_open(m_sector_image);
auto load_format = m_floppy_fs_converter();
- load_format->save(iog, variants, &m_floppy_image);
+ util::random_read_write_fill_wrapper<util::vector_read_write_adapter<u8>, 0xff> io(m_sector_image);
+ load_format->save(io, variants, &m_floppy_image);
delete load_format;
- delete iog;
}
if(ci->m_image_size == m_sector_image.size())
@@ -425,11 +354,10 @@ bool image_handler::hd_mount_fs(const filesystem_format *format)
void image_handler::fs_to_floppy()
{
std::vector<uint32_t> variants;
- auto iog = ram_open(m_sector_image);
+ auto io = util::ram_read(m_sector_image.data(), m_sector_image.size(), 0xff);
auto format = m_floppy_fs_converter();
- format->load(iog, floppy_image::FF_UNKNOWN, variants, &m_floppy_image);
+ format->load(*io, floppy_image::FF_UNKNOWN, variants, &m_floppy_image);
delete format;
- delete iog;
}
std::vector<std::string> image_handler::path_split(std::string path) const
diff --git a/src/tools/image_handler.h b/src/tools/image_handler.h
index f004bd7d91f..d9a861bb3fd 100644
--- a/src/tools/image_handler.h
+++ b/src/tools/image_handler.h
@@ -3,27 +3,26 @@
// Image generic handler class and helpers
-#ifndef TOOLS_IMAGE_HANDLER_H
-#define TOOLS_IMAGE_HANDLER_H
+#ifndef MAME_TOOLS_IMAGE_HANDLER_H
+#define MAME_TOOLS_IMAGE_HANDLER_H
+
+#pragma once
#include "../emu/emucore.h"
+
#include "formats/fsmgr.h"
+#include <cstdint>
#include <map>
-#include <vector>
#include <memory>
+#include <string>
+#include <vector>
+
using u8 = uint8_t;
using u16 = uint16_t;
using u32 = uint32_t;
-struct iofile_ram {
- std::vector<u8> *data;
- int64_t pos;
-};
-
-io_generic *ram_open(std::vector<u8> &data);
-
struct floppy_format_info {
floppy_image_format_t *m_format;
std::string m_category;
@@ -117,5 +116,4 @@ private:
};
-#endif
-
+#endif // MAME_TOOLS_IMAGE_HANDLER_H
diff --git a/src/tools/imgtool/iflopimg.cpp b/src/tools/imgtool/iflopimg.cpp
index f6e79e6cd5d..951b75978e8 100644
--- a/src/tools/imgtool/iflopimg.cpp
+++ b/src/tools/imgtool/iflopimg.cpp
@@ -8,10 +8,15 @@
*********************************************************************/
+#include "iflopimg.h"
+
#include "imgtool.h"
-#include "formats/flopimg.h"
#include "library.h"
-#include "iflopimg.h"
+
+#include "formats/flopimg.h"
+
+#include "ioprocs.h"
+
imgtoolerr_t imgtool_floppy_error(floperr_t err)
{
@@ -40,57 +45,6 @@ imgtoolerr_t imgtool_floppy_error(floperr_t err)
/*********************************************************************
- Imgtool ioprocs
-*********************************************************************/
-
-static void imgtool_floppy_closeproc(void *file)
-{
- delete reinterpret_cast<imgtool::stream *>(file);
-}
-
-static int imgtool_floppy_seekproc(void *file, int64_t offset, int whence)
-{
- reinterpret_cast<imgtool::stream *>(file)->seek(offset, whence);
- return 0;
-}
-
-static size_t imgtool_floppy_readproc(void *file, void *buffer, size_t length)
-{
- return reinterpret_cast<imgtool::stream *>(file)->read(buffer, length);
-}
-
-static size_t imgtool_floppy_writeproc(void *file, const void *buffer, size_t length)
-{
- reinterpret_cast<imgtool::stream *>(file)->write(buffer, length);
- return length;
-}
-
-static uint64_t imgtool_floppy_filesizeproc(void *file)
-{
- return reinterpret_cast<imgtool::stream *>(file)->size();
-}
-
-static const struct io_procs imgtool_ioprocs =
-{
- imgtool_floppy_closeproc,
- imgtool_floppy_seekproc,
- imgtool_floppy_readproc,
- imgtool_floppy_writeproc,
- imgtool_floppy_filesizeproc
-};
-
-static const struct io_procs imgtool_noclose_ioprocs =
-{
- nullptr,
- imgtool_floppy_seekproc,
- imgtool_floppy_readproc,
- imgtool_floppy_writeproc,
- imgtool_floppy_filesizeproc
-};
-
-
-
-/*********************************************************************
Imgtool handlers
*********************************************************************/
@@ -102,11 +56,10 @@ struct imgtool_floppy_image
-static imgtoolerr_t imgtool_floppy_open_internal(imgtool::image &image, imgtool::stream::ptr &&stream, int noclose)
+static imgtoolerr_t imgtool_floppy_open_internal(imgtool::image &image, imgtool::stream::ptr &&stream)
{
floperr_t ferr;
imgtoolerr_t err = IMGTOOLERR_SUCCESS;
- imgtool::stream *f = nullptr;
struct imgtool_floppy_image *fimg;
const imgtool_class *imgclass;
const struct FloppyFormat *format;
@@ -117,18 +70,13 @@ static imgtoolerr_t imgtool_floppy_open_internal(imgtool::image &image, imgtool:
format = (const struct FloppyFormat *) imgclass->derived_param;
open = (imgtoolerr_t (*)(imgtool::image &, imgtool::stream *)) imgtool_get_info_ptr(imgclass, IMGTOOLINFO_PTR_FLOPPY_OPEN);
- // extract the pointer
- f = stream.release();
-
// open up the floppy
- ferr = floppy_open(f, noclose ? &imgtool_noclose_ioprocs : &imgtool_ioprocs,
- "", format, FLOPPY_FLAGS_READWRITE, &fimg->floppy);
+ ferr = floppy_open(imgtool::stream_read_write(std::move(stream), 0xff), "", format, FLOPPY_FLAGS_READWRITE, &fimg->floppy);
if (ferr)
{
err = imgtool_floppy_error(ferr);
goto done;
}
- f = nullptr; // the floppy object has the stream now
if (open)
{
@@ -138,8 +86,6 @@ static imgtoolerr_t imgtool_floppy_open_internal(imgtool::image &image, imgtool:
}
done:
- if (f)
- delete f;
if (err && fimg->floppy)
{
floppy_close(fimg->floppy);
@@ -152,7 +98,7 @@ done:
static imgtoolerr_t imgtool_floppy_open(imgtool::image &image, imgtool::stream::ptr &&stream)
{
- return imgtool_floppy_open_internal(image, std::move(stream), false);
+ return imgtool_floppy_open_internal(image, std::move(stream));
}
@@ -161,7 +107,6 @@ static imgtoolerr_t imgtool_floppy_create(imgtool::image &image, imgtool::stream
{
floperr_t ferr;
imgtoolerr_t err = IMGTOOLERR_SUCCESS;
- imgtool::stream *f = nullptr;
struct imgtool_floppy_image *fimg;
const imgtool_class *imgclass;
const struct FloppyFormat *format;
@@ -174,17 +119,13 @@ static imgtoolerr_t imgtool_floppy_create(imgtool::image &image, imgtool::stream
create = (imgtoolerr_t (*)(imgtool::image &, imgtool::stream *, util::option_resolution *)) imgtool_get_info_ptr(imgclass, IMGTOOLINFO_PTR_FLOPPY_CREATE);
open = (imgtoolerr_t (*)(imgtool::image &, imgtool::stream *)) imgtool_get_info_ptr(imgclass, IMGTOOLINFO_PTR_FLOPPY_OPEN);
- // extract the pointer
- f = stream.release();
-
// open up the floppy
- ferr = floppy_create(f, &imgtool_ioprocs, format, opts, &fimg->floppy);
+ ferr = floppy_create(imgtool::stream_read_write(std::move(stream), 0xff), format, opts, &fimg->floppy);
if (ferr)
{
err = imgtool_floppy_error(ferr);
goto done;
}
- f = nullptr; // the floppy object has the stream now
// do we have to do extra stuff when creating the image?
if (create)
@@ -203,8 +144,6 @@ static imgtoolerr_t imgtool_floppy_create(imgtool::image &image, imgtool::stream
}
done:
- if (f)
- delete f;
if (err && fimg->floppy)
{
floppy_close(fimg->floppy);
diff --git a/src/tools/imgtool/iflopimg.h b/src/tools/imgtool/iflopimg.h
index 078a1247ae3..d27ba952e16 100644
--- a/src/tools/imgtool/iflopimg.h
+++ b/src/tools/imgtool/iflopimg.h
@@ -7,13 +7,16 @@
Bridge code for Imgtool into the standard floppy code
*********************************************************************/
+#ifndef MAME_TOOLS_IMGTOOL_IFLOPIMG_H
+#define MAME_TOOLS_IMGTOOL_IFLOPIMG_H
-#ifndef IFLOPIMG_H
-#define IFLOPIMG_H
+#pragma once
-#include "formats/flopimg.h"
#include "library.h"
+#include "formats/flopimg.h"
+
+
/***************************************************************************
Prototypes
@@ -38,4 +41,4 @@ imgtoolerr_t imgtool_floppy_write_sector_from_stream(imgtool::image &img, int he
void *imgtool_floppy_extrabytes(imgtool::image &img);
-#endif /* IFLOPIMG_H */
+#endif // MAME_TOOLS_IMGTOOL_IFLOPIMG_H
diff --git a/src/tools/imgtool/imghd.cpp b/src/tools/imgtool/imghd.cpp
index 45ac262a9ba..8e077295b93 100644
--- a/src/tools/imgtool/imghd.cpp
+++ b/src/tools/imgtool/imghd.cpp
@@ -9,34 +9,21 @@
Raphael Nabet 2003
*/
+#include "imghd.h"
#include "imgtool.h"
#include "harddisk.h"
-#include "imghd.h"
-static imgtoolerr_t map_chd_error(chd_error chderr)
+static imgtoolerr_t map_chd_error(std::error_condition chderr)
{
- imgtoolerr_t err;
-
- switch(chderr)
- {
- case CHDERR_NONE:
- err = IMGTOOLERR_SUCCESS;
- break;
- case CHDERR_OUT_OF_MEMORY:
- err = IMGTOOLERR_OUTOFMEMORY;
- break;
- case CHDERR_FILE_NOT_WRITEABLE:
- err = IMGTOOLERR_READONLY;
- break;
- case CHDERR_NOT_SUPPORTED:
- err = IMGTOOLERR_UNIMPLEMENTED;
- break;
- default:
- err = IMGTOOLERR_UNEXPECTED;
- break;
- }
- return err;
+ if (!chderr)
+ return IMGTOOLERR_SUCCESS;
+ else if (std::errc::not_enough_memory == chderr)
+ return IMGTOOLERR_OUTOFMEMORY;
+ else if (chd_file::error::FILE_NOT_WRITEABLE == chderr)
+ return IMGTOOLERR_READONLY;
+ else
+ return IMGTOOLERR_UNEXPECTED;
}
@@ -50,7 +37,7 @@ imgtoolerr_t imghd_create(imgtool::stream &stream, uint32_t hunksize, uint32_t c
{
imgtoolerr_t err = IMGTOOLERR_SUCCESS;
chd_file chd;
- chd_error rc;
+ std::error_condition rc;
chd_codec_type compression[4] = { CHD_CODEC_NONE };
/* sanity check args -- see parse_hunk_size() in src/lib/util/chd.cpp */
@@ -73,8 +60,8 @@ imgtoolerr_t imghd_create(imgtool::stream &stream, uint32_t hunksize, uint32_t c
const uint64_t logicalbytes = (uint64_t)cylinders * heads * sectors * seclen;
/* create the new hard drive */
- rc = chd.create(*stream.core_file(), logicalbytes, hunksize, seclen, compression);
- if (rc != CHDERR_NONE)
+ rc = chd.create(stream_read_write(stream, 0), logicalbytes, hunksize, seclen, compression);
+ if (rc)
{
err = map_chd_error(rc);
return err;
@@ -82,8 +69,8 @@ imgtoolerr_t imghd_create(imgtool::stream &stream, uint32_t hunksize, uint32_t c
/* write the metadata */
const std::string metadata = util::string_format(HARD_DISK_METADATA_FORMAT, cylinders, heads, sectors, seclen);
- err = (imgtoolerr_t)chd.write_metadata(HARD_DISK_METADATA_TAG, 0, metadata);
- if (rc != CHDERR_NONE)
+ rc = chd.write_metadata(HARD_DISK_METADATA_TAG, 0, metadata);
+ if (rc)
{
err = map_chd_error(rc);
return err;
@@ -118,12 +105,12 @@ imgtoolerr_t imghd_create(imgtool::stream &stream, uint32_t hunksize, uint32_t c
*/
imgtoolerr_t imghd_open(imgtool::stream &stream, struct mess_hard_disk_file *hard_disk)
{
- chd_error chderr;
+ std::error_condition chderr;
imgtoolerr_t err = IMGTOOLERR_SUCCESS;
hard_disk->hard_disk = nullptr;
- chderr = hard_disk->chd.open(*stream.core_file(), !stream.is_read_only());
+ chderr = hard_disk->chd.open(stream_read_write(stream, 0), !stream.is_read_only());
if (chderr)
{
err = map_chd_error(chderr);
@@ -174,9 +161,8 @@ void imghd_close(struct mess_hard_disk_file *disk)
*/
imgtoolerr_t imghd_read(struct mess_hard_disk_file *disk, uint32_t lbasector, void *buffer)
{
- uint32_t reply;
- reply = hard_disk_read(disk->hard_disk, lbasector, buffer);
- return (imgtoolerr_t)(reply ? IMGTOOLERR_SUCCESS : map_chd_error((chd_error)reply));
+ uint32_t reply = hard_disk_read(disk->hard_disk, lbasector, buffer);
+ return reply ? IMGTOOLERR_SUCCESS : IMGTOOLERR_READERROR;
}
@@ -188,9 +174,8 @@ imgtoolerr_t imghd_read(struct mess_hard_disk_file *disk, uint32_t lbasector, vo
*/
imgtoolerr_t imghd_write(struct mess_hard_disk_file *disk, uint32_t lbasector, const void *buffer)
{
- uint32_t reply;
- reply = hard_disk_write(disk->hard_disk, lbasector, buffer);
- return (imgtoolerr_t)(reply ? IMGTOOLERR_SUCCESS : map_chd_error((chd_error)reply));
+ uint32_t reply = hard_disk_write(disk->hard_disk, lbasector, buffer);
+ return reply ? IMGTOOLERR_SUCCESS : IMGTOOLERR_WRITEERROR;
}
diff --git a/src/tools/imgtool/imghd.h b/src/tools/imgtool/imghd.h
index d4ae341af1e..0eadc6e2eb3 100644
--- a/src/tools/imgtool/imghd.h
+++ b/src/tools/imgtool/imghd.h
@@ -11,8 +11,11 @@
#ifndef IMGHD_H
#define IMGHD_H
+#include "stream.h"
+
#include "harddisk.h"
+
struct mess_hard_disk_file
{
imgtool::stream *stream;
diff --git a/src/tools/imgtool/imgtool.cpp b/src/tools/imgtool/imgtool.cpp
index 841147ae26e..ce4dd22d186 100644
--- a/src/tools/imgtool/imgtool.cpp
+++ b/src/tools/imgtool/imgtool.cpp
@@ -8,14 +8,18 @@
***************************************************************************/
+#include "imgtool.h"
+#include "library.h"
+#include "modules.h"
+
+#include "formats/imageutl.h"
+
+#include "corefile.h"
+
#include <cstring>
#include <cctype>
#include <iostream>
-#include "imgtool.h"
-#include "formats/imageutl.h"
-#include "library.h"
-#include "modules.h"
/***************************************************************************
diff --git a/src/tools/imgtool/library.h b/src/tools/imgtool/library.h
index 7406cc2e526..f0e0532e502 100644
--- a/src/tools/imgtool/library.h
+++ b/src/tools/imgtool/library.h
@@ -4,29 +4,31 @@
library.h
- Code relevant to the Imgtool library; analogous to the MESS/MAME driver
- list.
+ Code relevant to the Imgtool library; analogous to the MAME driver list.
- Unlike MESS and MAME which have static driver lists, Imgtool has a
- concept of a library and this library is built at startup time.
+ Unlike MAME which has a static driver lists, Imgtool has a concept of a
+ library and this library is built at startup time.
dynamic for which modules are added to. This makes "dynamic" modules
much easier
****************************************************************************/
+#ifndef MAME_TOOLS_IMGTOOL_LIBRARY_H
+#define MAME_TOOLS_IMGTOOL_LIBRARY_H
-#ifndef LIBRARY_H
-#define LIBRARY_H
+#pragma once
-#include <ctime>
-#include <list>
-#include <chrono>
+#include "charconv.h"
+#include "stream.h"
#include "corestr.h"
#include "opresolv.h"
-#include "stream.h"
-#include "unicode.h"
-#include "charconv.h"
#include "timeconv.h"
+#include "unicode.h"
+
+#include <chrono>
+#include <ctime>
+#include <list>
+
namespace imgtool
{
@@ -542,4 +544,4 @@ private:
} // namespace imgtool
-#endif // LIBRARY_H
+#endif // MAME_TOOLS_IMGTOOL_LIBRARY_H
diff --git a/src/tools/imgtool/main.cpp b/src/tools/imgtool/main.cpp
index 75fcd52e7a2..77b3d8c6874 100644
--- a/src/tools/imgtool/main.cpp
+++ b/src/tools/imgtool/main.cpp
@@ -11,6 +11,8 @@
#include "imgtool.h"
#include "main.h"
#include "modules.h"
+
+#include "corefile.h"
#include "strformat.h"
#include <cstdio>
diff --git a/src/tools/imgtool/modules/hp85_tape.cpp b/src/tools/imgtool/modules/hp85_tape.cpp
index 0198b6251dd..fa32042efd3 100644
--- a/src/tools/imgtool/modules/hp85_tape.cpp
+++ b/src/tools/imgtool/modules/hp85_tape.cpp
@@ -7,12 +7,16 @@
HP-85 tape format
*********************************************************************/
-
#include "imgtool.h"
-#include "formats/imageutl.h"
+
#include "formats/hti_tape.h"
+#include "formats/imageutl.h"
+
+#include "ioprocs.h"
+
#include <iostream>
+
// Constants
static constexpr unsigned CHARS_PER_FNAME = 6; // Characters in a filename
static constexpr unsigned CHARS_PER_EXT = 4; // Characters in (simulated) file extension
@@ -158,48 +162,13 @@ void tape_image_85::format_img(void)
finalize_allocation();
}
-namespace {
- int my_seekproc(void *file, int64_t offset, int whence)
- {
- reinterpret_cast<imgtool::stream *>(file)->seek(offset, whence);
- return 0;
- }
-
- size_t my_readproc(void *file, void *buffer, size_t length)
- {
- return reinterpret_cast<imgtool::stream *>(file)->read(buffer, length);
- }
-
- size_t my_writeproc(void *file, const void *buffer, size_t length)
- {
- reinterpret_cast<imgtool::stream *>(file)->write(buffer, length);
- return length;
- }
-
- uint64_t my_filesizeproc(void *file)
- {
- return reinterpret_cast<imgtool::stream *>(file)->size();
- }
-
- const struct io_procs my_stream_procs = {
- nullptr,
- my_seekproc,
- my_readproc,
- my_writeproc,
- my_filesizeproc
- };
-}
-
imgtoolerr_t tape_image_85::load_from_file(imgtool::stream *stream)
{
- io_generic io;
- io.file = (void *)stream;
- io.procs = &my_stream_procs;
- io.filler = 0;
-
- if (!image.load_tape(&io)) {
+ auto io = imgtool::stream_read(*stream, 0);
+ if (!io || !image.load_tape(*io)) {
return IMGTOOLERR_READERROR;
}
+ io.reset();
// Prevent track boundary crossing when reading directory
file_track_1 = 0;
@@ -422,12 +391,7 @@ imgtoolerr_t tape_image_85::save_to_file(imgtool::stream *stream)
file_0.clear();
save_sif_file(track , pos , dir.size() + 1 , file_0);
- io_generic io;
- io.file = (void *)stream;
- io.procs = &my_stream_procs;
- io.filler = 0;
-
- image.save_tape(&io);
+ image.save_tape(*imgtool::stream_read_write(*stream, 0));
return IMGTOOLERR_SUCCESS;
}
diff --git a/src/tools/imgtool/modules/hp9845_tape.cpp b/src/tools/imgtool/modules/hp9845_tape.cpp
index 7a3e90b08d1..a1ae0377180 100644
--- a/src/tools/imgtool/modules/hp9845_tape.cpp
+++ b/src/tools/imgtool/modules/hp9845_tape.cpp
@@ -108,11 +108,16 @@
these special characters.
*********************************************************************/
-#include <bitset>
-
#include "imgtool.h"
-#include "formats/imageutl.h"
+
#include "formats/hti_tape.h"
+#include "formats/imageutl.h"
+
+#include "corefile.h"
+#include "ioprocs.h"
+
+#include <bitset>
+
// Constants
#define SECTOR_LEN 256 // Bytes in a sector
@@ -291,49 +296,16 @@ void tape_image_t::format_img(void)
dirty = true;
}
-static int my_seekproc(void *file, int64_t offset, int whence)
-{
- reinterpret_cast<imgtool::stream *>(file)->seek(offset, whence);
- return 0;
-}
-
-static size_t my_readproc(void *file, void *buffer, size_t length)
-{
- return reinterpret_cast<imgtool::stream *>(file)->read(buffer, length);
-}
-
-static size_t my_writeproc(void *file, const void *buffer, size_t length)
-{
- reinterpret_cast<imgtool::stream *>(file)->write(buffer, length);
- return length;
-}
-
-static uint64_t my_filesizeproc(void *file)
-{
- return reinterpret_cast<imgtool::stream *>(file)->size();
-}
-
-static const struct io_procs my_stream_procs = {
- nullptr,
- my_seekproc,
- my_readproc,
- my_writeproc,
- my_filesizeproc
-};
-
imgtoolerr_t tape_image_t::load_from_file(imgtool::stream *stream)
{
hti_format_t inp_image;
inp_image.set_image_format(hti_format_t::HTI_DELTA_MOD_16_BITS);
- io_generic io;
- io.file = (void *)stream;
- io.procs = &my_stream_procs;
- io.filler = 0;
-
- if (!inp_image.load_tape(&io)) {
+ auto io = imgtool::stream_read(*stream, 0);
+ if (!io || !inp_image.load_tape(*io)) {
return IMGTOOLERR_READERROR;
}
+ io.reset();
unsigned exp_sector = 0;
unsigned last_sector_on_track = SECTORS_PER_TRACK;
@@ -523,12 +495,7 @@ imgtoolerr_t tape_image_t::save_to_file(imgtool::stream *stream)
}
}
- io_generic io;
- io.file = (void *)stream;
- io.procs = &my_stream_procs;
- io.filler = 0;
-
- out_image.save_tape(&io);
+ out_image.save_tape(*imgtool::stream_read_write(*stream, 0));
return IMGTOOLERR_SUCCESS;
}
diff --git a/src/tools/imgtool/stream.cpp b/src/tools/imgtool/stream.cpp
index bb0d95614f3..ed9814e504a 100644
--- a/src/tools/imgtool/stream.cpp
+++ b/src/tools/imgtool/stream.cpp
@@ -8,19 +8,178 @@
***************************************************************************/
+#include "stream.h"
+
+#include "imgtool.h"
+
+#include "corefile.h"
+#include "ioprocs.h"
+#include "unzip.h"
+
+#include <cassert>
#include <cstdio>
#include <cstring>
-#include <zlib.h>
-#include "unzip.h"
-#include "imgtool.h"
+#include <zlib.h> // for crc32
+
+
+namespace imgtool {
+
+namespace {
+
+class stream_read_wrapper : public virtual util::random_read
+{
+public:
+ stream_read_wrapper(stream::ptr &&stream, std::uint8_t filler) noexcept
+ : m_stream(stream.release())
+ , m_filler(filler)
+ , m_close(true)
+ {
+ assert(m_stream);
+ }
+
+ stream_read_wrapper(stream &stream, std::uint8_t filler) noexcept
+ : m_stream(&stream)
+ , m_filler(filler)
+ , m_close(false)
+ {
+ }
+
+ virtual ~stream_read_wrapper()
+ {
+ if (m_close)
+ delete m_stream;
+ }
+
+ virtual std::error_condition seek(std::int64_t offset, int whence) noexcept override
+ {
+ m_stream->seek(offset, whence);
+ return std::error_condition();
+ }
+
+ virtual std::error_condition tell(std::uint64_t &result) noexcept override
+ {
+ result = m_stream->tell();
+ return std::error_condition();
+ }
+
+ virtual std::error_condition length(std::uint64_t &result) noexcept override
+ {
+ result = m_stream->size();
+ return std::error_condition();
+ }
+
+ virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ actual = m_stream->read(buffer, length);
+ if (actual < length)
+ std::memset(reinterpret_cast<std::uint8_t *>(buffer) + actual, m_filler, length - actual);
+ return std::error_condition();
+ }
+
+ virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ std::uint64_t const pos = m_stream->tell();
+ m_stream->seek(offset, SEEK_SET);
+ actual = m_stream->read(buffer, length);
+ m_stream->seek(pos, SEEK_SET);
+ if (actual < length)
+ std::memset(reinterpret_cast<std::uint8_t *>(buffer) + actual, m_filler, length - actual);
+ return std::error_condition();
+ }
+
+protected:
+ stream *const m_stream;
+ std::uint8_t m_filler;
+ bool const m_close;
+};
+
+
+class stream_read_write_wrapper : public stream_read_wrapper, public util::random_read_write
+{
+public:
+ using stream_read_wrapper::stream_read_wrapper;
+
+ virtual std::error_condition finalize() noexcept override
+ {
+ return std::error_condition();
+ }
+
+ virtual std::error_condition flush() noexcept override
+ {
+ return std::error_condition();
+ }
+
+ virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ std::uint64_t const pos = m_stream->tell();
+ std::uint64_t size = m_stream->size();
+ if (size < pos)
+ {
+ m_stream->seek(size, SEEK_SET);
+ size += m_stream->fill(m_filler, pos - size);
+ }
+ actual = (size >= pos) ? m_stream->write(buffer, length) : 0U;
+ return (actual == length) ? std::error_condition() : std::errc::io_error;
+ }
+
+ virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override
+ {
+ std::uint64_t const pos = m_stream->tell();
+ std::uint64_t size = m_stream->size();
+ if (offset > size)
+ {
+ m_stream->seek(size, SEEK_SET);
+ size += m_stream->fill(m_filler, offset - size);
+ }
+ else
+ {
+ m_stream->seek(offset, SEEK_SET);
+ }
+ actual = (size >= offset) ? m_stream->write(buffer, length) : 0U;
+ m_stream->seek(pos, SEEK_SET);
+ return (actual == length) ? std::error_condition() : std::errc::io_error;
+ }
+};
+
+} // anonymous namespace
+
+
+util::random_read::ptr stream_read(stream::ptr &&s, std::uint8_t filler) noexcept
+{
+ util::random_read::ptr result;
+ if (s)
+ result.reset(new (std::nothrow) stream_read_wrapper(std::move(s), filler));
+ return result;
+}
+
+util::random_read::ptr stream_read(stream &s, std::uint8_t filler) noexcept
+{
+ util::random_read::ptr result(new (std::nothrow) stream_read_wrapper(s, filler));
+ return result;
+}
+
+util::random_read_write::ptr stream_read_write(stream::ptr &&s, std::uint8_t filler) noexcept
+{
+ util::random_read_write::ptr result;
+ if (s)
+ result.reset(new (std::nothrow) stream_read_write_wrapper(std::move(s), filler));
+ return result;
+}
+
+util::random_read_write::ptr stream_read_write(stream &s, std::uint8_t filler) noexcept
+{
+ util::random_read_write::ptr result(new (std::nothrow) stream_read_write_wrapper(s, filler));
+ return result;
+}
+
//-------------------------------------------------
// ctor
//-------------------------------------------------
-imgtool::stream::stream(bool wp)
+stream::stream(bool wp)
: imgtype(IMG_FILE)
, write_protect(wp)
, position(0)
@@ -35,7 +194,7 @@ imgtool::stream::stream(bool wp)
// ctor
//-------------------------------------------------
-imgtool::stream::stream(bool wp, util::core_file::ptr &&f)
+stream::stream(bool wp, util::core_file::ptr &&f)
: imgtype(IMG_FILE)
, write_protect(wp)
, position(0)
@@ -50,7 +209,7 @@ imgtool::stream::stream(bool wp, util::core_file::ptr &&f)
// ctor
//-------------------------------------------------
-imgtool::stream::stream(bool wp, std::size_t size)
+stream::stream(bool wp, std::size_t size)
: imgtype(IMG_MEM)
, write_protect(wp)
, position(0)
@@ -65,7 +224,7 @@ imgtool::stream::stream(bool wp, std::size_t size)
// ctor
//-------------------------------------------------
-imgtool::stream::stream(bool wp, std::size_t size, void *buf)
+stream::stream(bool wp, std::size_t size, void *buf)
: imgtype(IMG_MEM)
, write_protect(wp)
, position(0)
@@ -80,7 +239,7 @@ imgtool::stream::stream(bool wp, std::size_t size, void *buf)
// dtor
//-------------------------------------------------
-imgtool::stream::~stream()
+stream::~stream()
{
if (buffer)
free(buffer);
@@ -91,39 +250,39 @@ imgtool::stream::~stream()
// open_zip
//-------------------------------------------------
-imgtool::stream::ptr imgtool::stream::open_zip(const std::string &zipname, const char *subname, int read_or_write)
+stream::ptr stream::open_zip(const std::string &zipname, const char *subname, int read_or_write)
{
if (read_or_write)
- return imgtool::stream::ptr();
+ return stream::ptr();
/* check to see if the file exists */
FILE *f = fopen(zipname.c_str(), "r");
if (!f)
- return imgtool::stream::ptr();
+ return stream::ptr();
fclose(f);
- imgtool::stream::ptr imgfile(new imgtool::stream(true));
+ stream::ptr imgfile(new stream(true));
imgfile->imgtype = IMG_MEM;
util::archive_file::ptr z;
util::archive_file::open_zip(zipname, z);
if (!z)
- return imgtool::stream::ptr();
+ return stream::ptr();
int zipent = z->first_file();
while ((zipent >= 0) && subname && strcmp(subname, z->current_name().c_str()))
zipent = z->next_file();
if (zipent < 0)
- return imgtool::stream::ptr();
+ return stream::ptr();
imgfile->filesize = z->current_uncompressed_length();
imgfile->buffer = reinterpret_cast<std::uint8_t *>(malloc(z->current_uncompressed_length()));
if (!imgfile->buffer)
- return imgtool::stream::ptr();
+ return stream::ptr();
- if (z->decompress(imgfile->buffer, z->current_uncompressed_length()) != util::archive_file::error::NONE)
- return imgtool::stream::ptr();
+ if (z->decompress(imgfile->buffer, z->current_uncompressed_length()))
+ return stream::ptr();
return imgfile;
}
@@ -134,7 +293,7 @@ imgtool::stream::ptr imgtool::stream::open_zip(const std::string &zipname, const
// open
//-------------------------------------------------
-imgtool::stream::ptr imgtool::stream::open(const std::string &filename, int read_or_write)
+stream::ptr stream::open(const std::string &filename, int read_or_write)
{
static const uint32_t write_modes[] =
{
@@ -143,7 +302,7 @@ imgtool::stream::ptr imgtool::stream::open(const std::string &filename, int read
OPEN_FLAG_READ | OPEN_FLAG_WRITE,
OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE
};
- imgtool::stream::ptr s;
+ stream::ptr s;
char c;
// maybe we are just a ZIP?
@@ -152,13 +311,13 @@ imgtool::stream::ptr imgtool::stream::open(const std::string &filename, int read
util::core_file::ptr f = nullptr;
auto const filerr = util::core_file::open(filename, write_modes[read_or_write], f);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
if (!read_or_write)
{
int const len = filename.size();
- /* can't open the file; try opening ZIP files with other names */
+ // can't open the file; try opening ZIP files with other names
std::vector<char> buf(len + 1);
strcpy(&buf[0], filename.c_str());
@@ -177,11 +336,11 @@ imgtool::stream::ptr imgtool::stream::open(const std::string &filename, int read
return s;
}
- /* ah well, it was worth a shot */
- return imgtool::stream::ptr();
+ // ah well, it was worth a shot
+ return stream::ptr();
}
- imgtool::stream::ptr imgfile(new imgtool::stream(read_or_write ? false : true, std::move(f)));
+ stream::ptr imgfile(new stream(read_or_write ? false : true, std::move(f)));
// normal file
return imgfile;
@@ -192,11 +351,11 @@ imgtool::stream::ptr imgtool::stream::open(const std::string &filename, int read
// open_write_stream
//-------------------------------------------------
-imgtool::stream::ptr imgtool::stream::open_write_stream(int size)
+stream::ptr stream::open_write_stream(int size)
{
- imgtool::stream::ptr imgfile(new imgtool::stream(false, size));
+ stream::ptr imgfile(new stream(false, size));
if (!imgfile->buffer)
- return imgtool::stream::ptr();
+ return stream::ptr();
return imgfile;
}
@@ -206,9 +365,9 @@ imgtool::stream::ptr imgtool::stream::open_write_stream(int size)
// open_mem
//-------------------------------------------------
-imgtool::stream::ptr imgtool::stream::open_mem(void *buf, size_t sz)
+stream::ptr stream::open_mem(void *buf, size_t sz)
{
- imgtool::stream::ptr imgfile(new imgtool::stream(false, sz, buf));
+ stream::ptr imgfile(new stream(false, sz, buf));
return imgfile;
}
@@ -218,7 +377,7 @@ imgtool::stream::ptr imgtool::stream::open_mem(void *buf, size_t sz)
// core_file
//-------------------------------------------------
-util::core_file *imgtool::stream::core_file()
+util::core_file *stream::core_file()
{
return (imgtype == IMG_FILE) ? file.get() : nullptr;
}
@@ -228,7 +387,7 @@ util::core_file *imgtool::stream::core_file()
// read
//-------------------------------------------------
-uint32_t imgtool::stream::read(void *buf, uint32_t sz)
+uint32_t stream::read(void *buf, uint32_t sz)
{
uint32_t result = 0;
@@ -262,7 +421,7 @@ uint32_t imgtool::stream::read(void *buf, uint32_t sz)
// write
//-------------------------------------------------
-uint32_t imgtool::stream::write(const void *buf, uint32_t sz)
+uint32_t stream::write(const void *buf, uint32_t sz)
{
void *new_buffer;
uint32_t result = 0;
@@ -317,7 +476,7 @@ uint32_t imgtool::stream::write(const void *buf, uint32_t sz)
// size
//-------------------------------------------------
-uint64_t imgtool::stream::size() const
+uint64_t stream::size() const
{
return filesize;
}
@@ -327,7 +486,7 @@ uint64_t imgtool::stream::size() const
// getptr
//-------------------------------------------------
-void *imgtool::stream::getptr()
+void *stream::getptr()
{
void *ptr;
@@ -349,7 +508,7 @@ void *imgtool::stream::getptr()
// seek
//-------------------------------------------------
-int imgtool::stream::seek(int64_t pos, int where)
+int stream::seek(int64_t pos, int where)
{
switch(where)
{
@@ -377,7 +536,7 @@ int imgtool::stream::seek(int64_t pos, int where)
// tell
//-------------------------------------------------
-uint64_t imgtool::stream::tell()
+uint64_t stream::tell()
{
return position;
}
@@ -387,7 +546,7 @@ uint64_t imgtool::stream::tell()
// transfer
//-------------------------------------------------
-uint64_t imgtool::stream::transfer(imgtool::stream &dest, imgtool::stream &source, uint64_t sz)
+uint64_t stream::transfer(stream &dest, stream &source, uint64_t sz)
{
uint64_t result = 0;
uint64_t readsz;
@@ -407,7 +566,7 @@ uint64_t imgtool::stream::transfer(imgtool::stream &dest, imgtool::stream &sourc
// transfer_all
//-------------------------------------------------
-uint64_t imgtool::stream::transfer_all(imgtool::stream &dest, imgtool::stream &source)
+uint64_t stream::transfer_all(stream &dest, stream &source)
{
return transfer(dest, source, source.size());
}
@@ -417,7 +576,7 @@ uint64_t imgtool::stream::transfer_all(imgtool::stream &dest, imgtool::stream &s
// crc
//-------------------------------------------------
-int imgtool::stream::crc(unsigned long *result)
+int stream::crc(unsigned long *result)
{
size_t sz;
void *ptr;
@@ -451,12 +610,12 @@ int imgtool::stream::crc(unsigned long *result)
// file_crc
//-------------------------------------------------
-int imgtool::stream::file_crc(const char *fname, unsigned long *result)
+int stream::file_crc(const char *fname, unsigned long *result)
{
int err;
- imgtool::stream::ptr f;
+ stream::ptr f;
- f = imgtool::stream::open(fname, OSD_FOPEN_READ);
+ f = stream::open(fname, OSD_FOPEN_READ);
if (!f)
return IMGTOOLERR_FILENOTFOUND;
@@ -469,7 +628,7 @@ int imgtool::stream::file_crc(const char *fname, unsigned long *result)
// fill
//-------------------------------------------------
-uint64_t imgtool::stream::fill(unsigned char b, uint64_t sz)
+uint64_t stream::fill(unsigned char b, uint64_t sz)
{
uint64_t outsz;
char buf[1024];
@@ -490,7 +649,7 @@ uint64_t imgtool::stream::fill(unsigned char b, uint64_t sz)
// is_read_only
//-------------------------------------------------
-bool imgtool::stream::is_read_only()
+bool stream::is_read_only()
{
return write_protect;
}
@@ -500,7 +659,7 @@ bool imgtool::stream::is_read_only()
// putc
//-------------------------------------------------
-uint32_t imgtool::stream::putc(char c)
+uint32_t stream::putc(char c)
{
return write(&c, 1);
}
@@ -510,7 +669,7 @@ uint32_t imgtool::stream::putc(char c)
// puts
//-------------------------------------------------
-uint32_t imgtool::stream::puts(const char *s)
+uint32_t stream::puts(const char *s)
{
return write(s, strlen(s));
}
@@ -520,7 +679,7 @@ uint32_t imgtool::stream::puts(const char *s)
// printf
//-------------------------------------------------
-uint32_t imgtool::stream::printf(const char *fmt, ...)
+uint32_t stream::printf(const char *fmt, ...)
{
va_list va;
char buf[256];
@@ -531,3 +690,5 @@ uint32_t imgtool::stream::printf(const char *fmt, ...)
return puts(buf);
}
+
+} // namespace imgtool
diff --git a/src/tools/imgtool/stream.h b/src/tools/imgtool/stream.h
index 73d0dcb494d..e7cfca9e425 100644
--- a/src/tools/imgtool/stream.h
+++ b/src/tools/imgtool/stream.h
@@ -7,78 +7,91 @@
Code for implementing Imgtool streams
***************************************************************************/
+#ifndef MAME_TOOLS_IMGTOOL_STREAM_H
+#define MAME_TOOLS_IMGTOOL_STREAM_H
-#ifndef STREAM_H
-#define STREAM_H
+#pragma once
#include "imgterrs.h"
-#include "corefile.h"
+
+#include "utilfwd.h"
+
#include "osdcomm.h"
-namespace imgtool
+#include <cstdint>
+#include <memory>
+#include <string>
+
+
+namespace imgtool {
+
+class stream
{
- class stream
+public:
+ typedef std::unique_ptr<stream> ptr;
+
+ ~stream();
+
+ static imgtool::stream::ptr open(const std::string &filename, int read_or_write); /* similar params to mame_fopen */
+ static imgtool::stream::ptr open_write_stream(int filesize);
+ static imgtool::stream::ptr open_mem(void *buf, size_t sz);
+
+ util::core_file *core_file();
+ uint32_t read(void *buf, uint32_t sz);
+ uint32_t write(const void *buf, uint32_t sz);
+ uint64_t size() const;
+ int seek(int64_t pos, int where);
+ uint64_t tell();
+ void *getptr();
+ uint32_t putc(char c);
+ uint32_t puts(const char *s);
+ uint32_t printf(const char *fmt, ...) ATTR_PRINTF(2, 3);
+
+ // transfers sz bytes from source to dest
+ static uint64_t transfer(imgtool::stream &dest, imgtool::stream &source, uint64_t sz);
+ static uint64_t transfer_all(imgtool::stream &dest, imgtool::stream &source);
+
+ // fills sz bytes with b
+ uint64_t fill(unsigned char b, uint64_t sz);
+
+ // returns the CRC of a file
+ int crc(unsigned long *result);
+ static int file_crc(const char *fname, unsigned long *result);
+
+ // returns whether a stream is read only or not
+ bool is_read_only();
+
+private:
+ enum imgtype_t
{
- public:
- typedef std::unique_ptr<stream> ptr;
-
- ~stream();
-
- static imgtool::stream::ptr open(const std::string &filename, int read_or_write); /* similar params to mame_fopen */
- static imgtool::stream::ptr open_write_stream(int filesize);
- static imgtool::stream::ptr open_mem(void *buf, size_t sz);
-
- util::core_file *core_file();
- uint32_t read(void *buf, uint32_t sz);
- uint32_t write(const void *buf, uint32_t sz);
- uint64_t size() const;
- int seek(int64_t pos, int where);
- uint64_t tell();
- void *getptr();
- uint32_t putc(char c);
- uint32_t puts(const char *s);
- uint32_t printf(const char *fmt, ...) ATTR_PRINTF(2, 3);
-
- // transfers sz bytes from source to dest
- static uint64_t transfer(imgtool::stream &dest, imgtool::stream &source, uint64_t sz);
- static uint64_t transfer_all(imgtool::stream &dest, imgtool::stream &source);
-
- // fills sz bytes with b
- uint64_t fill(unsigned char b, uint64_t sz);
-
- // returns the CRC of a file
- int crc(unsigned long *result);
- static int file_crc(const char *fname, unsigned long *result);
-
- // returns whether a stream is read only or not
- bool is_read_only();
-
- private:
- enum imgtype_t
- {
- IMG_FILE,
- IMG_MEM
- };
-
- imgtype_t imgtype;
- bool write_protect;
- std::uint64_t position;
- std::uint64_t filesize;
-
- util::core_file::ptr file;
- std::uint8_t *buffer;
-
- // ctors
- stream(bool wp);
- stream(bool wp, util::core_file::ptr &&f);
- stream(bool wp, std::size_t size);
- stream(bool wp, std::size_t size, void *buf);
-
- // private methods
- static stream::ptr open_zip(const std::string &zipname, const char *subname, int read_or_write);
+ IMG_FILE,
+ IMG_MEM
};
-}
+ imgtype_t imgtype;
+ bool write_protect;
+ std::uint64_t position;
+ std::uint64_t filesize;
+
+ std::unique_ptr<util::core_file> file;
+ std::uint8_t *buffer;
+
+ // ctors
+ stream(bool wp);
+ stream(bool wp, std::unique_ptr<util::core_file> &&f);
+ stream(bool wp, std::size_t size);
+ stream(bool wp, std::size_t size, void *buf);
+
+ // private methods
+ static stream::ptr open_zip(const std::string &zipname, const char *subname, int read_or_write);
+};
+
+
+std::unique_ptr<util::random_read> stream_read(stream::ptr &&s, std::uint8_t filler) noexcept;
+std::unique_ptr<util::random_read> stream_read(stream &s, std::uint8_t filler) noexcept;
+std::unique_ptr<util::random_read_write> stream_read_write(stream::ptr &&s, std::uint8_t filler) noexcept;
+std::unique_ptr<util::random_read_write> stream_read_write(stream &s, std::uint8_t filler) noexcept;
+} // namespace imgtool
-#endif /* STREAM_H */
+#endif // MAME_TOOLS_IMGTOOL_STREAM_H
diff --git a/src/tools/ldresample.cpp b/src/tools/ldresample.cpp
index a7dd165c2f9..f7c5fc8b923 100644
--- a/src/tools/ldresample.cpp
+++ b/src/tools/ldresample.cpp
@@ -8,17 +8,18 @@
****************************************************************************/
-#include <cstdio>
-#include <cctype>
-#include <cstdlib>
-#include <cmath>
-#include <new>
-#include <cassert>
+#include "avhuff.h"
#include "bitmap.h"
#include "chd.h"
-#include "avhuff.h"
#include "vbiparse.h"
+#include <cassert>
+#include <cctype>
+#include <cmath>
+#include <cstdio>
+#include <cstdlib>
+#include <new>
+
//**************************************************************************
@@ -156,22 +157,22 @@ inline uint32_t sample_number_to_field(const movie_info &info, uint32_t samplenu
// information about it
//-------------------------------------------------
-static chd_error open_chd(chd_file &file, const char *filename, movie_info &info)
+static std::error_condition open_chd(chd_file &file, const char *filename, movie_info &info)
{
// open the file
- chd_error chderr = file.open(filename);
- if (chderr != CHDERR_NONE)
+ std::error_condition chderr = file.open(filename);
+ if (chderr)
{
- fprintf(stderr, "Error opening CHD file: %s\n", chd_file::error_string(chderr));
+ fprintf(stderr, "Error opening CHD file: %s\n", chderr.message().c_str());
return chderr;
}
// get the metadata
std::string metadata;
chderr = file.read_metadata(AV_METADATA_TAG, 0, metadata);
- if (chderr != CHDERR_NONE)
+ if (chderr)
{
- fprintf(stderr, "Error getting A/V metadata: %s\n", chd_file::error_string(chderr));
+ fprintf(stderr, "Error getting A/V metadata: %s\n", chderr.message().c_str());
return chderr;
}
@@ -180,7 +181,7 @@ static chd_error open_chd(chd_file &file, const char *filename, movie_info &info
if (sscanf(metadata.c_str(), AV_METADATA_FORMAT, &fps, &fpsfrac, &width, &height, &interlaced, &channels, &rate) != 7)
{
fprintf(stderr, "Improperly formatted metadata\n");
- return CHDERR_INVALID_DATA;
+ return chd_file::error::INVALID_METADATA;
}
// extract movie info
@@ -197,7 +198,7 @@ static chd_error open_chd(chd_file &file, const char *filename, movie_info &info
info.bitmap.resize(info.width, info.height);
info.lsound.resize(info.samplerate);
info.rsound.resize(info.samplerate);
- return CHDERR_NONE;
+ return std::error_condition();
}
@@ -205,28 +206,28 @@ static chd_error open_chd(chd_file &file, const char *filename, movie_info &info
// create_chd - create a new CHD file
//-------------------------------------------------
-static chd_error create_chd(chd_file_compressor &file, const char *filename, chd_file &source, const movie_info &info)
+static std::error_condition create_chd(chd_file_compressor &file, const char *filename, chd_file &source, const movie_info &info)
{
// create the file
chd_codec_type compression[4] = { CHD_CODEC_AVHUFF };
- chd_error chderr = file.create(filename, source.logical_bytes(), source.hunk_bytes(), source.unit_bytes(), compression);
- if (chderr != CHDERR_NONE)
+ std::error_condition chderr = file.create(filename, source.logical_bytes(), source.hunk_bytes(), source.unit_bytes(), compression);
+ if (chderr)
{
- fprintf(stderr, "Error creating new CHD file: %s\n", chd_file::error_string(chderr));
+ fprintf(stderr, "Error creating new CHD file: %s\n", chderr.message().c_str());
return chderr;
}
// clone the metadata
chderr = file.clone_all_metadata(source);
- if (chderr != CHDERR_NONE)
+ if (chderr)
{
- fprintf(stderr, "Error cloning metadata: %s\n", chd_file::error_string(chderr));
+ fprintf(stderr, "Error cloning metadata: %s\n", chderr.message().c_str());
return chderr;
}
// begin compressing
file.compress_begin();
- return CHDERR_NONE;
+ return std::error_condition();
}
@@ -248,8 +249,8 @@ static bool read_chd(chd_file &file, uint32_t field, movie_info &info, uint32_t
file.codec_configure(CHD_CODEC_AVHUFF, AVHUFF_CODEC_DECOMPRESS_CONFIG, &avconfig);
// read the field
- chd_error chderr = file.read_hunk(field, nullptr);
- return (chderr == CHDERR_NONE);
+ std::error_condition chderr = file.read_hunk(field, nullptr);
+ return !chderr;
}
@@ -524,8 +525,8 @@ int main(int argc, char *argv[])
// open the source file
chd_file srcfile;
movie_info info;
- chd_error err = open_chd(srcfile, srcfilename, info);
- if (err != CHDERR_NONE)
+ std::error_condition err = open_chd(srcfile, srcfilename, info);
+ if (err)
{
fprintf(stderr, "Unable to open file '%s'\n", srcfilename);
return 1;
@@ -563,7 +564,7 @@ int main(int argc, char *argv[])
// loop over all the fields in the source file
double progress, ratio;
osd_ticks_t last_update = 0;
- while (dstfile.compress_continue(progress, ratio) == CHDERR_COMPRESSING)
+ while (dstfile.compress_continue(progress, ratio) == chd_file::error::COMPRESSING)
if (osd_ticks() - last_update > osd_ticks_per_second() / 4)
{
last_update = osd_ticks();
diff --git a/src/tools/ldverify.cpp b/src/tools/ldverify.cpp
index e8df214734c..bb95c3fbad4 100644
--- a/src/tools/ldverify.cpp
+++ b/src/tools/ldverify.cpp
@@ -8,18 +8,19 @@
****************************************************************************/
-#include <cstdio>
-#include <cstdlib>
-#include <cctype>
-#include <new>
-#include <cassert>
-#include "coretmpl.h"
-#include "aviio.h"
#include "avhuff.h"
+#include "aviio.h"
#include "bitmap.h"
#include "chd.h"
+#include "coretmpl.h"
#include "vbiparse.h"
+#include <cassert>
+#include <cctype>
+#include <cstdio>
+#include <cstdlib>
+#include <new>
+
//**************************************************************************
@@ -174,10 +175,10 @@ static void *open_chd(const char *filename, movie_info &info)
auto chd = new chd_file;
// open the file
- chd_error chderr = chd->open(filename);
- if (chderr != CHDERR_NONE)
+ std::error_condition chderr = chd->open(filename);
+ if (chderr)
{
- fprintf(stderr, "Error opening CHD file: %s\n", chd_file::error_string(chderr));
+ fprintf(stderr, "Error opening CHD file: %s\n", chderr.message().c_str());
delete chd;
return nullptr;
}
@@ -185,9 +186,9 @@ static void *open_chd(const char *filename, movie_info &info)
// get the metadata
std::string metadata;
chderr = chd->read_metadata(AV_METADATA_TAG, 0, metadata);
- if (chderr != CHDERR_NONE)
+ if (chderr)
{
- fprintf(stderr, "Error getting A/V metadata: %s\n", chd_file::error_string(chderr));
+ fprintf(stderr, "Error getting A/V metadata: %s\n", chderr.message().c_str());
delete chd;
return nullptr;
}
@@ -251,8 +252,8 @@ static int read_chd(void *file, int frame, bitmap_yuy16 &bitmap, int16_t *lsound
chdfile->codec_configure(CHD_CODEC_AVHUFF, AVHUFF_CODEC_DECOMPRESS_CONFIG, &avconfig);
// read the frame
- chd_error chderr = chdfile->read_hunk(frame * interlace_factor + fieldnum, nullptr);
- if (chderr != CHDERR_NONE)
+ std::error_condition chderr = chdfile->read_hunk(frame * interlace_factor + fieldnum, nullptr);
+ if (chderr)
return false;
// account for samples read
diff --git a/src/tools/pngcmp.cpp b/src/tools/pngcmp.cpp
index 43fc9324a06..624023425af 100644
--- a/src/tools/pngcmp.cpp
+++ b/src/tools/pngcmp.cpp
@@ -73,15 +73,15 @@ static int generate_png_diff(const std::string& imgfile1, const std::string& img
bitmap_argb32 finalbitmap;
int width, height, maxwidth;
util::core_file::ptr file;
- osd_file::error filerr;
+ std::error_condition filerr;
util::png_error pngerr;
int error = 100;
/* open the source image */
filerr = util::core_file::open(imgfile1, OPEN_FLAG_READ, file);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
- printf("Could not open %s (%d)\n", imgfile1.c_str(), int(filerr));
+ printf("Could not open %s (%s)\n", imgfile1.c_str(), filerr.message().c_str());
goto error;
}
@@ -96,9 +96,9 @@ static int generate_png_diff(const std::string& imgfile1, const std::string& img
/* open the source image */
filerr = util::core_file::open(imgfile2, OPEN_FLAG_READ, file);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
- printf("Could not open %s (%d)\n", imgfile2.c_str(), int(filerr));
+ printf("Could not open %s (%s)\n", imgfile2.c_str(), filerr.message().c_str());
goto error;
}
@@ -171,9 +171,9 @@ static int generate_png_diff(const std::string& imgfile1, const std::string& img
/* write the final PNG */
filerr = util::core_file::open(outfilename, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, file);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
- printf("Could not open %s (%d)\n", outfilename.c_str(), int(filerr));
+ printf("Could not open %s (%s)\n", outfilename.c_str(), filerr.message().c_str());
goto error;
}
pngerr = util::png_write_bitmap(*file, nullptr, finalbitmap, 0, nullptr);
diff --git a/src/tools/regrep.cpp b/src/tools/regrep.cpp
index a8877c54899..b0072accfab 100644
--- a/src/tools/regrep.cpp
+++ b/src/tools/regrep.cpp
@@ -239,7 +239,7 @@ int main(int argc, char *argv[])
/* read the template file into an astring */
std::string tempheader;
- if (util::core_file::load(tempfilename.c_str(), &buffer, bufsize) == osd_file::error::NONE)
+ if (!util::core_file::load(tempfilename.c_str(), &buffer, bufsize))
{
tempheader.assign((const char *)buffer, bufsize);
free(buffer);
@@ -569,7 +569,7 @@ static util::core_file::ptr create_file_and_output_header(std::string &filename,
util::core_file::ptr file;
/* create the indexfile */
- if (util::core_file::open(filename, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS | OPEN_FLAG_NO_BOM, file) != osd_file::error::NONE)
+ if (util::core_file::open(filename, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS | OPEN_FLAG_NO_BOM, file))
return util::core_file::ptr();
/* print a header */
@@ -730,7 +730,7 @@ static int compare_screenshots(summary_file *curfile)
if (curfile->status[listnum] == STATUS_SUCCESS)
{
std::string fullname;
- osd_file::error filerr;
+ std::error_condition filerr;
util::core_file::ptr file;
/* get the filename for the image */
@@ -740,7 +740,7 @@ static int compare_screenshots(summary_file *curfile)
filerr = util::core_file::open(fullname, OPEN_FLAG_READ, file);
/* if that failed, look in the old location */
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
/* get the filename for the image */
fullname = string_format("%s" PATH_SEPARATOR "snap" PATH_SEPARATOR "_%s.png", lists[listnum].dir, curfile->name);
@@ -750,7 +750,7 @@ static int compare_screenshots(summary_file *curfile)
}
/* if that worked, load the file */
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
{
util::png_read_bitmap(*file, bitmaps[listnum]);
file.reset();
@@ -838,7 +838,7 @@ static int generate_png_diff(const summary_file *curfile, std::string &destdir,
int width, height, maxwidth;
int bitmapcount = 0;
util::core_file::ptr file;
- osd_file::error filerr;
+ std::error_condition filerr;
util::png_error pngerr;
int error = -1;
int starty;
@@ -855,7 +855,7 @@ static int generate_png_diff(const summary_file *curfile, std::string &destdir,
/* open the source image */
filerr = util::core_file::open(tempname, OPEN_FLAG_READ, file);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
goto error;
/* load the source image */
@@ -926,7 +926,7 @@ static int generate_png_diff(const summary_file *curfile, std::string &destdir,
/* write the final PNG */
filerr = util::core_file::open(dstfilename, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, file);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
goto error;
pngerr = util::png_write_bitmap(*file, nullptr, finalbitmap, 0, nullptr);
file.reset();
diff --git a/src/tools/romcmp.cpp b/src/tools/romcmp.cpp
index 4862f74a769..b65889c70a1 100644
--- a/src/tools/romcmp.cpp
+++ b/src/tools/romcmp.cpp
@@ -8,25 +8,20 @@
***************************************************************************/
+#include "hash.h"
+#include "path.h"
#include "unzip.h"
+
#include "osdfile.h"
#include "osdcomm.h"
-#include "hash.h"
#include <cstdarg>
#include <cstdlib>
+#include <memory>
#define MAX_FILES 1000
-#ifndef MAX_FILENAME_LEN
-#define MAX_FILENAME_LEN 255
-#endif
-
-#ifndef PATH_DELIM
-#define PATH_DELIM '/'
-#endif
-
/* compare modes when one file is twice as long as the other */
@@ -105,382 +100,383 @@ static void compatiblemodes(int mode,int *start,int *end)
struct fileinfo
{
- char name[MAX_FILENAME_LEN+1];
+ std::string name;
int size;
- unsigned char *buf; /* file is read in here */
+ std::unique_ptr<unsigned char []> buf; // file is read in here
int listed;
-};
-
-static fileinfo files[2][MAX_FILES];
-static float matchscore[MAX_FILES][MAX_FILES][TOTAL_MODES][TOTAL_MODES];
-static bool is_ascii_char(int ch)
-{
- return (ch >= 0x20 && ch < 0x7f) || (ch == '\n') || (ch == '\r') || (ch == '\t');
-}
-
-static void checkintegrity(const fileinfo *file, int side, bool all_hashes)
-{
- if (file->buf == nullptr) return;
-
- if (all_hashes)
+ static constexpr bool is_ascii_char(int ch)
{
- util::crc32_creator crc32;
- util::sha1_creator sha1;
- util::sum16_creator sum16;
- crc32.append(file->buf, file->size);
- sha1.append(file->buf, file->size);
- sum16.append(file->buf, file->size);
- printf("%-23s %-23s [0x%x] CRC(%s) SHA1(%s) SUM(%s)\n", (side & 1) ? file->name : "", (side & 2) ? file->name : "", file->size,
- crc32.finish().as_string().c_str(), sha1.finish().as_string().c_str(), sum16.finish().as_string().c_str());
- side = 0;
+ return (ch >= 0x20 && ch < 0x7f) || (ch == '\n') || (ch == '\r') || (ch == '\t');
}
- /* check for bad data lines */
- unsigned mask0 = 0x0000;
- unsigned mask1 = 0xffff;
- bool is_ascii = true;
- for (unsigned i = 0; i < file->size; i += 2)
+ void checkintegrity(int side, bool all_hashes) const
{
- is_ascii = is_ascii && is_ascii_char(file->buf[i]);
- mask0 |= file->buf[i] << 8;
- mask1 &= (file->buf[i] << 8) | 0x00ff;
- if (i < file->size - 1)
+ if (!buf)
+ return;
+
+ if (all_hashes)
{
- is_ascii = is_ascii && is_ascii_char(file->buf[i+1]);
- mask0 |= file->buf[i+1];
- mask1 &= file->buf[i+1] | 0xff00;
+ util::crc32_creator crc32;
+ util::sha1_creator sha1;
+ util::sum16_creator sum16;
+ crc32.append(buf.get(), size);
+ sha1.append(buf.get(), size);
+ sum16.append(buf.get(), size);
+ printf("%-23s %-23s [0x%x] CRC(%s) SHA1(%s) SUM(%s)\n",
+ (side & 1) ? name.c_str() : "",
+ (side & 2) ? name.c_str() : "",
+ size,
+ crc32.finish().as_string().c_str(),
+ sha1.finish().as_string().c_str(),
+ sum16.finish().as_string().c_str());
+ side = 0;
}
- if (mask0 == 0xffff && mask1 == 0x0000) break;
- }
-
- if (is_ascii && mask0 == 0x7f7f && mask1 == 0)
- {
- printf("%-23s %-23s ASCII TEXT FILE\n", (side & 1) ? file->name : "", (side & 2) ? file->name : "");
- return;
- }
- if (mask0 != 0xffff || mask1 != 0x0000)
- {
- int fixedmask;
- int bits;
+ // check for bad data lines
+ unsigned mask0 = 0x0000;
+ unsigned mask1 = 0xffff;
- fixedmask = (~mask0 | mask1) & 0xffff;
+ bool is_ascii = true;
+ for (unsigned i = 0; i < size; i += 2)
+ {
+ is_ascii = is_ascii && is_ascii_char(buf[i]);
+ mask0 |= buf[i] << 8;
+ mask1 &= (buf[i] << 8) | 0x00ff;
+ if (i < size - 1)
+ {
+ is_ascii = is_ascii && is_ascii_char(buf[i+1]);
+ mask0 |= buf[i+1];
+ mask1 &= buf[i+1] | 0xff00;
+ }
+ if (mask0 == 0xffff && mask1 == 0x0000) break;
+ }
- if (((mask0 >> 8) & 0xff) == (mask0 & 0xff) && ((mask1 >> 8) & 0xff) == (mask1 & 0xff))
- bits = 8;
- else bits = 16;
+ if (is_ascii && mask0 == 0x7f7f && mask1 == 0)
+ {
+ printf("%-23s %-23s ASCII TEXT FILE\n", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "");
+ return;
+ }
- printf("%-23s %-23s FIXED BITS (", (side & 1) ? file->name : "", (side & 2) ? file->name : "");
- for (int i = 0; i < bits; i++)
+ if (mask0 != 0xffff || mask1 != 0x0000)
{
- if (~mask0 & 0x8000) printf("0");
- else if (mask1 & 0x8000) printf("1");
- else printf("x");
+ int fixedmask;
+ int bits;
- mask0 <<= 1;
- mask1 <<= 1;
- }
- printf(")\n");
+ fixedmask = (~mask0 | mask1) & 0xffff;
- /* if the file contains a fixed value, we don't need to do the other */
- /* validity checks */
- if (fixedmask == 0xffff || fixedmask == 0x00ff || fixedmask == 0xff00)
- return;
- }
+ if (((mask0 >> 8) & 0xff) == (mask0 & 0xff) && ((mask1 >> 8) & 0xff) == (mask1 & 0xff))
+ bits = 8;
+ else bits = 16;
- unsigned addrbit = 1;
- unsigned addrmirror = 0;
- while (addrbit <= file->size/2)
- {
- unsigned i = 0;
- for (i = 0; i < file->size; i++)
+ printf("%-23s %-23s FIXED BITS (", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "");
+ for (int i = 0; i < bits; i++)
+ {
+ if (~mask0 & 0x8000) printf("0");
+ else if (mask1 & 0x8000) printf("1");
+ else printf("x");
+
+ mask0 <<= 1;
+ mask1 <<= 1;
+ }
+ printf(")\n");
+
+ /* if the file contains a fixed value, we don't need to do the other */
+ /* validity checks */
+ if (fixedmask == 0xffff || fixedmask == 0x00ff || fixedmask == 0xff00)
+ return;
+ }
+
+ unsigned addrbit = 1;
+ unsigned addrmirror = 0;
+ while (addrbit <= size/2)
{
- if ((i ^ addrbit) < file->size && file->buf[i] != file->buf[i ^ addrbit]) break;
+ unsigned i = 0;
+ for (i = 0; i < size; i++)
+ {
+ if ((i ^ addrbit) < size && buf[i] != buf[i ^ addrbit]) break;
+ }
+
+ if (i == size)
+ addrmirror |= addrbit;
+
+ addrbit <<= 1;
}
- if (i == file->size)
- addrmirror |= addrbit;
+ if (addrmirror != 0)
+ {
+ if (addrmirror == size/2)
+ {
+ printf("%-23s %-23s 1ST AND 2ND HALF IDENTICAL\n", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "");
+ util::hash_collection hash;
+ hash.begin();
+ hash.buffer(buf.get(), size / 2);
+ hash.end();
+ printf("%-23s %-23s %s\n", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "", hash.attribute_string().c_str());
+ }
+ else
+ {
+ printf("%-23s %-23s BADADDR", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "");
+ for (int i = 0; i < 24; i++)
+ {
+ if (size <= (1<<(23-i))) printf(" ");
+ else if (addrmirror & 0x800000) printf("-");
+ else printf("x");
+ addrmirror <<= 1;
+ }
+ printf("\n");
+ }
+ return;
+ }
- addrbit <<= 1;
- }
+ unsigned sizemask = 1;
+ while (sizemask < size - 1)
+ sizemask = (sizemask << 1) | 1;
- if (addrmirror != 0)
- {
- if (addrmirror == file->size/2)
+ mask0 = 0x000000;
+ mask1 = sizemask;
+ for (unsigned i = 0; i < size; i++)
{
- printf("%-23s %-23s 1ST AND 2ND HALF IDENTICAL\n", (side & 1) ? file->name : "", (side & 2) ? file->name : "");
- util::hash_collection hash;
- hash.begin();
- hash.buffer(file->buf, file->size / 2);
- hash.end();
- printf("%-23s %-23s %s\n", (side & 1) ? file->name : "", (side & 2) ? file->name : "", hash.attribute_string().c_str());
+ if (buf[i] != 0xff)
+ {
+ mask0 |= i;
+ mask1 &= i;
+ if (mask0 == sizemask && mask1 == 0x00) break;
+ }
}
- else
+
+ if (mask0 != sizemask || mask1 != 0x00)
{
- printf("%-23s %-23s BADADDR", (side & 1) ? file->name : "", (side & 2) ? file->name : "");
+ printf("%-23s %-23s ", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "");
for (int i = 0; i < 24; i++)
{
- if (file->size <= (1<<(23-i))) printf(" ");
- else if (addrmirror & 0x800000) printf("-");
+ if (size <= (1<<(23-i))) printf(" ");
+ else if (~mask0 & 0x800000) printf("1");
+ else if (mask1 & 0x800000) printf("0");
else printf("x");
- addrmirror <<= 1;
+ mask0 <<= 1;
+ mask1 <<= 1;
}
- printf("\n");
+ printf(" = 0xFF\n");
+
+ return;
}
- return;
- }
- unsigned sizemask = 1;
- while (sizemask < file->size - 1)
- sizemask = (sizemask << 1) | 1;
- mask0 = 0x000000;
- mask1 = sizemask;
- for (unsigned i = 0; i < file->size; i++)
- {
- if (file->buf[i] != 0xff)
+ mask0 = 0x000000;
+ mask1 = sizemask;
+ for (unsigned i = 0; i < size; i++)
{
- mask0 |= i;
- mask1 &= i;
- if (mask0 == sizemask && mask1 == 0x00) break;
+ if (buf[i] != 0x00)
+ {
+ mask0 |= i;
+ mask1 &= i;
+ if (mask0 == sizemask && mask1 == 0x00) break;
+ }
}
- }
- if (mask0 != sizemask || mask1 != 0x00)
- {
- printf("%-23s %-23s ", (side & 1) ? file->name : "", (side & 2) ? file->name : "");
- for (int i = 0; i < 24; i++)
+ if (mask0 != sizemask || mask1 != 0x00)
{
- if (file->size <= (1<<(23-i))) printf(" ");
- else if (~mask0 & 0x800000) printf("1");
- else if (mask1 & 0x800000) printf("0");
- else printf("x");
- mask0 <<= 1;
- mask1 <<= 1;
- }
- printf(" = 0xFF\n");
-
- return;
- }
+ printf("%-23s %-23s ", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "");
+ for (int i = 0; i < 24; i++)
+ {
+ if (size <= (1<<(23-i))) printf(" ");
+ else if ((mask0 & 0x800000) == 0) printf("1");
+ else if (mask1 & 0x800000) printf("0");
+ else printf("x");
+ mask0 <<= 1;
+ mask1 <<= 1;
+ }
+ printf(" = 0x00\n");
+ return;
+ }
- mask0 = 0x000000;
- mask1 = sizemask;
- for (unsigned i = 0; i < file->size; i++)
- {
- if (file->buf[i] != 0x00)
+ mask0 = 0xff;
+ for (unsigned i = 0; i < size/4 && mask0 != 0x00; i++)
{
- mask0 |= i;
- mask1 &= i;
- if (mask0 == sizemask && mask1 == 0x00) break;
+ if (buf[ 2*i ] != 0x00) mask0 &= ~0x01;
+ if (buf[ 2*i ] != 0xff) mask0 &= ~0x02;
+ if (buf[ 2*i+1] != 0x00) mask0 &= ~0x04;
+ if (buf[ 2*i+1] != 0xff) mask0 &= ~0x08;
+ if (buf[size/2 + 2*i ] != 0x00) mask0 &= ~0x10;
+ if (buf[size/2 + 2*i ] != 0xff) mask0 &= ~0x20;
+ if (buf[size/2 + 2*i+1] != 0x00) mask0 &= ~0x40;
+ if (buf[size/2 + 2*i+1] != 0xff) mask0 &= ~0x80;
}
+
+ if (mask0 & 0x01) printf("%-23s %-23s 1ST HALF = 00xx\n", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "");
+ if (mask0 & 0x02) printf("%-23s %-23s 1ST HALF = FFxx\n", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "");
+ if (mask0 & 0x04) printf("%-23s %-23s 1ST HALF = xx00\n", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "");
+ if (mask0 & 0x08) printf("%-23s %-23s 1ST HALF = xxFF\n", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "");
+ if (mask0 & 0x10) printf("%-23s %-23s 2ND HALF = 00xx\n", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "");
+ if (mask0 & 0x20) printf("%-23s %-23s 2ND HALF = FFxx\n", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "");
+ if (mask0 & 0x40) printf("%-23s %-23s 2ND HALF = xx00\n", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "");
+ if (mask0 & 0x80) printf("%-23s %-23s 2ND HALF = xxFF\n", (side & 1) ? name.c_str() : "", (side & 2) ? name.c_str() : "");
}
- if (mask0 != sizemask || mask1 != 0x00)
+ int usedbytes(int mode) const
{
- printf("%-23s %-23s ", (side & 1) ? file->name : "", (side & 2) ? file->name : "");
- for (int i = 0; i < 24; i++)
+ switch (mode)
{
- if (file->size <= (1<<(23-i))) printf(" ");
- else if ((mask0 & 0x800000) == 0) printf("1");
- else if (mask1 & 0x800000) printf("0");
- else printf("x");
- mask0 <<= 1;
- mask1 <<= 1;
+ case MODE_A:
+ case MODE_NIB1:
+ case MODE_NIB2:
+ return size;
+ case MODE_12:
+ case MODE_22:
+ case MODE_E:
+ case MODE_O:
+ return size / 2;
+ case MODE_14:
+ case MODE_24:
+ case MODE_34:
+ case MODE_44:
+ case MODE_E12:
+ case MODE_O12:
+ case MODE_E22:
+ case MODE_O22:
+ return size / 4;
+ default:
+ return 0;
}
- printf(" = 0x00\n");
-
- return;
}
- mask0 = 0xff;
- for (unsigned i = 0; i < file->size/4 && mask0 != 0x00; i++)
+ void basemultmask(int mode, int &base, int &mult, int &mask) const
{
- if (file->buf[ 2*i ] != 0x00) mask0 &= ~0x01;
- if (file->buf[ 2*i ] != 0xff) mask0 &= ~0x02;
- if (file->buf[ 2*i+1] != 0x00) mask0 &= ~0x04;
- if (file->buf[ 2*i+1] != 0xff) mask0 &= ~0x08;
- if (file->buf[file->size/2 + 2*i ] != 0x00) mask0 &= ~0x10;
- if (file->buf[file->size/2 + 2*i ] != 0xff) mask0 &= ~0x20;
- if (file->buf[file->size/2 + 2*i+1] != 0x00) mask0 &= ~0x40;
- if (file->buf[file->size/2 + 2*i+1] != 0xff) mask0 &= ~0x80;
- }
+ mult = 1;
+ if (mode >= MODE_E)
+ mult = 2;
- if (mask0 & 0x01) printf("%-23s %-23s 1ST HALF = 00xx\n", (side & 1) ? file->name : "", (side & 2) ? file->name : "");
- if (mask0 & 0x02) printf("%-23s %-23s 1ST HALF = FFxx\n", (side & 1) ? file->name : "", (side & 2) ? file->name : "");
- if (mask0 & 0x04) printf("%-23s %-23s 1ST HALF = xx00\n", (side & 1) ? file->name : "", (side & 2) ? file->name : "");
- if (mask0 & 0x08) printf("%-23s %-23s 1ST HALF = xxFF\n", (side & 1) ? file->name : "", (side & 2) ? file->name : "");
- if (mask0 & 0x10) printf("%-23s %-23s 2ND HALF = 00xx\n", (side & 1) ? file->name : "", (side & 2) ? file->name : "");
- if (mask0 & 0x20) printf("%-23s %-23s 2ND HALF = FFxx\n", (side & 1) ? file->name : "", (side & 2) ? file->name : "");
- if (mask0 & 0x40) printf("%-23s %-23s 2ND HALF = xx00\n", (side & 1) ? file->name : "", (side & 2) ? file->name : "");
- if (mask0 & 0x80) printf("%-23s %-23s 2ND HALF = xxFF\n", (side & 1) ? file->name : "", (side & 2) ? file->name : "");
-}
-
-
-static int usedbytes(const fileinfo *file,int mode)
-{
- switch (mode)
- {
- case MODE_A:
- case MODE_NIB1:
- case MODE_NIB2:
- return file->size;
- case MODE_12:
- case MODE_22:
- case MODE_E:
- case MODE_O:
- return file->size / 2;
- case MODE_14:
- case MODE_24:
- case MODE_34:
- case MODE_44:
- case MODE_E12:
- case MODE_O12:
- case MODE_E22:
- case MODE_O22:
- return file->size / 4;
- default:
- return 0;
+ switch (mode)
+ {
+ case MODE_A:
+ case MODE_12:
+ case MODE_14:
+ case MODE_E:
+ case MODE_E12:
+ base = 0; mask = 0xff; break;
+ case MODE_NIB1:
+ base = 0; mask = 0x0f; break;
+ case MODE_NIB2:
+ base = 0; mask = 0xf0; break;
+ case MODE_O:
+ case MODE_O12:
+ base = 1; mask = 0xff; break;
+ case MODE_22:
+ case MODE_E22:
+ base = size / 2; mask = 0xff; break;
+ case MODE_O22:
+ base = 1 + size / 2; mask = 0xff; break;
+ case MODE_24:
+ base = size / 4; mask = 0xff; break;
+ case MODE_34:
+ base = 2*size / 4; mask = 0xff; break;
+ case MODE_44:
+ base = 3*size / 4; mask = 0xff; break;
+ }
}
-}
-
-static void basemultmask(const fileinfo *file,int mode,int *base,int *mult,int *mask)
-{
- *mult = 1;
- if (mode >= MODE_E) *mult = 2;
- switch (mode)
+ float compare(const fileinfo &file2, int mode1, int mode2) const
{
- case MODE_A:
- case MODE_12:
- case MODE_14:
- case MODE_E:
- case MODE_E12:
- *base = 0; *mask = 0xff; break;
- case MODE_NIB1:
- *base = 0; *mask = 0x0f; break;
- case MODE_NIB2:
- *base = 0; *mask = 0xf0; break;
- case MODE_O:
- case MODE_O12:
- *base = 1; *mask = 0xff; break;
- case MODE_22:
- case MODE_E22:
- *base = file->size / 2; *mask = 0xff; break;
- case MODE_O22:
- *base = 1 + file->size / 2; *mask = 0xff; break;
- case MODE_24:
- *base = file->size / 4; *mask = 0xff; break;
- case MODE_34:
- *base = 2*file->size / 4; *mask = 0xff; break;
- case MODE_44:
- *base = 3*file->size / 4; *mask = 0xff; break;
- }
-}
-
-static float filecompare(const fileinfo *file1,const fileinfo *file2,int mode1,int mode2)
-{
- int i;
- int match = 0;
- int size1,size2;
- int base1=0,base2=0,mult1=0,mult2=0,mask1=0,mask2=0;
+ if (!buf || !file2.buf)
+ return 0.0;
+ int const size1 = usedbytes(mode1);
+ int const size2 = file2.usedbytes(mode2);
- if (file1->buf == nullptr || file2->buf == nullptr) return 0.0;
+ if (size1 != size2)
+ return 0.0;
- size1 = usedbytes(file1,mode1);
- size2 = usedbytes(file2,mode2);
+ int base1=0, base2=0, mult1=0, mult2=0, mask1=0, mask2=0;
+ basemultmask(mode1, base1, mult1, mask1);
+ file2.basemultmask(mode2, base2, mult2, mask2);
- if (size1 != size2) return 0.0;
-
- basemultmask(file1,mode1,&base1,&mult1,&mask1);
- basemultmask(file2,mode2,&base2,&mult2,&mask2);
-
- if (mask1 == mask2)
- {
- if (mask1 == 0xff)
- {
- /* normal compare */
- for (i = 0;i < size1;i++)
- if (file1->buf[base1 + mult1 * i] == file2->buf[base2 + mult2 * i]) match++;
- }
- else
+ int match = 0;
+ if (mask1 == mask2)
{
- /* nibble compare, abort if other half is not empty */
- for (i = 0;i < size1;i++)
+ if (mask1 == 0xff)
+ {
+ // normal compare
+ for (int i = 0; i < size1; i++)
+ if (buf[base1 + mult1 * i] == file2.buf[base2 + mult2 * i]) match++;
+ }
+ else
{
- if (((file1->buf[base1 + mult1 * i] & ~mask1) != (0x00 & ~mask1) &&
- (file1->buf[base1 + mult1 * i] & ~mask1) != (0xff & ~mask1)) ||
- ((file2->buf[base1 + mult1 * i] & ~mask2) != (0x00 & ~mask2) &&
- (file2->buf[base1 + mult1 * i] & ~mask2) != (0xff & ~mask2)))
+ // nibble compare, abort if other half is not empty
+ for (int i = 0; i < size1; i++)
{
- match = 0;
- break;
+ if (((buf[base1 + mult1 * i] & ~mask1) != (0x00 & ~mask1) &&
+ (buf[base1 + mult1 * i] & ~mask1) != (0xff & ~mask1)) ||
+ ((file2.buf[base1 + mult1 * i] & ~mask2) != (0x00 & ~mask2) &&
+ (file2.buf[base1 + mult1 * i] & ~mask2) != (0xff & ~mask2)))
+ {
+ match = 0;
+ break;
+ }
+ if ((buf[base1 + mult1 * i] & mask1) == (file2.buf[base2 + mult2 * i] & mask2)) match++;
}
- if ((file1->buf[base1 + mult1 * i] & mask1) == (file2->buf[base2 + mult2 * i] & mask2)) match++;
}
}
- }
- return (float)match / size1;
-}
+ return float(match) / size1;
+ }
+ void readfile(const char *path)
+ {
+ std::string fullname(path ? path : "");
+ util::path_append(fullname, name);
-static void readfile(const char *path,fileinfo *file)
-{
- osd_file::error filerr;
- uint64_t filesize;
- uint32_t actual;
- char fullname[256];
- osd_file::ptr f;
+ buf.reset(new (std::nothrow) unsigned char [size]);
+ if (!buf)
+ {
+ printf("%s: out of memory!\n", name.c_str());
+ return;
+ }
- if (path)
- {
- char delim[2] = { PATH_DELIM, '\0' };
- strcpy(fullname,path);
- strcat(fullname,delim);
- }
- else fullname[0] = 0;
- strcat(fullname,file->name);
+ std::error_condition filerr;
+ osd_file::ptr f;
+ uint64_t filesize;
- if ((file->buf = (unsigned char *)malloc(file->size)) == nullptr)
- {
- printf("%s: out of memory!\n",file->name);
- return;
- }
+ filerr = osd_file::open(fullname, OPEN_FLAG_READ, f, filesize);
+ if (filerr)
+ {
+ printf("%s: error %s\n", fullname.c_str(), filerr.message().c_str());
+ return;
+ }
- filerr = osd_file::open(fullname, OPEN_FLAG_READ, f, filesize);
- if (filerr != osd_file::error::NONE)
- {
- printf("%s: error %d\n", fullname, int(filerr));
- return;
+ uint32_t actual;
+ filerr = f->read(buf.get(), 0, size, actual);
+ if (filerr)
+ {
+ printf("%s: error %s\n", fullname.c_str(), filerr.message().c_str());
+ return;
+ }
}
- filerr = f->read(file->buf, 0, file->size, actual);
- if (filerr != osd_file::error::NONE)
+ void free()
{
- printf("%s: error %d\n", fullname, int(filerr));
- return;
+ buf.reset();
}
-}
-
+};
-static void freefile(fileinfo *file)
-{
- free(file->buf);
- file->buf = nullptr;
-}
+static fileinfo files[2][MAX_FILES];
+static float matchscore[MAX_FILES][MAX_FILES][TOTAL_MODES][TOTAL_MODES];
-static void printname(const fileinfo *file1,const fileinfo *file2,float score,int mode1,int mode2)
+static void printname(const fileinfo *file1, const fileinfo *file2, float score, int mode1, int mode2)
{
- printf("%-12s %s %-12s %s ",file1 ? file1->name : "",modenames[mode1],file2 ? file2->name : "",modenames[mode2]);
+ printf(
+ "%-12s %s %-12s %s ",
+ file1 ? file1->name.c_str() : "",
+ modenames[mode1],
+ file2 ? file2->name.c_str() : "",
+ modenames[mode2]);
if (score == 0.0f) printf("NO MATCH\n");
else if (score == 1.0f) printf("IDENTICAL\n");
- else printf("%3.6f%%\n",(double) (score*100));
+ else printf("%3.6f%%\n", double(score*100));
}
@@ -496,24 +492,23 @@ static int load_files(int i, int *found, const char *path)
while ((d = dir->read()) != nullptr)
{
const char *d_name = d->name;
- char buf[255+1];
+ const std::string buf(util::path_concat(path, d_name)); // FIXME: is this even used for anything?
- sprintf(buf, "%s%c%s", path, PATH_DELIM, d_name);
if (d->type == osd::directory::entry::entry_type::FILE)
{
uint64_t size = d->size;
while (size && (size & 1) == 0) size >>= 1;
//if (size & ~1)
- // printf("%-23s %-23s ignored (not a ROM)\n",i ? "" : d_name,i ? d_name : "");
+ // printf("%-23s %-23s ignored (not a ROM)\n", i ? "" : d_name, i ? d_name : "");
//else
{
- strcpy(files[i][found[i]].name,d_name);
+ files[i][found[i]].name = d_name;
files[i][found[i]].size = d->size;
- readfile(path,&files[i][found[i]]);
+ files[i][found[i]].readfile(path);
files[i][found[i]].listed = 0;
if (found[i] >= MAX_FILES)
{
- printf("%s: max of %d files exceeded\n",path,MAX_FILES);
+ printf("%s: max of %d files exceeded\n", path, MAX_FILES);
break;
}
found[i]++;
@@ -522,15 +517,13 @@ static int load_files(int i, int *found, const char *path)
}
dir.reset();
}
-
- /* if not, try to open as a ZIP file */
else
{
+ /* if not, try to open as a ZIP file */
util::archive_file::ptr zip;
/* wasn't a directory, so try to open it as a zip file */
- if ((util::archive_file::open_zip(path, zip) != util::archive_file::error::NONE) &&
- (util::archive_file::open_7z(path, zip) != util::archive_file::error::NONE))
+ if (util::archive_file::open_zip(path, zip) && util::archive_file::open_7z(path, zip))
{
printf("Error, cannot open zip file '%s' !\n", path);
return 1;
@@ -552,26 +545,26 @@ static int load_files(int i, int *found, const char *path)
}
else
{
- fileinfo *file = &files[i][found[i]];
+ fileinfo &file = files[i][found[i]];
const char *delim = strrchr(zip->current_name().c_str(), '/');
if (delim)
- strcpy (file->name,delim+1);
+ file.name = delim + 1;
else
- strcpy(file->name,zip->current_name().c_str());
- file->size = zip->current_uncompressed_length();
- if ((file->buf = (unsigned char *)malloc(file->size)) == nullptr)
- printf("%s: out of memory!\n",file->name);
+ file.name = zip->current_name();
+ file.size = zip->current_uncompressed_length();
+ file.buf.reset(new (std::nothrow) unsigned char [file.size]);
+ if (!file.buf)
+ {
+ printf("%s: out of memory!\n", file.name.c_str());
+ }
else
{
- if (zip->decompress(file->buf, file->size) != util::archive_file::error::NONE)
- {
- free(file->buf);
- file->buf = nullptr;
- }
+ if (zip->decompress(file.buf.get(), file.size))
+ file.free();
}
- file->listed = 0;
+ file.listed = 0;
if (found[i] >= MAX_FILES)
{
printf("%s: max of %d files exceeded\n",path,MAX_FILES);
@@ -612,13 +605,8 @@ int CLIB_DECL main(int argc,char *argv[])
}
{
- int found[2];
- int i,j,mode1,mode2;
- int besti,bestj;
-
-
- found[0] = found[1] = 0;
- for (i = 0;i < 2;i++)
+ int found[2] = { 0, 0 };
+ for (int i = 0; i < 2; i++)
{
if (argc > i+1)
{
@@ -633,26 +621,26 @@ int CLIB_DECL main(int argc,char *argv[])
else
printf("%d files\n",found[0]);
- for (i = 0; i < 2; i++)
+ for (int i = 0; i < 2; i++)
{
- for (j = 0; j < found[i]; j++)
+ for (int j = 0; j < found[i]; j++)
{
- checkintegrity(&files[i][j], 1 << i, all_hashes);
+ files[i][j].checkintegrity(1 << i, all_hashes);
}
}
if (argc < 3)
{
- /* find duplicates in one dir */
- for (i = 0;i < found[0];i++)
+ // find duplicates in one dir
+ for (int i = 0;i < found[0];i++)
{
- for (j = i+1;j < found[0];j++)
+ for (int j = i+1;j < found[0];j++)
{
- for (mode1 = 0;mode1 < total_modes;mode1++)
+ for (int mode1 = 0;mode1 < total_modes;mode1++)
{
- for (mode2 = 0;mode2 < total_modes;mode2++)
+ for (int mode2 = 0;mode2 < total_modes;mode2++)
{
- if (filecompare(&files[0][i],&files[0][j],mode1,mode2) == 1.0f)
+ if (files[0][i].compare(files[0][j],mode1,mode2) == 1.0f)
printname(&files[0][i],&files[0][j],1.0,mode1,mode2);
}
}
@@ -661,40 +649,38 @@ int CLIB_DECL main(int argc,char *argv[])
}
else
{
- /* compare two dirs */
- for (i = 0;i < found[0];i++)
+ // compare two dirs
+ for (int i = 0;i < found[0];i++)
{
- for (j = 0;j < found[1];j++)
+ for (int j = 0;j < found[1];j++)
{
fprintf(stderr,"%2d%%\r",100*(i*found[1]+j)/(found[0]*found[1]));
- for (mode1 = 0;mode1 < total_modes;mode1++)
+ for (int mode1 = 0;mode1 < total_modes;mode1++)
{
- for (mode2 = 0;mode2 < total_modes;mode2++)
+ for (int mode2 = 0;mode2 < total_modes;mode2++)
{
- matchscore[i][j][mode1][mode2] = filecompare(&files[0][i],&files[1][j],mode1,mode2);
+ matchscore[i][j][mode1][mode2] = files[0][i].compare(files[1][j],mode1,mode2);
}
}
}
}
fprintf(stderr," \r");
+ int besti;
do
{
- float bestscore;
- int bestmode1,bestmode2;
-
besti = -1;
- bestj = -1;
- bestscore = 0.0;
- bestmode1 = bestmode2 = -1;
+ int bestj = -1;
+ float bestscore = 0.0;
+ int bestmode1 = -1, bestmode2 = -1;
- for (mode1 = 0;mode1 < total_modes;mode1++)
+ for (int mode1 = 0;mode1 < total_modes;mode1++)
{
- for (mode2 = 0;mode2 < total_modes;mode2++)
+ for (int mode2 = 0;mode2 < total_modes;mode2++)
{
- for (i = 0;i < found[0];i++)
+ for (int i = 0;i < found[0];i++)
{
- for (j = 0;j < found[1];j++)
+ for (int j = 0;j < found[1];j++)
{
if (matchscore[i][j][mode1][mode2] > bestscore
|| (matchscore[i][j][mode1][mode2] == 1.0f && mode2 == 0 && bestmode2 > 0))
@@ -721,17 +707,17 @@ int CLIB_DECL main(int argc,char *argv[])
matchscore[besti][bestj][bestmode1][bestmode2] = 0.0;
/* remove all matches using the same sections with a worse score */
- for (j = 0;j < found[1];j++)
+ for (int j = 0;j < found[1];j++)
{
- for (mode2 = 0;mode2 < total_modes;mode2++)
+ for (int mode2 = 0;mode2 < total_modes;mode2++)
{
if (matchscore[besti][j][bestmode1][mode2] < bestscore)
matchscore[besti][j][bestmode1][mode2] = 0.0;
}
}
- for (i = 0;i < found[0];i++)
+ for (int i = 0;i < found[0];i++)
{
- for (mode1 = 0;mode1 < total_modes;mode1++)
+ for (int mode1 = 0;mode1 < total_modes;mode1++)
{
if (matchscore[i][bestj][mode1][bestmode2] < bestscore)
matchscore[i][bestj][mode1][bestmode2] = 0.0;
@@ -740,49 +726,50 @@ int CLIB_DECL main(int argc,char *argv[])
/* remove all matches using incompatible sections */
compatiblemodes(bestmode1,&start,&end);
- for (j = 0;j < found[1];j++)
+ for (int j = 0;j < found[1];j++)
{
- for (mode2 = 0;mode2 < total_modes;mode2++)
+ for (int mode2 = 0;mode2 < total_modes;mode2++)
{
- for (mode1 = 0;mode1 < start;mode1++)
+ for (int mode1 = 0;mode1 < start;mode1++)
matchscore[besti][j][mode1][mode2] = 0.0;
- for (mode1 = end+1;mode1 < total_modes;mode1++)
+ for (int mode1 = end+1;mode1 < total_modes;mode1++)
matchscore[besti][j][mode1][mode2] = 0.0;
}
}
compatiblemodes(bestmode2,&start,&end);
- for (i = 0;i < found[0];i++)
+ for (int i = 0;i < found[0];i++)
{
- for (mode1 = 0;mode1 < total_modes;mode1++)
+ for (int mode1 = 0;mode1 < total_modes;mode1++)
{
- for (mode2 = 0;mode2 < start;mode2++)
+ for (int mode2 = 0;mode2 < start;mode2++)
matchscore[i][bestj][mode1][mode2] = 0.0;
- for (mode2 = end+1;mode2 < total_modes;mode2++)
+ for (int mode2 = end+1;mode2 < total_modes;mode2++)
matchscore[i][bestj][mode1][mode2] = 0.0;
}
}
}
- } while (besti != -1);
+ }
+ while (besti != -1);
- for (i = 0;i < found[0];i++)
+ for (int i = 0;i < found[0];i++)
{
if (files[0][i].listed == 0) printname(&files[0][i],nullptr,0.0,0,0);
}
- for (i = 0;i < found[1];i++)
+ for (int i = 0;i < found[1];i++)
{
if (files[1][i].listed == 0) printname(nullptr,&files[1][i],0.0,0,0);
}
}
- for (i = 0;i < found[0];i++)
+ for (int i = 0;i < found[0];i++)
{
- freefile(&files[0][i]);
+ files[0][i].free();
}
- for (i = 0;i < found[1];i++)
+ for (int i = 0;i < found[1];i++)
{
- freefile(&files[1][i]);
+ files[1][i].free();
}
}
diff --git a/src/tools/split.cpp b/src/tools/split.cpp
index f8a8eb79234..24953c3d7cd 100644
--- a/src/tools/split.cpp
+++ b/src/tools/split.cpp
@@ -66,7 +66,7 @@ static int split_file(const char *filename, const char *basename, uint32_t split
void *splitbuffer = nullptr;
int index, partnum;
uint64_t totallength;
- osd_file::error filerr;
+ std::error_condition filerr;
int error = 1;
// convert split size to MB
@@ -79,7 +79,7 @@ static int split_file(const char *filename, const char *basename, uint32_t split
// open the file for read
filerr = util::core_file::open(filename, OPEN_FLAG_READ, infile);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
fprintf(stderr, "Fatal error: unable to open file '%s'\n", filename);
goto cleanup;
@@ -117,7 +117,7 @@ static int split_file(const char *filename, const char *basename, uint32_t split
// create the split file
filerr = util::core_file::open(splitfilename, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_NO_BOM, splitfile);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
fprintf(stderr, "Fatal error: unable to create split file '%s'\n", splitfilename.c_str());
goto cleanup;
@@ -153,7 +153,7 @@ static int split_file(const char *filename, const char *basename, uint32_t split
// create it
filerr = util::core_file::open(outfilename, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, outfile);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
printf("\n");
fprintf(stderr, "Fatal error: unable to create output file '%s'\n", outfilename.c_str());
@@ -216,7 +216,7 @@ static int join_file(const char *filename, const char *outname, int write_output
std::string basepath;
util::core_file::ptr outfile, infile, splitfile;
void *splitbuffer = nullptr;
- osd_file::error filerr;
+ std::error_condition filerr;
uint32_t splitsize;
char buffer[256];
int error = 1;
@@ -224,7 +224,7 @@ static int join_file(const char *filename, const char *outname, int write_output
// open the file for read
filerr = util::core_file::open(filename, OPEN_FLAG_READ, splitfile);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
fprintf(stderr, "Fatal error: unable to open file '%s'\n", filename);
goto cleanup;
@@ -264,7 +264,7 @@ static int join_file(const char *filename, const char *outname, int write_output
{
// don't overwrite the original!
filerr = util::core_file::open(outfilename, OPEN_FLAG_READ, outfile);
- if (filerr == osd_file::error::NONE)
+ if (!filerr)
{
outfile.reset();
fprintf(stderr, "Fatal error: output file '%s' already exists\n", outfilename.c_str());
@@ -273,7 +273,7 @@ static int join_file(const char *filename, const char *outname, int write_output
// open the output for write
filerr = util::core_file::open(outfilename, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, outfile);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
fprintf(stderr, "Fatal error: unable to create file '%s'\n", outfilename.c_str());
goto cleanup;
@@ -301,7 +301,7 @@ static int join_file(const char *filename, const char *outname, int write_output
// read the file's contents
infilename.insert(0, basepath);
filerr = util::core_file::load(infilename.c_str(), &splitbuffer, length);
- if (filerr != osd_file::error::NONE)
+ if (filerr)
{
printf("\n");
fprintf(stderr, "Fatal error: unable to load file '%s'\n", infilename.c_str());
diff --git a/src/tools/srcclean.cpp b/src/tools/srcclean.cpp
index 7f52c3c6feb..85cf28a22a2 100644
--- a/src/tools/srcclean.cpp
+++ b/src/tools/srcclean.cpp
@@ -38,6 +38,9 @@
may have spacing adjusted in a way that affects behaviour when
uncommented
+ Known JSON limitations:
+ * Doesn't detect invalid numbers or literals
+
Known XML limitations:
* No special handling for CDATA
* No special handling for processing instructions
@@ -102,14 +105,20 @@ protected:
static constexpr char32_t HORIZONTAL_TAB = 0x0000'0009U;
static constexpr char32_t LINE_FEED = 0x0000'000aU;
static constexpr char32_t VERTICAL_TAB = 0x0000'000bU;
+ static constexpr char32_t FORM_FEED = 0x0000'000cU;
+ static constexpr char32_t C0_CONTROL_LAST = 0x0000'001fU;
static constexpr char32_t SPACE = 0x0000'0020U;
static constexpr char32_t DOUBLE_QUOTE = 0x0000'0022U;
static constexpr char32_t SINGLE_QUOTE = 0x0000'0027U;
+ static constexpr char32_t ASTERISK = 0x0000'002aU;
static constexpr char32_t HYPHEN_MINUS = 0x0000'002dU;
+ static constexpr char32_t SLASH = 0x0000'002fU;
static constexpr char32_t QUESTION_MARK = 0x0000'003fU;
static constexpr char32_t BACKSLASH = 0x0000'005cU;
static constexpr char32_t BASIC_LATIN_LAST = 0x0000'007fU;
static constexpr char32_t CYRILLIC_SUPPLEMENT_LAST = 0x0000'052fU;
+ static constexpr char32_t LINE_SEPARATOR = 0x0000'2028U;
+ static constexpr char32_t PARAGRAPH_SEPARATOR = 0x0000'2029U;
template <typename OutputIt>
cleaner_base(OutputIt &&output, newline newline_mode, unsigned tab_width);
@@ -825,8 +834,6 @@ protected:
void output_character(char32_t ch);
private:
- static constexpr char32_t ASTERISK = 0x0000'002aU;
- static constexpr char32_t SLASH = 0x0000'002fU;
static constexpr char32_t UPPERCASE_FIRST = 0x0000'0041U;
static constexpr char32_t UPPERCASE_B = 0x0000'0042U;
static constexpr char32_t UPPERCASE_X = 0x0000'0058U;
@@ -1741,6 +1748,289 @@ void lua_cleaner::process_long_string_constant(char32_t ch)
/***************************************************************************
+ JSON DATA CLEANER CLASS
+***************************************************************************/
+
+class json_cleaner : public cleaner_base
+{
+public:
+ template <typename OutputIt>
+ json_cleaner(OutputIt &&output, newline newline_mode, unsigned tab_width);
+
+ virtual bool affected() const override;
+ virtual void summarise(std::ostream &os) const override;
+
+protected:
+ void output_character(char32_t ch);
+
+private:
+ enum class parse_state
+ {
+ DEFAULT,
+ COMMENT,
+ LINE_COMMENT,
+ STRING_CONSTANT
+ };
+
+ virtual void process_characters(char32_t const *begin, char32_t const *end) override;
+ virtual void input_complete() override;
+
+ void process_default(char32_t ch);
+ void process_comment(char32_t ch);
+ void process_line_comment(char32_t ch);
+ void process_text(char32_t ch);
+
+ parse_state m_parse_state = parse_state::DEFAULT;
+ std::uint64_t m_input_line = 1U;
+ bool m_escape = false;
+ std::uint64_t m_comment_line = 0U;
+
+ std::uint64_t m_tabs_escaped = 0U;
+ std::uint64_t m_newlines_escaped = 0U;
+ std::uint64_t m_form_feeds_escaped = 0U;
+ std::uint64_t m_line_separators_escaped = 0U;
+ std::uint64_t m_paragraph_separators_escaped = 0U;
+ std::uint64_t m_c0_control_escaped = 0U;
+ std::uint64_t m_non_ascii = 0U;
+};
+
+
+template <typename OutputIt>
+json_cleaner::json_cleaner(
+ OutputIt &&output,
+ newline newline_mode,
+ unsigned tab_width)
+ : cleaner_base(std::forward<OutputIt>(output), newline_mode, tab_width)
+{
+}
+
+
+bool json_cleaner::affected() const
+{
+ return
+ cleaner_base::affected() ||
+ m_tabs_escaped ||
+ m_newlines_escaped ||
+ m_form_feeds_escaped ||
+ m_line_separators_escaped ||
+ m_paragraph_separators_escaped ||
+ m_c0_control_escaped ||
+ m_non_ascii;
+}
+
+
+void json_cleaner::summarise(std::ostream &os) const
+{
+ cleaner_base::summarise(os);
+ if (m_tabs_escaped)
+ util::stream_format(os, "%1$u tab(s) escaped\n", m_tabs_escaped);
+ if (m_newlines_escaped)
+ util::stream_format(os, "%1$u line feed(s) escaped\n", m_newlines_escaped);
+ if (m_form_feeds_escaped)
+ util::stream_format(os, "%1$u form feed(s) escaped\n", m_form_feeds_escaped);
+ if (m_line_separators_escaped)
+ util::stream_format(os, "%1$u line separator(s) escaped\n", m_line_separators_escaped);
+ if (m_paragraph_separators_escaped)
+ util::stream_format(os, "%1$u paragraph separator(s) escaped\n", m_paragraph_separators_escaped);
+ if (m_c0_control_escaped)
+ util::stream_format(os, "%1$u C0 control character(s) escaped\n", m_c0_control_escaped);
+ if (m_non_ascii)
+ util::stream_format(os, "%1$u non-ASCII character(s) replaced\n", m_non_ascii);
+}
+
+
+void json_cleaner::output_character(char32_t ch)
+{
+ switch (m_parse_state)
+ {
+ case parse_state::DEFAULT:
+ if (BASIC_LATIN_LAST < ch)
+ {
+ ++m_non_ascii;
+ ch = QUESTION_MARK;
+ }
+ break;
+ case parse_state::COMMENT:
+ case parse_state::LINE_COMMENT:
+ case parse_state::STRING_CONSTANT:
+ break;
+ }
+
+ cleaner_base::output_character(ch);
+}
+
+
+void json_cleaner::process_characters(char32_t const *begin, char32_t const *end)
+{
+ while (begin != end)
+ {
+ char32_t const ch(*begin++);
+ switch (m_parse_state)
+ {
+ case parse_state::DEFAULT:
+ process_default(ch);
+ break;
+ case parse_state::COMMENT:
+ process_comment(ch);
+ break;
+ case parse_state::LINE_COMMENT:
+ process_line_comment(ch);
+ break;
+ case parse_state::STRING_CONSTANT:
+ process_text(ch);
+ break;
+ }
+
+ if (LINE_FEED == ch)
+ ++m_input_line;
+ }
+}
+
+
+void json_cleaner::input_complete()
+{
+ switch (m_parse_state)
+ {
+ case parse_state::COMMENT:
+ throw std::runtime_error(util::string_format("unterminated multi-line comment beginning on line %1$u", m_comment_line));
+ case parse_state::STRING_CONSTANT:
+ throw std::runtime_error(util::string_format("unterminated string literal on line %1$u", m_input_line));
+ default:
+ break;
+ }
+}
+
+
+void json_cleaner::process_default(char32_t ch)
+{
+ switch (ch)
+ {
+ case DOUBLE_QUOTE:
+ m_parse_state = parse_state::STRING_CONSTANT;
+ break;
+ case ASTERISK:
+ if (m_escape)
+ {
+ m_parse_state = parse_state::COMMENT;
+ m_comment_line = m_input_line;
+ set_tab_limit();
+ }
+ break;
+ case SLASH:
+ if (m_escape)
+ m_parse_state = parse_state::LINE_COMMENT;
+ break;
+ }
+ m_escape = (SLASH == ch) && !m_escape;
+ output_character(ch);
+}
+
+
+void json_cleaner::process_comment(char32_t ch)
+{
+ switch (ch)
+ {
+ case SLASH:
+ if (m_escape)
+ {
+ m_parse_state = parse_state::DEFAULT;
+ m_comment_line = 0U;
+ output_character(ch);
+ reset_tab_limit();
+ }
+ else
+ {
+ output_character(ch);
+ }
+ m_escape = false;
+ break;
+ default:
+ m_escape = ASTERISK == ch;
+ output_character(ch);
+ }
+}
+
+
+void json_cleaner::process_line_comment(char32_t ch)
+{
+ switch (ch)
+ {
+ case LINE_FEED:
+ m_parse_state = parse_state::DEFAULT;
+ [[fallthrough]];
+ default:
+ output_character(ch);
+ }
+}
+
+
+void json_cleaner::process_text(char32_t ch)
+{
+ switch (ch)
+ {
+ case HORIZONTAL_TAB:
+ ++m_tabs_escaped;
+ if (!m_escape)
+ output_character(BACKSLASH);
+ output_character(char32_t(std::uint8_t('t')));
+ break;
+ case LINE_FEED:
+ ++m_newlines_escaped;
+ if (!m_escape)
+ output_character(BACKSLASH);
+ output_character(char32_t(std::uint8_t('n')));
+ break;
+ case FORM_FEED:
+ ++m_form_feeds_escaped;
+ if (!m_escape)
+ output_character(BACKSLASH);
+ output_character(char32_t(std::uint8_t('f')));
+ break;
+ case LINE_SEPARATOR:
+ ++m_line_separators_escaped;
+ if (!m_escape)
+ output_character(BACKSLASH);
+ output_character(char32_t(std::uint8_t('u')));
+ output_character(char32_t(std::uint8_t('2')));
+ output_character(char32_t(std::uint8_t('0')));
+ output_character(char32_t(std::uint8_t('2')));
+ output_character(char32_t(std::uint8_t('8')));
+ break;
+ case PARAGRAPH_SEPARATOR:
+ ++m_paragraph_separators_escaped;
+ if (!m_escape)
+ output_character(BACKSLASH);
+ output_character(char32_t(std::uint8_t('u')));
+ output_character(char32_t(std::uint8_t('2')));
+ output_character(char32_t(std::uint8_t('0')));
+ output_character(char32_t(std::uint8_t('2')));
+ output_character(char32_t(std::uint8_t('9')));
+ break;
+ default:
+ if (C0_CONTROL_LAST >= ch)
+ {
+ ++m_c0_control_escaped;
+ if (!m_escape)
+ output_character(BACKSLASH);
+ output_character(char32_t(std::uint8_t('u')));
+ output_character(char32_t(std::uint8_t('0')));
+ output_character(char32_t(std::uint8_t('0')));
+ output_character(char32_t(std::uint8_t('0') + (ch / 0x10U)));
+ output_character(char32_t(std::uint8_t('0') + (ch % 0x10U)));
+ }
+ else
+ {
+ output_character(ch);
+ if (!m_escape && (DOUBLE_QUOTE == ch))
+ m_parse_state = parse_state::DEFAULT;
+ }
+ }
+ m_escape = (BACKSLASH == ch) && !m_escape;
+}
+
+
+
+/***************************************************************************
XML DATA CLEANER CLASS
***************************************************************************/
@@ -1894,6 +2184,13 @@ bool is_lua_source_extension(char const *ext)
}
+bool is_json_extension(char const *ext)
+{
+ return
+ !core_stricmp(ext, ".json");
+}
+
+
bool is_xml_extension(char const *ext)
{
return
@@ -1915,7 +2212,7 @@ int main(int argc, char *argv[])
{
bool keep_backup(false);
bool dry_run(false);
-#if defined(WIN32)
+#if defined(_WIN32)
cleaner_base::newline newline_mode(cleaner_base::newline::DOS);
#else
cleaner_base::newline newline_mode(cleaner_base::newline::UNIX);
@@ -1957,13 +2254,13 @@ int main(int argc, char *argv[])
{
// open the file
util::core_file::ptr infile;
- osd_file::error const err(util::core_file::open(argv[i], OPEN_FLAG_READ, infile));
- if (osd_file::error::NONE != err)
+ std::error_condition const err(util::core_file::open(argv[i], OPEN_FLAG_READ, infile));
+ if (err)
{
if (affected)
std::cerr << std::endl;
affected = true;
- util::stream_format(std::cerr, "Can't open %1$s\n", argv[i]);
+ util::stream_format(std::cerr, "Can't open %1$s (%2$s)\n", argv[i], err.message());
++failures;
continue;
}
@@ -1974,12 +2271,15 @@ int main(int argc, char *argv[])
char const *const ext(std::strrchr(argv[i], '.'));
bool const is_c_file(ext && is_c_source_extension(ext));
bool const is_lua_file(ext && is_lua_source_extension(ext));
+ bool const is_json_file(ext && is_json_extension(ext));
bool const is_xml_file(ext && is_xml_extension(ext));
std::unique_ptr<cleaner_base> cleaner;
if (is_c_file)
cleaner = std::make_unique<cpp_cleaner>(std::back_inserter(output), newline_mode, 4U);
else if (is_lua_file)
cleaner = std::make_unique<lua_cleaner>(std::back_inserter(output), newline_mode, 4U);
+ else if (is_json_file)
+ cleaner = std::make_unique<json_cleaner>(std::back_inserter(output), newline_mode, 4U);
else if (is_xml_file)
cleaner = std::make_unique<xml_cleaner>(std::back_inserter(output), newline_mode, 4U);
else
diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp
index 14e7dbf2c6d..dca4793aeac 100644
--- a/src/tools/unidasm.cpp
+++ b/src/tools/unidasm.cpp
@@ -185,6 +185,7 @@ using util::BIT;
#include "cpu/v60/v60d.h"
#include "cpu/v810/v810dasm.h"
#include "cpu/v850/v850dasm.h"
+#include "cpu/vax/vaxdasm.h"
#include "cpu/vt50/vt50dasm.h"
#include "cpu/vt61/vt61dasm.h"
#include "cpu/we32000/we32100d.h"
@@ -197,6 +198,7 @@ using util::BIT;
#include "corefile.h"
#include "corestr.h"
#include "eminline.h"
+#include "endianness.h"
#include <algorithm>
#include <cctype>
@@ -334,12 +336,13 @@ struct nec_unidasm_t : nec_disassembler::config
} nec_unidasm;
-enum endianness { le, be };
+static constexpr auto le = util::endianness::little;
+static constexpr auto be = util::endianness::big;
struct dasm_table_entry
{
const char * name;
- endianness endian;
+ util::endianness endian;
int8_t pcshift;
std::function<util::disasm_interface *()> alloc;
};
@@ -636,6 +639,7 @@ static const dasm_table_entry dasm_table[] =
{ "v850", le, 0, []() -> util::disasm_interface * { return new v850_disassembler; } },
{ "v850es", le, 0, []() -> util::disasm_interface * { return new v850es_disassembler; } },
{ "v850e2", le, 0, []() -> util::disasm_interface * { return new v850e2_disassembler; } },
+ { "vax", le, 0, []() -> util::disasm_interface * { return new vax_disassembler; } },
{ "vt50", le, 0, []() -> util::disasm_interface * { return new vt50_disassembler; } },
{ "vt52", le, 0, []() -> util::disasm_interface * { return new vt52_disassembler; } },
{ "vt61", le, -1, []() -> util::disasm_interface * { return new vt61_disassembler; } },
@@ -1219,9 +1223,9 @@ int main(int argc, char *argv[])
void *data = nullptr;
u32 length = 0;
if(std::strcmp(opts.filename, "-") != 0) {
- osd_file::error filerr = util::core_file::load(opts.filename, &data, length);
- if(filerr != osd_file::error::NONE) {
- std::fprintf(stderr, "Error opening file '%s'\n", opts.filename);
+ std::error_condition filerr = util::core_file::load(opts.filename, &data, length);
+ if(filerr) {
+ std::fprintf(stderr, "Error opening file '%s' (%s)\n", opts.filename, filerr.message().c_str());
return 1;
}
}