From 59308f6658604dd5cef6e40b1e65ac65aee6513e Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 3 Nov 2016 00:57:01 +0100 Subject: [PATCH] Fixed two recompiler bugs pointed out by mooch; Fixed corruption on 86F recompression; Fixed CRC64 calculation on 86F writeback. --- src/codegen_x86-64.h | 2 +- src/codegen_x86.h | 2 +- src/disc_86f.c | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/codegen_x86-64.h b/src/codegen_x86-64.h index f8b055751..a52a913ef 100644 --- a/src/codegen_x86-64.h +++ b/src/codegen_x86-64.h @@ -20,5 +20,5 @@ enum #define NR_HOST_REGS 4 extern int host_reg_mapping[NR_HOST_REGS]; -#define NR_HOST_XMM_REGS 7 +#define NR_HOST_XMM_REGS 8 extern int host_reg_xmm_mapping[NR_HOST_XMM_REGS]; diff --git a/src/codegen_x86.h b/src/codegen_x86.h index ca2d4ef87..e1d2da768 100644 --- a/src/codegen_x86.h +++ b/src/codegen_x86.h @@ -17,7 +17,7 @@ enum #define NR_HOST_REGS 4 extern int host_reg_mapping[NR_HOST_REGS]; -#define NR_HOST_XMM_REGS 7 +#define NR_HOST_XMM_REGS 8 extern int host_reg_xmm_mapping[NR_HOST_XMM_REGS]; extern uint32_t mem_load_addr_ea_b; diff --git a/src/disc_86f.c b/src/disc_86f.c index e329d07f9..3fbd88ebb 100644 --- a/src/disc_86f.c +++ b/src/disc_86f.c @@ -2609,6 +2609,7 @@ void d86f_writeback(int drive) fseek(d86f[drive].f, 0, SEEK_END); len = ftell(d86f[drive].f); + len -= header_size; fseek(d86f[drive].f, header_size, SEEK_SET); @@ -2637,8 +2638,10 @@ void d86f_writeback(int drive) fseek(cf, 8, SEEK_SET); fwrite(&crc64, 1, 8, cf); + fseek(cf, 0, SEEK_SET); d86f[drive].filebuf = (uint8_t *) malloc(len); fread(d86f[drive].filebuf, 1, len, cf); + *(uint64_t *) &(d86f[drive].filebuf[8]) = 0xffffffffffffffff; crc64 = (uint64_t) crc64speed(0, d86f[drive].filebuf, len); free(d86f[drive].filebuf); @@ -2660,8 +2663,10 @@ void d86f_writeback(int drive) fseek(d86f[drive].f, 8, SEEK_SET); fwrite(&crc64, 1, 8, d86f[drive].f); + fseek(d86f[drive].f, 0, SEEK_SET); d86f[drive].filebuf = (uint8_t *) malloc(len); fread(d86f[drive].filebuf, 1, len, d86f[drive].f); + *(uint64_t *) &(d86f[drive].filebuf[8]) = 0xffffffffffffffff; crc64 = (uint64_t) crc64speed(0, d86f[drive].filebuf, len); free(d86f[drive].filebuf);