Commit Graph

366 Commits

Author SHA1 Message Date
nmlgc 241b61e808 [Maintenance] Distinguish between Shift-JIS and gaiji strings
The main point of the previous strings/ subdirectory was to bundle all
hardcoded strings for translators. And sure, *technically*, gaiji
strings are *both* strings *and* something you might want to translate.
But mainly, they're sprites with an attached enum, and their own
directory. Changes to the enum quickly tend to involve changes to the
strings that use these values, so it makes sense to keep both in the
same directory.

Especially since 82% of the previous strings/ directories consisted of
such gaiji strings.

That leaves the strings/ directory rather empty and nondescript though.
Recently though, I've been wanting to generally move all Shift-JIS text
to this directory. While that wouldn't *solve* the typical "text editor
accidentally a file upon save, due to wrongly detected encoding" issue,
it's at least a mitigation: If all Shift-JIS strings are in files that
contain nothing *but* Shift-JIS strings, a wrongly detected encoding
becomes immediately noticeable.

For that job, strings/ can have a more descriptive name though. Hence,
shiftjis/.

Part of P0141, funded by [Anonymous] and rosenrose.
2021-05-27 19:10:26 +02:00
nmlgc 78df46af1f [Decompilation] [th04/th05] snd_determine_modes()
ZUN apparently had no trust in the sanity of Turbo C++'s code
generation?

Part of P0139, funded by [Anonymous].
2021-05-11 18:47:59 +02:00
nmlgc 4c0e76ab89 [Decompilation] [th04/th05] snd_mmd_resident()
Part of P0139, funded by [Anonymous].
2021-05-11 18:47:57 +02:00
nmlgc 4c8a3cb353 [Decompilation] [th04/th05] snd_pmd_resident()
Part of P0139, funded by [Anonymous].
2021-05-11 18:47:56 +02:00
nmlgc 1d05642866 [Maintenance] [th03/th04/th05] .CDG: Mirror implementation macros in ASM land
We introduced those in 25caa85.

Part of P0137, funded by [Anonymous].
2021-04-03 22:16:01 +02:00
nmlgc 8bcf5d7b84 [Regression] Explicitly request 16-bit default segments when using .MODEL
Whoops, turns out that the build has been broken on TASM32 version 5.3
(the one in the DevKit) ever since 7897bf1. In contrast to version 5.0
(which I use for my development), 5.3 actually defines 32-bit segments
if you specify a .386 CPU before using .MODEL.

That might have been the reason for the .286 workaround all along?
Turns out there's the USE16 modifier, which makes this much more
explicit than switching CPUs.
2021-03-29 22:39:11 +02:00
nmlgc 25caa85ef8 [Decompilation] [th04/th05] cdg_put_noalpha_8()
Getting better at making this more readable…

Part of P0136, funded by [Anonymous].
2021-03-20 02:36:40 +01:00
nmlgc 16899204df [Decompilation] [th04/th05] Sound effect playback
At least it's decompilable in these games, and quite nicely so!

Part of P0136, funded by [Anonymous].
2021-03-20 02:36:38 +01:00
nmlgc 8164c71d22 [Decompilation] [th04/th05] bgimage_snap(), bgimage_put(), bgimage_free()
Eh, REP MOVSD is used too inconsistently across the games to justify
replacing these macros with an `inline` function. Still can use a
custom one here to make the register usage a bit more explicit, though.

Part of P0136, funded by [Anonymous].
2021-03-20 02:36:36 +01:00
nmlgc 46359e643e [Translation unit catch-up] [th05] game_exit()
Part of P0136, funded by [Anonymous].
2021-03-20 02:36:32 +01:00
nmlgc 0263439fac [Decompilation] [th04/th05] vector1_at(), vector2_at()
Almost undecompilable, until you remember that you can inhibit the
optimization of keeping a function parameter in a register by having an
`inline` function take a reference. Yet another function that wouldn't
have decompiled that nicely if we had restricted us to C…

Part of P0136, funded by [Anonymous].
2021-03-19 23:29:26 +01:00
nmlgc f35b051edd [Separate translation units] [th04/th05] bgimage_put_rect() (undecompilable)
Reason: Self-modifying. -.-

Part of P0135, funded by [Anonymous].
2021-03-19 23:19:48 +01:00
nmlgc 88c019eb91 [Maintenance] Move the bgimage_*() functions to the hardware/ directory
Not that it really fits there either, but I've been trying to keep the
th0?/ directories free from any actual code. They should only contain
the distinct translation units within the original three .EXE binaries,
`#include`ing files from subdirectories, along with maybe game-specific
`#pragma`s, but contain no code on their own. Port authors would simply
ignore those, and link everything from the subdirectories into one
binary. That approach has seemed to make the most sense for all of this
so far.

