[Fuse-for-macosx-commits] SF.net SVN: fuse-for-macosx: [403] vendor/fuse-emulator/current
Brought to you by:
fredm
|
From: <fr...@us...> - 2007-06-28 13:18:20
|
Revision: 403
http://svn.sourceforge.net/fuse-for-macosx/?rev=403&view=rev
Author: fredm
Date: 2007-06-28 06:18:21 -0700 (Thu, 28 Jun 2007)
Log Message:
-----------
Load . into vendor/fuse-emulator/current.
Modified Paths:
--------------
vendor/fuse-emulator/current/fuse/Makefile.am
vendor/fuse-emulator/current/fuse/ay.c
vendor/fuse-emulator/current/fuse/ay.h
vendor/fuse-emulator/current/fuse/configure.in
vendor/fuse-emulator/current/fuse/dck.c
vendor/fuse-emulator/current/fuse/divide.c
vendor/fuse-emulator/current/fuse/divide.h
vendor/fuse-emulator/current/fuse/event.c
vendor/fuse-emulator/current/fuse/event.h
vendor/fuse-emulator/current/fuse/fuse.c
vendor/fuse-emulator/current/fuse/hacking/ChangeLog
vendor/fuse-emulator/current/fuse/if1.c
vendor/fuse-emulator/current/fuse/if1.h
vendor/fuse-emulator/current/fuse/if2.c
vendor/fuse-emulator/current/fuse/if2.h
vendor/fuse-emulator/current/fuse/joystick.c
vendor/fuse-emulator/current/fuse/joystick.h
vendor/fuse-emulator/current/fuse/keysyms.pl
vendor/fuse-emulator/current/fuse/machine.c
vendor/fuse-emulator/current/fuse/machine.h
vendor/fuse-emulator/current/fuse/machines/pentagon.c
vendor/fuse-emulator/current/fuse/machines/scorpion.c
vendor/fuse-emulator/current/fuse/machines/spec128.c
vendor/fuse-emulator/current/fuse/machines/spec16.c
vendor/fuse-emulator/current/fuse/machines/spec48.c
vendor/fuse-emulator/current/fuse/machines/spec_se.c
vendor/fuse-emulator/current/fuse/machines/specplus2.c
vendor/fuse-emulator/current/fuse/machines/specplus2a.c
vendor/fuse-emulator/current/fuse/machines/specplus3.c
vendor/fuse-emulator/current/fuse/machines/specplus3.h
vendor/fuse-emulator/current/fuse/machines/specplus3e.c
vendor/fuse-emulator/current/fuse/machines/tc2048.c
vendor/fuse-emulator/current/fuse/machines/tc2068.c
vendor/fuse-emulator/current/fuse/machines/ts2068.c
vendor/fuse-emulator/current/fuse/man/fuse.1
vendor/fuse-emulator/current/fuse/memory.c
vendor/fuse-emulator/current/fuse/memory.h
vendor/fuse-emulator/current/fuse/menu.c
vendor/fuse-emulator/current/fuse/menu_data.dat
vendor/fuse-emulator/current/fuse/periph.c
vendor/fuse-emulator/current/fuse/periph.h
vendor/fuse-emulator/current/fuse/printer.c
vendor/fuse-emulator/current/fuse/printer.h
vendor/fuse-emulator/current/fuse/roms/Makefile.am
vendor/fuse-emulator/current/fuse/rzx.c
vendor/fuse-emulator/current/fuse/rzx.h
vendor/fuse-emulator/current/fuse/scld.c
vendor/fuse-emulator/current/fuse/scld.h
vendor/fuse-emulator/current/fuse/settings.dat
vendor/fuse-emulator/current/fuse/simpleide.c
vendor/fuse-emulator/current/fuse/simpleide.h
vendor/fuse-emulator/current/fuse/slt.c
vendor/fuse-emulator/current/fuse/slt.h
vendor/fuse-emulator/current/fuse/snapshot.c
vendor/fuse-emulator/current/fuse/sound/alsasound.c
vendor/fuse-emulator/current/fuse/sound/coreaudiosound.c
vendor/fuse-emulator/current/fuse/spectrum.c
vendor/fuse-emulator/current/fuse/spectrum.h
vendor/fuse-emulator/current/fuse/tape.c
vendor/fuse-emulator/current/fuse/trdos.c
vendor/fuse-emulator/current/fuse/trdos.h
vendor/fuse-emulator/current/fuse/ui/gtk/gtkui.c
vendor/fuse-emulator/current/fuse/ui/options.dat
vendor/fuse-emulator/current/fuse/ui/svga/svgadisplay.c
vendor/fuse-emulator/current/fuse/ui/svga/svgakeyboard.c
vendor/fuse-emulator/current/fuse/ui/ui.h
vendor/fuse-emulator/current/fuse/ui/win32/win32ui.c
vendor/fuse-emulator/current/fuse/ui/xlib/xdisplay.c
vendor/fuse-emulator/current/fuse/ui/xlib/xui.c
vendor/fuse-emulator/current/fuse/ui.c
vendor/fuse-emulator/current/fuse/ula.c
vendor/fuse-emulator/current/fuse/ula.h
vendor/fuse-emulator/current/fuse/utils.c
vendor/fuse-emulator/current/fuse/widget/error.c
vendor/fuse-emulator/current/fuse/widget/memory.c
vendor/fuse-emulator/current/fuse/widget/menu.c
vendor/fuse-emulator/current/fuse/widget/options.pl
vendor/fuse-emulator/current/fuse/widget/pokefinder.c
vendor/fuse-emulator/current/fuse/widget/widget.c
vendor/fuse-emulator/current/fuse/widget/widget_internals.h
vendor/fuse-emulator/current/fuse/z80/coretest.c
vendor/fuse-emulator/current/fuse/z80/z80.c
vendor/fuse-emulator/current/fuse/z80/z80.h
vendor/fuse-emulator/current/fuse/z80/z80.pl
vendor/fuse-emulator/current/fuse/z80/z80_macros.h
vendor/fuse-emulator/current/fuse/z80/z80_ops.c
vendor/fuse-emulator/current/fuse/zxatasp.c
vendor/fuse-emulator/current/fuse/zxatasp.h
vendor/fuse-emulator/current/fuse/zxcf.c
vendor/fuse-emulator/current/fuse/zxcf.h
vendor/fuse-emulator/current/fuse-utils/hacking/ChangeLog
vendor/fuse-emulator/current/fuse-utils/man/fuse-utils.1
vendor/fuse-emulator/current/fusetest/Makefile
vendor/fuse-emulator/current/fusetest/fusetest.asm
vendor/fuse-emulator/current/fusetest/sync.asm
vendor/fuse-emulator/current/fusetest/tests.asm
vendor/fuse-emulator/current/libspectrum/hacking/ChangeLog
vendor/fuse-emulator/current/libspectrum/libspectrum.c
vendor/fuse-emulator/current/libspectrum/libspectrum.h.in
Added Paths:
-----------
vendor/fuse-emulator/current/fuse/disk/
vendor/fuse-emulator/current/fuse/disk/Makefile.am
vendor/fuse-emulator/current/fuse/disk/plusd.c
vendor/fuse-emulator/current/fuse/disk/plusd.h
vendor/fuse-emulator/current/fuse/disk/wd1770.c
vendor/fuse-emulator/current/fuse/disk/wd1770.h
vendor/fuse-emulator/current/fuse/module.c
vendor/fuse-emulator/current/fuse/module.h
vendor/fuse-emulator/current/fuse/roms/plusd.rom
vendor/fuse-emulator/current/fusetest/delay.asm
Modified: vendor/fuse-emulator/current/fuse/Makefile.am
===================================================================
--- vendor/fuse-emulator/current/fuse/Makefile.am 2007-06-27 12:52:44 UTC (rev 402)
+++ vendor/fuse-emulator/current/fuse/Makefile.am 2007-06-28 13:18:21 UTC (rev 403)
@@ -1,7 +1,7 @@
## Process this file with automake to produce Makefile.in
## Copyright (c) 1999-2004 Philip Kendall
-## $Id: Makefile.am 2920 2007-06-02 02:06:05Z fredm $
+## $Id: Makefile.am 3007 2007-06-17 18:50:48Z zubzero $
## 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
@@ -27,6 +27,7 @@
SUBDIRS = compat \
debugger \
+ @DISK@ \
hacking \
lib \
machines \
@@ -41,6 +42,7 @@
DIST_SUBDIRS = compat \
debugger \
+ disk \
hacking \
lib \
machines \
@@ -70,6 +72,7 @@
machine.c \
memory.c \
menu.c \
+ module.c \
periph.c \
printer.c \
profile.c \
@@ -98,6 +101,7 @@
fuse_LDADD = debugger/libdebugger.a \
@UI_LIBS@ \
+@DISK_LIBS@ \
machines/libmachines.a \
pokefinder/libpokefinder.a \
sound/libsound.a \
@@ -119,11 +123,12 @@
@WINDRES_OBJ@
fuse_DEPENDENCIES = @UI_LIBS@ \
+ @DISK_LIBS@ \
debugger/libdebugger.a \
machines/libmachines.a \
sound/libsound.a \
- z80/libz80.a \
- @WINDRES_OBJ@
+ z80/libz80.a \
+ @WINDRES_OBJ@
BUILT_SOURCES = settings.c settings.h
@@ -156,6 +161,7 @@
machine.h \
memory.h \
menu.h \
+ module.h \
periph.h \
psg.h \
rzx.h \
Modified: vendor/fuse-emulator/current/fuse/ay.c
===================================================================
--- vendor/fuse-emulator/current/fuse/ay.c 2007-06-27 12:52:44 UTC (rev 402)
+++ vendor/fuse-emulator/current/fuse/ay.c 2007-06-28 13:18:21 UTC (rev 403)
@@ -1,7 +1,7 @@
/* ay.c: AY-8-3912 routines
Copyright (c) 1999-2004 Philip Kendall
- $Id: ay.c 2889 2007-05-26 17:45:08Z zubzero $
+ $Id: ay.c 2993 2007-06-17 13:54:49Z pak21 $
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
@@ -27,6 +27,7 @@
#include "compat.h"
#include "machine.h"
+#include "module.h"
#include "printer.h"
#include "psg.h"
#include "sound.h"
@@ -40,6 +41,26 @@
};
+static void ay_from_snapshot( libspectrum_snap *snap );
+static void ay_to_snapshot( libspectrum_snap *snap );
+
+static module_info_t ay_module_info = {
+
+ NULL,
+ NULL,
+ ay_from_snapshot,
+ ay_to_snapshot,
+
+};
+
+int
+ay_init( void )
+{
+ module_register( &ay_module_info );
+
+ return 0;
+}
+
/* What happens when the AY register port (traditionally 0xfffd on the 128K
machines) is read from */
libspectrum_byte
@@ -97,12 +118,12 @@
if( current == 14 ) printer_serial_write( b );
}
-int
-ay_from_snapshot( libspectrum_snap *snap, int capabilities )
+static void
+ay_from_snapshot( libspectrum_snap *snap )
{
size_t i;
- if( capabilities & LIBSPECTRUM_MACHINE_CAPABILITY_AY ) {
+ if( machine_current->capabilities & LIBSPECTRUM_MACHINE_CAPABILITY_AY ) {
ay_registerport_write( 0xfffd,
libspectrum_snap_out_ay_registerport( snap ) );
@@ -114,11 +135,9 @@
}
}
-
- return 0;
}
-int
+static void
ay_to_snapshot( libspectrum_snap *snap )
{
size_t i;
@@ -130,6 +149,4 @@
for( i = 0; i < AY_REGISTERS; i++ )
libspectrum_snap_set_ay_registers( snap, i,
machine_current->ay.registers[i] );
-
- return 0;
}
Modified: vendor/fuse-emulator/current/fuse/ay.h
===================================================================
--- vendor/fuse-emulator/current/fuse/ay.h 2007-06-27 12:52:44 UTC (rev 402)
+++ vendor/fuse-emulator/current/fuse/ay.h 2007-06-28 13:18:21 UTC (rev 403)
@@ -1,7 +1,7 @@
/* ay.h: AY-8-3912 routines
Copyright (c) 1999-2004 Philip Kendall
- $Id: ay.h 2889 2007-05-26 17:45:08Z zubzero $
+ $Id: ay.h 2993 2007-06-17 13:54:49Z pak21 $
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
@@ -35,12 +35,11 @@
libspectrum_byte registers[ AY_REGISTERS ];
} ayinfo;
+int ay_init( void );
+
libspectrum_byte ay_registerport_read( libspectrum_word port, int *attached );
void ay_registerport_write( libspectrum_word port, libspectrum_byte b );
void ay_dataport_write( libspectrum_word port, libspectrum_byte b );
-int ay_from_snapshot( libspectrum_snap *snap, int capabilities );
-int ay_to_snapshot( libspectrum_snap *snap );
-
#endif /* #ifndef FUSE_AY_H */
Modified: vendor/fuse-emulator/current/fuse/configure.in
===================================================================
--- vendor/fuse-emulator/current/fuse/configure.in 2007-06-27 12:52:44 UTC (rev 402)
+++ vendor/fuse-emulator/current/fuse/configure.in 2007-06-28 13:18:21 UTC (rev 403)
@@ -1,5 +1,5 @@
dnl Process this file with autoconf to produce a configure script.
-dnl $Id: configure.in 2928 2007-06-03 13:39:12Z zubzero $
+dnl $Id: configure.in 3007 2007-06-17 18:50:48Z zubzero $
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
@@ -357,6 +357,14 @@
lib/tape_se.szx
lib/tape_ts2068.szx])
+dnl LibDsk/lib765 prefix
+AC_ARG_WITH(disk-prefix,
+[ --with-disk-prefix=PFX where the LibDsk and/or lib765 libraries are installed (optional)],
+DSK_CFLAGS=-I$withval/include; DSKLIBS=-L$withval/lib,
+DSK_CFLAGS=""; DSK_LIBS="")
+ac_save_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $DSK_CFLAGS"
+
dnl Do we want +3 disk support?
AC_MSG_CHECKING(whether +3 disk support requested)
AC_ARG_WITH(plus3-disk,
@@ -365,21 +373,27 @@
plus3disk=yes)
AC_MSG_RESULT($plus3disk)
if test "$plus3disk" = yes; then
- AC_ARG_WITH(plus3-disk-prefix,
- [ --with-plus3-disk-prefix=PFX where the +3 libraries are installed (optional)],
- DSK_CFLAGS=-I$withval/include; DSKLIBS=-L$withval/lib,
- DSK_CFLAGS=""; DSK_LIBS="")
- ac_save_CPPFLAGS="$CPPFLAGS"
- CPPFLAGS="$CPPFLAGS $DSK_CFLAGS"
AC_CHECK_HEADERS(765.h, DSKLIBS="$DSKLIBS -l765"; lib765=yes,
- AC_MSG_WARN(765.h not found - disk support disabled))
- if test "$lib765" = yes; then
- AC_CHECK_HEADERS(libdsk.h, DSKLIBS="$DSKLIBS -ldsk")
- fi
- CPPFLAGS="$ac_save_CPPFLAGS"
+ AC_MSG_WARN(765.h not found - +3 disk support disabled))
fi
+
+dnl Do we want LibDsk support?
+AC_ARG_WITH(libdsk,
+ [ --without-libdsk disable LibDsk support],
+ if test "$withval" = no; then libdsk=no; else libdsk=yes; fi,
+ libdsk=yes)
+AC_MSG_RESULT($libdsk)
+if test "$libdsk" = yes; then
+ AC_CHECK_HEADERS(libdsk.h, DSKLIBS="$DSKLIBS -ldsk";
+ DISK_LIBS="disk/libdisk.a"; DISK="disk",
+ AC_MSG_WARN(libdsk.h not found - LibDsk support disabled))
+fi
+
+CPPFLAGS="$ac_save_CPPFLAGS"
AC_SUBST(DSK_CFLAGS)
AC_SUBST(DSKLIBS)
+AC_SUBST(DISK_LIBS)
+AC_SUBST(DISK)
dnl Check if a version of libpng which supplies png_write_png is available
AC_CHECK_LIB( png, png_write_png,
@@ -567,6 +581,7 @@
AC_OUTPUT(Makefile \
compat/Makefile \
debugger/Makefile \
+disk/Makefile \
hacking/Makefile \
lib/Makefile \
machines/Makefile \
Modified: vendor/fuse-emulator/current/fuse/dck.c
===================================================================
--- vendor/fuse-emulator/current/fuse/dck.c 2007-06-27 12:52:44 UTC (rev 402)
+++ vendor/fuse-emulator/current/fuse/dck.c 2007-06-28 13:18:21 UTC (rev 403)
@@ -1,7 +1,7 @@
/* dck.c: dock snapshot (Warajevo .DCK) handling routines
Copyright (c) 2003-2004 Darren Salt, Fredrick Meunier, Philip Kendall
- $Id: dck.c 2889 2007-05-26 17:45:08Z zubzero $
+ $Id: dck.c 2995 2007-06-17 14:31:36Z pak21 $
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,7 +61,7 @@
error = settings_set_string( &settings_current.dck_file, filename );
if( error ) return error;
- machine_reset();
+ machine_reset( 0 );
return 0;
}
@@ -82,7 +82,7 @@
ui_menu_activate( UI_MENU_ITEM_MEDIA_CARTRIDGE_DOCK_EJECT, 0 );
- machine_reset();
+ machine_reset( 0 );
}
int
Added: vendor/fuse-emulator/current/fuse/disk/Makefile.am
===================================================================
--- vendor/fuse-emulator/current/fuse/disk/Makefile.am (rev 0)
+++ vendor/fuse-emulator/current/fuse/disk/Makefile.am 2007-06-28 13:18:21 UTC (rev 403)
@@ -0,0 +1,34 @@
+## Process this file with automake to produce Makefile.in
+## Copyright (c) 2007 Stuart Brady
+
+## $Id: Makefile.am 2889 2007-05-26 17:45:08Z zubzero $
+
+## 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:
+##
+## E-mail: phi...@sh...
+
+AUTOMAKE_OPTIONS = foreign
+
+noinst_LIBRARIES = libdisk.a
+
+INCLUDES = @LIBSPEC_CFLAGS@ @GTK_CFLAGS@ @GLIB_CFLAGS@
+
+libdisk_a_SOURCES = plusd.c \
+ wd1770.c
+
+noinst_HEADERS = plusd.h \
+ wd1770.h
Added: vendor/fuse-emulator/current/fuse/disk/plusd.c
===================================================================
--- vendor/fuse-emulator/current/fuse/disk/plusd.c (rev 0)
+++ vendor/fuse-emulator/current/fuse/disk/plusd.c 2007-06-28 13:18:21 UTC (rev 403)
@@ -0,0 +1,571 @@
+/* plusd.c: Routines for handling the +D interface
+ Copyright (c) 1999-2007 Stuart Brady, Fredrick Meunier, Philip Kendall,
+ Dmitry Sanarin, Darren Salt
+
+ $Id$
+
+ 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:
+
+ Philip: phi...@sh...
+
+ Stuart: sd...@nt...
+
+*/
+
+#include <config.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#ifdef HAVE_STRINGS_H
+#include <strings.h> /* Needed for strncasecmp() on QNX6 */
+#endif /* #ifdef HAVE_STRINGS_H */
+#include <limits.h>
+#include <sys/stat.h>
+
+#include <libdsk.h>
+
+#include <libspectrum.h>
+
+#include "compat.h"
+#include "event.h"
+#include "machine.h"
+#include "module.h"
+#include "plusd.h"
+#include "printer.h"
+#include "settings.h"
+#include "ui/ui.h"
+#include "utils.h"
+#include "wd1770.h"
+#include "z80/z80.h"
+
+int plusd_available = 0;
+int plusd_active = 0;
+int plusd_index_pulse = 0;
+
+wd1770_fdc plusd_fdc;
+wd1770_drive plusd_drives[ PLUSD_NUM_DRIVES ];
+
+static const char *plusd_template = "fuse.plusd.XXXXXX";
+
+static void plusd_reset( int hard_reset );
+static void plusd_memory_map( void );
+static void plusd_from_snapshot( libspectrum_snap *snap );
+static void plusd_to_snapshot( libspectrum_snap *snap );
+
+static module_info_t plusd_module_info = {
+
+ plusd_reset,
+ plusd_memory_map,
+ plusd_from_snapshot,
+ plusd_to_snapshot,
+
+};
+
+void
+plusd_page( void )
+{
+ plusd_active = 1;
+ machine_current->ram.romcs = 1;
+ machine_current->memory_map();
+}
+
+void
+plusd_unpage( void )
+{
+ plusd_active = 0;
+ machine_current->ram.romcs = 0;
+ machine_current->memory_map();
+}
+
+static void
+plusd_memory_map( void )
+{
+ if( !plusd_active ) return;
+
+ memory_map_read[ 0 ] = memory_map_write[ 0 ] = memory_map_romcs[ 0 ];
+ memory_map_read[ 1 ] = memory_map_write[ 1 ] = memory_map_ram[ 16 * 2 ];
+}
+
+void
+plusd_set_cmdint( wd1770_fdc *f )
+{
+ z80_interrupt();
+}
+
+const periph_t plusd_peripherals[] = {
+ /* ---- ---- 1110 0011 */
+ { 0x00ff, 0x00e3, plusd_sr_read, plusd_cr_write },
+ /* ---- ---- 1110 1011 */
+ { 0x00ff, 0x00eb, plusd_tr_read, plusd_tr_write },
+ /* ---- ---- 1111 0011 */
+ { 0x00ff, 0x00f3, plusd_sec_read, plusd_sec_write },
+ /* ---- ---- 1111 1011 */
+ { 0x00ff, 0x00fb, plusd_dr_read, plusd_dr_write },
+
+ /* ---- ---- 1110 1111 */
+ { 0x00ff, 0x00ef, NULL, plusd_cn_write },
+ /* ---- ---- 1110 0111 */
+ { 0x00ff, 0x00e7, plusd_mem_read, plusd_mem_write },
+ /* 0000 0000 1111 0111 */
+ { 0x00ff, 0x00f7, plusd_printer_read, printer_parallel_write },
+};
+
+const size_t plusd_peripherals_count =
+ sizeof( plusd_peripherals ) / sizeof( periph_t );
+
+int
+plusd_init( void )
+{
+ int i;
+ wd1770_drive *d;
+
+ plusd_fdc.current_drive = &plusd_drives[ 0 ];
+
+ for( i = 0; i < PLUSD_NUM_DRIVES; i++ ) {
+ d = &plusd_drives[ i ];
+
+ d->disk = NULL;
+ d->filename[0] = '\0';
+ }
+
+ plusd_fdc.set_cmdint = &plusd_set_cmdint;
+ plusd_fdc.reset_cmdint = NULL;
+ plusd_fdc.set_datarq = NULL;
+ plusd_fdc.reset_datarq = NULL;
+ plusd_fdc.iface = NULL;
+
+ plusd_fdc.rates[ 0 ] = 6;
+ plusd_fdc.rates[ 1 ] = 12;
+ plusd_fdc.rates[ 2 ] = 2;
+ plusd_fdc.rates[ 3 ] = 3;
+
+ module_register( &plusd_module_info );
+
+ return 0;
+}
+
+static void
+plusd_reset( int hard_reset )
+{
+ int i;
+ wd1770_drive *d;
+ wd1770_fdc *f = &plusd_fdc;
+
+ plusd_available = 0;
+
+ if( !periph_plusd_active )
+ return;
+
+ machine_load_rom_bank( memory_map_romcs, 0, 0,
+ settings_default.rom_plusd,
+ settings_current.rom_plusd, 0x2000 );
+
+ memory_map_romcs[0].source = MEMORY_SOURCE_PERIPHERAL;
+
+ machine_current->ram.romcs = 0;
+
+ memory_map_romcs[ 0 ].writable = 0;
+ memory_map_romcs[ 1 ].writable = 0;
+ memory_map_ram[ 16 * 2 ].writable = 1;
+
+ plusd_available = 1;
+ plusd_active = 0;
+ plusd_index_pulse = 0;
+
+ if( hard_reset ) {
+ for( i = 0; i < 8192; i++ ) {
+ memory_map_ram[ 16 * 2 ].page[ i ] = 0;
+ }
+ }
+
+ f->spin_cycles = 0;
+ f->direction = 0;
+
+ f->state = wd1770_state_none;
+ f->status_type = wd1770_status_type1;
+
+ f->status_register = 0;
+ f->track_register = 0;
+ f->sector_register = 0;
+ f->data_register = 0;
+
+ for( i = 0; i < PLUSD_NUM_DRIVES; i++ ) {
+ d = &plusd_drives[ i ];
+
+ d->index_pulse = 0;
+ d->index_interrupt = 0;
+ d->track = 0;
+ d->side = 0;
+ }
+
+ f->status_register |= WD1770_SR_LOST; /* track 0 */
+
+ /* We can eject disks only if they are currently present */
+ ui_menu_activate( UI_MENU_ITEM_MEDIA_DISK_PLUSD_1_EJECT,
+ !!plusd_drives[ PLUSD_DRIVE_1 ].disk );
+ ui_menu_activate( UI_MENU_ITEM_MEDIA_DISK_PLUSD_2_EJECT,
+ !!plusd_drives[ PLUSD_DRIVE_2 ].disk );
+
+ plusd_fdc.current_drive = &plusd_drives[ 0 ];
+ machine_current->memory_map();
+ plusd_event_index( 0 );
+
+ ui_statusbar_update( UI_STATUSBAR_ITEM_DISK, UI_STATUSBAR_STATE_INACTIVE );
+}
+
+void
+plusd_end( void )
+{
+ plusd_available = 0;
+}
+
+libspectrum_byte
+plusd_sr_read( libspectrum_word port GCC_UNUSED, int *attached )
+{
+ *attached = 1;
+ return wd1770_sr_read( &plusd_fdc );
+}
+
+void
+plusd_cr_write( libspectrum_word port GCC_UNUSED, libspectrum_byte b )
+{
+ wd1770_cr_write( &plusd_fdc, b );
+}
+
+libspectrum_byte
+plusd_tr_read( libspectrum_word port GCC_UNUSED, int *attached )
+{
+ *attached = 1;
+ return wd1770_tr_read( &plusd_fdc );
+}
+
+void
+plusd_tr_write( libspectrum_word port GCC_UNUSED, libspectrum_byte b )
+{
+ wd1770_tr_write( &plusd_fdc, b );
+}
+
+libspectrum_byte
+plusd_sec_read( libspectrum_word port GCC_UNUSED, int *attached )
+{
+ *attached = 1;
+ return wd1770_sec_read( &plusd_fdc );
+}
+
+void
+plusd_sec_write( libspectrum_word port GCC_UNUSED, libspectrum_byte b )
+{
+ wd1770_sec_write( &plusd_fdc, b );
+}
+
+libspectrum_byte
+plusd_dr_read( libspectrum_word port GCC_UNUSED, int *attached )
+{
+ *attached = 1;
+ return wd1770_dr_read( &plusd_fdc );
+}
+
+void
+plusd_dr_write( libspectrum_word port GCC_UNUSED, libspectrum_byte b )
+{
+ wd1770_dr_write( &plusd_fdc, b );
+}
+
+void
+plusd_cn_write( libspectrum_word port GCC_UNUSED, libspectrum_byte b )
+{
+ int drive, side;
+ int i;
+
+ drive = ( b & 0x03 ) == 2 ? 1 : 0;
+ side = ( b & 0x80 ) ? 1 : 0;
+
+ /* TODO: set current_drive to NULL when bits 0 and 1 of b are '00' or '11' */
+ plusd_fdc.current_drive = &plusd_drives[ drive ];
+
+ for( i = 0; i < PLUSD_NUM_DRIVES; i++ ) {
+ plusd_drives[ i ].side = side;
+ }
+
+ printer_parallel_strobe_write( b & 0x40 );
+}
+
+libspectrum_byte
+plusd_mem_read( libspectrum_word port GCC_UNUSED, int *attached )
+{
+ plusd_page();
+ return 0;
+}
+
+void
+plusd_mem_write( libspectrum_word port GCC_UNUSED, libspectrum_byte b )
+{
+ plusd_unpage();
+}
+
+libspectrum_byte
+plusd_printer_read( libspectrum_word port GCC_UNUSED, int *attached )
+{
+ *attached = 1;
+
+ /* bit 7 = busy. other bits high? */
+
+ if(!settings_current.printer)
+ return(0xff); /* no printer attached */
+
+ return(0x7f); /* never busy */
+}
+
+int
+plusd_disk_insert_default_autoload( plusd_drive_number which,
+ const char *filename )
+{
+ return plusd_disk_insert( which, filename, settings_current.auto_load );
+}
+
+int
+plusd_disk_insert( plusd_drive_number which, const char *filename,
+ int autoload )
+{
+ int fd, error;
+ char tempfilename[ PATH_MAX ];
+ int israw = 0;
+ dsk_format_t fmt;
+ wd1770_drive *d;
+ int l;
+
+ if( which >= PLUSD_NUM_DRIVES ) {
+ ui_error( UI_ERROR_ERROR, "plusd_disk_insert: unknown drive %d",
+ which );
+ fuse_abort();
+ }
+
+ d = &plusd_drives[ which ];
+
+ /* Eject any disk already in the drive */
+ if( d->disk ) {
+ /* Abort the insert if we want to keep the current disk */
+ if( plusd_disk_eject( which, 0 ) ) return 0;
+ }
+
+ /* Make a temporary copy of the disk file */
+ error = utils_make_temp_file( &fd, tempfilename, filename, plusd_template );
+ if( error ) return error;
+ strcpy( d->filename, tempfilename );
+
+ /* Determine the disk image format */
+ l = strlen( filename );
+ if( l >= 5 ) {
+ if( !strcmp( filename + ( l - 4 ), ".dsk" ) ||
+ !strcmp( filename + ( l - 4 ), ".mgt" ) ) {
+ israw = 1;
+ fmt = FMT_800K;
+ } else if( !strcmp( filename + ( l - 4 ), ".img" ) ) {
+ israw = 1;
+ fmt = FMT_MGT800;
+ }
+ }
+
+ /* And now insert the disk */
+ if( israw ) {
+
+ /* If the "logical" driver is not available, try the "raw" driver (unless
+ * we're using FMT_MGT800, for which the raw driver will not work */
+ if( dsk_open( &d->disk, tempfilename, "logical", NULL ) != DSK_ERR_OK &&
+ ( fmt == FMT_MGT800 ||
+ dsk_open( &d->disk, tempfilename, "raw", NULL ) != DSK_ERR_OK ) ) {
+ ui_error( UI_ERROR_ERROR, "Failed to open disk image" );
+ return 1;
+ }
+
+ if( dg_stdformat( &d->geom, fmt, NULL, NULL ) != DSK_ERR_OK ) {
+ ui_error( UI_ERROR_ERROR, "Failed to set geometry for disk" );
+ dsk_close( &d->disk );
+ return 1;
+ }
+
+ } else {
+
+ if( dsk_open( &d->disk, tempfilename, NULL, NULL ) != DSK_ERR_OK ) {
+ ui_error( UI_ERROR_ERROR, "Failed to open disk image" );
+ return 1;
+ }
+
+ if( dsk_getgeom( d->disk, &d->geom ) != DSK_ERR_OK ) {
+ ui_error( UI_ERROR_ERROR, "Failed to determine geometry for disk" );
+ dsk_close( &d->disk );
+ return 1;
+ }
+
+ }
+
+ /* Set the 'eject' item active */
+ switch( which ) {
+ case PLUSD_DRIVE_1:
+ ui_menu_activate( UI_MENU_ITEM_MEDIA_DISK_PLUSD_1_EJECT, 1 );
+ break;
+ case PLUSD_DRIVE_2:
+ ui_menu_activate( UI_MENU_ITEM_MEDIA_DISK_PLUSD_2_EJECT, 1 );
+ break;
+ }
+
+ if( autoload ) {
+ /* XXX */
+ }
+
+ return 0;
+}
+
+int
+plusd_disk_eject( plusd_drive_number which, int write )
+{
+ wd1770_drive *d;
+
+ if( which >= PLUSD_NUM_DRIVES )
+ return 1;
+
+ d = &plusd_drives[ which ];
+
+ if( !d->disk )
+ return 0;
+
+ if( write ) {
+
+ if( ui_plusd_disk_write( which ) ) return 1;
+
+ } else {
+
+ if( dsk_dirty( plusd_drives[which].disk ) ) {
+
+ ui_confirm_save_t confirm = ui_confirm_save(
+ "Disk has been modified.\nDo you want to save it?"
+ );
+
+ switch( confirm ) {
+
+ case UI_CONFIRM_SAVE_SAVE:
+ if( ui_plusd_disk_write( which ) ) return 1;
+ break;
+
+ case UI_CONFIRM_SAVE_DONTSAVE: break;
+ case UI_CONFIRM_SAVE_CANCEL: return 1;
+
+ }
+ }
+ }
+
+ dsk_close( &d->disk );
+ unlink( d->filename );
+
+ /* Set the 'eject' item inactive */
+ switch( which ) {
+ case PLUSD_DRIVE_1:
+ ui_menu_activate( UI_MENU_ITEM_MEDIA_DISK_PLUSD_1_EJECT, 0 );
+ break;
+ case PLUSD_DRIVE_2:
+ ui_menu_activate( UI_MENU_ITEM_MEDIA_DISK_PLUSD_2_EJECT, 0 );
+ break;
+ }
+ return 0;
+}
+
+int
+plusd_disk_write( plusd_drive_number which, const char *filename )
+{
+ wd1770_drive *d = &plusd_drives[ which ];
+ utils_file file;
+ FILE *f;
+ int error;
+ size_t bytes_written;
+
+ dsk_close( &d->disk );
+
+ f = fopen( filename, "wb" );
+ if( !f ) {
+ ui_error( UI_ERROR_ERROR, "couldn't open '%s' for writing: %s", filename,
+ strerror( errno ) );
+ }
+
+ error = utils_read_file( d->filename, &file );
+ if( error ) { fclose( f ); return error; }
+
+ bytes_written = fwrite( file.buffer, 1, file.length, f );
+ if( bytes_written != file.length ) {
+ ui_error( UI_ERROR_ERROR, "could write only %lu of %lu bytes to '%s'",
+ (unsigned long)bytes_written, (unsigned long)file.length,
+ filename );
+ utils_close_file( &file ); fclose( f );
+ }
+
+ error = utils_close_file( &file ); if( error ) { fclose( f ); return error; }
+
+ if( fclose( f ) ) {
+ ui_error( UI_ERROR_ERROR, "error closing '%s': %s", filename,
+ strerror( errno ) );
+ return 1;
+ }
+
+ return 0;
+}
+
+int
+plusd_event_cmd_done( libspectrum_dword last_tstates )
+{
+ plusd_fdc.status_register &= ~WD1770_SR_BUSY;
+ return 0;
+}
+
+int
+plusd_event_index( libspectrum_dword last_tstates )
+{
+ int error;
+ int next_tstates;
+ int i;
+
+ plusd_index_pulse = !plusd_index_pulse;
+ for( i = 0; i < PLUSD_NUM_DRIVES; i++ ) {
+ wd1770_drive *d = &plusd_drives[ i ];
+
+ d->index_pulse = plusd_index_pulse;
+ if( !plusd_index_pulse && d->index_interrupt ) {
+ wd1770_set_cmdint( &plusd_fdc );
+ d->index_interrupt = 0;
+ }
+ }
+ next_tstates = ( plusd_index_pulse ? 10 : 190 ) *
+ machine_current->timings.processor_speed / 1000;
+ error = event_add( last_tstates + next_tstates, EVENT_TYPE_PLUSD_INDEX );
+ if( error )
+ return error;
+ return 0;
+}
+
+static void
+plusd_from_snapshot( libspectrum_snap *snap )
+{
+ /* XXX */
+}
+
+static void
+plusd_to_snapshot( libspectrum_snap *snap )
+{
+ /* XXX */
+}
Added: vendor/fuse-emulator/current/fuse/disk/plusd.h
===================================================================
--- vendor/fuse-emulator/current/fuse/disk/plusd.h (rev 0)
+++ vendor/fuse-emulator/current/fuse/disk/plusd.h 2007-06-28 13:18:21 UTC (rev 403)
@@ -0,0 +1,94 @@
+/* plusd.h: Routines for handling the +D interface
+ Copyright (c) 2005-2007 Stuart Brady
+
+ $Id$
+
+ 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:
+
+ Philip: phi...@sh...
+
+ Stuart: sd...@nt...
+
+*/
+
+#ifndef FUSE_PLUSD_H
+#define FUSE_PLUSD_H
+
+#include <config.h>
+
+typedef enum plusd_drive_number {
+ PLUSD_DRIVE_1 = 0,
+ PLUSD_DRIVE_2,
+} plusd_drive_number;
+
+#ifdef HAVE_LIBDSK_H
+
+#include <libspectrum.h>
+
+#include "wd1770.h"
+#include "periph.h"
+
+extern int plusd_available; /* Is the +D available for use? */
+extern int plusd_active; /* +D enabled? */
+extern int plusd_index_pulse;
+
+extern const periph_t plusd_peripherals[];
+extern const size_t plusd_peripherals_count;
+
+int plusd_init( void );
+void plusd_end( void );
+
+void plusd_page( void );
+void plusd_unpage( void );
+
+libspectrum_byte plusd_sr_read( libspectrum_word port, int *attached );
+void plusd_cr_write( libspectrum_word port, libspectrum_byte b );
+
+libspectrum_byte plusd_tr_read( libspectrum_word port, int *attached );
+void plusd_tr_write( libspectrum_word port, libspectrum_byte b );
+
+libspectrum_byte plusd_sec_read( libspectrum_word port, int *attached );
+void plusd_sec_write( libspectrum_word port, libspectrum_byte b );
+
+libspectrum_byte plusd_dr_read( libspectrum_word port, int *attached );
+void plusd_dr_write( libspectrum_word port, libspectrum_byte b );
+
+libspectrum_byte plusd_joy_read( libspectrum_word port, int *attached );
+void plusd_cn_write( libspectrum_word port, libspectrum_byte b );
+
+libspectrum_byte plusd_mem_read( libspectrum_word port, int *attached );
+void plusd_mem_write( libspectrum_word port, libspectrum_byte b );
+
+libspectrum_byte plusd_printer_read( libspectrum_word port, int *attached );
+
+extern wd1770_fdc plusd_fdc;
+
+#define PLUSD_NUM_DRIVES 2
+extern wd1770_drive plusd_drives[ PLUSD_NUM_DRIVES ];
+
+int plusd_disk_insert( plusd_drive_number which, const char *filename,
+ int autoload );
+int plusd_disk_insert_default_autoload( plusd_drive_number which,
+ const char *filename );
+int plusd_disk_eject( plusd_drive_number which, int write );
+int plusd_disk_write( plusd_drive_number which, const char *filename );
+int plusd_event_cmd_done( libspectrum_dword last_tstates );
+int plusd_event_index( libspectrum_dword last_tstates );
+
+#endif /* #ifndef HAVE_LIBDSK_H */
+
+#endif /* #ifndef FUSE_PLUSD_H */
Added: vendor/fuse-emulator/current/fuse/disk/wd1770.c
===================================================================
--- vendor/fuse-emulator/current/fuse/disk/wd1770.c (rev 0)
+++ vendor/fuse-emulator/current/fuse/disk/wd1770.c 2007-06-28 13:18:21 UTC (rev 403)
@@ -0,0 +1,389 @@
+/* wd1770.c: Routines for handling the WD1770 floppy disk controller
+ Copyright (c) 2002-2007 Stuart Brady, Fredrick Meunier, Philip Kendall,
+ Dmitry Sanarin
+
+ $Id$
+
+ 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:
+
+ Philip: phi...@sh...
+
+ Stuart: sd...@nt...
+
+*/
+
+#include <config.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#ifdef HAVE_STRINGS_H
+#include <strings.h> /* Needed for strncasecmp() on QNX6 */
+#endif /* #ifdef HAVE_STRINGS_H */
+#include <limits.h>
+#include <sys/stat.h>
+
+#include <libdsk.h>
+
+#include <libspectrum.h>
+
+#include "compat.h"
+#include "event.h"
+#include "machine.h"
+#include "ui/ui.h"
+#include "wd1770.h"
+#include "z80/z80.h"
+
+char secbuf[1024];
+
+void
+statusbar_update( int busy )
+{
+ ui_statusbar_update( UI_STATUSBAR_ITEM_DISK,
+ busy ? UI_STATUSBAR_STATE_ACTIVE :
+ UI_STATUSBAR_STATE_INACTIVE );
+}
+
+void
+wd1770_set_cmdint( wd1770_fdc *f )
+{
+ if( f->set_cmdint )
+ f->set_cmdint( f );
+}
+
+void
+wd1770_reset_cmdint( wd1770_fdc *f )
+{
+ if( f->reset_cmdint )
+ f->reset_cmdint( f );
+}
+
+void
+wd1770_set_datarq( wd1770_fdc *f )
+{
+ f->status_register |= WD1770_SR_IDX_DRQ;
+ if( f->set_datarq )
+ f->set_datarq( f );
+}
+
+void
+wd1770_reset_datarq( wd1770_fdc *f )
+{
+ f->status_register &= ~WD1770_SR_IDX_DRQ;
+ if( f->reset_datarq )
+ f->reset_datarq( f );
+}
+
+static void
+wd1770_seek( wd1770_fdc *f, int track, int update, int verify )
+{
+ wd1770_drive *d = f->current_drive;
+
+ if( track < d->track ) {
+ f->direction = -1;
+ if( f->track_register == 0 )
+ f->track_register = 255;
+ else if( update ) {
+ int trk = f->track_register;
+
+ trk += track - d->track + 256;
+ trk %= 256;
+ f->track_register = trk;
+ }
+ } else if( track > d->track ) {
+ f->direction = 1;
+ if( f->track_register == 255 )
+ f->track_register = 0;
+ else if( update ) {
+ int trk = f->track_register;
+
+ trk += track - d->track;
+ trk %= 256;
+ f->track_register = trk;
+ }
+ }
+
+ if( verify ) {
+ if( track < 0 )
+ f->status_register |= WD1770_SR_RNF;
+ else if( track >= d->geom.dg_cylinders )
+ f->status_register |= WD1770_SR_RNF;
+ else
+ f->status_register &= ~WD1770_SR_RNF;
+ } else
+ f->status_register &= ~WD1770_SR_RNF;
+
+ if( track < 0 )
+ track = 0;
+ if( track > 255 )
+ track = 255;
+ d->track = track;
+
+ if( d->track == 0 )
+ f->status_register |= WD1770_SR_LOST;
+ else
+ f->status_register &= ~WD1770_SR_LOST;
+}
+
+libspectrum_byte
+wd1770_sr_read( wd1770_fdc *f )
+{
+ wd1770_drive *d = f->current_drive;
+
+ f->status_register &= ~( WD1770_SR_MOTORON | WD1770_SR_SPINUP |
+ WD1770_SR_WRPROT | WD1770_SR_CRCERR );
+ if( f->status_type == wd1770_status_type1 ) {
+ f->status_register &= ~WD1770_SR_IDX_DRQ;
+ if( !d->disk || d->index_pulse )
+ f->status_register |= WD1770_SR_IDX_DRQ;
+ }
+ return f->status_register;
+}
+
+
+void
+wd1770_cr_write( wd1770_fdc *f, libspectrum_byte b )
+{
+ wd1770_drive *d = f->current_drive;
+
+ /* command register: */
+ if( ( b & 0xf0 ) == 0xd0 ) { /* Type IV - Force Interrupt */
+ statusbar_update(0);
+ f->status_register &= ~WD1770_SR_BUSY;
+ f->status_register &= ~WD1770_SR_WRPROT;
+ f->status_register &= ~WD1770_SR_CRCERR;
+ f->status_register &= ~WD1770_SR_IDX_DRQ;
+ f->state = wd1770_state_none;
+ f->status_type = wd1770_status_type1;
+ if( d->track == 0 )
+ f->status_register |= WD1770_SR_LOST;
+ else
+ f->status_register &= ~WD1770_SR_LOST;
+ wd1770_reset_datarq( f );
+ if( b & 0x08 )
+ wd1770_set_cmdint( f );
+ if( b & 0x04 )
+ d->index_interrupt = 1;
+ return;
+ }
+
+ if( f->status_register & WD1770_SR_BUSY )
+ return;
+
+ /*
+ f->status_register |= WD1770_SR_BUSY;
+ event_add( tstates +
+ 10 * machine_current->timings.processor_speed / 1000,
+ EVENT_TYPE_PLUSD_CMD_DONE );
+ */
+
+ if( !( b & 0x08 ) ) {
+ f->spin_cycles = 5;
+ f->status_register |= WD1770_SR_MOTORON;
+ f->status_register |= WD1770_SR_SPINUP;
+ }
+
+ if( !( b & 0x80 ) ) { /* Type I */
+ int update = b & 0x10 ? 1 : 0;
+ int verify = b & 0x04 ? 1 : 0;
+/* int rate = b & 0x03 ? 1 : 0; */
+
+ switch( ( b >> 5 ) & 0x03 ) {
+ case 0x00:
+ if( ( b & 0x4 ) ) { /* Restore */
+ f->track_register = d->track;
+ wd1770_seek( f, 0, update, verify );
+ } else { /* Seek */
+ wd1770_seek( f, f->data_register, 0, verify );
+ }
+ f->direction = 1;
+ break;
+ case 0x01: /* Step */
+ wd1770_seek( f, d->track + f->direction, update, verify );
+ break;
+ case 0x02: /* Step In */
+ wd1770_seek( f, d->track + 1, update, verify );
+ break;
+ case 0x03: /* Step Out */
+ wd1770_seek( f, d->track - 1, update, verify );
+ break;
+ }
+ f->status_type = wd1770_status_type1;
+ wd1770_set_cmdint( f );
+ wd1770_reset_datarq( f );
+ } else if( !( b & 0x40 ) ) { /* Type II */
+ int multisector = b & 0x10 ? 1 : 0;
+/* int delay = b & 0x04 ? 1 : 0; */
+
+ if( !( b & 0x20 ) ) { /* Read Sector */
+ f->state = wd1770_state_read;
+ } else { /* Write Sector */
+/* int dammark = b & 0x01; */
+
+ f->state = wd1770_state_write;
+ }
+ if( f->sector_register < d->geom.dg_secbase ||
+ f->sector_register >= d->geom.dg_secbase + d->geom.dg_sectors ||
+ d->track >= d->geom.dg_cylinders ||
+ d->track < 0 ) {
+ f->status_register |= WD1770_SR_RNF;
+ wd1770_set_cmdint( f );
+ wd1770_reset_datarq( f );
+ } else {
+ wd1770_set_datarq( f );
+ statusbar_update(1);
+ f->status_register |= WD1770_SR_BUSY;
+ f->status_register &= ~( WD1770_SR_WRPROT | WD1770_SR_RNF |
+ WD1770_SR_CRCERR | WD1770_SR_LOST );
+ f->status_type = wd1770_status_type2;
+ f->data_track = d->track;
+ f->data_sector = f->sector_register;
+ f->data_side = d->side;
+ f->data_offset = 0;
+ f->data_multisector = multisector;
+ }
+ } else if( ( b & 0xf0 ) != 0xd0 ) { /* Type III */
+/* int delay = b & 0x04; */
+
+ switch( b & 0xf0 ) {
+ case 0x00: /* Read Track */
+ fprintf( stderr, "read track not yet implemented\n" );
+ break;
+ case 0x01: /* Write Track */
+ fprintf( stderr, "write track not yet implemented\n" );
+ break;
+ case 0x02: /* Read Address */
+ fprintf( stderr, "read address not yet implemented\n" );
+ break;
+ }
+ f->status_type = wd1770_status_type2;
+ }
+}
+
+libspectrum_byte
+wd1770_tr_read( wd1770_fdc *f )
+{
+ return f->track_register;
+}
+
+void
+wd1770_tr_write( wd1770_fdc *f, libspectrum_byte b )
+{
+ f->track_register = b;
+}
+
+libspectrum_byte
+wd1770_sec_read( wd1770_fdc *f )
+{
+ return f->sector_register;
+}
+
+void
+wd1770_sec_write( wd1770_fdc *f, libspectrum_byte b )
+{
+ f->sector_register = b;
+}
+
+libspectrum_byte
+wd1770_dr_read( wd1770_fdc *f )
+{
+ wd1770_drive *d = f->current_drive;
+
+ if( f->state == wd1770_state_read ) {
+ if( !d->disk ||
+ f->data_sector >= d->geom.dg_secbase + d->geom.dg_sectors ||
+ f->data_track >= d->geom.dg_cylinders ||
+ f->data_side >= d->geom.dg_heads ) {
+ f->status_register |= WD1770_SR_RNF;
+ fprintf( stderr, "read from non-existent sector\n" );
+ return f->data_register;
+ }
+
+ if( f->data_offset == 0 &&
+ ( d->geom.dg_secsize > sizeof( secbuf ) ||
+ dsk_pread( d->disk, &d->geom, secbuf, f->data_track,
+ f->data_side, f->data_sector ) != DSK_ERR_OK ) ) {
+ f->status_register |= WD1770_SR_RNF;
+ statusbar_update(0);
+ f->status_register &= ~WD1770_SR_BUSY;
+ f->status_type = wd1770_status_type2;
+ f->state = wd1770_state_none;
+ wd1770_set_cmdint( f );
+ wd1770_reset_datarq( f );
+ } else if( f->data_offset < d->geom.dg_secsize ) {
+ f->data_register = secbuf[ f->data_offset++ ];
+ if( f->data_offset == d->geom.dg_secsize ) {
+ if( f->data_multisector &&
+ f->data_sector < d->geom.dg_secbase + d->geom.dg_sectors ) {
+ f->data_sector++;
+ f->data_offset = 0;
+ }
+ if( !f->data_multisector ||
+ f->data_sector >= d->geom.dg_secbase + d->geom.dg_sectors ) {
+ statusbar_update(0);
+ f->status_register &= ~WD1770_SR_BUSY;
+ f->status_type = wd1770_status_type2;
+ f->state = wd1770_state_none;
+ wd1770_set_cmdint( f );
+ wd1770_reset_datarq( f );
+ }
+ }
+ }
+ }
+ return f->data_register;
+}
+
+void
+wd1770_dr_write( wd1770_fdc *f, libspectrum_byte b )
+{
+ wd1770_drive *d = f->current_drive;
+
+ f->data_register = b;
+ if( f->state == wd1770_state_write ) {
+ if( !d->disk || f->data_sector >= d->geom.dg_secbase + d->geom.dg_sectors ||
+ f->data_track >= d->geom.dg_cylinders ||
+ f->data_side >= d->geom.dg_heads ) {
+ f->status_register |= WD1770_SR_RNF;
+ fprintf( stderr, "write to non-existent sector\n" );
+ return;
+ }
+
+ if( f->data_offset < sizeof( secbuf ) )
+ secbuf[ f->data_offset++ ] = b;
+ if( f->data_offset == d->geom.dg_secsize ) {
+ dsk_pwrite( d->disk, &d->geom, secbuf, f->data_track,
+ f->data_side, f->data_sector );
+ if( f->data_multisector &&
+ f->data_sector < d->geom.dg_secbase + d->geom.dg_sectors ) {
+ f->data_sector++;
+ f->data_offset = 0;
+ }
+ if( !f->data_multisector ||
+ f->data_sector >= d->geom.dg_secbase + d->geom.dg_sectors ) {
+ statusbar_update(0);
+ f->status_register &= ~WD1770_SR_BUSY;
+ f->status_type = wd1770_status_type2;
+ f->state = wd1770_state_none;
+ wd1770_set_cmdint( f );
+ wd1770_reset_datarq( f );
+ }
+ }
+ }
+}
Added: vendor/fuse-emulator/current/fuse/disk/wd1770.h
===================================================================
--- vendor/fuse-emulator/current/fuse/disk/wd1770.h (rev 0)
+++ vendor/fuse-emulator/current/fuse/disk/wd1770.h 2007-06-28 13:18:21 UTC (rev 403)
@@ -0,0 +1,119 @@
+/* wd1770.h: Routines for handling the WD1770 floppy disk controller
+ Copyright (c) 2003-2007 Stuart Brady, Fredrick Meunier, Philip Kendall
+
+ $Id$
+
+ 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:
+
+ Philip: phi...@sh...
+
+ Stuart: sd...@nt...
+
+*/
+
+#ifndef FUSE_WD1770_H
+#define FUSE_WD1770_H
+
+#include <libdsk.h>
+
+#include <libspectrum.h>
+
+#include "fuse.h"
+
+static const int WD1770_SR_MOTORON = 1<<7; /* Motor on */
+static const int WD1770_SR_WRPROT = 1<<6; /* Write-protect */
+static const int WD1770_SR_SPINUP = 1<<5; /* Record type / Spin-up complete */
+static const int WD1770_SR_RNF = 1<<4; /* Record Not Found */
+static const int WD1770_SR_CRCERR = 1<<3; /* CRC error */
+static const int WD1770_SR_LOST = 1<<2; /* Lost data */
+static const int WD1770_SR_IDX_DRQ = 1<<1; /* Index pulse / Data request */
+static const int WD1770_SR_BUSY = 1<<0; /* Busy (command under execution) */
+
+extern int wd1770_index_pulse;
+extern int wd1770_index_interrupt;
+
+typedef struct wd1770_drive {
+ DSK_PDRIVER disk;
+ DSK_GEOMETRY geom;
+ char filename[ PATH_MAX ];
+
+ int index_pulse;
+ int index_interrupt;
+
+ int track;
+ int side;
+} wd1770_drive;
+
+typedef struct wd1770_fdc {
+ wd1770_drive *current_drive;
+
+ int rates[ 4 ];
+ int spin_cycles;
+ int direction; /* 0 = spindlewards, 1 = rimwards */
+
+ enum wd1770_state {
+ wd1770_state_none = 0,
+ wd1770_state_seek,
+ wd1770_state_read,
+ wd1770_state_write,
+ wd1770_state_readtrack,
+ wd1770_state_writetrack,
+ wd1770_state_readid,
+ } state;
+
+ enum wd1770_status_type {
+ wd1770_status_type1,
+ wd1770_status_type2,
+ } status_type;
+
+ /* state during transfer */
+ int data_track;
+ int data_sector;
+ int data_side;
+ int data_multisector;
+ int data_offset;
+
+ libspectrum_byte status_register; /* status register */
+ libspectrum_byte track_register; /* track register */
+ libspectrum_byte sector_register; /* sector register */
+ libspectrum_byte data_register; /* data register */
+
+ void ( *set_cmdint ) ( struct wd1770_fdc *f );
+ void ( *reset_cmdint ) ( struct wd1770_fdc *f );
+ void ( *set_datarq ) ( struct wd1770_fdc *f );
+ void ( *reset_datarq ) ( struct wd1770_fdc *f );
+ void *iface;
+} wd1770_fdc;
+
+libspectrum_byte wd1770_sr_read( wd1770_fdc *f );
+void wd1770_cr_write( wd1770_fdc *f, libspectrum_byte b );
+
+libspectrum_byte wd1770_tr_read( wd1770_fdc *f );
+void wd1770_tr_write( wd1770_fdc *f, libspectrum_byte b );
+
+libspectrum_byte wd1770_sec_read( wd1770_fdc *f );
+void wd1770_sec_write( wd1770_fdc *f, libspectrum_byte b );
+
+libspectrum_byte wd1770_dr_read( wd1770_fdc *f );
+void wd1770_dr_write( wd1770_fdc *f, libspectrum_byte b );
+
+void wd1770_set_cmdint( wd1770_fdc *f );
+void wd1770_reset_cmdint( wd1770_fdc *f );
+void wd1770_set_datarq( wd1770_fdc *f );
+void wd1770_reset_datarq( wd1770_fdc *f );
+
+#endif /* #ifndef FUSE_WD1770_H */
Modified: vendor/fuse-emulator/current/fuse/divide.c
===================================================================
--- vendor/fuse-emulator/current/fuse/divide.c 2007-06-27 12:52:44 UTC (rev 402)
+++ vendor/fuse-emulator/current/fuse/divide.c 2007-06-28 13:18:21 UTC (rev 403)
@@ -1,7 +1,7 @@
/* divide.c: DivIDE interface routines
Copyright (c) 2005 Matthew Westcott
- $Id: divide.c 2889 2007-05-26 17:45:08Z zubzero $
+ $Id: divide.c 2995 2007-06-17 14:31:36Z pak21 $
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
@@ -29,6 +29,7 @@
#include "ide.h"
#include "machine.h"
+#include "module.h"
#include "periph.h"
#include "settings.h"
#include "ui/ui.h"
@@ -74,6 +75,16 @@
static libspectrum_byte divide_ram[ DIVIDE_PAGES ][ DIVIDE_PAGE_LENGTH ];
static libspectrum_byte divide_eprom[ DIVIDE_PAGE_LENGTH ];
+static void divide_reset( int hard_reset );
+static void divide_memory_map( void );
+
+static module_info_t divide_module_info = {
+
+ divide_reset,
+ divide_memory_map,
+
+};
+
/* Housekeeping functions */
int
@@ -103,6 +114,8 @@
ui_menu_activate( UI_MENU_ITEM_MEDIA_IDE_DIVIDE_SLAVE_EJECT, 1 );
}
+ module_register( ÷_module_info );
+
return error;
}
@@ -117,14 +130,19 @@
return error;
}
-void
-divide_reset( void )
+/* DivIDE does not page in immediately on a reset condition (we do that by
+ trapping PC instead); however, it needs to perform housekeeping tasks upon
+ reset */
+static void
+divide_reset( int hard_reset )
{
if( !settings_current.divide_enabled ) return;
- /* FIXME: MAPRAM bit of control register should be preserved on reset,
- but cleared on hard restart */
- divide_control = 0;
+ if( hard_reset ) {
+ divide_control = 0;
+ } else {
+ divide_control &= DIVIDE_CONTROL_MAPRAM;
+ }
divide_automap = 0;
divide_refresh_page_state();
@@ -301,9 +319,13 @@
void
divide_memory_map( void )
{
+ int upper_ram_page;
+
+ if( !divide_active ) return;
+
/* low bits of divide_control register give page number to use in upper
bank; only lowest two bits on original 32K model */
- int upper_ram_page = divide_control & (DIVIDE_PAGES - 1);
+ upper_ram_page = divide_control & (DIVIDE_PAGES - 1);
if( divide_control & DIVIDE_CONTROL_CONMEM ) {
memory_map_romcs[0].page = divide_eprom;
Modified: vendor/fuse-emulator/current/fuse/divide.h
===================================================================
--- vendor/fuse-emulator/current/fuse/divide.h 2007-06-27 12:52:44 UTC (rev 402)
+++ vendor/fuse-emulator/current/fuse/divide.h 2007-06-28 13:18:21 UTC (rev 403)
@@ -1,7 +1,7 @@
/* divide.h: DivIDE interface routines
Copyright (c) 2005 Matthew Westcott
- $Id: divide.h 2889 2007-05-26 17:45:08Z zubzero $
+ $Id: divide.h 2993 2007-06-17 13:54:49Z pak21 $
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
@@ -47,10 +47,8 @@
int divide_init( void );
int divide_end( void );
-void divide_reset( void );
int divide_insert( const char *filename, libspectrum_ide_unit unit );
int divide_commit( libspectrum_ide_unit unit );
int divide_eject( libspectrum_ide_unit unit );
-void divide_memory_map( void );
#endif /* #ifndef FUSE_DIVIDE_H */
Modified: vendor/fuse-emulator/current/fuse/event.c
===================================================================
--- vendor/fuse-emulator/current/fuse/event.c 2007-06-27 12:52:44 UTC (rev 402)
+++ vendor/fuse-emulator/current/fuse/event.c 2007-06-28 13:18:21 UTC (rev 403)
@@ -1,7 +1,7 @@
/* event.c: Routines needed for dealing with the event list
Copyright (c) 2000-2004 Philip Kendall
- $Id: event.c 2918 2007-06-01 12:51:20Z fredm $
+ $Id: event.c 3007 2007-06-17 18:50:48Z zubzero $
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
@@ -173,8 +173,20 @@
trdos_event_cmd_done( ptr->tstates );
break;
- case EVENT_TYPE_TRDOS_INDEX: trdos_event_index( ptr->tstates ); break;
+ case EVENT_TYPE_TRDOS_INDEX:
+ trdos_event_index( ptr->tstates );
+ break;
+#ifdef HAVE_LIBDSK_H
+ case EVENT_TYPE_PLUSD_CMD_DONE:
+ plusd_event_cmd_done( ptr->tstates );
+ break;
+
+ case EVENT_TYPE_PLUSD_INDEX:
+ plusd_event_index( ptr->tstates );
+ break;
+#endif /* #ifdef HAVE_LIBDSK_H */
+
case EVENT_TYPE_BREAKPOINT:
debugger_check( DEBUGGER_BREAKPOINT_TYPE_TIME, 0 );
break;
@@ -183,9 +195,10 @@
tape_event_record_sample( ptr->tstates );
break;
- default:
- ui_error( UI_ERROR_ERROR, "unknown event type %d", ptr->type );
+ case EVENT_TYPE_RZX_SENTINEL:
+ rzx_sentinel();
break;
+
}
if( event_free ) {
free( ptr );
@@ -297,11 +310,14 @@
case EVENT_TYPE_INTERRUPT: return "Retriggered interrupt";
case EVENT_TYPE_NMI: return "Non-maskable interrupt";
case EVENT_TYPE_NULL: return "[Deleted event]";
- case EVENT_TYPE_TRDOS_CMD_DONE: return "End of TR-DOS command";
- case EVENT_TYPE_TRDOS_INDEX: return "TR-DOS index";
+ case EVENT_TYPE_TRDOS_CMD_DONE: return "End of BetaDisk command";
+ case EVENT_TYPE_TRDOS_INDEX: return "BetaDisk index";
+ case EVENT_TYPE_PLUSD_CMD_DONE: return "End of +D command";
+ case EVENT_TYPE_PLUSD_INDEX: return "+D index";
case EVENT_TYPE_BREAKPOINT: return "Breakpoint";
case EVENT_TYPE_TIMER: return "Timer";
case EVENT_TYPE_TAPE_RECORD: return "Tape sample record";
+ case EVENT_TYPE_RZX_SENTINEL: return "RZX sentinel";
}
Modified: vendor/fuse-emulator/current/fuse/event.h
===================================================================
--- vendor/fuse-emulator/current/fuse/event.h 2007-06-27 12:52:44 UTC (rev 402)
+++ vendor/fuse-emulator/current/fuse/event.h 2007-06-28 13:18:21 UTC (rev 403)
@@ -1,7 +1,7 @@
/* event.h: Routines needed for dealing with the event list
Copyright (c) 2000-2004 Philip Kendall
- $Id: event.h 2918 2007-06-01 12:51:20Z fredm $
+ $Id: event.h 3007 2007-06-17 18:50:48Z zubzero $
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
@@ -47,10 +47,13 @@
EVENT_TYPE_INTERRUPT,
EVENT_TYPE_NMI,
EVENT_TYPE_NULL,
+ EVENT_TYPE_RZX_SENTINEL,
EVENT_TYPE_TRDOS_CMD_DONE,
EVENT_TYPE_TRDOS_INDEX,
EVENT_TYPE_TIMER,
EVENT_TYPE_TAPE_RECORD,
+ EVENT_TYPE_PLUSD_CMD_DONE,
+ EVENT_TYPE_PLUSD_INDEX,
} event_type;
Modified: vendor/fuse-emulator/current/fuse/fuse.c
===================================================================
--- vendor/fuse-emulator/current/fuse/fuse.c 2007-06-27 12:52:44 UTC (rev 402)
+++ vendor/fuse-emulator/current/fuse/fuse.c 2007-06-28 13:18:21 UTC (rev 403)
@@ -1,7 +1,7 @@
/* fuse.c: The Free Unix Spectrum Emulator
Copyright (c) 1999-2007 Philip Kendall
- $Id: fuse.c 2889 2007-05-26 17:45:08Z zubzero $
+ $Id: fuse.c 3007 2007-06-17 18:50:48Z zubzero $
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
@@ -45,6 +45,7 @@
#include <SDL.h> /* Needed on MacOS X and Windows */
#endif /* #ifdef UI_SDL */
+#include "ay.h"
#include "dck.h"
#include "debugger/debugger.h"
#include "display.h"
@@ -52,6 +53,7 @@
#include "event.h"
#include "fuse.h"
#include "if1.h"
+#include "if2.h"
#include "joystick.h"
#include "keyboard.h"
#include "machine.h"
@@ -60,8 +62,10 @@
#include "printer.h"
#include "psg.h"
#include "rzx.h"
+#include "scld.h"
#include "settings.h"
#include "simpleide.h"
+#include "slt.h"
#include "snapshot.h"
#include "sound.h"
#include "sound/lowlevel.h"
@@ -71,6 +75,7 @@
#include "trdos.h"
#include "ui/ui.h"
#include "ui/scaler/scaler.h"
+#include "ula.h"
#include "utils.h"
#include "zxatasp.h"
#include "zxcf.h"
@@ -103,6 +108,7 @@
typedef struct start_files_t {
const char *disk_plus3;
+ const char *disk_plusd;
const char *disk_trdos;
const char *dock;
const char *if2;
@@ -241,11 +247,19 @@
if( rzx_init() ) return 1;
if( psg_init() ) return 1;
if( trdos_init() ) return 1;
+#ifdef HAVE_LIBDSK_H
+ if( plusd_init() ) return 1;
+#endif /* #ifdef HAVE_LIBDSK_H */
if( simpleide_init() ) return 1;
if( zxatasp_init() ) return 1;
if( zxcf_init() ) return 1;
if( if1_init() ) return 1;
+ if( if2_init() ) return 1;
if( divide_init() ) return 1;
+ if( scld_init() ) return 1;
+ if( ula_init() ) return 1;
+ if( ay_init() ) return 1;
+ if( slt_init() ) return 1;
error = pokefinder_clear(); if( error ) return error;
@@ -468,6 +482,7 @@
setup_start_files( start_files_t *start_files )
{
start_files->disk_plus3 = settings_current.plus3disk_file;
+ start_files->disk_plusd = settings_current.plusddisk_file;
start_files->disk_trdos = settings_current.trdosdisk_file;
start_files->dock = settings_current.dck_file;
start_files->if2 = settings_current.if2_file;
@@ -549,6 +564,9 @@
case LIBSPECTRUM_CLASS_DISK_PLUS3:
start_files->disk_plus3 = filename; break;
+ case LIBSPECTRUM_CLASS_DISK_PLUSD:
+ start_files->disk_plusd = filename; break;
+
case LIBSPECTRUM_CLASS_DISK_TRDOS:
start_files->disk_trdos = filename; break;
@@ -643,6 +661,11 @@
if( error ) return error;
}
+ if( start_files->disk_plusd ) {
+ error = utils_open_file( start_files->disk_plusd, autoload, NULL );
+ if( error ) return error;
+ }
+
if( start_files->disk_trdos ) {
error = utils_open_file( start_files->disk_trdos, autoload, NULL );
if( error ) return error;
@@ -682,14 +705,14 @@
if( start_files->simpleide_master ) {
error = simpleide_insert( start_files->simpleide_master,
LIBSPECTRUM_IDE_MASTER );
- simpleide_reset();
+ simpleide_reset( 0 );
if( error ) return error;
}
if( start_files->simpleide_slave ) {
error = simpleide_insert( start_files->simpleide_slave,
LIBSPECTRUM_IDE_SLAVE );
- simpleide_reset();
+ simpleide_reset( 0 );
if( error ) return error;
}
@@ -752,6 +775,9 @@
zxcf_end();
if1_end();
divide_end();
+#ifdef HAVE_LIBDSK_H
+ plusd_end();
+#endif /* #ifdef HAVE_LIBDSK_H */
machine_end();
Modified: vendor/fuse-emulator/current/fuse/hacking/ChangeLog
===================================================================
--- vendor/fuse-emulator/current/fuse/hacking/ChangeLog 2007-06-27 12:52:44 UTC (rev 402)
+++ vendor/fuse-emulator/current/fuse/hacking/ChangeLog 2007-06-28 13:18:21 UTC (rev 403)
@@ -1769,3 +1769,108 @@
20070608 man/fuse.1: fix dashes (Stuart).
20070608 sound/alsasound.c: update FSF address (Stuart).
20070609 profile.c: fix printf() warning.
+20070609 BRANCH: plusd_20070609
+20070609 Makefile.am,configure.in,disk/{Makefile.am,plusd.{c,h},wd1770.{c,h}},
+ event.{c,h},fuse.c,machine.c,machines/{spec128.c,spec48.c},memory.c,
+ menu.c,menu_data.dat,periph.{c,h},roms/{Makefile.am,plusd.rom},
+ settings.dat,snapshot.c,tape.c,ui.c,ui/{gtk/gtkui.c,options.dat,ui.h},
+ widget/menu.c,z80/{coretest.c,z80.c,z80_ops.c}: +D emulation
+ (part of patch #1546570) (plusd_20070609) (Stuart).
+20070610 event.[ch],spectrum.c,rzx.[ch],ula.h: add RZX "sentinel" event to
+ prevent running off the end of the contention array on very long
+ frames (see bug #1057471).
+20070610 widget/{memory.c,pokefinder.c,widget_internals.h}: fix up warnings.
+20070610 widget/error.c: don't try and output widgets if we don't have a
+ display yet (fixes bug #1718115).
+20070610 man/fuse.1: remove outdated widget-specific sections (Stuart).
+20070610 keysyms.pl,ui/svga/{svgakeyboard.c,svgadisplay.c}: fix bitrot
+ (fixes bug #1727516) (Gergely Szasz).
+20070610 ui/svga: ignore *.a files.
+20070610 man/fuse.1: add +D documentation (plusd_20070609) (Stuart).
+20070610 man/fuse.1: spelling fixes (Stuart).
+20070611 machines/specplus2.c: enable +D support (plusd_20070609) (Stuart).
+20070611 machines/specplus3.c: save disk images if their 'dirty' state cannot
+ be determined (Stuart).
+20070611 sound/alsasound.c: stop sound_lowlevel...
[truncated message content] |