Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- char pointers[1532][64]={0};
- short scenes[0x614][0x80];
- short count[0x614]={0};
- short exits[0x614][0x80];
- unsigned int read32(unsigned char *RAM, int ptr)
- {
- return (unsigned int)((RAM[ptr]<<24)|(RAM[ptr+1]<<16)|(RAM[ptr+2]<<8)|RAM[ptr+3]);
- }
- unsigned int read24(unsigned char *RAM, int ptr)
- {
- return (unsigned int)((RAM[ptr]<<16)|(RAM[ptr+1]<<8)|RAM[ptr+2]);
- }
- unsigned int read16(unsigned char *RAM, int ptr)
- {
- return (unsigned int)((RAM[ptr]<<8)|RAM[ptr+1]);
- }
- void demo_work(unsigned char *RAM, int text, int ptr, unsigned char scene_id)
- {
- unsigned int add,setup,special,special2;
- unsigned short records,undefined;
- char demo, found;
- demo=0;
- printf("scene_id %02X\n",scene_id);
- while(RAM[ptr]==0x2)
- {
- add=0;
- setup=text+read24(RAM,ptr+1);
- printf("%d %08X\n",demo,setup);
- while(RAM[setup]!=0x14)
- {
- if(RAM[setup]==0x17)
- {
- add=text+read24(RAM,setup+5)+8;
- break;
- }
- setup+=8;
- }
- if(add>0)
- {
- undefined=0;
- while(read32(RAM,add)!=0xFFFFFFFFUL)
- {
- switch(read32(RAM,add))
- {
- case 0x01:
- case 0x02:
- case 0x05:
- case 0x06:
- add+=12;
- while(RAM[add]!=0xff)
- {
- add+=16;
- }
- add+=16;
- break;
- case 0x03:
- case 0x04:
- case 0x0A:
- case 0x0B:
- case 0x0D:
- case 0x10:
- case 0x12:
- case 0x15:
- case 0x16:
- case 0x17:
- case 0x18:
- case 0x19:
- case 0x1A:
- case 0x1B:
- case 0x1C:
- case 0x1D:
- case 0x1E:
- case 0x1F:
- case 0x20:
- case 0x21:
- case 0x22:
- case 0x23:
- case 0x24:
- case 0x25:
- case 0x27:
- case 0x28:
- case 0x29:
- case 0x2A:
- case 0x2B:
- case 0x2C:
- case 0x2E:
- case 0x2F:
- case 0x30:
- case 0x31:
- case 0x32:
- case 0x33:
- case 0x34:
- case 0x35:
- case 0x36:
- case 0x37:
- case 0x39:
- case 0x3A:
- case 0x3B:
- case 0x3C:
- case 0x3D:
- case 0x3E:
- case 0x40:
- case 0x42:
- case 0x43:
- case 0x44:
- case 0x45:
- case 0x46:
- case 0x47:
- case 0x48:
- case 0x49:
- case 0x4A:
- case 0x4B:
- case 0x4C:
- case 0x4D:
- case 0x4E:
- case 0x4F:
- case 0x51:
- case 0x52:
- case 0x53:
- case 0x54:
- case 0x55:
- case 0x56:
- case 0x57:
- case 0x58:
- case 0x59:
- case 0x5A:
- case 0x5D:
- case 0x5E:
- case 0x6A:
- case 0x6B:
- case 0x6C:
- case 0x6D:
- case 0x6E:
- case 0x6F:
- case 0x70:
- case 0x71:
- case 0x72:
- case 0x73:
- case 0x74:
- case 0x75:
- case 0x76:
- case 0x77:
- case 0x78:
- case 0x79:
- case 0x7B:
- case 0x7C:
- case 0x83:
- case 0x84:
- case 0x85:
- case 0x87:
- case 0x88:
- case 0x89:
- case 0x8D:
- case 0x8E:
- case 0x8F:
- case 0x90:
- records=read16(RAM,add+6);
- add+=8;
- for(undefined=0;undefined<records;undefined+=1)
- {
- add+=48;
- }
- undefined=0;
- break;
- case 0x09:
- case 0x13:
- records=read16(RAM,add+6);
- add+=8;
- for(undefined=0;undefined<records;undefined+=1)
- {
- add+=12;
- }
- undefined=0;
- break;
- case 0x2D:
- case 0x3E8:
- if(read32(RAM,add)==0x3E8)
- {
- special=read24(RAM,0xBB2115+read16(RAM,add+8)*4)+0xA771A2;
- special2=read24(RAM,0xBB2119+read16(RAM,add+8)*4)+0xA771A2;
- found=0;
- while(read16(RAM,special)!=0x1E1A)
- {
- if(read16(RAM,special-2)==0x1000)
- {
- found=1;
- }
- special+=4;
- if(special==special2){break;}
- }
- special2=read16(RAM,special-4);
- if(special2<=0x610||found==0)
- {
- exits[special2][count[special2]]=scene_id;
- scenes[special2][count[special2]]=demo;
- count[special2]+=1;
- }
- }
- add+=16;
- break;
- default:
- undefined=1;
- break;
- }
- }
- }
- ptr+=4;
- demo+=1;
- }
- printf("\n");
- system("pause");
- }
- int main()
- {
- unsigned int start[0x6E],stop[0x6E],add,loop,text,end;
- unsigned int special3[0x614]={0};
- unsigned char prev=0x6E, special, special2;
- FILE *ROM=fopen("zelootma.z64","rb");
- fseek(ROM,0,SEEK_END);
- end=ftell(ROM);
- fseek(ROM,0,SEEK_SET);
- unsigned char *RAM=malloc(end);
- fread(RAM,1,end,ROM);
- fclose(ROM);
- for(loop=0;loop<0x614;loop+=1)
- {
- for(add=0;add<0x80;add+=1)
- {
- scenes[loop][add]=-1;
- }
- }
- add=0xBE80;
- for(loop=0;loop<1532;loop+=1)
- {
- text=0;
- while(RAM[add]!=0)
- {
- pointers[loop][text]=RAM[add];
- if(pointers[loop][text]==0x63&&pointers[loop][text-1]==0x73){pointers[loop][text-2]=0;}
- text+=1;
- add+=1;
- }
- while(RAM[add]==0)
- {
- add+=1;
- }
- }
- for(loop=0xBA0BB0;loop<0xBA1448;loop+=0x14)
- {
- add=read32(RAM,loop);
- text=add;
- start[(loop-0xBA0BB0)/0x14]=0;
- stop[(loop-0xBA0BB0)/0x14]=0;
- while(RAM[add]!=0x14)
- {
- switch(RAM[add])
- {
- case 0x0:
- special2=RAM[add+1];
- break;
- case 0xF:
- stop[(loop-0xBA0BB0)/0x14]=text+read24(RAM,add+5);
- break;
- case 0x13:
- start[(loop-0xBA0BB0)/0x14]=text+read24(RAM,add+5);
- break;
- case 0x18:
- demo_work(RAM,text,text+read24(RAM,add+5)+0xC,(loop-0xBA0BB0)/0x14);
- break;
- }
- add+=8;
- }
- if(read16(RAM,stop[(loop-0xBA0BB0)/0x14]-2)==0)
- {
- stop[(loop-0xBA0BB0)/0x14]-=2;
- }
- if(start[(loop-0xBA0BB0)/0x14]>0&&stop[(loop-0xBA0BB0)/0x14]>0)
- {
- //printf("%02X ",(loop-0xBA0BB0)/0x14);
- for(add=start[(loop-0xBA0BB0)/0x14];add<stop[(loop-0xBA0BB0)/0x14];add+=2)
- {
- end=read16(RAM,add);
- if(end<=0x613)
- {
- exits[end][count[end]]=(loop-0xBA0BB0)/0x14;
- count[end]+=1;
- //printf("%04X ",end);
- }
- else
- {
- if(end!=0x7fff)
- {
- for(special=0;special<special2;special+=1)
- {
- exits[read16(RAM,0xC23398+2*RAM[0xC233B4+(end-(unsigned short)(0x7FF9))]+2*special)][count[read16(RAM,0xC23398+2*RAM[0xC233B4+(end-(unsigned short)(0x7FF9))]+2*special)]]=(loop-0xBA0BB0)/0x14;
- count[read16(RAM,0xC23398+2*RAM[0xC233B4+(end-(unsigned short)(0x7FF9))]+2*special)]+=1;
- special3[read16(RAM,0xC23398+2*RAM[0xC233B4+(end-(unsigned short)(0x7FF9))]+2*special)]=0xC23398+2*RAM[0xC233B4+(end-(unsigned short)(0x7FF9))]+2*special;
- }
- }
- }
- }
- //printf("(%08X %08X)\n",start[(loop-0xBA0BB0)/0x14],stop[(loop-0xBA0BB0)/0x14]);
- }
- }
- for(loop=0;loop<0x614;loop+=1)
- {
- end=RAM[0xB9F360+loop*4];
- if(prev==end)
- {
- if(RAM[0xB9F361+loop*4]!=special)
- {
- special=0x66;
- }
- }
- if(end!=prev||special==0x66)
- {
- //if(end==0x51){printf("\n");}
- if(prev<0x51||prev>0x63){if(end>=0x51&&end<=0x63){if(prev!=0x64){printf("\n");}}}
- if(prev>=0x51&&prev<=0x63){if(end<0x51||end>0x63){if(prev!=0x5F){printf("\n");}}}
- if(prev==0x1B||prev==0x1E||prev==0x20||prev==0x23||prev==0x45||prev==0x5F)
- {
- if(end!=0x67)
- {
- if(RAM[0xB9F358+loop*4]!=0x1B&&RAM[0xB9F358+loop*4]!=0x1E&&RAM[0xB9F358+loop*4]!=0x20&&RAM[0xB9F358+loop*4]!=0x23&&RAM[0xB9F358+loop*4]!=0x45&&RAM[0xB9F358+loop*4]!=0x5F)
- {
- loop+=2;
- goto skip;
- }
- }
- }
- printf("#define ");
- switch(end)
- {
- case 0x51:
- printf("Field");
- break;
- case 0x52:
- printf("Village");
- break;
- case 0x53:
- printf("Graveyard");
- break;
- case 0x54:
- printf("River");
- break;
- case 0x55:
- printf("Forest");
- break;
- case 0x56:
- printf("Meadow");
- break;
- case 0x57:
- printf("Hylia");
- break;
- case 0x58:
- printf("Domain");
- break;
- case 0x59:
- printf("Fountain");
- break;
- case 0x5A:
- printf("Valley");
- break;
- case 0x5B:
- printf("Woods");
- break;
- case 0x5C:
- printf("Colossus");
- break;
- case 0x5D:
- printf("Fortress");
- break;
- case 0x5E:
- printf("Wasteland");
- break;
- case 0x5F:
- printf("Castle");
- break;
- case 0x60:
- printf("Trail");
- break;
- case 0x61:
- printf("Crater");
- break;
- case 0x62:
- printf("City");
- break;
- case 0x63:
- printf("Ranch");
- break;
- default:
- for(add=0;add<1532;add+=1)
- {
- if(read32(RAM,0x12F70+add*16)==read32(RAM,0xBA0BB0+end*0x14))
- {
- break;
- }
- }
- printf("%s",pointers[add]);
- break;
- }
- printf("_%d",RAM[0xB9F361+loop*4]);
- if(count[loop]>0){printf("_from_");}
- if(count[loop]==0){printf(" ");}
- for(text=0;text<count[loop];text+=1)
- {
- switch(exits[loop][text])
- {
- case 0x51:
- printf("Field");
- break;
- case 0x52:
- printf("Village");
- break;
- case 0x53:
- printf("Graveyard");
- break;
- case 0x54:
- printf("River");
- break;
- case 0x55:
- printf("Forest");
- break;
- case 0x56:
- printf("Meadow");
- break;
- case 0x57:
- printf("Hylia");
- break;
- case 0x58:
- printf("Domain");
- break;
- case 0x59:
- printf("Fountain");
- break;
- case 0x5A:
- printf("Valley");
- break;
- case 0x5B:
- printf("Woods");
- break;
- case 0x5C:
- printf("Colossus");
- break;
- case 0x5D:
- printf("Fortress");
- break;
- case 0x5E:
- printf("Wasteland");
- break;
- case 0x5F:
- printf("Castle");
- break;
- case 0x60:
- printf("Trail");
- break;
- case 0x61:
- printf("Crater");
- break;
- case 0x62:
- printf("City");
- break;
- case 0x63:
- printf("Ranch");
- break;
- default:
- for(add=0;add<1532;add+=1)
- {
- if(read32(RAM,0x12F70+add*16)==read32(RAM,0xBA0BB0+exits[loop][text]*0x14))
- {
- break;
- }
- }
- //if(special3[loop]>0)
- //{
- // printf("%s_%08X ",pointers[add],special3[loop]);
- //}
- //else
- // {
- printf("%s",pointers[add]);
- //}
- break;
- }
- if(scenes[loop][text]>-1){printf("_demo_%d",scenes[loop][text]);}
- printf(" ");
- }
- printf("0x%X",loop);
- if(end>=0x51&&end<0x64&&count[loop]==0){printf(" //UNUSED OR SPECIAL");}
- if(count[loop]>1){printf(" //beta");}
- if(special3[loop]>0)
- {
- printf("\n /* %08X */",special3[loop]);
- special3[loop]=loop+1;
- while(RAM[0xB9F360+4*special3[loop]]==end)
- {
- special3[loop]+=1;
- }
- if(end<0x51||end>0x63){if(RAM[0xB9F360+4*special3[loop]]<0x51||RAM[0xB9F360+4*special3[loop]]>0x63){printf("\n");}}
- if(end>=0x51&&end<=0x63)
- {
- if(RAM[0xB9F360+4*special3[loop]]>=0x51&&RAM[0xB9F360+4*special3[loop]]<=0x63)
- {
- printf("\n");
- }
- else
- {
- if(RAM[0xB9F360+4*special3[loop]]==0x64)
- {
- printf("\n");
- }
- }
- }
- }
- printf("\n");
- // if(prev>=0x51&&prev<=0x63)
- // {
- // if(end<0x51||end>0x63){printf("\n");}
- // }
- }
- skip:
- prev=end;
- special=RAM[0xB9F361+loop*4];
- }
- //for(loop=0;loop<0x6E;loop+=1)
- //{
- // for(add=0;add<1532;add+=1)
- // {
- // if(read32(RAM,0x12F70+add*16)==read32(RAM,0xBA0BB0+loop*0x14))
- // {
- // break;
- // }
- // }
- // text=0;
- // if(start[loop]>0&&stop[loop]>0)
- // {
- // text=(stop[loop]-start[loop])/2;
- // }
- // printf("%s has %d exits.\n",pointers[add],text);
- //}
- free(RAM);
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement