the best thing about ghidra is that no matter which version you're using, setting equates sometimes just doesn't work, but if you google it, you only find several bug reports which basically say "equates don't work" and then it's "closed, fixed in X.Y.Z" and that's a version you're upgraded way past

port_out(0x3c4,0xf02);

I SO WANT TO EQUATE 0x3C4 TO THE VGA SEQUENCER INDEX REGISTER BUT I CAN'T

the weird thing is the equates table says it's been set, says there's a reference to it at that address, but if I go to that address, there's nothing. just 0x3c4
OH GOODY I found a mistake in OSDEV
their docs on the PC gameport are incorrect
and I can't rename some local variables either!?
what the fuck, ghidra?

okay I've fixed OSDEV:
https://wiki.osdev.org/Game_port

They had the introduction of the gameport listed as "the PCjr" (it's from 1981, the PCjr came out in 1984... and didn't even have this gameport connector!) but more importantly, they had the order of the joystick axises wrong.

Game port - OSDev Wiki

and the IBM Game Control Adapter is mentioned in the August 1981 IBM PC Technical Reference, so IBM clearly had the gameport ready at day one of the IBM PC, even if it was an optional add-in.
mind you, on the IBM PC, just about everything is an optional add-in. You get a keyboard and a cassette port for free: you want graphics/text, floppies, hard drives, serial/parallel ports? that's extra.

god. Duke Nukem 1 has so much copy-pasted code.
Like, there's a ton of hint dialog boxes like "You need the key to open this door!" or "you get more points if you catch the balloon"

you'd think they'd just have ShowMessage() and pass it a different string, but nope. it's a different function.

LEARN TO WRITE REUSABLE FUNCTIONS

interesting. there's 12 hint-variables which are used to make sure you don't get hinted for something you've used before.

One of them is still maintained, but not used. So there must have been another hintable thing that got dropped

although I'm looking at DN1, episode 1. Maybe it does do something in DN1E2 or DN1E3?
because yeah this was also the era where you'd have 3 separate executables for 3 separate episodes of the same game

like, it has a function that loops through all 16 color indices and sets them to black. it takes one parameters, which tells it how long to wait between each color is set, so it'll fade slowly to black, instead of being instant.

there's also an identical function that does the same, but sets it to white, instead.

so instead of fade_screen(COLOR_BLACK) and fade_screen(COLOR_WHITE), it's two separate functions!
naturally instead of a function like "adjust_duke_health(n)" there's a "give_duke_one_health_point" function
todd replogle: look, I know programmers who use function parameters and data-driven design, and they're all cowards
The game starts with these two screens.
There's a function to draw Dr Proton, a different function to draw Duke Nukem, a function to draw Proton's text, and another function to draw Duke's

the only difference between the "draw proton"/"draw duke" functions is what base address they draw from.

YOU CAN PASS ADDRESSES TO FUNCTIONS, TODD

there are 5 of these functions in total.
Exactly identical, except they point to different buffers for different fullscreen images
oh god please don't tell me there's a hidden cheat code that's been missed for... 32 years?

Nope! it's known, it's just slightly mis-documented and tricky to pull off.

If you press the fire button (not alt!) and release F6 on the main menu, after launching the game with "dn1 asp", you can play the demo level

@foone wait what??? I've been wanting to play that level since 1992!
@foone ahh satisfying. Mildly interesting that beating the level doesn't put you in a hallway but keeps you in the level, but with all moving stuff, spikes, etc removed or stopped
@adamrofer oh, does it? interesting. I didn't try beating a level in that state.

@adamrofer Also you can just play it as map 1 of episode 2.

although interestingly, it's not exactly the same: apparently they made some changes after recording the demo for the shareware version!

@foone i actually was wondering that exact situation, I wonder what changed? Be careful to avoid the rockets, below them is no exit (the rest of the level is safe though). There's some weird area above the visible area on the top left too that you can grapple up into...