2015-09-16 03:02:29 +00:00
|
|
|
|
/* ReC98
|
|
|
|
|
* -----
|
|
|
|
|
* 1st part of ZUN_RES.COM. Initializes the resident structure and
|
|
|
|
|
* configuration file required in order to run TH02, and verifies HUUHI.DAT.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#pragma inline
|
|
|
|
|
|
|
|
|
|
#include <stddef.h>
|
|
|
|
|
#include "th02/th02.h"
|
2020-02-18 18:46:34 +00:00
|
|
|
|
#include "th02/snd/snd.h"
|
2015-09-16 03:02:29 +00:00
|
|
|
|
|
|
|
|
|
#pragma option -a1
|
|
|
|
|
|
|
|
|
|
char debug = 0;
|
|
|
|
|
|
2019-12-30 14:48:17 +00:00
|
|
|
|
void cfg_write(seg_t resident_sgm)
|
2015-09-16 03:02:29 +00:00
|
|
|
|
{
|
|
|
|
|
static const huuma_options_t opts_default = {
|
|
|
|
|
RANK_NORMAL, SND_BGM_FM, 3, 2, 0
|
|
|
|
|
};
|
|
|
|
|
static const char HUUMA_CFG[] = CFG_FN;
|
|
|
|
|
|
|
|
|
|
const char *fn = HUUMA_CFG;
|
|
|
|
|
huuma_options_t opts = opts_default;
|
|
|
|
|
int handle = dos_axdx(0x3D02, fn);
|
|
|
|
|
if(handle > 0) {
|
|
|
|
|
dos_seek(handle, sizeof(opts), SEEK_SET);
|
|
|
|
|
} else {
|
|
|
|
|
handle = dos_create(fn, _A_ARCH);
|
|
|
|
|
dos_write(handle, &opts, sizeof(opts));
|
|
|
|
|
}
|
2019-12-30 14:48:17 +00:00
|
|
|
|
dos_write(handle, &resident_sgm, sizeof(resident_sgm));
|
2015-09-16 03:02:29 +00:00
|
|
|
|
dos_write(handle, &debug, sizeof(debug));
|
|
|
|
|
dos_close(handle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main(int argc, const char **argv)
|
|
|
|
|
{
|
2019-12-26 15:07:35 +00:00
|
|
|
|
int pascal scoredat_verify(void);
|
2015-09-16 03:02:29 +00:00
|
|
|
|
|
|
|
|
|
static const char MIKOConfig[] = RES_ID;
|
|
|
|
|
static const char LOGO[] =
|
|
|
|
|
"\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>^<5E>p<EFBFBD>@ <20>풓<EFBFBD>v<EFBFBD><76><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>@ZUN_RES.com Version1.01 (c)zun 1997\n";
|
2019-12-26 15:07:35 +00:00
|
|
|
|
static const char ERROR_SCOREDAT[] =
|
2015-09-16 03:02:29 +00:00
|
|
|
|
"<EFBFBD>n<EFBFBD>C<EFBFBD>X<EFBFBD>R<EFBFBD>A<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>́A<CC81><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD><78><EFBFBD>s<EFBFBD><73><EFBFBD>ĂˁB\n";
|
|
|
|
|
static const char ERROR_NOT_RESIDENT[] =
|
|
|
|
|
"<EFBFBD>킽<EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>悧\n\n";
|
|
|
|
|
static const char REMOVED[] =
|
|
|
|
|
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>A<EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>炢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n\n";
|
|
|
|
|
static const char ERROR_UNKNOWN_OPTION[] =
|
|
|
|
|
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȃI<EFBFBD>v<EFBFBD>V<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n\n";
|
|
|
|
|
static const char ERROR_ALREADY_RESIDENT[] =
|
|
|
|
|
"<EFBFBD>킽<EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>łɂ<EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD>悧\n\n";
|
|
|
|
|
static const char ERROR_OUT_OF_MEMORY[] =
|
|
|
|
|
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>킽<EFBFBD><EFBFBD><EFBFBD>̋<EFBFBD><EFBFBD>ꏊ<EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>́I\n\n";
|
|
|
|
|
static const char INITIALIZED[] =
|
|
|
|
|
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł́A<EFBFBD><EFBFBD><EFBFBD>낵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>肢<EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD>\n\n";
|
|
|
|
|
|
2019-12-13 18:17:02 +00:00
|
|
|
|
seg_t sgm;
|
2015-09-16 03:02:29 +00:00
|
|
|
|
const char *res_id = MIKOConfig;
|
|
|
|
|
int i;
|
2019-12-30 14:48:17 +00:00
|
|
|
|
char far *resident;
|
2015-09-16 03:02:29 +00:00
|
|
|
|
|
|
|
|
|
sgm = resdata_exist(res_id, RES_ID_STRLEN, RES_PARASIZE);
|
|
|
|
|
dos_puts2(LOGO);
|
|
|
|
|
graph_clear();
|
|
|
|
|
// No, I tried all permutations of command-line switches,
|
|
|
|
|
// gotos and returns, and no pure C solution seems to work!
|
2019-12-26 15:07:35 +00:00
|
|
|
|
if(scoredat_verify() == 1) __asm {
|
|
|
|
|
push offset ds:ERROR_SCOREDAT
|
2015-09-16 03:02:29 +00:00
|
|
|
|
jmp error_puts
|
|
|
|
|
}
|
|
|
|
|
if(argc == 2) {
|
|
|
|
|
#define arg1_is(capital, small) \
|
|
|
|
|
(argv[1][0] == '-' || argv[1][0] == '/') \
|
|
|
|
|
&& (argv[1][1] == (capital) || argv[1][1] == (small))
|
|
|
|
|
if(arg1_is('R', 'r')) {
|
|
|
|
|
if(!sgm) {
|
|
|
|
|
dos_puts2(ERROR_NOT_RESIDENT);
|
|
|
|
|
asm jmp error_ret
|
|
|
|
|
}
|
|
|
|
|
dos_free(sgm);
|
|
|
|
|
dos_puts2(REMOVED);
|
|
|
|
|
return 0;
|
|
|
|
|
} else if(arg1_is('D', 'd')) {
|
|
|
|
|
debug = 1;
|
|
|
|
|
} else {
|
|
|
|
|
dos_puts2(ERROR_UNKNOWN_OPTION);
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(sgm) {
|
|
|
|
|
dos_puts2(ERROR_ALREADY_RESIDENT);
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
sgm = resdata_create(res_id, RES_ID_STRLEN, RES_PARASIZE);
|
|
|
|
|
if(!sgm) {
|
|
|
|
|
asm push offset ds:ERROR_OUT_OF_MEMORY
|
|
|
|
|
error_puts:
|
|
|
|
|
asm call near ptr dos_puts2
|
|
|
|
|
error_ret:
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
2019-12-30 14:48:17 +00:00
|
|
|
|
resident = MK_FP(sgm, 0);
|
2015-09-16 03:02:29 +00:00
|
|
|
|
dos_puts2(INITIALIZED);
|
|
|
|
|
for(i = offsetof(resident_t, stage); i < sizeof(resident_t); i++) {
|
2019-12-30 14:48:17 +00:00
|
|
|
|
resident[i] = 0;
|
2015-09-16 03:02:29 +00:00
|
|
|
|
}
|
|
|
|
|
cfg_write(sgm);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#pragma codestring "\x00"
|
|
|
|
|
|
|
|
|
|
#pragma option -O- -k-
|
|
|
|
|
|
|
|
|
|
extern char rank;
|
2019-12-26 15:07:35 +00:00
|
|
|
|
scoredat_section_t hi;
|
2015-09-16 03:02:29 +00:00
|
|
|
|
|
2019-12-26 15:07:35 +00:00
|
|
|
|
void pascal scoredat_recreate(void);
|
|
|
|
|
void pascal near scoredat_load(void);
|
2015-09-16 03:02:29 +00:00
|
|
|
|
|
|
|
|
|
unsigned char unused_1 = 0;
|
2019-12-26 15:07:35 +00:00
|
|
|
|
const char *SCOREDAT_FN = "huuhi.dat";
|
2015-09-16 03:02:29 +00:00
|
|
|
|
unsigned char g_name_first_sum = 0;
|
|
|
|
|
unsigned char stage_sum = 0;
|
|
|
|
|
unsigned char unused_2 = 0;
|
|
|
|
|
long points_sum = 0;
|
|
|
|
|
long score_sum = 0;
|
|
|
|
|
|
2019-12-26 15:07:35 +00:00
|
|
|
|
int pascal scoredat_verify(void)
|
2015-09-16 03:02:29 +00:00
|
|
|
|
{
|
2019-12-26 15:07:35 +00:00
|
|
|
|
if(!file_exist(SCOREDAT_FN)) {
|
|
|
|
|
scoredat_recreate();
|
2015-09-16 03:02:29 +00:00
|
|
|
|
} else {
|
|
|
|
|
for(rank = 0; rank < RANK_COUNT; rank++) {
|
|
|
|
|
register int unused;
|
|
|
|
|
register int i;
|
|
|
|
|
|
2019-12-26 15:07:35 +00:00
|
|
|
|
scoredat_load();
|
2015-09-16 03:02:29 +00:00
|
|
|
|
_AL = 0;
|
|
|
|
|
g_name_first_sum = _AL;
|
|
|
|
|
stage_sum = _AL;
|
|
|
|
|
_AX = 0;
|
|
|
|
|
asm {
|
|
|
|
|
mov word ptr points_sum + 0, ax
|
|
|
|
|
mov word ptr points_sum + 2, ax
|
|
|
|
|
mov word ptr score_sum + 0, ax
|
|
|
|
|
mov word ptr score_sum + 2, ax
|
|
|
|
|
}
|
|
|
|
|
for(i = 0; i < sizeof(hi.score); i++) {
|
|
|
|
|
score_sum += *((unsigned char*)(&hi.score) + i);
|
|
|
|
|
}
|
2019-12-26 15:07:35 +00:00
|
|
|
|
for(i = 0; i < SCOREDAT_PLACES; i++) {
|
2015-09-16 03:02:29 +00:00
|
|
|
|
points_sum += hi.score.points[i];
|
|
|
|
|
g_name_first_sum += hi.score.g_name[i][0];
|
|
|
|
|
stage_sum += hi.score.stage[i];
|
|
|
|
|
}
|
|
|
|
|
if(
|
|
|
|
|
points_sum != hi.score.points_sum
|
|
|
|
|
|| g_name_first_sum != hi.score.g_name_first_sum
|
|
|
|
|
|| stage_sum != hi.score.stage_sum
|
|
|
|
|
|| score_sum != hi.score_sum
|
|
|
|
|
) {
|
|
|
|
|
goto delete;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
delete:
|
2019-12-26 15:07:35 +00:00
|
|
|
|
file_delete(SCOREDAT_FN);
|
2015-09-16 03:02:29 +00:00
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#pragma codestring "\x90"
|