Part of P0135, funded by [Anonymous].
2021-03-19 20:06:54 +01:00
nmlgc 01c92da1ac [Decompilation] [th05] snd_load()
A decompilation of ZUN-written ASM that was almost worth it, for once!
Too bad that those aren't the <string.h> intrinsics that the
Wolfenstein 3D disassembly hinted at, though.

Part of P0135, funded by [Anonymous].
2021-03-19 19:22:57 +01:00
nmlgc 903f5b55de [Separate translation units] [th05] snd_kaja_interrupt() (undecompilable)
Reason: Pascal calling convention with function parameters but no stack
frame.

Part of P0135, funded by [Anonymous].
2021-03-19 19:16:01 +01:00
nmlgc a6eed55258 [Decompilation] [th05] pi_put_masked_8(), pi_put_quarter_masked_8()
Completes P0135, funded by [Anonymous].
2021-02-21 14:04:52 +01:00
nmlgc 76cefb1e37 [Decompilation] [th05] pi_load()
That assembly is *worse* than what you would have gotten out of your
1994 C++ compiler with the 386 code generation switch!

Part of P0134, funded by [Anonymous].
2021-02-21 14:04:48 +01:00
nmlgc ffcc46d32f [Decompilation] [th05] pi_put_8(), pi_put_quarter_8()
> assigning to the DI register immediately before a CALL
Yeah, no amount of comma operator trickery can get *that* out of this
compiler. Also, these TH05 .PI functions are the only place in PC-98
Touhou with a `IMUL DI, imm8` instruction, which is impossible to get
out of Turbo C++'s built-in assembler.
Well, at least the `if` branches decompile somewhat nicely.

Part of P0134, funded by [Anonymous].
2021-02-20 23:50:03 +01:00
nmlgc 25d26824a1 [Separate translation units] [th05] pi_palette_apply() (undecompilable)
… especially because this one *is* actually undecompilable. Reason:
Base pointer assignment to BX, before saving the SI register on the
stack.

Part of P0134, funded by [Anonymous].
2021-02-20 23:50:03 +01:00
nmlgc 2777bae55b [Separate translation units] [th05] pi_free() (undecompilable)
Well, it *would* have been decompilable, but that ridiculous placement
of the nullptr assignment would have forced the entire function call to
be spelled out in inline ASM, verbatim. No amount of comma operator
trickery would have generated the same instructions either. And for a
function this small and obvious in what its decompilation *should* be,
it really defeated the purpose of adding a separate translation unit…

Part of P0134, funded by [Anonymous].
2021-02-20 23:50:02 +01:00
nmlgc ce25a6e579 [Separate translation units] [th02/th03/th05] game_init_main()
Oh look, new content! Gotta finish this push at some point, after all…

Part of P0133, funded by [Anonymous].
2021-01-30 19:50:32 +01:00
nmlgc e4eed85c44 [Separate translation units] [th04/th05] Low-level input (undecompilable)
Reason: Manual "tail call optimization" of input_reset_sense(), with
execution falling through to input_sense() immediately below.

Part of P0133, funded by [Anonymous].
2021-01-30 19:11:01 +01:00
nmlgc 6e91c4f99a [Decompilation] [th05] input_reset_sense_held(), input_wait_for_change()
Nope, not keeping this in ASM just because of some function calls
either.

Part of P0133, funded by [Anonymous].
2021-01-30 18:26:34 +01:00
nmlgc 4229054137 [Decompilation] [th05] snd_bgm_measure(), snd_delay_until_measure()
Umm… but this can't be in the same translation unit as frame_delay(),
because OP.EXE has cdg_put_nocolors() inbetween, which means we'd have
to compile it twice.

What probably happened there: ZUN originally wrote this in C when
frame_delay() was still next to it, then generated ASM from it,
tinkered with that, and ultimately only linked that ASM into the final
game, with the NOPCALL still in there. That might very well be the one
temporary NOPCALL workaround we can never get rid of…

Oh well, at least we got lucky with the padding, and can keep the
cdg_put_nocolors() decompilation from the last commit.

Part of P0133, funded by [Anonymous].
2021-01-30 18:23:03 +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 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 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 4850d6d457 [Maintenance] Rename "seg2" to "SHARED"
There's the better name, in ALLCAPS for improved grepping. TH01 is also
going to need a pseudo-binary to bundle translation units that appear
in more than one .EXE, and since "segment 2" would be wrong for that
game, it makes more sense to have one consistent name for these
pseudo-binaries in all games.

(Maintenance mode commit)
2020-11-03 17:01:26 +01:00
nmlgc f1c63ab3a1 [Reverse-engineering] Assign names to all graph_putsa_fx() effects
And get rid of the constraining FX() macro, with its spacing parameter
that we haven't even seen used so far.

