Commit Graph

1647 Commits

Author SHA1 Message Date
nmlgc 8580251c06 [Separate translation units] [th02] snd_kaja_interrupt()
Part of P0132, funded by [Anonymous].
2021-01-05 19:33:37 +01:00
nmlgc b9c24cf931 [Separate translation units] [th02] snd_delay_until_measure()
How was this game even *built*, originally, if it uses *both* a common
shared set of library functions *and* obviously copy-pasted and
separately compiled versions of some of these functions?

Part of P0132, funded by [Anonymous].
2021-01-05 19:32:18 +01:00
nmlgc aac0108c63 [Separate translation units] [th02] Sound effect playback (undecompilable)
Reason: Same as hflip_lut_generate() – wants to be word-aligned, and
the function before it has an odd length :(

Part of P0132, funded by [Anonymous].
2021-01-05 19:29:10 +01:00
nmlgc 52fdb33d1d [Separate translation units] [th02] frame_delay()
Part of P0132, funded by [Anonymous].
2021-01-05 19:23:31 +01:00
nmlgc dc9e3ee475 [Decompilation] [th01] Bosses: Collision handling
Functions with 12 parameters are hard to describe, y'know. Looking
forward to decompiling these giant expressions for the actual
boss↔orb collision parameter passed to this function…

Oh well, at least we're now totally ready for some boss code next
year. 😌

Completes P0131, funded by Yanga.
2020-12-18 01:38:52 +01:00
nmlgc bcdc073403 [Reverse-engineering] [th01] Frame-based random number
Yes, no "generator", just a single number. Used to add some very
minimal randomness to certain things, by taking it modulo a small
number.

Part of P0131, funded by Yanga.
2020-12-18 01:38:51 +01:00
nmlgc 21da5a330d [Reverse-engineering] [th01] Bomb damage flag
Part of P0131, funded by Yanga.
2020-12-18 01:38:50 +01:00
nmlgc 89fbec0a79 [Reverse-engineering] [th01] Test mode damage flag
Part of P0131, funded by Yanga.
2020-12-18 01:38:50 +01:00
nmlgc f80001d34b [Reverse-engineering] [th01] Bosses: Current HP
And once again, SinGyoku is the only boss to get its own variable.
Maybe this means that it was the first boss to be implemented after
all?

Part of P0131, funded by Yanga.
2020-12-18 01:38:49 +01:00
nmlgc d5fd70c458 [Decompilation] [th01] HUD: HP rendering
And we're right back to things not being nice. Because yeah, why
shouldn't these three distinct rendering functions be part of a single
function, selected by magic numbers?
Or why shouldn't the 16×16 wrapper around a 32×32 set of graphics
functions be used to handle backgrounds for 16×8 sprites, resulting in
needlessly complex parameter calculations that lead to sloppy code?

Part of P0131, funded by Yanga.
2020-12-18 01:38:48 +01:00
nmlgc 576def5293 [Decompilation] [th01] HUD: Blitting individual hit points
Nice GRCG use! The 8 dots of its tile register, which are commonly just
set to the same color value, can of course hold an arbitrary bit
pattern for every bitplane. This allows you to get different colors for
every pixel, with still just a single VRAM write of the alpha mask to
one bitplane.

And I thought TH01 only suffered the drawbacks of PC-98 hardware, and
made so little use of its actual features that it's perhaps not even
fair to call it "a PC-98 game"…

Completes P0130, funded by Yanga.
2020-12-18 01:38:48 +01:00
nmlgc b4d500b2de [Decompilation] [th01] Bosses: Generic no-op callback
Made truly generic by its use in both the upcoming boss collision
handling, as well as some SinGyoku pellet spawning function.

Part of P0130, funded by Yanga.
2020-12-18 01:38:46 +01:00
nmlgc 8b4fb566f3 [Maintenance] Move the generic function pointer types to `platform.h`
It kind of is a platform detail, after all. Those 4 `typedef`s don't
really justify their own header file.

Part of P0130, funded by Yanga.
2020-12-18 00:59:48 +01:00
nmlgc 64f872e5c5 [Decompilation] [th01] Difficulty-based value selection
And with that, TH01 is pushed over the 50% completion mark! 🎉

This time, it's only YuugenMagan who gets no own copy. Giant RE% gains
from all these calls, but let's hope I don't regret already decompiling
this one for all bosses. It's not quite at the beginning of SinGyoku's,
Mima's, and Elis' code segment, after all…

Part of P0130, funded by Yanga.
2020-12-18 00:59:41 +01:00
nmlgc 2c180c3825 [Reverse-engineering] [th01] Bosses: Current phase frame
One shared variable for all bosses except SinGyoku. Maybe the
biggest single set of PI false positives left in TH01?

Part of P0130, funded by Yanga.
2020-12-18 00:55:23 +01:00
nmlgc aaea18aa8f [Decompilation] [th01] Retrieving and setting the default boss palette
The placement at the beginning of Kikuri's code segment makes you think
this is only used for the barely noticeable white-in effect during
Kikuri's entrance animation. It's also used to periodically reset boss
sprite colors during the flashing effect after getting hit by the Orb,
though.

Part of P0130, funded by Yanga.
2020-12-18 00:55:21 +01:00
nmlgc 0bfff60a0a [Maintenance] Define `bool` as unsigned
Wait, we can just do that, and nothing breaks?! All this time, we
could have avoided the `unsigned char` workaround???

Part of P0130, funded by Yanga.
2020-12-18 00:45:54 +01:00
nmlgc 6d69ea8152 [Maintenance] Decide on `_masked` instead of `_mask` for blitting functions
Because there are only three functions that didn't already follow this
naming scheme.

(Maintenance mode commit)
2020-12-02 00:10:48 +01:00
nmlgc f4c2e45671 [Decompilation] [th01] Stage objects: Initialization
Lol @ Konngara decompilation being blocked by this giant card-flipping
function that took 2 pushes to understand, only for it to start with

	if((stage % 5) == 4) {
		return;
	}

…

Completes P0129, funded by Yanga.
2020-12-01 00:34:22 +01:00
nmlgc dd74e8a3cd [Reverse-engineering] [th01] Stage objects: Sprite IDs
Part of P0129, funded by Yanga.
2020-12-01 00:34:22 +01:00
nmlgc 35b4461b22 [Decompilation] [th01] Stage objects: VRAM page 0 → 1 copies
This is where the code generation actually confirms the SoA layout of
the global obstacle structure, rather than it being distinct pointers.

Part of P0129, funded by Yanga.
2020-12-01 00:34:21 +01:00
nmlgc 4b24c13d3d [Decompilation] [th01] Stage objects: Obstacle initialization
Part of P0129, funded by Yanga.
2020-12-01 00:34:21 +01:00
nmlgc 9f9d27554b [Decompilation] [th01] Stage objects: STAGE?.DAT loading
Final set of file loading calls in TH01!

Part of P0129, funded by Yanga.
2020-12-01 00:34:20 +01:00
nmlgc dde36f7f89 [Decompilation] [th01] Stage objects: Background snapping
Completes P0128, funded by Yanga.
2020-12-01 00:34:20 +01:00
nmlgc 73f62a5ba2 [Decompilation] [th01] Stage objects: Background allocation and blitting
Continuing the good error handling from the .PTN functions they're
based on… if only its sole caller actually cared.

Also: A sort-of limit of 102 objects per stage, just because someone
didn't use huge pointers where they would have been necessary…
:tannedcirno:

Part of P0128, funded by Yanga.
2020-12-01 00:34:18 +01:00
nmlgc 27b3f29a0a [Reverse-engineering] [th01] Stage objects: Card flip scores
Case in point: This structure member, which is located after all the
obstacle members. Sure, it'll look weird to see this one initialized by
a class method, but it'll be much weirder to somehow group both cards
and obstacles into one class.

Part of P0128, funded by Yanga.
2020-11-29 18:03:39 +01:00
nmlgc 7df4e0517b [Reverse-engineering] [th01] Stage objects: Obstacle class
And another one for all the obstacle types we saw earlier. The original
game probably combined all SoA pointers for both cards and obstacles
into a single "stage object". But that'll get way too unwieldy in the
functions later, given that those aren't even methods, and simply
reference one global variable. `stageobjs.obstacles.member`… yeah, no.

Part of P0128, funded by Yanga.
2020-11-29 17:59:03 +01:00
nmlgc 8e43f48b69 [Reverse-engineering] [th01] Stage objects: Card class
Sure, a SoA layout might actually be genius and what you should be
doing most of the time on modern systems, but you still wouldn't
allocate every member separately.

Part of P0128, funded by Yanga.
2020-11-29 17:59:01 +01:00
nmlgc 0ea53cf841 [Reverse-engineering] [th01] Stage objects: Obstacle types
An enum to distinguish between bumpers, turrets, portals, bumper bars…
and cards that have to be flipped more than once?!

Part of P0128, funded by Yanga.
2020-11-29 17:01:14 +01:00
nmlgc 3fc43a3dba [Maintenance] [th01] Start a new header file for stage objects
As we're going to see, some of these share some of the allocations.

Part of P0128, funded by Yanga.
2020-11-29 16:53:58 +01:00
nmlgc dc65b59dcc [Decompilation] [th05] frame_delay()
Finishing this push with another highly questionable one… Let's hope
that the port developers will certainly appreciate that they just have
to remove the weirdness here, and not mess with defining entirely new
functions in C land.

Completes P0127, funded by [Anonymous].
2020-11-16 20:01:36 +01:00
nmlgc 7897bf166f [Separate translation units] [th04/th05] .CDG: Loading and freeing
Undecompilable again. The loading functions have these *_noalpha()
variants that simply set a global variable and fall through to the
regular functions, while cdg_free() has its first `PUSH DI` instruction
after the first expression we'd be decompiling. cdg_free_all() *could*
be decompiled… but would also require _FLAGS trickery, and it's simply
not worth starting a translation unit for one such small function.

Part of P0127, funded by [Anonymous].
2020-11-16 20:01:35 +01:00
nmlgc 00f177e196 [Maintenance] [th03] Remove the input mode and delay function disassembly
MAIN.EXE now also caught back up with the decompilation.

Part of P0127, funded by [Anonymous].
2020-11-16 20:01:35 +01:00
nmlgc 8835d59eda [Build] [th03] Keep hflip_lut_generate() in ASM due to alignment issues
Nooooo, gotta throw away that decompilation for the stupidest of
reasons :( Turns out that a function may also be "undecompilable" if
the original code layout places it at a word-aligned address, but the
last byte of the previous function in just one of the original binaries
(TH03's MAIN.EXE, in this case) also lies at a word-aligned address.
There's simply no way to enforce per-function word alignment in Turbo
C++ alone. You *could* fake it with `#pragma codestring`, but of course
that won't work for functions that are part of the SHARED segment, and
where the alignment previously would have been correct. Conditionally
emitting that codestring would work, but then we'd also have to compile
that translation unit at least twice.

Now, I could have created a dummy .ASM file that just contains a single
zero-length but word-aligned SHARED segment, which could be placed
anywhere on the link command line where word alignment is needed… but
the decompilation of this function was a mess anyway, and probably
helped nobody.

Part of P0127, funded by [Anonymous].
2020-11-16 20:01:34 +01:00
nmlgc f7931167fc [Decompilation] [th03] .MRS: Slot loading function
Still too micro-optimized to be decompilable into something sane…
Anyway, .MRS done.

Part of P0127, funded by [Anonymous].
2020-11-16 20:01:34 +01:00
nmlgc 1fe9863e47 [Decompilation] [th03] .MRS: Slot freeing function
How can you mess up *a freeing function* that badly?! In your third
game?!

Part of P0127, funded by [Anonymous].
2020-11-16 20:01:33 +01:00
nmlgc 00e65f4c6b [Decompilation] [th03] .MRS: Alpha-tested byte-aligned blitting
And since inlining even removes longer if-else chains if they branch
depending on a literal constant, we can use a regular parameter to
select either MOV or OR in our _FS and _GS poke() template functions,
without needing to duplicate them!

Part of P0127, funded by [Anonymous].
2020-11-16 20:01:32 +01:00
nmlgc 8b0165738a [Decompilation] [th03] .MRS: Byte-aligned, opaque blitting
Containing not one, but two decompilation innovations, one of which
works around a compiler bug using C++ template functions…

Completes P0126, funded by [Anonymous] and Blue Bolt.
2020-11-16 20:01:32 +01:00
nmlgc 5965930bd0 [Decompilation] [th03] .MRS: Persistent horizontal flipping
Another function consisting almost entirely of inline ASM. Still worth
it though, if only to save us from duplicating any declarations in ASM
land.

Part of P0126, funded by [Anonymous] and Blue Bolt.
2020-11-16 20:01:31 +01:00
nmlgc 08a09aabb2 [Reverse-engineering] [th03] .MRS: Bitplane pointers
Part of P0126, funded by [Anonymous] and Blue Bolt.
2020-11-16 20:01:26 +01:00
nmlgc baac3f7682 [Decompilation] [th04/th05] EGC-powered page 1→0 rectangle blitting
Actually fairly average, as far as unreasonable decompilations are
concerned. No `goto`, at least! Another place that would benefit from
EGC raster op documentation, though.

Also, got one more padding byte in TH05's MAINE.EXE correct. 🙂

Part of P0126, funded by [Anonymous] and Blue Bolt.
2020-11-16 20:01:09 +01:00
nmlgc b504d72301 [Maintenance] Move decomp.h out of th01/hardware/egc.h
Part of P0126, funded by [Anonymous] and Blue Bolt.
2020-11-15 21:30:58 +01:00
nmlgc 74a11d667d [Maintenance] master.hpp transition: Resident data
With a type-safe wrapper template that removes the need for ID length
and structure-size-in-paragraphs macros. *And* <dos.h>!

Part of P0126, funded by [Anonymous] and Blue Bolt.
2020-11-15 21:28:55 +01:00
nmlgc 9c36df72e5 [Maintenance] [th01] Get rid of th01.h
Part of P0126, funded by [Anonymous] and Blue Bolt.
2020-11-15 21:27:41 +01:00
nmlgc aea27d2221 [Maintenance] master.hpp transition: DOS functions
Part of P0126, funded by [Anonymous] and Blue Bolt.
2020-11-15 21:23:29 +01:00
nmlgc 199f73eba4 [Maintenance] master.hpp transition: Math declarations
Part of P0126, funded by [Anonymous] and Blue Bolt.
2020-11-15 21:22:15 +01:00
nmlgc d515d67c9f [Maintenance] master.hpp transition: Optionally buffered single-file I/O
Now the fact that those can be buffered is also documented outside of
MASTER.MAN.

Part of P0126, funded by [Anonymous] and Blue Bolt.
2020-11-15 21:21:04 +01:00
nmlgc 90f1c2ca93 [Maintenance] master.hpp transition: Text RAM declarations
Part of P0126, funded by [Anonymous] and Blue Bolt.
2020-11-15 21:19:42 +01:00
nmlgc b104b3316b [Maintenance] Consistently use Borland's I/O port intrinsics
Rather than preferring either the Microsoft/Watcom `(in|out)pw?` style,
or the Borland `(in|out)portb?` style, master.lib had to introduce its
own `(OUT|IN)P[BW]` naming scheme… Insert obligatory xkcd standards
comic.

Part of P0126, funded by [Anonymous] and Blue Bolt.
2020-11-15 21:16:40 +01:00
nmlgc 6c22af7e83 [Build] [th01] Only compile shared single-file translation units a single time
Which gets rid of 13 redundant translation units. Definitely a good
start, before I figure out how to best handle the more complicated
cases.

(Maintenance mode commit)
2020-11-04 14:47:52 +01:00