⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nagra2-0101.c

📁 linux softcam emulator for using with vdr.
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -