# BRLTTY on DOS

Contents

- Using BRLTTY
  - Serial Support
  - USB Support
  - Bluetooth Support
  - Unpacking the Archive
    - A Simple but Dangerous Way
    - Using `kpatrx`
  - `DOSIDLE`
  - Using `dosemu` on Linux
- Making the Cross Compiler
  - The `mkdostools` Script
    - Basic Options
    - Build Directories
    - Required Archives
- Building BRLTTY
  - Configuring the Build
    - The `cfg-dos` Script
  - The `mkdosarc` Script
    - Parameters
    - Options

## 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:

- ftp://ftp.delorie.com/pub/djgpp/current/v2gnu/gcc410s2.zip
- ftp://ftp.delorie.com/pub/djgpp/current/v2/djcrx203.zip

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 idiosyncrasies 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.