~~~~~~~~~~~~~ BRLTTY on DOS ~~~~~~~~~~~~~ .. include:: prologue.rst Using BRLTTY ============ Serial Support -------------- The default DOS serial driver does not support speeds above 9600 baud. For higher speeds, a more capable serial driver (like ADF) must be used. USB Support ----------- USB isn't supported. Bluetooth Support ----------------- Bluetooth isn't supported. Unpacking the Archive --------------------- If you'd like to unpack the archive on your DOS system but don't have an unzip command on it, you can get one from ``_. If you'd like to unpack the archive into your DOS file system from your Linux system then you need to be able to mount your DOS partition on your Linux system. If you do this then you must be careful about two things. The first is that you must ensure that your DOS system is shut down first so that two systems won't be accessing the same partition at the same time. The second is that you must mount the partition in a way that prevents the long file names that BRLTTY uses from being converted into those cryptic Windows short file names - the ones that look like ``longna~1.ext``. One way to do this is to use the ``-o nonumtail`` option when mounting your DOS partition. For example:: mkdir -p /mnt/dos mount -o nonumtail /dev/sda1 /mnt/dos What you most likely have is an image of the whole hard disk, rather than an image of just the DOS partition. There are a number of ways to mount the DOS partition within the hard disk image. We'll describe some of them here. For our examples, we'll assume that the DOS partition is the first primary partition of a hard disk whose image is in the file ``disk.img``. A Simple but Dangerous Way ~~~~~~~~~~~~~~~~~~~~~~~~~~ The simplest, but also the most dangerous, way is to do some simple math and to use an obscure mount option. First, use the ``fdisk`` command to find out where the DOS partition starts within the hard disk image. To do this, use the command:: fdisk -l disk.img You should see output that looks like this:: Disk disk.img: 1073 MB, 1073741824 bytes, 2097152 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System disk.img1 * 63 2062367 1031152+ 6 FAT16 From the ``Start`` column, you can see that the DOS partition starts in sector 63 of the hard disk. Since a sector is a 512-byte block, you need to multiply 63 by 512 in order to calculate the partition's byte offset:: 63 x 512 = 32256 Now you can mount the DOS partition using that obscure option:: mount -o offset=32256 disk.img /mnt/dos But don't forget the afore-mentioned Windows cryptic short file name problem. The command you should really use, therefore, is:: mount -o offset=32256,nonumtail disk.img /mnt/dos Before you restart your DOS system, don't forget to first unmount the DOS partition from your Linux system:: umount /mnt/dos Using ``kpatrx`` ~~~~~~~~~~~~~~~~ Another way to mount the DOS partition, which is much safer, is to use the ``kpartx`` command to create a loop device for the desired partition within the hard disk image. Use a command like this:: kpartx -v -s -a disk.img * The ``-v`` (verbose) option tells ``kpartx`` to be informative, which is the easiest way to find out the name of the loop device that it will create. * The ``-s`` (synchronous) option tells ``kpartx`` to wait until the loop device has been created by ``udev`` before returning. * The ``-a`` (add) option tells ``kpartx`` to create the loop device. You should see output like this:: add map loop0p1 (253:11): 0 2062305 linear /dev/loop0 63 So you now know that the loop device you need to mount is ``/dev/mapper/loop0p1``:: mount -o nonumtail /dev/mapper/loop0p1 /mnt/dos When you're finished, you need to unmount the partition and to remove the loop device:: umount /mnt/dos kpartx -d disk.img ``DOSIDLE`` ----------- ``DOSIDLE`` is a DOS application that many users run in order to stop their computer or virtual machine from needlessly consuming CPU time when DOS has nothing meaningful to do. If you use it, don't use a "cooling strategy" more invasive than ``weak``. In other words, don't specify more than ``-fm1``. Using a "cooling strategy" that is too aggressive will cause ``DOSIDLE`` to correctly deduce that the system is idle when BRLTTY has nothing to do, but that will cause BRLTTY to stop running, too, which isn't what you want. Using ``dosemu`` on Linux ------------------------- If you're using ``dosemu`` on Linux, and the Linux kernel is 3.15, then you'll need to explicitly enable 16-bit segment support. This can be done with the following command:: echo 1 >/proc/sys/abi/ldt16 If you'd like this setting to take effect automatically each time you reboot, then create the file ``ldt16.conf`` in the directory ``/etc/sysctl.d/``, and place the following line in it:: abi.ldt16 = 1 Making the Cross Compiler ========================= The DOS version of BRLTTY can be compiled on Linux by using a cross-compiler. To create it, get the following archives: * ``_ * ``_ The ``djcrx203.zip`` archive contains a file named ``cross/howto.32`` that explains how to build a cross-compiler for gcc 3.2. You can build one for gcc 4.1 by applying the same instructions to the ``gcc410s2.zip`` archive (listed above) instead of to the ``gcc32s2.zip`` archive (mentioned in the "howto"). You can also use a more recent ``binutils`` package (2.2.24 works fine). If, when building the cross-compiler, you encounter an error that complains about the ``writev`` function and the ``iovec`` structure not being defined, then you need to upgrade to a newer version of ``djcrx``. Upgrading to ``djcrx204`` is sufficient. It can be downloaded from ``_. Another complexity when building the cross-compiler is that some parts of the process need an older version of ``autoconf`` (2.13) whereas other parts of it need a newer version (2.57). Also, the build works best when a specific version of ``automake`` (1.9.6) is used. We've written a script that builds the cross-compiler, and that also takes care of all of the idiosyncracies that we encountered when doing so. The ``mkdostools`` Script ------------------------- The ``mkdostools`` script builds the cross-compiler that's needed in order to build BRLTTY for DOS on Linux. It resides in the ``DOS/`` subdirectory of BRLTTY's source tree. Basic Options ~~~~~~~~~~~~~ .. include:: common-options.rst Build Directories ~~~~~~~~~~~~~~~~~ A number of directories are used during the build process. Each of them can be explicitly specified via an option, and also has a default subdirectory within the directory that contains the script itself. Each of the default subdirectories may be a symbolic link that points somewhere else. These directories are: ======== ====== ========= Purpose Option Default -------- ------ --------- archives ``-a`` Archives/ build ``-b`` Build/ install ``-i`` Tools/ ======== ====== ========= The **archives** directory is the only one that you need to prepare. It must contain all of the archives that are needed in order to build the cross-compiler. DJGPP archives have the ``.zip`` extension, and Gnu archives have the ``.tar.gz`` extension. See `Required Archives`_ for the list. The **build** directory will contain all of the files that are intirimly needed during the build process. It's created if it doesn't already exist. If it does already exist then it's emptied at the start of the build process. It's also emptied upon the completion of a successful build. This directory needs to be on a volume that has at least 1.5GB of free file space. The **install** directory is where the cross-compiler tools are to be installed. It's created if it doesn't already exist. If it does already exist then it's emptied at the start of the build process. Required Archives ~~~~~~~~~~~~~~~~~ You'll need the following DJGPP archives: ================ ================================================== Archive Name Download From ---------------- -------------------------------------------------- ``djcrx204.zip`` ``_ ``gcc432s2.zip`` ``_ ================ ================================================== You'll need the following Gnu archives: ========================= ==================================== Archive Name Download From ------------------------- ------------------------------------ ``autoconf-2.13.tar.gz`` ``_ ``autoconf-2.57.tar.gz`` ``_ ``automake-1.9.6.tar.gz`` ``_ ``binutils-2.24.tar.gz`` ``_ ``gcc-4.3.2.tar.gz`` ``_ ========================= ==================================== If you'd prefer to build a different version of gcc, there are two important things to know. One is that you need the ``gcc*s2.zip`` archives from DJGPP. The other is that the versions of the Gnu and DJGPP gcc archives must match. If, for example, you'd like to build gcc-4.1.2, then you'll need both ``gcc-4.1.2.tar.gz`` and ``gcc412s2.zip``. The reason we use gcc-4.3.2 in our examples here is because it's the highest version of gcc for which we could find an ``s2.zip`` DJGPP archive. If you only have one Gnu archive for gcc in your **archives** directory then that version will be built. If you have more than one then you'll need to use the ``-g`` (gcc) option (e.g. ``-g 4.3.2``) to explicitly specify the version that is to be built. Building BRLTTY =============== Configuring the Build --------------------- Before configuring BRLTTY, you must add the ``bin/`` subdirectory of the cross-compiler tools to your command search path. If, for example, the cross-compiler is installed in ``/usr/local/dostools``, then add its tools to your command search path with a command like this:: export PATH="/usr/local/dostools/bin:$PATH" You'll also need to ensure that gcc's ``-fgnu89-inline`` option is used. This is done by setting the ``CFLAGS`` environment variable before configuring. For example:: export CFLAGS="-fgnu89-inline" You should be able to use a configure command like this one:: ./configure \ --prefix=/brltty-dos --host=i586-pc-msdosdjgpp \ --enable-relocatable-install \ --disable-api --disable-icu --disable-x \ --without-usb-package --without-bluetooth-package \ --without-libbraille --with-braille-driver=-vr,all \ --without-espeak --without-espeak-ng \ --without-flite --without-speechd \ --with-speech-driver=all \ --with-screen-driver=pb,-all The ``cfg-dos`` Script ~~~~~~~~~~~~~~~~~~~~~~ We provide a script named ``cfg-dos``, which resides in the top-level directory of BRLTTY's source tree, that should make configuring BRLTTY for DOS a bit easier. It runs the ``configure`` script for you, giving it all of the options that are required for a successful DOS build. You can specify additional ``configure`` options (although that shouldn't be necessary) simply by giving them to ``cfg-dos``. The only thing you do need to do is to point the ``DOS_TOOLS_ROOT`` environment variable to the top-level directory of your cross-compiler tools. For example:: export DOS_TOOLS_ROOT=/usr/local/dostools The ``mkdosarc`` Script ----------------------- The ``mkdosarc`` script, which resides in the ``DOS/`` subdirectory of BRLTTY's source tree, creates a DOS archive (a ``.zip`` file) of BRLTTY. It does everything (``configure``, ``make``, ..., ``zip``) except for building the cross-compiler. If you don't already have a cross-compiler for DOS then see `Making the Cross Compiler`_ for instructions on how to build one. Before running this script, ensure that the following commands have been installed on your system: * linuxdoc * unix2dos * zip You'll also need to point the ``DOS_TOOLS_ROOT`` environment variable to the top-level directory of the cross-compiler tools. For example:: export DOS_TOOLS_ROOT=/usr/local/dostools Parameters ~~~~~~~~~~ The script requires only one parameter - the path to the top-level directory of BRLTTY's source tree. If, for example, you're in the ``DOS/`` subdirectory of BRLTTY's source tree (where the script resides), then invoke it like this:: ./mkdosarc .. If you're in the top-level directory of BRLTTY's soruce tree then invoke it like this:: DOS/mkdosarc . Options ~~~~~~~ ``-a`` (archive) Specify the name of the archive (``.zip``) file that will be created. The default archive name is ``brltty-dos``. ``-o`` (overwrite) Allow an already-existing archive to be overwritten. The default is that an already-existing archive won't be overwritten. ``-i`` (install) Specify the name of the subdirectory on the target DOS system into which the archive will be unpacked. Its default name is ``BRLTTY``. It will be an immediate subdirectory of the current working directory when the archive is being unpacked. It will be created if it doesn't already exist. ``-s`` (shell) Invoke an interactive shell just before the archive is created so that you can inspect and/or modify what will be in the archive. The current working directory is set to the top-level directory of the content. The shell specified by the ``SHELL`` environment variable is used. If it isn't set then ``/bin/sh`` is assumed. .. include:: common-options.rst