Commit Graph

235 Commits

Author SHA1 Message Date
nmlgc 83e089cba9 [Reverse-engineering] Inlined GRCG mode setting calls
Funded by -Tom-.
2018-12-06 19:18:02 +01:00
nmlgc 58e1e142a5 [Maintenance] clip[bss].asm actually covers 16 bytes, not 8 -.- 2017-01-03 21:42:14 +01:00
nmlgc 14e69ceb6d [C decompilation] [th01] VSync interrupt handler
Time to get back into this.
2015-09-05 22:33:07 +02:00
nmlgc e0d90dbdc3 [C decompilation] [th01] Text mode functions
Yet another set of questionable C reimplementations of master.lib functions to
waste my time. And half of them, including z_text_(v)putsa, aren't even called
anywhere.
2015-03-11 23:29:58 +01:00
nmlgc 519e24c459 Rename the *_copy_region_* functions to *_copy_rect_*
TH01 copies a lot of different shapes from plane 1 to 0, so "region" feels
awfully unspecific.
2015-03-10 14:18:28 +01:00
nmlgc 160d4eb69f [C decompilation] [th01/op] [th01/reiiden] Random resident structure stuff 2015-03-07 17:43:39 +01:00
nmlgc 3b175c8980 [Reverse-engineering] [th01] ReiidenConfig structure 2015-03-06 23:04:25 +01:00
nmlgc 0fd7f14784 [C decompilation] [th01/op] Archive functions
Fuck TH02 and above and their bizarre assembly code that indeed appears to be,
uh, playfully "optimized" in the most inadequate of places, far away from the
innermost loop. It's ALWAYS just these one or two instructions I just can't
fucking get out of the C compiler, which lead to the conclusion that these
functions must have either been first compiled to assembly, then "fine-tuned"
and then linked into the executable…

… or I'm really just missing some obscure compiler setting.

At least with TH01, you can tell that the source language must have undeniably
been C++, and the decompilation is a breeze.
2015-03-05 23:12:14 +01:00
nmlgc 2f1b287f3d [C decompilation] [th01] VRAM region copy via EGC
The same function appears unused in TH02's MAINE.EXE. Separate commit because
this was painful enough and we can link the C version into FUUIN.EXE right
now.
2015-02-27 23:11:47 +01:00
nmlgc a7235304ed Make the VRAM plane constants available to C 2015-02-24 22:16:31 +01:00
nmlgc 436f1c5722 [C decompilation] [th01] MDRV2 calls
Still missing mdrv2_resident() though, which we currently can't slot in there
due to that string constant constructor syntax. :/
2015-02-21 20:48:58 +01:00
nmlgc 145ecaaa54 Rename all code segments to names that Turbo C++ would generate
Well, duh, of course, we *can* do this in order to allow decompilation to be
started at the end (not the beginning) of any segment. In fact, if we hadn't
done this, we would have had to start by moving _TEXT out to libraries....
2015-02-21 12:47:24 +01:00
nmlgc c2a8c221f2 Let Turbo C++ link in the Borland C/C++ runtime for the main EXE files
This took long enough, so we're not covering the COM files right now. Like, I
can't even tell how you're supposed to work around the forced word alignment
for the _TEXT segment. Guess we'll just have to decompile all of these in one
go, just like we did with ZUNSOFT.COM.

Also, it really seems as if we're merely trading one ugly workaround for
another in our quest for identical binaries.
2015-02-19 10:22:00 +01:00
nmlgc 2d5d38426f Finally use standard segment names everywhere
And I guess we just have to ignore and disable that segment alignment warning
for TH01. It's not like this changes anything in the binary.
2015-02-18 14:04:43 +01:00
nmlgc 07519a7238 [Reverse-engineering] 32-bit VRAM plane pointers
I've looked at every openly available piece of PC-98 documentation, and there
don't seem to be any official names for the individual planes. The closest
thing I could find was the description at

	http://island.geocities.jp/cklouch/column/pc98bas/pc98disphw2.htm

