diff -Nru fuse-emulator-1.3.6+dfsg1/ChangeLog fuse-emulator-1.3.7+dfsg1/ChangeLog --- fuse-emulator-1.3.6+dfsg1/ChangeLog 2017-06-01 02:54:23.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/ChangeLog 2017-07-02 05:36:42.000000000 +0000 @@ -1,3 +1,24 @@ +2017-07-02 Philip Kendall + + * Fuse 1.3.7 released. + + * New features: + * Add Multiface One/128/3 interface emulation (Gergely Szasz and + Sergio Baldoví). + + * Machine specific improvements: + * Restore +2A/+3 ALL_RAM mode from snapshots (Sergio Baldoví). + + * Miscellaneous improvements: + * SDL: Hide cursor when UI runs on a console (Raspberry Pi) (Sergio + Baldoví). + * Switch to using autoreconf (Fredrick Meunier). + * Use silent builds by default when available (Fredrick Meunier). + * Use explicit AM_SILENT_RULES macro as libspectrum does (Sergio + Baldoví). + * AC_PROG_RANLIB is rendered obsolete by LT_INIT (Sergio Baldoví). + * Remove unnecessary include glib.h (Sergio Baldoví). + 2017-06-01 Philip Kendall * Fuse 1.3.6 released. diff -Nru fuse-emulator-1.3.6+dfsg1/configure fuse-emulator-1.3.7+dfsg1/configure --- fuse-emulator-1.3.6+dfsg1/configure 2017-06-01 02:54:31.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/configure 2017-07-02 05:37:07.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for fuse 1.3.6. +# Generated by GNU Autoconf 2.69 for fuse 1.3.7. # # Report bugs to . # @@ -590,8 +590,8 @@ # Identity of this package. PACKAGE_NAME='fuse' PACKAGE_TARNAME='fuse' -PACKAGE_VERSION='1.3.6' -PACKAGE_STRING='fuse 1.3.6' +PACKAGE_VERSION='1.3.7' +PACKAGE_STRING='fuse 1.3.7' PACKAGE_BUGREPORT='http://sourceforge.net/p/fuse-emulator/bugs/' PACKAGE_URL='http://fuse-emulator.sourceforge.net/' @@ -733,6 +733,7 @@ NMEDIT DSYMUTIL MANIFEST_TOOL +RANLIB ac_ct_AR AR DLLTOOL @@ -753,7 +754,6 @@ LEX_OUTPUT_ROOT LEX PERL -RANLIB am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE @@ -1454,7 +1454,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures fuse 1.3.6 to adapt to many kinds of systems. +\`configure' configures fuse 1.3.7 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1528,7 +1528,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of fuse 1.3.6:";; + short | recursive ) echo "Configuration of fuse 1.3.7:";; esac cat <<\_ACEOF @@ -1689,7 +1689,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -fuse configure 1.3.6 +fuse configure 1.3.7 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2058,7 +2058,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by fuse $as_me 1.3.6, which was +It was created by fuse $as_me 1.3.7, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2997,7 +2997,7 @@ # Define the identity of the package. PACKAGE='fuse' - VERSION='1.3.6' + VERSION='1.3.7' cat >>confdefs.h <<_ACEOF @@ -3056,7 +3056,7 @@ case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 @@ -3088,7 +3088,7 @@ AM_BACKSLASH='\' -FUSE_FULL_VERSION=1.3.6.0 +FUSE_FULL_VERSION=1.3.7.0 FUSE_COPYRIGHT="(c) 1999-2017 Philip Kendall and others" FUSE_URL=http://fuse-emulator.sourceforge.net/ @@ -3096,7 +3096,7 @@ -$as_echo "#define FUSE_RC_VERSION 1,3,6,0" >>confdefs.h +$as_echo "#define FUSE_RC_VERSION 1,3,7,0" >>confdefs.h $as_echo "#define FUSE_COPYRIGHT \"(c) 1999-2017 Philip Kendall and others\"" >>confdefs.h @@ -4208,98 +4208,6 @@ fi -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 @@ -18676,7 +18584,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by fuse $as_me 1.3.6, which was +This file was extended by fuse $as_me 1.3.7, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -18747,7 +18655,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -fuse config.status 1.3.6 +fuse config.status 1.3.7 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -Nru fuse-emulator-1.3.6+dfsg1/configure.ac fuse-emulator-1.3.7+dfsg1/configure.ac --- fuse-emulator-1.3.6+dfsg1/configure.ac 2017-05-31 12:49:29.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/configure.ac 2017-07-02 05:36:42.000000000 +0000 @@ -19,12 +19,12 @@ dnl E-mail: philip-fuse@shadowmagic.org.uk dnl Package version -m4_define([fuse_version], [1.3.6]) +m4_define([fuse_version], [1.3.7]) dnl Product full version m4_define([fuse_major_version], [1]) m4_define([fuse_minor_version], [3]) -m4_define([fuse_micro_version], [6]) +m4_define([fuse_micro_version], [7]) m4_define([fuse_nano_version], [0]) m4_define([fuse_full_version], [fuse_major_version.fuse_minor_version.fuse_micro_version.fuse_nano_version]) m4_define([fuse_rc_version], [fuse_major_version,fuse_minor_version,fuse_micro_version,fuse_nano_version]) @@ -41,8 +41,8 @@ AC_CANONICAL_HOST dnl Use automake to produce `Makefile.in' -AM_INIT_AUTOMAKE([foreign subdir-objects -Wall]) -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES]) +AM_INIT_AUTOMAKE([1.11 foreign subdir-objects -Wall]) +AM_SILENT_RULES([yes]) dnl Substitutions for .in files FUSE_FULL_VERSION=fuse_full_version @@ -60,7 +60,6 @@ dnl Checks for programs. AC_PROG_CC AM_PROG_CC_C_O -AC_PROG_RANLIB AC_PATH_PROG(PERL, perl) AC_SUBST(PERL) AM_PROG_LEX diff -Nru fuse-emulator-1.3.6+dfsg1/data/shell-completion/bash/fuse fuse-emulator-1.3.7+dfsg1/data/shell-completion/bash/fuse --- fuse-emulator-1.3.6+dfsg1/data/shell-completion/bash/fuse 2017-05-31 12:49:29.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/data/shell-completion/bash/fuse 2017-07-02 05:36:42.000000000 +0000 @@ -127,6 +127,7 @@ --rom-pentagon-[0-2]|--rom-pentagon512-[0-3]| \ --rom-pentagon1024-[0-3]|--rom-scorpion-[0-3]|--rom-spec-se-[0-1]| \ --rom-beta128|--rom-didaktik80|--rom-disciple|--rom-interface-1| \ + --rom-multiface1|--rom-multiface128|--rom-multiface3| \ --rom-opus|--rom-plusd|--rom-speccyboot|--rom-usource) _filedir '@(rom|ROM)' return 0 @@ -208,6 +209,7 @@ --microdrive-4-file --microdrive-5-file --microdrive-6-file --microdrive-7-file --microdrive-8-file --mouse-swap-buttons --movie-compr --movie-start --movie-stop-after-rzx + --multiface1 --multiface128 --multiface3 --multiface1-stealth --no-accelerate-loader --no-aspect-hint --no-auto-load --no-autosave-settings --no-beta128 --no-beta128-48boot --no-bw-tv --no-cmos-z80 --no-competition-mode @@ -219,8 +221,9 @@ --no-interface2 --no-issue2 --no-joystick-prompt --no-kempston --no-kempston-mouse --no-keyboard-arrows-shifted --no-late-timings --no-loading-sound --no-mdr-random-len - --no-melodik --no-mouse-swap-buttons - --no-movie-stop-after-rzx --no-opus --no-pal-tv2x + --no-melodik --no-mouse-swap-buttons --no-movie-stop-after-rzx + --no-multiface1 --no-multiface128 --no-multiface3 + --no-multiface1-stealth --no-opus --no-pal-tv2x --no-plus3-detect-speedlock --no-plusd --no-printer --no-raw-s-net --no-recreated-spectrum --no-rs232-handshake --no-rzx-autosaves --no-simpleide --no-slt --no-sound @@ -234,7 +237,8 @@ --printer --rate --raw-s-net --record --recreated-spectrum --rom-128-0 --rom-128-1 --rom-16 --rom-48 --rom-beta128 --rom-didaktik80 --rom-disciple - --rom-interface-1 --rom-opus + --rom-interface-1 --rom-multiface1 --rom-multiface128 + --rom-multiface3 --rom-opus --rom-pentagon-0 --rom-pentagon-1 --rom-pentagon-2 --rom-pentagon512-0 --rom-pentagon512-1 --rom-pentagon512-2 --rom-pentagon512-3 --rom-pentagon1024-0 --rom-pentagon1024-1 diff -Nru fuse-emulator-1.3.6+dfsg1/debian/changelog fuse-emulator-1.3.7+dfsg1/debian/changelog --- fuse-emulator-1.3.6+dfsg1/debian/changelog 2017-06-20 21:24:27.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/debian/changelog 2017-07-13 12:27:31.000000000 +0000 @@ -1,3 +1,18 @@ +fuse-emulator (1.3.7+dfsg1-1) unstable; urgency=medium + + * New upstream release. + * debian/control: + - Build depend on libspectrum 1.3.5. + * debian/rules: + - Use DEB_VERSION_UPSTREAM from pkg-info.mk instead of + dpkg-parsechangelog. + * Refresh the following patches: + - debian/patches/bash-completion.patch + - debian/patches/load-opense-rom.patch + - debian/patches/manpage-errors.patch + + -- Alberto Garcia Thu, 13 Jul 2017 14:27:31 +0200 + fuse-emulator (1.3.6+dfsg1-2) unstable; urgency=medium * Upload to unstable. diff -Nru fuse-emulator-1.3.6+dfsg1/debian/control fuse-emulator-1.3.7+dfsg1/debian/control --- fuse-emulator-1.3.6+dfsg1/debian/control 2017-06-20 21:24:27.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/debian/control 2017-07-13 12:27:31.000000000 +0000 @@ -12,7 +12,7 @@ libsdl1.2-dev, libgtk-3-dev, zlib1g-dev, - libspectrum-dev (>= 1.3.4) + libspectrum-dev (>= 1.3.5) Standards-Version: 3.9.8 Homepage: http://fuse-emulator.sourceforge.net/ diff -Nru fuse-emulator-1.3.6+dfsg1/debian/patches/bash-completion.patch fuse-emulator-1.3.7+dfsg1/debian/patches/bash-completion.patch --- fuse-emulator-1.3.6+dfsg1/debian/patches/bash-completion.patch 2017-06-20 21:24:27.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/debian/patches/bash-completion.patch 2017-07-13 12:27:31.000000000 +0000 @@ -5,7 +5,7 @@ =================================================================== --- fuse-emulator.orig/data/shell-completion/bash/fuse +++ fuse-emulator/data/shell-completion/bash/fuse -@@ -262,4 +262,4 @@ _fuse() +@@ -266,4 +266,4 @@ _fuse() _filedir '@(csw|CSW|ltp|LTP|pzx|PZX|spc|SPC|sta|STA|tap|TAP|tzx|TZX|wav|WAV|slt|SLT|sna?(pshot)|SNA?(PSHOT)|?(mgt)snp|?(MGT)SNP|sp|SP|szx|SZX|z80|Z80|zxs|ZXS|d40|D40|d80|D80|dsk|DSK|img|IMG|fdi|FDI|mgt|MGT|opd|OPD|opu|OPU|sad|SAD|scl|SCL|td0|TD0|trd|TRD|udi|UDI|rzx|RZX|dck|DCK|hdf|HDF|mdr|MDR)' fi } && diff -Nru fuse-emulator-1.3.6+dfsg1/debian/patches/load-opense-rom.patch fuse-emulator-1.3.7+dfsg1/debian/patches/load-opense-rom.patch --- fuse-emulator-1.3.6+dfsg1/debian/patches/load-opense-rom.patch 2017-06-20 21:24:27.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/debian/patches/load-opense-rom.patch 2017-07-13 12:27:31.000000000 +0000 @@ -88,7 +88,7 @@ /* The default settings of options, etc */ settings_info settings_default = { -@@ -365,6 +366,8 @@ read_config_file( settings_info *setting +@@ -372,6 +373,8 @@ read_config_file( settings_info *setting xmlFreeDoc( doc ); diff -Nru fuse-emulator-1.3.6+dfsg1/debian/patches/manpage-errors.patch fuse-emulator-1.3.7+dfsg1/debian/patches/manpage-errors.patch --- fuse-emulator-1.3.6+dfsg1/debian/patches/manpage-errors.patch 2017-06-20 21:24:27.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/debian/patches/manpage-errors.patch 2017-07-13 12:27:31.000000000 +0000 @@ -5,7 +5,7 @@ =================================================================== --- fuse-emulator.orig/man/fuse.1 +++ fuse-emulator/man/fuse.1 -@@ -1515,7 +1515,7 @@ selects the ALSA device used, it can be +@@ -1562,7 +1562,7 @@ selects the ALSA device used, it can be device name. e.g.: .IR default " or " hw:0 " or " tee:plughw:0,\(aq/tmp/out.raw\(aq,raw . See the alsa-lib pcm api reference at @@ -14,7 +14,7 @@ for further explanation. .br .IP \[bu] -@@ -3092,7 +3092,7 @@ Spectrum's power off, and then turning i +@@ -3163,7 +3163,7 @@ Spectrum's power off, and then turning i .RS Choose a type of Spectrum to emulate. An brief overview of the Sinclair, Amstrad and Timex can be found at @@ -23,7 +23,7 @@ while more technical information can be found at .IR "http://www.worldofspectrum.org/faq/reference/reference.htm" , and -@@ -5079,7 +5079,7 @@ Didaktik 80 and Didaktik 40 file formats +@@ -5164,7 +5164,7 @@ Didaktik 80 and Didaktik 40 file formats TR-DOS disk image. TRD and SCL sectors are loaded interleaved, therefore you might experience problems with TR\-DOS ROMs that use the turbo format (sequential sectors); for detailed information please see diff -Nru fuse-emulator-1.3.6+dfsg1/debian/rules fuse-emulator-1.3.7+dfsg1/debian/rules --- fuse-emulator-1.3.6+dfsg1/debian/rules 2017-06-20 21:24:27.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/debian/rules 2017-07-13 12:27:31.000000000 +0000 @@ -44,7 +44,8 @@ dh_auto_clean -B$(BUILD_DIR_GTK) dh_auto_clean -B$(BUILD_DIR_SDL) -VERSION := $(shell dpkg-parsechangelog | sed -ne 's/^Version: \(.*\)-.*/\1/p') +include /usr/share/dpkg/pkg-info.mk +VERSION := $(DEB_VERSION_UPSTREAM) UPSTREAM_VERSION := $(shell echo $(VERSION) | sed 's/+dfsg1//') get-orig-source: diff -Nru fuse-emulator-1.3.6+dfsg1/fuse.c fuse-emulator-1.3.7+dfsg1/fuse.c --- fuse-emulator-1.3.6+dfsg1/fuse.c 2017-05-31 12:49:29.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/fuse.c 2017-07-02 05:36:42.000000000 +0000 @@ -1,5 +1,5 @@ /* fuse.c: The Free Unix Spectrum Emulator - Copyright (c) 1999-2016 Philip Kendall and others + Copyright (c) 1999-2017 Philip Kendall and others This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -80,6 +80,7 @@ #include "peripherals/if2.h" #include "peripherals/kempmouse.h" #include "peripherals/melodik.h" +#include "peripherals/multiface.h" #include "peripherals/printer.h" #include "peripherals/scld.h" #include "peripherals/speccyboot.h" @@ -311,6 +312,7 @@ melodik_register_startup(); memory_register_startup(); mempool_register_startup(); + multiface_register_startup(); opus_register_startup(); plusd_register_startup(); printer_register_startup(); diff -Nru fuse-emulator-1.3.6+dfsg1/infrastructure/startup_manager.h fuse-emulator-1.3.7+dfsg1/infrastructure/startup_manager.h --- fuse-emulator-1.3.6+dfsg1/infrastructure/startup_manager.h 2017-05-31 12:49:29.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/infrastructure/startup_manager.h 2017-07-02 05:36:42.000000000 +0000 @@ -1,5 +1,5 @@ /* startup_manager.h: handle Fuse's startup routines - Copyright (c) 2016 Philip Kendall + Copyright (c) 2016-2017 Philip Kendall This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -51,6 +51,7 @@ STARTUP_MANAGER_MODULE_MELODIK, STARTUP_MANAGER_MODULE_MEMORY, STARTUP_MANAGER_MODULE_MEMPOOL, + STARTUP_MANAGER_MODULE_MULTIFACE, STARTUP_MANAGER_MODULE_OPUS, STARTUP_MANAGER_MODULE_PLUSD, STARTUP_MANAGER_MODULE_PRINTER, diff -Nru fuse-emulator-1.3.6+dfsg1/machines/machines_periph.c fuse-emulator-1.3.7+dfsg1/machines/machines_periph.c --- fuse-emulator-1.3.6+dfsg1/machines/machines_periph.c 2016-11-24 12:02:24.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/machines/machines_periph.c 2017-07-02 05:36:42.000000000 +0000 @@ -200,6 +200,7 @@ periph_set_present( PERIPH_TYPE_INTERFACE1, PERIPH_PRESENT_OPTIONAL ); periph_set_present( PERIPH_TYPE_INTERFACE2, PERIPH_PRESENT_OPTIONAL ); periph_set_present( PERIPH_TYPE_MELODIK, PERIPH_PRESENT_OPTIONAL ); + periph_set_present( PERIPH_TYPE_MULTIFACE_128, PERIPH_PRESENT_OPTIONAL ); periph_set_present( PERIPH_TYPE_OPUS, PERIPH_PRESENT_OPTIONAL ); periph_set_present( PERIPH_TYPE_PLUSD, PERIPH_PRESENT_OPTIONAL ); periph_set_present( PERIPH_TYPE_SPECDRUM, PERIPH_PRESENT_OPTIONAL ); @@ -212,6 +213,7 @@ { base_peripherals_48_128(); periph_set_present( PERIPH_TYPE_FULLER, PERIPH_PRESENT_OPTIONAL ); + periph_set_present( PERIPH_TYPE_MULTIFACE_1, PERIPH_PRESENT_OPTIONAL ); periph_set_present( PERIPH_TYPE_ZXPRINTER, PERIPH_PRESENT_OPTIONAL ); periph_set_present( PERIPH_TYPE_DIDAKTIK80, PERIPH_PRESENT_OPTIONAL ); periph_set_present( PERIPH_TYPE_DISCIPLE, PERIPH_PRESENT_OPTIONAL ); @@ -232,6 +234,7 @@ { base_peripherals(); periph_set_present( PERIPH_TYPE_AY_PLUS3, PERIPH_PRESENT_ALWAYS ); + periph_set_present( PERIPH_TYPE_MULTIFACE_3, PERIPH_PRESENT_OPTIONAL ); periph_set_present( PERIPH_TYPE_PARALLEL_PRINTER, PERIPH_PRESENT_OPTIONAL ); periph_set_present( PERIPH_TYPE_PLUS3_MEMORY, PERIPH_PRESENT_ALWAYS ); } diff -Nru fuse-emulator-1.3.6+dfsg1/machines/specplus3.c fuse-emulator-1.3.7+dfsg1/machines/specplus3.c --- fuse-emulator-1.3.6+dfsg1/machines/specplus3.c 2017-01-31 11:23:00.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/machines/specplus3.c 2017-07-02 05:36:42.000000000 +0000 @@ -288,12 +288,9 @@ } void -specplus3_memoryport2_write( libspectrum_word port GCC_UNUSED, - libspectrum_byte b ) +specplus3_memoryport2_write_internal( libspectrum_word port GCC_UNUSED, + libspectrum_byte b ) { - /* Do nothing else if we've locked the RAM configuration */ - if( machine_current->ram.locked ) return; - /* Let the parallel printer code know about the strobe bit */ printer_parallel_strobe_write( b & 0x10 ); @@ -312,6 +309,15 @@ machine_current->memory_map(); } +void +specplus3_memoryport2_write( libspectrum_word port, libspectrum_byte b ) +{ + /* Do nothing else if we've locked the RAM configuration */ + if( machine_current->ram.locked ) return; + + specplus3_memoryport2_write_internal( port, b ); +} + int specplus3_memory_map( void ) { diff -Nru fuse-emulator-1.3.6+dfsg1/machines/specplus3.h fuse-emulator-1.3.7+dfsg1/machines/specplus3.h --- fuse-emulator-1.3.6+dfsg1/machines/specplus3.h 2017-04-28 11:40:32.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/machines/specplus3.h 2017-07-02 05:36:42.000000000 +0000 @@ -45,6 +45,8 @@ void specplus3_memoryport_write( libspectrum_word port, libspectrum_byte b ); void specplus3_memoryport2_write( libspectrum_word port, libspectrum_byte b ); +void specplus3_memoryport2_write_internal( libspectrum_word port, + libspectrum_byte b ); libspectrum_byte specplus3_fdc_status( libspectrum_word port, libspectrum_byte *attached ); libspectrum_byte specplus3_fdc_read( libspectrum_word port, libspectrum_byte *attached ); diff -Nru fuse-emulator-1.3.6+dfsg1/Makefile.in fuse-emulator-1.3.7+dfsg1/Makefile.in --- fuse-emulator-1.3.6+dfsg1/Makefile.in 2017-06-01 02:54:31.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/Makefile.in 2017-07-02 05:37:07.000000000 +0000 @@ -248,51 +248,52 @@ peripherals/covox.c peripherals/dck.c peripherals/fuller.c \ peripherals/if1.c peripherals/if2.c peripherals/joystick.c \ peripherals/kempmouse.c peripherals/melodik.c \ - peripherals/printer.c peripherals/scld.c \ - peripherals/speccyboot.c peripherals/specdrum.c \ - peripherals/spectranet.c peripherals/ula.c \ - peripherals/usource.c peripherals/disk/beta.c \ - peripherals/disk/crc.c peripherals/disk/didaktik.c \ - peripherals/disk/disciple.c peripherals/disk/disk.c \ - peripherals/disk/fdd.c peripherals/disk/opus.c \ - peripherals/disk/plusd.c peripherals/disk/trdos.c \ - peripherals/disk/upd_fdc.c peripherals/disk/wd_fdc.c \ - peripherals/ide/divide.c peripherals/ide/ide.c \ - peripherals/ide/simpleide.c peripherals/ide/zxatasp.c \ - peripherals/ide/zxcf.c peripherals/nic/enc28j60.c \ - peripherals/flash/am29f010.c peripherals/nic/w5100.c \ - peripherals/nic/w5100_socket.c pokefinder/pokefinder.c \ - pokefinder/pokemem.c sound/blipbuffer.c timer/timer.c \ - ui/fb/fbdisplay.c ui/fb/fbdisplay.h ui/fb/fbjoystick.c \ - ui/fb/fbkeyboard.c ui/fb/fbkeyboard.h ui/fb/fbmouse.c \ - ui/fb/fbmouse.h ui/fb/fbui.c ui/fb/keysyms.c ui/gtk/binary.c \ - ui/gtk/browse.c ui/gtk/confirm.c ui/gtk/debugger.c \ - ui/gtk/fileselector.c ui/gtk/gtkcompat.h ui/gtk/gtkdisplay.c \ - ui/gtk/gtkinternals.h ui/gtk/gtkjoystick.c \ - ui/gtk/gtkkeyboard.c ui/gtk/gtkmouse.c ui/gtk/gtkui.c \ - ui/gtk/keysyms.c ui/gtk/memory.c ui/gtk/menu_data.c \ - ui/gtk/options.c ui/gtk/picture.c ui/gtk/pixmaps.c \ - ui/gtk/pokefinder.c ui/gtk/pokemem.c ui/gtk/rollback.c \ - ui/gtk/roms.c ui/gtk/statusbar.c ui/gtk/stock.c \ - ui/gtk/gtkcompat.c ui/scaler/scaler.c ui/sdl/sdldisplay.c \ - ui/sdl/sdldisplay.h ui/sdl/sdljoystick.c ui/sdl/sdljoystick.h \ - ui/sdl/sdlkeyboard.c ui/sdl/sdlkeyboard.h ui/sdl/sdlui.c \ - ui/sdl/keysyms.c ui/svga/keysyms.c ui/svga/svgadisplay.c \ - ui/svga/svgadisplay.h ui/svga/svgajoystick.c \ - ui/svga/svgakeyboard.c ui/svga/svgakeyboard.h ui/svga/svgaui.c \ - ui/widget/about.c ui/widget/browse.c ui/widget/debugger.c \ - ui/widget/error.c ui/widget/filesel.c ui/widget/memory.c \ - ui/widget/menu.c ui/widget/menu_data.c ui/widget/options.c \ - ui/widget/picture.c ui/widget/pokefinder.c ui/widget/pokemem.c \ - ui/widget/query.c ui/widget/roms.c ui/widget/select.c \ - ui/widget/text.c ui/widget/widget_internals.h \ - ui/widget/widget.c ui/widget/widget.h ui/wii/keysyms.c \ - ui/wii/wiidisplay.c ui/wii/wiidisplay.h ui/wii/wiijoystick.c \ - ui/wii/wiikeyboard.c ui/wii/wiikeyboard.h ui/wii/wiikeysyms.h \ - ui/wii/wiimouse.c ui/wii/wiimouse.h ui/wii/wiiui.c \ - ui/win32/about.c ui/win32/about.h ui/win32/binary.c \ - ui/win32/binary.h ui/win32/browse.c ui/win32/browse.h \ - ui/win32/confirm.c ui/win32/debugger.c ui/win32/debugger.h \ + peripherals/multiface.c peripherals/printer.c \ + peripherals/scld.c peripherals/speccyboot.c \ + peripherals/specdrum.c peripherals/spectranet.c \ + peripherals/ula.c peripherals/usource.c \ + peripherals/disk/beta.c peripherals/disk/crc.c \ + peripherals/disk/didaktik.c peripherals/disk/disciple.c \ + peripherals/disk/disk.c peripherals/disk/fdd.c \ + peripherals/disk/opus.c peripherals/disk/plusd.c \ + peripherals/disk/trdos.c peripherals/disk/upd_fdc.c \ + peripherals/disk/wd_fdc.c peripherals/ide/divide.c \ + peripherals/ide/ide.c peripherals/ide/simpleide.c \ + peripherals/ide/zxatasp.c peripherals/ide/zxcf.c \ + peripherals/nic/enc28j60.c peripherals/flash/am29f010.c \ + peripherals/nic/w5100.c peripherals/nic/w5100_socket.c \ + pokefinder/pokefinder.c pokefinder/pokemem.c \ + sound/blipbuffer.c timer/timer.c ui/fb/fbdisplay.c \ + ui/fb/fbdisplay.h ui/fb/fbjoystick.c ui/fb/fbkeyboard.c \ + ui/fb/fbkeyboard.h ui/fb/fbmouse.c ui/fb/fbmouse.h \ + ui/fb/fbui.c ui/fb/keysyms.c ui/gtk/binary.c ui/gtk/browse.c \ + ui/gtk/confirm.c ui/gtk/debugger.c ui/gtk/fileselector.c \ + ui/gtk/gtkcompat.h ui/gtk/gtkdisplay.c ui/gtk/gtkinternals.h \ + ui/gtk/gtkjoystick.c ui/gtk/gtkkeyboard.c ui/gtk/gtkmouse.c \ + ui/gtk/gtkui.c ui/gtk/keysyms.c ui/gtk/memory.c \ + ui/gtk/menu_data.c ui/gtk/options.c ui/gtk/picture.c \ + ui/gtk/pixmaps.c ui/gtk/pokefinder.c ui/gtk/pokemem.c \ + ui/gtk/rollback.c ui/gtk/roms.c ui/gtk/statusbar.c \ + ui/gtk/stock.c ui/gtk/gtkcompat.c ui/scaler/scaler.c \ + ui/sdl/sdldisplay.c ui/sdl/sdldisplay.h ui/sdl/sdljoystick.c \ + ui/sdl/sdljoystick.h ui/sdl/sdlkeyboard.c ui/sdl/sdlkeyboard.h \ + ui/sdl/sdlui.c ui/sdl/keysyms.c ui/svga/keysyms.c \ + ui/svga/svgadisplay.c ui/svga/svgadisplay.h \ + ui/svga/svgajoystick.c ui/svga/svgakeyboard.c \ + ui/svga/svgakeyboard.h ui/svga/svgaui.c ui/widget/about.c \ + ui/widget/browse.c ui/widget/debugger.c ui/widget/error.c \ + ui/widget/filesel.c ui/widget/memory.c ui/widget/menu.c \ + ui/widget/menu_data.c ui/widget/options.c ui/widget/picture.c \ + ui/widget/pokefinder.c ui/widget/pokemem.c ui/widget/query.c \ + ui/widget/roms.c ui/widget/select.c ui/widget/text.c \ + ui/widget/widget_internals.h ui/widget/widget.c \ + ui/widget/widget.h ui/wii/keysyms.c ui/wii/wiidisplay.c \ + ui/wii/wiidisplay.h ui/wii/wiijoystick.c ui/wii/wiikeyboard.c \ + ui/wii/wiikeyboard.h ui/wii/wiikeysyms.h ui/wii/wiimouse.c \ + ui/wii/wiimouse.h ui/wii/wiiui.c ui/win32/about.c \ + ui/win32/about.h ui/win32/binary.c ui/win32/binary.h \ + ui/win32/browse.c ui/win32/browse.h ui/win32/confirm.c \ + ui/win32/debugger.c ui/win32/debugger.h \ ui/win32/fileselector.c ui/win32/hyperlinks.c \ ui/win32/hyperlinks.h ui/win32/keysyms.c \ ui/win32/memorybrowser.c ui/win32/memorybrowser.h \ @@ -444,8 +445,8 @@ peripherals/fuller.$(OBJEXT) peripherals/if1.$(OBJEXT) \ peripherals/if2.$(OBJEXT) peripherals/joystick.$(OBJEXT) \ peripherals/kempmouse.$(OBJEXT) peripherals/melodik.$(OBJEXT) \ - peripherals/printer.$(OBJEXT) peripherals/scld.$(OBJEXT) \ - peripherals/speccyboot.$(OBJEXT) \ + peripherals/multiface.$(OBJEXT) peripherals/printer.$(OBJEXT) \ + peripherals/scld.$(OBJEXT) peripherals/speccyboot.$(OBJEXT) \ peripherals/specdrum.$(OBJEXT) \ peripherals/spectranet.$(OBJEXT) peripherals/ula.$(OBJEXT) \ peripherals/usource.$(OBJEXT) peripherals/disk/beta.$(OBJEXT) \ @@ -827,24 +828,25 @@ peripherals/covox.c peripherals/dck.c peripherals/fuller.c \ peripherals/if1.c peripherals/if2.c peripherals/joystick.c \ peripherals/kempmouse.c peripherals/melodik.c \ - peripherals/printer.c peripherals/scld.c \ - peripherals/speccyboot.c peripherals/specdrum.c \ - peripherals/spectranet.c peripherals/ula.c \ - peripherals/usource.c peripherals/disk/beta.c \ - peripherals/disk/crc.c peripherals/disk/didaktik.c \ - peripherals/disk/disciple.c peripherals/disk/disk.c \ - peripherals/disk/fdd.c peripherals/disk/opus.c \ - peripherals/disk/plusd.c peripherals/disk/trdos.c \ - peripherals/disk/upd_fdc.c peripherals/disk/wd_fdc.c \ - peripherals/ide/divide.c peripherals/ide/ide.c \ - peripherals/ide/simpleide.c peripherals/ide/zxatasp.c \ - peripherals/ide/zxcf.c $(am__append_16) $(am__append_17) \ - pokefinder/pokefinder.c pokefinder/pokemem.c \ - sound/blipbuffer.c timer/timer.c $(am__append_18) \ - $(am__append_20) ui/scaler/scaler.c $(am__append_24) \ - $(am__append_26) $(am__append_28) $(am__append_31) \ - $(am__append_33) $(am__append_35) unittests/unittests.c \ - z80/z80.c z80/z80_debugger_variables.c z80/z80_ops.c + peripherals/multiface.c peripherals/printer.c \ + peripherals/scld.c peripherals/speccyboot.c \ + peripherals/specdrum.c peripherals/spectranet.c \ + peripherals/ula.c peripherals/usource.c \ + peripherals/disk/beta.c peripherals/disk/crc.c \ + peripherals/disk/didaktik.c peripherals/disk/disciple.c \ + peripherals/disk/disk.c peripherals/disk/fdd.c \ + peripherals/disk/opus.c peripherals/disk/plusd.c \ + peripherals/disk/trdos.c peripherals/disk/upd_fdc.c \ + peripherals/disk/wd_fdc.c peripherals/ide/divide.c \ + peripherals/ide/ide.c peripherals/ide/simpleide.c \ + peripherals/ide/zxatasp.c peripherals/ide/zxcf.c \ + $(am__append_16) $(am__append_17) pokefinder/pokefinder.c \ + pokefinder/pokemem.c sound/blipbuffer.c timer/timer.c \ + $(am__append_18) $(am__append_20) ui/scaler/scaler.c \ + $(am__append_24) $(am__append_26) $(am__append_28) \ + $(am__append_31) $(am__append_33) $(am__append_35) \ + unittests/unittests.c z80/z80.c z80/z80_debugger_variables.c \ + z80/z80_ops.c fuse_LDADD = $(PTHREAD_LIBS) $(LIBSPEC_LIBS) $(GTK_LIBS) $(GLIB_LIBS) \ $(PNG_LIBS) $(SDL_LIBS) $(X_LIBS) $(XML_LIBS) $(am__append_2) \ $(SOUND_LIBS) $(SOUND_LIBADD) $(TIMER_LIBADD) \ @@ -885,25 +887,25 @@ peripherals/covox.h peripherals/dck.h peripherals/fuller.h \ peripherals/if1.h peripherals/if2.h peripherals/joystick.h \ peripherals/kempmouse.h peripherals/melodik.h \ - peripherals/printer.h peripherals/scld.h \ - peripherals/speccyboot.h peripherals/specdrum.h \ - peripherals/spectranet.h peripherals/ula.h \ - peripherals/usource.h peripherals/disk/beta.h \ - peripherals/disk/crc.h peripherals/disk/didaktik.h \ - peripherals/disk/disciple.h peripherals/disk/disk.h \ - peripherals/disk/fdd.h peripherals/disk/opus.h \ - peripherals/disk/plusd.h peripherals/disk/trdos.h \ - peripherals/disk/upd_fdc.h peripherals/disk/wd_fdc.h \ - peripherals/ide/divide.h peripherals/ide/ide.h \ - peripherals/ide/simpleide.h peripherals/ide/zxatasp.h \ - peripherals/ide/zxcf.h peripherals/flash/am29f010.h \ - peripherals/nic/enc28j60.h peripherals/nic/w5100.h \ - peripherals/nic/w5100_internals.h pokefinder/pokefinder.h \ - pokefinder/pokemem.h sound/blipbuffer.h sound/sfifo.h \ - timer/timer.h ui/ui.h ui/uidisplay.h ui/uijoystick.h \ - ui/uimedia.h ui/scaler/scaler.h ui/scaler/scaler_internals.h \ - unittests/unittests.h z80/z80.h z80/z80_checks.h \ - z80/z80_internals.h z80/z80_macros.h + peripherals/multiface.h peripherals/printer.h \ + peripherals/scld.h peripherals/speccyboot.h \ + peripherals/specdrum.h peripherals/spectranet.h \ + peripherals/ula.h peripherals/usource.h \ + peripherals/disk/beta.h peripherals/disk/crc.h \ + peripherals/disk/didaktik.h peripherals/disk/disciple.h \ + peripherals/disk/disk.h peripherals/disk/fdd.h \ + peripherals/disk/opus.h peripherals/disk/plusd.h \ + peripherals/disk/trdos.h peripherals/disk/upd_fdc.h \ + peripherals/disk/wd_fdc.h peripherals/ide/divide.h \ + peripherals/ide/ide.h peripherals/ide/simpleide.h \ + peripherals/ide/zxatasp.h peripherals/ide/zxcf.h \ + peripherals/flash/am29f010.h peripherals/nic/enc28j60.h \ + peripherals/nic/w5100.h peripherals/nic/w5100_internals.h \ + pokefinder/pokefinder.h pokefinder/pokemem.h \ + sound/blipbuffer.h sound/sfifo.h timer/timer.h ui/ui.h \ + ui/uidisplay.h ui/uijoystick.h ui/uimedia.h ui/scaler/scaler.h \ + ui/scaler/scaler_internals.h unittests/unittests.h z80/z80.h \ + z80/z80_checks.h z80/z80_internals.h z80/z80_macros.h EXTRA_DIST = AUTHORS INSTALL PORTING README THANKS keysyms.dat \ keysyms.pl m4/ax_create_stdint_h.m4 m4/ax_pthread.m4 \ m4/gtk-2.0.m4 m4/pkg.m4 m4/sdl.m4 menu_data.dat menu_data.pl \ @@ -1554,6 +1556,8 @@ peripherals/$(DEPDIR)/$(am__dirstamp) peripherals/melodik.$(OBJEXT): peripherals/$(am__dirstamp) \ peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/multiface.$(OBJEXT): peripherals/$(am__dirstamp) \ + peripherals/$(DEPDIR)/$(am__dirstamp) peripherals/printer.$(OBJEXT): peripherals/$(am__dirstamp) \ peripherals/$(DEPDIR)/$(am__dirstamp) peripherals/scld.$(OBJEXT): peripherals/$(am__dirstamp) \ @@ -2079,6 +2083,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@peripherals/$(DEPDIR)/joystick.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@peripherals/$(DEPDIR)/kempmouse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@peripherals/$(DEPDIR)/melodik.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@peripherals/$(DEPDIR)/multiface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@peripherals/$(DEPDIR)/printer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@peripherals/$(DEPDIR)/scld.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@peripherals/$(DEPDIR)/speccyboot.Po@am__quote@ diff -Nru fuse-emulator-1.3.6+dfsg1/man/fuse.1 fuse-emulator-1.3.7+dfsg1/man/fuse.1 --- fuse-emulator-1.3.6+dfsg1/man/fuse.1 2017-06-01 02:54:23.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/man/fuse.1 2017-07-02 05:36:42.000000000 +0000 @@ -23,7 +23,7 @@ .\" E-mail: philip-fuse@shadowmagic.org.uk .\" .\" -.TH fuse 1 "1st June, 2017" "Version 1.3.6" "Emulators" +.TH fuse 1 "2nd July, 2017" "Version 1.3.7" "Emulators" .\" .\"------------------------------------------------------------------ .\" @@ -889,6 +889,38 @@ section. .RE .PP +.B \-\-multiface1 +.RS +Emulate a Romantic Robot Multiface One interface. Same as the General +Peripherals Options dialog's +.I "Multiface One" +option. +.RE +.PP +.B \-\-multiface128 +.RS +Emulate a Romantic Robot Multiface\ 128 interface. Same as the General +Peripherals Options dialog's +.I "Multiface\ 128" +option. +.RE +.PP +.B \-\-multiface3 +.RS +Emulate a Romantic Robot Multiface\ 3 interface. Same as the General +Peripherals Options dialog's +.I "Multiface\ 3" +option. +.RE +.PP +.B \-\-multiface1-stealth +.RS +Set Multiface One stealth/invisible mode. Same as the General Peripherals +Options dialog's +.I "Stealth Multiface One" +option. +.RE +.PP .B \-\-opus .RS Emulate an Opus Discovery interface. Same as the Disk Peripherals Options @@ -1162,6 +1194,15 @@ .B \-\-rom\-disciple .I file .br +.B \-\-rom\-multiface1 +.I file +.br +.B \-\-rom\-multiface128 +.I file +.br +.B \-\-rom\-multiface3 +.I file +.br .B \-\-rom\-opus .I file .br @@ -1183,6 +1224,12 @@ .RI ( didaktik80.rom ), the DISCiPLE ROM .RI ( disciple.rom ), +the Multiface\ One ROM +.RI ( mf1.rom ), +the Multiface\ 128 ROM +.RI ( mf128.rom ), +the Multiface\ 3 ROM +.RI ( mf3.rom ), the Opus Discovery ROM .RI ( opus.rom ), the SpeccyBoot ROM @@ -2505,6 +2552,30 @@ unpredictable behaviour will occur. .RE .PP +.I "Multiface One" +.RS +If this option is selected, Fuse will emulate the Romantic Robot +Multiface One. Available for 16K, 48K, Timex TC2048, 128K, +2 and SE machines. +.RE +.PP +.I "Multiface\ 128" +.RS +If this option is selected, Fuse will emulate the Romantic Robot +Multiface\ 128. Available for 16K, 48K, Timex TC2048, 128K, +2 and SE machines. +.RE +.PP +.I "Multiface\ 3" +.RS +If this option is selected, Fuse will emulate the Romantic Robot +Multiface\ 3. Available for +2A, +3 and +3e machines. +.RE +.PP +.I "Stealth Multiface One" +.RS +This option controls the `invisible' or `stealth' mode of Multiface One, +as the physical switch on the side of the interface. +.RE +.PP .I "Emulate printers" .RS If this option is selected, Fuse will emulate a printer. See the @@ -3244,6 +3315,11 @@ NMI menu correctly. This bug is not present in G+DOS on the +D. .RE .PP +.I "Machine, Multiface Red Button" +.RS +Presses the Multiface One/128/3 red button to active the interface. +.RE +.PP .I "Machine, Didaktik SNAP" .RS Presses the Didaktik 80 (or Didaktik 40)'s `SNAP' button. @@ -4413,6 +4489,13 @@ The Interface\ 1 shadow ROM is paged into or out of memory. .RE .br +multiface:page +.br +multiface:unpage +.RS +The Multiface One/128/3 is paged into or out of memory respectively. +.RE +.br opus:page .br opus:unpage @@ -4679,6 +4762,8 @@ .RI ` "DivIDE RAM" "'," .RI ` If1 "'," .RI ` If2 "'," +.RI ` "Multiface RAM" "'," +.RI ` "Multiface ROM" "'," .RI ` "Opus RAM" "'," .RI ` "Opus ROM" "'," .RI ` "PlusD RAM" "'," diff -Nru fuse-emulator-1.3.6+dfsg1/memory_pages.c fuse-emulator-1.3.7+dfsg1/memory_pages.c --- fuse-emulator-1.3.6+dfsg1/memory_pages.c 2017-01-31 11:23:00.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/memory_pages.c 2017-07-02 05:36:42.000000000 +0000 @@ -35,6 +35,7 @@ #include "infrastructure/startup_manager.h" #include "machines/pentagon.h" #include "machines/spec128.h" +#include "machines/specplus3.h" #include "memory_pages.h" #include "module.h" #include "peripherals/disk/opus.h" @@ -540,7 +541,7 @@ if( ( capabilities & LIBSPECTRUM_MACHINE_CAPABILITY_PLUS3_MEMORY ) || ( capabilities & LIBSPECTRUM_MACHINE_CAPABILITY_SCORP_MEMORY ) ) - specplus3_memoryport2_write( + specplus3_memoryport2_write_internal( 0x1ffd, libspectrum_snap_out_plus3_memoryport( snap ) ); } diff -Nru fuse-emulator-1.3.6+dfsg1/menu.c fuse-emulator-1.3.7+dfsg1/menu.c --- fuse-emulator-1.3.6+dfsg1/menu.c 2017-01-31 11:23:00.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/menu.c 2017-07-02 05:36:42.000000000 +0000 @@ -5,6 +5,7 @@ Copyright (c) 2015 Stuart Brady Copyright (c) 2015-2017 Gergely Szasz Copyright (c) 2015 Stefano Bodrato + Copyright (c) 2017 Fredrick Meunier This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -48,6 +49,7 @@ #include "peripherals/if1.h" #include "peripherals/if2.h" #include "peripherals/joystick.h" +#include "peripherals/multiface.h" #include "profile.h" #include "psg.h" #include "rzx.h" @@ -272,9 +274,12 @@ case 3: menu_select_peripheral_roms( "+D", 2, 1 ); return; case 4: menu_select_peripheral_roms( "Didaktik 80", 3, 1 ); return; case 5: menu_select_peripheral_roms( "DISCiPLE", 4, 1 ); return; - case 6: menu_select_peripheral_roms( "Opus Discovery", 5, 1 ); return; - case 7: menu_select_peripheral_roms( "SpeccyBoot", 6, 1 ); return; - case 8: menu_select_peripheral_roms( "uSource", 7, 1 ); return; + case 6: menu_select_peripheral_roms( "Multiface One", 5, 1 ); return; + case 7: menu_select_peripheral_roms( "Multiface 128", 6, 1 ); return; + case 8: menu_select_peripheral_roms( "Multiface 3", 7, 1 ); return; + case 9: menu_select_peripheral_roms( "Opus Discovery", 8, 1 ); return; + case 10: menu_select_peripheral_roms( "SpeccyBoot", 9, 1 ); return; + case 11: menu_select_peripheral_roms( "uSource", 10, 1 ); return; } @@ -338,6 +343,12 @@ event_add( 0, z80_nmi_event ); } +MENU_CALLBACK( menu_machine_multifaceredbutton ) +{ + ui_widget_finish(); + multiface_red_button(); +} + MENU_CALLBACK( menu_media_tape_open ) { char *filename; diff -Nru fuse-emulator-1.3.6+dfsg1/menu_data.dat fuse-emulator-1.3.7+dfsg1/menu_data.dat --- fuse-emulator-1.3.6+dfsg1/menu_data.dat 2017-05-31 12:49:29.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/menu_data.dat 2017-07-02 05:36:42.000000000 +0000 @@ -117,9 +117,12 @@ Options/Select ROMs/Peripheral ROMs/+_D..., Item,, menu_options_selectroms_peripheral_select,, 3 Options/Select ROMs/Peripheral ROMs/Didaktik _80..., Item,, menu_options_selectroms_peripheral_select,, 4 Options/Select ROMs/Peripheral ROMs/DISCiP_LE..., Item,, menu_options_selectroms_peripheral_select,, 5 -Options/Select ROMs/Peripheral ROMs/_Opus Discovery..., Item,, menu_options_selectroms_peripheral_select,, 6 -Options/Select ROMs/Peripheral ROMs/Specc_yBoot..., Item,, menu_options_selectroms_peripheral_select,, 7 -Options/Select ROMs/Peripheral ROMs/_uSource..., Item,, menu_options_selectroms_peripheral_select,, 8 +Options/Select ROMs/Peripheral ROMs/Mu_ltiface One..., Item,, menu_options_selectroms_peripheral_select,, 6 +Options/Select ROMs/Peripheral ROMs/Multiface _128..., Item,, menu_options_selectroms_peripheral_select,, 7 +Options/Select ROMs/Peripheral ROMs/Multiface _3..., Item,, menu_options_selectroms_peripheral_select,, 8 +Options/Select ROMs/Peripheral ROMs/_Opus Discovery..., Item,, menu_options_selectroms_peripheral_select,, 9 +Options/Select ROMs/Peripheral ROMs/Specc_yBoot..., Item,, menu_options_selectroms_peripheral_select,, 10 +Options/Select ROMs/Peripheral ROMs/_uSource..., Item,, menu_options_selectroms_peripheral_select,, 11 Options/_Filter..., Item,,, menu_filter_detail @@ -151,6 +154,7 @@ Machine/Profiler/_Stop, Item Machine/_NMI, Item +Machine/Multiface Red _Button, Item Machine/Didaktik SNA_P, Item M_edia, Branch diff -Nru fuse-emulator-1.3.6+dfsg1/menu.h fuse-emulator-1.3.7+dfsg1/menu.h --- fuse-emulator-1.3.6+dfsg1/menu.h 2016-11-24 12:02:24.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/menu.h 2017-07-02 05:36:42.000000000 +0000 @@ -81,6 +81,7 @@ MENU_CALLBACK( menu_machine_profiler_start ); MENU_CALLBACK( menu_machine_profiler_stop ); MENU_CALLBACK( menu_machine_nmi ); +MENU_CALLBACK( menu_machine_multifaceredbutton ); MENU_CALLBACK( menu_machine_didaktiksnap ); MENU_CALLBACK( menu_media_tape_browse ); diff -Nru fuse-emulator-1.3.6+dfsg1/periph.c fuse-emulator-1.3.7+dfsg1/periph.c --- fuse-emulator-1.3.6+dfsg1/periph.c 2016-11-24 12:02:24.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/periph.c 2017-07-02 05:36:42.000000000 +0000 @@ -31,6 +31,7 @@ #include "fuse.h" #include "periph.h" #include "peripherals/if1.h" +#include "peripherals/multiface.h" #include "peripherals/ula.h" #include "rzx.h" #include "settings.h" @@ -449,6 +450,7 @@ update_cartridge_menu(); update_ide_menu(); if1_update_menu(); + multiface_status_update(); specplus3_765_update_fdd(); machine_current->memory_map(); diff -Nru fuse-emulator-1.3.6+dfsg1/peripherals/Makefile.am fuse-emulator-1.3.7+dfsg1/peripherals/Makefile.am --- fuse-emulator-1.3.6+dfsg1/peripherals/Makefile.am 2017-05-31 12:49:29.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/peripherals/Makefile.am 2017-07-02 05:36:42.000000000 +0000 @@ -2,6 +2,7 @@ ## Copyright (c) 2011 Philip Kendall ## Copyright (c) 2015 Stuart Brady ## Copyright (c) 2015 Sergio Baldoví +## Copyright (c) 2017 Fredrick Meunier ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by @@ -31,6 +32,7 @@ peripherals/joystick.c \ peripherals/kempmouse.c \ peripherals/melodik.c \ + peripherals/multiface.c \ peripherals/printer.c \ peripherals/scld.c \ peripherals/speccyboot.c \ @@ -76,6 +78,7 @@ peripherals/joystick.h \ peripherals/kempmouse.h \ peripherals/melodik.h \ + peripherals/multiface.h \ peripherals/printer.h \ peripherals/scld.h \ peripherals/speccyboot.h \ diff -Nru fuse-emulator-1.3.6+dfsg1/peripherals/multiface.c fuse-emulator-1.3.7+dfsg1/peripherals/multiface.c --- fuse-emulator-1.3.6+dfsg1/peripherals/multiface.c 1970-01-01 00:00:00.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/peripherals/multiface.c 2017-07-02 05:36:42.000000000 +0000 @@ -0,0 +1,667 @@ +/* multiface.c: Multiface One/128/3 handling routines + Copyright (c) 2005,2007 Gergely Szasz + Copyright (c) 2017 Fredrick Meunier + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Author contact information: + + Gergely: szaszg@hu.inter.net + + Many thanks to: Mark Woodmass + +*/ + +#include + +#include +#include +#include +#include +#include + +#include "debugger/debugger.h" +#include "event.h" +#include "infrastructure/startup_manager.h" +#include "memory.h" +#include "module.h" +#include "multiface.h" +#include "options.h" +#include "periph.h" +#include "settings.h" +#include "ui/ui.h" +#include "unittests/unittests.h" +#include "utils.h" +#include "z80/z80.h" + +/* 8KB ROM */ +#define MULTIFACE_ROM_SIZE 0x2000 +/* 8KB RAM */ +#define MULTIFACE_RAM_SIZE 0x2000 + +#define MF_MASK( a ) ( 1 << a ) +#ifdef IS +#undef IS +#endif + +#define IS(a, b) (a & MF_MASK( b ) ) + +#ifdef SET +#undef SET +#endif +#define SET(a, b, c) a = ( a & ~MF_MASK( b ) ) | ( c ? MF_MASK( b ) : 0 ) + +enum { + MF_1 = 0, + MF_128, + MF_3 +}; + +/* Two 8KB memory chunk accessible by the Z80 when /ROMCS is low */ +static memory_page multiface_memory_map_romcs_rom[MEMORY_PAGES_IN_8K]; +static memory_page multiface_memory_map_romcs_ram[MEMORY_PAGES_IN_8K]; + +static int romcs = 0; + +typedef struct multiface_t { + int IC8a_Q; /* IC8 74LS74 first Flip-flop /Q output*/ + int IC8b_Q; /* IC8 74LS74 second Flip-flop /Q output */ + int J2; /* Jumper 2 to disable software paging, or + the software on/off state for 128/3 */ + int J1; /* Jumper 1 to disable joystick (always 0) */ + periph_type type; /* type of multiface: one/128/3 */ + libspectrum_byte ram[8192]; /* 8k RAM */ + int *c_settings; /* ptr to current_settings.multiface### */ + char **d_rom; + char **c_rom; +} multiface_t; + +static multiface_t mf[3]; + +int multiface_active = 0; +int multiface_activated = 0; +int multiface_available = 0; + +/* Memory source */ +static int multiface_rom_memory_source, multiface_ram_memory_source; + +/* Debugger events */ +static const char * const event_type_string = "multiface"; +static int page_event, unpage_event; + +static int multiface_init( void *context ); + +static void multiface_page( int idx ); +static void multiface_unpage( int idx ); +static void multiface_reset( int hard_reset ); +static void multiface_memory_map( void ); + +static libspectrum_byte multiface_port_in1( libspectrum_word port, + libspectrum_byte *attached ); +static libspectrum_byte multiface_port_in128( libspectrum_word port, + libspectrum_byte *attached ); +static libspectrum_byte multiface_port_in3( libspectrum_word port, + libspectrum_byte *attached ); + +static void multiface_port_out1( libspectrum_word port, libspectrum_byte val ); +static void multiface_port_out128( libspectrum_word port, + libspectrum_byte val ); +static void multiface_port_out3( libspectrum_word port, libspectrum_byte val ); + +static libspectrum_byte multiface_port_last_byte( libspectrum_word port, + libspectrum_byte *attached ); + +static void multiface_enabled_snapshot( libspectrum_snap *snap ); +static void multiface_from_snapshot( libspectrum_snap *snap ); +static void multiface_to_snapshot( libspectrum_snap *snap ); + +static module_info_t multiface_module_info = { + + /* .reset = */ multiface_reset, + /* .romcs = */ multiface_memory_map, + /* .snapshot_enabled = */ multiface_enabled_snapshot, + /* .snapshot_from = */ multiface_from_snapshot, + /* .snapshot_to = */ multiface_to_snapshot, + +}; + +static const periph_port_t multiface_ports_1[] = { +/* ---- ---- x001 --1- */ + { 0x0072, 0x0012, multiface_port_in1, multiface_port_out1 }, + { 0, 0, NULL, NULL } +}; + +static const periph_port_t multiface_ports_128[] = { +/* ---- ---- x011 --1- */ + { 0x0072, 0x0032, multiface_port_in128, multiface_port_out128 }, + { 0, 0, NULL, NULL } +}; + +static const periph_port_t multiface_ports_3[] = { +/* ---- ---- x011 --1- */ + { 0x0072, 0x0032, multiface_port_in3, multiface_port_out3 }, + { 0x1f3f, 0x1f3f, multiface_port_last_byte, NULL }, + { 0, 0, NULL, NULL } +}; + +static const periph_t multiface_periph_1 = { + &settings_current.multiface1, + multiface_ports_1, + 1, + NULL +}; + +static const periph_t multiface_periph_128 = { + &settings_current.multiface128, + multiface_ports_128, + 1, + NULL +}; + +static const periph_t multiface_periph_3 = { + &settings_current.multiface3, + multiface_ports_3, + 1, + NULL +}; + +void +multiface_register_startup( void ) +{ + startup_manager_module dependencies[] = { + STARTUP_MANAGER_MODULE_DEBUGGER, + STARTUP_MANAGER_MODULE_MEMORY, + STARTUP_MANAGER_MODULE_SETUID, + }; + startup_manager_register( STARTUP_MANAGER_MODULE_MULTIFACE, dependencies, + ARRAY_SIZE( dependencies ), multiface_init, NULL, + NULL ); +} + +static int +multiface_init( void *context GCC_UNUSED ) +{ + int i; + + multiface_active = 0; + multiface_activated = 0; + multiface_available = 0; + + module_register( &multiface_module_info ); + multiface_rom_memory_source = memory_source_register( "Multiface ROM" ); + multiface_ram_memory_source = memory_source_register( "Multiface RAM" ); + + for( i = 0; i < MEMORY_PAGES_IN_8K; i++ ) + multiface_memory_map_romcs_rom[i].source = multiface_rom_memory_source; + for( i = 0; i < MEMORY_PAGES_IN_8K; i++ ) + multiface_memory_map_romcs_ram[i].source = multiface_ram_memory_source; + + mf[MF_1].type = PERIPH_TYPE_MULTIFACE_1; + mf[MF_128].type = PERIPH_TYPE_MULTIFACE_128; + mf[MF_3].type = PERIPH_TYPE_MULTIFACE_3; + mf[MF_1].c_settings = &settings_current.multiface1; + mf[MF_128].c_settings = &settings_current.multiface128; + mf[MF_3].c_settings = &settings_current.multiface3; + mf[MF_1].d_rom = &settings_default.rom_multiface1; + mf[MF_128].d_rom = &settings_default.rom_multiface128; + mf[MF_3].d_rom = &settings_default.rom_multiface3; + mf[MF_1].c_rom = &settings_current.rom_multiface1; + mf[MF_128].c_rom = &settings_current.rom_multiface128; + mf[MF_3].c_rom = &settings_current.rom_multiface3; + + periph_register( PERIPH_TYPE_MULTIFACE_1, &multiface_periph_1 ); + periph_register( PERIPH_TYPE_MULTIFACE_128, &multiface_periph_128 ); + periph_register( PERIPH_TYPE_MULTIFACE_3, &multiface_periph_3 ); + periph_register_paging_events( event_type_string, &page_event, + &unpage_event ); + + return 0; +} + +static void +multiface_reset_real( int idx, int hard_reset ) +{ + int i; + + multiface_unpage( idx ); + + SET( multiface_activated, idx, 0 ); + SET( multiface_available, idx, 0 ); + + if( hard_reset ) memset( mf[idx].ram, 0, 8192 ); + if( !periph_is_active( mf[idx].type ) ) return; + + mf[idx].IC8a_Q = 1; + mf[idx].IC8b_Q = 1; + mf[idx].J1 = 0; /* Joystick always disabled :-( */ + + if( mf[idx].type == PERIPH_TYPE_MULTIFACE_1 ) + mf[idx].J2 = settings_current.multiface1_stealth ? 0 : 1; + else + mf[idx].J2 = 0; + + *mf[idx].c_settings = 0; + periph_activate_type( mf[idx].type, 0 ); + + if( machine_load_rom_bank( multiface_memory_map_romcs_rom, 0, + *mf[idx].c_rom, *mf[idx].d_rom, 0x2000 ) ) + return; + + machine_current->ram.romcs = 0; + +/* Now, the last (if all enabled: MF_3) is win (ROM/RAM) + BTW: not too critical, because if only one selected + than have to works this stuff properly... +*/ + for( i = 0; i < MEMORY_PAGES_IN_8K; i++ ) { + struct memory_page *page = &multiface_memory_map_romcs_ram[ i ]; + page->page = &mf[idx].ram[ i * MEMORY_PAGE_SIZE ]; + page->offset = i * MEMORY_PAGE_SIZE; + page->writable = 1; + } + + *mf[idx].c_settings = 1; + SET( multiface_available, idx, 1 ); + periph_activate_type( mf[idx].type, 1 ); + ui_menu_activate( UI_MENU_ITEM_MACHINE_MULTIFACE, 1 ); +} + +static void +multiface_reset( int hard_reset ) +{ + multiface_reset_real( MF_1, hard_reset ); + multiface_reset_real( MF_128, hard_reset ); + multiface_reset_real( MF_3, hard_reset ); + ui_menu_activate( UI_MENU_ITEM_MACHINE_MULTIFACE, + ( multiface_available ? 1 : 0 ) ); +} + +void +multiface_status_update( void ) +{ + int i; + + ui_menu_activate( UI_MENU_ITEM_MACHINE_MULTIFACE, 0 ); + + for( i = MF_1; i <= MF_3; i++ ) + SET( multiface_available, i, periph_is_active( mf[i].type ) ); + + if( !multiface_available ) return; + + ui_menu_activate( UI_MENU_ITEM_MACHINE_MULTIFACE, 1 ); + if( IS( multiface_available, MF_1 ) && + mf[MF_1].J2 == settings_current.multiface1_stealth ) { + mf[MF_1].J2 = settings_current.multiface1_stealth ? 0 : 1; + } +} + +static void +multiface_page( int idx ) +{ + if( IS( multiface_active, idx ) ) return; + SET( multiface_active, idx, 1 ); + romcs = machine_current->ram.romcs; + machine_current->ram.romcs = 1; + machine_current->memory_map(); + debugger_event( page_event ); + if( mf[idx].type != PERIPH_TYPE_MULTIFACE_1 ) + mf[idx].J2 = 1; +} + +static void +multiface_unpage( int idx ) +{ + if( !IS( multiface_active, idx ) ) return; + SET( multiface_active, idx, 0 ); + machine_current->ram.romcs = romcs; + machine_current->memory_map(); + debugger_event( unpage_event ); +} + +static void +multiface_memory_map( void ) +{ + if( !multiface_active ) + return; + + memory_map_romcs_8k( 0x0000, multiface_memory_map_romcs_rom ); + memory_map_romcs_8k( 0x2000, multiface_memory_map_romcs_ram ); +} + +static libspectrum_byte +multiface_port_in1( libspectrum_word port, libspectrum_byte *attached ) +{ + libspectrum_byte ret = 0xff; + int a7; + + if( !IS( multiface_available, MF_1 ) ) return ret; + + /* TODO: check if this value should be set to 0xff */ + *attached = 1; + + /* in () */ + /* Multiface one */ + /* xxxxxxxx 1001xx1x page in IN A, (159) 10011111*/ + /* xxxxxxxx 0001xx1x page out IN A, (31) 00011111*/ + + a7 = port & 0x0080; + + /* TODO: read joystick */ + /* + if( mf[MF_1].J1 ) { + } + */ + + if( a7 ) { + if( mf[MF_1].J2 ) { + multiface_page( MF_1 ); + mf[MF_1].IC8a_Q = 0; + } + } + else { + multiface_unpage( MF_1 ); /* a7 == 0 */ + mf[MF_1].IC8a_Q = 1; + } + + return ret; +} + +static libspectrum_byte +multiface_port_in128( libspectrum_word port, libspectrum_byte *attached ) +{ + libspectrum_byte ret = 0xff; + int a7; + + if( !IS( multiface_available, MF_128 ) ) return ret; + + /* TODO: check if this value should be set to 0xff */ + *attached = 1; + + /* Multiface 128 */ + /* I have only the MF128 user guide which say: */ + /* IN A, (191) -> page in, and IN A, (63) page out */ + /* let see: */ + /* xxxxxxxx 10111111 ok, may a0 don't care, so */ + /* xxxxxxxx 1011111x and may have some other don't care bit, but how know? */ + /**/ + /* xxxxxxxx 00111111 ok, may a0 don't care, so */ + /* xxxxxxxx 0011111x and may have some other don't care bit, but how know? */ + + a7 = port & 0x0080; + if( a7 ) { + if( mf[MF_128].J2 ) { + multiface_page( MF_128 ); + ret = machine_current->ram.last_byte & 0x08 ? 0xff : 0x7f; + mf[MF_128].IC8a_Q = 0; + } + } else { + multiface_unpage( MF_128 ); /* a7 == 0 */ + mf[MF_128].IC8a_Q = 1; + } + return ret; +} + +static libspectrum_byte +multiface_port_in3( libspectrum_word port, libspectrum_byte *attached ) +{ + libspectrum_byte ret = 0xff; + int a7; + + if( !IS( multiface_available, MF_3 ) ) return ret; + + /* TODO: check if this value should be set to 0xff */ + *attached = 1; + + /* Multiface 3 */ + /* The MF3 user guide say nothing about paging memory :-( */ + /* The following links say */ + /* http://x128.speccy.cz/multiface/multiface.htm */ + /* https://www.worldofspectrum.org/forums/discussion/comment/303231/#Comment_303231 */ + /* IN A, (63) -> page in, and IN A, (191) page out */ + + a7 = port & 0x0080; + if( a7 ) /* a7 == 1 */ + multiface_unpage( MF_3 ); + else + multiface_page( MF_3 ); /* a7 == 0 */ + mf[MF_3].IC8a_Q = ( !a7 ); + return ret; +} + +static void +multiface_port_out1( libspectrum_word port GCC_UNUSED, + libspectrum_byte val GCC_UNUSED ) +{ + if( !IS( multiface_available, MF_1 ) ) return; + + /* MF one: out () */ + /* xxxxxxxx x001xx1x page out */ + mf[MF_1].IC8b_Q = 1; +} + +static void +multiface_port_out128_3( int idx, libspectrum_word port ) +{ + if( !IS( multiface_available, idx ) ) return; + + if( IS( multiface_active, idx ) ) { + mf[idx].J2 = port & 0x0080 ? 1 : 0; /* A7 == 1 */ + } + mf[idx].IC8b_Q = 1; +} + +static void +multiface_port_out128( libspectrum_word port, libspectrum_byte val GCC_UNUSED ) +{ + multiface_port_out128_3( MF_128, port ); +} + +static void +multiface_port_out3( libspectrum_word port, libspectrum_byte val GCC_UNUSED ) +{ + multiface_port_out128_3( MF_3, port ); +} + +static libspectrum_byte +multiface_port_last_byte( libspectrum_word port, libspectrum_byte *attached ) +{ + libspectrum_byte ret = 0xff; + + if( !multiface_available || !mf[MF_3].J2 ) + return ret; + + /* TODO: check if this value should be set to 0xff */ + *attached = 1; + + if( port & 0x4000 ) /* 7f3f */ + ret = machine_current->ram.last_byte; + else + ret = machine_current->ram.last_byte2; + return ret; +} + +void +multiface_red_button( void ) +{ + int i; +/* + One RED button for all ;-) +*/ + for( i = MF_1; i <= MF_3; i++ ) { + if( !IS( multiface_available, i ) || mf[i].IC8b_Q == 0 ) continue; + + /* Note: AFAIK the Multiface One schematics show that the physical switch + (J2) disables paging in OFF state and has no effect on NMI generation. + But the manual states that the interface is unusable while switched OFF. + Until better understanding, NMI generation is disabled to avoid a freeze + in the spectrum machine. + */ + if( i == MF_1 && !mf[MF_1].J2 ) continue; + + mf[i].IC8b_Q = 0; + SET( multiface_activated, i, 1 ); + event_add( 0, z80_nmi_event ); /* pull /NMI */ + } +} + +void +multiface_setic8( void ) +{ + int i; +/* + activate all at once... +*/ + for( i = MF_1; i <= MF_3; i++ ) { + if( !IS( multiface_available, i ) || mf[i].IC8b_Q == 1 ) continue; + + mf[i].IC8a_Q = 0; + SET( multiface_activated, i, 0 ); + multiface_page( i ); + } +} + +int +multiface_unittest( void ) +{ + int r = 0; + + multiface_page( MF_1 ); + + r += unittests_assert_8k_page( 0x0000, multiface_rom_memory_source, 0 ); + r += unittests_assert_8k_page( 0x2000, multiface_ram_memory_source, 0 ); + r += unittests_assert_16k_ram_page( 0x4000, 5 ); + r += unittests_assert_16k_ram_page( 0x8000, 2 ); + r += unittests_assert_16k_ram_page( 0xc000, 0 ); + + multiface_unpage( MF_1 ); + + r += unittests_paging_test_48( 2 ); + + return r; +} + +static void +multiface_enabled_snapshot( libspectrum_snap *snap ) +{ + if( !libspectrum_snap_multiface_active( snap ) ) return; + + if( libspectrum_snap_multiface_model_one( snap ) ) + settings_current.multiface1 = 1; + else if( libspectrum_snap_multiface_model_128( snap ) ) + settings_current.multiface128 = 1; + else if( libspectrum_snap_multiface_model_3( snap ) ) + settings_current.multiface3 = 1; +} + +static void +multiface_from_snapshot( libspectrum_snap *snap ) +{ + int idx; + + if( !libspectrum_snap_multiface_active( snap ) ) return; + + if( libspectrum_snap_multiface_model_one( snap ) ) + idx = MF_1; + else if( libspectrum_snap_multiface_model_128( snap ) ) + idx = MF_128; + else if( libspectrum_snap_multiface_model_3( snap ) ) + idx = MF_3; + else + return; + + if( !IS( multiface_available, idx ) ) return; + + /* Multiface with 16 Kb RAM not supported */ + if( libspectrum_snap_multiface_ram_length( snap, 0 ) != MULTIFACE_RAM_SIZE ) { + ui_error( UI_ERROR_ERROR, "Only supported Multiface with 8 Kb RAM" ); + return; + } + + if( libspectrum_snap_multiface_ram( snap, 0 ) ) { + memcpy( mf[idx].ram, + libspectrum_snap_multiface_ram( snap, 0 ), MULTIFACE_RAM_SIZE ); + } + + if( libspectrum_snap_multiface_paged( snap ) ) { + multiface_page( idx ); + mf[idx].IC8a_Q = ( idx == MF_3 )? 1 : 0; + } else { + multiface_unpage( idx ); + } + + /* Restore status of software lockout (128/3) or physical switch (One) */ + switch( idx ) { + case MF_1: + mf[MF_1].J2 = !libspectrum_snap_multiface_disabled( snap ); + settings_current.multiface1_stealth = !mf[MF_1].J2; + break; + case MF_128: + case MF_3: + mf[idx].J2 = !libspectrum_snap_multiface_software_lockout( snap ); + break; + } + + /* Red button status */ + if( libspectrum_snap_multiface_red_button_disabled( snap ) ) { + mf[idx].IC8b_Q = 0; + } +} + +static void +multiface_to_snapshot( libspectrum_snap *snap ) +{ + libspectrum_byte *buffer; + int idx, i; + + if( periph_is_active( PERIPH_TYPE_MULTIFACE_1 ) ) { + libspectrum_snap_set_multiface_model_one( snap, 1 ); + idx = MF_1; + } else if( periph_is_active( PERIPH_TYPE_MULTIFACE_128 ) ) { + libspectrum_snap_set_multiface_model_128( snap, 1 ); + idx = MF_128; + } else if( periph_is_active( PERIPH_TYPE_MULTIFACE_3 ) ) { + libspectrum_snap_set_multiface_model_3( snap, 1 ); + idx = MF_3; + } else { + return; + } + + libspectrum_snap_set_multiface_active( snap, 1 ); + libspectrum_snap_set_multiface_paged( snap, IS( multiface_active, idx ) ); + + /* Store status of software lockout (128/3) or physical switch (One) */ + switch( idx ) { + case MF_1: + libspectrum_snap_set_multiface_disabled( snap, !mf[MF_1].J2 ); + break; + case MF_128: + case MF_3: + libspectrum_snap_set_multiface_software_lockout( snap, !mf[idx].J2 ); + break; + } + + /* Store red button status */ + if( !mf[idx].IC8b_Q ) { + libspectrum_snap_set_multiface_red_button_disabled( snap, 1 ); + } + + buffer = libspectrum_new( libspectrum_byte, MULTIFACE_RAM_SIZE ); + for( i = 0; i < MEMORY_PAGES_IN_8K; i++ ) + memcpy( buffer + i * MEMORY_PAGE_SIZE, + multiface_memory_map_romcs_ram[i].page, MEMORY_PAGE_SIZE ); + + libspectrum_snap_set_multiface_ram( snap, 0, buffer ); + libspectrum_snap_set_multiface_ram_length( snap, 0, MULTIFACE_RAM_SIZE ); +} diff -Nru fuse-emulator-1.3.6+dfsg1/peripherals/multiface.h fuse-emulator-1.3.7+dfsg1/peripherals/multiface.h --- fuse-emulator-1.3.6+dfsg1/peripherals/multiface.h 1970-01-01 00:00:00.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/peripherals/multiface.h 2017-07-02 05:36:42.000000000 +0000 @@ -0,0 +1,40 @@ +/* multiface.h: Multiface One/128/3 handling routines + Copyright (c) 2005,2007 Gergely Szasz + Copyright (c) 2017 Fredrick Meunier + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Author contact information: + + Gergely: szaszg@hu.inter.net + +*/ + +#ifndef FUSE_MULTIFACE_H +#define FUSE_MULTIFACE_H + +extern int multiface_activated; /* RED BUTTON PUSHED */ +extern int multiface_active; +extern int multiface_available; + +void multiface_register_startup( void ); + +void multiface_status_update( void ); + +void multiface_red_button( void ); +void multiface_setic8( void ); +int multiface_unittest( void ); + +#endif /* #ifndef FUSE_MULTIFACE_H */ diff -Nru fuse-emulator-1.3.6+dfsg1/peripherals/ula.c fuse-emulator-1.3.7+dfsg1/peripherals/ula.c --- fuse-emulator-1.3.6+dfsg1/peripherals/ula.c 2016-11-24 12:02:24.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/peripherals/ula.c 2017-07-02 05:36:42.000000000 +0000 @@ -139,7 +139,7 @@ static void set_1ffd( libspectrum_dword value ) { - specplus3_memoryport2_write( 0, value ); + specplus3_memoryport2_write_internal( 0, value ); } static int diff -Nru fuse-emulator-1.3.6+dfsg1/periph.h fuse-emulator-1.3.7+dfsg1/periph.h --- fuse-emulator-1.3.6+dfsg1/periph.h 2017-05-31 12:49:29.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/periph.h 2017-07-02 05:36:42.000000000 +0000 @@ -58,6 +58,9 @@ PERIPH_TYPE_KEMPSTON_MOUSE, /* Kempston mouse */ PERIPH_TYPE_MELODIK, /* Melodik interface */ + PERIPH_TYPE_MULTIFACE_1, /* Multiface 1 */ + PERIPH_TYPE_MULTIFACE_128, /* Multiface 128 */ + PERIPH_TYPE_MULTIFACE_3, /* Multiface 3 */ PERIPH_TYPE_OPUS, /* Opus disk interface */ PERIPH_TYPE_PARALLEL_PRINTER, /* +2A/+3 parallel printer */ PERIPH_TYPE_PENTAGON1024_MEMORY, /* Pentagon 1024-style memory paging */ diff -Nru fuse-emulator-1.3.6+dfsg1/README fuse-emulator-1.3.7+dfsg1/README --- fuse-emulator-1.3.6+dfsg1/README 2017-06-01 02:54:23.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/README 2017-07-02 05:36:42.000000000 +0000 @@ -1,4 +1,4 @@ -The Free Unix Spectrum Emulator (Fuse) 1.3.6 +The Free Unix Spectrum Emulator (Fuse) 1.3.7 ============================================ Fuse (the Free Unix Spectrum Emulator) was originally, and somewhat @@ -25,7 +25,7 @@ * Support for the RZX input recording file format, including rollback and 'competition mode'. * Emulation of the Currah µSource, DivIDE, Interface 1, Kempston mouse, - Spectrum +3e, ZXATASP and ZXCF interfaces. + Multiface One/128/3, Spectrum +3e, ZXATASP and ZXCF interfaces. * Emulation of the Covox, Fuller audio box, Melodik and SpecDrum audio interfaces. * Emulation of the Beta 128, +D, Didaktik 80/40, DISCiPLE and Opus Discovery @@ -110,4 +110,4 @@ . Philip Kendall -1st June, 2017 +2nd July, 2017 diff -Nru fuse-emulator-1.3.6+dfsg1/rzx.h fuse-emulator-1.3.7+dfsg1/rzx.h --- fuse-emulator-1.3.6+dfsg1/rzx.h 2016-11-24 12:02:24.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/rzx.h 2017-07-02 05:36:42.000000000 +0000 @@ -24,10 +24,6 @@ #ifndef FUSE_RZX_H #define FUSE_RZX_H -#ifdef HAVE_LIB_GLIB -#include -#endif /* #ifdef HAVE_LIB_GLIB */ - #include /* The offset used to get the count of instructions from the R register */ diff -Nru fuse-emulator-1.3.6+dfsg1/settings.c fuse-emulator-1.3.7+dfsg1/settings.c --- fuse-emulator-1.3.6+dfsg1/settings.c 2017-06-01 02:54:44.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/settings.c 2017-07-02 05:37:18.000000000 +0000 @@ -182,6 +182,10 @@ /* movie_compr */ (char *)NULL, /* movie_start */ (char *)NULL, /* movie_stop_after_rzx */ 1, + /* multiface1 */ 0, + /* multiface128 */ 0, + /* multiface1_stealth */ 0, + /* multiface3 */ 0, /* opus */ 0, /* opusdisk_file */ (char *)NULL, /* pal_tv2x */ 0, @@ -204,6 +208,9 @@ /* rom_didaktik80 */ (char *)"didaktik80.rom", /* rom_disciple */ (char *)"disciple.rom", /* rom_interface_1 */ (char *)"if1-2.rom", + /* rom_multiface1 */ (char *)"mf1.rom", + /* rom_multiface128 */ (char *)"mf128.rom", + /* rom_multiface3 */ (char *)"mf3.rom", /* rom_opus */ (char *)"opus.rom", /* rom_pentagon1024_0 */ (char *)"128p-0.rom", /* rom_pentagon1024_1 */ (char *)"128p-1.rom", @@ -1212,6 +1219,34 @@ xmlFree( xmlstring ); } } else + if( !strcmp( (const char*)node->name, "multiface1" ) ) { + xmlstring = xmlNodeListGetString( doc, node->xmlChildrenNode, 1 ); + if( xmlstring ) { + settings->multiface1 = atoi( (char*)xmlstring ); + xmlFree( xmlstring ); + } + } else + if( !strcmp( (const char*)node->name, "multiface128" ) ) { + xmlstring = xmlNodeListGetString( doc, node->xmlChildrenNode, 1 ); + if( xmlstring ) { + settings->multiface128 = atoi( (char*)xmlstring ); + xmlFree( xmlstring ); + } + } else + if( !strcmp( (const char*)node->name, "multiface1stealth" ) ) { + xmlstring = xmlNodeListGetString( doc, node->xmlChildrenNode, 1 ); + if( xmlstring ) { + settings->multiface1_stealth = atoi( (char*)xmlstring ); + xmlFree( xmlstring ); + } + } else + if( !strcmp( (const char*)node->name, "multiface3" ) ) { + xmlstring = xmlNodeListGetString( doc, node->xmlChildrenNode, 1 ); + if( xmlstring ) { + settings->multiface3 = atoi( (char*)xmlstring ); + xmlFree( xmlstring ); + } + } else if( !strcmp( (const char*)node->name, "opus" ) ) { xmlstring = xmlNodeListGetString( doc, node->xmlChildrenNode, 1 ); if( xmlstring ) { @@ -1384,6 +1419,30 @@ xmlFree( xmlstring ); } } else + if( !strcmp( (const char*)node->name, "rommultiface1" ) ) { + xmlstring = xmlNodeListGetString( doc, node->xmlChildrenNode, 1 ); + if( xmlstring ) { + libspectrum_free( settings->rom_multiface1 ); + settings->rom_multiface1 = utils_safe_strdup( (char*)xmlstring ); + xmlFree( xmlstring ); + } + } else + if( !strcmp( (const char*)node->name, "rommultiface128" ) ) { + xmlstring = xmlNodeListGetString( doc, node->xmlChildrenNode, 1 ); + if( xmlstring ) { + libspectrum_free( settings->rom_multiface128 ); + settings->rom_multiface128 = utils_safe_strdup( (char*)xmlstring ); + xmlFree( xmlstring ); + } + } else + if( !strcmp( (const char*)node->name, "rommultiface3" ) ) { + xmlstring = xmlNodeListGetString( doc, node->xmlChildrenNode, 1 ); + if( xmlstring ) { + libspectrum_free( settings->rom_multiface3 ); + settings->rom_multiface3 = utils_safe_strdup( (char*)xmlstring ); + xmlFree( xmlstring ); + } + } else if( !strcmp( (const char*)node->name, "romopus" ) ) { xmlstring = xmlNodeListGetString( doc, node->xmlChildrenNode, 1 ); if( xmlstring ) { @@ -2277,6 +2336,10 @@ if( settings->movie_start ) xmlNewTextChild( root, NULL, (const xmlChar*)"moviestart", (const xmlChar*)settings->movie_start ); xmlNewTextChild( root, NULL, (const xmlChar*)"moviestopafterrzx", (const xmlChar*)(settings->movie_stop_after_rzx ? "1" : "0") ); + xmlNewTextChild( root, NULL, (const xmlChar*)"multiface1", (const xmlChar*)(settings->multiface1 ? "1" : "0") ); + xmlNewTextChild( root, NULL, (const xmlChar*)"multiface128", (const xmlChar*)(settings->multiface128 ? "1" : "0") ); + xmlNewTextChild( root, NULL, (const xmlChar*)"multiface1stealth", (const xmlChar*)(settings->multiface1_stealth ? "1" : "0") ); + xmlNewTextChild( root, NULL, (const xmlChar*)"multiface3", (const xmlChar*)(settings->multiface3 ? "1" : "0") ); xmlNewTextChild( root, NULL, (const xmlChar*)"opus", (const xmlChar*)(settings->opus ? "1" : "0") ); if( settings->opusdisk_file ) xmlNewTextChild( root, NULL, (const xmlChar*)"opusdisk", (const xmlChar*)settings->opusdisk_file ); @@ -2314,6 +2377,12 @@ xmlNewTextChild( root, NULL, (const xmlChar*)"romdisciple", (const xmlChar*)settings->rom_disciple ); if( settings->rom_interface_1 ) xmlNewTextChild( root, NULL, (const xmlChar*)"rominterfacei", (const xmlChar*)settings->rom_interface_1 ); + if( settings->rom_multiface1 ) + xmlNewTextChild( root, NULL, (const xmlChar*)"rommultiface1", (const xmlChar*)settings->rom_multiface1 ); + if( settings->rom_multiface128 ) + xmlNewTextChild( root, NULL, (const xmlChar*)"rommultiface128", (const xmlChar*)settings->rom_multiface128 ); + if( settings->rom_multiface3 ) + xmlNewTextChild( root, NULL, (const xmlChar*)"rommultiface3", (const xmlChar*)settings->rom_multiface3 ); if( settings->rom_opus ) xmlNewTextChild( root, NULL, (const xmlChar*)"romopus", (const xmlChar*)settings->rom_opus ); if( settings->rom_pentagon1024_0 ) @@ -2999,6 +3068,22 @@ *val_int = &settings->movie_stop_after_rzx; return 0; } + if( n == 10 && !strncmp( (const char *)name, "multiface1", n ) ) { + *val_int = &settings->multiface1; + return 0; + } + if( n == 12 && !strncmp( (const char *)name, "multiface128", n ) ) { + *val_int = &settings->multiface128; + return 0; + } + if( n == 17 && !strncmp( (const char *)name, "multiface1stealth", n ) ) { + *val_int = &settings->multiface1_stealth; + return 0; + } + if( n == 10 && !strncmp( (const char *)name, "multiface3", n ) ) { + *val_int = &settings->multiface3; + return 0; + } if( n == 4 && !strncmp( (const char *)name, "opus", n ) ) { *val_int = &settings->opus; return 0; @@ -3091,6 +3176,18 @@ *val_char = &settings->rom_interface_1; return 0; } + if( n == 13 && !strncmp( (const char *)name, "rommultiface1", n ) ) { + *val_char = &settings->rom_multiface1; + return 0; + } + if( n == 15 && !strncmp( (const char *)name, "rommultiface128", n ) ) { + *val_char = &settings->rom_multiface128; + return 0; + } + if( n == 13 && !strncmp( (const char *)name, "rommultiface3", n ) ) { + *val_char = &settings->rom_multiface3; + return 0; + } if( n == 7 && !strncmp( (const char *)name, "romopus", n ) ) { *val_char = &settings->rom_opus; return 0; @@ -3885,6 +3982,18 @@ if( settings_boolean_write( doc, "moviestopafterrzx", settings->movie_stop_after_rzx ) ) goto error; + if( settings_boolean_write( doc, "multiface1", + settings->multiface1 ) ) + goto error; + if( settings_boolean_write( doc, "multiface128", + settings->multiface128 ) ) + goto error; + if( settings_boolean_write( doc, "multiface1stealth", + settings->multiface1_stealth ) ) + goto error; + if( settings_boolean_write( doc, "multiface3", + settings->multiface3 ) ) + goto error; if( settings_boolean_write( doc, "opus", settings->opus ) ) goto error; @@ -3951,6 +4060,15 @@ if( settings_string_write( doc, "rominterfacei", settings->rom_interface_1 ) ) goto error; + if( settings_string_write( doc, "rommultiface1", + settings->rom_multiface1 ) ) + goto error; + if( settings_string_write( doc, "rommultiface128", + settings->rom_multiface128 ) ) + goto error; + if( settings_string_write( doc, "rommultiface3", + settings->rom_multiface3 ) ) + goto error; if( settings_string_write( doc, "romopus", settings->rom_opus ) ) goto error; @@ -4384,6 +4502,14 @@ { "movie-start", 1, NULL, 334 }, { "movie-stop-after-rzx", 0, &(settings->movie_stop_after_rzx), 1 }, { "no-movie-stop-after-rzx", 0, &(settings->movie_stop_after_rzx), 0 }, + { "multiface1", 0, &(settings->multiface1), 1 }, + { "no-multiface1", 0, &(settings->multiface1), 0 }, + { "multiface128", 0, &(settings->multiface128), 1 }, + { "no-multiface128", 0, &(settings->multiface128), 0 }, + { "multiface1-stealth", 0, &(settings->multiface1_stealth), 1 }, + { "no-multiface1-stealth", 0, &(settings->multiface1_stealth), 0 }, + { "multiface3", 0, &(settings->multiface3), 1 }, + { "no-multiface3", 0, &(settings->multiface3), 0 }, { "opus", 0, &(settings->opus), 1 }, { "no-opus", 0, &(settings->opus), 0 }, { "opusdisk", 1, NULL, 335 }, @@ -4413,62 +4539,65 @@ { "rom-didaktik80", 1, NULL, 346 }, { "rom-disciple", 1, NULL, 347 }, { "rom-interface-1", 1, NULL, 348 }, - { "rom-opus", 1, NULL, 349 }, - { "rom-pentagon1024-0", 1, NULL, 350 }, - { "rom-pentagon1024-1", 1, NULL, 351 }, - { "rom-pentagon1024-2", 1, NULL, 352 }, - { "rom-pentagon1024-3", 1, NULL, 353 }, - { "rom-pentagon512-0", 1, NULL, 354 }, - { "rom-pentagon512-1", 1, NULL, 355 }, - { "rom-pentagon512-2", 1, NULL, 356 }, - { "rom-pentagon512-3", 1, NULL, 357 }, - { "rom-pentagon-0", 1, NULL, 358 }, - { "rom-pentagon-1", 1, NULL, 359 }, - { "rom-pentagon-2", 1, NULL, 360 }, - { "rom-plus2-0", 1, NULL, 361 }, - { "rom-plus2-1", 1, NULL, 362 }, - { "rom-plus2a-0", 1, NULL, 363 }, - { "rom-plus2a-1", 1, NULL, 364 }, - { "rom-plus2a-2", 1, NULL, 365 }, - { "rom-plus2a-3", 1, NULL, 366 }, - { "rom-plus3-0", 1, NULL, 367 }, - { "rom-plus3-1", 1, NULL, 368 }, - { "rom-plus3-2", 1, NULL, 369 }, - { "rom-plus3-3", 1, NULL, 370 }, - { "rom-plus3e-0", 1, NULL, 371 }, - { "rom-plus3e-1", 1, NULL, 372 }, - { "rom-plus3e-2", 1, NULL, 373 }, - { "rom-plus3e-3", 1, NULL, 374 }, - { "rom-plusd", 1, NULL, 375 }, - { "rom-scorpion-0", 1, NULL, 376 }, - { "rom-scorpion-1", 1, NULL, 377 }, - { "rom-scorpion-2", 1, NULL, 378 }, - { "rom-scorpion-3", 1, NULL, 379 }, - { "rom-spec-se-0", 1, NULL, 380 }, - { "rom-spec-se-1", 1, NULL, 381 }, - { "rom-speccyboot", 1, NULL, 382 }, - { "rom-tc2048", 1, NULL, 383 }, - { "rom-tc2068-0", 1, NULL, 384 }, - { "rom-tc2068-1", 1, NULL, 385 }, - { "rom-ts2068-0", 1, NULL, 386 }, - { "rom-ts2068-1", 1, NULL, 387 }, - { "rom-usource", 1, NULL, 388 }, + { "rom-multiface1", 1, NULL, 349 }, + { "rom-multiface128", 1, NULL, 350 }, + { "rom-multiface3", 1, NULL, 351 }, + { "rom-opus", 1, NULL, 352 }, + { "rom-pentagon1024-0", 1, NULL, 353 }, + { "rom-pentagon1024-1", 1, NULL, 354 }, + { "rom-pentagon1024-2", 1, NULL, 355 }, + { "rom-pentagon1024-3", 1, NULL, 356 }, + { "rom-pentagon512-0", 1, NULL, 357 }, + { "rom-pentagon512-1", 1, NULL, 358 }, + { "rom-pentagon512-2", 1, NULL, 359 }, + { "rom-pentagon512-3", 1, NULL, 360 }, + { "rom-pentagon-0", 1, NULL, 361 }, + { "rom-pentagon-1", 1, NULL, 362 }, + { "rom-pentagon-2", 1, NULL, 363 }, + { "rom-plus2-0", 1, NULL, 364 }, + { "rom-plus2-1", 1, NULL, 365 }, + { "rom-plus2a-0", 1, NULL, 366 }, + { "rom-plus2a-1", 1, NULL, 367 }, + { "rom-plus2a-2", 1, NULL, 368 }, + { "rom-plus2a-3", 1, NULL, 369 }, + { "rom-plus3-0", 1, NULL, 370 }, + { "rom-plus3-1", 1, NULL, 371 }, + { "rom-plus3-2", 1, NULL, 372 }, + { "rom-plus3-3", 1, NULL, 373 }, + { "rom-plus3e-0", 1, NULL, 374 }, + { "rom-plus3e-1", 1, NULL, 375 }, + { "rom-plus3e-2", 1, NULL, 376 }, + { "rom-plus3e-3", 1, NULL, 377 }, + { "rom-plusd", 1, NULL, 378 }, + { "rom-scorpion-0", 1, NULL, 379 }, + { "rom-scorpion-1", 1, NULL, 380 }, + { "rom-scorpion-2", 1, NULL, 381 }, + { "rom-scorpion-3", 1, NULL, 382 }, + { "rom-spec-se-0", 1, NULL, 383 }, + { "rom-spec-se-1", 1, NULL, 384 }, + { "rom-speccyboot", 1, NULL, 385 }, + { "rom-tc2048", 1, NULL, 386 }, + { "rom-tc2068-0", 1, NULL, 387 }, + { "rom-tc2068-1", 1, NULL, 388 }, + { "rom-ts2068-0", 1, NULL, 389 }, + { "rom-ts2068-1", 1, NULL, 390 }, + { "rom-usource", 1, NULL, 391 }, { "rs232-handshake", 0, &(settings->rs232_handshake), 1 }, { "no-rs232-handshake", 0, &(settings->rs232_handshake), 0 }, - { "rs232-rx", 1, NULL, 389 }, - { "rs232-tx", 1, NULL, 390 }, + { "rs232-rx", 1, NULL, 392 }, + { "rs232-tx", 1, NULL, 393 }, { "rzx-autosaves", 0, &(settings->rzx_autosaves), 1 }, { "no-rzx-autosaves", 0, &(settings->rzx_autosaves), 0 }, { "compress-rzx", 0, &(settings->rzx_compression), 1 }, { "no-compress-rzx", 0, &(settings->rzx_compression), 0 }, { "simpleide", 0, &(settings->simpleide_active), 1 }, { "no-simpleide", 0, &(settings->simpleide_active), 0 }, - { "simpleide-masterfile", 1, NULL, 391 }, - { "simpleide-slavefile", 1, NULL, 392 }, + { "simpleide-masterfile", 1, NULL, 394 }, + { "simpleide-slavefile", 1, NULL, 395 }, { "slt", 0, &(settings->slt_traps), 1 }, { "no-slt", 0, &(settings->slt_traps), 0 }, { "snapshot", 1, NULL, 's' }, - { "snet", 1, NULL, 394 }, + { "snet", 1, NULL, 397 }, { "sound", 0, &(settings->sound), 1 }, { "no-sound", 0, &(settings->sound), 0 }, { "sound-device", 1, NULL, 'd' }, @@ -4477,10 +4606,10 @@ { "sound-freq", 1, NULL, 'f' }, { "loading-sound", 0, &(settings->sound_load), 1 }, { "no-loading-sound", 0, &(settings->sound_load), 0 }, - { "speaker-type", 1, NULL, 395 }, + { "speaker-type", 1, NULL, 398 }, { "speccyboot", 0, &(settings->speccyboot), 1 }, { "no-speccyboot", 0, &(settings->speccyboot), 0 }, - { "speccyboot-tap", 1, NULL, 396 }, + { "speccyboot-tap", 1, NULL, 399 }, { "specdrum", 0, &(settings->specdrum), 1 }, { "no-specdrum", 0, &(settings->specdrum), 0 }, { "spectranet", 0, &(settings->spectranet), 1 }, @@ -4491,10 +4620,10 @@ { "graphics-filter", 1, NULL, 'g' }, { "statusbar", 0, &(settings->statusbar), 1 }, { "no-statusbar", 0, &(settings->statusbar), 0 }, - { "separation", 1, NULL, 397 }, + { "separation", 1, NULL, 400 }, { "strict-aspect-hint", 0, &(settings->strict_aspect_hint), 1 }, { "no-strict-aspect-hint", 0, &(settings->strict_aspect_hint), 0 }, - { "svga-modes", 1, NULL, 398 }, + { "svga-modes", 1, NULL, 401 }, { "tape", 1, NULL, 't' }, { "traps", 0, &(settings->tape_traps), 1 }, { "no-traps", 0, &(settings->tape_traps), 0 }, @@ -4502,25 +4631,25 @@ { "no-unittests", 0, &(settings->unittests), 0 }, { "usource", 0, &(settings->usource), 1 }, { "no-usource", 0, &(settings->usource), 0 }, - { "volume-ay", 1, NULL, 399 }, - { "volume-beeper", 1, NULL, 400 }, - { "volume-covox", 1, NULL, 401 }, - { "volume-specdrum", 1, NULL, 402 }, + { "volume-ay", 1, NULL, 402 }, + { "volume-beeper", 1, NULL, 403 }, + { "volume-covox", 1, NULL, 404 }, + { "volume-specdrum", 1, NULL, 405 }, { "writable-roms", 0, &(settings->writable_roms), 1 }, { "no-writable-roms", 0, &(settings->writable_roms), 0 }, { "cmos-z80", 0, &(settings->z80_is_cmos), 1 }, { "no-cmos-z80", 0, &(settings->z80_is_cmos), 0 }, { "zxatasp", 0, &(settings->zxatasp_active), 1 }, { "no-zxatasp", 0, &(settings->zxatasp_active), 0 }, - { "zxatasp-masterfile", 1, NULL, 403 }, - { "zxatasp-slavefile", 1, NULL, 404 }, + { "zxatasp-masterfile", 1, NULL, 406 }, + { "zxatasp-slavefile", 1, NULL, 407 }, { "zxatasp-upload", 0, &(settings->zxatasp_upload), 1 }, { "no-zxatasp-upload", 0, &(settings->zxatasp_upload), 0 }, { "zxatasp-write-protect", 0, &(settings->zxatasp_wp), 1 }, { "no-zxatasp-write-protect", 0, &(settings->zxatasp_wp), 0 }, { "zxcf", 0, &(settings->zxcf_active), 1 }, { "no-zxcf", 0, &(settings->zxcf_active), 0 }, - { "zxcf-cffile", 1, NULL, 405 }, + { "zxcf-cffile", 1, NULL, 408 }, { "zxcf-upload", 0, &(settings->zxcf_upload), 1 }, { "no-zxcf-upload", 0, &(settings->zxcf_upload), 0 }, { "zxprinter", 0, &(settings->zxprinter), 1 }, @@ -4647,68 +4776,71 @@ case 346: settings_set_string( &settings->rom_didaktik80, optarg ); break; case 347: settings_set_string( &settings->rom_disciple, optarg ); break; case 348: settings_set_string( &settings->rom_interface_1, optarg ); break; - case 349: settings_set_string( &settings->rom_opus, optarg ); break; - case 350: settings_set_string( &settings->rom_pentagon1024_0, optarg ); break; - case 351: settings_set_string( &settings->rom_pentagon1024_1, optarg ); break; - case 352: settings_set_string( &settings->rom_pentagon1024_2, optarg ); break; - case 353: settings_set_string( &settings->rom_pentagon1024_3, optarg ); break; - case 354: settings_set_string( &settings->rom_pentagon512_0, optarg ); break; - case 355: settings_set_string( &settings->rom_pentagon512_1, optarg ); break; - case 356: settings_set_string( &settings->rom_pentagon512_2, optarg ); break; - case 357: settings_set_string( &settings->rom_pentagon512_3, optarg ); break; - case 358: settings_set_string( &settings->rom_pentagon_0, optarg ); break; - case 359: settings_set_string( &settings->rom_pentagon_1, optarg ); break; - case 360: settings_set_string( &settings->rom_pentagon_2, optarg ); break; - case 361: settings_set_string( &settings->rom_plus2_0, optarg ); break; - case 362: settings_set_string( &settings->rom_plus2_1, optarg ); break; - case 363: settings_set_string( &settings->rom_plus2a_0, optarg ); break; - case 364: settings_set_string( &settings->rom_plus2a_1, optarg ); break; - case 365: settings_set_string( &settings->rom_plus2a_2, optarg ); break; - case 366: settings_set_string( &settings->rom_plus2a_3, optarg ); break; - case 367: settings_set_string( &settings->rom_plus3_0, optarg ); break; - case 368: settings_set_string( &settings->rom_plus3_1, optarg ); break; - case 369: settings_set_string( &settings->rom_plus3_2, optarg ); break; - case 370: settings_set_string( &settings->rom_plus3_3, optarg ); break; - case 371: settings_set_string( &settings->rom_plus3e_0, optarg ); break; - case 372: settings_set_string( &settings->rom_plus3e_1, optarg ); break; - case 373: settings_set_string( &settings->rom_plus3e_2, optarg ); break; - case 374: settings_set_string( &settings->rom_plus3e_3, optarg ); break; - case 375: settings_set_string( &settings->rom_plusd, optarg ); break; - case 376: settings_set_string( &settings->rom_scorpion_0, optarg ); break; - case 377: settings_set_string( &settings->rom_scorpion_1, optarg ); break; - case 378: settings_set_string( &settings->rom_scorpion_2, optarg ); break; - case 379: settings_set_string( &settings->rom_scorpion_3, optarg ); break; - case 380: settings_set_string( &settings->rom_spec_se_0, optarg ); break; - case 381: settings_set_string( &settings->rom_spec_se_1, optarg ); break; - case 382: settings_set_string( &settings->rom_speccyboot, optarg ); break; - case 383: settings_set_string( &settings->rom_tc2048, optarg ); break; - case 384: settings_set_string( &settings->rom_tc2068_0, optarg ); break; - case 385: settings_set_string( &settings->rom_tc2068_1, optarg ); break; - case 386: settings_set_string( &settings->rom_ts2068_0, optarg ); break; - case 387: settings_set_string( &settings->rom_ts2068_1, optarg ); break; - case 388: settings_set_string( &settings->rom_usource, optarg ); break; - case 389: settings_set_string( &settings->rs232_rx, optarg ); break; - case 390: settings_set_string( &settings->rs232_tx, optarg ); break; - case 391: settings_set_string( &settings->simpleide_master_file, optarg ); break; - case 392: settings_set_string( &settings->simpleide_slave_file, optarg ); break; + case 349: settings_set_string( &settings->rom_multiface1, optarg ); break; + case 350: settings_set_string( &settings->rom_multiface128, optarg ); break; + case 351: settings_set_string( &settings->rom_multiface3, optarg ); break; + case 352: settings_set_string( &settings->rom_opus, optarg ); break; + case 353: settings_set_string( &settings->rom_pentagon1024_0, optarg ); break; + case 354: settings_set_string( &settings->rom_pentagon1024_1, optarg ); break; + case 355: settings_set_string( &settings->rom_pentagon1024_2, optarg ); break; + case 356: settings_set_string( &settings->rom_pentagon1024_3, optarg ); break; + case 357: settings_set_string( &settings->rom_pentagon512_0, optarg ); break; + case 358: settings_set_string( &settings->rom_pentagon512_1, optarg ); break; + case 359: settings_set_string( &settings->rom_pentagon512_2, optarg ); break; + case 360: settings_set_string( &settings->rom_pentagon512_3, optarg ); break; + case 361: settings_set_string( &settings->rom_pentagon_0, optarg ); break; + case 362: settings_set_string( &settings->rom_pentagon_1, optarg ); break; + case 363: settings_set_string( &settings->rom_pentagon_2, optarg ); break; + case 364: settings_set_string( &settings->rom_plus2_0, optarg ); break; + case 365: settings_set_string( &settings->rom_plus2_1, optarg ); break; + case 366: settings_set_string( &settings->rom_plus2a_0, optarg ); break; + case 367: settings_set_string( &settings->rom_plus2a_1, optarg ); break; + case 368: settings_set_string( &settings->rom_plus2a_2, optarg ); break; + case 369: settings_set_string( &settings->rom_plus2a_3, optarg ); break; + case 370: settings_set_string( &settings->rom_plus3_0, optarg ); break; + case 371: settings_set_string( &settings->rom_plus3_1, optarg ); break; + case 372: settings_set_string( &settings->rom_plus3_2, optarg ); break; + case 373: settings_set_string( &settings->rom_plus3_3, optarg ); break; + case 374: settings_set_string( &settings->rom_plus3e_0, optarg ); break; + case 375: settings_set_string( &settings->rom_plus3e_1, optarg ); break; + case 376: settings_set_string( &settings->rom_plus3e_2, optarg ); break; + case 377: settings_set_string( &settings->rom_plus3e_3, optarg ); break; + case 378: settings_set_string( &settings->rom_plusd, optarg ); break; + case 379: settings_set_string( &settings->rom_scorpion_0, optarg ); break; + case 380: settings_set_string( &settings->rom_scorpion_1, optarg ); break; + case 381: settings_set_string( &settings->rom_scorpion_2, optarg ); break; + case 382: settings_set_string( &settings->rom_scorpion_3, optarg ); break; + case 383: settings_set_string( &settings->rom_spec_se_0, optarg ); break; + case 384: settings_set_string( &settings->rom_spec_se_1, optarg ); break; + case 385: settings_set_string( &settings->rom_speccyboot, optarg ); break; + case 386: settings_set_string( &settings->rom_tc2048, optarg ); break; + case 387: settings_set_string( &settings->rom_tc2068_0, optarg ); break; + case 388: settings_set_string( &settings->rom_tc2068_1, optarg ); break; + case 389: settings_set_string( &settings->rom_ts2068_0, optarg ); break; + case 390: settings_set_string( &settings->rom_ts2068_1, optarg ); break; + case 391: settings_set_string( &settings->rom_usource, optarg ); break; + case 392: settings_set_string( &settings->rs232_rx, optarg ); break; + case 393: settings_set_string( &settings->rs232_tx, optarg ); break; + case 394: settings_set_string( &settings->simpleide_master_file, optarg ); break; + case 395: settings_set_string( &settings->simpleide_slave_file, optarg ); break; case 's': settings_set_string( &settings->snapshot, optarg ); break; - case 394: settings_set_string( &settings->snet, optarg ); break; + case 397: settings_set_string( &settings->snet, optarg ); break; case 'd': settings_set_string( &settings->sound_device, optarg ); break; case 'f': settings->sound_freq = atoi( optarg ); break; - case 395: settings_set_string( &settings->speaker_type, optarg ); break; - case 396: settings_set_string( &settings->speccyboot_tap, optarg ); break; + case 398: settings_set_string( &settings->speaker_type, optarg ); break; + case 399: settings_set_string( &settings->speccyboot_tap, optarg ); break; case 'm': settings_set_string( &settings->start_machine, optarg ); break; case 'g': settings_set_string( &settings->start_scaler_mode, optarg ); break; - case 397: settings_set_string( &settings->stereo_ay, optarg ); break; - case 398: settings_set_string( &settings->svga_modes, optarg ); break; + case 400: settings_set_string( &settings->stereo_ay, optarg ); break; + case 401: settings_set_string( &settings->svga_modes, optarg ); break; case 't': settings_set_string( &settings->tape_file, optarg ); break; - case 399: settings->volume_ay = atoi( optarg ); break; - case 400: settings->volume_beeper = atoi( optarg ); break; - case 401: settings->volume_covox = atoi( optarg ); break; - case 402: settings->volume_specdrum = atoi( optarg ); break; - case 403: settings_set_string( &settings->zxatasp_master_file, optarg ); break; - case 404: settings_set_string( &settings->zxatasp_slave_file, optarg ); break; - case 405: settings_set_string( &settings->zxcf_pri_file, optarg ); break; + case 402: settings->volume_ay = atoi( optarg ); break; + case 403: settings->volume_beeper = atoi( optarg ); break; + case 404: settings->volume_covox = atoi( optarg ); break; + case 405: settings->volume_specdrum = atoi( optarg ); break; + case 406: settings_set_string( &settings->zxatasp_master_file, optarg ); break; + case 407: settings_set_string( &settings->zxatasp_slave_file, optarg ); break; + case 408: settings_set_string( &settings->zxcf_pri_file, optarg ); break; #line 657"./settings.pl" case 'h': settings->show_help = 1; break; @@ -4956,6 +5088,10 @@ dest->movie_start = utils_safe_strdup( src->movie_start ); } dest->movie_stop_after_rzx = src->movie_stop_after_rzx; + dest->multiface1 = src->multiface1; + dest->multiface128 = src->multiface128; + dest->multiface1_stealth = src->multiface1_stealth; + dest->multiface3 = src->multiface3; dest->opus = src->opus; dest->opusdisk_file = NULL; if( src->opusdisk_file ) { @@ -5023,6 +5159,18 @@ if( src->rom_interface_1 ) { dest->rom_interface_1 = utils_safe_strdup( src->rom_interface_1 ); } + dest->rom_multiface1 = NULL; + if( src->rom_multiface1 ) { + dest->rom_multiface1 = utils_safe_strdup( src->rom_multiface1 ); + } + dest->rom_multiface128 = NULL; + if( src->rom_multiface128 ) { + dest->rom_multiface128 = utils_safe_strdup( src->rom_multiface128 ); + } + dest->rom_multiface3 = NULL; + if( src->rom_multiface3 ) { + dest->rom_multiface3 = utils_safe_strdup( src->rom_multiface3 ); + } dest->rom_opus = NULL; if( src->rom_opus ) { dest->rom_opus = utils_safe_strdup( src->rom_opus ); @@ -5346,9 +5494,12 @@ case 2: return &( settings->rom_plusd ); case 3: return &( settings->rom_didaktik80 ); case 4: return &( settings->rom_disciple ); - case 5: return &( settings->rom_opus ); - case 6: return &( settings->rom_speccyboot ); - case 7: return &( settings->rom_usource ); + case 5: return &( settings->rom_multiface1 ); + case 6: return &( settings->rom_multiface128 ); + case 7: return &( settings->rom_multiface3 ); + case 8: return &( settings->rom_opus ); + case 9: return &( settings->rom_speccyboot ); + case 10: return &( settings->rom_usource ); default: return NULL; } } @@ -5418,6 +5569,9 @@ if( settings->rom_didaktik80 ) libspectrum_free( settings->rom_didaktik80 ); if( settings->rom_disciple ) libspectrum_free( settings->rom_disciple ); if( settings->rom_interface_1 ) libspectrum_free( settings->rom_interface_1 ); + if( settings->rom_multiface1 ) libspectrum_free( settings->rom_multiface1 ); + if( settings->rom_multiface128 ) libspectrum_free( settings->rom_multiface128 ); + if( settings->rom_multiface3 ) libspectrum_free( settings->rom_multiface3 ); if( settings->rom_opus ) libspectrum_free( settings->rom_opus ); if( settings->rom_pentagon1024_0 ) libspectrum_free( settings->rom_pentagon1024_0 ); if( settings->rom_pentagon1024_1 ) libspectrum_free( settings->rom_pentagon1024_1 ); @@ -5475,7 +5629,7 @@ if( settings->zxatasp_master_file ) libspectrum_free( settings->zxatasp_master_file ); if( settings->zxatasp_slave_file ) libspectrum_free( settings->zxatasp_slave_file ); if( settings->zxcf_pri_file ) libspectrum_free( settings->zxcf_pri_file ); -#line 799"./settings.pl" +#line 802"./settings.pl" return 0; } diff -Nru fuse-emulator-1.3.6+dfsg1/settings.dat fuse-emulator-1.3.7+dfsg1/settings.dat --- fuse-emulator-1.3.6+dfsg1/settings.dat 2017-05-31 12:49:29.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/settings.dat 2017-07-02 05:36:42.000000000 +0000 @@ -1,5 +1,5 @@ # settings.dat: configuration options for Fuse -# Copyright (c) 2002-2015 Philip Kendall +# Copyright (c) 2002-2017 Philip Kendall # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -61,6 +61,10 @@ mdr_len, numeric, 180 mdr_random_len, boolean, 1 interface2, boolean, 1 +multiface1, boolean, 0 +multiface128, boolean, 0 +multiface3, boolean, 0 +multiface1_stealth, boolean, 0 snapsasz80, null, 0 opus, boolean, 0 pal_tv2x, boolean, 0 @@ -242,6 +246,9 @@ rom_plusd, string, "plusd.rom", rom_didaktik80, string, "didaktik80.rom", rom_disciple, string, "disciple.rom", +rom_multiface1, string, "mf1.rom", +rom_multiface128, string, "mf128.rom", +rom_multiface3, string, "mf3.rom", rom_opus, string, "opus.rom", rom_speccyboot, string, "speccyboot-1.4.rom", rom_usource, string, "usource.rom", diff -Nru fuse-emulator-1.3.6+dfsg1/settings.h fuse-emulator-1.3.7+dfsg1/settings.h --- fuse-emulator-1.3.6+dfsg1/settings.h 2017-06-01 02:54:44.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/settings.h 2017-07-02 05:37:18.000000000 +0000 @@ -144,6 +144,10 @@ char *movie_compr; char *movie_start; int movie_stop_after_rzx; + int multiface1; + int multiface128; + int multiface1_stealth; + int multiface3; int opus; char *opusdisk_file; int pal_tv2x; @@ -166,6 +170,9 @@ char *rom_didaktik80; char *rom_disciple; char *rom_interface_1; + char *rom_multiface1; + char *rom_multiface128; + char *rom_multiface3; char *rom_opus; char *rom_pentagon1024_0; char *rom_pentagon1024_1; diff -Nru fuse-emulator-1.3.6+dfsg1/settings.pl fuse-emulator-1.3.7+dfsg1/settings.pl --- fuse-emulator-1.3.6+dfsg1/settings.pl 2016-11-24 12:02:24.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/settings.pl 2017-07-02 05:36:42.000000000 +0000 @@ -1,7 +1,7 @@ #!/usr/bin/perl -w # settings.pl: generate settings.c from settings.dat -# Copyright (c) 2002-2015 Philip Kendall +# Copyright (c) 2002-2017 Philip Kendall # Copyright (c) 2016 BogDan Vatra # This program is free software; you can redistribute it and/or modify @@ -765,9 +765,12 @@ case 2: return &( settings->rom_plusd ); case 3: return &( settings->rom_didaktik80 ); case 4: return &( settings->rom_disciple ); - case 5: return &( settings->rom_opus ); - case 6: return &( settings->rom_speccyboot ); - case 7: return &( settings->rom_usource ); + case 5: return &( settings->rom_multiface1 ); + case 6: return &( settings->rom_multiface128 ); + case 7: return &( settings->rom_multiface3 ); + case 8: return &( settings->rom_opus ); + case 9: return &( settings->rom_speccyboot ); + case 10: return &( settings->rom_usource ); default: return NULL; } } diff -Nru fuse-emulator-1.3.6+dfsg1/ui/gtk/menu_data.c fuse-emulator-1.3.7+dfsg1/ui/gtk/menu_data.c --- fuse-emulator-1.3.6+dfsg1/ui/gtk/menu_data.c 2017-06-01 02:54:44.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/ui/gtk/menu_data.c 2017-07-02 05:37:18.000000000 +0000 @@ -136,21 +136,36 @@ menu_options_selectroms_peripheral_select( gtk_action, 5 ); } -static MENU_CALLBACK( menu_options_selectroms_peripheralroms_opusdiscovery ) +static MENU_CALLBACK( menu_options_selectroms_peripheralroms_multifaceone ) { menu_options_selectroms_peripheral_select( gtk_action, 6 ); } -static MENU_CALLBACK( menu_options_selectroms_peripheralroms_speccyboot ) +static MENU_CALLBACK( menu_options_selectroms_peripheralroms_multiface128 ) { menu_options_selectroms_peripheral_select( gtk_action, 7 ); } -static MENU_CALLBACK( menu_options_selectroms_peripheralroms_usource ) +static MENU_CALLBACK( menu_options_selectroms_peripheralroms_multiface3 ) { menu_options_selectroms_peripheral_select( gtk_action, 8 ); } +static MENU_CALLBACK( menu_options_selectroms_peripheralroms_opusdiscovery ) +{ + menu_options_selectroms_peripheral_select( gtk_action, 9 ); +} + +static MENU_CALLBACK( menu_options_selectroms_peripheralroms_speccyboot ) +{ + menu_options_selectroms_peripheral_select( gtk_action, 10 ); +} + +static MENU_CALLBACK( menu_options_selectroms_peripheralroms_usource ) +{ + menu_options_selectroms_peripheral_select( gtk_action, 11 ); +} + static MENU_CALLBACK( menu_machine_hardreset ) { menu_machine_reset( gtk_action, 1 ); @@ -1255,6 +1270,9 @@ { "OPTIONS_SELECTROMS_PERIPHERALROMS_D", NULL, "+_D...", NULL, NULL, G_CALLBACK( menu_options_selectroms_peripheralroms_d ) }, { "OPTIONS_SELECTROMS_PERIPHERALROMS_DIDAKTIK80", NULL, "Didaktik _80...", NULL, NULL, G_CALLBACK( menu_options_selectroms_peripheralroms_didaktik80 ) }, { "OPTIONS_SELECTROMS_PERIPHERALROMS_DISCIPLE", NULL, "DISCiP_LE...", NULL, NULL, G_CALLBACK( menu_options_selectroms_peripheralroms_disciple ) }, + { "OPTIONS_SELECTROMS_PERIPHERALROMS_MULTIFACEONE", NULL, "Mu_ltiface One...", NULL, NULL, G_CALLBACK( menu_options_selectroms_peripheralroms_multifaceone ) }, + { "OPTIONS_SELECTROMS_PERIPHERALROMS_MULTIFACE128", NULL, "Multiface _128...", NULL, NULL, G_CALLBACK( menu_options_selectroms_peripheralroms_multiface128 ) }, + { "OPTIONS_SELECTROMS_PERIPHERALROMS_MULTIFACE3", NULL, "Multiface _3...", NULL, NULL, G_CALLBACK( menu_options_selectroms_peripheralroms_multiface3 ) }, { "OPTIONS_SELECTROMS_PERIPHERALROMS_OPUSDISCOVERY", NULL, "_Opus Discovery...", NULL, NULL, G_CALLBACK( menu_options_selectroms_peripheralroms_opusdiscovery ) }, { "OPTIONS_SELECTROMS_PERIPHERALROMS_SPECCYBOOT", NULL, "Specc_yBoot...", NULL, NULL, G_CALLBACK( menu_options_selectroms_peripheralroms_speccyboot ) }, { "OPTIONS_SELECTROMS_PERIPHERALROMS_USOURCE", NULL, "_uSource...", NULL, NULL, G_CALLBACK( menu_options_selectroms_peripheralroms_usource ) }, @@ -1274,6 +1292,7 @@ { "MACHINE_PROFILER_START", NULL, "_Start", NULL, NULL, G_CALLBACK( menu_machine_profiler_start ) }, { "MACHINE_PROFILER_STOP", NULL, "_Stop", NULL, NULL, G_CALLBACK( menu_machine_profiler_stop ) }, { "MACHINE_NMI", NULL, "_NMI", NULL, NULL, G_CALLBACK( menu_machine_nmi ) }, + { "MACHINE_MULTIFACEREDBUTTON", NULL, "Multiface Red _Button", NULL, NULL, G_CALLBACK( menu_machine_multifaceredbutton ) }, { "MACHINE_DIDAKTIKSNAP", NULL, "Didaktik SNA_P", NULL, NULL, G_CALLBACK( menu_machine_didaktiksnap ) }, { "MEDIA", NULL, "Media", NULL, NULL, NULL }, { "MEDIA_TAPE", NULL, "_Tape", NULL, NULL, NULL }, diff -Nru fuse-emulator-1.3.6+dfsg1/ui/gtk/options.c fuse-emulator-1.3.7+dfsg1/ui/gtk/options.c --- fuse-emulator-1.3.6+dfsg1/ui/gtk/options.c 2017-06-01 02:54:45.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/ui/gtk/options.c 2017-07-02 05:37:19.000000000 +0000 @@ -469,6 +469,30 @@ settings_current.interface2 ); gtk_container_add( GTK_CONTAINER( content_area ), dialog.interface2 ); + dialog.multiface1 = + gtk_check_button_new_with_label( "Multiface One" ); + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( dialog.multiface1 ), + settings_current.multiface1 ); + gtk_container_add( GTK_CONTAINER( content_area ), dialog.multiface1 ); + + dialog.multiface128 = + gtk_check_button_new_with_label( "Multiface 128" ); + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( dialog.multiface128 ), + settings_current.multiface128 ); + gtk_container_add( GTK_CONTAINER( content_area ), dialog.multiface128 ); + + dialog.multiface3 = + gtk_check_button_new_with_label( "Multiface 3" ); + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( dialog.multiface3 ), + settings_current.multiface3 ); + gtk_container_add( GTK_CONTAINER( content_area ), dialog.multiface3 ); + + dialog.multiface1_stealth = + gtk_check_button_new_with_label( "Stealth Multiface One" ); + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( dialog.multiface1_stealth ), + settings_current.multiface1_stealth ); + gtk_container_add( GTK_CONTAINER( content_area ), dialog.multiface1_stealth ); + dialog.printer = gtk_check_button_new_with_label( "Emulate printers" ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( dialog.printer ), @@ -564,6 +588,18 @@ settings_current.interface2 = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( ptr->interface2 ) ); + settings_current.multiface1 = + gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( ptr->multiface1 ) ); + + settings_current.multiface128 = + gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( ptr->multiface128 ) ); + + settings_current.multiface3 = + gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( ptr->multiface3 ) ); + + settings_current.multiface1_stealth = + gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( ptr->multiface1_stealth ) ); + settings_current.printer = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( ptr->printer ) ); diff -Nru fuse-emulator-1.3.6+dfsg1/ui/options.dat fuse-emulator-1.3.7+dfsg1/ui/options.dat --- fuse-emulator-1.3.6+dfsg1/ui/options.dat 2017-05-31 12:49:29.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/ui/options.dat 2017-07-02 05:36:42.000000000 +0000 @@ -42,6 +42,10 @@ Checkbox, M(e)lodik, melodik, INPUT_KEY_e Checkbox, (I)nterface 1, interface1, INPUT_KEY_i Checkbox, In(t)erface 2, interface2, INPUT_KEY_t +Checkbox, Mu(l)tiface One, multiface1, INPUT_KEY_l +Checkbox, Multiface 12(8), multiface128, INPUT_KEY_8 +Checkbox, Multiface (3), multiface3, INPUT_KEY_3 +Checkbox, Stealt(h) Multiface One, multiface1_stealth, INPUT_KEY_h Checkbox, Emulate (p)rinters, printer, INPUT_KEY_p Checkbox, (Z)X Printer, zxprinter, INPUT_KEY_z #ifdef BUILD_SPECCYBOOT diff -Nru fuse-emulator-1.3.6+dfsg1/ui/sdl/sdldisplay.c fuse-emulator-1.3.7+dfsg1/ui/sdl/sdldisplay.c --- fuse-emulator-1.3.6+dfsg1/ui/sdl/sdldisplay.c 2016-11-24 12:02:24.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/ui/sdl/sdldisplay.c 2017-07-02 05:36:42.000000000 +0000 @@ -353,8 +353,9 @@ fuse_abort(); } - sdldisplay_is_full_screen = - settings_current.full_screen = !!(sdldisplay_gc->flags & SDL_FULLSCREEN); + settings_current.full_screen = + !!( sdldisplay_gc->flags & ( SDL_FULLSCREEN | SDL_NOFRAME ) ); + sdldisplay_is_full_screen = settings_current.full_screen; /* Distinguish 555 and 565 mode */ if( sdldisplay_gc->format->Gmask >> sdldisplay_gc->format->Gshift == 0x1f ) diff -Nru fuse-emulator-1.3.6+dfsg1/ui/ui.h fuse-emulator-1.3.7+dfsg1/ui/ui.h --- fuse-emulator-1.3.6+dfsg1/ui/ui.h 2016-11-24 12:02:24.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/ui/ui.h 2017-07-02 05:36:42.000000000 +0000 @@ -133,6 +133,7 @@ UI_MENU_ITEM_FILE_MOVIE_RECORDING, UI_MENU_ITEM_FILE_MOVIE_PAUSE, UI_MENU_ITEM_MACHINE_PROFILER, + UI_MENU_ITEM_MACHINE_MULTIFACE, UI_MENU_ITEM_MACHINE_DIDAKTIK80_SNAP, UI_MENU_ITEM_MEDIA_CARTRIDGE, UI_MENU_ITEM_MEDIA_CARTRIDGE_DOCK, diff -Nru fuse-emulator-1.3.6+dfsg1/ui/widget/menu_data.c fuse-emulator-1.3.7+dfsg1/ui/widget/menu_data.c --- fuse-emulator-1.3.6+dfsg1/ui/widget/menu_data.c 2017-06-01 02:54:45.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/ui/widget/menu_data.c 2017-07-02 05:40:53.000000000 +0000 @@ -119,9 +119,12 @@ { "+\012D\011...", INPUT_KEY_d, NULL, menu_options_selectroms_peripheral_select, NULL, 3 }, { "Didaktik \0128\0110...", INPUT_KEY_8, NULL, menu_options_selectroms_peripheral_select, NULL, 4 }, { "DISCiP\012L\011E...", INPUT_KEY_l, NULL, menu_options_selectroms_peripheral_select, NULL, 5 }, - { "\012O\011pus Discovery...", INPUT_KEY_o, NULL, menu_options_selectroms_peripheral_select, NULL, 6 }, - { "Specc\012y\011Boot...", INPUT_KEY_y, NULL, menu_options_selectroms_peripheral_select, NULL, 7 }, - { "\012u\011Source...", INPUT_KEY_u, NULL, menu_options_selectroms_peripheral_select, NULL, 8 }, + { "Mu\012l\011tiface One...", INPUT_KEY_l, NULL, menu_options_selectroms_peripheral_select, NULL, 6 }, + { "Multiface \0121\01128...", INPUT_KEY_1, NULL, menu_options_selectroms_peripheral_select, NULL, 7 }, + { "Multiface \0123\011...", INPUT_KEY_3, NULL, menu_options_selectroms_peripheral_select, NULL, 8 }, + { "\012O\011pus Discovery...", INPUT_KEY_o, NULL, menu_options_selectroms_peripheral_select, NULL, 9 }, + { "Specc\012y\011Boot...", INPUT_KEY_y, NULL, menu_options_selectroms_peripheral_select, NULL, 10 }, + { "\012u\011Source...", INPUT_KEY_u, NULL, menu_options_selectroms_peripheral_select, NULL, 11 }, { NULL } }; @@ -167,6 +170,7 @@ { "\012M\011emory Browser...", INPUT_KEY_m, NULL, menu_machine_memorybrowser, NULL, 0 }, { "Pro\012f\011iler", INPUT_KEY_f, menu_machine_profiler, NULL, NULL, 0 }, { "\012N\011MI", INPUT_KEY_n, NULL, menu_machine_nmi, NULL, 0 }, + { "Multiface Red \012B\011utton", INPUT_KEY_b, NULL, menu_machine_multifaceredbutton, NULL, 0 }, { "Didaktik SNA\012P\011", INPUT_KEY_p, NULL, menu_machine_didaktiksnap, NULL, 0 }, { NULL } }; diff -Nru fuse-emulator-1.3.6+dfsg1/ui/widget/options.c fuse-emulator-1.3.7+dfsg1/ui/widget/options.c --- fuse-emulator-1.3.6+dfsg1/ui/widget/options.c 2017-06-01 02:54:45.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/ui/widget/options.c 2017-07-02 05:40:53.000000000 +0000 @@ -351,6 +351,14 @@ static void widget_option_interface1_draw( int left_edge, int width, struct widget_option_entry *menu, settings_info *show ); static void widget_interface2_click( void ); static void widget_option_interface2_draw( int left_edge, int width, struct widget_option_entry *menu, settings_info *show ); +static void widget_multiface1_click( void ); +static void widget_option_multiface1_draw( int left_edge, int width, struct widget_option_entry *menu, settings_info *show ); +static void widget_multiface128_click( void ); +static void widget_option_multiface128_draw( int left_edge, int width, struct widget_option_entry *menu, settings_info *show ); +static void widget_multiface3_click( void ); +static void widget_option_multiface3_draw( int left_edge, int width, struct widget_option_entry *menu, settings_info *show ); +static void widget_multiface1_stealth_click( void ); +static void widget_option_multiface1_stealth_draw( int left_edge, int width, struct widget_option_entry *menu, settings_info *show ); static void widget_printer_click( void ); static void widget_option_printer_draw( int left_edge, int width, struct widget_option_entry *menu, settings_info *show ); static void widget_zxprinter_click( void ); @@ -509,14 +517,18 @@ { "M\012e\001lodik", 4, INPUT_KEY_e, NULL, NULL, widget_melodik_click, widget_option_melodik_draw }, { "\012I\001nterface 1", 5, INPUT_KEY_i, NULL, NULL, widget_interface1_click, widget_option_interface1_draw }, { "In\012t\001erface 2", 6, INPUT_KEY_t, NULL, NULL, widget_interface2_click, widget_option_interface2_draw }, - { "Emulate \012p\001rinters", 7, INPUT_KEY_p, NULL, NULL, widget_printer_click, widget_option_printer_draw }, - { "\012Z\001X Printer", 8, INPUT_KEY_z, NULL, NULL, widget_zxprinter_click, widget_option_zxprinter_draw }, - { "Speccy\012B\001oot interface", 9, INPUT_KEY_b, NULL, NULL, widget_speccyboot_click, widget_option_speccyboot_draw }, - { "Spec\012D\001rum interface", 10, INPUT_KEY_d, NULL, NULL, widget_specdrum_click, widget_option_specdrum_draw }, - { "Spectra\012n\001et", 11, INPUT_KEY_n, NULL, NULL, widget_spectranet_click, widget_option_spectranet_draw }, - { "Spe\012c\001tranet disable", 12, INPUT_KEY_c, NULL, NULL, widget_spectranet_disable_click, widget_option_spectranet_disable_draw }, - { "uSo\012u\001rce", 13, INPUT_KEY_u, NULL, NULL, widget_usource_click, widget_option_usource_draw }, - { "C\012o\001vox interface", 14, INPUT_KEY_o, NULL, NULL, widget_covox_click, widget_option_covox_draw }, + { "Mu\012l\001tiface One", 7, INPUT_KEY_l, NULL, NULL, widget_multiface1_click, widget_option_multiface1_draw }, + { "Multiface 12\0128\001", 8, INPUT_KEY_8, NULL, NULL, widget_multiface128_click, widget_option_multiface128_draw }, + { "Multiface \0123\001", 9, INPUT_KEY_3, NULL, NULL, widget_multiface3_click, widget_option_multiface3_draw }, + { "Stealt\012h\001 Multiface One", 10, INPUT_KEY_h, NULL, NULL, widget_multiface1_stealth_click, widget_option_multiface1_stealth_draw }, + { "Emulate \012p\001rinters", 11, INPUT_KEY_p, NULL, NULL, widget_printer_click, widget_option_printer_draw }, + { "\012Z\001X Printer", 12, INPUT_KEY_z, NULL, NULL, widget_zxprinter_click, widget_option_zxprinter_draw }, + { "Speccy\012B\001oot interface", 13, INPUT_KEY_b, NULL, NULL, widget_speccyboot_click, widget_option_speccyboot_draw }, + { "Spec\012D\001rum interface", 14, INPUT_KEY_d, NULL, NULL, widget_specdrum_click, widget_option_specdrum_draw }, + { "Spectra\012n\001et", 15, INPUT_KEY_n, NULL, NULL, widget_spectranet_click, widget_option_spectranet_draw }, + { "Spe\012c\001tranet disable", 16, INPUT_KEY_c, NULL, NULL, widget_spectranet_disable_click, widget_option_spectranet_disable_draw }, + { "uSo\012u\001rce", 17, INPUT_KEY_u, NULL, NULL, widget_usource_click, widget_option_usource_draw }, + { "C\012o\001vox interface", 18, INPUT_KEY_o, NULL, NULL, widget_covox_click, widget_option_covox_draw }, { NULL } }; @@ -1452,6 +1464,54 @@ } static void +widget_multiface1_click( void ) +{ + widget_options_settings.multiface1 = ! widget_options_settings.multiface1; +} + +static void +widget_option_multiface1_draw( int left_edge, int width, struct widget_option_entry *menu, settings_info *show ) +{ + widget_options_print_option( left_edge, width, menu->index, menu->text, show->multiface1 ); +} + +static void +widget_multiface128_click( void ) +{ + widget_options_settings.multiface128 = ! widget_options_settings.multiface128; +} + +static void +widget_option_multiface128_draw( int left_edge, int width, struct widget_option_entry *menu, settings_info *show ) +{ + widget_options_print_option( left_edge, width, menu->index, menu->text, show->multiface128 ); +} + +static void +widget_multiface3_click( void ) +{ + widget_options_settings.multiface3 = ! widget_options_settings.multiface3; +} + +static void +widget_option_multiface3_draw( int left_edge, int width, struct widget_option_entry *menu, settings_info *show ) +{ + widget_options_print_option( left_edge, width, menu->index, menu->text, show->multiface3 ); +} + +static void +widget_multiface1_stealth_click( void ) +{ + widget_options_settings.multiface1_stealth = ! widget_options_settings.multiface1_stealth; +} + +static void +widget_option_multiface1_stealth_draw( int left_edge, int width, struct widget_option_entry *menu, settings_info *show ) +{ + widget_options_print_option( left_edge, width, menu->index, menu->text, show->multiface1_stealth ); +} + +static void widget_printer_click( void ) { widget_options_settings.printer = ! widget_options_settings.printer; @@ -1560,7 +1620,7 @@ #if 0 case INPUT_KEY_Resize: /* Fake keypress used on window resize */ - widget_dialog_with_border( 1, 2, 30, 2 + 15 ); + widget_dialog_with_border( 1, 2, 30, 2 + 19 ); widget_peripherals_general_show_all( &widget_options_settings ); break; #endif @@ -1583,7 +1643,7 @@ case INPUT_KEY_Down: case INPUT_KEY_6: case INPUT_JOYSTICK_DOWN: - if ( highlight_line + 1 < 15 ) { + if ( highlight_line + 1 < 19 ) { new_highlight_line = highlight_line + 1; cursor_pressed = 1; } @@ -1597,8 +1657,8 @@ break; case INPUT_KEY_End: - if ( highlight_line + 2 < 15 ) { - new_highlight_line = 15 - 1; + if ( highlight_line + 2 < 19 ) { + new_highlight_line = 19 - 1; cursor_pressed = 1; } break; diff -Nru fuse-emulator-1.3.6+dfsg1/ui/win32/menu_data.c fuse-emulator-1.3.7+dfsg1/ui/win32/menu_data.c --- fuse-emulator-1.3.6+dfsg1/ui/win32/menu_data.c 2017-06-01 02:54:45.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/ui/win32/menu_data.c 2017-07-02 05:40:53.000000000 +0000 @@ -138,12 +138,18 @@ menu_options_selectroms_peripheral_select( 4 ); return 0; case IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_DISCIPLE: menu_options_selectroms_peripheral_select( 5 ); return 0; - case IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_OPUSDISCOVERY: + case IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_MULTIFACEONE: menu_options_selectroms_peripheral_select( 6 ); return 0; - case IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_SPECCYBOOT: + case IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_MULTIFACE128: menu_options_selectroms_peripheral_select( 7 ); return 0; - case IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_USOURCE: + case IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_MULTIFACE3: menu_options_selectroms_peripheral_select( 8 ); return 0; + case IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_OPUSDISCOVERY: + menu_options_selectroms_peripheral_select( 9 ); return 0; + case IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_SPECCYBOOT: + menu_options_selectroms_peripheral_select( 10 ); return 0; + case IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_USOURCE: + menu_options_selectroms_peripheral_select( 11 ); return 0; case IDM_MENU_OPTIONS_FILTER: menu_options_filter( 0 ); return 0; case IDM_MENU_OPTIONS_DISKOPTIONS: @@ -172,6 +178,8 @@ menu_machine_profiler_stop( 0 ); return 0; case IDM_MENU_MACHINE_NMI: menu_machine_nmi( 0 ); return 0; + case IDM_MENU_MACHINE_MULTIFACEREDBUTTON: + menu_machine_multifaceredbutton( 0 ); return 0; case IDM_MENU_MACHINE_DIDAKTIKSNAP: menu_machine_didaktiksnap( 0 ); return 0; case IDM_MENU_MEDIA_TAPE_OPEN: diff -Nru fuse-emulator-1.3.6+dfsg1/ui/win32/menu_data.rc fuse-emulator-1.3.7+dfsg1/ui/win32/menu_data.rc --- fuse-emulator-1.3.6+dfsg1/ui/win32/menu_data.rc 2017-06-01 02:54:45.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/ui/win32/menu_data.rc 2017-07-02 05:40:53.000000000 +0000 @@ -117,6 +117,9 @@ MENUITEM "+&D...", IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_D MENUITEM "Didaktik &80...", IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_DIDAKTIK80 MENUITEM "DISCiP&LE...", IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_DISCIPLE + MENUITEM "Mu<iface One...", IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_MULTIFACEONE + MENUITEM "Multiface &128...", IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_MULTIFACE128 + MENUITEM "Multiface &3...", IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_MULTIFACE3 MENUITEM "&Opus Discovery...", IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_OPUSDISCOVERY MENUITEM "Specc&yBoot...", IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_SPECCYBOOT MENUITEM "&uSource...", IDM_MENU_OPTIONS_SELECTROMS_PERIPHERALROMS_USOURCE @@ -143,6 +146,7 @@ MENUITEM "&Stop", IDM_MENU_MACHINE_PROFILER_STOP } MENUITEM "&NMI", IDM_MENU_MACHINE_NMI + MENUITEM "Multiface Red &Button", IDM_MENU_MACHINE_MULTIFACEREDBUTTON MENUITEM "Didaktik SNA&P", IDM_MENU_MACHINE_DIDAKTIKSNAP } POPUP "M&edia" diff -Nru fuse-emulator-1.3.6+dfsg1/ui/win32/options.c fuse-emulator-1.3.7+dfsg1/ui/win32/options.c --- fuse-emulator-1.3.6+dfsg1/ui/win32/options.c 2017-06-01 02:54:45.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/ui/win32/options.c 2017-07-02 05:40:53.000000000 +0000 @@ -393,6 +393,18 @@ SendDlgItemMessage( hwndDlg, IDC_OPT_PERIPHERALS_GENERAL_INTERFACE2, BM_SETCHECK, settings_current.interface2 ? BST_CHECKED : BST_UNCHECKED, 0 ); + SendDlgItemMessage( hwndDlg, IDC_OPT_PERIPHERALS_GENERAL_MULTIFACE1, BM_SETCHECK, + settings_current.multiface1 ? BST_CHECKED : BST_UNCHECKED, 0 ); + + SendDlgItemMessage( hwndDlg, IDC_OPT_PERIPHERALS_GENERAL_MULTIFACE128, BM_SETCHECK, + settings_current.multiface128 ? BST_CHECKED : BST_UNCHECKED, 0 ); + + SendDlgItemMessage( hwndDlg, IDC_OPT_PERIPHERALS_GENERAL_MULTIFACE3, BM_SETCHECK, + settings_current.multiface3 ? BST_CHECKED : BST_UNCHECKED, 0 ); + + SendDlgItemMessage( hwndDlg, IDC_OPT_PERIPHERALS_GENERAL_MULTIFACE1_STEALTH, BM_SETCHECK, + settings_current.multiface1_stealth ? BST_CHECKED : BST_UNCHECKED, 0 ); + SendDlgItemMessage( hwndDlg, IDC_OPT_PERIPHERALS_GENERAL_PRINTER, BM_SETCHECK, settings_current.printer ? BST_CHECKED : BST_UNCHECKED, 0 ); @@ -453,6 +465,18 @@ settings_current.interface2 = IsDlgButtonChecked( hwndDlg, IDC_OPT_PERIPHERALS_GENERAL_INTERFACE2 ); + settings_current.multiface1 = + IsDlgButtonChecked( hwndDlg, IDC_OPT_PERIPHERALS_GENERAL_MULTIFACE1 ); + + settings_current.multiface128 = + IsDlgButtonChecked( hwndDlg, IDC_OPT_PERIPHERALS_GENERAL_MULTIFACE128 ); + + settings_current.multiface3 = + IsDlgButtonChecked( hwndDlg, IDC_OPT_PERIPHERALS_GENERAL_MULTIFACE3 ); + + settings_current.multiface1_stealth = + IsDlgButtonChecked( hwndDlg, IDC_OPT_PERIPHERALS_GENERAL_MULTIFACE1_STEALTH ); + settings_current.printer = IsDlgButtonChecked( hwndDlg, IDC_OPT_PERIPHERALS_GENERAL_PRINTER ); diff -Nru fuse-emulator-1.3.6+dfsg1/ui/win32/options.rc fuse-emulator-1.3.7+dfsg1/ui/win32/options.rc --- fuse-emulator-1.3.6+dfsg1/ui/win32/options.rc 2017-06-01 02:54:45.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/ui/win32/options.rc 2017-07-02 05:40:53.000000000 +0000 @@ -74,7 +74,7 @@ END -IDD_OPT_PERIPHERALS_GENERAL DIALOGEX 6,5,190,209 +IDD_OPT_PERIPHERALS_GENERAL DIALOGEX 6,5,190,257 CAPTION "Fuse - General Peripheral Options" FONT 8,"Ms Shell Dlg 2",400,0,1 STYLE WS_POPUP | WS_CAPTION | WS_BORDER | WS_SYSMENU @@ -87,16 +87,20 @@ AUTOCHECKBOX "M&elodik",IDC_OPT_PERIPHERALS_GENERAL_MELODIK,5,53,160,11 AUTOCHECKBOX "&Interface 1",IDC_OPT_PERIPHERALS_GENERAL_INTERFACE1,5,65,160,11 AUTOCHECKBOX "In&terface 2",IDC_OPT_PERIPHERALS_GENERAL_INTERFACE2,5,77,160,11 - AUTOCHECKBOX "Emulate &printers",IDC_OPT_PERIPHERALS_GENERAL_PRINTER,5,89,160,11 - AUTOCHECKBOX "&ZX Printer",IDC_OPT_PERIPHERALS_GENERAL_ZXPRINTER,5,101,160,11 - AUTOCHECKBOX "Speccy&Boot interface",IDC_OPT_PERIPHERALS_GENERAL_SPECCYBOOT,5,113,160,11 - AUTOCHECKBOX "Spec&Drum interface",IDC_OPT_PERIPHERALS_GENERAL_SPECDRUM,5,125,160,11 - AUTOCHECKBOX "Spectra&net",IDC_OPT_PERIPHERALS_GENERAL_SPECTRANET,5,137,160,11 - AUTOCHECKBOX "Spe&ctranet disable",IDC_OPT_PERIPHERALS_GENERAL_SPECTRANET_DISABLE,5,149,160,11 - AUTOCHECKBOX "uSo&urce",IDC_OPT_PERIPHERALS_GENERAL_USOURCE,5,161,160,11 - AUTOCHECKBOX "C&ovox interface",IDC_OPT_PERIPHERALS_GENERAL_COVOX,5,173,160,11 - DEFPUSHBUTTON "OK",IDOK,45,190,50,14 - PUSHBUTTON "Cancel",IDCANCEL,100,190,50,14 + AUTOCHECKBOX "Mu<iface One",IDC_OPT_PERIPHERALS_GENERAL_MULTIFACE1,5,89,160,11 + AUTOCHECKBOX "Multiface 12&8",IDC_OPT_PERIPHERALS_GENERAL_MULTIFACE128,5,101,160,11 + AUTOCHECKBOX "Multiface &3",IDC_OPT_PERIPHERALS_GENERAL_MULTIFACE3,5,113,160,11 + AUTOCHECKBOX "Stealt&h Multiface One",IDC_OPT_PERIPHERALS_GENERAL_MULTIFACE1_STEALTH,5,125,160,11 + AUTOCHECKBOX "Emulate &printers",IDC_OPT_PERIPHERALS_GENERAL_PRINTER,5,137,160,11 + AUTOCHECKBOX "&ZX Printer",IDC_OPT_PERIPHERALS_GENERAL_ZXPRINTER,5,149,160,11 + AUTOCHECKBOX "Speccy&Boot interface",IDC_OPT_PERIPHERALS_GENERAL_SPECCYBOOT,5,161,160,11 + AUTOCHECKBOX "Spec&Drum interface",IDC_OPT_PERIPHERALS_GENERAL_SPECDRUM,5,173,160,11 + AUTOCHECKBOX "Spectra&net",IDC_OPT_PERIPHERALS_GENERAL_SPECTRANET,5,185,160,11 + AUTOCHECKBOX "Spe&ctranet disable",IDC_OPT_PERIPHERALS_GENERAL_SPECTRANET_DISABLE,5,197,160,11 + AUTOCHECKBOX "uSo&urce",IDC_OPT_PERIPHERALS_GENERAL_USOURCE,5,209,160,11 + AUTOCHECKBOX "C&ovox interface",IDC_OPT_PERIPHERALS_GENERAL_COVOX,5,221,160,11 + DEFPUSHBUTTON "OK",IDOK,45,238,50,14 + PUSHBUTTON "Cancel",IDCANCEL,100,238,50,14 END diff -Nru fuse-emulator-1.3.6+dfsg1/ui.c fuse-emulator-1.3.7+dfsg1/ui.c --- fuse-emulator-1.3.6+dfsg1/ui.c 2016-11-24 12:02:24.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/ui.c 2017-07-02 05:36:42.000000000 +0000 @@ -235,7 +235,9 @@ { UI_MENU_ITEM_MACHINE_PROFILER, "/Machine/Profiler/Stop", "/Machine/Profiler/Start", 1 }, - + + { UI_MENU_ITEM_MACHINE_MULTIFACE, "/Machine/Multiface Red Button" }, + { UI_MENU_ITEM_MACHINE_DIDAKTIK80_SNAP, "/Machine/Didaktik SNAP" }, { UI_MENU_ITEM_MEDIA_CARTRIDGE, "/Media/Cartridge" }, diff -Nru fuse-emulator-1.3.6+dfsg1/unittests/unittests.c fuse-emulator-1.3.7+dfsg1/unittests/unittests.c --- fuse-emulator-1.3.6+dfsg1/unittests/unittests.c 2016-11-24 12:02:24.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/unittests/unittests.c 2017-07-02 05:36:42.000000000 +0000 @@ -40,6 +40,7 @@ #include "peripherals/ide/zxcf.h" #include "peripherals/if1.h" #include "peripherals/if2.h" +#include "peripherals/multiface.h" #include "peripherals/speccyboot.h" #include "peripherals/ula.h" #include "peripherals/usource.h" @@ -753,6 +754,7 @@ { r += if1_unittest(); r += if2_unittest(); + r += multiface_unittest(); r += speccyboot_unittest(); r += usource_unittest(); diff -Nru fuse-emulator-1.3.6+dfsg1/z80/coretest.c fuse-emulator-1.3.7+dfsg1/z80/coretest.c --- fuse-emulator-1.3.6+dfsg1/z80/coretest.c 2017-01-31 11:23:00.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/z80/coretest.c 2017-07-02 05:36:42.000000000 +0000 @@ -1,5 +1,5 @@ /* coretest.c: Test program for Fuse's Z80 core - Copyright (c) 2003-2015 Philip Kendall + Copyright (c) 2003-2017 Philip Kendall This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -537,6 +537,14 @@ { abort(); } + +int multiface_activated = 0; + +void +multiface_setic8( void ) +{ + abort(); +} void divide_set_automap( int state GCC_UNUSED ) diff -Nru fuse-emulator-1.3.6+dfsg1/z80/z80_checks.h fuse-emulator-1.3.7+dfsg1/z80/z80_checks.h --- fuse-emulator-1.3.6+dfsg1/z80/z80_checks.h 2016-11-24 12:02:24.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/z80/z80_checks.h 2017-07-02 05:36:42.000000000 +0000 @@ -6,6 +6,7 @@ SETUP_CHECK( didaktik80, didaktik80_available ) SETUP_CHECK( disciple, disciple_available ) SETUP_CHECK( usource, usource_available ) +SETUP_CHECK( multiface, multiface_activated ) SETUP_CHECK( if1p, if1_available ) SETUP_CHECK( divide_early, settings_current.divide_enabled ) SETUP_CHECK( spectranet_page, spectranet_available && !settings_current.spectranet_disable ) diff -Nru fuse-emulator-1.3.6+dfsg1/z80/z80_ops.c fuse-emulator-1.3.7+dfsg1/z80/z80_ops.c --- fuse-emulator-1.3.6+dfsg1/z80/z80_ops.c 2017-01-31 11:23:00.000000000 +0000 +++ fuse-emulator-1.3.7+dfsg1/z80/z80_ops.c 2017-07-02 05:36:42.000000000 +0000 @@ -40,6 +40,7 @@ #include "peripherals/disk/plusd.h" #include "peripherals/ide/divide.h" #include "peripherals/if1.h" +#include "peripherals/multiface.h" #include "peripherals/spectranet.h" #include "peripherals/ula.h" #include "peripherals/usource.h" @@ -213,6 +214,14 @@ } END_CHECK + + CHECK( multiface, multiface_activated ) + + if( PC == 0x0066 ) { + multiface_setic8(); + } + + END_CHECK CHECK( if1p, if1_available )