📄 nagra2-0101.c
字号:
case 0x57: addr=HILO(0x46); GetMem(HILO(addr ),tmp,16,0); GetMem(HILO(addr+2 ),tmp+0x10,16,0); GetMem(HILO(addr+4 ),tmp+0x20,16,0); GetMem(HILO(addr+6 ),tmp+0x30,16,0); GetMem(HILO(addr+8 ),tmp+0x40,16,0); GetMem(HILO(addr+10),tmp+0x50,16,0); DoMap(f,tmp); SetMem(0x400,tmp,0x40,0); AddCycles(MapCycles()); break; default: PRINTF(L_SYS_EMU,"%04x: map call %02x not emulated",id,f); return false; } return true;}bool cN2Prov0101::ProcessDESMap(int f){ unsigned char data[16]; switch(f) { case 0x05: // 3DES encrypt DES_ecb2_encrypt(DES_CAST(desblock),DES_CAST(desblock),&desks1,&desks2,DES_ENCRYPT); break; case 0x06: // 3DES decrypt DES_ecb2_encrypt(DES_CAST(desblock),DES_CAST(desblock),&desks1,&desks2,DES_DECRYPT); break; case 0x0b: // load DES data block from memory GetMem(HILO(0x25),desblock,8,Get(0x24)); break; case 0x0c: // store DES data block to memory SetMem(HILO(0x2b),desblock,8,Get(0x2a)); break; case 0x0e: // get DES key1 and key2 GetMem(HILO(0x25),data,8,Get(0x24)); DES_key_sched((DES_cblock *)data,&desks1); GetMem(HILO(0x28),data,8,Get(0x27)); DES_key_sched((DES_cblock *)data,&desks2); break; case 0x0f: // set DES size desSize=Get(0x2d); if(desSize!=0x10 && desSize!=0x18) { PRINTF(L_SYS_EMU,"%04x: invalid DES key size %02x",id,desSize); return false; } break; default: PRINTF(L_SYS_EMU,"%04x: DES map call %02x not emulated",id,f); return false; } return true;}bool cN2Prov0101::RomCallbacks(void){ unsigned int ea=GetPc(); if(ea&0x8000) ea|=(cr<<16); switch(ea) { case 0x3840: //MAP Handler case 0x00A822: if(!ProcessMap(a)) return false; break; case 0x3844: //DES Handler if(!ProcessDESMap(a)) return false; break; case 0x5F23: //Erase_RAM_and_Hang case 0x5F27: //Erase_RAM_and_Hang_Lp case 0x5F5E: //BrainDead PRINTF(L_SYS_EMU,"%04x: emu hung at %04x",id,ea); return false; case 0x70A6: //Write_Row_EEP_RC2_Len_A_To_RC1 { unsigned short rc1=HILO(0x47); unsigned short rc2=HILO(0x4a); for(int i=0; i<a; i++) Set(0x80,rc1++,Get(dr,rc2++)); Set(0x4a,rc2>>8); Set(0x4b,rc2&0xff); break; } case 0x7BFE: //Write_Row_EEPROM_A_from_X_to_RC1 { unsigned short rc1=HILO(0x47); unsigned short rc2=c6805::x; for(int i=0; i<a; i++) Set(0x80,rc1++,Get(rc2++)); break; } case 0x7CFF: //UPDATE_USW_03DD_03DE Set(0x30E8,Get(0x03DD)); Set(0x30E9,Get(0x03DE)); break; case 0x00A23C: //IDEA_Generate_Expanded_Key { unsigned char key[16]; GetMem(0x0a20,key,16); idea.SetEncKey(key,&ks); break; } case 0x00A2E9: //IDEA_Cypher { unsigned char data[8]; GetMem(0x070,data,8); idea.Encrypt(data,8,data,&ks,0); SetMem(0x070,data,8); break; } default: PRINTF(L_SYS_EMU,"%04X: unknown ROM breakpoint %04x",id,ea); return false; } if(ea>=0x8000) PopCr(); PopPc(); return true;}void cN2Prov0101::AddRomCallbacks(void){ AddBreakpoint(0xA822); // map handler AddBreakpoint(0x3840); AddBreakpoint(0x3844); AddBreakpoint(0xA23C); //IDEA AddBreakpoint(0xA2E9); AddBreakpoint(0x70A6); AddBreakpoint(0x7BFE); AddBreakpoint(0x7CFF); AddBreakpoint(0x5F23); AddBreakpoint(0x5F27); AddBreakpoint(0x5F5E);}int cN2Prov0101::ProcessBx(unsigned char *data, int len, int pos){ if(Init(id,102)) { SetMem(0x92,data+pos-1,len-pos+1); SetPc(0x93); SetSp(0x0FFF,0x0EF8); ClearBreakpoints(); AddBreakpoint(0x9569); AddBreakpoint(0x0000); AddRomCallbacks(); while(!Run(1000)) { if(GetPc()==0x9569) { GetMem(0x80,data,len); return a; } else if(GetPc()==0x0000) break; else if(!RomCallbacks()) break; } } return -1;}int cN2Prov0101::ProcessEx(unsigned char *data, int len, int pos){ if(Init(id,102)) { SetMem(0x80,data,len); SetPc(0x9591); SetSp(0x0FFF,0x0EF8); Push(0x99); //push the bug-table return onto the stack Push(0x95); Push(0x00); Set(0x00,0x62,0x26); Set(0x00,0x63,0x02); Set(0x00,0x03d3,len-0x12); ClearBreakpoints(); AddBreakpoint(0x9569); AddBreakpoint(0x9599); AddRomCallbacks(); while(!Run(10000)) { if(GetPc()==0x9569) { GetMem(0x80,data,len); return max((int)a,6); } else if(GetPc()==0x9599) break; else if(!RomCallbacks()) break; } } return -1;}int cN2Prov0101::RunEmu(unsigned char *data, int len, unsigned short load, unsigned short run, unsigned short stop, unsigned short fetch, int fetch_len){ if(Init(id,102)) { SetSp(0x0FFF,0x0EF8); SetMem(load,data,len); SetPc(run); ClearBreakpoints(); AddBreakpoint(stop); if(stop!=0x0000) AddBreakpoint(0x0000); AddRomCallbacks(); while(!Run(100000)) { if(GetPc()==0x0000 || GetPc()==stop) { GetMem(fetch,data,fetch_len); return 1; } else if(!RomCallbacks()) break; break; } } return -1;}void cN2Prov0101::TimerHandler(unsigned int num){ if(hwMapper) hwMapper->AddCycles(num);}void cN2Prov0101::Stepper(void){ unsigned short pc=GetPc(); if(pc>=0x93 && pc<=0xE0) { // pc in EMM data unsigned char op=Get(pc); if((op&0xF0)==0x00) { // current opcode BRCLR/BRSET int fake=0; // 1=branch -1=non-branch if(Get(pc+3)==0x81) // next opcode == RTS fake=1; // fake branch else { unsigned char off=Get(pc+2); unsigned short target=pc+3+off; if(off&0x80) target-=0x100; if(Get(target)==0x81) // branch target == RTS fake=-1; // fake non-branch } if(fake) { unsigned short ea=Get(pc+1); unsigned char val=Get(dr,ea); int bit=1<<((op&0xF)>>1); // set/clr bit according to fake-mode and opcode if((fake>0 && (op&0x01)) || (fake<0 && !(op&0x01))) { if(val&bit) loglb->Printf("*"); val&=~bit; } else { if(!(val&bit)) loglb->Printf("*"); val|=bit; } Set(dr,ea,val); } } }}// -- cN2Prov0901 --------------------------------------------------------------class cN2Prov0901 : public cN2Prov0101 {public: cN2Prov0901(int Id, int Flags); };static cN2ProvLinkReg<cN2Prov0901,0x0901,(N2FLAG_MECM|N2FLAG_POSTAU|N2FLAG_Bx|N2FLAG_Ex)> staticPL0901;cN2Prov0901::cN2Prov0901(int Id, int Flags):cN2Prov0101(Id,Flags){ mecmAddr[0]=0x91f5; mecmAddr[1]=0x92f5; mecmKeyId=0x907;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -