# HG changeset patch # User nkeynes # Date 1274097683 -36000 # Node ID 7b279d10f46f650711dcb3879c992040e4ab1b01 # Parent 1879fd49ccf69d5776bcb834a586bf3a507beb6e Rip out my hacked-up isofs code and replace with libisofs. Much better. --- a/configure Tue Mar 23 19:48:03 2010 +1000 +++ b/configure Mon May 17 22:01:23 2010 +1000 @@ -9224,6 +9224,226 @@ fi +if test "${ac_cv_header_libisofs_libisofs_h+set}" = set; then + { $as_echo "$as_me:$LINENO: checking for libisofs/libisofs.h" >&5 +$as_echo_n "checking for libisofs/libisofs.h... " >&6; } +if test "${ac_cv_header_libisofs_libisofs_h+set}" = set; then + $as_echo_n "(cached) " >&6 +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_libisofs_libisofs_h" >&5 +$as_echo "$ac_cv_header_libisofs_libisofs_h" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking libisofs/libisofs.h usability" >&5 +$as_echo_n "checking libisofs/libisofs.h usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking libisofs/libisofs.h presence" >&5 +$as_echo_n "checking libisofs/libisofs.h presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: libisofs/libisofs.h: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: libisofs/libisofs.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: libisofs/libisofs.h: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: libisofs/libisofs.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: libisofs/libisofs.h: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: libisofs/libisofs.h: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: libisofs/libisofs.h: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: libisofs/libisofs.h: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: libisofs/libisofs.h: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: libisofs/libisofs.h: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: libisofs/libisofs.h: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: libisofs/libisofs.h: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: libisofs/libisofs.h: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: libisofs/libisofs.h: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: libisofs/libisofs.h: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: libisofs/libisofs.h: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for libisofs/libisofs.h" >&5 +$as_echo_n "checking for libisofs/libisofs.h... " >&6; } +if test "${ac_cv_header_libisofs_libisofs_h+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_header_libisofs_libisofs_h=$ac_header_preproc +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_libisofs_libisofs_h" >&5 +$as_echo "$ac_cv_header_libisofs_libisofs_h" >&6; } + +fi +if test "x$ac_cv_header_libisofs_libisofs_h" = x""yes; then + + { $as_echo "$as_me:$LINENO: checking for iso_data_source_new_from_file in -lisofs" >&5 +$as_echo_n "checking for iso_data_source_new_from_file in -lisofs... " >&6; } +if test "${ac_cv_lib_isofs_iso_data_source_new_from_file+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lisofs $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char iso_data_source_new_from_file (); +int +main () +{ +return iso_data_source_new_from_file (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_isofs_iso_data_source_new_from_file=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_isofs_iso_data_source_new_from_file=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_isofs_iso_data_source_new_from_file" >&5 +$as_echo "$ac_cv_lib_isofs_iso_data_source_new_from_file" >&6; } +if test "x$ac_cv_lib_isofs_iso_data_source_new_from_file" = x""yes; then + + LIBS="$LIBS -lisofs" + +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: \"Libisofs library not found, but is required\" +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: \"Libisofs library not found, but is required\" +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: \"Libisofs headers not found, but is required\" +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: \"Libisofs headers not found, but is required\" +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + + + if test "x$with_osmesa" != xno; then --- a/configure.in Tue Mar 23 19:48:03 2010 +1000 +++ b/configure.in Mon May 17 22:01:23 2010 +1000 @@ -217,6 +217,12 @@ AM_CONDITIONAL(GUI_GTK, [test "$HAVE_GTK" = 'yes']) +AC_CHECK_HEADER([libisofs/libisofs.h], [ + AC_CHECK_LIB(isofs, [iso_data_source_new_from_file], [ + LIBS="$LIBS -lisofs" + ], [ AC_MSG_FAILURE( ["Libisofs library not found, but is required"]) ])], + [ AC_MSG_FAILURE( ["Libisofs headers not found, but is required"]) ]) + dnl ------------------ Video driver support ------------------- AS_IF([test "x$with_osmesa" != xno], [ --- a/src/Makefile.am Tue Mar 23 19:48:03 2010 +1000 +++ b/src/Makefile.am Mon May 17 22:01:23 2010 +1000 @@ -13,7 +13,7 @@ PLUGINLDFLAGS = @PLUGINLDFLAGS@ bin_PROGRAMS = lxdream noinst_PROGRAMS = gendec genglsl genmach -check_PROGRAMS = test/testxlt test/testisoread +check_PROGRAMS = test/testxlt pkglib_PROGRAMS= EXTRA_DIST=drivers/genkeymap.pl checkver.pl drivers/dummy.c @@ -74,7 +74,7 @@ drivers/cdrom/edc_ecc.c drivers/cdrom/ecc.h drivers/cdrom/drive.c \ drivers/cdrom/edc_crctable.h drivers/cdrom/edc_encoder.h \ drivers/cdrom/edc_l2sq.h drivers/cdrom/edc_scramble.h drivers/cdrom/cd_mmc.c \ - drivers/cdrom/isoread.h drivers/cdrom/isoread.c drivers/cdrom/iso_impl.h \ + drivers/cdrom/isofs.h drivers/cdrom/isofs.c \ sh4/sh4.def sh4/sh4core.in sh4/sh4x86.in sh4/sh4dasm.in sh4/sh4stat.in \ hotkeys.c hotkeys.h lxdream_CPPFLAGS = @LXDREAMCPPFLAGS@ @@ -241,15 +241,6 @@ test_testxlt_SOURCES = test/testxlt.c xlat/xltcache.c xlat/xltcache.h -test_testisoread_SOURCES = test/testisoread.c drivers/cdrom/isoread.c \ - drivers/cdrom/isoread.h drivers/cdrom/isofs_impl.h drivers/cdrom/ecc.h \ - drivers/cdrom/cdrom.c drivers/cdrom/cdrom.h drivers/cdrom/sector.h \ - drivers/cdrom/sector.c drivers/cdrom/cdimpl.h drivers/cdrom/edc_ecc.c \ - drivers/cdrom/edc_crctable.h drivers/cdrom/edc_encoder.h \ - drivers/cdrom/edc_l2sq.h drivers/cdrom/edc_scramble.h \ - drivers/cdrom/defs.h drivers/cdrom/drive.h drivers/cdrom/drive.c \ - drivers/cdrom/cd_nrg.c drivers/cdrom/cd_cdi.c drivers/cdrom/cd_gdi.c -test_testisoread_LDADD = @GLIB_LIBS@ $(INTLLIBS) sh4/sh4core.c: gendec sh4/sh4.def sh4/sh4core.in $(mkdir_p) `dirname $@` --- a/src/Makefile.in Tue Mar 23 19:48:03 2010 +1000 +++ b/src/Makefile.in Mon May 17 22:01:23 2010 +1000 @@ -38,8 +38,7 @@ host_triplet = @host@ bin_PROGRAMS = lxdream$(EXEEXT) noinst_PROGRAMS = gendec$(EXEEXT) genglsl$(EXEEXT) genmach$(EXEEXT) -check_PROGRAMS = test/testxlt$(EXEEXT) test/testisoread$(EXEEXT) \ - $(am__EXEEXT_1) +check_PROGRAMS = test/testxlt$(EXEEXT) $(am__EXEEXT_1) pkglib_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4) \ $(am__EXEEXT_5) $(am__EXEEXT_6) $(am__EXEEXT_7) @BUILD_SHARED_TRUE@am__append_1 = plugin.c plugin.h @@ -175,29 +174,28 @@ drivers/cdrom/ecc.h drivers/cdrom/drive.c \ drivers/cdrom/edc_crctable.h drivers/cdrom/edc_encoder.h \ drivers/cdrom/edc_l2sq.h drivers/cdrom/edc_scramble.h \ - drivers/cdrom/cd_mmc.c drivers/cdrom/isoread.h \ - drivers/cdrom/isoread.c drivers/cdrom/iso_impl.h sh4/sh4.def \ - sh4/sh4core.in sh4/sh4x86.in sh4/sh4dasm.in sh4/sh4stat.in \ - hotkeys.c hotkeys.h plugin.c plugin.h sh4/sh4x86.c \ - xlat/x86/x86op.h xlat/x86/ia32abi.h xlat/x86/amd64abi.h \ - sh4/sh4trans.c sh4/sh4trans.h sh4/mmux86.c x86dasm/x86dasm.c \ - x86dasm/x86dasm.h x86dasm/i386-dis.c x86dasm/dis-init.c \ - x86dasm/dis-buf.c x86dasm/ansidecl.h x86dasm/bfd.h \ - x86dasm/dis-asm.h x86dasm/symcat.h x86dasm/sysdep.h \ - gtkui/gtkui.c gtkui/gtkui.h gtkui/gtk_win.c gtkui/gtkcb.c \ - gtkui/gtk_cfg.c gtkui/gtk_mmio.c gtkui/gtk_debug.c \ - gtkui/gtk_dump.c gtkui/gtk_ctrl.c gtkui/gtk_gd.c \ - drivers/io_glib.c drivers/video_gtk.c cocoaui/cocoaui.m \ - cocoaui/cocoaui.h cocoaui/cocoa_cfg.m cocoaui/cocoa_win.m \ - cocoaui/cocoa_gd.m cocoaui/cocoa_prefs.m cocoaui/cocoa_ctrl.m \ - cocoaui/paths_osx.m drivers/io_osx.m drivers/video_osx.m \ - drivers/mac_keymap.h drivers/mac_keymap.txt paths_unix.c \ - drivers/video_gdk.c drivers/video_glx.c drivers/video_glx.h \ - drivers/video_nsgl.m drivers/video_nsgl.h drivers/audio_osx.m \ - drivers/audio_sdl.c drivers/audio_pulse.c drivers/audio_esd.c \ - drivers/audio_alsa.c drivers/input_lirc.c \ - drivers/cdrom/cd_linux.c drivers/cdrom/cd_osx.c \ - drivers/osx_iokit.m drivers/osx_iokit.h \ + drivers/cdrom/cd_mmc.c drivers/cdrom/isofs.h \ + drivers/cdrom/isofs.c sh4/sh4.def sh4/sh4core.in sh4/sh4x86.in \ + sh4/sh4dasm.in sh4/sh4stat.in hotkeys.c hotkeys.h plugin.c \ + plugin.h sh4/sh4x86.c xlat/x86/x86op.h xlat/x86/ia32abi.h \ + xlat/x86/amd64abi.h sh4/sh4trans.c sh4/sh4trans.h sh4/mmux86.c \ + x86dasm/x86dasm.c x86dasm/x86dasm.h x86dasm/i386-dis.c \ + x86dasm/dis-init.c x86dasm/dis-buf.c x86dasm/ansidecl.h \ + x86dasm/bfd.h x86dasm/dis-asm.h x86dasm/symcat.h \ + x86dasm/sysdep.h gtkui/gtkui.c gtkui/gtkui.h gtkui/gtk_win.c \ + gtkui/gtkcb.c gtkui/gtk_cfg.c gtkui/gtk_mmio.c \ + gtkui/gtk_debug.c gtkui/gtk_dump.c gtkui/gtk_ctrl.c \ + gtkui/gtk_gd.c drivers/io_glib.c drivers/video_gtk.c \ + cocoaui/cocoaui.m cocoaui/cocoaui.h cocoaui/cocoa_cfg.m \ + cocoaui/cocoa_win.m cocoaui/cocoa_gd.m cocoaui/cocoa_prefs.m \ + cocoaui/cocoa_ctrl.m cocoaui/paths_osx.m drivers/io_osx.m \ + drivers/video_osx.m drivers/mac_keymap.h \ + drivers/mac_keymap.txt paths_unix.c drivers/video_gdk.c \ + drivers/video_glx.c drivers/video_glx.h drivers/video_nsgl.m \ + drivers/video_nsgl.h drivers/audio_osx.m drivers/audio_sdl.c \ + drivers/audio_pulse.c drivers/audio_esd.c drivers/audio_alsa.c \ + drivers/input_lirc.c drivers/cdrom/cd_linux.c \ + drivers/cdrom/cd_osx.c drivers/osx_iokit.m drivers/osx_iokit.h \ drivers/cdrom/cd_none.c drivers/joy_linux.c \ drivers/joy_linux.h @BUILD_SHARED_TRUE@am__objects_1 = lxdream-plugin.$(OBJEXT) @@ -280,7 +278,7 @@ lxdream-sector.$(OBJEXT) lxdream-cd_nrg.$(OBJEXT) \ lxdream-cd_cdi.$(OBJEXT) lxdream-cd_gdi.$(OBJEXT) \ lxdream-edc_ecc.$(OBJEXT) lxdream-drive.$(OBJEXT) \ - lxdream-cd_mmc.$(OBJEXT) lxdream-isoread.$(OBJEXT) \ + lxdream-cd_mmc.$(OBJEXT) lxdream-isofs.$(OBJEXT) \ lxdream-hotkeys.$(OBJEXT) $(am__objects_1) $(am__objects_2) \ $(am__objects_3) $(am__objects_4) $(am__objects_5) \ $(am__objects_6) $(am__objects_7) $(am__objects_8) \ @@ -296,13 +294,6 @@ lxdream_dummy_@SOEXT@_OBJECTS = $(am_lxdream_dummy_@SOEXT@_OBJECTS) @BUILD_SHARED_TRUE@lxdream_dummy_@SOEXT@_DEPENDENCIES = \ @BUILD_SHARED_TRUE@ lxdream_dummy.lo -am_test_testisoread_OBJECTS = testisoread.$(OBJEXT) isoread.$(OBJEXT) \ - cdrom.$(OBJEXT) sector.$(OBJEXT) edc_ecc.$(OBJEXT) \ - drive.$(OBJEXT) cd_nrg.$(OBJEXT) cd_cdi.$(OBJEXT) \ - cd_gdi.$(OBJEXT) -test_testisoread_OBJECTS = $(am_test_testisoread_OBJECTS) -test_testisoread_DEPENDENCIES = $(am__DEPENDENCIES_1) -am__dirstamp = $(am__leading_dot)dirstamp am__test_testsh4x86_SOURCES_DIST = test/testsh4x86.c x86dasm/x86dasm.c \ x86dasm/x86dasm.h x86dasm/i386-dis.c x86dasm/dis-init.c \ x86dasm/dis-buf.c sh4/sh4trans.c sh4/sh4x86.c xlat/xltcache.c \ @@ -322,6 +313,7 @@ @BUILD_SH4X86_TRUE@ test_testsh4x86-cpu.$(OBJEXT) test_testsh4x86_OBJECTS = $(am_test_testsh4x86_OBJECTS) test_testsh4x86_DEPENDENCIES = +am__dirstamp = $(am__leading_dot)dirstamp am_test_testxlt_OBJECTS = testxlt.$(OBJEXT) xltcache.$(OBJEXT) test_testxlt_OBJECTS = $(am_test_testxlt_OBJECTS) test_testxlt_LDADD = $(LDADD) @@ -341,14 +333,14 @@ $(audio_pulse_@SOEXT@_SOURCES) $(audio_sdl_@SOEXT@_SOURCES) \ $(gendec_SOURCES) $(genglsl_SOURCES) $(genmach_SOURCES) \ $(input_lirc_@SOEXT@_SOURCES) $(lxdream_SOURCES) \ - $(lxdream_dummy_@SOEXT@_SOURCES) $(test_testisoread_SOURCES) \ - $(test_testsh4x86_SOURCES) $(test_testxlt_SOURCES) + $(lxdream_dummy_@SOEXT@_SOURCES) $(test_testsh4x86_SOURCES) \ + $(test_testxlt_SOURCES) DIST_SOURCES = $(audio_alsa_@SOEXT@_SOURCES) \ $(audio_esd_@SOEXT@_SOURCES) $(audio_pulse_@SOEXT@_SOURCES) \ $(audio_sdl_@SOEXT@_SOURCES) $(gendec_SOURCES) \ $(genglsl_SOURCES) $(genmach_SOURCES) \ $(input_lirc_@SOEXT@_SOURCES) $(am__lxdream_SOURCES_DIST) \ - $(lxdream_dummy_@SOEXT@_SOURCES) $(test_testisoread_SOURCES) \ + $(lxdream_dummy_@SOEXT@_SOURCES) \ $(am__test_testsh4x86_SOURCES_DIST) $(test_testxlt_SOURCES) ETAGS = etags CTAGS = ctags @@ -597,15 +589,15 @@ drivers/cdrom/drive.c drivers/cdrom/edc_crctable.h \ drivers/cdrom/edc_encoder.h drivers/cdrom/edc_l2sq.h \ drivers/cdrom/edc_scramble.h drivers/cdrom/cd_mmc.c \ - drivers/cdrom/isoread.h drivers/cdrom/isoread.c \ - drivers/cdrom/iso_impl.h sh4/sh4.def sh4/sh4core.in \ - sh4/sh4x86.in sh4/sh4dasm.in sh4/sh4stat.in hotkeys.c \ - hotkeys.h $(am__append_1) $(am__append_2) $(am__append_4) \ - $(am__append_5) $(am__append_6) $(am__append_7) \ - $(am__append_8) $(am__append_9) $(am__append_10) \ - $(am__append_17) $(am__append_19) $(am__append_21) \ - $(am__append_23) $(am__append_25) $(am__append_27) \ - $(am__append_28) $(am__append_29) $(am__append_30) + drivers/cdrom/isofs.h drivers/cdrom/isofs.c sh4/sh4.def \ + sh4/sh4core.in sh4/sh4x86.in sh4/sh4dasm.in sh4/sh4stat.in \ + hotkeys.c hotkeys.h $(am__append_1) $(am__append_2) \ + $(am__append_4) $(am__append_5) $(am__append_6) \ + $(am__append_7) $(am__append_8) $(am__append_9) \ + $(am__append_10) $(am__append_17) $(am__append_19) \ + $(am__append_21) $(am__append_23) $(am__append_25) \ + $(am__append_27) $(am__append_28) $(am__append_29) \ + $(am__append_30) lxdream_CPPFLAGS = @LXDREAMCPPFLAGS@ @BUILD_SH4X86_TRUE@test_testsh4x86_LDADD = @LXDREAM_LIBS@ @GLIB_LIBS@ @GTK_LIBS@ @LIBPNG_LIBS@ @BUILD_SH4X86_TRUE@test_testsh4x86_CPPFLAGS = @LXDREAMCPPFLAGS@ @@ -637,16 +629,6 @@ genglsl_LDADD = @GLIB_LIBS@ @GTK_LIBS@ $(INTLLIBS) genmach_LDADD = @GLIB_LIBS@ @GTK_LIBS@ $(INTLLIBS) test_testxlt_SOURCES = test/testxlt.c xlat/xltcache.c xlat/xltcache.h -test_testisoread_SOURCES = test/testisoread.c drivers/cdrom/isoread.c \ - drivers/cdrom/isoread.h drivers/cdrom/isofs_impl.h drivers/cdrom/ecc.h \ - drivers/cdrom/cdrom.c drivers/cdrom/cdrom.h drivers/cdrom/sector.h \ - drivers/cdrom/sector.c drivers/cdrom/cdimpl.h drivers/cdrom/edc_ecc.c \ - drivers/cdrom/edc_crctable.h drivers/cdrom/edc_encoder.h \ - drivers/cdrom/edc_l2sq.h drivers/cdrom/edc_scramble.h \ - drivers/cdrom/defs.h drivers/cdrom/drive.h drivers/cdrom/drive.c \ - drivers/cdrom/cd_nrg.c drivers/cdrom/cd_cdi.c drivers/cdrom/cd_gdi.c - -test_testisoread_LDADD = @GLIB_LIBS@ $(INTLLIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am @@ -766,9 +748,6 @@ test/$(am__dirstamp): @$(mkdir_p) test @: > test/$(am__dirstamp) -test/testisoread$(EXEEXT): $(test_testisoread_OBJECTS) $(test_testisoread_DEPENDENCIES) test/$(am__dirstamp) - @rm -f test/testisoread$(EXEEXT) - $(LINK) $(test_testisoread_LDFLAGS) $(test_testisoread_OBJECTS) $(test_testisoread_LDADD) $(LIBS) test/testsh4x86$(EXEEXT): $(test_testsh4x86_OBJECTS) $(test_testsh4x86_DEPENDENCIES) test/$(am__dirstamp) @rm -f test/testsh4x86$(EXEEXT) $(LINK) $(test_testsh4x86_LDFLAGS) $(test_testsh4x86_OBJECTS) $(test_testsh4x86_LDADD) $(LIBS) @@ -783,17 +762,10 @@ -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/actparse.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cd_cdi.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cd_gdi.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cd_nrg.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdrom.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drive.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edc_ecc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gendec.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genglsl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genmach.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insparse.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isoread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxdream-aica.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxdream-armcore.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxdream-armdasm.Po@am__quote@ @@ -860,7 +832,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxdream-io_glib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxdream-io_osx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxdream-ioutil.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxdream-isoread.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxdream-isofs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxdream-joy_linux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxdream-kbd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxdream-lightgun.Po@am__quote@ @@ -915,7 +887,6 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxdream-xltcache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxdream-yuv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mdparse.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sector.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_testsh4x86-cpu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_testsh4x86-dis-buf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_testsh4x86-dis-init.Po@am__quote@ @@ -928,7 +899,6 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_testsh4x86-util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_testsh4x86-x86dasm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_testsh4x86-xltcache.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testisoread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testxlt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xltcache.Po@am__quote@ @@ -2080,19 +2050,19 @@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lxdream_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lxdream-cd_mmc.obj `if test -f 'drivers/cdrom/cd_mmc.c'; then $(CYGPATH_W) 'drivers/cdrom/cd_mmc.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/cd_mmc.c'; fi` -lxdream-isoread.o: drivers/cdrom/isoread.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lxdream_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lxdream-isoread.o -MD -MP -MF "$(DEPDIR)/lxdream-isoread.Tpo" -c -o lxdream-isoread.o `test -f 'drivers/cdrom/isoread.c' || echo '$(srcdir)/'`drivers/cdrom/isoread.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lxdream-isoread.Tpo" "$(DEPDIR)/lxdream-isoread.Po"; else rm -f "$(DEPDIR)/lxdream-isoread.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/isoread.c' object='lxdream-isoread.o' libtool=no @AMDEPBACKSLASH@ +lxdream-isofs.o: drivers/cdrom/isofs.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lxdream_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lxdream-isofs.o -MD -MP -MF "$(DEPDIR)/lxdream-isofs.Tpo" -c -o lxdream-isofs.o `test -f 'drivers/cdrom/isofs.c' || echo '$(srcdir)/'`drivers/cdrom/isofs.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lxdream-isofs.Tpo" "$(DEPDIR)/lxdream-isofs.Po"; else rm -f "$(DEPDIR)/lxdream-isofs.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/isofs.c' object='lxdream-isofs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lxdream_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lxdream-isoread.o `test -f 'drivers/cdrom/isoread.c' || echo '$(srcdir)/'`drivers/cdrom/isoread.c +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lxdream_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lxdream-isofs.o `test -f 'drivers/cdrom/isofs.c' || echo '$(srcdir)/'`drivers/cdrom/isofs.c -lxdream-isoread.obj: drivers/cdrom/isoread.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lxdream_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lxdream-isoread.obj -MD -MP -MF "$(DEPDIR)/lxdream-isoread.Tpo" -c -o lxdream-isoread.obj `if test -f 'drivers/cdrom/isoread.c'; then $(CYGPATH_W) 'drivers/cdrom/isoread.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/isoread.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lxdream-isoread.Tpo" "$(DEPDIR)/lxdream-isoread.Po"; else rm -f "$(DEPDIR)/lxdream-isoread.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/isoread.c' object='lxdream-isoread.obj' libtool=no @AMDEPBACKSLASH@ +lxdream-isofs.obj: drivers/cdrom/isofs.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lxdream_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lxdream-isofs.obj -MD -MP -MF "$(DEPDIR)/lxdream-isofs.Tpo" -c -o lxdream-isofs.obj `if test -f 'drivers/cdrom/isofs.c'; then $(CYGPATH_W) 'drivers/cdrom/isofs.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/isofs.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lxdream-isofs.Tpo" "$(DEPDIR)/lxdream-isofs.Po"; else rm -f "$(DEPDIR)/lxdream-isofs.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/isofs.c' object='lxdream-isofs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lxdream_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lxdream-isoread.obj `if test -f 'drivers/cdrom/isoread.c'; then $(CYGPATH_W) 'drivers/cdrom/isoread.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/isoread.c'; fi` +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lxdream_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lxdream-isofs.obj `if test -f 'drivers/cdrom/isofs.c'; then $(CYGPATH_W) 'drivers/cdrom/isofs.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/isofs.c'; fi` lxdream-hotkeys.o: hotkeys.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lxdream_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lxdream-hotkeys.o -MD -MP -MF "$(DEPDIR)/lxdream-hotkeys.Tpo" -c -o lxdream-hotkeys.o `test -f 'hotkeys.c' || echo '$(srcdir)/'`hotkeys.c; \ @@ -2542,132 +2512,6 @@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lxdream_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lxdream-joy_linux.obj `if test -f 'drivers/joy_linux.c'; then $(CYGPATH_W) 'drivers/joy_linux.c'; else $(CYGPATH_W) '$(srcdir)/drivers/joy_linux.c'; fi` -testisoread.o: test/testisoread.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testisoread.o -MD -MP -MF "$(DEPDIR)/testisoread.Tpo" -c -o testisoread.o `test -f 'test/testisoread.c' || echo '$(srcdir)/'`test/testisoread.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/testisoread.Tpo" "$(DEPDIR)/testisoread.Po"; else rm -f "$(DEPDIR)/testisoread.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test/testisoread.c' object='testisoread.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testisoread.o `test -f 'test/testisoread.c' || echo '$(srcdir)/'`test/testisoread.c - -testisoread.obj: test/testisoread.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testisoread.obj -MD -MP -MF "$(DEPDIR)/testisoread.Tpo" -c -o testisoread.obj `if test -f 'test/testisoread.c'; then $(CYGPATH_W) 'test/testisoread.c'; else $(CYGPATH_W) '$(srcdir)/test/testisoread.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/testisoread.Tpo" "$(DEPDIR)/testisoread.Po"; else rm -f "$(DEPDIR)/testisoread.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test/testisoread.c' object='testisoread.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testisoread.obj `if test -f 'test/testisoread.c'; then $(CYGPATH_W) 'test/testisoread.c'; else $(CYGPATH_W) '$(srcdir)/test/testisoread.c'; fi` - -isoread.o: drivers/cdrom/isoread.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isoread.o -MD -MP -MF "$(DEPDIR)/isoread.Tpo" -c -o isoread.o `test -f 'drivers/cdrom/isoread.c' || echo '$(srcdir)/'`drivers/cdrom/isoread.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/isoread.Tpo" "$(DEPDIR)/isoread.Po"; else rm -f "$(DEPDIR)/isoread.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/isoread.c' object='isoread.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isoread.o `test -f 'drivers/cdrom/isoread.c' || echo '$(srcdir)/'`drivers/cdrom/isoread.c - -isoread.obj: drivers/cdrom/isoread.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isoread.obj -MD -MP -MF "$(DEPDIR)/isoread.Tpo" -c -o isoread.obj `if test -f 'drivers/cdrom/isoread.c'; then $(CYGPATH_W) 'drivers/cdrom/isoread.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/isoread.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/isoread.Tpo" "$(DEPDIR)/isoread.Po"; else rm -f "$(DEPDIR)/isoread.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/isoread.c' object='isoread.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isoread.obj `if test -f 'drivers/cdrom/isoread.c'; then $(CYGPATH_W) 'drivers/cdrom/isoread.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/isoread.c'; fi` - -cdrom.o: drivers/cdrom/cdrom.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cdrom.o -MD -MP -MF "$(DEPDIR)/cdrom.Tpo" -c -o cdrom.o `test -f 'drivers/cdrom/cdrom.c' || echo '$(srcdir)/'`drivers/cdrom/cdrom.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cdrom.Tpo" "$(DEPDIR)/cdrom.Po"; else rm -f "$(DEPDIR)/cdrom.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/cdrom.c' object='cdrom.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cdrom.o `test -f 'drivers/cdrom/cdrom.c' || echo '$(srcdir)/'`drivers/cdrom/cdrom.c - -cdrom.obj: drivers/cdrom/cdrom.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cdrom.obj -MD -MP -MF "$(DEPDIR)/cdrom.Tpo" -c -o cdrom.obj `if test -f 'drivers/cdrom/cdrom.c'; then $(CYGPATH_W) 'drivers/cdrom/cdrom.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/cdrom.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cdrom.Tpo" "$(DEPDIR)/cdrom.Po"; else rm -f "$(DEPDIR)/cdrom.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/cdrom.c' object='cdrom.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cdrom.obj `if test -f 'drivers/cdrom/cdrom.c'; then $(CYGPATH_W) 'drivers/cdrom/cdrom.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/cdrom.c'; fi` - -sector.o: drivers/cdrom/sector.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sector.o -MD -MP -MF "$(DEPDIR)/sector.Tpo" -c -o sector.o `test -f 'drivers/cdrom/sector.c' || echo '$(srcdir)/'`drivers/cdrom/sector.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/sector.Tpo" "$(DEPDIR)/sector.Po"; else rm -f "$(DEPDIR)/sector.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/sector.c' object='sector.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sector.o `test -f 'drivers/cdrom/sector.c' || echo '$(srcdir)/'`drivers/cdrom/sector.c - -sector.obj: drivers/cdrom/sector.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sector.obj -MD -MP -MF "$(DEPDIR)/sector.Tpo" -c -o sector.obj `if test -f 'drivers/cdrom/sector.c'; then $(CYGPATH_W) 'drivers/cdrom/sector.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/sector.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/sector.Tpo" "$(DEPDIR)/sector.Po"; else rm -f "$(DEPDIR)/sector.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/sector.c' object='sector.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sector.obj `if test -f 'drivers/cdrom/sector.c'; then $(CYGPATH_W) 'drivers/cdrom/sector.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/sector.c'; fi` - -edc_ecc.o: drivers/cdrom/edc_ecc.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT edc_ecc.o -MD -MP -MF "$(DEPDIR)/edc_ecc.Tpo" -c -o edc_ecc.o `test -f 'drivers/cdrom/edc_ecc.c' || echo '$(srcdir)/'`drivers/cdrom/edc_ecc.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/edc_ecc.Tpo" "$(DEPDIR)/edc_ecc.Po"; else rm -f "$(DEPDIR)/edc_ecc.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/edc_ecc.c' object='edc_ecc.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o edc_ecc.o `test -f 'drivers/cdrom/edc_ecc.c' || echo '$(srcdir)/'`drivers/cdrom/edc_ecc.c - -edc_ecc.obj: drivers/cdrom/edc_ecc.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT edc_ecc.obj -MD -MP -MF "$(DEPDIR)/edc_ecc.Tpo" -c -o edc_ecc.obj `if test -f 'drivers/cdrom/edc_ecc.c'; then $(CYGPATH_W) 'drivers/cdrom/edc_ecc.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/edc_ecc.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/edc_ecc.Tpo" "$(DEPDIR)/edc_ecc.Po"; else rm -f "$(DEPDIR)/edc_ecc.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/edc_ecc.c' object='edc_ecc.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o edc_ecc.obj `if test -f 'drivers/cdrom/edc_ecc.c'; then $(CYGPATH_W) 'drivers/cdrom/edc_ecc.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/edc_ecc.c'; fi` - -drive.o: drivers/cdrom/drive.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT drive.o -MD -MP -MF "$(DEPDIR)/drive.Tpo" -c -o drive.o `test -f 'drivers/cdrom/drive.c' || echo '$(srcdir)/'`drivers/cdrom/drive.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/drive.Tpo" "$(DEPDIR)/drive.Po"; else rm -f "$(DEPDIR)/drive.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/drive.c' object='drive.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o drive.o `test -f 'drivers/cdrom/drive.c' || echo '$(srcdir)/'`drivers/cdrom/drive.c - -drive.obj: drivers/cdrom/drive.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT drive.obj -MD -MP -MF "$(DEPDIR)/drive.Tpo" -c -o drive.obj `if test -f 'drivers/cdrom/drive.c'; then $(CYGPATH_W) 'drivers/cdrom/drive.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/drive.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/drive.Tpo" "$(DEPDIR)/drive.Po"; else rm -f "$(DEPDIR)/drive.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/drive.c' object='drive.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o drive.obj `if test -f 'drivers/cdrom/drive.c'; then $(CYGPATH_W) 'drivers/cdrom/drive.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/drive.c'; fi` - -cd_nrg.o: drivers/cdrom/cd_nrg.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cd_nrg.o -MD -MP -MF "$(DEPDIR)/cd_nrg.Tpo" -c -o cd_nrg.o `test -f 'drivers/cdrom/cd_nrg.c' || echo '$(srcdir)/'`drivers/cdrom/cd_nrg.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cd_nrg.Tpo" "$(DEPDIR)/cd_nrg.Po"; else rm -f "$(DEPDIR)/cd_nrg.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/cd_nrg.c' object='cd_nrg.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cd_nrg.o `test -f 'drivers/cdrom/cd_nrg.c' || echo '$(srcdir)/'`drivers/cdrom/cd_nrg.c - -cd_nrg.obj: drivers/cdrom/cd_nrg.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cd_nrg.obj -MD -MP -MF "$(DEPDIR)/cd_nrg.Tpo" -c -o cd_nrg.obj `if test -f 'drivers/cdrom/cd_nrg.c'; then $(CYGPATH_W) 'drivers/cdrom/cd_nrg.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/cd_nrg.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cd_nrg.Tpo" "$(DEPDIR)/cd_nrg.Po"; else rm -f "$(DEPDIR)/cd_nrg.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/cd_nrg.c' object='cd_nrg.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cd_nrg.obj `if test -f 'drivers/cdrom/cd_nrg.c'; then $(CYGPATH_W) 'drivers/cdrom/cd_nrg.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/cd_nrg.c'; fi` - -cd_cdi.o: drivers/cdrom/cd_cdi.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cd_cdi.o -MD -MP -MF "$(DEPDIR)/cd_cdi.Tpo" -c -o cd_cdi.o `test -f 'drivers/cdrom/cd_cdi.c' || echo '$(srcdir)/'`drivers/cdrom/cd_cdi.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cd_cdi.Tpo" "$(DEPDIR)/cd_cdi.Po"; else rm -f "$(DEPDIR)/cd_cdi.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/cd_cdi.c' object='cd_cdi.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cd_cdi.o `test -f 'drivers/cdrom/cd_cdi.c' || echo '$(srcdir)/'`drivers/cdrom/cd_cdi.c - -cd_cdi.obj: drivers/cdrom/cd_cdi.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cd_cdi.obj -MD -MP -MF "$(DEPDIR)/cd_cdi.Tpo" -c -o cd_cdi.obj `if test -f 'drivers/cdrom/cd_cdi.c'; then $(CYGPATH_W) 'drivers/cdrom/cd_cdi.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/cd_cdi.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cd_cdi.Tpo" "$(DEPDIR)/cd_cdi.Po"; else rm -f "$(DEPDIR)/cd_cdi.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/cd_cdi.c' object='cd_cdi.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cd_cdi.obj `if test -f 'drivers/cdrom/cd_cdi.c'; then $(CYGPATH_W) 'drivers/cdrom/cd_cdi.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/cd_cdi.c'; fi` - -cd_gdi.o: drivers/cdrom/cd_gdi.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cd_gdi.o -MD -MP -MF "$(DEPDIR)/cd_gdi.Tpo" -c -o cd_gdi.o `test -f 'drivers/cdrom/cd_gdi.c' || echo '$(srcdir)/'`drivers/cdrom/cd_gdi.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cd_gdi.Tpo" "$(DEPDIR)/cd_gdi.Po"; else rm -f "$(DEPDIR)/cd_gdi.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/cd_gdi.c' object='cd_gdi.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cd_gdi.o `test -f 'drivers/cdrom/cd_gdi.c' || echo '$(srcdir)/'`drivers/cdrom/cd_gdi.c - -cd_gdi.obj: drivers/cdrom/cd_gdi.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cd_gdi.obj -MD -MP -MF "$(DEPDIR)/cd_gdi.Tpo" -c -o cd_gdi.obj `if test -f 'drivers/cdrom/cd_gdi.c'; then $(CYGPATH_W) 'drivers/cdrom/cd_gdi.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/cd_gdi.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cd_gdi.Tpo" "$(DEPDIR)/cd_gdi.Po"; else rm -f "$(DEPDIR)/cd_gdi.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='drivers/cdrom/cd_gdi.c' object='cd_gdi.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cd_gdi.obj `if test -f 'drivers/cdrom/cd_gdi.c'; then $(CYGPATH_W) 'drivers/cdrom/cd_gdi.c'; else $(CYGPATH_W) '$(srcdir)/drivers/cdrom/cd_gdi.c'; fi` - test_testsh4x86-testsh4x86.o: test/testsh4x86.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_testsh4x86_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_testsh4x86-testsh4x86.o -MD -MP -MF "$(DEPDIR)/test_testsh4x86-testsh4x86.Tpo" -c -o test_testsh4x86-testsh4x86.o `test -f 'test/testsh4x86.c' || echo '$(srcdir)/'`test/testsh4x86.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test_testsh4x86-testsh4x86.Tpo" "$(DEPDIR)/test_testsh4x86-testsh4x86.Po"; else rm -f "$(DEPDIR)/test_testsh4x86-testsh4x86.Tpo"; exit 1; fi --- a/src/bios.c Tue Mar 23 19:48:03 2010 +1000 +++ b/src/bios.c Mon May 17 22:01:23 2010 +1000 @@ -24,7 +24,7 @@ #include "bootstrap.h" #include "sh4/sh4.h" #include "drivers/cdrom/cdrom.h" -#include "drivers/cdrom/isoread.h" +#include "drivers/cdrom/isofs.h" #include "gdrom/gdrom.h" gboolean bios_boot_gdrom_disc( void ); @@ -387,6 +387,56 @@ #define MIN_ISO_SECTORS 32 +static gboolean bios_load_ipl( cdrom_disc_t disc, cdrom_track_t track, const char *program_name, + unsigned char *buffer, gboolean unscramble ) +{ + gboolean rv = TRUE; + + IsoImageFilesystem *iso = iso_filesystem_new_from_track( disc, track, NULL ); + if( iso == NULL ) { + ERROR( "Disc is not bootable (invalid ISO9660 filesystem)" ); + return FALSE; + } + IsoFileSource *file = NULL; + int status = iso->get_by_path(iso, program_name, &file ); + if( status != 1 ) { + ERROR( "Disc is not bootable (initial program '%s' not found)", program_name ); + iso_filesystem_unref(iso); + return FALSE; + } + + struct stat st; + if( iso_file_source_stat(file, &st) == 1 ) { + if( st.st_size > (0x8D000000 - BINARY_LOAD_ADDR) ) { + ERROR( "Disc is not bootable (Initial program is too large to fit into memory)" ); + rv = FALSE; + } else if( iso_file_source_open(file) == 1 ) { + size_t len; + if( unscramble ) { + char *tmp = g_malloc(st.st_size); + len = iso_file_source_read(file, tmp, st.st_size); + bootprogram_unscramble(buffer, tmp, st.st_size); + g_free(tmp); + } else { + len = iso_file_source_read(file, buffer, st.st_size); + } + + if( len != st.st_size ) { + ERROR( "Disc is not bootable (Unable to read initial program '%s')", program_name ); + rv = FALSE; + } + iso_file_source_close(file); + } + } else { + ERROR( "Disc is not bootable (Unable to get size of initial program '%s')", program_name ); + rv = FALSE; + } + + iso_file_source_unref(file); + iso_filesystem_unref(iso); + return rv; +} + gboolean bios_boot_gdrom_disc( void ) { cdrom_disc_t disc = gdrom_get_current_disc(); @@ -427,56 +477,19 @@ } /* Get the initial program from the bootstrap (usually 1ST_READ.BIN) */ - char program_name[17]; - memcpy(program_name, metadata->boot_file, 16); - program_name[16] = '\0'; - for( int i=15; i >= 0 && program_name[i] == ' '; i-- ) { + char program_name[18] = "/"; + memcpy(program_name+1, metadata->boot_file, 16); + program_name[17] = '\0'; + for( int i=16; i >= 0 && program_name[i] == ' '; i-- ) { program_name[i] = '\0'; } /* Bootstrap is good. Now find the program in the actual filesystem... */ - isofs_reader_t iso = isofs_reader_new_from_track( disc, track, NULL ); - if( iso == NULL ) { - ERROR( "Disc is not bootable" ); + unsigned char *program = mem_get_region(BINARY_LOAD_ADDR); + gboolean isGDROM = (disc->disc_type == CDROM_DISC_GDROM ); + if( !bios_load_ipl( disc, track, program_name, program, !isGDROM ) ) return FALSE; - } - isofs_reader_dirent_t ent = isofs_reader_get_file( iso, program_name ); - if( ent == NULL ) { - ERROR( "Disc is not bootable (initial program '%s' not found)", program_name ); - isofs_reader_destroy(iso); - return FALSE; - } - - if( ent->size > (0x8D000000 - BINARY_LOAD_ADDR) ) { - /* Bootstrap isn't going to fit in memory. Complain and abort */ - ERROR( "Disc is not bootable (initial program too large)" ); - isofs_reader_destroy(iso); - return FALSE; - } - unsigned char *program = mem_get_region(BINARY_LOAD_ADDR); - int program_sectors = (ent->size+2047)/2048; - if( disc->disc_type == CDROM_DISC_GDROM ) { - /* Load the binary directly into RAM */ - if( isofs_reader_read_file( iso, ent, 0, ent->size, program ) != - CDROM_ERROR_OK ) { - ERROR( "Disc is not bootable (failed to read initial program)\n" ); - isofs_reader_destroy(iso); - return FALSE; - } - asic_enable_ide_interface(TRUE); - } else { - /* Load the binary into a temp buffer */ - unsigned char tmp[program_sectors*2048]; - if( isofs_reader_read_file( iso, ent, 0, ent->size, tmp ) != - CDROM_ERROR_OK ) { - ERROR( "Disc is not bootable (failed to read initial program)\n" ); - isofs_reader_destroy(iso); - return FALSE; - } - bootprogram_unscramble(program, tmp, ent->size); - asic_enable_ide_interface(FALSE); - } - isofs_reader_destroy(iso); + asic_enable_ide_interface(isGDROM); dreamcast_program_loaded( "", BOOTSTRAP_ENTRY_ADDR ); return TRUE; } --- a/src/drivers/cdrom/iso_impl.h Tue Mar 23 19:48:03 2010 +1000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,128 +0,0 @@ -/** - * $Id$ - * - * ISO9660 filesystem support - * - * Copyright (c) 2009 Nathan Keynes. - * - * 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. - */ - -#define ISO_SUPERBLOCK_OFFSET 16 -#define ISO_BOOT_DESCRIPTOR 0 -#define ISO_PRIMARY_DESCRIPTOR 1 -#define ISO_SECONDARY_DESCRIPTOR 2 -#define ISO_PARTITION_DESCRIPTOR 3 -#define ISO_TERMINAL_DESCRIPTOR 0xFF - -typedef struct iso_timestamp_full { /* 17 bytes */ - char year[4]; - char month[2]; - char day[2]; - char hour[2]; - char minute[2]; - char second[2]; - char hundredths[2]; - int8_t utc_offset; /* 15 min intervals from -48 to +52 7.1.2 */ -} *iso_timestamp_full_t; - -typedef struct iso_timestamp { /* 7 bytes */ - uint8_t year; /* Since 1900 */ - uint8_t month; /* 1 .. 12 */ - uint8_t day; /* 1 .. 31 */ - uint8_t hour; /* 0 .. 23 */ - uint8_t minute; /* 0 .. 59 */ - uint8_t second; /* 0 .. 59 */ - uint8_t utc_offset; /* 15 min intervals from -48 to +52 7.1.2 */ -} *iso_timestamp_t; - -#define ISO_FILE_EXISTS 0x01 -#define ISO_FILE_DIR 0x02 -#define ISO_FILE_ASSOC 0x04 /* Associated file */ -#define ISO_FILE_RECORD 0x08 /* Structure specified by XA record */ -#define ISO_FILE_PROTECT 0x10 /* Permissions specified */ -#define ISO_FILE_MULTIEXT 0x80 /* Multiple extents */ - -typedef struct iso_dirent { /* 34+ bytes 9.1 */ - uint8_t record_len; - uint8_t xa_record_len; - uint32_t file_lba_le, file_lba_be; - uint32_t file_size_le, file_size_be; - struct iso_timestamp timestamp; - uint8_t flags; - uint8_t unit_size; - uint8_t gap_size; - uint16_t volume_seq_le, volume_seq_be; - uint8_t file_id_len; - char file_id[1]; -} __attribute__((packed)) *iso_dirent_t; - -typedef struct iso_pathtabrec { /* 8+ bytes 9.4 */ - uint8_t record_len; - uint8_t xa_record_len; - uint32_t file_lba; - uint16_t parent_dir_no; - char file_id[]; -} *iso_pathtabrec_t; - -typedef struct iso_xattrrec { - uint16_t uid_le, uid_be; - uint16_t gid_le, gid_be; - uint16_t permissions; - struct iso_timestamp_full create_time; - struct iso_timestamp_full modify_time; - struct iso_timestamp_full expiry_time; - struct iso_timestamp_full effective_time; - uint8_t record_format; - uint8_t record_attrs; - uint16_t record_len_le, record_len_be; - char system_id[32]; - char system_use[64]; - uint8_t record_version; /* Should be 1 */ - uint8_t escape_len; - char reserved[64]; - uint16_t app_use_len_le, app_use_len_be; - char app_use[]; -} *iso_xattrrec_t; - -/** Primary Volume Descriptor */ -typedef struct iso_pvd { - uint8_t desc_type; - char tag[5]; - uint8_t desc_version; - char pad0; - char system_id[32]; - char volume_id[32]; - char pad1[8]; - uint32_t volume_size_le, volume_size_be; - char pad2[32]; - uint16_t volume_sets_le, volume_sets_be; - uint16_t volume_seq_le, volume_seq_be; - uint16_t block_size_le, block_size_be; - uint32_t pathtab_size_le, pathtab_size_be; - uint32_t pathtab_offset_le, pathtab2_offset_le; - uint32_t pathtab_offset_be, pathtab2_offset_be; - struct iso_dirent root_dirent; - char volume_set_id[128]; - char publisher_id[128]; - char preparer_id[128]; - char app_id[128]; - char copyright_file_id[37]; - char abstract_file_id[37]; - char biblio_file_id[37]; - struct iso_timestamp_full create_time; - struct iso_timestamp_full modify_time; - struct iso_timestamp_full expiry_time; - struct iso_timestamp_full effective_time; - uint8_t fs_version; /* must be 1 */ - char pad3[1166]; -} *iso_pvd_t; - --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/drivers/cdrom/isofs.c Mon May 17 22:01:23 2010 +1000 @@ -0,0 +1,188 @@ +/** + * $Id$ + * + * libisofs adapter + * + * Copyright (c) 2010 Nathan Keynes. + * + * 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. + */ + +#include +#include + +#define LIBISOFS_WITHOUT_LIBBURN 1 + +#include "drivers/cdrom/cdrom.h" +#include "drivers/cdrom/isofs.h" + +static int isofs_dummy_fn(IsoDataSource *src) +{ + return 1; +} + +static int isofs_read_block(IsoDataSource *src, uint32_t lba, uint8_t *buffer) +{ + sector_source_t source = (sector_source_t)src->data; + cdrom_error_t err = sector_source_read_sectors(source, lba, 1, + CDROM_READ_MODE2_FORM1|CDROM_READ_DATA, buffer, NULL ); + if( err != CDROM_ERROR_OK ) { + return ISO_DATA_SOURCE_FAILURE; + } + return 1; +} + +static void isofs_release(IsoDataSource *src) +{ + sector_source_unref((sector_source_t)src->data); +} + +static IsoDataSource *iso_data_source_new( sector_source_t source ) +{ + IsoDataSource *src = g_malloc0(sizeof(IsoDataSource)); + src->refcount = 1; + src->open = isofs_dummy_fn; + src->close = isofs_dummy_fn; + src->read_block = isofs_read_block; + src->free_data = isofs_release; + src->data = source; + sector_source_ref(source); + return src; +} + +/** + * Construct an isofs image from an existing sector source. + */ +IsoImage *iso_image_new_from_source( sector_source_t source, cdrom_lba_t start, ERROR *err ) +{ + IsoImage *iso = NULL; + IsoReadOpts *opts; + IsoDataSource *src; + + int status = iso_image_new(NULL, &iso); + if( status != 1 ) + return NULL; + + status = iso_read_opts_new(&opts,0); + if( status != 1 ) { + iso_image_unref( iso ); + return NULL; + } + + iso_read_opts_set_start_block(opts, start); + src = iso_data_source_new(source); + status = iso_image_import(iso, src, opts, NULL); + iso_data_source_unref(src); + iso_read_opts_free(opts); + if( status != 1 ) { + iso_image_unref(iso); + return NULL; + } + return iso; +} + +IsoImage *iso_image_new_from_disc( cdrom_disc_t disc, cdrom_lba_t start_sector, ERROR *err ) +{ + return iso_image_new_from_source( &disc->source, start_sector, err ); +} + +IsoImage *iso_image_new_from_track( cdrom_disc_t disc, cdrom_track_t track, ERROR *err ) +{ + return iso_image_new_from_source( &disc->source, track->lba, err ); +} + + +IsoImageFilesystem *iso_filesystem_new_from_source( sector_source_t source, cdrom_lba_t start, ERROR *err ) +{ + IsoImageFilesystem *iso = NULL; + IsoReadOpts *opts; + IsoDataSource *src; + + int status = iso_read_opts_new(&opts,0); + if( status != 1 ) { + return NULL; + } + + iso_read_opts_set_start_block(opts, start); + src = iso_data_source_new(source); + status = iso_image_filesystem_new(src, opts, 0x1FFFFF, &iso); + iso_data_source_unref(src); + iso_read_opts_free(opts); + if( status != 1 ) { + return NULL; + } + return iso; + +} + +IsoImageFilesystem *iso_filesystem_new_from_disc( cdrom_disc_t disc, cdrom_lba_t start_sector, ERROR *err ) +{ + return iso_filesystem_new_from_source( &disc->source, start_sector, err ); +} + +IsoImageFilesystem *iso_filesystem_new_from_track( cdrom_disc_t disc, cdrom_track_t track, ERROR *err ) +{ + return iso_filesystem_new_from_source( &disc->source, track->lba, err ); +} + + +/** + * Construct a sector source from a given IsoImage. + */ +sector_source_t iso_sector_source_new( IsoImage *image, sector_mode_t mode, cdrom_lba_t start_sector, + const char *bootstrap, ERROR *err ) +{ + assert( mode == SECTOR_MODE1 || mode == SECTOR_MODE2_FORM1 ); + + IsoWriteOpts *opts; + struct burn_source *burn; + + int status = iso_write_opts_new(&opts, 0); + if( status != 1 ) + return NULL; + iso_write_opts_set_appendable(opts,0); + iso_write_opts_set_ms_block(opts, start_sector); + iso_write_opts_set_system_area(opts, (char *)bootstrap, 0, 0); + + status = iso_image_create_burn_source(image, opts, &burn); + iso_write_opts_free(opts); + if( status != 1 ) { + return NULL; + } + + off_t size = burn->get_size(burn); + sector_source_t source = tmpfile_sector_source_new(mode); + if( source == NULL ) { + burn->free_data(burn); + free(burn); + return NULL; + } + + char buf[2048]; + cdrom_count_t expect = size/2048; + cdrom_count_t count = 0; + for( cdrom_count_t count = 0; count < expect; count++ ) { + status = burn->read(burn, buf, 2048); + if( status == 0 ) { + /* EOF */ + break; + } else if( status != 2048 ) { + /* Error */ + sector_source_unref(source); + source = NULL; + break; + } + } + burn->free_data(burn); + free(burn); + return source; +} + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/drivers/cdrom/isofs.h Mon May 17 22:01:23 2010 +1000 @@ -0,0 +1,58 @@ +/** + * $Id$ + * + * libisofs adapter + * + * Copyright (c) 2010 Nathan Keynes. + * + * 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. + */ + +#ifndef cdrom_isofs_H +#define cdrom_isofs_H 1 + +#include +#include "drivers/cdrom/sector.h" + +/** + * Construct an IsoFilesystem from an existing sector source + */ +IsoImageFilesystem *iso_filesystem_new_from_source( sector_source_t track, cdrom_lba_t start, ERROR *err ); +IsoImageFilesystem *iso_filesystem_new_from_disc( cdrom_disc_t disc, cdrom_lba_t start, ERROR *err ); +IsoImageFilesystem *iso_filesystem_new_from_track( cdrom_disc_t disc, cdrom_track_t track, ERROR *err ); + + +/** + * Convenience function to read an entire IsoFileSource + */ +int iso_source_file_read_all( IsoFileSource *file, unsigned char *buf, size_t max_size ); + +/** + * Construct an IsoImage image from an existing sector source, for use in + * creating a modified image + */ +IsoImage *iso_image_new_from_source( sector_source_t track, cdrom_lba_t start, ERROR *err ); + +/** + * Construct an IsoImage from a cdrom disc and sector position. + * @return a new isofs_reader, or NULL on an error. + */ +IsoImage *iso_image_new_from_disc( cdrom_disc_t disc, cdrom_lba_t start_sector, ERROR *err ); + +IsoImage *iso_image_new_from_track( cdrom_disc_t disc, cdrom_track_t track, ERROR *err ); + +/** + * Construct a sector source from a given IsoImage. + */ +sector_source_t iso_sector_source_new( IsoImage *image, sector_mode_t mode, cdrom_lba_t start_sector, + const char *bootstrap, ERROR *err ); + +#endif /* !cdrom_isofs_H */ --- a/src/drivers/cdrom/isoread.c Tue Mar 23 19:48:03 2010 +1000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,392 +0,0 @@ -/** - * $Id$ - * - * ISO9660 filesystem reading support - * - * Copyright (c) 2010 Nathan Keynes. - * - * 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. - */ - -#include "drivers/cdrom/cdrom.h" -#include "drivers/cdrom/isoread.h" -#include "drivers/cdrom/iso_impl.h" - -#include -#include - -static char isofs_magic[5] = { 'C', 'D', '0', '0', '1' }; - -#define ISO_DIR_TAG 0x52494449 - -struct isofs_reader_dir { - uint32_t tag; - isofs_reader_dir_t parent; - size_t num_entries; - struct isofs_reader_dirent entries[]; -}; - -struct isofs_reader { - /** - * Base sector source to read the filesystem from (must support Mode 1 reads) - */ - sector_source_t source; - - /** - * Offset of the source relative to the start of the (notional) disc - - * this is subtracted from all source lba addresses. - */ - cdrom_lba_t source_offset; - - /** - * Start of the ISO9660 filesystem relative to the start of the disc. - * (The actual superblock is at fs_start+16) - */ - cdrom_lba_t fs_start; - - /** - * If TRUE, read the little-endian side of the FS, otherwise the big-endian - * side. (They should normally give the same result, but in case it matters...) - */ - gboolean little_endian; - - /** - * The volume sequence number, for multi-volume sets. - */ - uint16_t volume_seq_no; - - char volume_label[33]; - - /** - * Filesystem root directory - */ - isofs_reader_dir_t root_dir; -}; - -/** - * Read a 16-bit dual-endian field using the defined endianness of the reader - */ -#define ISO_GET_DE16( iso, field ) \ - ( ((iso)->little_endian) ? GINT16_FROM_LE(field) : GINT16_FROM_BE(*((&field)+1)) ) - -/** - * Read a 32-bit dual-endian field using the defined endianness of the reader - */ -#define ISO_GET_DE32( iso, field ) \ - ( ((iso)->little_endian) ? GINT32_FROM_LE(field) : GINT32_FROM_BE(*((&field)+1)) ) - - -static void isofs_reader_convert_dirent( isofs_reader_t iso, isofs_reader_dirent_t dest, iso_dirent_t src, - char **strp ) -{ - dest->start_lba = ISO_GET_DE32(iso, src->file_lba_le); - dest->size = ISO_GET_DE32(iso, src->file_size_le); - dest->is_dir = (src->flags & ISO_FILE_DIR) ? TRUE : FALSE; - dest->interleave_gap = src->gap_size; - dest->interleave_size = src->unit_size; - dest->name = *strp; - memcpy( *strp, src->file_id, src->file_id_len ); - (*strp)[src->file_id_len] = '\0'; - *strp += src->file_id_len + 1; -} - -/** - * Read a directory from the disc into memory. - */ -isofs_reader_dir_t isofs_reader_read_dir( isofs_reader_t iso, cdrom_lba_t lba, size_t size ) -{ - cdrom_count_t count = (size+2047)/2048; - - char buf[count*2048]; - - if( isofs_reader_read_sectors( iso, lba, count, buf ) != CDROM_ERROR_OK ) - return NULL; - - size_t len = 0; - unsigned num_entries = 0, i=0, offset=0; - /* Compute number of entries and total string length */ - while( offset < size ) { - struct iso_dirent *p = (struct iso_dirent *)&buf[offset]; - offset += p->record_len; - if( offset > size || p->record_len < sizeof(struct iso_dirent) ) - break; // Bad record length - if( p->file_id_len + sizeof(struct iso_dirent)-1 > p->record_len ) - break; // Bad fileid length - if( p->file_id_len == 1 && (p->file_id[0] == 0 || p->file_id[0] == 1 ) ) - continue; /* self and parent-dir references */ - num_entries++; - len += p->file_id_len + 1; - } - - size_t table_len = num_entries * sizeof(struct isofs_reader_dirent); - isofs_reader_dir_t dir = g_malloc0( sizeof(struct isofs_reader_dir) + table_len + len ); - dir->tag = ISO_DIR_TAG; - dir->num_entries = num_entries; - - char *strp = (char *)&dir->entries[num_entries]; - offset = 0; - for( i=0; i < num_entries; i++ ) { - struct iso_dirent *p; - do { - p = (struct iso_dirent *)&buf[offset]; - offset += p->record_len; - /* Skip over self and parent-dir references */ - } while( p->file_id_len == 1 && (p->file_id[0] == 0 || p->file_id[0] == 1 ) ); - - isofs_reader_convert_dirent( iso, &dir->entries[i], p, &strp ); - - } - return dir; -} - -static gboolean isofs_reader_dirent_match_exact( const char *file, const char *find ) -{ - return strcasecmp( file, find ) == 0; -} - -static gboolean isofs_reader_dirent_match_unversioned( const char *file, const char *find ) -{ - char *semi = strchr(file, ';'); - if( semi == NULL ) { - /* Unversioned ISO file */ - return strcasecmp( file, find ) == 0; - } else { - int len = semi - file; - return strncasecmp( file, find, len ) == 0 && strlen(find) == len; - } -} - -/** - * Search a directory for a given filename. If found, return the corresponding - * dirent structure, otherwise NULL. Comparison is case-insensitive, and returns - * the most recent (highest numbered) version of a file in case of multiple - * versions unless the requested component is also explicitly versioned. - * - * For now just do a linear search, although we could do a binary search given - * that the directory should be sorted. - */ -static isofs_reader_dirent_t isofs_reader_get_file_component( isofs_reader_dir_t dir, const char *component ) -{ - - if( strchr( component, ';' ) != NULL ) { - for( unsigned i=0; inum_entries; i++ ) { - if( isofs_reader_dirent_match_exact(dir->entries[i].name,component) ) { - return &dir->entries[i]; - } - } - } else { - for( unsigned i=0; inum_entries; i++ ) { - if( isofs_reader_dirent_match_unversioned(dir->entries[i].name,component) ) { - return &dir->entries[i]; - } - } - } - return NULL; -} - -isofs_reader_dirent_t isofs_reader_get_file( isofs_reader_t iso, const char *pathname ) -{ - int pathlen = strlen(pathname); - char tmp[pathlen+1]; - char *p = tmp; - isofs_reader_dir_t dir = iso->root_dir; - - memcpy( tmp, pathname, pathlen+1 ); - char *q = strchr(p, '/'); - while( q != NULL ) { - *q = '\0'; - isofs_reader_dirent_t ent = isofs_reader_get_file_component( dir, p ); - if( ent == NULL || !ent->is_dir ) { - return NULL; - } - if( ent->subdir == NULL ) { - ent->subdir = dir = isofs_reader_read_dir( iso, ent->start_lba, ent->size ); - if( dir == NULL ) { - return NULL; - } - } - - p = q+1; - q = strchr(p, '/'); - - } - return isofs_reader_get_file_component( dir, p ); -} - -cdrom_error_t isofs_reader_read_file( isofs_reader_t iso, isofs_reader_dirent_t file, - size_t offset, size_t byte_count, unsigned char *buf ) -{ - char tmp[2048]; - - if( offset + byte_count > file->size ) - return CDROM_ERROR_BADREAD; - - if( file->interleave_gap == 0 ) { - cdrom_lba_t lba = file->start_lba + (offset>>11); - lba += ((file->xa_size+2047)>>11); /* Skip XA record if present */ - - if( (offset & 2047) != 0 ) { - /* Read an unaligned start block */ - cdrom_error_t status = isofs_reader_read_sectors( iso, lba, 1, tmp ); - if( status != CDROM_ERROR_OK ) - return status; - unsigned align = offset & 2047; - size_t length = 2048 - align; - if( length >= byte_count ) { - memcpy( buf, &tmp[align], byte_count ); - return CDROM_ERROR_OK; - } else { - memcpy( buf, &tmp[align], length ); - byte_count -= length; - buf += length; - lba++; - } - } - /* Read the bulk of the data */ - cdrom_count_t sector_count = byte_count >> 11; - if( sector_count > 0 ) { - cdrom_error_t status = isofs_reader_read_sectors( iso, lba, sector_count, buf ); - if( status != CDROM_ERROR_OK ) - return status; - buf += (sector_count << 11); - lba += sector_count; - } - /* Finally read a partial final block */ - if( (byte_count & 2047) != 0 ) { - cdrom_error_t status = isofs_reader_read_sectors( iso, lba, 1, tmp ); - if( status != CDROM_ERROR_OK ) - return status; - memcpy( buf, tmp, byte_count & 2047 ); - } - return CDROM_ERROR_OK; - } else { - // ERROR("Interleaved files not supported"); - return CDROM_ERROR_BADREAD; - } -} - -void isofs_reader_destroy_dir( isofs_reader_dir_t dir ) -{ - dir->tag = 0; - for( unsigned i=0; inum_entries; i++ ) { - if( dir->entries[i].subdir != NULL ) { - isofs_reader_dir_t subdir = dir->entries[i].subdir; - dir->entries[i].subdir = NULL; - isofs_reader_destroy_dir(dir); - } - } - g_free(dir); -} - -cdrom_error_t isofs_reader_read_sectors( isofs_reader_t iso, cdrom_lba_t lba, cdrom_count_t count, - unsigned char *buf ) -{ - if( lba < iso->source_offset ) - return CDROM_ERROR_BADREAD; - return sector_source_read_sectors( iso->source, lba - iso->source_offset, count, - CDROM_READ_MODE2_FORM1|CDROM_READ_DATA, buf, NULL ); -} - - -isofs_reader_t isofs_reader_new( sector_source_t source, cdrom_lba_t offset, cdrom_lba_t start, ERROR *err ) -{ - char buf[2048]; - iso_pvd_t pvd = (iso_pvd_t)&buf; - unsigned i = 0; - - isofs_reader_t iso = g_malloc0( sizeof(struct isofs_reader) ); - if( iso == NULL ) { - SET_ERROR( err, ENOMEM, "Unable to allocate memory" ); - return NULL; - } - iso->source = source; - iso->source_offset = offset; - iso->fs_start = start; - iso->little_endian = TRUE; - - do { - /* Find the primary volume descriptor */ - cdrom_error_t status = isofs_reader_read_sectors( iso, iso->fs_start + ISO_SUPERBLOCK_OFFSET + i, 1, buf ); - if( status != CDROM_ERROR_OK ) { - SET_ERROR( err, EBADF, "Unable to read superblock from ISO9660 filesystem" ); - g_free(iso); - return NULL; - } - if( memcmp(pvd->tag, isofs_magic, 5) != 0 || /* Not an ISO volume descriptor */ - pvd->desc_type == ISO_TERMINAL_DESCRIPTOR ) { /* Reached the end of the descriptor list */ - SET_ERROR( err, EINVAL, "ISO9660 filesystem not found" ); - g_free(iso); - return NULL; - } - i++; - } while( pvd->desc_type != ISO_PRIMARY_DESCRIPTOR ); - - if( pvd->desc_version != 1 ) { - SET_ERROR( err, EINVAL, "Incompatible ISO9660 filesystem" ); - g_free(iso); - return NULL; - } - - iso->volume_seq_no = ISO_GET_DE16(iso, pvd->volume_seq_le); - memcpy( iso->volume_label, pvd->volume_id, 32 ); - for( i=32; i>0 && iso->volume_label[i-1] == ' '; i-- ); - iso->volume_label[i] = '\0'; - - iso->root_dir = isofs_reader_read_dir( iso, - ISO_GET_DE32(iso, pvd->root_dirent.file_lba_le), - ISO_GET_DE32(iso, pvd->root_dirent.file_size_le) ); - if( iso->root_dir == NULL ) { - SET_ERROR( err, EINVAL, "Unable to read root directory from ISO9660 filesystem" ); - g_free(iso); - return NULL; - } - - sector_source_ref( source ); - return iso; -} - -isofs_reader_t isofs_reader_new_from_disc( cdrom_disc_t disc, cdrom_lba_t lba, ERROR *err ) -{ - return isofs_reader_new( &disc->source, 0, lba, err ); -} - -isofs_reader_t isofs_reader_new_from_track( cdrom_disc_t disc, cdrom_track_t track, ERROR *err ) -{ - return isofs_reader_new( &disc->source, 0, track->lba, err ); -} - -isofs_reader_t isofs_reader_new_from_source( sector_source_t source, ERROR *err ) -{ - return isofs_reader_new( source, 0, 0, err ); -} - -void isofs_reader_destroy( isofs_reader_t iso ) -{ - isofs_reader_destroy_dir( iso->root_dir ); - iso->root_dir = NULL; - sector_source_unref( iso->source ); - iso->source = NULL; - g_free( iso ); -} - -isofs_reader_dir_t isofs_reader_get_root_dir( isofs_reader_t iso ) -{ - return iso->root_dir; -} - -void isofs_reader_print_dir( FILE *f, isofs_reader_dir_t dir ) -{ - fprintf( f, "Total %d files\n", dir->num_entries ); - for( unsigned i=0; inum_entries; i++ ) { - fprintf( f, "%7d %s\n", dir->entries[i].size, dir->entries[i].name ); - } - -} --- a/src/drivers/cdrom/isoread.h Tue Mar 23 19:48:03 2010 +1000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,95 +0,0 @@ -/** - * $Id$ - * - * ISO9660 filesystem reading support - * - * Copyright (c) 2010 Nathan Keynes. - * - * 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. - */ - - -#ifndef cdrom_isoread_H -#define cdrom_isoread_H 1 - -#include "drivers/cdrom/defs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct isofs_reader_dir *isofs_reader_dir_t; - -typedef struct isofs_reader_dirent { - const char *name; - size_t size; - gboolean is_dir; - - cdrom_lba_t start_lba; - size_t xa_size; - unsigned interleave_gap; - unsigned interleave_size; - isofs_reader_dir_t subdir; -} *isofs_reader_dirent_t; - -/** - * ISO9600 filesystem reader. - */ -typedef struct isofs_reader *isofs_reader_t; - -/** - * Construct an isofs reader from an existing sector source. On error, returns - * NULL. - */ -isofs_reader_t isofs_reader_new_from_source( sector_source_t track, ERROR *err ); - -/** - * Construct an isofs from a cdrom disc and sector position. - * @return a new isofs_reader, or NULL on an error (and sets err). - */ -isofs_reader_t isofs_reader_new_from_disc( cdrom_disc_t disc, cdrom_lba_t start_sector, ERROR *err ); - -isofs_reader_t isofs_reader_new_from_track( cdrom_disc_t disc, cdrom_track_t track, ERROR *err ); - -/** - * Destroy an isofs reader. - */ -void isofs_reader_destroy( isofs_reader_t reader ); - -/** - * Read 0 or more 2048-byte sectors from the filesystem. - */ -cdrom_error_t isofs_reader_read_sectors( isofs_reader_t iso, cdrom_lba_t sector, cdrom_count_t count, - unsigned char *buf ); - - -/** - * Search the filesystem for the specific fully-qualified file. - * @return FALSE if the file could not be found, otherwise TRUE and the iterator - * is updated to point to the requested file. - */ -isofs_reader_dirent_t isofs_reader_get_file( isofs_reader_t iso, const char *filename ); - -cdrom_error_t isofs_reader_read_file( isofs_reader_t iso, isofs_reader_dirent_t file, - size_t offset, size_t byte_count, unsigned char *buf ); - -/** - * Print an isofs directory to the given stream (mostly for debugging purposes) - */ -void isofs_reader_print_dir( FILE *f, isofs_reader_dir_t dir ); - -isofs_reader_dir_t isofs_reader_get_root_dir( isofs_reader_t iso ); - -#ifdef __cplusplus -} -#endif - -#endif /* !cdrom_isoread_H */ --- a/src/drivers/cdrom/sector.c Tue Mar 23 19:48:03 2010 +1000 +++ b/src/drivers/cdrom/sector.c Mon May 17 22:01:23 2010 +1000 @@ -25,6 +25,7 @@ #include #include +#include "lxpaths.h" #include "drivers/cdrom/sector.h" #include "drivers/cdrom/cdrom.h" #include "drivers/cdrom/ecc.h" @@ -534,6 +535,139 @@ fref->closeOnDestroy = closeOnDestroy; } +/********************** Temporary file implementation ************************/ +/** + * The tmpfile source behaves exactly like a regular file source, except that + * it creates a new temporary file, which is deleted on destruction or program + * exit. The file is initially empty, so the user will need to get the fd and + * write something to it before use. + */ + +typedef struct tmpfile_sector_source { + struct file_sector_source file; + const char *filename; +} *tmpfile_sector_source_t; + +static GList *tmpfile_open_list = NULL; +static gboolean tmpfile_atexit_installed = 0; /* TRUE to indicate atexit hook is registered */ + +/** + * atexit hook to destroy any open tmpfiles - make sure they're deleted. + */ +static void tmpfile_atexit_hook(void) +{ + GList *ptr; + while( tmpfile_open_list != NULL ) { + sector_source_t source = (sector_source_t)tmpfile_open_list->data; + source->destroy(source); + assert( tmpfile_open_list == NULL || tmpfile_open_list->data != source ); + } +} + + +static void tmpfile_sector_source_destroy( sector_source_t dev ) +{ + assert( IS_SECTOR_SOURCE_TYPE(dev,FILE_SECTOR_SOURCE) ); + tmpfile_sector_source_t fdev = (tmpfile_sector_source_t)dev; + + fclose( fdev->file.file ); + fdev->file.file = NULL; + unlink(fdev->filename); + g_free((char *)fdev->filename); + tmpfile_open_list = g_list_remove(tmpfile_open_list, fdev); + default_sector_source_destroy(dev); +} + +sector_source_t tmpfile_sector_source_new( sector_mode_t mode ) +{ + if( !tmpfile_atexit_installed ) { + atexit(tmpfile_atexit_hook); + } + + gchar *tmpdir = getenv("TMPDIR"); + if( tmpdir == NULL ) { + tmpdir = "/tmp"; + } + gchar *tempfile = get_filename_at(tmpdir, "cd.XXXXXXX"); + int fd = mkstemp( tempfile ); + if( fd == -1 ) { + g_free(tempfile); + return FALSE; + } + + FILE *f = fdopen( fd, "w+" ); + if( f == NULL ) { + close(fd); + unlink(tempfile); + g_free(tempfile); + return NULL; + } + + tmpfile_sector_source_t dev = g_malloc0(sizeof(struct tmpfile_sector_source)); + dev->file.file = f; + dev->filename = tempfile; + sector_source_t source = sector_source_init( &dev->file.dev, FILE_SECTOR_SOURCE, mode, 0, file_sector_source_read, tmpfile_sector_source_destroy ); + tmpfile_open_list = g_list_append(tmpfile_open_list, source); +} + +/************************ Memory device implementation *************************/ +typedef struct mem_sector_source { + struct sector_source dev; + unsigned char *buffer; + gboolean freeOnDestroy; +} *mem_sector_source_t; + +static void mem_sector_source_destroy( sector_source_t dev ) +{ + assert( IS_SECTOR_SOURCE_TYPE(dev,MEM_SECTOR_SOURCE) ); + mem_sector_source_t mdev = (mem_sector_source_t)dev; + + if( mdev->freeOnDestroy ) { + free(mdev->buffer); + } + mdev->buffer = NULL; + default_sector_source_destroy(dev); +} + +static cdrom_error_t mem_sector_source_read( sector_source_t dev, cdrom_lba_t lba, cdrom_count_t block_count, unsigned char *buf ) +{ + assert( IS_SECTOR_SOURCE_TYPE(dev,MEM_SECTOR_SOURCE) ); + mem_sector_source_t mdev = (mem_sector_source_t)dev; + + if( (lba + block_count) >= dev->size ) + return CDROM_ERROR_BADREAD; + uint32_t off = lba * CDROM_SECTOR_SIZE(dev->mode); + uint32_t size = block_count * CDROM_SECTOR_SIZE(dev->mode); + + memcpy( buf, mdev->buffer + off, size ); + return CDROM_ERROR_OK; +} + +sector_source_t mem_sector_source_new_buffer( unsigned char *buffer, sector_mode_t mode, + cdrom_count_t sector_count, gboolean freeOnDestroy ) +{ + assert( mode != SECTOR_UNKNOWN ); + assert( buffer != NULL ); + mem_sector_source_t dev = g_malloc(sizeof(struct mem_sector_source)); + dev->buffer = buffer; + dev->freeOnDestroy = freeOnDestroy; + return sector_source_init( &dev->dev, MEM_SECTOR_SOURCE, mode, sector_count, mem_sector_source_read, mem_sector_source_destroy ); +} + +sector_source_t mem_sector_source_new( sector_mode_t mode, cdrom_count_t sector_count ) +{ + return mem_sector_source_new_buffer( g_malloc( sector_count * CDROM_SECTOR_SIZE(mode) ), mode, + sector_count, TRUE ); +} + +unsigned char *mem_sector_source_get_buffer( sector_source_t dev ) +{ + assert( IS_SECTOR_SOURCE_TYPE(dev,MEM_SECTOR_SOURCE) ); + mem_sector_source_t mdev = (mem_sector_source_t)dev; + return mdev->buffer; +} + + /************************ Track device implementation *************************/ typedef struct track_sector_source { struct sector_source dev; --- a/src/drivers/cdrom/sector.h Tue Mar 23 19:48:03 2010 +1000 +++ b/src/drivers/cdrom/sector.h Mon May 17 22:01:23 2010 +1000 @@ -33,6 +33,7 @@ typedef enum { NULL_SECTOR_SOURCE, FILE_SECTOR_SOURCE, + MEM_SECTOR_SOURCE, DISC_SECTOR_SOURCE, TRACK_SECTOR_SOURCE } sector_source_type_t; @@ -56,7 +57,7 @@ sector_source_type_t type; sector_mode_t mode; /* Implies sector size. */ - uint32_t size; /* Block count */ + cdrom_count_t size; /* Block count */ /** * Read blocks from the device using the native block size. @@ -98,6 +99,12 @@ sector_source_t file_sector_source_new_full( FILE *f, sector_mode_t mode, gboolean closeOnDestroy ); /** + * Temp-file creator - initially empty. Creates a file in the system temp dir, + * unlinked on destruction or program exit. + */ +sector_source_t tmpfile_sector_source_new( sector_mode_t mode ); + +/** * Construct a file source that shares its file descriptor with another * file source. */ @@ -119,6 +126,25 @@ */ int file_sector_source_get_fd( sector_source_t ref ); +/** Construct a memory source with the given mode and size */ +sector_source_t mem_sector_source_new( sector_mode_t mode, cdrom_count_t size ); + +/** + * Construct a memory source using the supplied buffer for data. + * @param buffer The buffer to read from, which must be at least size * sector_size in length + * @param mode The sector mode of the data in the buffer, which cannot be SECTOR_UNKNOWN + * @param size Number of sectors in the buffer + * @param freeOnDestroy If true, the source owns the buffer and will release it when the + * source is destroyed. + */ +sector_source_t mem_sector_source_new_buffer( unsigned char *buffer, sector_mode_t mode, cdrom_count_t size, + gboolean freeOnDestroy ); + +/** + * Retrieve the underlying buffer for a memory source + */ +unsigned char *mem_sector_source_get_buffer( sector_source_t source ); + /** * Increment the reference count for a block device. */ --- a/src/main.c Tue Mar 23 19:48:03 2010 +1000 +++ b/src/main.c Mon May 17 22:01:23 2010 +1000 @@ -20,6 +20,7 @@ #include #include #include +#include #include "lxdream.h" #include "lxpaths.h" #include "gettext.h" @@ -224,6 +225,7 @@ exit(0); } + iso_init(); gdrom_list_init(); vmulist_init(); --- a/src/test/testisoread.c Tue Mar 23 19:48:03 2010 +1000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/** - * $Id$ - * - * Unit tests for the ISO9660 filesystem reader - * - * Copyright (c) 2010 Nathan Keynes. - * - * 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. - */ - -#include "drivers/cdrom/cdrom.h" -#include "drivers/cdrom/isoread.h" -#include - -int main( int argc, char *argv[] ) -{ - if( argc < 2 ) { - fprintf( stderr, "Usage: testisoread \n" ); - return 1; - } - - ERROR err; - cdrom_disc_t disc = cdrom_disc_open(argv[1], &err); - - if( disc == NULL ) { - fprintf( stderr, "Unable to open disc image '%s': %s\n", argv[1], err.msg ); - return 2; - } - cdrom_track_t track = cdrom_disc_get_last_data_track(disc); - if( track == NULL ) { - fprintf( stderr, "Disc has no data tracks\n" ); - return 3; - } - - isofs_reader_t iso = isofs_reader_new_from_track( disc, track, &err ); - if( iso == NULL ) { - fprintf( stderr, "Unable to open ISO filesystem: %s\n", err.msg ); - return 4; - } - isofs_reader_print_dir( stdout, isofs_reader_get_root_dir(iso) ); - - isofs_reader_dirent_t boot = isofs_reader_get_file( iso, "1st_read.bin" ); - if( boot == NULL ) { - fprintf( stderr, "Unable to find 1st_read.bin" ); - return 5; - } - - printf( "Bootstrap: %s (%d)\n", boot->name, boot->size ); - char tmp[boot->size]; - if( isofs_reader_read_file( iso, boot, 0, boot->size, tmp ) != CDROM_ERROR_OK ) { - fprintf( stderr, "Unable to read 1st_read.bin" ); - return 6; - } - return 0; -}