BRLTTY on DOS

Contents

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 ftp://ftp.delorie.com/pub/djgpp/current/v2/unzip32.exe.

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 ftp://ftp.delorie.com/pub/djgpp/beta/v2/djcrx204.zip.

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

-v (verbose)
Increase output verbosity. This option complements the -q option. It may be specified multiple times.
-q (quiet)
Decrease output verbosity. This option complements the -v option. It may be specified multiple times.
-h (help)
Write a brief command line usage summary on standard output, and then exit.

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 ftp://ftp.delorie.com/pub/djgpp/beta/v2
gcc432s2.zip ftp://ftp.delorie.com/pub/djgpp/current/v2gnu

You'll need the following Gnu archives:

Archive Name Download From
autoconf-2.13.tar.gz http://ftp.gnu.org/gnu/autoconf
autoconf-2.57.tar.gz http://ftp.gnu.org/gnu/autoconf
automake-1.9.6.tar.gz http://ftp.gnu.org/gnu/automake
binutils-2.24.tar.gz http://ftp.gnu.org/gnu/binutils
gcc-4.3.2.tar.gz http://gcc.gnu.org/mirrors.html

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 source 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.
-v (verbose)
Increase output verbosity. This option complements the -q option. It may be specified multiple times.
-q (quiet)
Decrease output verbosity. This option complements the -v option. It may be specified multiple times.
-h (help)
Write a brief command line usage summary on standard output, and then exit.