Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ Here are some of the markdown rules:
Rules for lists:
* Lists can improve readability when used appropriately but should only be used when the context makes sense, don't overuse lists.
* **Never use numbered lists** - Just use `*` for all unordered lists.
* **Always have a sentence before the list** explaining the list, never just have a list after a heading.
* **Always have a sentence before the list** explaining the list, never just have a list after a heading. The sentence should normally end with a colon `:` and there should not be a blank line between the colon and the first list element

If using a list, we have a preferred format for lists where each list item has a short bold part followed by a dash (-) and more information:
```markdown
Expand Down Expand Up @@ -194,15 +194,15 @@ Field | Purpose
`title` | Full page title shown in the page header and metadata (do not use colons! as it messes with the yaml frontmatter)
`category` | Main site grouping such as the games console name or others such as `leak`, `introduction`, `gameengines`, `maths`, or another section-specific category. This can be a single value (`category: leak`) or a list (`category: [leak, snes]`) when a page belongs to multiple categories.
`image` | Optional main preview image used by the page and site cards, if there is not a unique one leave it blank and it will be generated based on the category and title, for new pages leave blank (don't include)
`twitterimage` | Absolute URL version of the preview image for social sharing, leave blank and it will be generated, if in doubt leave blank
`twitterimage` | Absolute URL version of the preview image for social sharing, leave blank and it will be generated, if in doubt leave blank (avoid using but don't remove)
`permalink` | Final public path for the page (do not end with a trailing `/`; that is legacy format we are moving away from)
`breadcrumbs` | Breadcrumb trail shown at the top of the page
`recommend` | Related-topic tags used to build the recommended sidebar and card labels; these should usually be chosen from tags already used elsewhere on the site, only use valid tags from `valid-tags.json`
`editlink` | Repo-relative path used for the "Edit on GitHub" link
`updatedAt` | Last meaningful content update date for the page
`excerpt` | Optional short summary for pages that need it
`hidden` | Optional flag for pages that should not appear in normal discovery
`videocarousel` | Optional list used only on pages that embed the video header carousel
`videocarousel` | Optional list used only on pages that embed the video header carousel (avoid using)

Some frontmatter keys are now legacy or optional:
* **Only add optional keys when they are actually needed** - Avoid copying large frontmatter blocks from unrelated pages
Expand All @@ -228,6 +228,22 @@ If it's a link, ensure it's a valid Markdown link so it's clickable:
[^2]: Page X of Book Y
```

### External links vs citations
Footnotes are for sources backing up claims (dates, attribution, technical assertions, quotes, etc). Not every link on a page needs to be a footnote, especially when the link is there as "further reading" that you want the reader to click.

If you include an external link inline as part of a sentence, keep it as a normal Markdown link and only add a footnote if the link is acting as evidence for a specific claim.

If an external link is presented on its own line / paragraph or end of a sentence (not inline in a table, list, or middle of a sentence), ALWAYS use the `link-to-other-site.html` include so it renders consistently and includes a short description:

```ruby
{% raw %}
{% include link-to-other-site.html
title="Example external article title"
url="https://example.com/article"
description="1-2 sentences describing why this link is relevant." %}
{% endraw %}
```

---
### Linking to other RetroReversing pages
<div class="emoji">🔗</div>
Expand Down
3 changes: 3 additions & 0 deletions _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,9 @@ category:
"jaguar":
title: Atari Jaguar
image: /public/consoles/Atari Jaguar.png
"atari":
title: Atari
image: /public/consoles/Atari 2600.png
"leak":
title: Leak
image: /public/consoles/Leaks.png
Expand Down
5 changes: 2 additions & 3 deletions _data/valid-tags.json
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,6 @@
"psp"
],
"categories/consoles/PokemonMini.md": [
"pokemonmini",
"pokemonmini"
],
"categories/consoles/SG1000.md": [
Expand Down Expand Up @@ -353,14 +352,14 @@
"books",
"industry"
],
"categories/misc/Books.md": [
"pages/Industry/Books.md": [
"industry"
],
"categories/misc/Conferences.md": [
"industry",
"introduction"
],
"categories/misc/GDC.md": [
"pages/Industry/GDC.md": [
"industry",
"introduction"
],
Expand Down
30 changes: 15 additions & 15 deletions _includes/header.html
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ <h4><a href="/games/supermarioworld">Super Mario World</a></h4>
<a href="/gamecube">Gamecube</a>
<a href="/wii">Wii</a>
<a href="/wiiU">WiiU</a>
<a href="/PokemonMini/">Pokemon Mini</a>
<a href="/PokemonMini">Pokemon Mini</a>
<!-- <a href="/virtualboy">Virtual Boy</a> -->
</div>
<div class="col">
Expand All @@ -152,7 +152,7 @@ <h4><a href="/games/supermarioworld">Super Mario World</a></h4>
<div class="col">
<span class="title">Microsoft</span>
<a href="/xbox">Xbox</a>
<a href="/xbox360/">Xbox 360</a>
<a href="/xbox360">Xbox 360</a>
<a href="/pc">PC</a>
<a href="/msx">MSX</a>
<a href="/dos">MS-DOS</a>
Expand Down Expand Up @@ -218,20 +218,20 @@ <h4><a href="/games/supermarioworld">Super Mario World</a></h4>

<div class="col">
<span class="title">Nintendo Development Kits</span>
<a href="/famicom-nes-development-kit/">Famicom (NES)</a>
<a href="/super-famicom-snes-development-kit/">Super Famicom (SNES)</a>
<a href="/official-n64-devkit/">N64 (Ultra64)</a>
<a href="/gamecube-development-kit-hardware/">Gamecube (Dolphin)</a>
<a href="/nintendo-wii-development-kit/">Wii (Revolution)</a>
<a href="/gameboy-development-kit-hardware/">Game Boy (DMG & GBC)</a>
<a href="/game-boy-advance-development-kit/">Game Boy Advance (AGB)</a>
<a href="/nintendo-ds-development-kit/">DS (Nitro)</a>
<a href="/famicom-nes-development-kit">Famicom (NES)</a>
<a href="/super-famicom-snes-development-kit">Super Famicom (SNES)</a>
<a href="/official-n64-devkit">N64 (Ultra64)</a>
<a href="/gamecube-development-kit-hardware">Gamecube (Dolphin)</a>
<a href="/nintendo-wii-development-kit">Wii (Revolution)</a>
<a href="/gameboy-development-kit-hardware">Game Boy (DMG & GBC)</a>
<a href="/game-boy-advance-development-kit">Game Boy Advance (AGB)</a>
<a href="/nintendo-ds-development-kit">DS (Nitro)</a>
</div>

<div class="col">
<span class="title">Sega Development Kits</span>
<a href="/sega-mega-drive-genesis-development-kit/">Mega Drive (Genesis)</a>
<a href="/sega-saturn-programming-box/">Saturn</a>
<a href="/sega-mega-drive-genesis-development-kit">Mega Drive (Genesis)</a>
<a href="/sega-saturn-programming-box">Saturn</a>
<a href="/Sega-Dreamcast-Katana-Development-Kit">Dreamcast (Katana)</a>
</div>
<div class="col">
Expand All @@ -241,15 +241,15 @@ <h4><a href="/games/supermarioworld">Super Mario World</a></h4>
<a href="/playstation-2-development-hardware">PS2</a>
<a href="/official-playStation3-devkit">PS3</a>
<a href="/official-psp-devkit">PSP</a>
<a href="/microsoft-xbox-development-kit/">Xbox</a>
<a href="/microsoft-xbox-360-development-kit/">Xbox 360</a>
<a href="/microsoft-xbox-development-kit">Xbox</a>
<a href="/microsoft-xbox-360-development-kit">Xbox 360</a>
</div>

<div class="col">
<span class="title">Retail Hardware</span>
<a href="/hardware/consoles">Console Hardware Architecture</a>
<a href="/hardware/cheatdevices">Cheat Devices</a>
<a href="/Bung-Doctor-v64/">Doctor V64</a>
<a href="/Bung-Doctor-v64">Doctor V64</a>
<a href="/net-yaroze">Net Yaroze</a>
</div>
<div class="col">
Expand Down
2 changes: 1 addition & 1 deletion categories/Introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -702,7 +702,7 @@ We have pages on each of the following **Nintendo** consoles:
* [Nintendo GameCube (Dolphin)](https://www.retroreversing.com/gamecube/)
* [Nintendo Wii](https://www.retroreversing.com/wii/)
* [Nintendo 3DS](https://www.retroreversing.com/3ds/)
* [Nintendo Wii U](https://www.retroreversing.com/wiiU/)
* [Nintendo Wii U](https://www.retroreversing.com/wiiu)

## SEGA Consoles
We have pages on each of the following **SEGA** consoles:
Expand Down
7 changes: 3 additions & 4 deletions categories/consoles/Atari2600.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
---
permalink: /atari2600
layout: post
category: atari2600
category: atari
title: Atari 2600 VCS Reverse Engineering
consoleimage: /public/consoles/Atari 2600.png
image_: /public/images/nes/Atari 2600.jpg
twitterimage_: https://www.retroreversing.com/public/images/atari/Atari 2600.jpg
excerpt: Awesome list of Atari Game Development and Reverse Engineering information
breadcrumbs:
- name: Home
Expand All @@ -19,6 +16,8 @@ recommend:
recommendTitle: All Atari 2600 Posts
editlink: ../categories/consoles/Atari2600.md
updatedAt_: '2022-12-08'
redirect_from:
- /atari
tags:
- atari
---
Expand Down
6 changes: 4 additions & 2 deletions categories/consoles/AtariJaguar.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
permalink: /atarijaguar
permalink: /jaguar
layout: post
category: atarijaguar
category: jaguar
title: Atari Jaguar Reverse Engineering
consoleimage: /public/consoles/Atari Jaguar.png
image_: /public/images/nes/Atari Jaguar.jpg
Expand All @@ -20,6 +20,8 @@ recommend:
recommendTitle: All Atari Jaguar Posts
editlink: ../categories/consoles/AtariJaguar.md
updatedAt_: '2024-05-03'
redirect_from:
- /atarijaguar
tags:
- atari
- jaguar
Expand Down
5 changes: 5 additions & 0 deletions categories/consoles/C64.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,8 @@ redirect_from:
[pditincho](https://github.com/pditincho/mm-explained) has produced a reconstructed and fully commented disassembly of the Commodore 64 implementation of Maniac Mansion. This project documents the inner workings of the engine's C64 iteration, covering 6502 assembly routines, specialized disk loaders, and hardware-level interactions with the VIC-II and SID chips. It provides a detailed technical breakdown of game entities such as rooms, costumes, and scripts, serving as a comprehensive resource for understanding the game's original architecture.

{% include link-to-other-site.html url="https://github.com/pditincho/mm-explained" description="pditincho has released mm-explained, a comprehensive disassembly and technical documentation of the C64 version of Maniac Mansion, detailing its assembly logic and engine structure." image="https://opengraph.githubassets.com/1/pditincho/mm-explained" title="GitHub - pditincho/mm-explained: Maniac Mansion C64 explained" %}

### Freeload: The Ocean Loader Technical Retrospective
[Paulie Hughes](http://www.pauliehughes.com/freeload.htm) provides a detailed technical breakdown of "Freeload," the iconic Commodore 64 turbo loader used by Ocean Software. The page explores the evolution of the loader's design, including its signature raster bars, the integration of loading music by composers like Martin Galway, and the various anti-piracy encryption methods implemented toward the end of the C64's lifecycle. Crucially, it discusses the transition from standard loading routines to more advanced techniques, such as loading data directly into the stack to execute games via a manual stack pointer manipulation.

{% include_cached link-to-other-site.html url="http://www.pauliehughes.com/freeload.htm" description="Original developer Paul Hughes shares the history and 6502 assembly source code for Freeload, the legendary Ocean Loader used for C64 titles." title="Freeload - The Ocean Loader by Paulie Hughes" %}
30 changes: 30 additions & 0 deletions categories/consoles/DOS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ consoleimage: /public/consoles/Computer Old Design.png
excerpt: Awesome list of DOS Game Development and Reverse Engineering information
redirect_from:
- /msdos
- /RetroCityRampage
breadcrumbs:
- name: Home
url: /
Expand Down Expand Up @@ -42,6 +43,13 @@ Note that if you are interested in reversing Windows bases PC games we have a se
Note that if you are interested in the MSX PC we have a separate post on that topic:
{% include_cached link-to-other-post.html post="/msx" description="For more information on the MSX check out this post." %}

## Glossary of Key Terms
If you are unfamiliar with the technical specifications of late 80s and early 90s PC hardware, this glossary provides context for the techniques mentioned:
* <a id="glossary-mode13h"></a>**Mode 13h** - A standard VGA graphics mode providing 320x200 resolution with 256 colors from a palette of 262,144.
* <a id="glossary-pit"></a>**PIT** - The Programmable Interval Timer (Intel 8253/8254), used for system timing and generating precise hardware interrupts.
* <a id="glossary-irq0"></a>**IRQ0** - The highest priority hardware interrupt on the PC, typically mapped to the system timer.
* <a id="glossary-watcom"></a>**Open Watcom** - A C/C++ compiler suite famous for its high-performance code generation for DOS extenders.

---
# DOS-era PC Hardware

Expand Down Expand Up @@ -102,6 +110,28 @@ Thanks to debug symbols being found in the **Carmageddon Splat Pack** expansion

{% include link-to-other-site.html url="https://pizzalegacy.nl/blog/traffic-system.html" description="The Pizza Legacy blog explores the reverse engineering of Pizza Tycoon's 1994 traffic engine, detailing how developers managed city-wide vehicle simulation with minimal CPU overhead." image="" title="How Pizza Tycoon simulated traffic on a 25 MHz CPU" %}

---
# DOS Game Development

## Porting Retro City Rampage to MS-DOS
<iframe width="560" height="315" src="https://www.youtube.com/embed/kSKeWH4TY9Y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

[GDC](https://www.youtube.com/watch?v=kSKeWH4TY9Y) hosted this technical presentation by Brian Provinciano, the creator of *Retro City Rampage*. The talk details the process of back-porting a modern game to the constraints of a 1990s MS-DOS environment, specifically targeting 486-class hardware with strict memory and storage limitations.

### Technical Constraints and Goals
The porting process was defined by the need to shrink a modern codebase into a footprint compatible with legacy hardware:
* **Target Hardware** - Minimum requirement of a 486 DX IBM PC compatible with 4MB of RAM.
* **Operating System** - Designed for MS-DOS 3.3 or higher.
* **Storage Limit** - The entire game, including assets, was required to fit on a single 1.44MB 3.5" high-density floppy disk.
* **Graphics Architecture** - Utilized a simple 1-byte-per-pixel buffer to map directly to VGA memory for performance.

### Optimization Strategies
Provinciano discusses several low-level techniques used to achieve real-time performance on the 486:
* **Reprogramming PIT** - The system timer was reprogrammed to increase precision beyond the default 55ms tick, allowing for synchronized audio and video.
* **Inline Assembly** - Used for performance-critical sections such as hiding the mouse cursor via `int 33h` and custom tile-drawing routines.
* **Asset Compression** - Implemented a two-stage compression pipeline: RLE (Run-Length Encoding) for fast runtime rendering and zlib for minimizing executable size on disk.
* **Data Generation** - To save disk space, pathfinding navigation data and car collision objects were generated procedurally from world collision data rather than being stored as distinct files.
* **Memory Management** - Aggressive use of `#ifdef` blocks to strip out modern engine features while maintaining a shared codebase between PS4 and DOS versions.

---
## DOS Gaming Aspect Ratio - 320x200
Expand Down
Loading
Loading