Skip to content

DOS backend#98

Merged
Darky-Lucera merged 13 commits intoemoon:masterfrom
badlogic:dos-pr
Aug 14, 2025
Merged

DOS backend#98
Darky-Lucera merged 13 commits intoemoon:masterfrom
badlogic:dos-pr

Conversation

@badlogic
Copy link
Copy Markdown
Contributor

After adding the Web backend, I figured why not try DOS as well. This PR adds support for DOS, to be more specific, minifb applications compiled with DJGPP, a popular 32-bit DOS compiler based on GCC, running on DOS hardware or emulators that support VESA.

The backend has a couple of limitations:

  • There can only ever be one window open at a time.
  • Window sizes provided to mfb_window_open() must match a VESA mode available on the "machine" the app is running on. 320x240, 640x480, 800x600 work in DOSBox, but may not work on real hardware depending on the graphics card.
  • Character input is limited to ASCII characters. A US keyboard layout is assumed.
  • Key input is limited to the keys as found here: https://github.com/badlogic/minifb/blob/dos-pr/src/dos/DOSMiniFB.c#L18
  • The buffer dimensions passed to mfb_update_ex() must either be a perfect match of the window dimensions, or 1/2 the window dimensions. E.g.:
    • Window 320x240, buffer 320x240: works
    • Window 640x480, buffer 320x240: works
    • Window 640x480, buffer 512x512: fails silently
  • Viewports are not supported.

The current minifb tests do not adhere to these limitations, so I added tests/dos/dos.c.

To compile and run this test, you'll need DJGPP and DOSBox-x. The tests/dos/tools/download-dos-tools.sh script will download all the dependencies (and also a GDB version that understand COFF binaries) to tests/dos/tools/:

./tests/dos/tools/download-dos-tools.sh 

You can then build for DOS via:

cmake -DCMAKE_TOOLCHAIN_FILE=$(pwd)/tests/dos/tools/toolchain-djgpp.cmake -S . -B build
cmake --build build

You can run then run thedos.c test via DOSBox-x:

./tests/dos/tools/dosbox-x/dosbox-x -fastlaunch -exit build/dos.exe

This is what it looks like in DOSBox :)
75c66044b7eff325

I know this has a super low probability to be merged, but I figured someone else who wants to use minifb for little DOS experiments may find this PR and use it.

@Darky-Lucera
Copy link
Copy Markdown
Collaborator

I’m wondering why is this
Window 640x480, buffer 512x512: fails silently
happening?

@Darky-Lucera
Copy link
Copy Markdown
Collaborator

There are functions to scale content, with and without bilinear filtering

@badlogic
Copy link
Copy Markdown
Contributor Author

The silent fail is merely due to me having only implemented a 1:1 blit and a very bad 1:2 blit.

You mean minifb has functions to scale buffers? I shall amend the PR then!

@badlogic
Copy link
Copy Markdown
Contributor Author

Oh, how did I not see these before? Thanks for the pointer!

https://github.com/emoon/minifb/blob/master/src/MiniFB_internal.c

@badlogic
Copy link
Copy Markdown
Contributor Author

Alrighty, I fixed it up using stretch_image(). Also adjusted dos.c to test if it actually works. noise.c, input_events and input_events_cpp work too now. The other tests do not, as they require multi-window support.

@Darky-Lucera
Copy link
Copy Markdown
Collaborator

Darky-Lucera commented Dec 29, 2022

Nice to know.

I'm a little afraid of maintaining so many backends in the future 😅

@badlogic
Copy link
Copy Markdown
Contributor Author

I totally understand. For what it's worth, I'm actively using minifb in a bunch of projects that also require the web and DOS backend to keep working. I'd be happy to maintain them. If you want a track record of my OSS work, I'm the creator of libGDX, which has a track record of 12 years of maintenance :)

@Darky-Lucera
Copy link
Copy Markdown
Collaborator

Nice to know.
Thanks for the track record but I was sure you knew what you were doing.

@Darky-Lucera
Copy link
Copy Markdown
Collaborator

Darky-Lucera commented Dec 30, 2022

Let me know when this PR is finished (solve the conflicts)

# Conflicts:
#	.gitignore
#	CMakeLists.txt
@badlogic
Copy link
Copy Markdown
Contributor Author

I've fixed up the merge conflicts. I still need to modify the README.md file to document usage and limitations, and also do some testing on Linux. I'll ping you here once I think it's ready.

@Darky-Lucera
Copy link
Copy Markdown
Collaborator

Ok

@badlogic
Copy link
Copy Markdown
Contributor Author

Update README.md with (hopefully) extensive instructions. Tested everything on Windows, Linux, and macOS, including the debugging. Looks good to go on my end.

Note: on Windows you need Ninja as the build generator again, just like with Emscripten. Wished MSBuild could handle it :/

@badlogic
Copy link
Copy Markdown
Contributor Author

badlogic commented Jan 2, 2023

Alright, I think I've fixed it all up well. Also tested on 86Box in vanilla MS-DOS 6.22, which does actual cycle accurate hardware emulation. Works well! I believe this is ready, if you think it's a nice addition to MiniFB.

@Darky-Lucera
Copy link
Copy Markdown
Collaborator

Excuse me for the long delay.
Could you please fix the problem in MakeLists.txt to merge this PR?

Thanks in advance!

@Darky-Lucera
Copy link
Copy Markdown
Collaborator

@badlogic
Could you please fix the conflicts to merge these changes?

@Darky-Lucera Darky-Lucera merged commit 819592f into emoon:master Aug 14, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants