Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define G_TEXTURE_ENABLE 0x000002
- #define G_SHADING_SMOOTH 0x000200
- #define G_CULL_FRONT 0x001000
- #define G_CULL_BACK 0x002000
- #define G_CLIPPING 0x800000
- #define G_MWO_aLIGHT_1 0
- #define G_MWO_aLIGHT_2 0x20
- #define G_MWO_aLIGHT_3 0x40
- #define G_MWO_aLIGHT_4 0x60
- #define G_MWO_aLIGHT_5 0x80
- #define G_MWO_aLIGHT_6 0xa0
- #define G_MWO_aLIGHT_7 0xc0
- #define G_MWO_aLIGHT_8 0xe0
- #define G_MW_NUMLIGHT 2
- #define G_MW_LIGHTCOL 0xA
- #define G_MOVEMEM 3
- #define G_VTX 4
- #define G_DL 6
- #define G_CLEARGEOMETRYMODE 0xB6
- #define G_SETGEOMETRYMODE 0xB7
- #define G_ENDDL 0xB8
- #define G_SETOTHERMODE_L 0xB9
- #define G_SETOTHERMODE_H 0xBA
- #define G_TEXTURE 0xBB
- #define G_MOVEWORD 0xBC
- #define G_TRI1 0xBF
- #define read24(pointer) (unsigned int)((RAM[pointer]<<16)|(RAM[pointer+1]<<8)|RAM[pointer+2])
- #define write24(data) \
- { \
- OUT[pointer]=data>>16; \
- OUT[pointer+1]=(data>>8)&0xFF; \
- OUT[pointer+2]=data&0xFF; \
- }
- #define read32(pointer) (unsigned int)((RAM[pointer]<<24)|(RAM[pointer+1]<<16)|(RAM[pointer+2]<<8)|RAM[pointer+3])
- #define write32(data) \
- { \
- OUT[pointer]=data>>24; \
- OUT[pointer+1]=(data>>16)&0xFF; \
- OUT[pointer+2]=(data>>8)&0xFF; \
- OUT[pointer+3]=data&0xFF; \
- }
- #define ROM_PATCH(data) \
- { \
- RAM[data]=(read24(data)+offset)>>16; \
- RAM[data+1]=((read24(data)+offset)>>8)&0xFF; \
- RAM[data+2]=(read24(data)+offset)&0xFF; \
- }
- #include <stdio.h>
- int main(int argc, char **argv)
- {
- unsigned char gbi_table[0x10]={ 4, 6, 2, 0xF1, 0xE1, 8, 0xD9, 0xD9,
- 0xDF, 0xE2, 0xE3, 0xD7, 0xDB, 0xD8, 3, 5};
- int BIG_LIST[0x1388], OPA[0x78]={0}, XLU[0x78]={0}, pointer=0, loop, loop2, map;
- unsigned int geometry_mode;
- int offset,end2, inst, n, v;
- FILE *ROM=fopen(argv[1],"rb");
- fseek(ROM,0,SEEK_END);
- int end=ftell(ROM);
- fseek(ROM,0,SEEK_SET);
- unsigned char *RAM=malloc(end);
- fread(RAM,1,end,ROM);
- fclose(ROM);
- unsigned char *OUT=calloc(0x40000,1);
- printf("Overdump offset: ");
- scanf("%x",&map);
- printf("Bytes inserted: ");
- scanf("%x",&offset);
- unsigned char gbi=0, BIG_COUNT=0, OPA_COUNT=0, XLU_COUNT=0;
- inst=map;
- while(gbi!=0xA)
- {
- gbi=RAM[inst];
- inst+=8;
- }
- pointer=read24(inst-3)+map;
- ROM_PATCH(inst-3);
- goto mesh_handler;
- process_dlist:
- printf("adddlist 0x03%06x\n",inst-map+offset);
- while(gbi!=G_ENDDL)
- {
- gbi=RAM[inst];
- switch(gbi)
- {
- case G_VTX:
- OUT[pointer]=1;
- pointer+=1;
- geometry_mode=read24(inst+1);
- n=(geometry_mode>>10)&0x3F;
- v=(geometry_mode>>17);
- v+=n;
- geometry_mode=(n<<12)|(v<<1);
- write24(geometry_mode);
- pointer+=3;
- write32(read32(inst+4));
- pointer+=7;
- break;
- case G_CLEARGEOMETRYMODE:
- case G_SETGEOMETRYMODE:
- OUT[pointer]=0xD9;
- pointer+=1;
- geometry_mode=read24(inst+5);
- if((geometry_mode&0x000002)==G_TEXTURE_ENABLE)
- {
- printf("We shouldn't encounter this.\n");
- geometry_mode=(geometry_mode^G_TEXTURE_ENABLE);
- }
- if((geometry_mode&0x000200)==G_SHADING_SMOOTH)
- {
- geometry_mode=(geometry_mode^G_SHADING_SMOOTH);
- geometry_mode|=0x200000;
- }
- if((geometry_mode&0x001000)==G_CULL_FRONT)
- {
- geometry_mode=(geometry_mode^G_CULL_FRONT);
- geometry_mode|=0x000200;
- }
- if((geometry_mode&0x002000)==G_CULL_BACK)
- {
- geometry_mode=(geometry_mode^G_CULL_BACK);
- geometry_mode|=0x000400;
- }
- if((geometry_mode&0x800000)==G_CLIPPING)
- {
- geometry_mode=(geometry_mode^G_CLIPPING);
- }
- if(gbi==G_CLEARGEOMETRYMODE)
- {
- write24(0xFFFFFF-geometry_mode);
- pointer+=7;
- }
- if(gbi==G_SETGEOMETRYMODE)
- {
- write24(0xFFFFFF);
- pointer+=4;
- write24(geometry_mode);
- pointer+=3;
- }
- break;
- case G_TRI1:
- OUT[pointer]=5;
- OUT[pointer+1]=RAM[inst+5];
- OUT[pointer+2]=RAM[inst+6];
- OUT[pointer+3]=RAM[inst+7];
- break;
- default:
- OUT[pointer]=gbi;
- if(gbi<0xE4&&gbi>=0xB0)
- {
- OUT[pointer]=gbi_table[gbi-0xB0];
- }
- for(loop=1;loop<8;loop+=1)
- {
- OUT[pointer+loop]=RAM[inst+loop];
- }
- if(gbi==G_MOVEMEM)
- {
- printf("Unhandled movemem %08X\n",pointer);
- }
- if(gbi==G_DL)
- {
- OUT[pointer]=0xDE;
- }
- if(gbi==G_SETOTHERMODE_L||gbi==G_SETOTHERMODE_H)
- {
- OUT[pointer+2]=0x20-(RAM[inst+2]+RAM[inst+3]);
- OUT[pointer+3]=RAM[inst+3]-1;
- }
- if(gbi==G_TEXTURE)
- {
- OUT[pointer+3]=RAM[inst+3]<<1;
- }
- if(gbi==G_MOVEWORD)
- {
- printf("Moveword %08X\n",pointer);
- switch(RAM[inst+3])
- {
- case G_MW_NUMLIGHT:
- OUT[pointer+3]=0;
- OUT[pointer+1]=G_MW_NUMLIGHT;
- geometry_mode=((read32(inst+4)-0x80000000)>>5)-1;
- geometry_mode=geometry_mode*24;
- pointer+=4;
- write32(geometry_mode);
- break;
- case G_MW_LIGHTCOL:
- OUT[pointer+3]=0;
- OUT[pointer+1]=G_MW_LIGHTCOL;
- geometry_mode=RAM[inst+2];
- if(geometry_mode==G_MWO_aLIGHT_1)
- {
- OUT[pointer+2]=0;
- OUT[pointer+3]=(geometry_mode/0x20)*0x18;
- }
- else if(geometry_mode==G_MWO_aLIGHT_2)
- {
- OUT[pointer+2]=0;
- OUT[pointer+3]=(geometry_mode/0x20)*0x18;
- }
- else if(geometry_mode==G_MWO_aLIGHT_3)
- {
- OUT[pointer+2]=0;
- OUT[pointer+3]=(geometry_mode/0x20)*0x18;
- }
- else if(geometry_mode==G_MWO_aLIGHT_4)
- {
- OUT[pointer+2]=0;
- OUT[pointer+3]=(geometry_mode/0x20)*0x18;
- }
- else if(geometry_mode==G_MWO_aLIGHT_5)
- {
- OUT[pointer+2]=0;
- OUT[pointer+3]=(geometry_mode/0x20)*0x18;
- }
- else if(geometry_mode==G_MWO_aLIGHT_6)
- {
- OUT[pointer+2]=0;
- OUT[pointer+3]=(geometry_mode/0x20)*0x18;
- }
- else if(geometry_mode==G_MWO_aLIGHT_7)
- {
- OUT[pointer+2]=0;
- OUT[pointer+3]=(geometry_mode/0x20)*0x18;
- }
- else if(geometry_mode==G_MWO_aLIGHT_8)
- {
- OUT[pointer+2]=0;
- OUT[pointer+3]=(geometry_mode/0x20)*0x18;
- }
- else
- {
- printf("Unhandled light color.\n");
- }
- break;
- default:
- OUT[pointer+3]=0;
- OUT[pointer+1]=RAM[inst+3];
- printf("Unhandled moveword %08X\n",pointer);
- break;
- }
- }
- break;
- }
- inst+=8;
- pointer=inst-map;
- switch(gbi) //RECALCULATE THE POINTERS
- {
- case 4:
- case 6:
- case 0xFD:
- if(OUT[pointer-4]==3)
- {
- pointer-=3;
- write24(read24(inst-3)+offset);
- pointer+=3;
- }
- break;
- }
- }
- geometry_mode=inst;
- if(BIG_COUNT>0)
- {
- for(loop=(inst-map);loop<0x40000;loop+=8)
- {
- for(loop2=0;loop2<end2;loop2+=1)
- {
- if(BIG_LIST[loop2]==loop+map){break;}
- }
- if(BIG_LIST[loop2]==loop+map){break;}
- }
- for(loop=inst;loop<BIG_LIST[loop2];loop+=1)
- {
- OUT[loop-map]=RAM[loop];
- }
- }
- else
- {
- pointer=0x1000000;
- while(end!=map)
- {
- end=read32(pointer);
- pointer+=4;
- if(end==map&&read32(pointer)==map)
- {
- pointer+=8;
- }
- if(end==map&&read32(pointer)!=map)
- {
- pointer+=4;
- }
- }
- end=read32(pointer-4);
- for(loop=inst;loop<end;loop+=1)
- {
- OUT[loop-map]=RAM[loop];
- }
- }
- dlist_lookup:
- if(BIG_COUNT>0)
- {
- gbi=0;
- BIG_COUNT-=1;
- for(loop=(geometry_mode-map);loop<0x40000;loop+=8)
- {
- for(loop2=0;loop2<end2;loop2+=1)
- {
- if(BIG_LIST[loop2]==loop+map){break;}
- }
- if(BIG_LIST[loop2]==loop+map){break;}
- }
- inst=BIG_LIST[loop2];
- pointer=inst-map;
- end+=1;
- goto process_dlist;
- }
- FILE *DL=fopen("map","wb");
- fwrite(OUT,1,0x40000,DL);
- fclose(DL);
- free(OUT);
- free(RAM);
- system("pause");
- return 0;
- mesh_handler:
- end=RAM[pointer+1];
- inst=read24(pointer+5)+map;
- ROM_PATCH(pointer+5);
- ROM_PATCH(pointer+9);
- switch(RAM[pointer])
- {
- case 0:
- for(loop2=0;loop2<end;loop2+=1)
- {
- if(RAM[inst+8*loop2]>0)
- {
- OPA[OPA_COUNT]=read24(inst+8*loop2+1)+map;
- OPA_COUNT+=1;
- ROM_PATCH(inst+8*loop2+1);
- }
- if(RAM[inst+8*loop2+4]>0)
- {
- XLU[XLU_COUNT]=read24(inst+8*loop2+5)+map;
- XLU_COUNT+=1;
- ROM_PATCH(inst+8*loop2+5);
- }
- }
- break;
- case 2:
- for(loop2=0;loop2<end;loop2+=1)
- {
- if(RAM[inst+0x10*loop2+8]>0)
- {
- OPA[OPA_COUNT]=read24(inst+0x10*loop2+9)+map;
- OPA_COUNT+=1;
- ROM_PATCH(inst+0x10*loop2+9);
- }
- if(RAM[inst+0x10*loop2+0xC]>0)
- {
- XLU[XLU_COUNT]=read24(inst+0x10*loop2+0xD)+map;
- XLU_COUNT+=1;
- ROM_PATCH(inst+0x10*loop2+0xD);
- }
- }
- break;
- }
- end=0;
- end2=0;
- while(OPA_COUNT>0)
- {
- OPA_COUNT-=1;
- pointer=OPA[end];
- while(gbi!=G_ENDDL)
- {
- gbi=RAM[pointer];
- if(gbi==G_DL&&RAM[pointer+4]==3)
- {
- BIG_LIST[BIG_COUNT]=read24(pointer+5)+map;
- BIG_COUNT+=1;
- if(pointer==OPA[end])
- {
- printf("Display List %06X\n",pointer-map+offset);
- }
- }
- pointer+=8;
- }
- end+=1;
- gbi=0;
- }
- while(XLU_COUNT>0)
- {
- XLU_COUNT-=1;
- pointer=XLU[end2];
- while(gbi!=G_ENDDL)
- {
- gbi=RAM[pointer];
- if(gbi==G_DL&&RAM[pointer+4]==3)
- {
- BIG_LIST[BIG_COUNT]=read24(pointer+5)+map;
- BIG_COUNT+=1;
- if(pointer==XLU[end2])
- {
- printf("Display List %06X\n",pointer-map+offset);
- }
- }
- pointer+=8;
- }
- end2+=1;
- gbi=0;
- }
- end=0;
- end2=0;
- for(loop=0;loop<0x78;loop+=1)
- {
- if(OPA[loop]>0)
- {
- for(loop2=0;loop2<BIG_COUNT;loop2+=1)
- {
- if(BIG_LIST[loop2]==OPA[loop])
- {
- break;
- }
- }
- if(loop2==BIG_COUNT)
- {
- BIG_LIST[BIG_COUNT]=OPA[loop];
- BIG_COUNT+=1;
- }
- }
- if(XLU[loop]>0)
- {
- for(loop2=0;loop2<BIG_COUNT;loop2+=1)
- {
- if(BIG_LIST[loop2]==XLU[loop])
- {
- break;
- }
- }
- if(loop2==BIG_COUNT)
- {
- BIG_LIST[BIG_COUNT]=XLU[loop];
- BIG_COUNT+=1;
- }
- }
- }
- for(loop=0;loop<0x40000;loop+=8)
- {
- for(loop2=0;loop2<BIG_COUNT;loop2+=1)
- {
- if(BIG_LIST[loop2]==loop+map){break;}
- }
- if(BIG_LIST[loop2]==loop+map){break;}
- }
- for(loop=map;loop<BIG_LIST[loop2];loop+=1)
- {
- OUT[loop-map]=RAM[loop];
- }
- end2=BIG_COUNT;
- geometry_mode=map;
- goto dlist_lookup;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement