diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 67000544..832be135 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -220,6 +220,8 @@ declaration of the identifier in question. Currently, we know about the following [references]: +* `[Strings]`: The symbol name is mentioned in error or debug messages. Can be + easily verified by grepping over the ReC98 source tree. * `[MAGNet2010]`: Interview with ZUN for the NHK BS2 TV program MAG・ãƒãƒƒãƒˆ (MAG.Net), originally broadcast 2010-05-02. At 09m36s, ZUN's monitor briefly displays a piece of TH04's `MAIN.EXE`, handling demo recording and the setup diff --git a/Makefile.mak b/Makefile.mak index 2632fcb6..ccab0bcc 100644 --- a/Makefile.mak +++ b/Makefile.mak @@ -64,7 +64,7 @@ bin\th01\reiiden.exe: bin\piloadc.obj bin\th01\reiiden.obj th01\main_01.cpp th01 $** | -bin\th01\fuuin.exe: bin\piloadc.obj bin\th01\fuuin.obj th01\fuuin_02.cpp th01\fuuin_04.cpp th01\fuuin_05.c th01\fuuin_06.c th01\fuuin_07.c th01\fuuin_08.cpp th01\fuuin_09.c th01\fuuin_10.cpp th01\fuuin_11.c th01\fuuin_12.c th01\fuuin_13.c +bin\th01\fuuin.exe: bin\piloadc.obj bin\th01\fuuin.obj th01\fuuin_01.cpp th01\fuuin_02.cpp th01\fuuin_04.cpp th01\fuuin_05.c th01\fuuin_06.c th01\fuuin_07.c th01\fuuin_08.cpp th01\fuuin_09.c th01\fuuin_10.cpp th01\fuuin_11.c th01\fuuin_12.c th01\fuuin_13.c $(CC) $(CFLAGS) -ml -3 -DGAME=1 -DBINARY='E' -nbin\th01\ -eFUUIN.EXE @&&| $** | diff --git a/th01/end/vars.hpp b/th01/end/vars.hpp new file mode 100644 index 00000000..cb214346 --- /dev/null +++ b/th01/end/vars.hpp @@ -0,0 +1,10 @@ +extern long score; +extern long score_highest; +extern unsigned char rank; +extern long continues_total; +extern long continues_per_scene[SCENE_COUNT]; +extern char start_lives_extra; +extern char end_flag; /* ZUN symbol [Strings] */ + +// Resets all end-related data in the resident structure. Always returns true. +bool16 end_resident_clear(void); diff --git a/th01/fuuin_01.cpp b/th01/fuuin_01.cpp new file mode 100644 index 00000000..5fc8c8f1 --- /dev/null +++ b/th01/fuuin_01.cpp @@ -0,0 +1,79 @@ +/* ReC98 + * ----- + * Code segment #1 of TH01's FUUIN.EXE + */ + +#pragma option -O- -1 + +extern "C" { +#include +#include "th01/th01.h" +#include "th01/ranks.h" +#include "th01/end/vars.hpp" + +#undef RES_ID +#undef RES_ID_STRLEN +#define RES_ID_STRLEN (sizeof("ReiidenConfig") - 1) + +bool16 end_init(void) +{ + int i; + #define RES_ID RES_ID_0 + extern const char RES_ID[]; + seg_t sgm = resdata_exist(RES_ID, RES_ID_STRLEN, RES_PARASIZE); + #undef RES_ID + if(sgm) { + resident_t* resident = reinterpret_cast(MK_FP(sgm, 0)); + if(resident->end_flag) { + score = resident->score; + continues_total = 0; + end_flag = resident->end_flag; + rank = resident->rank; + score_highest = resident->score_highest; + + for(i = 0; i < SCENE_COUNT; i++) { + continues_per_scene[i] = resident->continues_per_scene[i]; + resident->continues_per_scene[i] = 0; + continues_total += continues_per_scene[i]; + } + + random_seed = resident->rand; + start_lives_extra = resident->start_lives_extra; + resident->score = 0; + resident->continues_total = 0; + resident->score_highest = 0; + } else { + extern const char ERROR_END_FLAG[]; + puts(ERROR_END_FLAG); + return false; + } + } else { + extern const char ERROR_NO_RESDATA[]; + puts(ERROR_NO_RESDATA); + return false; + } + return true; +} + +bool16 end_resident_clear(void) +{ + int i; + #define RES_ID RES_ID_1 + extern const char RES_ID[]; + seg_t sgm = resdata_exist(RES_ID, RES_ID_STRLEN, RES_PARASIZE); + #undef RES_ID + if(sgm) { + resident_t* resident = reinterpret_cast(MK_FP(sgm, 0)); + resident->score = 0; + resident->continues_total = 0; + resident->end_flag = 0; + resident->score_highest = 0; + for(i = 0; i < SCENE_COUNT; i++) { + resident->continues_per_scene[i] = 0; + } + resident->stage = 0; + } + return true; +} + +} diff --git a/th01/th01.h b/th01/th01.h index c16513b3..ba796104 100644 --- a/th01/th01.h +++ b/th01/th01.h @@ -35,7 +35,7 @@ typedef struct { char bgm_mode; // 0 = off, 1 = FM char bombs; char start_lives_extra; // Add 2 for the actual number of lives - char end_flag; + char end_flag; /* ZUN symbol [Strings] */ char unused_1; char route; char rem_lives; @@ -46,7 +46,7 @@ typedef struct { long rand; long score; long continues_total; - int continues_per_scene[SCENE_COUNT]; + unsigned int continues_per_scene[SCENE_COUNT]; long bonus_per_stage[STAGES_PER_SCENE]; // of the current scene int stage; long hiscore; diff --git a/th01/th01.inc b/th01/th01.inc index b2fd1c96..d65398e7 100644 --- a/th01/th01.inc +++ b/th01/th01.inc @@ -27,6 +27,8 @@ _w WORDREGS _h BYTEREGS REGS ends +SCENE_COUNT = 4 + reiidenconfig_t struc ; (sizeof=0x4B) id db 13 dup(?) ; = "ReiidenConfig" db ? diff --git a/th01_fuuin.asm b/th01_fuuin.asm index a9c1cead..e4f633de 100644 --- a/th01_fuuin.asm +++ b/th01_fuuin.asm @@ -55,6 +55,8 @@ include th01/th01.inc extern _strcpy:proc extern _vsprintf:proc +fuuin_01 group fuuin_01_TEXT, fuuin_01__TEXT + ; =========================================================================== ; Segment type: Pure code @@ -88,206 +90,13 @@ _TEXT ends ; Segment type: Pure code fuuin_01_TEXT segment byte public 'CODE' use16 - assume cs:fuuin_01_TEXT - ;org 9 - assume es:nothing, ss:nothing, ds:_DATA, fs:nothing, gs:nothing +fuuin_01_TEXT ends -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_9F49 proc far - -var_4 = dword ptr -4 - - enter 4, 0 - push si - push di - push ds - push offset aReiidenconfig ; "ReiidenConfig" - push 0Dh - push 5 - call resdata_exist - mov di, ax - or di, di - jnz short loc_9F65 - jmp loc_A05D -; --------------------------------------------------------------------------- - -loc_9F65: - mov word ptr [bp+reiidenconfig+2], di - mov word ptr [bp+reiidenconfig], 0 - les bx, [bp+reiidenconfig] - cmp es:[bx+reiidenconfig_t.end_flag], 0 - jnz short loc_9F7A - jmp loc_A053 -; --------------------------------------------------------------------------- - -loc_9F7A: - les bx, [bp+reiidenconfig] - mov dx, word ptr es:[bx+reiidenconfig_t.score+2] - mov ax, word ptr es:[bx+reiidenconfig_t.score] - mov word ptr _score+2, dx - mov word ptr _score, ax - mov word ptr _continues_total+2, 0 - mov word ptr _continues_total, 0 - les bx, [bp+reiidenconfig] - mov al, es:[bx+reiidenconfig_t.end_flag] - mov byte_14021, al - les bx, [bp+reiidenconfig] - mov al, es:[bx+reiidenconfig_t.rank] - mov _rank, al - les bx, [bp+reiidenconfig] - mov dx, word ptr es:[bx+reiidenconfig_t.score_highest+2] - mov ax, word ptr es:[bx+reiidenconfig_t.score_highest] - mov word ptr _score_highest+2, dx - mov word ptr _score_highest, ax - xor si, si - jmp short loc_A003 -; --------------------------------------------------------------------------- - -loc_9FC2: - mov ax, si - add ax, ax - les bx, [bp+reiidenconfig] - add bx, ax - mov ax, es:[bx+reiidenconfig_t.continues_per_scene] - mov bx, si - shl bx, 2 - mov word ptr [bx+143Eh], 0 - mov [bx+143Ch], ax - mov ax, si - add ax, ax - les bx, [bp+reiidenconfig] - add bx, ax - mov es:[bx+reiidenconfig_t.continues_per_scene], 0 - mov bx, si - shl bx, 2 - mov dx, [bx+143Eh] - mov ax, [bx+143Ch] - add word ptr _continues_total, ax - adc word ptr _continues_total+2, dx - inc si - -loc_A003: - cmp si, 4 - jl short loc_9FC2 - les bx, [bp+reiidenconfig] - mov dx, word ptr es:[bx+reiidenconfig_t.rand+2] - mov ax, word ptr es:[bx+reiidenconfig_t.rand] - mov word ptr random_seed+2, dx - mov word ptr random_seed, ax - les bx, [bp+reiidenconfig] - mov al, es:[bx+reiidenconfig_t.start_lives_extra] - mov byte_14020, al - les bx, [bp+reiidenconfig] - mov word ptr es:[bx+reiidenconfig_t.score+2], 0 - mov word ptr es:[bx+reiidenconfig_t.score], 0 - les bx, [bp+reiidenconfig] - mov word ptr es:[bx+reiidenconfig_t.continues_total+2], 0 - mov word ptr es:[bx+reiidenconfig_t.continues_total], 0 - les bx, [bp+reiidenconfig] - mov word ptr es:[bx+reiidenconfig_t.score_highest+2], 0 - mov word ptr es:[bx+reiidenconfig_t.score_highest], 0 - jmp short loc_A05B -; --------------------------------------------------------------------------- - -loc_A053: - push ds - push offset aErrorEnd_flagI ; "ERROR : end_flag is not ture !!" - jmp short loc_A061 -; --------------------------------------------------------------------------- - jmp short loc_A069 -; --------------------------------------------------------------------------- - -loc_A05B: - jmp short loc_A06D -; --------------------------------------------------------------------------- - -loc_A05D: - push ds - push offset s ; "ERROR : cfg_id is not alloc!!" - -loc_A061: - call _puts - add sp, 4 - -loc_A069: - xor ax, ax - jmp short loc_A072 -; --------------------------------------------------------------------------- - -loc_A06D: - mov ax, 1 - jmp short $+2 - -loc_A072: - pop di - pop si - leave - retf -sub_9F49 endp - - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_A076 proc far - -reiidenconfig = dword ptr -4 - - enter 4, 0 - push si - push di - push ds - push offset aReiidenconfi_0 ; "ReiidenConfig" - push 0Dh - push 5 - call resdata_exist - mov di, ax - or di, di - jz short loc_A0EE - mov word ptr [bp+reiidenconfig+2], di - mov word ptr [bp+reiidenconfig], 0 - les bx, [bp+reiidenconfig] - mov word ptr es:[bx+reiidenconfig_t.score+2], 0 - mov word ptr es:[bx+reiidenconfig_t.score], 0 - les bx, [bp+reiidenconfig] - mov word ptr es:[bx+reiidenconfig_t.continues_total+2], 0 - mov word ptr es:[bx+reiidenconfig_t.continues_total], 0 - les bx, [bp+reiidenconfig] - mov es:[bx+reiidenconfig_t.end_flag], 0 - les bx, [bp+reiidenconfig] - mov word ptr es:[bx+reiidenconfig_t.score_highest+2], 0 - mov word ptr es:[bx+reiidenconfig_t.score_highest], 0 - xor si, si - jmp short loc_A0E0 -; --------------------------------------------------------------------------- - -loc_A0D0: - mov ax, si - add ax, ax - les bx, [bp+reiidenconfig] - add bx, ax - mov es:[bx+reiidenconfig_t.continues_per_scene], 0 - inc si - -loc_A0E0: - cmp si, 4 - jl short loc_A0D0 - les bx, [bp+reiidenconfig] - mov es:[bx+reiidenconfig_t.stage], 0 - -loc_A0EE: - mov ax, 1 - jmp short $+2 - pop di - pop si - leave - retf -sub_A076 endp +fuuin_01__TEXT segment byte public 'CODE' use16 + assume cs:fuuin_01 + extern _end_init:proc + extern _end_resident_clear:proc ; =============== S U B R O U T I N E ======================================= @@ -317,7 +126,7 @@ loc_A105: cbw cmp ax, 74h ; 't' jz short loc_A121 - call sub_9F49 + call _end_init or ax, ax jnz short loc_A11F pop bp @@ -335,12 +144,12 @@ loc_A121: cbw cmp ax, 31h ; '1' jnz short loc_A139 - mov byte_14021, 1 + mov _end_flag, 1 jmp short loc_A13E ; --------------------------------------------------------------------------- loc_A139: - mov byte_14021, 2 + mov _end_flag, 2 loc_A13E: call _mdrv2_check_board @@ -359,7 +168,7 @@ loc_A13E: retf _main endp -fuuin_01_TEXT ends +fuuin_01__TEXT ends ; =========================================================================== @@ -727,7 +536,7 @@ sub_BC7C proc near call grp_palette_white_in pascal, 5 call _frame_delay stdcall, 120 pop cx - cmp byte_14021, 2 + cmp _end_flag, 2 jnz short loc_BCFC push 40h push 10h @@ -892,7 +701,7 @@ loc_BE64: cmp si, 0Ah jl short loc_BE41 call grp_palette_settone pascal, 200 - cmp byte_14021, 1 + cmp _end_flag, 1 jnz short loc_BE7D call sub_BF07 jmp short loc_BE80 @@ -1054,7 +863,7 @@ sub_C03D proc near call _mdrv2_bgm_load add sp, 4 call _mdrv2_bgm_play - cmp byte_14021, 1 + cmp _end_flag, 1 jnz short loc_C074 push ds push offset aEndb_a_grp ; "endb_a.grp" @@ -1075,7 +884,7 @@ loc_C078: call graph_type_ank pascal, 272, 316, 13, ds, offset aStage5Boss ; "STAGE 5 BOSS" call graph_type_ank pascal, 232, 348, 22, ds, offset aGatekeeperSing ; "Gatekeeper 'SinGyoku'" call sub_C009 pascal, 1 - cmp byte_14021, 1 + cmp _end_flag, 1 jnz short loc_C0E1 call graph_type_ank pascal, 272, 316, 13, ds, offset aStage10Boss ; "STAGE 10 BOSS" push 232 @@ -1097,7 +906,7 @@ loc_C0E1: loc_C0FE: call graph_type_ank call sub_C009 pascal, 2 - cmp byte_14021, 1 + cmp _end_flag, 1 jnz short loc_C12E call graph_type_ank pascal, 272, 316, 13, ds, offset aStage15Boss ; "STAGE 15 BOSS" push 232 @@ -1119,7 +928,7 @@ loc_C12E: loc_C14B: call graph_type_ank call sub_C009 pascal, 3 - cmp byte_14021, 1 + cmp _end_flag, 1 jnz short loc_C17B call graph_type_ank pascal, 272, 316, 13, ds, offset aStage20Boss ; "STAGE 20 BOSS" push 232 @@ -1431,12 +1240,12 @@ loc_C390: sub si, 0Ah loc_C39A: - cmp byte_14021, 2 + cmp _end_flag, 2 jnz short loc_C3A4 add si, 5 loc_C3A4: - mov al, byte_14020 + mov al, _start_lives_extra cbw cmp ax, 4 jnz short loc_C3B2 @@ -1445,7 +1254,7 @@ loc_C3A4: ; --------------------------------------------------------------------------- loc_C3B2: - mov al, byte_14020 + mov al, _start_lives_extra cbw cmp ax, 3 jnz short loc_C3C0 @@ -1454,7 +1263,7 @@ loc_C3B2: ; --------------------------------------------------------------------------- loc_C3C0: - mov al, byte_14020 + mov al, _start_lives_extra cbw cmp ax, 1 jnz short loc_C3CE @@ -1463,7 +1272,7 @@ loc_C3C0: ; --------------------------------------------------------------------------- loc_C3CE: - cmp byte_14020, 0 + cmp _start_lives_extra, 0 jnz short loc_C3D8 add si, 0Ah @@ -1612,8 +1421,8 @@ var_10 = byte ptr -10h add sp, 0Ah call _frame_delay stdcall, 30 pop cx - push word_13EDE - push word_13EDC ; arglist + push word ptr _continues_per_scene[0 * dword] + 2 + push word ptr _continues_per_scene[0 * dword] push ds push offset aB@r_oB@b@b@b@b ; "@_ŽÐ@@@@i‚P–Ê`‚T–Êj @ %3lu" push 0Fh ; int @@ -1623,18 +1432,18 @@ var_10 = byte ptr -10h add sp, 0Eh call _frame_delay stdcall, 30 pop cx - cmp byte_14021, 1 + cmp _end_flag, 1 jnz short loc_C590 - push word_13EE2 - push word_13EE0 + push word ptr _continues_per_scene[1 * dword] + 2 + push word ptr _continues_per_scene[1 * dword] push ds push offset aB@gqbGgb@b@b@b ; "@ƒQ[ƒg@@@i‚U–Ê`‚P‚O–Êj %3lu" jmp short loc_C59C ; --------------------------------------------------------------------------- loc_C590: - push word_13EE2 - push word_13EE0 ; arglist + push word ptr _continues_per_scene[1 * dword] + 2 + push word ptr _continues_per_scene[1 * dword] push ds push offset aB@tkb@b@b@b@b@ ; "@âK@@@@@i‚U–Ê`‚P‚O–Êj %3lu" @@ -1646,18 +1455,18 @@ loc_C59C: add sp, 0Eh call _frame_delay stdcall, 30 pop cx - cmp byte_14021, 1 + cmp _end_flag, 1 jnz short loc_C5C9 - push word_13EE6 - push word_13EE4 + push word ptr _continues_per_scene[2 * dword] + 2 + push word ptr _continues_per_scene[2 * dword] push ds push offset aGfgbgivFpBivpv ; " ƒ”ƒBƒi‚Ì”pšÐi‚P‚P–Ê`‚P‚T–Êj%3lu" jmp short loc_C5D5 ; --------------------------------------------------------------------------- loc_C5C9: - push word_13EE6 - push word_13EE4 ; arglist + push word ptr _continues_per_scene[2 * dword] + 2 + push word ptr _continues_per_scene[2 * dword] push ds push offset aB@ikvXekeb@b@b ; "@‰Š‚Ì•…ŠE@@i‚P‚P–Ê`‚P‚T–Êj%3lu" @@ -1669,18 +1478,18 @@ loc_C5D5: add sp, 0Eh call _frame_delay stdcall, 30 pop cx - cmp byte_14021, 1 + cmp _end_flag, 1 jnz short loc_C602 - push word_13EEA - push word_13EE8 + push word ptr _continues_per_scene[3 * dword] + 2 + push word ptr _continues_per_scene[3 * dword] push ds push offset aSVVVsr_uabivpv ; " ‘‚¿‚½‚é_“ai‚P‚T–Ê`‚Q‚O–Êj%3lu" jmp short loc_C60E ; --------------------------------------------------------------------------- loc_C602: - push word_13EEA - push word_13EE8 ; arglist + push word ptr _continues_per_scene[3 * dword] + 2 + push word ptr _continues_per_scene[3 * dword] push ds push offset aB@rVivVsr_uabi ; "@©‚È‚é_“ai‚P‚T–Ê`‚Q‚O–Êj%3lu" @@ -1692,7 +1501,7 @@ loc_C60E: add sp, 0Eh call _frame_delay stdcall, 30 pop cx - cmp byte_14021, 1 + cmp _end_flag, 1 jnz short loc_C63B push word ptr _continues_total+2 push word ptr _continues_total @@ -1765,7 +1574,7 @@ loc_C6C7: mov _z_Palettes[7 * 3].g, 0Fh mov _z_Palettes[7 * 3].b, 0Fh call _z_palette_set_all_show c, offset _z_Palettes, ds - cmp byte_14021, 1 + cmp _end_flag, 1 jnz short loc_C71C push ds push offset aKo ; "Š®" @@ -1783,7 +1592,7 @@ loc_C722: push word ptr _score call _regist add sp, 0Ah - call sub_A076 + call _end_resident_clear pop si leave retf @@ -1896,13 +1705,14 @@ fuuin_13_TEXT ends .data +public _score, _score_highest +public _RES_ID_0, _RES_ID_1, _ERROR_END_FLAG, _ERROR_NO_RESDATA _score dd 100000 _score_highest dd 100000 -aReiidenconfig db 'ReiidenConfig',0 -aErrorEnd_flagI db 'ERROR : end_flag is not ture !!',0 -; char s[] -s db 'ERROR : cfg_id is not alloc!!',0 -aReiidenconfi_0 db 'ReiidenConfig',0 +_RES_ID_0 db 'ReiidenConfig',0 +_ERROR_END_FLAG db 'ERROR : end_flag is not ture !!',0 +_ERROR_NO_RESDATA db 'ERROR : cfg_id is not alloc!!',0 +_RES_ID_1 db 'ReiidenConfig',0 ; char path[] path db 'op',0 ; char arg0[3] @@ -2059,23 +1869,13 @@ include libs/master.lib/rand[data].asm .data? ; TODO: Missing clip[bss].asm (16 bytes) somewhere in there... +public _continues_total, _continues_per_scene _continues_total dd ? -; char word_13EDC[] -word_13EDC dw ? -word_13EDE dw ? -; char word_13EE0[] -word_13EE0 dw ? -word_13EE2 dw ? -; char word_13EE4[] -word_13EE4 dw ? -word_13EE6 dw ? -; char word_13EE8[] -word_13EE8 dw ? -word_13EEA dw ? +_continues_per_scene dd SCENE_COUNT dup(?) db 308 dup(?) -byte_14020 db ? -byte_14021 db ? -public _rank +public _start_lives_extra, _end_flag, _rank +_start_lives_extra db ? +_end_flag db ? ; ZUN symbol [Strings] _rank db ? db ? include th01/hiscore/hiscore[bss].asm