#dos #vga #graphics #ms-dos #opl #source-file

sys dos-like

Framework for writing DOS-like applications

5 releases (3 breaking)

0.4.0 Oct 18, 2023
0.3.1 Jul 26, 2022
0.3.0 Mar 29, 2022
0.2.3 Mar 17, 2022
0.1.0 Mar 5, 2022

#393 in Game dev

Custom license

2MB
5.5K SLoC

C 3.5K SLoC // 0.2% comments Rust 1.5K SLoC // 0.0% comments Shell 9 SLoC

dos-like for Rust   Latest Version Documentation Continuous integration status dependency status

This project provides access to Mattias Gustavsson's dos-like framework, so as to write DOS-like applications in Rust.

Rotozoom example written in Rust

How to use

This crate is not a regular library. It defines a main function on its own. For the executable linking to work correctly, the main source file needs to declare no main and define an extern C function dosmain instead.

#![no_main]

#[no_mangle]
pub extern "C" fn dosmain() -> i32 {
    // your code here

    0
}

A utility macro is available as an alternative to declaring the function:

#![no_main]

dos_like_rs::dos_main! {
    // your code here
}

See the examples for a typical application structure, which are based on the original dos-like examples.

A C compiler needs to be available (uses cc). The dos-like framework is statically linked, just like in a C program.

Since the initiator is based on routines in C, this also means that panic unwinding will not work, so it is best to configure your project to abort on panic. In your Cargo.toml:

[profile.dev]
panic = "abort"

[profile.release]
panic = "abort"

Check out the dos-like README for additional requirements.

Cargo features

  • disable-screen-frame compiles dos-like so that the CRT screen frame around the viewport does not appear.

Platform support

These bindings have been tested on Linux, Windows and MacOS Monterey (x86). WebAssembly support is currently not guaranteed (but your assistance on this would be greatly appreciated!).

Building

When working on this project, ensure that the git submodule in dos-like-sys/dos-like was populated (either by cloning with --recurse-submodules or by calling git submodule update --init). Some of the examples do not work unless with this submodule checked out.

License and attribution notice

The Rust bindings are licensed under either of

at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

The dos-like framework remains licensed as defined in the original LICENSE file.

Dependencies