Part of P0124, funded by [Anonymous] and Blue Bolt.
2020-11-02 22:33:50 +01:00
nmlgc 30462cc64f [Maintenance] Indicate byte alignment for all .PI blitting functions
Part of P0124, funded by [Anonymous] and Blue Bolt.
2020-11-02 22:19:12 +01:00
nmlgc 8c1d4bf41b [Maintenance] Locate the BSS segment of master.lib's `clip.asm`
By now, it's become obvious where it has to be. Apparently, the order
of translation units inside ZUN's modified master.lib did somehow
change with TH02?

(Maintenance mode commit)
2020-09-29 07:03:06 +02:00
nmlgc 799b801720 [Reverse-engineering] [th04/th05] GENSOU.SCR loading
That's almost one distinct function per binary. What a mess.

Part of P0119, funded by [Anonymous] and -Tom-.
2020-09-21 15:00:10 +02:00
nmlgc 5990ccd3b9 [Maintenance] Declare CDG blitting functions in C land
Part of P0119, funded by [Anonymous] and -Tom-.
2020-09-21 15:00:01 +02:00
nmlgc 485477bd56 [Maintenance] [th04/th05] Declare snd_se_update() as __cdecl
Part of P0119, funded by [Anonymous] and -Tom-.
2020-09-21 14:59:50 +02:00
nmlgc 23a7658672 [Position independence] [th05] Final false positives in MAINE.EXE
3996 4/4 measures of BGM ought to be enough for anybody, eh?

Part of P0118, funded by -Tom- and Ember2528.
2020-09-17 22:39:11 +02:00
wintiger0222 ed197308d7 [Reverse-engineering] [th05] Extra staff roll: Background selection
I didn't know that extra staff roll cutscene order is different for
each character --WindowsTiger

Final actual data references in TH05's MAINE.EXE! 🎉 --Nmlgc

Reviewed and merged as part of P0118, funded by -Tom- and Ember2528.
2020-09-17 22:36:08 +02:00
nmlgc 6e61b07055 [Position independence] False positives: Divisions
Part of P0118, funded by -Tom- and Ember2528.
2020-09-17 22:35:44 +02:00
nmlgc 7ff0950da8 [Position independence] [th04/th05] False positives: Verdict constants
Part of P0118, funded by -Tom- and Ember2528.
2020-09-17 22:28:19 +02:00
nmlgc c790f5fba1 [Position independence] [th01/th02/th04/th05] False positives: Score values
Part of P0118, funded by -Tom- and Ember2528.
2020-09-17 22:23:26 +02:00
nmlgc 0bb5bc39d9 [Position independence] False positives: Palette color arithmetic
Completes P0117, funded by [Anonymous].
2020-09-16 22:30:57 +02:00
nmlgc 6212a4c21b [Position independence] False positives: 0xFF / 255 / -1
Another dumb concession to the PI counter, leading to one of the single
biggest PI commits ever…

Part of P0117, funded by [Anonymous].
2020-09-16 22:30:57 +02:00
nmlgc 65c72929af [Position independence] False positives: I/O port accesses
… with either the port or the argument in registers. This is one of the
few actually dumb concessions to the PI counter on the website.
Then again, binary *is* a better representation for the contents of the
GRCG tile register than hex…

Part of P0117, funded by [Anonymous].
2020-09-16 22:30:56 +02:00
nmlgc 03048c318d [Decompilation] [th04/th05] Cutscenes: Text blending
Completes P0116, funded by [Anonymous] and Lmocinemod.
2020-09-12 12:09:31 +02:00
nmlgc 650d863942 [Reverse-engineering] [th05] Cutscenes: Shift-JIS codepoint ➜ text color map
Populated by the `\c=<codepoint>,<color>` commands seen at the top of
the .TXT files.

Part of P0116, funded by [Anonymous] and Lmocinemod.
2020-09-12 11:36:49 +02:00
nmlgc 0b7d541e30 [Reverse-engineering] [th03/th04/th05] Cutscene script buffer
Part of P0116, funded by [Anonymous] and Lmocinemod.
2020-09-12 11:35:44 +02:00
nmlgc e38602c108 [Reverse-engineering] [th05] High score menu: Floating glyph ball structure
Part of P0116, funded by [Anonymous] and Lmocinemod.
2020-09-12 11:35:32 +02:00
nmlgc 041b3a4f28 [Position independence] [th04/th05] Remaining references to the name alphabet
Part of P0116, funded by [Anonymous] and Lmocinemod.
2020-09-12 11:29:35 +02:00
nmlgc d973380a9c [Reverse-engineering] [th03/th04/th05] High score menu: Entered place
Part of P0116, funded by [Anonymous] and Lmocinemod.
2020-09-12 11:29:09 +02:00
nmlgc e5328a32fc [Reverse-engineering] [th05] Staff roll: Verdict bitmap
28,160 bytes of global data just for a overly large 320×704 bitmap
that allows you to scroll between the general verdict and the
individual end-of-stage scores with the Up and Down keys. That's one
benefit of splitting your game into multiple executables, I guess?

Completes P0115, funded by Lmocinemod and Blue Bolt.
2020-09-12 11:28:01 +02:00