VOGONS


Rust-DOS, a new DOS emulator

Topic actions

Reply 140 of 146, by Dividebysandwich

User metadata
Rank Newbie
Rank
Newbie

Rust-DOS v1.7.4 is available -> https://github.com/dividebysandwich/rust-dos/ … ases/tag/v1.7.4

VFX1 emulation

09cb54.png

(Inspired by https://github.com/LeonG-ZA/forte-vfx1-vr)

Enable VFX1 in settings and a headset will appear on the table. You can put it on and take it off at any time - just grab it and put it over your head to wear, and grab it from your head and put it away to remove. Running any VFX1 enabled game will render as stereoscopic 3D inside your VR headset while you are wearing the virtual VFX-1, and will render as left/right eye image on the VR monitor if you remove the VFX-1 from your head.

This is not really something that can be shown with a screenshot - you'll have to try this out yourself.

NOTE: Resolution and FOV are limited to the original as supported by the respective games. This feature only works in VR headsets, it wouldn't make much sense on a 2D screen.

Usable VR keyboard

66oyuk.png

If you just want to try something out quickly without a connected bluetooth keyboard, there's now a VR keyboard that can be used and grabbed with the VR controllers.

NOTE: The bedroom scene has been updated, please go to the scene list and download the update right inside Rust-DOS.

Improved Vérité and PowerVR support

7xzdtk.png

Several texture and rendering issues are fixed and games should work better across the board.

New logo

k68yac.png

By @Dominusprog, thanks!!

## Other fixes and changes:

* Read CD sectors whose EDC fails as errors, so copy protections that check them pass by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/116
* Round FBSTP as the control word says and store the BCD indefinite for what doesn't fit by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/117
* Say when a state's drive image has moved, not that the state is of another machine by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/118
* Document how Windows OpenGL games reach the Voodoo2 by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/119
* Translate MMX and SSE instructions on x86-64 by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/120
* Draw 3dfx OpenGL's raster states with variants that fix only the combines by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/121
* Translate SAHF and FILD of a qword by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/122
* Start blocks in a page's last 15 bytes on x86-64 by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/123
* Run SSE arithmetic without loading MXCSR where the guest's matches by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/126
* Read IDE disk blocks at once in REP INSW and INSD by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/127

Full Changelog: https://github.com/dividebysandwich/rust-dos/ … v1.7.3...v1.7.4

Reply 141 of 146, by dominusprog

User metadata
Rank Oldbie
Rank
Oldbie

Glad you liked it.

SVG+PNG

The attachment Rust DOS.zip is no longer available

Duke_2600.png
A-Trend ATC-1020 V1.1 ❇ Cyrix 6x86 150+ @ 120MHz ❇ 32MiB EDO RAM (8MiBx4) ❇ A-Trend S3 Trio64V2 2MiB
OPTi MAD16 / Creative Vibra16XV ❇ 8.4GiB Quantum Fireball ❇ Win95 OSR2 Plus!

Reply 142 of 146, by hail-to-the-ryzen

User metadata
Rank Member
Rank
Member

An error is reported in-game by this dos port: DevilutionX DOS port (still being worked on). It shows a dialog box without a crash, but describes an error: "Lua error when loading lua\inspect.lua: table index is NaN". I press the Ok button in the dialog box and the application exits. I tested with both interpreter and dynamic cores. However, the game runs without an error in a version of dosbox-x. The port depends on SDL3 and a modification for multithreading.

I parsed the logs of Rust-DOS for these lines of interest:

Log

Error=03
[CPU] #PF(0006) at 00A7:00347A87 CR2=00AEEA8E
[CPU] #PF(0006) at 00A7:003441C5 CR2=00B00974
[CPU] #PF(0006) at 00A7:00347A87 CR2=00B0621E (later ones here not logged)
[CPU] #PF(0006) at 00A7:00347FD4 CR2=00B01BCC
[CPU] #PF(0006) at 00A7:00345B29 CR2=00B0A870 (later ones here not logged)
[CPU] #PF(0006) at 00A7:00348344 CR2=00B0DEDC
[CPU] #PF(0006) at 00A7:0034837C CR2=00B0C6AC (later ones here not logged)
[CPU] #PF(0006) at 00A7:00348344 CR2=00B0E2E4 (later ones here not logged)
[CPU] #PF(0006) at 00A7:003483F5 CR2=00B0B284
[CPU] #PF(0006) at 00A7:00347B4C CR2=00B10000 (later ones here not logged)
[CPU] #PF(0006) at 00A7:003441C5 CR2=00B055D4
[CPU] #PF(0006) at 00A7:00347A3E CR2=00B15000 (later ones here not logged)
[CPU] #NM at 00A7:004512D7
[CPU] #NM at 00A7:004512D7
[CPU] #NM at 00A7:0023D5A2
[CPU] #NM at 00A7:004512D7 (later ones here not logged)
[CPU] #NM at 00A7:0023D5A2
[CPU] #NM at 00A7:0023D5A2 (later ones here not logged)

Reply 143 of 146, by Dividebysandwich

User metadata
Rank Newbie
Rank
Newbie
hail-to-the-ryzen wrote on 2026-10-17, 16:32:

An error is reported in-game by this dos port: DevilutionX DOS port (still being worked on). It shows a dialog box without a crash, but describes an error: "Lua error when loading lua\inspect.lua: table index is NaN".

You actually stumbled over some of my original (hand-written) FPU code from last year. In my defense, I was writing these instructions off of the book and the FCOM and FCOMP aliases are undocumented. Looking into how dosbox-staging helped. Yet another reminder how just how much knowledge is in dosbox that isn't documented anywhere else.

Reply 144 of 146, by hail-to-the-ryzen

User metadata
Rank Member
Rank
Member

Your work is appreciated on both fronts! The logging in both software is insightful and simple to parse, along with the powerful debugger and extensive unit tests that are engineered into your emulator. For testing the error, I rebuilt the binary from source, including cross-compiler (v14.2.0), sdl library, related dependencies, and the code for the port itself which is definitely robust. That procedure is reasonably documented but the various versions of each piece together make reproducibility more of an ideal than practice. However, this helped to confirm this above corner case and its sensitivity to number precision. Your unit tests will certainly self-document these above cases and are as invaluable as the formalized commits. As an aside, there is also another interesting base of code here: https://github.com/cyanbun96/qrustyquake. This may be adaptable to a similar pipeline as this above vesa-based port, but it may require a good bit of work on memory and performance constraints. Maybe it is simpler to backport its increased compatibility commits to an existing dos-based port, if only to see the influence of extending the software renderer on the frame rate.

Reply 145 of 146, by Dividebysandwich

User metadata
Rank Newbie
Rank
Newbie

Rust-DOS v1.7.5 has been released -> https://github.com/dividebysandwich/rust-dos/ … ases/tag/v1.7.5

3dfx Voodoo3 and Banshee

0e2bww.png

Finally, Voodoo 3 emulation! Simply set `machine=svga_voodoo3` or `machine=svga_banshee` . With 3dfx's Voodoo3 driver on Windows 98 SE you get the accelerated desktop, Glide, Direct3D and OpenGL through the ICD. Windows will correctly discover a Plug and Play monitor thanks to an emulated EDID, and the vertical retrace interrupt is there too. Thanks to @kibertoad for this one!

Note: Direct3D on the Voodoo3 needs DirectX 7 or later, as mentioned in the driver's readme. Windows 98 SE comes with 6.1, so install `dx70eng.exe` first. Games that ship 3dfx's MiniGL as `opengl32.dll` in their own folder need that file removed to use the ICD.

ATI 3D RAGE and 3D RAGE II

jj58ph.png

6wodsp.png

`machine=svga_ati_3drage` and `machine=svga_ati_3drage2` give you ATI's mach64 GT and GT-B, with the 2D draw engine, 3D triangles, the scaler and the video overlay. Windows 98's own driver runs the desktop, DirectDraw and Direct3D, and Wipeout for 3D Rage (the game ATI bundled with the card) runs through ATI3DCIF.

PowerVR PCX1

Next to the PCX2, there's now `powervr=pcx1` for the first PowerVR chip (VideoLogic Apocalypse 3D), so games with a PCX1-only version, like Tomb Raider's TOMBPCX1.EXE, now work too.

Vérité RISC emulation

eq08jw.png

Rust-DOS now emulates the Rendition Vérité's RISC processor, and this is the new default (`verite_risc=lle`). Instead of recreating the microcode's commands, rust-dos now runs the card's actual microcode, so games that bring their own, such as CGL titles like Battle Arena Toshinden, Rebel Moon, Flight Unlimited and Hi-Octane, now work alongside Tomb Raider and vQuake. Windows 95 also runs with both Rendition drivers. `verite_risc=hle` is still available in case you need the HLE-only emulation.

Rat Commander

8jpnex.png

Have a fresh installation of Rust-DOS but no Norton Commander at hand?

Type `RC` at the prompt for Rat Commander, a classic 2-panel file manager with the most importanat features built-in: marking, copy, move, rename, delete, view, edit, menus and mouse support. It can even work with `.ZIP` archives.

More accurate FPU

A series of fixes makes the FPU behave more like the real chip in edge cases: infinities, NaNs and overflow in FADD/FSUB, FPREM/FPREM1 quotient bits, FYL2X of 0 and negative values, FSCALE, FXTRACT, FCHS, out-of-range trig, and several register mixups in FCOM/FUCOM/FXCH. The recompiler now also translates CMOVcc, FSQRT and FIDIV/FIDIVR, and instructions that cross into the next page.

Windows 95/98 system image guide

There's a new guide, [docs/win9x-howto.md](https://github.com/dividebysandwich/rust-dos/ … /win9x-howto.md), that walks you through making a Windows 95 or 98 hard disk image and using it with game packages: as a desktop of its own, with games that run from a folder, and with games that have to be installed.

Other fixes and changes:

* Count IDE data port transfers as disk I/O for cycles=auto by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/128
* cycles=auto: give a program that keeps Windows busy all the host has by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/130
* Emulate the 3dfx Voodoo3 and Banshee, with 3D, EDID and the retrace interrupt by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/131
* Translate CMOVcc, FSQRT and FIDIV/FIDIVR by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/134
* Translate instructions that run on into the next page by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/135
* DOSBox configuration imports: rust-dos's own settings in the file now win over the imported ones, DOSBox's S3 is kept and `[rust-dos] machine=` is honored, the prompt says when a game has ended and its drives are back, and the libretro save folder is no longer nested (#129)
* The Windows 95 shutdown message now shows correctly when Windows leaves the screen in a graphics mode
* A windowed DOS box on the Voodoo3/Banshee desktop no longer switches the desktop off
* PCI cards can now share IRQ lines
* FindFirst only returns `.` and `..` when the search asks for directories

Reply 146 of 146, by hail-to-the-ryzen

User metadata
Rank Member
Rank
Member

Thank you. I ported qrustyquake to DOS via SDL3. It depends on several minor code edits, such as in the video output so the pixel format is correct. It works in a variant of dosbox-x, including the Arcane Dimensions mod (latest version). However, the performance is slow where the advanced feature set is active, while vanilla Quake runs better. It also runs in rust-dos v1.75, but not with the simpler AD mod maps. I believe the heap allocation is not sufficient. There are a few causes for this, including restrictions for accuracy in emulation, but I included an abbreviated log if it is of interest in the future (rust-dos is currently adding emulation that would support qrustyquake for win32 anyways, so this dos port has no advantage here). I also think the dos port has less compatibility with DOS era systems, so it is mainly for testing the advanced features and performance in vesa/32bpp. I also can post details on the patch which is highly experimental at this time. I am currently testing on why the dpmi provider, cwsdpmi (I also tested hdpmi32), is not able to allocate memory above a 32mb level in this setup. I have already tested various combinations of the emulator parameters, too.

Log:

[CPU] #PF(0006) at 0087:000003C5 CR2=00401800
[CPU] #PF(0006) at 0087:00000318 CR2=00800000
[CPU] #PF(0006) at 0087:00000318 CR2=00C00000
[CPU] #PF(0006) at 0087:00000318 CR2=01000000 (later ones here not logged)
[CPU] #PF(0006) at 00A7:00001BDD CR2=0135ADF4
[CPU] #NM at 00A7:001FD544
[CPU] #PF(0006) at 00A7:001F7244 CR2=0135B370
[CPU] #PF(0006) at 00A7:001F7244 CR2=0135F3C8
[CPU] #PF(0006) at 00A7:001F5255 CR2=01356C70
[CPU] #PF(0006) at 00A7:00202EE1 CR2=0135445C
[CPU] #PF(0006) at 00A7:001F7244 CR2=0145F810 (later ones here not logged)
[CPU] #PF(0006) at 00A7:00202EE1 CR2=0135847C
[CPU] #PF(0006) at 00A7:001F724F CR2=02364000
[CPU] #NM at 00A7:000B07D6
[CPU] #NM at 00A7:0011BA1B
[CPU] #NM at 00A7:0011C410
[CPU] #NM at 00A7:0011C410
[CPU] #NM at 00A7:000933FB
[CPU] #NM at 00A7:0011C410 (later ones here not logged)
[CPU] #NM at 00A7:00093400
[CPU] #NM at 00A7:001F4004
[CPU] #PF(0006) at 00A7:00010C6E CR2=01359C5C
[CPU] #PF(0006) at 00A7:00202EE1 CR2=013573FC (later ones here not logged)
[CPU] #PF(0006) at 00A7:0000B86C CR2=01355C40
[CPU] #PF(0006) at 00A7:0008C8C7 CR2=01360000
[CPU] #PF(0006) at 00A7:0008C8C7 CR2=01361000
[CPU] #PF(0006) at 00A7:0008C8C7 CR2=01362000 (later ones here not logged)
[CPU] #NM at 00A7:001F8266
[CPU] #PF(0006) at 00A7:00088861 CR2=0236F000
[CPU] #PF(0006) at 00A7:00088861 CR2=02370000
[CPU] #PF(0006) at 00A7:00088861 CR2=02371000 (later ones here not logged)
[CPU] #NM at 00A7:00088898
[CPU] #PF(0006) at 00A7:00088905 CR2=02386000
[CPU] #PF(0006) at 00A7:00088905 CR2=02387000
[CPU] #PF(0006) at 00A7:00088905 CR2=02388000 (later ones here not logged)
[CPU] #NM at 00A7:001F8266
[CPU] #PF(0006) at 00A7:0000B54C CR2=0133A9B8
[CPU] #PF(0006) at 00A7:0020DB5A CR2=01339F70
[CPU] #PF(0006) at 00A7:001FF721 CR2=02394000
[CPU] #PF(0006) at 00A7:001FF721 CR2=02395000
[CPU] #PF(0006) at 00A7:001FF721 CR2=02396000 (later ones here not logged)
...
[CPU] #PF(0006) at 00A7:0008C3C4 CR2=01DB3000
[CPU] #NM at 00A7:00077D4E
[CPU] #PF(0006) at 00A7:00077E69 CR2=01EAD000
[CPU] #PF(0006) at 00A7:00077E69 CR2=01EAE000
[CPU] #PF(0006) at 00A7:00077E69 CR2=01EAF000 (later ones here not logged)
[CPU] #PF(0006) at 00A7:0008C3C4 CR2=02029000
[CPU] #NM at 00A7:00077D4E
[CPU] #NM at 00A7:00017613
[CPU] #NM at 00A7:00066B27
[CPU] #PF(0006) at 00A7:00066C39 CR2=029C5000
[CPU] #NM at 00A7:00066C39
[CPU] #PF(0006) at 00A7:00066C44 CR2=029C6000
[CPU] #NM at 00A7:00066C44
[CPU] #NM at 00A7:000060E4
[CPU] #NM at 00A7:000748A4
[CPU] #NM at 00A7:000140A8
[CPU] #PF(0006) at 00A7:0006449F CR2=012BAB78
[CPU] #NM at 00A7:000644F5
[CPU] #NM at 00A7:00063F3F
[CPU] #PF(0006) at 00A7:000640B3 CR2=012BB000
[CPU] #NM at 00A7:00063F3F
[CPU] #PF(0006) at 00A7:000639A8 CR2=012BC000
[CPU] #NM at 00A7:00063F3F (later ones here not logged)
[CPU] #PF(0006) at 00A7:0006399B CR2=012BD000
[CPU] #PF(0006) at 00A7:0006398F CR2=012BE000
[CPU] #PF(0006) at 00A7:000639B1 CR2=012BF000
[CPU] #PF(0006) at 00A7:000639AE CR2=012C0000
[CPU] #PF(0006) at 00A7:000639A8 CR2=012C1000
[CPU] #NM at 00A7:000644F5
[CPU] #PF(0006) at 00A7:0006399B CR2=012C2000
[CPU] #NM at 00A7:000163ED
[CPU] #NM at 00A7:000163ED
[CPU] #PF(0006) at 00A7:0005F922 CR2=0132FE80
[CPU] #NM at 00A7:0005E24D
[CPU] #PF(0006) at 00A7:0001A6A3 CR2=01327E1C
[CPU] #NM at 00A7:000190E1
[CPU] #PF(0006) at 00A7:0005E21E CR2=01330000
[CPU] #NM at 00A7:0005E21E
[CPU] #PF(0006) at 00A7:0001944A CR2=01328018
[CPU] #NM at 00A7:00019588
[CPU] #NM at 00A7:0002F584
[CPU] #PF(0006) at 00A7:00015074 CR2=02546038
[CPU] #PF(0006) at 00A7:00015074 CR2=02547078
[CPU] #PF(0006) at 00A7:00015074 CR2=025480B8 (later ones here not logged)
[CPU] #NM at 00A7:0002F601
[CPU] #NM at 00A7:0002F584
[CPU] #NM at 00A7:0002F584 (later ones here not logged)
[CPU] #PF(0006) at 00A7:0017B2E1 CR2=024E8000
[CPU] #PF(0006) at 00A7:0017B2E1 CR2=024E9000
[CPU] #PF(0006) at 00A7:0017B2E1 CR2=024EA000 (later ones here not logged)
[CPU] #PF(0004) at 00A7:0017C047 CR2=02551000
[CPU] #PF(0004) at 00A7:0017C047 CR2=02552000
[CPU] #PF(0004) at 00A7:0017C047 CR2=02553000 (later ones here not logged)
[CPU] #NM at 00A7:000DCA6C
[CPU] #NM at 00A7:001F07A6
[CPU] #NM at 00A7:00085908
[CPU] #PF(0006) at 00A7:000859C0 CR2=02536000
[CPU] #PF(0006) at 00A7:000859C0 CR2=02537000
[CPU] #PF(0006) at 00A7:000859C0 CR2=02538000 (later ones here not logged)
[CPU] #PF(0006) at 00A7:00085A10 CR2=02556000
[CPU] #PF(0006) at 00A7:00085A10 CR2=02557000
[CPU] #PF(0006) at 00A7:00085A10 CR2=02558000 (later ones here not logged)
[CPU] #NM at 00A7:0002399F
[CPU] #NM at 00A7:000B36F4
[CPU] #NM at 00A7:001EF9FB
[CPU] #NM at 00A7:000163ED (later ones here not logged)
[CPU] #NM at 00A7:00085908
[CPU] #NM at 00A7:001EF9FB
[CPU] #NM at 00A7:00085908 (later ones here not logged)
[CPU] #NM at 00A7:001EF9FB (later ones here not logged)
[CPU] #NM at 00A7:000DCA6C
[CPU] #NM at 00A7:0001E902
[CPU] #NM at 00A7:000644F5 (later ones here not logged)
[CPU] #NM at 00A7:0007821F
[CPU] #NM at 00A7:000DCA6C (later ones here not logged)
[CPU] #NM at 00A7:00071F90
[CPU] #NM at 00A7:00087977
[CPU] #NM at 00A7:0001E84A
[CPU] #NM at 00A7:00060A01
[CPU] #NM at 00A7:00072207
[CPU] #PF(0004) at 00A7:000856A8 CR2=02565110
[CPU] #PF(0004) at 00A7:000856A8 CR2=02566038
[CPU] #PF(0004) at 00A7:000856A8 CR2=025670E4 (later ones here not logged)
[CPU] #NM at 00A7:0001E902
[CPU] #NM at 00A7:00072207
[CPU] #NM at 00A7:0001E902 (later ones here not logged)
[CPU] #NM at 00A7:00060ACB
[CPU] #NM at 00A7:0001EAB3
[CPU] #NM at 00A7:00062B17
[CPU] #NM at 00A7:00078238
[CPU] #NM at 00A7:00060CA0
[CPU] #NM at 00A7:00072727
[CPU] #NM at 00A7:0007824A
[CPU] #NM at 00A7:00060F40
[CPU] #NM at 00A7:0001FB5A
[CPU] #NM at 00A7:00063F60
[CPU] #NM at 00A7:00071F90
[CPU] #NM at 00A7:001F0FAE
[CPU] #NM at 00A7:00060D24
[CPU] #NM at 00A7:00087770
[CPU] #NM at 00A7:000624E4
[CPU] #NM at 00A7:00072207 (later ones here not logged)
[CPU] #NM at 00A7:0001FB5A
[CPU] #NM at 00A7:0001FB5A (later ones here not logged)
[CPU] #NM at 00A7:00019588
[CPU] #NM at 00A7:0001E828
[CPU] #NM at 00A7:000785A7
[CPU] #NM at 00A7:0002F601
[CPU] #NM at 00A7:0002F601 (later ones here not logged)
[CPU] #NM at 00A7:00058E57
[CPU] #NM at 00A7:0007CE18
[CPU] #NM at 00A7:002042CB (later ones here not logged)
[CPU] #NM at 00A7:001F0FAE
[CPU] #NM at 00A7:0009D883 (later ones here not logged)
[CPU] #NM at 00A7:00218AE4
[CPU] #NM at 00A7:000878B3
[CPU] #NM at 00A7:00011732
[CPU] #NM at 00A7:0007825C
[CPU] #NM at 00A7:000878BC
[CPU] #NM at 00A7:000239E5
[CPU] #NM at 00A7:000EA0C0
[CPU] #NM at 00A7:00078238 (later ones here not logged)
[CPU] #NM at 00A7:0002399F
[CPU] #NM at 00A7:00218AE4
[CPU] #NM at 00A7:00218AE4 (later ones here not logged)
[CPU] #NM at 00A7:00074833
[CPU] #NM at 00A7:00078254
[CPU] #NM at 00A7:00074833
[CPU] #NM at 00A7:0007824A
[CPU] #NM at 00A7:00218C4F
[CPU] #NM at 00A7:0007824C
[CPU] #NM at 00A7:00087770
[CPU] #NM at 00A7:001F0FAE (later ones here not logged)
[CPU] #NM at 00A7:00218C4F
[CPU] #NM at 00A7:00078257
[CPU] #NM at 00A7:00218C4F (later ones here not logged)
[CPU] #NM at 00A7:00011732
[CPU] #NM at 00A7:00011732 (later ones here not logged)
[CPU] #NM at 00A7:00078242
[CPU] #NM at 00A7:0007821F (later ones here not logged)
[CPU] #NM at 00A7:0007824F
[CPU] #NM at 00A7:0002399F (later ones here not logged)
[CPU] #NM at 00A7:000781B2
[CPU] #NM at 00A7:000877E0
[CPU] #NM at 00A7:00078242 (later ones here not logged)
[CPU] #NM at 00A7:00058E57
[CPU] #NM at 00A7:0007CCEF
[CPU] #NM at 00A7:0007CE18
[BIOS] Switch to VESA mode 112h (640x480, 32 bits per pixel)
[S3] Back to the VGA's Graphics320x200
[BIOS] Switch to Text Mode (80x25 Color)
[CPU] #NM at 00A7:001FF6B1
[DOS] Program Terminated (INT 21h, 4Ch). ExitCode=01