adding a readme
This commit is contained in:
parent
d0ccb689a9
commit
e8ac1cc4e8
|
@ -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.
|
Loading…
Reference in New Issue