#!/bin/sh ### BEGIN INIT INFO # Provides: atari800_binfmt_misc # Required-Start: # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: Register Atari 8-bit file formats with binfmt_misc ### END INIT INFO # atari800_binfmt_misc: register Atari 8-bit file formats with binfmt_misc. # Allows direct execution of Atari executables, disk images, boot cassette # images, BASIC programs, and cartridge images, via the atari800 emulator. PROCDIR=/proc/sys/fs/binfmt_misc EMUDIRS="/usr/local/bin /usr/bin /bin" ### Functions. This script doesn't depend on any external function library. die() { echo $1 1>&2 exit 1 } usage() { cat </dev/null mount -t binfmt_misc none $PROCDIR 2>/dev/null } check_binfmt_misc() { # sanity check cd $PROCDIR && [ -f status ] if [ "$?" != "0" ]; then die "binfmt_misc not available in kernel" fi } unregister_filetypes() { local type cd $PROCDIR || die "$PROCDIR does not exist" # Unregister filetypes, if already registered # (not an error if already unregistered) for type in \ atari8_xex atari8_basic atari8_atr \ atari8_xfd atari8_Xfd atari8_XFD \ atari8_cas atari8_cart do [ -f $type ] && echo -1 > $type done } register_filetypes() { cd $PROCDIR || die "$PROCDIR does not exist" # Register filetypes # :name:type:offset:magic:mask:interpreter:flags # see /usr/src/linux/Documentation/binfmt_misc.txt or # http://www.tat.physik.uni-tuebingen.de/~rguenth/linux/binfmt_misc.html # for explanation of this. echo ':atari8_xex:M::\xff\xff::'$ATARI800_BIN':' > register echo ':atari8_basic:M::\x00\x00::'$ATARI800_BIN':' > register echo ':atari8_atr:M::\x96\x02::'$ATARI800_BIN':' > register echo ':atari8_xfd:E::xfd::'$ATARI800_BIN':' > register echo ':atari8_Xfd:E::Xfd::'$ATARI800_BIN':' > register echo ':atari8_XFD:E::XFD::'$ATARI800_BIN':' > register echo ':atari8_cas:M::FUJI::'$ATARI800_BIN':' > register echo ':atari8_cart:M::CART::'$ATARI800_BIN':' > register # This is disabled because (a) lots of emulators use .rom files, and # (b) current version of atari800 needs the -cart parameter for raw # ROM dumps, which we can't provide via binfmt_misc. #echo ':atari8_rom:E::rom::'$ATARI800_BIN':' > register # see if it worked: if [ ! -f atari8_xex ]; then die "Failed to register filetypes, are you root?" fi } ### main() case "$1" in stop) unregister_filetypes ;; start) init_binfmt_misc check_binfmt_misc find_atari800 register_filetypes ;; restart) init_binfmt_misc check_binfmt_misc unregister_filetypes find_atari800 register_filetypes ;; *) usage ;; esac exit 0 # notes: # NO parameters allowed when calling the emulator, use a wrapper # script if you need to always pass e.g. -windowed or -ntscemu, or # just put on the command line when you run an Atari program. # there's no "magic" for recognizing XFD images. Instead, they're # recognized by filename extension... which is case-sensitive, hence # the xfd/Xfd/XFD combination. Feel free to add xFD or xFd, etc, if # you have a bunch of files named like that (better solution would be # to rename them!) # There's no way to determine whether a given disk or tape image # requires BASIC. The wrapper scripts assume that a boot disk, XEX # file, or boot tape, does not require BASIC... and that a BASIC # program (obviously) does. Unfortunately there's no easy way to # have the emulator run CLOAD, for a non-bootable BASIC tape, so # CAS support can only work with boot tapes. # Likewise, there's no way to tell whether a given tape or disk # image is in fact bootable (well, not really true, the wrappers # *could* examine boot records, etc, but they don't). # If you have a XEX, ATR/XFD image, or boot CAS image that requires # BASIC, you can enable it, by adding the -basic parameter to the # command line (e.g. "myimage.atr -basic"). More generally, you # can pass arbitrary atari800 options just by putting them on the # image command line (see atari800 -help for full list).