util.c
上传用户:caisangzi8
上传日期:2013-10-25
资源大小:15756k
文件大小:5k
源码类别:

DVD

开发平台:

C/C++

  1. /*
  2. ** FILE
  3. ** util.c
  4. **
  5. ** DESCRIPTION
  6. ** provide some general utilities.
  7. **
  8. */
  9. #include "global.h"
  10. #include "fastmath.h"
  11. #include "util.h"
  12. #include "sinf.h"
  13. #ifdef USE_DIV
  14. #include "stdlib.h"
  15. #endif
  16. #ifdef MIX_CDMP3_DISC_DISPLAY_REAL_CD_TRK //linrc add 2004-10-29 11:33
  17. #include "cdxa.h"
  18. #endif
  19. //#define     UTIL_DBG    1
  20. /*
  21. ** FUNCTION
  22. ** bin2bcd(BYTE x)
  23. **
  24. ** DESCRIPTION
  25. ** transform a binary-represented number into packed BCD.
  26. **
  27. ** 0x0c(12) -> 0x12
  28. ** 0x20(32) -> 0x32
  29. **
  30. ** *NOTE*
  31. ** we used fast dividing-by-10 function to generate the result.
  32. */
  33. int bin2bcd(BYTE x)
  34. {
  35. #ifdef USE_DIV
  36.   div_t res;
  37.   res = div(x,10);
  38.   return (res.quot<<4) | (res.rem);
  39. #else
  40. #if 1
  41.   int Q = DIV10(x);
  42.   int R = x-10*Q;
  43.   return  (Q<<4) | R;
  44. #else
  45.   return ((x/10)<<4) | (x%10);
  46. #endif
  47. #endif
  48. }
  49. /*
  50. ** FUNCTION
  51. ** bcd2bin(BYTE x)
  52. **
  53. ** DESCRIPTION
  54. ** transform a bcd-number into binary-represented
  55. */
  56. int bcd2bin(BYTE x)
  57. {
  58.   /*
  59.   ** for mips, a optimized version might be obtained using:
  60.   **
  61.   ** use CE (slower)
  62.   ** li  %1, 10
  63.   ** shr %2, %0, 4
  64.   **  multu %1, %2 
  65.   ** andi %1, %0, 0x000f
  66.   ** mflo %2
  67.   **  addu %1, %2
  68.   **
  69.   ** or
  70.   ** shr %1, %0, 4 // >>4
  71.   ** addu %2, %1, %1 // (2) = *2
  72.   **  shl %1, %2, 2 // (1) = (2)*4
  73.   ** addu %1, %2 // (1) = (1)+(2)
  74.   ** andi %2, %0, 0x000f // (2) = (0)&0x000f
  75.   ** addu %1, %2 // (1) = (1)+(2)
  76.   ** 
  77.   */
  78.   return (x>>4) * 10 + (x&0x0f); 
  79. }
  80. /*
  81. ** FUNCTION
  82. ** l2msf(UINT32 l)
  83. **
  84. ** DESCRIPTION
  85. ** map a linear address of CDROM into MSF addressing
  86. **
  87. ** *NOTE*
  88. ** msf is packed 4-byte structure with format
  89. ** [CI:MM:SS:FF], where MM/SS/FF is in binary.
  90. */
  91. UINT32 l2msf(UINT32 l)
  92. {
  93.   UINT32 ss, ff;
  94.   UINT32 l_75, l_4500;
  95.   l      += 150;
  96.   l_75    = l/75;
  97.   l_4500  = l_75/60;
  98.   ff = l - 75*l_75;
  99.   ss = l_75 - 60*l_4500;
  100.   return (l_4500<<16) | (ss<<8) | (ff);
  101. }
  102. /*
  103. ** FUNCTION
  104. ** msf2l(UINT32 msf)
  105. **
  106. ** DESCRIPTION
  107. ** map a MSF addressing into linear addressing
  108. **
  109. ** *NOTE*
  110. ** (UINT32)msf is packed 4-byte structure with format
  111. ** [00:MM:SS:FF], where MM/SS/FF is in binary.
  112. */
  113. UINT32 msf2l(UINT32 msf)
  114. {
  115.     UINT16  iMM;
  116.     //Jeff replace, 20030814
  117.     //return MSF2l(msf_mm(msf), msf_ss(msf), msf_ff(msf));
  118.     //JSLin 20040915 //added CDDVD
  119.     if ((cd_type_loaded==CDROM) || (cd_type_loaded==CDDVD)) {
  120.         iMM = (((msf)>>16) & 0xffff);
  121.     } else {
  122.         iMM = msf_mm(msf);
  123.     }
  124.     return MSF2l(iMM, msf_ss(msf), msf_ff(msf));
  125. }
  126. /*
  127. ** FUNCTION
  128. ** addmsf_ss(UINT32 msf, int inc_s)
  129. **
  130. ** DESCRIPTION
  131. ** adjust MSF address by (inc_s) seconds
  132. */
  133. #define MSF_SECONDS 60
  134. #define MSF_FRAMES 75
  135. #define FIRST_FRAME 0x000200
  136. UINT32 addmsf_ss(UINT32 msf, int inc_s)
  137. {
  138.   UINT32 ret_msf; 
  139.   int   mm = msf_mm(msf);
  140.   int   ss = msf_ss(msf) + inc_s;
  141.   int  ff = msf_ff(msf);
  142. #ifdef DVD_SERVO
  143.   if ((cd_type_loaded==CDROM) && is_svo_dvd()) { //for DVD disc containing files, Jeff 20040125
  144. #else
  145.   if (cd_type_loaded==CDROM) {
  146. #endif
  147.       mm = (((msf)>>16) & 0xffff);
  148.   }
  149.   while (ss<0) {
  150.     ss += MSF_SECONDS; mm--;
  151.   }
  152.   while (ss>=MSF_SECONDS) {
  153.     ss -= MSF_SECONDS; mm++;
  154.   }
  155.   ret_msf = MSF(mm,ss,ff);
  156.   if (mm<0)
  157.     ret_msf = 0x000200;
  158.   return ret_msf;
  159. }
  160. /*
  161. ** FUNCTION
  162. ** addmsf(UINT32 msf, int inc_f)
  163. **
  164. ** DESCRIPTION
  165. ** adjust MSF address by #inc_f frames
  166. */
  167. UINT32 addmsf(UINT32 msf, int inc_f)
  168. {
  169.   UINT32 ret_msf; 
  170.   int    mm = msf_mm(msf);
  171.   int    ss = msf_ss(msf);
  172.   int    ff = msf_ff(msf) + inc_f;
  173. #ifdef DVD_SERVO
  174.   if ((cd_type_loaded==CDROM) && is_svo_dvd()) { //for DVD disc containing files, Jeff 20040125
  175. #else
  176.   if (cd_type_loaded==CDROM) {
  177. #endif
  178.       mm = (((msf)>>16) & 0xffff);
  179.   }
  180.   while (ff<0) {
  181.     ff += 75; ss--;
  182.   }
  183.   while (ff>=75) {
  184.     ff -= 75; ss++;
  185.   }
  186.   while (ss<0) {
  187.     ss += 60; mm--;
  188.   }
  189.   while (ss>=60) {
  190.     ss -= 60; mm++;
  191.   }
  192.   ret_msf = MSF(mm,ss,ff);
  193.   if (mm<0) 
  194.     ret_msf = 0x000200;
  195.   if (ret_msf<0x000200)
  196.     ret_msf = 0x000200;
  197.   return ret_msf;
  198. }
  199. BYTE bin2asc(BYTE pp)  /* Converte binary code(0~0xf) to ASCII */
  200. {
  201.  if(pp<10) pp+=0x30;
  202.  else pp=pp+0x41-10;
  203.  return pp;
  204. }
  205. BYTE adjust_trk_num(BYTE trk)   
  206. {
  207. //terry,mark it,2002/6/27 05:01PM
  208. /* if(cd_type_loaded==CDDA)
  209.  {
  210.   return trk;
  211.  }else*/
  212. //wanghaoying delete to higuibackup.c 2005-1-18 20:11
  213.     
  214.  {     
  215.     return (trk + cd_trk_lo_now -1);    
  216.  }
  217. }
  218. BYTE show_trk_num(BYTE trk)   
  219. {
  220. //terry,2002/6/27 05:01PM
  221. /* if(cd_type_loaded==CDDA)
  222.  {
  223.   return trk;
  224.  }else*/
  225.  #ifdef MIX_CDMP3_DISC_DISPLAY_REAL_CD_TRK  //linrc add2004-10-29 11:20
  226.  /*when play the cd+mp3 disc(ABEX TEST CD 786),it display the real CD TRK*/
  227.  if((cd_type_loaded == CDDA)&&((pFsJpeg->cdrom.track_info[1]&0x40000000) == 0x40000000))
  228.  {
  229.     return (trk - cd_trk_lo_now +1)+1;
  230.  } 
  231.  else
  232.  #endif
  233.  {     
  234.     return (trk - cd_trk_lo_now +1);    
  235.  }
  236. }
  237. UINT32 get_next_trk_msf(UINT8 trk)
  238. {
  239. UINT32 msf;
  240. if(trk<cd_trk_hi)
  241. msf = gettrkmsf(trk+1);
  242. else
  243. msf = gettrkmsf_leadout();
  244. return msf & 0x00ffffff ;
  245. }
  246. #ifndef DVDRELEASE
  247. void print_block(UINT8 *a, int n)
  248. {
  249. int i;
  250. for (i = 0; i < n; i++) {
  251. printf("%02x%s", *(a+i), (i % 16 == 15) ? "n" : " ");
  252. //if (i == 16*10) getch();
  253. }
  254. printf("n");
  255. //getch();
  256. }
  257. #endif