This section of the document by Hans, <firstname.lastname@example.org>. Last updated on June 2, 2001.
Before you even continue to read further -- especially if you have never tried DOSEMU -- I strongly recommend starting with the ready to use DOSEMU binary distribution. This comes in 2 packages:
A tarball containing the recent DOSEMU binaries together with a user local configuration setup. This installation fits into any user HOME directory and can be used and installed without root permissions.
A tarball containing a collection of suitable FreeDos binaries, eventually patched to fit DOSEMU needs together with some GNU tools you may find useful.
You have to unpack both tarballs (as normal user, NOT as root) into the same directory , `cd' into the directory `dosemu' and execute `./xdosemu' or `./dosemu'. After you have played with this for a while and have looked into the files under `dosemu/conf', you will be much better prepared to understand the rest of this chapter.
Note: The DOSEMU installation described above may also come from a systemwide installation, which you or your Linux distributor has established. In this case, simply calling '[x]dosemu' will establish the per user instance of DOSEMU. For details on how to create such a systemwide installation, look at the file README.distributors in the DOSEMU source distribution.
Also note: The following description was written for the older type of systemwide installation (configuration under /etc). Though this type of installation still works for suid-root DOSEMU runs, the new non-suid type of installation has no dosemu.users and all configuration files are normally kept under $HOME/dosemu/conf/*. The contents of these configuration files are compatible with the below described, so most of what is written also is valid for these private configuration files.
Most of DOSEMU configuration is done during runtime and per default it expects the system wide configuration file dosemu.conf optionally followed by the users ~/.dosemurc and additional configurations statements on the commandline (-I option). The builtin configuration file of a DEXE file is passed using the -I technique, hence the rules of -I apply.
In fact dosemu.conf and ~/.dosemurc (which have identical syntax) are included by the systemwide configuration script global.conf which, by default, is built into the DOSEMU binary. As a normal user you won't ever think on editing this, only dosemu.conf and your personal ~/.dosemurc. The syntax of global.conf is described in detail in README-tech.txt, so this is skipped here. However, the option -I string too uses the same syntax as global.conf, hence, if you are doing some special stuff (after you got familar with DOSEMU) you may need to have a look there.
In DOSEMU prior to 0.97.5 the private configuration file was called ~/.dosrc (not to be confused with the new ~/.dosemurc). This will work as expected formerly, but is subject to be nolonger supported in the near future. This (old) ~/.dosrc is processed after global.conf and follows (same as -I) the syntax of global.conf (see README-tech.txt).
The first file expected (and interpreted) before any other configuration (such as global.conf, dosemu.conf and ~/.dosemurc) is /etc/dosemu.users. Within /etc/dosemu.users the general permissions are set:
which users are allowed to use DOSEMU.
which users are allowed to use DOSEMU suid root.
which users are allowed to have a private lib dir.
what kind of access class the user belongs to.
what special configuration stuff the users needs
and further more:
whether the lib dir (DOSEMU_LIB_DIR) resides elsewhere.
setting the loglevel.
Except for lines starting with `xxx=' (explanation below), each line in dosemu.user corresponds to exactly one valid user count, the special user `all' means any user not mentioned earlier. Format:
[ <login> | all ] [ confvar [ confvar [ ... ] ] ]
The below example is from etc/dosemu.users.secure, which you may copy to /etc/dosemu.users.
root c_all # root is allowed to do all weird things nobody nosuidroot guest # variable 'guest' is checked in global.conf # to allow only DEXE execution guest nosuidroot guest # login guest treated as `nobody' myfriend c_all unrestricted private_setup myboss nosuidroot restricted private_setup all nosuidroot restricted # all other users have normal user restrictions
The use of `nosuidroot' will force a suid root dosemu binary to exit, the user may however use a non-suid root copy of the binary. For more information on this look at README-tech, chapter 11.1 `Privileges and Running as User'
Giving the keyword `private_setup' to a user means he/she can have a private DOSEMU lib under $HOME/.dosemu/lib. If this directory is existing, DOSEMU will expect all normally under DOSEMU_LIB_DIR within that directory. As this would be a security risc, it only will be allowed, if the used DOSEMU binary is non-suid-root. If you realy trust a user you may additionally give the keyword `unrestricted', which will allow this user to execute a suid-root binary even on a private lib directory (though, be aware).
In addition, dosemu.users can be used to define some global settings, which must be known before any other file is accessed, such as:
default_lib_dir= /opt/dosemu # replaces DOSEMU_LIB_DIR log_level= 2 # highest log level
With `default_lib_dir=' you may move DOSEMU_LIB_DIR elsewhere, this mostly is interesting for distributors, who want it elsewhere but won't patch the DOSEMU source just for this purpose. But note, the dosemu supplied scripts and helpers may need some adaption too in order to fit your new directory.
The `log_level=' can be 0 (never log) or 1 (log only errors) or 2 (log all) and controls the ammount written to the systems log facility (notice). This keyword replaces the former /etc/dosemu.loglevel file, which now is obsolete.
Nevertheless, for a first try of DOSEMU you may prefer etc/dosemu.users.easy, which just contains
root c_all all c_all
After /etc/dosemu.users dosemu.conf (via global.conf) is interpreted, and only during global.conf parsing access to all configuration options is allowed. Your personal ~/.dosemurc is included directly after dosemu.conf, but has less access rights (in fact the lowest level), all variables you define within ~/.dosemurc transparently are prefixed with `dosemu_' such that the normal namespace cannot be polluted (and a hacker cannot overwrite security relevant enviroment variables). Within global.conf only those ~/.dosemurc created variables, that are needed are taken over and may overwrite those defined in dosemu.conf.
The dosemu.conf (global.conf) may check for the configuration variables, that are set in /etc/dosemu.users and optionaly include further configuration files. But once dosemu.conf (global.conf) has finished interpretation, the access to secure relevant configurations is (class-wise) restricted while the following interpretation of (old) .dosrc and -I statements.
For more details on security settings/issues look at README-tech.txt, for now (using DOSEMU the first time) you should need only the below description of dosemu.conf (~/.dosemurc)
All settings in dosemu.conf are just variables, that are interpreted in global.conf and have the form of
$_xxx = (n)
$_zzz = "s"
where `n' ist a numerical or boolean value and `s' is a string. Note that the brackets are important, else the parser won't decide for a number expression. For numers you may have complete expressions ( such as (2*1024) ) and strings may be concatenated such as
$_zzz = "This is a string containing '", '"', "' (quotes)"
Hence a comma separated list of strings is concatenated.
DOSEMU will help you finding problems, when you enable its debug messages. These will go into the file, that you defined via the `-o file' or `-O' commandline option (the later prints to stderr). In dosemu.conf you can preset this via
$_debug = "-a"
To enable INT08 type timer interrupts set the below on or off
$_timint = (on)
Wether a numeric processor should be shown to the DOS space
$_mathco = (on)
Which type of CPU should be emulated (NOTE: this is not the one you are running on, but your setting may not exeed the capabilities of the running CPU). Valid values are: 8086
$_cpu = (80386)
To let DOSEMU use the Pentium cycle counter (if availabe) to do better timing use the below
$_rdtsc = (on) # or off
For the above `rdtsc' feature DOSEMU needs to know the exact CPU clock, it normally calibrates it itself, but is you encounter a wrong mesurement you may overide it such as
$_cpuspeed = (166.666) # 0 = let DOSEMU calibrate
NOTE: `$_rdtsc' and `$_cpuspeed' can not be overwritten by ~/.dosemurc.
If you have a PCI board you may allow DOSEMU to access the PCI configuration space by defining the below
$_pci = (on) # or off
Starting with dosemu-1.0 there is a flexible way to handle the mapping strategy used by DOSEMU, which is needed by video emulation, EMS, DPMI and XMS support and other stuff to map a given page of memory to the required virtual DOS address space.
Normally DOSEMU will detect the proper mapping driver for the kernel you are using, however, in some cases you may want to define it explicitely to overcome eventual problems. For this you can specify
Last but not least, if you are using a kernel above 2.3.40, you may use
Note, that in case of `mapfile' and `mapshm' the size of the file or the segment depend on how much memory you configured for XMS, EMS and DPMI (see below) and that you should take care yourself that you have enough diskspace or have the IPC limits high enough. You can control IPC memory limits with
# ipcs -m -l
# echo "66904064" >/proc/sys/kernel/shmmax
Defining the memory layout, which DOS should see:
$_xms = (1024) # in Kbyte $_ems = (1024) # in Kbyte $_ems_frame = (0xe000) $_dpmi = (off) # in Kbyte $_dosmem = (640) # in Kbyte, < 640
There are some features in DOSEMU, that may violate system security and which you should not use on machines, which are `net open'. To have atleast a minimum of protection against intruders, use the folling:
$_secure ="ngd" # secure for: n (normal users), g (guest), d (dexe) # empty string: depending on 'restricted'
NOTE: `$_secure' can not be overwritten by ~/.dosemurc.
For the similar reasons you may `backout' some host, which you don't like to have access to dosemu
$_odd_hosts = "" # black list such as # "lucifer.hell.com billy.the.cat" $_diskless_hosts="" # black list such as "hacker1 newbee gateway1"
NOTE: `$_*_hosts' can not be overwritten by ~/.dosemurc.
If you want mixed operation on the filesystem, from which you boot DOSEMU (native and via DOSEMU), it may be necessary to have two separate sets of config.sys and system.ini. DOSEMU can fake a different file extension, so DOS will get other files when running under DOSEMU. Faking autoexec.bat cannot happen in a reliable fashion, so if you would like to use an autoexec.bat replacement then just use the SHELL command in config.XXX, like this:
SHELL=COMMAND.COM /P /K AUTOEMU.BAT
$_emusys = "" # empty or 3 char., config.sys -> config.XXX $_emuini = "" # empty or 3 char., system.ini -> system.XXX
As you would realize at the first glance: DOS will not have the the CPU for its own. But how much it gets from Linux, depends on the setting of `hogthreshold'. The HogThreshold value determines how nice Dosemu will be about giving other Linux processes a chance to run.
$_hogthreshold = (1) # 0 == all CPU power to DOSEMU # 1 == max power for Linux # >1 the higher, the faster DOSEMU will be
If you have hardware, that is not supported under Linux but you have a DOS driver for, it may be necessary to enable IRQ passing to DOS.
$_irqpassing = "" # list of IRQ number (2-15) to pass to DOS such as # "3 8 10"
Here you tell DOSEMU what to do when DOS wants let play the speaker:
$_speaker = "" # or "native" or "emulated"
And with the below may gain control over real ports on you machine. But:
WARNING: GIVING ACCESS TO PORTS IS BOTH A SECURITY CONCERN AND SOME PORTS ARE DANGEROUS TO USE. PLEASE SKIP THIS SECTION, AND DON'T FIDDLE WITH THIS SECTION UNLESS YOU KNOW WHAT YOU'RE DOING.
$_ports = "" # list of portnumbers such as "0x1ce 0x1cf 0x238" # or "0x1ce range 0x280,0x29f 310" # or "range 0x1a0,(0x1a0+15)"
NOTE: `$_ports' can not be overwritten by ~/.dosemurc.
To select the character set and code page for use with DOSEMU you have
$_term_char_set = "XXX"
With the kbd_unicode plugin (the default), the text is processed using cp437->cp437 for the display, so the font used must be cp437 (eg cp437.f16 on the console). The text is no longer taken without translation. It never really was but it was close enough it apparently was used that way. When reading characters they are assumed to be in iso-8859-1 from the terminal.
If the old keyboard code is used, then the text is taken whithout translation. It is to the user to load a proper DOS font (cp437.f16, cp850.f16 or cp852.f16 on the console).
the text is processed using cp437->iso-8859-1 translation, so the font used must be iso-8859-1 (eg iso01.f16 on console); which is the default for unix in western languages countries.
like latin, but using cp850->iso-8859-1 translation (the difference between cp437 and cp850 is that cp437 uses some chars for drawing boxes while cp850 uses them for accentuated letters)
like latin1 but uses cp852->iso-8859-2 translation, so translates the default DOS charset of eastern european countries to the default unix charset for those countries.
$_external_char_set = "XXX"
"cp437", "cp737", "cp775", "cp850", "cp852", "cp857", "cp860","cp861", "cp862", "cp863", "cp864", "cp865", "cp866", "cp869", "cp874", "iso8859-1", "iso8859-2", "iso8859-3", "iso8859-4", "iso8859-5", "iso8859-6", "iso8859-7", "iso8859-8", "iso8859-9", "iso8859-14", "iso8859-15"
The external character set is used to:
compute the unicode values of characters coming in from the terminal
compute the character set index of unicode characters output to a terminal display screen.
compute the unicode values of characters pasted into dosemu.
$_internal_char_set = "XXX"
"cp437", "cp737", "cp775", "cp850", "cp852", "cp857", "cp860","cp861", "cp862", "cp863", "cp864", "cp865", "cp866", "cp869", "cp874"
The internal character set is used to:
compute the unicode value of characters of video memory
compute the character set index of unicode characters returned by bios keyboard translation services.
This section applies whenever you run DOSEMU remotely or in an xterm. Color terminal support is now built into DOSEMU. Skip this section for now to use terminal defaults, until you get DOSEMU to work.
$_term_color = (on) # terminal with color support $_term_updfreq = (4) # time between refreshs (units: 20 == 1 second) $_escchar = (30) # 30 == Ctrl-^, special-sequence prefix
F1 is 'Ctrl-^1', Alt-F7 is 'Ctrl-^s Ctrl-^7'. For online help, press 'Ctrl-^h' or 'Ctrl-^?'.
When running DOSEMU from console (also remote from console) or X you may need to define a proper keyboard layout. Its possible to let DOSEMU do this work automatically for you (see auto below), however, this may fail and you'll end up defining it explicitely. This is done either by choosing one on the internal keytables or by loading an external keytable from DOSEMU_LIB_DIR/keymap/* (which you may modify according to your needs). Both sets have identical names (though you may add any new one to DOSEMU_LIB_DIR/keymap/*):
be finnish hu-latin2 sg-latin1 de finnish-latin1 it sw de-latin1 fr keyb-no uk dk fr-latin1 no-latin1 us dk-latin1 hr-cp852 po dvorak hr-latin2 sf es hu sf-latin1 es-latin1 hu-cwi sg jp106 cz-qwerty cz-qwertz
$_layout = "name"
$_layout = "load de-latin1"
Note, however, that you have to set
$_X_keycode = (on)
The most comfortable method, however, is to first let DOSEMU set the keyboard layout itself. This involves 2 parts and can be done by setting
$_X_keycode = (auto)
$_layout = "auto"
When being on console you might wish to use raw keyboard, especially together with some games, that don't use the BIOS/DOS to get their keystrokes.
$_rawkeyboard = (1)
NOTE: `$_rawkeyboard' can not be overwritten by ~/.dosemurc.
The `keybint (on)' allows more accurate of keyboard interrupts, It is a bit unstable, but makes keyboard work better when set to "on". Note that with the new default kbd_unicode plugin, $_keybint is obsolete.
$_keybint = (on) # emulate PCish keyboard interrupt
If DOSEMU is running in its own X-window (not xterm), you may need to tailor it to your needs. Here a summary of the settings and a brief description what they mean. A more detailed description of values one can be found at chapter 2.2.14 (X Support settings) of README-tech.txt
$_X_updfreq = (5) # time between refreshs (units: 20 == 1 second) $_X_title = "DOS in a BOX" # Title in the top bar of the window $_X_icon_name = "xdos" # Text for icon, when minimized $_X_keycode = (off) # on == translate keybord via dosemu keytables $_X_blinkrate = (8) # blink rate for the cursor $_X_font = "" # basename from /usr/X11R6/lib/X11/fonts/misc/* # (without extension) e.g. "vga" $_X_mitshm = (on) # Use shared memory extensions $_X_sharecmap = (off) # share the colormap with other applications $_X_fixed_aspect = (on) # Set fixed aspect for resize the graphics window $_X_aspect_43 = (on) # Always use an aspect ratio of 4:3 for graphics $_X_lin_filt = (off) # Use linear filtering for >15 bpp interpol. $_X_bilin_filt = (off) # Use bi-linear filtering for >15 bpp interpol. $_X_mode13fact = (2) # initial factor for video mode 0x13 (320x200) $_X_winsize = "" # "x,y" of initial windows size $_X_gamma = (1.0) # gamma correction $_X_vgaemu_memsize = (1024) # size (in Kbytes) of the frame buffer # for emulated vga $_X_lfb = (on) # use linear frame buffer in VESA modes $_X_pm_interface = (on) # use protected mode interface for VESA modes $_X_mgrab_key = "" # KeySym name to activate mouse grab, empty == off $_X_vesamode = "" # "xres,yres ... xres,yres" # List of vesamodes to add. The list has to contain # SPACE separated "xres,yres" pairs
!!WARNING!!: IF YOU ENABLE GRAPHICS ON AN INCOMPATIBLE ADAPTOR, YOU COULD GET A BLANK SCREEN OR MESSY SCREEN EVEN AFTER EXITING DOSEMU. Read doc/README-tech.txt (Recovering the console after a crash).
Start with only text video using the following setup in dosemu.conf
$_video = "vga" # one of: plainvga, vga, ega, mda, mga, cga $_console = (0) # use 'console' video $_graphics = (0) # use the cards BIOS to set graphics $_videoportaccess = (1) # allow videoportaccess when 'graphics' enabled $_vbios_seg = (0xc000) # set the address of your VBIOS (e.g. 0xe000) $_vbios_size = (0x10000)# set the size of your BIOS (e.g. 0x8000) $_vmemsize = (1024) # size of regen buffer $_chipset = "" $_dualmon = (0) # if you have one vga _plus_ one hgc (2 monitors)
After you get it `somehow' working and you have one of the DOSEMU supported graphic cards you may switch to graphics mode changing the below
$_graphics = (1) # use the cards BIOS to set graphics
If you have a 100% compatible standard VGA card that may work, however, you get better results, if your card has one of the DOSEMU supported video chips and you tell DOSEMU to use it such as
$_chipset = "s3" # one of: plainvga, trident, et4000, diamond, s3, # avance, cirrus, matrox, wdvga, paradise, ati, sis, # svgalib
Note, `s3' is only an example, you must set the correct video chip else it most like will crash your screen.
The 'svgalib' setting uses svgalib 1.4.2 or greater for determining the correct video chip. It should work with all svgalib drivers, except for "vesa" and "ati", which are dangerous with respect to opening IO-ports.
NOTE: `video setting' can not be overwritten by ~/.dosemurc.
The parameter settings via dosemu.conf are tailored to fit the recommended usage of disk and floppy access. There are other methods too, but for these you have to look at README-tech.txt (and you may need to modify global.conf). We strongly recommend that you use the proposed techique. Here the normal setup:
$_vbootfloppy = "" # if you want to boot from a virtual floppy: # file name of the floppy image under DOSEMU_LIB_DIR # e.g. "floppyimage" disables $_hdimage # "floppyimage +hd" does _not_ disable $_hdimage $_floppy_a ="threeinch" # or "fiveinch" or empty, if not existing $_floppy_b = "" # dito for B: $_hdimage = "freedos" # list of hdimages or boot directories # under DOSEMU_LIB_DIR assigned in this order # such as "hdimage_c hdimage_d hdimage_e" $_hdimage_r = $_hdimage # hdimages for 'restricted access (if different)
A hdimage is a file containing a virtual image of a DOS-FAT filesystem. Once you have booted it, you (or autoexec.bat) can use `lredir' to access any directory in your Linux tree as DOS drive (a -t msdos mounted too). Look at chapter 6 (Using Lredir) and for more details on creating your own hdimage look at chapter 4.3 of this README (Making a bootable hdimage for general purpose). Chapter 4.4 also describes how to import/export files from/to a hdimage.
Starting with dosemu-0.99.8, there is a more convenient method available: you just can have a Linux directory containing all what you want to have under your DOS C:. Copy your IO.SYS, MSDOS.SYS or what ever to that directory (e.g. DOSEMU_LIB_DIR/bootdir), put
$_hdimage = "bootdir"
config.sys autoexec.bat command.com -> /dos/command.com io.sys -> /dos/io.sys msdos.sys -> /dos/msdos.sys dos -> /dos/dos bc -> /dos/bc windows -> /dos/windows
As a further enhancement of your drives setup you may even use the following strategie: Given you have the following directory structure under DOSEMU_LIB_DIR
DOSEMU_LIB_DIR/drives/C DOSEMU_LIB_DIR/drives/D DOSEMU_LIB_DIR/drives/E
$_hdimage = "drives/*"
Now, what does the above `vbootfloppy' mean? Instead of booting from a virtual `disk' you may have an image of a virtual `floppy' which you just created such as `dd if=/dev/fd0 of=floppy_image'. If this floppy contains a bootable DOS, then
$_vbootfloppy = "floppy_image"
will boot that floppy. Once running in DOS you can make the floppy available by (virtually) removing the `media' via `bootoff.com'. If want the disk access specified via `$_hdimage' anyway, you may add the keyword `+hd' such as
$_vbootfloppy = "floppy_image +hd"
In some rare cases you may have problems accessing Lredir'ed drives (especially when your DOS application refuses to run on a 'network drive'), though I personally never happened to fall into one of this. For this to overcome you may need to use socalled `partition access'. The odd with this kind of access is, that you never should have those partition mounted in the Linux file system at the same time as you use it in DOSEMU (which is quite uncomfortable and dangerous on a multitasking OS such as Linux ). Though global.conf checks for mounted partitions, there may be races that are not caught. In addition, when your DOSEMU crashes, it may leave some FAT sectors unflushed to the disk, hence destroying the partition. Anyway, if you think you need it, here is how you `assign' real DOS partitions to DOSEMU:
$_hdimage = "hdimage.first /dev/hda1 /dev/sdc4:ro"
The above will have `hdimage.first' as booted drive C:, /dev/hda1 as D: (read/write) and /dev/sdc4 as E: (readonly). You may have any kind of order within `$_hdimage', hence
$_hdimage = "/dev/hda1 hdimage.first /dev/sdc4:ro"
would have /dev/hda1 as booted drive C:. Note that the access to the /dev/* devices must be exclusive (no other process should use it) except for `:ro'.
We have simplified the configuration for mice and serial ports and check for depencies between them. If all strings in the below example are empty, then no mouse and/or COM port is available. Note. that you need no mouse.com driver installed in your DOS environment, DOSEMU has the mousedriver builtin. The below example is such a setup
$_com1 = "" # e.g. "/dev/mouse" or "/dev/cua0" $_com2 = "/dev/modem" # e.g. "/dev/modem" or "/dev/cua1" $_mouse = "microsoft" # one of: microsoft, mousesystems, logitech, # mmseries, mouseman, hitachi, busmouse, ps2 $_mouse_dev = "/dev/mouse" # one of: com1, com2 or /dev/mouse $_mouse_flags = "" # list of none or one or more of: # "emulate3buttons cleardtr" $_mouse_baud = (0) # baudrate, 0 == don't set
The above example lets you have your modem on COM2, COM1 is spare (as you may have your mouse under native DOS there and don't want to change the configuration of your modem software between boots of native DOS and Linux)
However, you may use your favorite DOS mousedriver and directly let it drive COM1 by changing the below variables (rest of variables unchanged)
$_com1 = "/dev/mouse" $_mouse_dev = "com1"
And finaly, when you have a PS2 mouse on your machine you use the builtin mousedriver (not your mouse.com) to get it work: ( again leaving the rest of variables unchanged)
$_mouse = "ps2" $_mouse_dev = "/dev/mouse"
When using a PS2 mouse or when having more then 2 serial ports you may of course assign _any_ free serialdevice to COM1, COM2. The order doesn't matter:
$_com1 = "/dev/cua2" $_com2 = "/dev/cua0"
Printer is emulated by piping printer data to your normal Linux printer. The belows tells DOSEMU which printers to use. The `timeout' tells DOSEMU how long to wait after the last output to LPTx before considering the print job as `done' and to to spool out the data to the printer.
$_printer = "lp" # list of (/etc/printcap) printer names to appear as # LPT1 ... LPT3 (not all are needed, empty for none) $_printer_timeout = (20)# idle time in seconds before spooling out
Turn the following option `on' if you require IPX/SPX emulation, there is no need to load IPX.COM within the DOS session. ( the option does not emulate LSL.COM, IPXODI.COM, etc. ) And NOTE: You must have IPX protocol configured into the kernel.
$_ipxsupport = (on)
Enable Novell 8137->raw 802.3 translation hack in new packet driver.
$_novell_hack = (on)
If you make use of the dosnet device driver, you may turn on 'multi' packet driver support via
$_vnet = (on)
But if you just need 'single' packet driver support that talks to, for instance, your ethernet card eth0 then you need to set
$_netdev = "eth0"
Note that this requires raw packet access, and hence (suid)-root. If $_vnet = (on), the $_netdev will default to "dsn0". For more on this look at chapter 15 (Net code).
The sound driver is more or less likely to be broken at the moment. Anyway, here are the settings you would need to emulate a SB-sound card by passing the control to the Linux soundrivers.
$_sound = (off) # sound support on/off $_sb_base = (0x220) # base IO-address (HEX) $_sb_irq = (5) # IRQ $_sb_dma = (1) # DMA channel $_sb_dsp = "/dev/dsp" # Path the sound device $_sb_mixer = "/dev/mixer" # path to the mixer control $_mpu_base = "0x330" # base address for the MPU-401 chip (HEX) # (not yet implemented)
The builtin ASPI driver (a SCSI interface protocol defined by Adaptec) can be used to run DOS based SCSI drivers that use this standard (most SCSI devices ship with such a DOS driver). This enables you to run hardware on Linux, that normally isn't supported otherwise, such as CD writers, Scanners e.t.c. The driver was successfully tested with Dat-streamers, EXABYTE tapedrives, JAZ drives (from iomega) and CD writers. To make it work under DOSEMU you need
to configure $_aspi in dosemu.conf to define which of the /dev/sgX devices you want to show up in DOSEMU.
to load the DOSEMU aspi.sys stub driver within config.sys (e.g. DEVICE=ASPI.SYS) before any ASPI using driver.
The $_aspi variable in dosemu.conf takes strings listing all generic SCSI devices, that you want give to DOSEMU. NOTE: You should make sure, that they are not used by Linux elsewhere, else you would come into much trouble. To help you not doing the wrong thing, DOSEMU can check the devicetype of the SCSI device such as
$_aspi = "sg2:WORM"
$_aspi = "sg2 sg3 sg4"
$_aspi = "sg1:Direct-Access"
$_aspi = "sg1:0"
$ cat /proc/scsi/scsi
$ scsicheck sg0 scsi0 ch0 ID0 Lun0 ansi2 Direct-Access(0) IBM DCAS-34330 S61A $_aspi = "sg0:Direct-Access:0" (or "0/0/0/0:Direct-Access:0") sg1 scsi0 ch0 ID5 Lun0 ansi2 Direct-Access(0) IOMEGA ZIP 100 D.08 $_aspi = "sg1:Direct-Access:5" (or "0/0/5/0:Direct-Access:5") sg2 scsi0 ch0 ID6 Lun0 ansi2 CD-ROM(5) TOSHIBA CD-ROM XM-5701TA 0167 $_aspi = "sg2:CD-ROM:6" (or "0/0/6/0:CD-ROM:6") <== multiple IDs sg3 scsi1 ch0 ID4 Lun0 ansi2 Sequential-Access(1) HP C1533A 9503 $_aspi = "sg3:Sequential-Access:4" (or "1/0/4/0:Sequential-Access:4") sg4 scsi1 ch0 ID6 Lun0 ansi1 WORM(4) IMS CDD522/10 1.07 $_aspi = "sg4:WORM:6" (or "1/0/6/0:WORM:6") <== multiple IDs
In the above example there are two scsi hostadapters (scsi0 and scsi1) and DOSEMU will not show more than one hostadapter to DOS (mapping them all into one), hence you would get problems accessing sg2 and sg4. For this you may remap a different targetID such as
$_aspi = "sg2:CD-ROM:5 sg4:WORM"
$_aspi = "0/0/6/0:CD-ROM:5 1/0/6/0:WORM"
echo "scsi remove-single-device 0 0 5 0" >/proc/scsi/scsi
echo "scsi add-single-device 0 0 5 0" >/proc/scsi/scsi
Coming so far, one big problem remains: the (hard coded) buffersize for the sg devices in the Linux kernel (default 32k) may be to small for DOS applications and, if your distributor yet didn't it, you may need to recompile your kernel with a bigger buffer. The buffer size is defined in linux/include/scsi/sg.h and to be on the secure side you may define
#define SG_BIG_BUFF (128*1024-512) /* 128 Kb buffer size */