]> www.vanbest.org Git - sasc-ng.git/commitdiff
nagra-0501: propper map18 timing fix
authoranon <unknown>
Sun, 5 Oct 2008 21:55:32 +0000 (05:55 +0800)
committeranon <unknown>
Sun, 5 Oct 2008 21:55:32 +0000 (05:55 +0800)
systems/nagra/nagra2-0101.c
systems/nagra/nagra2-0501.c
systems/nagra/nagra2.c
systems/nagra/nagra2.h
testing/testN2Emu.c

index fa1cb85f2801a444acaf7cf11cfcc31624d4ca3b..8e9577b9d8f6525873cad425ba8623cbd735d478 100644 (file)
@@ -440,6 +440,7 @@ public:
   virtual int ProcessBx(unsigned char *data, int len, int pos);
   virtual int ProcessEx(unsigned char *data, int len, int pos);
   virtual int RunEmu(unsigned char *data, int len, unsigned short load, unsigned short run, unsigned short stop, unsigned short fetch, int fetch_len);
+  virtual void PostDecrypt(bool ecm) { PostDecryptSetup(ecm); }
   };
 
 static cN2ProvLinkReg<cN2Prov0101,0x0101,(N2FLAG_MECM|N2FLAG_POSTAU|N2FLAG_Bx|N2FLAG_Ex)> staticPL0101;
index bfc3e80130217912f3fcea64c68eaaeb40ef9ad9..80a01e82a16ca5b6d6873636260794e2d8290d54 100644 (file)
@@ -65,6 +65,7 @@ public:
   cN2Prov0501(int Id, int Flags);
   virtual int ProcessBx(unsigned char *data, int len, int pos);
   virtual int RunEmu(unsigned char *data, int len, unsigned short load, unsigned short run, unsigned short stop, unsigned short fetch, int fetch_len);
+  virtual void PostDecrypt(bool ecm) { PostDecryptSetup(ecm); }
   };
 
 static cN2ProvLinkReg<cN2Prov0501,0x0501,(N2FLAG_MECM|N2FLAG_INV|N2FLAG_Bx)> staticPL0501;
@@ -164,7 +165,6 @@ bool cN2Prov0501::ProcessMap(int f)
     case COPY_C_D:
     case COPY_D_C:
       DoMap(f);
-      if(f>=COPY_A_B) AddMapCycles(64); // quick timing fix. Is there an AUXed ROM120 to check???
       break;
     case 0x37:
       GetMem(HILO(0x44),tmp,dl,0);
index 2f01cb6192e1f4dbd3cf9535d30f76dc50b416fd..c1af024d0082ef1766fe32dbae53f169323444fc 100644 (file)
@@ -726,6 +726,12 @@ void cMapCore::CurveInit(BIGNUM *a)
   MonMul(s160,B,a);
 }
 
+void cMapCore::PostDecryptSetup(bool ecm)
+{
+  if(ecm) wordsize=0x8;
+  else    wordsize=0xC;
+}
+
 int cMapCore::GetOpSize(int l)
 {
   return l!=0 ? l : wordsize;
@@ -1202,6 +1208,7 @@ bool cSystemNagra2::ProcessECM(const cEcmInfo *ecm, unsigned char *data)
     if(ecmP) ecmP->PrintCaps(L_SYS_ECM);
     }
   lastEcmId=id;
+  if(ecmP) ecmP->PostDecrypt(true);
 
   HEXDUMP(L_SYS_RAWECM,buff,cmdLen,"Nagra2 RAWECM");
   int l=0, mecmAlgo=0;
@@ -1308,6 +1315,7 @@ void cSystemNagra2::ProcessEMM(int pid, int caid, unsigned char *buffer)
     if(emmP) emmP->PrintCaps(L_SYS_EMM);
     }
   lastEmmId=id;
+  if(emmP) emmP->PostDecrypt(false);
 
   HEXDUMP(L_SYS_RAWEMM,emmdata,cmdLen,"Nagra2 RAWEMM");
   id=(emmdata[8]<<8)+emmdata[9];
index e4fedba0f14714c4d5245ed2b31711e7612a348b..6463bb60f25d2cbc237f7f641ed3d76f169f75dd 100644 (file)
@@ -176,6 +176,7 @@ protected:
   virtual void AddMapCycles(unsigned int num) {}
   unsigned int MapCycles(void) { return cycles; }
   virtual unsigned int CpuCycles(void) { return 0; }
+  virtual void PostDecryptSetup(bool ecm);
 public:
   cMapCore(void);
   virtual ~cMapCore() {}
@@ -297,6 +298,7 @@ public:
   virtual int ProcessEx(unsigned char *data, int len, int pos) { return -1; }
   virtual bool PostProcAU(int id, unsigned char *data) { return true; }
   virtual int RunEmu(unsigned char *data, int len, unsigned short load, unsigned short run, unsigned short stop, unsigned short fetch, int fetch_len) { return -1; }
+  virtual void PostDecrypt(bool ecm) {}
   bool CanHandle(int Id) { return MATCH_ID(Id,id); }
   bool HasFlags(int Flags) { return (flags&Flags)==Flags; }
   void PrintCaps(int c);
index c2ea053d98cede98dad4603f46c6b5e6c9647d80..4c25c4c47779a1ff06c83fa86ff23d801558a76a 100644 (file)
@@ -20,6 +20,7 @@ void Emm(unsigned char *emmdata, int cmdLen, int id)
     emmP=cN2Providers::GetProv(id,N2FLAG_NONE);
     if(emmP) emmP->PrintCaps(L_SYS_EMM);
     }
+  if(emmP) emmP->PostDecrypt(false);
 
   HEXDUMP(L_SYS_RAWEMM,emmdata,cmdLen,"Nagra2 RAWEMM");
   id=(emmdata[8]<<8)+emmdata[9];
@@ -134,6 +135,7 @@ bool Ecm(unsigned char *buff, int cmdLen, int id)
 
   cN2Prov *ecmP=cN2Providers::GetProv(id,N2FLAG_NONE);
   if(ecmP) ecmP->PrintCaps(L_SYS_ECM);
+  if(ecmP) ecmP->PostDecrypt(true);
 
   int l=0, mecmAlgo=0;
   for(int i=(buff[14]&0x10)?16:20; i<cmdLen-10 && l!=3; ) {