TA_context* read_frame(const char* file, u8* vram_ref) { FILE* fw = fopen(file, "rb"); char id0[8] = { 0 }; u32 t = 0; u32 t2 = 0; fread(id0, 1, 8, fw); if (memcmp(id0, "TAFRAME3", 8) != 0) { fclose(fw); return 0; } TA_context* ctx = tactx_Alloc(); ctx->Reset(); ctx->tad.Clear(); fread(&ctx->rend.isRTT, 1, sizeof(ctx->rend.isRTT), fw); fread(&ctx->rend.isAutoSort, 1, sizeof(ctx->rend.isAutoSort), fw); fread(&ctx->rend.fb_X_CLIP.full, 1, sizeof(ctx->rend.fb_X_CLIP.full), fw); fread(&ctx->rend.fb_Y_CLIP.full, 1, sizeof(ctx->rend.fb_Y_CLIP.full), fw); fread(ctx->rend.global_param_op.head(), 1, sizeof(PolyParam), fw); fread(ctx->rend.verts.head(), 1, 4 * sizeof(Vertex), fw); fread(&t, 1, sizeof(t), fw); verify(t == VRAM_SIZE); vram.UnLockRegion(0, VRAM_SIZE); fread(&t2, 1, sizeof(t), fw); u8* gz_stream = (u8*)malloc(t2); fread(gz_stream, 1, t2, fw); uncompress(vram.data, (uLongf*)&t, gz_stream, t2); free(gz_stream); fread(&t, 1, sizeof(t), fw); fread(&t2, 1, sizeof(t), fw); gz_stream = (u8*)malloc(t2); fread(gz_stream, 1, t2, fw); uncompress(ctx->tad.thd_data, (uLongf*)&t, gz_stream, t2); free(gz_stream); ctx->tad.thd_data += t; fclose(fw); return ctx; }
static TA_context* tactx_Find(u32 addr, bool allocnew) { TA_context *rv = NULL; for (size_t i=0; i<ctx_list.size(); i++) { if (ctx_list[i]->Address==addr) return ctx_list[i]; } if (!allocnew) return 0; rv = tactx_Alloc(); rv->Address=addr; ctx_list.push_back(rv); return rv; }