adding a readme

This commit is contained in:
John Bintz 2024-03-04 18:05:15 -05:00
parent d0ccb689a9
commit e8ac1cc4e8
2 changed files with 102 additions and 7 deletions

102
README.md Normal file
View File

@ -0,0 +1,102 @@
# MS-DOS VGA Arena Shooter Game
A Smash TV/Robotron-like game to help me learn a whole bunch of things
about game programming, DOS & PC programming, x86 assembler & C, and VGA graphics!
## Play!
The latest build of the game is under Releases.
[Send any feedback you wish](https://theindustriousrabbit.com/about) -- it's
appreciated! -- but I really don't know when I'll get back to working on this.
## Setup
Builds are done on a host Linux system with Open Watcom 2.0 installed to
a local directory. On my machine, that's `~/Applications/open-watcom-v2`.
Tests and game are run in DOSBox-X.
### Clone and build Open Watcom 2 for DOS cross-compilation
You'll need to build Open Watcom 2 from source to get DOS compilation on Linux.
[Follow the directions on their GitHub wiki](https://github.com/open-watcom/open-watcom-v2/wiki/Build).
You may need DOSBox installed for the Open Watcom 2 build.
### Modify `setup.sh` to use your local Open Watcom install
Changing the path of `export WATCOM` should be enough
### Install Ruby and the RMagick gem
The spritesheet builder uses Ruby and RMagick to produce the x86 assembler
spritesheets from `spritesheet.bmp`.
### Install DOSBox-X
I used [the Flatpak version](https://flathub.org/apps/com.dosbox_x.DOSBox-X) and created a wrapper script in my `PATH`:
```sh
#!/bin/sh
flatpak run com.dosbox_x.DOSBox-X "$@"
```
### Try building the game & tests
`bin/game` builds and runs `game.exe` and `bin/test` builds and runs the
unit tests.
## What's in here?
### System access code
Everything in the `system` folder is about directly accessing the PC hardware:
* `keyboard.c` accepts keyboard input using a keyboard interrupt.
* `mouse_io.c` accepts mouse input.
* `pc_stuff.c` does various PC things with interrupts.
* `vga.c` accesses the VGA card and has drawing routines built for
32-bit protected mode code and using the 320x200x256 chained VGA mode (mode 10h).
### Unit tests
I'm using the [CuTest](https://github.com/ennorehling/cutest) library to write basic unit tests for the game.
I wanted to try out C unit testing and see what libraries could work on
retro machines, and CuTest fit the bill. The tests run directly in DOS.
### Compiled sprites
I automated the pipeline to building compiled sprites from a bitmap file.
Originally, I was doing memory copies from that bitmap file, and no matter
how much I optimized them, they were slow slow slow. Having Ruby build the
sprites as a series of `mov` instructions sped up the game immensely.
### Inline assembler
There's some non-trivial inline assembler in `system/vga.c` for drawing
font glyhps. https://github.com/dhepper/font8x8 is the source of the
font. I probably could have gotten the performance fast enough in pure C,
but I really wanted to try some inline assembler.
### Bitmap loading code
Before switching to compiled sprites, I wrote code to load BMP files to
a memory location of your choosing, as well as to extract the palette for
feeding to the VGA card.
### Open Watcom `wmake` Makefiles
The `Makefile`s are not sophisticated, but it took me quite a while to
research Open Watcom's slightly different syntax for `Makefiles`. The GNU
make docs didn't help too much.
## License
MIT License on the code. If you use any code verbatim, or do anything else with this,
let me know!
CuTest has its own license.
Any art that's not the spritesheet is (C) John Bintz, all rights reserved. That
should only be the `chicken.bmp` file that's used as an example for
bitmap loading code.

View File

@ -1,7 +0,0 @@
wcc386.exe -q bmp_loader.c
wcc386.exe -q mouse_io.c
wcc386.exe -q pc_stuff.c
wcc386.exe -q vga.c
wcc386.exe -q keyboard.c
wcl386.exe -q game.c bmp_load.obj mouse_io.obj pc_stuff.obj vga.obj keyboard.obj