explaining that they represent the blue, red, green, and brightness component
when using the default PC-98 palette. However, these planes correspond to
nothing else but the 4 individual bits of the final index into the color
palette, and you can assign any color to every single palette slot. Therefore,
it's merely a convention that your own palettes don't have to follow (and in
Touhou, they don't).

Nevertheless, there doesn't seem to be an alternative, and the Neko Project II
source code uses the same B/R/G/E convention, so I'll go with that as well.
2015-02-10 23:43:34 +01:00
nmlgc 44146c4749 [Reduction] GRCG modes 2015-01-12 22:48:13 +01:00
nmlgc 04ab24d669 [th01] Undo the floating-point hacks 2014-12-19 06:11:42 +01:00
nmlgc 5ad97a08ea [JWasm move] Fix the remaining small issues to get through the first pass
Thanks to the LOCALS directive, we do need to break compatibility to TASM at
one point after all. This is the rest we can reasonably change to get at least
through JWasm's first pass without errors while maintaining compatibility to
TASM.

Includes:
* the OPTION syntax to switch in and out of floating-point emulation mode
* REP CMPSB → REPE CMPSB
* Hacks for two 80-byte short jumps
* lack of support for floating-point stupidity ♥
as well as other issues that I covered in previous commits and overlooked in
some files.
2014-11-21 11:24:47 +01:00
nmlgc b532a96c7e [JWasm move] Avoid "push large"
For 32-bit immediate values, PUSH by itself is enough. For everything else,
PUSHD works in both TASM and JWasm.

Also, could it be...? Could we actually move to JWasm without breaking the
build in TASM at all?
2014-11-19 12:09:22 +01:00
nmlgc f303222ffc Replace MASTERMOD with a per-game constant
Yup, packfiles finally proved that we really have a different set of changes
to master.lib in every game. Also, there are bound to be more of these game-
specific small changes to otherwise identical code in ZUN's own code.

And hey, no need to define that value in the build scripts anymore.

(I've also considered just copying modified versions into the individual game
subdirectories, but it's not too nice to expect people to diff them in order
to actually understand why these copies exist and where the changes actually
are.)
2014-11-15 02:03:41 +01:00
nmlgc 225d8f2a28 Identify all function pointers referenced from code
> introduce a new macro to halve the lines of a far function pointer
  assignment, hoping that this commit will end up deleting more lines than it
  adds, because TH03 has lots of those
> oh wait, these games mainly use near function pointers
> unearth even more new functions in the process

Seriously, how many more functions are still hidden in this codebase? And all
that just because IDA was not smart enough to begin with.
2014-11-14 01:57:40 +01:00
nmlgc af5419e350 Fix the directory of the fperror() slices
(Damn, the other commit prepared for today is not getting done, why does IDA
have to be so terrible...!)

Anyway, here's a small consistency edit instead.
2014-11-11 23:42:56 +01:00
nmlgc 13b10ef589 [Reduction] #683: access (the one that *actually* has no underscore) 2014-11-09 11:58:33 +01:00
nmlgc 986590f321 [Reduction] #682: ftol
And surprisingly, TH01's OP.EXE ends up as the first game executable that has
its seg000 cleared out.
2014-11-09 01:11:04 +01:00
nmlgc 00bacc7af3 [Reduction] #673-680: BERO's Pi loader library
> randomly google "PC-98 ライブラリ"
> 3rd hit: http://www.vector.co.jp/soft/dos/prog/se037608.html
> Oh look, it's the mystery code at the beginning of the TH01 executables!

This library also has dedicated support for transparency, which is used in the
Konngara fight (BOSS8_D*.GRP) and which we couldn't edit during the
development of the static English patches.
But of course, ZUN just had to change the format magic in order to make it
seem unique.
2014-11-04 18:42:43 +01:00
nmlgc 0b34460155 [Reduction] #670-672: e087_Trap
I guess this marks the final demystification of how segment declarations work
and how they are compiled. However, it only really makes sense for anything
outside the TEXT segment, like these floating-point functions. As long as the
slices aren't immediately next to each other, it would still be annoying to
have segment declarations inside of them, since we'd have to copy-paste these
declarations around every INCLUDE directive...
2014-11-02 20:11:20 +01:00
nmlgc 3a1c2fd679 Move the stack segment into its own slice
Saves 141 lines, and we'll need to ASSUME it in the upcoming floating-point
slices.
2014-11-02 19:44:02 +01:00
nmlgc a777ad2ad1 [Reduction] #668-669: pow10 2014-11-02 16:41:47 +01:00
nmlgc 0856fab827 [Reduction] #576-667: emu086.asm 2014-11-02 11:20:05 +01:00
nmlgc 7790ecdb7c [Reduction] #574-575: vprinter
And that would be the final function of the printf() family!
2014-11-02 09:01:46 +01:00
nmlgc 6d422052ca [Reduction] #570-573: realcvt 2014-11-02 08:27:17 +01:00
nmlgc 015ceec3e1 [Reduction] #569: xcvt
... and even with EMUL being set up and working, TASM still needs to be hacked
into actually emitting emulator calls for certain instructions.
2014-11-02 06:55:48 +01:00
nmlgc bbd8ff96ab [Reduction] #563-568: Floating-point emulator initialization
Finally - and there was indeed no way around switching to JWlink, as ALINK
v1.6 refuses to link the TH01 executables with a nondescript "Undefined base
seg" message once nec_fpinit.asm is included.
2014-11-01 17:09:13 +01:00
nmlgc 4ac17ac2a5 Trick TASM into not creating 32-bit default segments
So that's the - admittedly rather weird - solution to the problem that has
been plaguing this project ever since the beginning of the reduction step.
Without any 32-bit dummy segments in the compiled object files, more linkers
will be able to build this project, one of them being JWlink
(http://sourceforge.net/projects/jwlink/).

Still can't rename dseg to _DATA though, as TASM stupidly refuses to accept
any ALIGN directives above a segment's alignment attribute value. TH01's
floating-point data slices already require larger alignments, and we're very
likely to have even more of those in the future.

Also, we're finally defining the Borland C++ model symbols directly in the
code, rather than in my unpublished build batch files. :)
2014-10-31 08:17:54 +01:00
nmlgc 696d7f9476 Identify the missing BSS slice of xxv.cpp
sigdata.c doesn't specify any alignment, so this is the only position that
makes sense.
2014-10-29 05:41:43 +01:00
nmlgc 2d62776e02 [Reduction] #559: printf 2014-10-28 03:01:42 +01:00
nmlgc c4aee8a236 [Reduction] #556-558: open 2014-10-27 02:50:32 +01:00
nmlgc ebd20ebc88 [Reduction] #554-555: __rtl_open/__open
Same situation as with __rtl_close/__close, __rtl_read/__read and
__rtl_write/__write.
2014-10-26 02:16:29 +02:00
nmlgc 340c8a792a General cleanup
Mostly moving spurious null bytes, which are actually supposed to denote
alignment, into their associated slices, but also prettying up some of the
very first slices.
2014-10-20 17:20:04 +02:00
nmlgc 1c72d7e242 [Reduction] #548: Floating-point emulation data
Well, we have to start reducing this mess somewhere. The actual reduced
initialization code I've been preparing still fails to compile, and the data
is shared with a number of other components anyway, so...
2014-10-19 23:37:46 +02:00
nmlgc 191fd5b76b [Reduction] #543-547: fgetc and friends 2014-10-18 02:20:40 +02:00
nmlgc 489ecc8a96 [Reduction] #542: fprintf 2014-10-17 18:26:56 +02:00
nmlgc 54968ed7a3 [Reduction] #541: Fake floating point conversion 2014-10-16 07:29:53 +02:00
nmlgc 16b4e1d240 [Reduction] #540: close
Now with DOS error codes.
2014-10-15 08:39:22 +02:00
nmlgc d6449b27cf [Reduction] #537-539: sprintf 2014-10-14 04:00:44 +02:00
nmlgc 3457818399 [Reduction] #533-536: fopen
More flags and constants, despite reminding me why exactly I haven't done this
all along.
2014-10-13 06:12:09 +02:00
nmlgc 658ed9e72b Move "Abnormal program termination" to its own slice
That was the very first function reduced, before I came up with the data slice
model in 59688e23fc.
2014-10-12 18:37:58 +02:00
nmlgc afdd1c06e0 [Reduction] #532: fmode
Yup, finally adding the opening flags as well.
2014-10-11 23:56:44 +02:00
nmlgc 365763c459 [Reduction] #531: conio_type_init
Yup, platform detection by checking whether the date returned by the IBM real-
time clock interrupt is in the 20th or 21st century.
2014-10-10 21:20:22 +02:00
nmlgc 47a6be4db2 [Reduction] #530: delay 2014-10-09 03:51:01 +02:00
nmlgc 9003aea36b [Reduction] #527-529: nec_delay 2014-10-08 04:19:18 +02:00
nmlgc 4625339af1 Identify all remaining nopcalls 2014-10-07 06:32:20 +02:00
nmlgc 26e795f0bc [Reduction] #526: ibm_delay
There's also the PC-98-specific nec_delay. Which means that the inclusion of
this function into the games was *ding* entirely pointless.

Man, compilers sucked in the early 90s.
2014-10-06 03:18:36 +02:00
nmlgc 6fb80fba79 [Reduction] #525: conio_type 2014-10-05 02:11:00 +02:00
nmlgc 8b4a461283 [Reduction] #523-524: __rtl_close/__close
Same situation as with __rtl_read/__read and __rtl_write/__write.
2014-10-04 02:59:04 +02:00
nmlgc 05702534bc [Reduction] #521-522: setargv 2014-10-03 18:03:36 +02:00
nmlgc ef57ff6ae8 [Reduction] #519-520: intdos 2014-10-02 17:54:48 +02:00
nmlgc 399e6e3098 [Reduction] #517-518: int86 2014-10-01 16:04:50 +02:00
nmlgc 96c4a77d66 [Reduction] #516: xclose 2014-09-30 20:13:56 +02:00
nmlgc bf364ebfae [Reduction] #515: eof 2014-09-29 07:09:38 +02:00
nmlgc 8a2061bcab [Reduction] #513-514: atol and atoi 2014-09-28 05:05:32 +02:00
nmlgc 8cc3df1eb1 [Reduction] #512: xfclose 2014-09-27 22:51:10 +02:00
nmlgc 86b99b9265 [Reduction] #511: segread 2014-09-26 23:15:24 +02:00
nmlgc bbf47ec102 [Reduction] #509-510: mkname and tmpnam 2014-09-24 23:21:48 +02:00
nmlgc eace57b1a2 Wrap all code segments into their own group
Necessary to keep the original segment ordering with ALINK, our new linker.
2014-09-22 22:19:29 +02:00
nmlgc 5aad47cb08 [Reduction] #508: fclose 2014-09-21 13:37:38 +02:00
nmlgc 8ae2349005 [Reduction] #507: filelength 2014-09-20 12:41:18 +02:00
nmlgc 624119866b [Reduction] #505-506: LONGTOA and UTOA 2014-09-19 19:22:51 +02:00
nmlgc 00e2dcb519 Remove comments containing garbage characters
... as well as other useless comments that were in close proximity to those.
Now, all files should be valid Shift-JIS.
2014-09-18 20:41:06 +02:00
nmlgc 1e991fbec0 Remove automatically generated line breaks in string constants
Especially annoying if that happens in the middle of a Shift-JIS multi-byte
sequence, like in those two instances in TH02's OP.EXE. Also, making up for
the lack of string analysis during the dumping process of TH05's MAIN.EXE.
2014-09-17 06:24:22 +02:00
nmlgc 274b37eed7 [Reduction] #504: master.lib version string
Fulfilling the original licensing conditions... I think.
2014-09-16 04:11:09 +02:00
nmlgc cd7b956be6 [Reduction] #501: mbctype
Yup, ZUN makes use of this structure. In combination with master.lib.
2014-09-12 08:34:43 +02:00
nmlgc 9ff29d3159 [Reduction] #495: localeconv 2014-09-07 22:05:49 +02:00
nmlgc 08092bef2b [Reduction] #493-494: DOS file attribute functions 2014-09-07 19:10:29 +02:00
nmlgc 45f1b0d447 [Reduction] #492: unlink 2014-09-07 19:01:21 +02:00
nmlgc 9ed6e1e93f [Reduction] #488-491: General key input support 2014-09-07 17:01:58 +02:00
nmlgc 3d05fb85c9 [Reduction] #486-487: key_wait_bios and key_sense_bios 2014-09-07 16:21:01 +02:00
nmlgc 0d213f41b5 [Reduction] #484-485: resdata_exist and resdata_create
Looks like the 'pal98 grb' string was merely copy-pasted from the respal
module and isn't actually used by the function, which means that we don't have
to work around a naming collision after all.
2014-09-07 15:47:50 +02:00
nmlgc 61a0a024e2 [Reduction] #483: dos_free
OK. I'm going to spend one day on TH01 alone, and if that doesn't end up
shredding the code significantly, I'm not going to cover that game.
2014-09-07 15:41:48 +02:00
nmlgc 99b60ff9b9 [Reduction] #473: execl
And thus, we've singled out all Borland C++ runtime functions in all games but
TH01.
2014-09-06 19:08:18 +02:00
nmlgc d575a37e1e [Reduction] #470-472: LoadProg 2014-09-06 19:07:54 +02:00
nmlgc ccc560ab37 [Reduction] #466: searchenv 2014-09-04 20:55:28 +02:00
nmlgc dc9fc37b3f [Reduction] #465: searchstr 2014-09-04 20:55:27 +02:00
nmlgc 97711aac8f [Reduction] #464: mbcjmstojis
"Multi-byte-character-<something>-shift-to-JIS"?
2014-09-04 19:24:14 +02:00
nmlgc c0aa5b8a67 [Reduction] #461-463: fullpath.c 2014-09-04 19:04:39 +02:00
nmlgc af7f0b0ad6 [Reduction] #458-460: Double-byte character set functions 2014-09-03 23:23:25 +02:00
nmlgc e54a6ad120 [Reduction] #456: DOSCMD
... I, um, cannot comprehend how the C source code I have for this function
could have been compiled into such an assembly.
2014-09-03 19:13:47 +02:00
nmlgc 92046a8021 [Reduction] #455: getenv 2014-09-03 17:08:02 +02:00
nmlgc 3f7a29acc6 [Reduction] #452: respal_free 2014-09-03 15:45:21 +02:00
nmlgc 61c95ec603 [Reduction] #450-451: respal_exist and respal_create 2014-09-03 15:23:51 +02:00
nmlgc 01a126da71 [Reduction] #449: setvbuf 2014-09-03 14:02:14 +02:00
nmlgc 00e419e9da [Reduction] #448: setblock 2014-09-02 23:38:26 +02:00
nmlgc b77f2cfba0 [Reduction] #447: access 2014-09-02 23:26:19 +02:00
nmlgc 23aa61c002 [Reduction] #446: abort
The one with the single underscore, which is just raise + a wrapper around the
one with two underscores.
2014-09-02 21:45:19 +02:00
nmlgc 9d5aa934d4 [Reduction] #445: flushall 2014-09-02 21:44:35 +02:00
nmlgc 429f134a51 [Reduction] #442-444: fseek and ftell 2014-09-02 21:04:29 +02:00
nmlgc 6250206235 [Reduction] #432-440: xxv.cpp
OK, *that's* the last piece of C++ crud shared across all main executables.
According to the object in the library file though, it seems to include one
more dword named
	__DestructorCountPtr
in the BSS segment. Neither games nor the runtime itself seem to use it, and
as a consequence, it doesn't even seem to be included in the games' BSS
segments, given that they all end with the symbols of xx.cpp...
2014-09-01 13:51:23 +02:00
nmlgc f994832a28 [Reduction] #431: toupper
Neither is this one. Also, interesting how IDA didn't identify the function in
one third of the cases.

[Binary change] Order of 2 relocations in TH03's MAINL.EXE, TH04's MAIN.EXE
and MAINE.EXE, and TH05's MAINE.EXE.
2014-09-01 12:01:35 +02:00
nmlgc 4e16a92b07 [Reduction] #429: ctype 2014-09-01 12:01:32 +02:00
nmlgc b108d5d46f [Reduction] #372: IRand 2014-08-30 12:13:04 +02:00