Troubleshooting and FAQ
The machine is slow, or a game is slow
Most games run at full speed, also in the top GSW-586 mode. Before you report a defect, separate the two causes below.
The Izarra3000 is a 166 MHz Pentium-class machine. Software that needed more than that in the period also needs more than that here. 3D at a high resolution and a high frame rate is more than the machine can do. A late game that recommended a Pentium II or a faster CPU is also more than the machine can do.
A game can also run badly on hardware that is sufficient for it. The cause is then usually the timing, and not the speed, because software for a slower machine can operate incorrectly on a faster machine. Do these steps:
- Select a slower CPU mode. Run
GSWMODE 486orGSWMODE 386at the DOS prompt. See the command reference. Software for a real 486-class machine can have more constant timing at these speeds than at586. You can also set the boot-time default from the Tab boot menu or the Del setup panel. - Find the limit. The CPU can limit the game, or the game can wait for the emulated hardware. See the VGA core and VEGA technical reference, section 9. They give the parts of the video timing model that are cycle-exact, and the parts that are not.
An old program stops or operates incorrectly while it waits for a key
A program can ask for a keystroke when no keystroke is available. The IzarraVM BIOS then halts the CPU, and does not use a loop. Almost no program detects this, because a keypress starts the CPU immediately. But two types of program can detect it. The first type masks the timer interrupt and the keyboard interrupt before the wait. The second type expects the time to increase smoothly during the wait.
Run UNHALT before the program to make the BIOS use a loop again. See the
command reference. Run UNHALT /H to set the
default again. The idle halt of Toka-DOS is a different function.
IDLEHALT=0 in CONFIG.SYS stops that one.
A game does not detect the sound card
Compare the device that the game looks for with the ReSonique II manual:
- Digital audio / Sound Blaster: the game must find the card from the
BLASTERenvironment variable that Toka-DOS sets inAUTOEXEC.BAT. If a game needs manual values, use base220, IRQ7, 8-bit DMA1, and 16-bit DMA5. RunSNDCTRL /Sat the prompt to see the current values of the card. - FM music: select the AdLib or OPL2/OPL3 option at port
388, if the game gives a choice. IzarraVM emulates this hardware fully. - The sound is too loud or too quiet, or the music is louder than the
effects: run
SNDMIXER. It has a fader for each source: music, digital audio, CD, MIDI, and PC speaker. It keeps the levels between sessions. If the sound stays quiet with MASTER at 10, theAMPfader adds output gain in steps of 6 dB. That gain uses the headroom, thus a loud game can then distort. - General MIDI / wavetable: select MPU-401 output at port
300. Toka-DOS gives this port asP300inBLASTER. This port is a daughterboard on the internal pin headers of the ReSonique II, and IzarraVM emulates it with FluidSynth. - External MIDI / MT-32: select MPU-401 output at port
330. This is the rear MPU-401/gameport of the Izarra3000. In Settings, select Munt, or select the exact host destination on the MIDI IN side of the receiver. See the ReSonique II manual, and the recipes for your own MIDI player and for MT-32 ROMs.
The game finds the card, but it plays a short click and then silence
This is the behavior of a game with a fixed IRQ in its code, which does not
read BLASTER. Its interrupt handler is on a line that the card does not use.
Thus nothing sets the DSP again after the first DMA block.
The card uses IRQ 7, because almost all such games expect IRQ 7. But some of them need IRQ 5. Change the value and try again:
SNDCTRL /SBIRQ:5
The change has an effect immediately, and the machine keeps it after a restart. See How to change the card resources for the full-screen version and the other resources.
Which ROM files does Munt need?
Select one control ROM and the PCM ROM from the same row:
| Module | Control ROM | PCM ROM |
|---|---|---|
| MT-32, old generation | ctrl_mt32_1_04.rom, ctrl_mt32_1_05.rom, ctrl_mt32_1_06.rom, or ctrl_mt32_1_07.rom |
pcm_mt32.rom |
| MT-32, new generation | ctrl_mt32_2_04.rom, ctrl_mt32_2_06.rom, or ctrl_mt32_2_07.rom |
pcm_mt32.rom |
| CM-32L | ctrl_cm32l_1_00.rom or ctrl_cm32l_1_02.rom |
pcm_cm32l.rom |
| CM-32LN | ctrl_cm32ln_1_00.rom |
pcm_cm32l.rom |
The Settings window accepts any control path and any PCM path. Thus you can select the archive file names directly.
For automatic discovery, copy an MT-32 pair and give the copies the names
~/.izarravm/MT32_CONTROL.ROM and ~/.izarravm/MT32_PCM.ROM. For a CM-32L or
a CM-32LN pair, use the names ~/.izarravm/CM32L_CONTROL.ROM and
~/.izarravm/CM32L_PCM.ROM. The discovery ignores the letter case of ASCII
characters. --portable disables the discovery, but a path in the Settings
window continues to operate. The names in the table are the names in the
mt32pi directory of the
Roland MT-32 ROMs archive.
A 3D game does not detect Distira
Distira supports both DOS Glide link models. A static build holds Glide in the
executable and needs no OVL file. The original Voodoo Graphics executable of
Tomb Raider is verified in this way. Many dynamic builds include a compatible
GLIDE2X.OVL beside the game, and that local copy has priority.
First, make sure that you run the Voodoo Graphics build of the game. For a
dynamic build with no OVL file, put a compatible Voodoo Graphics file at
~/.izarravm/GLIDE2X.OVL. The file-name check ignores the letter case of
ASCII characters. IzarraVM makes the file available through C:\DOS, after
the current directory of the game in the normal DOS search order. If neither
copy exists, IzarraVM supplies no replacement OVL and no diagnostic OVL. A
3DBVoodoo2 driver-disc image
is in an archive, for reference.
IzarraVM does not download ROMs, Glide drivers, or game data, and it does not distribute them. The metadata of an archive item is not a license. Use these files only if you have the legal right to use them. See VEGA technical reference, section 10 for the contract of the emulated hardware.
Where does IzarraVM keep the files?
By default, IzarraVM writes all of its files in ~/.izarravm. These files are
the contents of the C: drive, cmos.bin, and izarravm.conf. It does not
write them beside the executable or in the current directory. Use
--portable at the start to keep them beside the executable. See the
IzarraVM GUI guide for the full
list.
The settings (keyboard layout, CPU mode) were not saved
Only Save and Exit in the Del setup panel writes the keyboard layout and the CPU mode to CMOS. Discard and Exit discards the changes, and Esc on the main setup menu does the same. The Accept row of the Tab boot menu saves the CPU mode and the primary boot device, independently of the panel. If you used only the Tab menu, the keyboard layout did not change, because only the Del panel edits the layout.
Toka-DOS does not boot, or COMMAND.COM is absent
Use Repair Toka-DOS in the
Del setup panel. It installs
the Toka-DOS system files again, from the copy in the ROM. First it changes
the names of your CONFIG.SYS and AUTOEXEC.BAT to .OLD files, and thus it
does not write over them. It does not change the other files on your C: drive.
You can also start the machine with neither startup file. Hold F5 while this message is on the screen, for approximately two seconds:
Press F8 to trace or F5 to skip CONFIG.SYS/AUTOEXEC.BAT
This is the fastest method when a line that you added to CONFIG.SYS stops
the boot. F8 processes CONFIG.SYS one line at a time, and asks about
each line.
F5 also skips AUTOEXEC.BAT, thus PATH is not set. Give the full path of a
DOS tool: C:\DOS\EDIT.COM CONFIG.SYS, and not EDIT CONFIG.SYS.
Where is the Distira 3D programmer's guide?
It does not exist yet. The VEGA programmer's guide covers Margo (2D) only, and its first section says so. The Distira section of the technical reference is the authority on the answers of the 3D hardware.
How to trace the INT n calls of a guest (development builds)
This is a developer diagnostic. Most players do not need it. The default build
does not include it, as it does not include the IZARRAVM_WATCH_WRITE store
watchpoint. Thus a normal cargo build and a release binary have no cost from
it. Build with the int-trace feature. Then set IZARRAVM_INT_TRACE to the
vectors that you want, in hexadecimal, separated by commas:
cargo build --release -j8 -p izarravm --features int-trace
IZARRAVM_INT_TRACE=67,21 ./target/release/izarravm --hdd-folder <path> --cpu gsw586 2>trace.log
Each traced INT n prints its arguments immediately. The arguments are the
register file at the moment of the call. When execution returns to the
instruction after the INT, the trace prints a -> line with the answer
of the handler. Read both halves. The arguments show only that a program
called a driver. They do not show a correct answer.
This method found the TOKAEMM shared-pool defect. The arguments into INT 67h
were correct. But the answer of the handler had AH=88h, and a reference EMM
manager returns success.
Read these two notes before you read a log. First, the trace goes to stderr,
and it can write thousands of lines each second on a busy vector. Send it to a
file, as above, and do not watch it on a console. Second, the address after
ret= is the return address. It is the instruction after the INT, and not
the INT itself. The answer half of the trace uses that address. To find the
call in a disassembly, subtract the length of the instruction.
The trace holds one call at a time. If a handler makes its own traced INT,
that call takes the slot, and the -> line of the first call does not
appear. For example, INT 21h calls INT 13h when it opens a file, and the
example above traces vectors that nest in this way. Thus a traced INT with
no answer below it means one of two things: the call nested, or the handler
did not return. It does not mean that the handler gave an empty answer.