|
||||||||
|
Next
Previous
Contents
2. Runtime Configuration Options
This section of the document by Hans, <lermen@fgan.de>. Last updated on Mar 20, 1998.
Most of DOSEMU configuration is done during runtime and per default it expects the system wide configuration file /etc/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 /etc/dosemu.conf and /.dosemurc (which have identical syntax) are included by the systemwide configuration script /var/lib/dosemu/global.conf, but as a normal user you won't ever think on editing this, only dosemu.conf and your personal /.dosemurc. 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.
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:
This is done via setting configuration variables.
After /etc/dosemu.users /etc/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 /etc/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 /etc/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 an example of a general configuration look at ./etc/global.conf. The later behaves insecure, when /etc/dosemu.users is a copy of ./etc/dosemu.users.easy and behave 'secure', when /etc/dosemu.users is a copy of ./etc/dosemu.users.secure.
2.1 Format of /etc/dosemu.usersEach line corresponds to exactly _one_ valid user count:
where the elements are:
A line with '#' at colum 1 is treated as comment line. When only the login name is given (no further parameters, old format) the following setting is assumed:
Other than with previous DOSEMU versions, the /etc/dosemu.users now is mandatory. Also note, that you may restrict 'root' doing something silly ;-)
2.2 Format of /var/lib/dosemu/global.conf ( (old) .dosrc, -I option)The configuration files are not line oriented, instead are consisting of `statements' (optionally separated by `;'), whitespaces are removed and all behind a '#' up to the end of the line is treated as comment. ( Note that older DOSEMUs also allowed `!' and `;' as comment character, but those are no longer supported ).
Enviroment variables and configuration variablesThey existed already in very early versions of DOSEMU (until now), but now evironment variables are much more useful in dosemu.conf / global.conf as before, because you now can set them, test them in the new 'if' statement and compute them in expressions. The problem with the enviroment variables is, however, that the user may set and fake them before calling DOSEMU, hence this is a security problem. To avoid this, we have the above mentioned configuration variables, which are of complete different name space and are not visible outside of DOSEMU's configuration parser. On the other hand it may be useful to export settings from global.conf to the running DOS environment, which can be achieved by the 'unix.exe -e' DOS programm.
To summarize:
At startup DOSEMU generates the following environment variables, which may be used to let the configuration adapt better:
Conditional statementsYou may control execution of configuration statements via the following conditional statement:
or
where variable is a configuration variable (not an environment variable). Additionally there is a `normal' if statement, a while statement and a foreach statement such as
but these behaves a bit different and are described later.
The 'else' clause may be ommitted and 'ifndef' is the opposite to 'ifdef'. The <variable> can't be tested for its contents, only if it is set or not. Clauses also may contain further if*def..endif clause up to a depth of 15. All stuff in /etc/dosemu.users behind the 'loginname' in fact are configuration variables that are set. Hence, what you set there, can be tested here in the config file. Further more you may set/unset configuration variables in the config files itself:
However, use of define/undef is restricted to scope of global.conf, as long as you don't 'define c_var' _within_ global.conf. If you are under scope of a 'user config file' (e.g. outside global.conf) you have to prefix the configuration variable name with 'u_', else it will not be allowed to be set/unset (hence 'c_' type variables can't be unset out of scope of global.conf).
There are some configuration variables (besides the ones described above for dosemu.users) implicitely predefined by DOSEMU itself:
Also, you may define any 'u_' type variable at start of DOSEMU via the new option -u such as
this will then define the config variable 'u_myspecialfun' _before_ parsing any configuration file. You then may check this in your (old) ./dosrc or global.conf to do the needed special configuration.
Now, what's this with the if statement and while statement? All those conditionals via ifdef and indef are completly handled before the remaining input is passed to the parser. Hence you even may use them within a configuration statement such as
This is not the case with the (above mentioned) if statement, this one is of course processed within the parser itself and can only take place within the proper syntax context such as
but it has the advantage, that you can put any (even complex) expression (see chapter `expressions') between the brackets. If the expression's numerical value is 0, then false is assumed, else true. Same rules apply to the while statement, the loop will be executed as long as `expression' is not 0. The loop end is given by the keyword done such as in
The foreach statement behaves a bit like the /bin/sh `for i in', but you can specify a list of delimiters.
The later example jumps to the colon (`:') in one step and after that
process the numbers step by step.
For all loops and `if' statement the allowed depth is 32 (totally).
Include filesIf you for some reason want to bundle some major settings in a separate file you can include it via
If 'somefile' doesn't have a leading '/', it is assumed to be relative to /etc. Also includeing may be nested up to a max depth of 10 files. Note however, that the privilege is inherited from the main file from which is included, hence all what is included by /var/lib/dosemu/global.conf has its privilege. However, there are restrictions for `while' loops: You can't have include statements within loops without beeing prepared for unexpected behave. In fact you may try, but due to the technique used, include files within loops are loaded completely prior loop execution. Hence, if you do conditional including this won't work. A further restriction is, that the name of the include file must not be a variable. However, you can work around this with a macro (see next chapter) as shows the following example:
Macro substitution
There is a very rudimentary macro substitution available, which does allow recursion but no arguments: Whenever you write
it will expand to
Note, that the `;' is required for parser to recognize the end of the statement and to set the variable before it tries to read the next token (which will let the lexer process `$$MYMACRO'). Macro substitution is completely done on the input stream before the parser gets the data. For what is it worth then? Now, this enables you to insert text into the input stream, that otherwise would be expected to be constant. Or simple, it allows you to be lazy to write the same things more then once.
You see, that in cases the variables are `false', the (parameterless)
`keycode' and/or `lin_filt' keywords would not appear in the `X{}' statement.
ExpressionsExpression within the configuration files follow the usual numerical rules and may be as complex as you wish. At some places, the parser only can `understand' expressions, when you enclose them in brackets, but mostly you just can type
Though, if you want be sure, you better type them as
You may place expressions whenever a numerical value is expected and there is no ambiguity in the syntax. Such an ambiguity is given, when a statement needs more then one successive number such as
If you want to place expression herein, you need the new syntax for those statements / terms which have a coma (instead of a blank) as delimiter:
The old syntax is left for compatibility and is only parsed correcty, if pure numbers (integers) are used. Valid constant numbers (not only in expressions) are
The following operator are recognized:
The type of the expression result may be real (float) or integer, depending on which type is on the `left side'. Conversion is mostly done automaticaly, but you may force it using the (below mentioned) int() and real() functions such as:
The above also shows, how environment variables can be set: if you want to place `expressions' (which are always numbers) onto a variable, you have to surround them with brackets, else the parser won't be able to detect them. In principal, all $xxx settings are string-settings and numbers will be converted correctly before. In fact the `$xxx =' statement accepts a complete coma separated list, which it will concatenate, examples:
Several builtin functions, which can be used in expressions, are available:
String expressionsFor manipulation of strings there are the following builtin functions, which all return a new string. These very well may be placed as argument to a numerical function's string argument, but within an `expression' they may be only used together with the `eq' or `ne' operator.
With these tools you should be able to make your global.conf adapt to any special case, such as different terminal types, different hdimages for different users and/or different host, adapt to different (future) dosemu and/or kernel versions. Here some small examples:
`Dry' testing your configuration
It may be usefull to verify, that your *.conf does what you want before starting a real running DOSEMU. For this purpose there is a new commandline option (-h), which just runs the parser, print some useful output, dumps the main configuration structure and then exits. The option has an argument (0,1,2), which sets the amount of parser debug output: 0 = no parser debug, 1 = print loop debugs, 2 = same as 1 plus if_else_endif-stack debug. This feature can be used such as
The output of `-h2' looks like
There are also some configuration statements, which aren't of any use except for help debugging your *.conf such as
Debug statementThis section is of interest mainly to programmers. This is useful if you are having problems with DOSEMU and you want to enclose debug info when you make bug reports to a member of the DOSEMU development team. Simply set desired flags to "on" or "off", then redirect stderr of DOSEMU to a file using "dos -o debug" to record the debug information if desired. Skip this section if you're only starting to set up.
Alternatively you may use the same format as -D commandline option (but without the -D in front), look at the dos.1 man page.
or simply (to turn off all debugging)
MiscellaneousThe HogThreshold value determines how nice Dosemu will be about giving other Linux processes a chance to run. Setting the HogThreshold value to approximately half of you BogoMips value will slightly degrade Dosemu performance, but significantly increase overall system idle time. A zero value runs Dosemu at full tilt.
Want startup DOSEMU banner messages? Of course :-)
Timint is necessary for many programs to work.
For "mathco", set this to "on" to enable the coprocessor during DOSEMU. This really only has an effect on kernels prior to 1.0.3.
For "cpu", set this to the CPU you want recognized during DOSEMU.
If you have DOSEMU configured to use the 386-emulator, you can enable the emulator via
You may ask why we need to emulate a 386 on an 386 ;-) Well, for normal purpose its not needed (and will be slower anyway), but the emulator offers a better way to debug DOS applications, especially DPMI code. Also, we hope that some day we may be able to run DOSEMU on other machines than 386. At the time of writing this, the cpu emulators is very alpha and you should not use it except you are willing to help us. So please, don't even try to report 'bugs' except you have a patch for the bug too. If you have a pentium, DOSEMU can make use of the pentium cycle counter to do better timing. DOSEMU detects the pentium and will use the RDTSC instruction for get time per default. To disable this feature use
Also, to use the pentium cycle counter correctly DOSEMU needs to know the CPU-clock which your chip is running. This per default is calibrated automatically, however, that may be not exact enough. In this case you have to set it yourself via
or, for values like 166.6666 you may give two numbers such as
which will be calculated as 'cpuspeed=500/3'
If you have a PCI board you may allow DOSEMU to access the PCI configuration space by defining the below
PCI is assumed to be present on CPUs better then a pentium, otherwise the default is 'pci off'
For "bootA"/"bootC", set this to the bootup drive you want to use. It is strongly recommended you start with "bootA" to get DOSEMU going, and during configuration of DOSEMU to recognize hard disks.
During compile there will be a symbol map generated, this usually then is ./bin/dosemu.map. You may wnt to save it to an other places and let 'dosdebug' know where to find it:
Normally all debug logging is done _imediately_ (unbuffered). However, when dumping big amounts of logdata, the dynamic behave of DOSEMU may change, hence hiding the real problem (or causing a new one) Using the below switches buffering on and sets the buffer size.
In addition, you may want to limit the file size of the log file, especially when you expect huge amounts of data (such as with -D+e). This can be done via
which (in this case) will limit the size to 2Mbytes. The default setting is a file size of 10Mbytes. When you want to abort DOSEMU from within a configuration file (because you detected something weird) then do
or
When you want just to warn the user use the following (the message will get printed to the log file via the debug-flag '+c')
When you want to use the CDrom driver and the Linux device is other then /dev/cdrom you may define
Keyboard settingsFor defining the keyboard layouts you are using there is the "keyboard" statement such as
The later modifies the US keyboard layout such that it will allow you to type a character 230 (micro) with right ALT-M. The same can be done via a "keytable" statement such as
The "keyb-user" is preset with an US layout and is intended to be used as "buffer" for user defined keyboard tables. The format of the "{}" modification list (either in the "keyboard" or the "keytable" statement) is as follows:
Given we call the above a "definition" then it may be repeated (blank separated) such as
"key_number" is the physical number, that the keybord send to the machine when you hit the key, its the index into the keytable. "value" may be any integer between 0...255, a string, or one of the following keywords for "dead keys" (NOTE: deadkeys have a value below 32, so be carefull).
After a "key_number =" there may be any number of comma separated values, which will go into the table starting with "key_number", hence all below examples are equivalent
"submap" tells in about something about the shift state for which the definition is to use or wether we mean the numpad:
You may even replace the whole table with a comma/blank separated list of values. In order to make it easy for you, you may use dosemu to create such a list. The following statement will dump all current key tables out into a file "kbdtables", which is directly suitable for inclusion into global.conf (hence it follows the syntax):
However, don't put this not into your global.conf, because dosemu will exit after generating the tablefile. Instead use the -I commandline option such as
After installation of dosemu ("make install") you'll find the current dosemu keytables in /var/lib/dosemu/keymap (and in ./etc/keymap, where they are copied from). These tables are generated via "keytable dump" and split into discrete files, such that you may modify them to fit your needs. You may load them such as
(when an include file is starting with "keymap/" it is taken out of /var/lib/dosemu). When there was a keytable previously defined (e.g. in global.conf), they new one will be take anyway and a warning will be printed on stderr.
Anyway, you are not forced to modify or load a keytable, and with the "layout" keyword from the "keyboard" statement, you can specify your country's keyboard layout. The following builtin layouts are implemented:
The keyb-user is selected by default if the "layout" keyword is omitted, and this in fact is identical to us-layout, as long as it got not overloaded by the "keytable" statement (see above). The keyword "keybint" allows more accurate of keyboard interrupts, It is a bit unstable, but makes keyboard work better when set to "on". The keyword "rawkeyboard" allows for accurate keyboard emulation for DOS programs, and is only activated when DOSEMU starts up at the console. It only becomes a problem when DOSEMU prematurely exits with a "Segmentation Fault" fatal error, because the keyboard would have not been reset properly. In that case, you would have to run kbd_mode -a remotely, or use the RESET button. In reality, this should never happen. But if it does, please do report to the dosemu development team, of the problem and detailed circumstances, we're trying our best! If you don't need near complete keyboard emulation (needed by major software package), set it to "off" recommended:
or
If you want DOSEMU feed with keystrokes, that are typed in automagically, then you may define them such as
You may have any number of 'keystroke' statements, they all will be concatenated. This feature however doesn't make much sense _here_ in the configuration file, instead together with the commandine option -I you can start dosemu and execute any arbitrary dos command such as
For more details please look at ./doc/README.batch Ah, but _one_ sensible useage _here_ is to 'pre-strike' that damned F8 that is needed for DOS-7.0, when you don't want to edit the msdos.sys:
Serial stuffYou can specify up to 4 simultaneous serial ports here. If more than one ports have the same IRQ, only one of those ports can be used at the same time. Also, you can specify the com port, base address, irq, and device path! The defaults are:
If the "com" keyword is omitted, the next unused COM port is assigned. Also, remember, these are only how you want the ports to be emulated in DOSEMU. That means what is COM3 on IRQ 5 in real DOS, can become COM1 on IRQ 4 in DOSEMU! NOTE: You must have /usr/spool/uucp for LCK-file generation ! You may change this path and the lockfile name via the below 'ttylocks' statement. Also, as an example of defaults, these two lines are functionally equal:
If you want to use a serial mouse with DOSEMU, the "mouse" keyword should be specified in only one of the serial lines. (For PS/2 mice, it is not necessary, and device path is in mouse line instead) Use/modify any of the following if you want to support a modem: (or any other serial device.)
If you are going to load a msdos mouse driver for mouse support use/modify one of the following
What type is your mouse? Use one of the following. Use the 'internaldriver' option to try Dosemu internaldriver. Use the 'emulate3buttons' for 3button mice.
For tty locking capabilities: The serial lines are locked by dosemu via usual lock file technique, which is compatible with most other unix apps (such as mgetty, dip, e.t.c). However, you carefully need to check _where_ those other apps expect the lock files. The most common used (old) place is /usr/spool/uucp, but newer distributions following the FSSTND will have it in /var/lock. The dosemu default one is /usr/spool/uucp. The below defines /var/lock
Note: you are responsible for ensuring that the directory exists ! If you want to define the lock prefix stub also, use this one
If the lockfile should contain the PID in binary form (instead of ASCII}, you may use the following
Networking SupportTurn the following option 'on' if you require IPX/SPX emulation. Therefore, there is no need to load IPX.COM within the DOS session. The following option does not emulate LSL.COM, IPXODI.COM, etc. NOTE: YOU MUST HAVE IPX PROTOCOL ENABLED IN KERNEL !!
Enable Novell 8137->raw 802.3 translation hack in new packet driver.
TerminalsThis 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. There are a number of keywords for the terminal { } configuration line.
Use the following to enable the IBM character set.
Use this for color xterms or rxvt's with no IBM font, with only 8 colors.
Use this for color xterms or rxvt's with IBM font, with only 8 colors.
More detailed line for user configuration:
X Support settings
If DOSEMU is running in its own X-window (not xterm), you may need to tailor it to your needs. Valid keywords for the X { } config line:
Recommended X statement:
Video settings ( console only )
!!WARNING!!: A LOT OF THIS VIDEO CODE IS ALPHA! IF YOU ENABLE GRAPHICS ON AN INCOMPATIBLE ADAPTOR, YOU COULD GET A BLANK SCREEN OR MESSY SCREEN EVEN AFTER EXITING DOSEMU. JUST REBOOT (BLINDLY) AND THEN MODIFY CONFIG. Start with only text video using the following line, to get started. then when DOSEMU is running, you can set up a better video configuration.
Notes for Graphics:
It may be necessary to set this to "on" if DOSEMU can't boot up properly on your system when it's set "off" and when graphics are enabled. Note: May interfere with serial ports when using certain video boards.
Any 100% compatible standard VGA card MAY work with this:
If your VGA-BIOS is at segment E000, this may work for you:
Trident SVGA with 1 megabyte on board
Diamond SVGA (not S3 chip)
Cirrus SVGA
ET4000 SVGA card with 1 megabyte on board:
or
S3-based SVGA video card with 1 megabyte on board:
Avance Logic (ALI) 230x SVGA
For ATI graphic mode
Matrox millenium:
VGA-cards with a WD(Paradise) chip:
Memory settings
These are memory parameters, stated in number of kilobytes. If you get lots of disk swapping while DOSEMU runs, you should reduce these values. umb_max is a new parameter which tells DOSEMU to be more aggressive about finding upper memory blocks. The default is 'off'.
To be more aggressive about finding XMS UMB blocks use this:
To be more secure use 'secure on'. If "on", then it disables DPMI access to dosemu code and also disables execution of dosemu supplied 'system' commands, which may execute arbitrary Linux-commands otherwise. The background is, that DPMI clients are allowed to create selectors that span the whole user space, hence may hack into the dosemu code, and (when dosemu runs root or is suid root) can be a security hole. "secure on" closes this hole, though this would very likely also disable some dos4gw games :(. Therfore NOTE: You may not be able to run some DPMI programs, hence, before reporting such a program as 'not running', first try to set 'secure off'.
The below enables/disables DPMI and sets the size of DPMI memory.
The best solution (security wise), however, is to run dosemu non-suid root under X (which is possible since dosemu-0.97.10). Under X most of the things we would need to run under root privilidges aren't needed, as the X server supports them. And giving DPMI access to non-suid root dosemu is not at all critical. You may forbid some users to use an eventually available suid root binary by setting `nosuidroot' in /etc/dosemu.users. XMS is enabled by the following statement
For ems, you now can set the frame to any 16K between 0xc800..0xe000
or
or
If you have adapters, which have memory mapped IO, you may map those regions
with
With the below you define the maximum conventional RAM to show apps:
IRQ passing
The irqpassing statement accepts IRQ values between 3..15, if using the { .. } syntax each value or range can be prefixed by the keyword use_sigio to monitor the IRQ via SIGIO. If this is missing the IRQ is monitored by SIGALRM. Use/modify one of the below statements
Port Access
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.
These keywords are allowable on a "ports" line.
Speaker
These keywords are allowable on the "speaker" line:
Recommended:
Hard disks
WARNING: DAMAGE MIGHT RESULT TO YOUR HARD DISK (LINUX AND/OR DOS) IF YOU FIDDLE WITH THIS SECTION WITHOUT KNOWING WHAT YOU'RE DOING!
The best way to get started is to start with a hdimage, and set " As a last resort, if you want DOSEMU to be able to access a DOS partition, the safer type of access is "partition" access, because "wholedisk" access gives DOSEMU write access to a whole physical disk, including any vulnerable Linux partitions on that drive! IMPORTANT You must not have LILO installed on the partition for dosemu to boot off. As of 04/26/94, doublespace and stacker 3.1 will work with wholedisk or partition only access. Stacker 4.0 has been reported to work with wholedisk access. Please read the documentation in the "doc" subdirectory for info on how to set up access to real hard disk. These are meanings of the keywords:
Use/modify one (or more) of the folling statements:
Recommended:
DOSEMU boot
Use the following option to boot from the specified file, and then once booted, have bootoff execute in autoexec.bat. Thanks Ted :-). Notice it follows a typical floppy spec. To create this file use:
Specify extensions for the CONFIG and AUTOEXEC files. If the below are uncommented, the extensions become CONFIG.EMU and AUTOEXEC.EMU. NOTE: this feature may affect file naming even after boot time. If you use MSDOS 6+, you may want to use a CONFIG.SYS menu instead.
Floppy disks
This part is fairly easy. Make sure that the first (/dev/fd0) and second (/dev/fd1) floppy drives are of the correct size, "threeinch" and/or "fiveinch". A floppy disk image can be used instead, however. FOR SAFETY, UNMOUNT ALL FLOPPY DRIVES FROM YOUR FILESYSTEM BEFORE STARTING UP DOSEMU! DAMAGE TO THE FLOPPY MAY RESULT OTHERWISE! Use/modify one of the below:
If floppy disk speed is very important, uncomment the following line. However, this makes the floppy drive a bit unstable. This is best used if the floppies are write-protected. Use an integer value to set the time between floppy updates.
Printers
Printer is emulated by piping printer data to a file or via a unix command such as "lpr". Don't bother fiddling with this configuration until you've got DOSEMU up and running already. NOTE: Printers are assigned to LPT1:, LPT2:, and LPT3: on a one for one basis with each line below. The first printer line is assigned to LPT1:, second to LPT2:, and third to LPT3:. If you do not specify a base port, the emulator will setup the bios to report 0x378, 0x278, and 0x3bc for LPT1:, LPT2:, and LPT3: respectively. To use standard unix lpr command for printing use this line:
And for any special options like using pr to format files, add it to the options parameter:
To just have your printer output end up in a file, use the following line:
If you have a DOS application that is looking to access the printer port directly, and uses the bios LPT: setting to find out the port to use, you can modify the base port the bios will report with the following:
Be sure to also add a port line to allow the application access to the port:
NOTE: applications that require this will not interfere with applications that continue to use the standard bios calls. These applications will continue to send the output piped to the file or unix command.
Sound
The sound driver is more or less likely to be broken at the moment.
Use this to disable sound support even if it is configured in
Linux defaults
NetBSD defaults
DEXE support
These are the setting for DEXE type DOS application, which are executed by DOSEMU via the -L option. ( for what DEXE is look at ./doc/README.dexe set the below to force 'secure on', when -L option is used _and_ the user isn't root.
set the below, if you want that a dexe may be allowed to have additional disks. Normally the hdimage containing the DOS app (the .dexe itself) is the only available disk, all other 'disk {}' statement are ignored.
set the below, if you want a DEXE to be forced to 'xdos', when X available. This mainly is intended for beeing included into the configuration of a DEXE file (see mkdexe). e.g. when the application needs graphic it should not run on slang-terminal.
set the below, if you want a DEXE _only_ running on X (because it otherwise would not run)
Next Previous Contents |
|||||||
The DOSEMU team |