diff --git a/examples/youkai_douchuuki/password.c b/examples/youkai_douchuuki/password.c index a071916..22da892 100644 --- a/examples/youkai_douchuuki/password.c +++ b/examples/youkai_douchuuki/password.c @@ -162,6 +162,7 @@ static const wchar_t g_alphabet_ch[ALPHABET_SIZE] = { // taken from https://tcrf.net/Youkai_Douchuki_(TurboGrafx-16) static const wchar_t *g_known_passwords[] = { + L"HARUHISA.UDAGAWA", L"PC-ENGINE", L"NAMCO", L"NAMCOT", @@ -185,12 +186,11 @@ static const wchar_t *g_known_passwords[] = { L"UDADAGAWA", L"818-6104", L"HENTAIOSUGI", - L"なむこむな!756-2311", L"KUMI.HANAOKA", - L"HARUHISA.UDAGAWA", L"NEC", L"KID", - L"MIZUNO" + L"MIZUNO", + L"なむこむな!756-2311" }; static const size_t g_known_passwords_count = sizeof(g_known_passwords) / sizeof(g_known_passwords[0]); @@ -237,7 +237,7 @@ void password_extract(const uint8_t *data, size_t size, password_info_t **out, s if(ptr[2] == 0) { break; } else { - if(n > capacity) { + if(n >= capacity) { capacity *= 2; infos = (password_info_t*)realloc(infos, capacity * sizeof(password_info_t)); } @@ -274,6 +274,12 @@ void core_reset(core_t *core) { core->sp = 0xff; } +void core_clear_registers(core_t *core) { + core->a = core->x = core->y = 0; + memset(&core->st, 0, sizeof(status_t)); + core->sp = 0xff; +} + uint8_t* mem_addr(core_t *core, uint16_t addr) { return &core->mem[addr-RAM_START]; } void in_(core_t *core, uint8_t *ptr) { @@ -508,7 +514,7 @@ void password_encode(core_t *core) { } while(core->x < len); } -#define JOB_COUNT 8 +#define JOB_COUNT 16 atomic_bool g_searching = true; atomic_uint g_code_id = 0; @@ -532,7 +538,7 @@ void* job_routine(void *arg) { hash = mem_addr(&core, PASSWORD_HASH_ADDR); pthread_mutex_lock(&g_lock); - int id = g_code_id; + unsigned int id = g_code_id; *len = infos[id].len; for(unsigned int j=0; j<*len; j++) { g_code[j] = (g_code[j]+1) % ALPHABET_SIZE; @@ -564,6 +570,7 @@ void* job_routine(void *arg) { ++g_code_id; g_searching = (g_code_id < g_code_count); } + fflush(stdout); pthread_mutex_unlock(&g_lock); } } @@ -575,7 +582,7 @@ int main() { password_info_t *password_infos = NULL; size_t password_count = 0; - + password_extract(g_blob, g_blob_size, &password_infos, &password_count); // remove known passwords @@ -587,10 +594,12 @@ int main() { core_reset(&core); string_to_code(g_known_passwords[j], str, len); + bool found = false; size_t i; for(i=0; i