cachemgr.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:20k
源码类别:

DVD

开发平台:

Others

  1. /****************************************************************************************
  2.  *  Copyright (c) 2002 ZORAN Corporation, All Rights Reserved
  3.  *  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
  4.  *
  5.  *  File: $Workfile: cachemgr.c $             
  6.  *
  7.  * Description: 
  8.  * ============
  9.  * 
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 7 $
  14.  * Last Modified by $Author: Fwang $ at $Modtime: 04-03-20 14:45 $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /I76/I76_Common/I76_Reference/Playcore/ScPad/cachemgr.c $
  19.  * 
  20.  * 7     04-03-20 14:46 Fwang
  21.  * Fix cache address calculation overflow problem.
  22.  * 
  23.  * 6     12/09/03 12:17p Leonh
  24.  * Unite the way to read data from SDRAM, use the new function
  25.  * 
  26.  * 5     11/15/03 7:11p Leslie
  27.  * Replace old  Video API Low Level Files with new ones
  28.  * 
  29.  * 4     10/20/03 11:43a Leslie
  30.  * update the change from I64
  31.  * 
  32.  * 7     10/17/03 6:35p Leonh
  33.  * clean up code and avoid psn error
  34.  * 
  35.  * 6     9/25/03 3:56p Leonh
  36.  * add signature
  37.  * 
  38.  * 5     9/25/03 3:47p Leonh
  39.  * Fix the psn error
  40.  * 
  41.  * 4     9/23/03 1:55p Leonh
  42.  * fix the error when read disc
  43.  * 
  44.  * 3     9/22/03 3:55p Leonh
  45.  * Avoid offset caculated error when get bytes
  46.  * 
  47.  * 2     8/21/03 3:26p Leonh
  48.  * add compile switch
  49.  * 
  50.  * 1     03-07-09 10:22 Leonh
  51.  * cache enable
  52.  * 
  53.  * 8     23/04/02 9:36 Nirm
  54.  * - Added dependency in "Config.h".
  55.  * 
  56.  * 7     2/17/02 15:59 Rinata
  57.  * remove code and files under not define I49_STEPA0
  58.  * 
  59.  * 6     14/02/02 9:05 Atai
  60.  * Correct path
  61.  * 
  62.  * 5     30/01/02 20:26 Nirm
  63.  * Replaced min() with MIN().
  64.  * 
  65.  * 4     16/01/02 15:55 Atai
  66.  * Change debug printing
  67.  * 
  68.  * 3     9/01/02 21:21 Nirm
  69.  * Corrected Include-paths.
  70.  * 
  71.  * 2     9/01/02 16:53 Nirm
  72.  * Corrected Include-Paths.
  73.  ****************************************************************************************/
  74. #include "Config.h" // Global Configuration - do not remove!
  75. #ifdef _DEBUG
  76. #undef IFTRACE
  77. extern int gTraceCache;
  78. #define IFTRACE if (gTraceCache)
  79. #endif
  80. /* Standard includes */
  81. #include <stdio.h>
  82. /*  Specific includes */
  83. #include "Includemath-macro.h"
  84. #include "PlaycoreCoremaincoregdef.h"
  85. #include "PlaycoreAuxCacheAuxCache.h"
  86. #include "PlaycoreNav_DVDHeadernvdvgdef.h"
  87. #include "PlaycoreScPadscmgr.h"
  88. #include "PlaycoreScPadscllmgr.h"
  89. #include "PlaycoreScPadcachemgr.h"
  90. #include "Includesysdefs.h"
  91. #include "Decoderlow_levelDEC_LL_Api.h"
  92. #include "Decoderlow_levelDEC_LL_Reg.h"
  93. #ifdef DISC_CACHE_ENABLE
  94. BYTE slot_list_head, slot_list_tail;
  95. BYTE free_slot_count;
  96. DWORD blk_in_first_slot;
  97. #define cache_get_scHandle( slot_id )  (SC_DISC_CACHE_ADDR + (DWORD)(512UL*(slot_id-1)) )
  98. #define slotTbl_get_scHandle( slot_id )  (SC_DISC_CACHE_TABLE_ADDR + (DWORD)(2*(slot_id-1)) )
  99. BYTE slot_GetNew(void);
  100. /*---------------------------------------------------------------------------
  101. // Function:  BOOL dc_cache_CacheData( DWORD lbn, DWORD offset, WORD  bytes , WORD sc_handle )
  102. //
  103. // Description :  If the data requested exists in cache, then copy to sc_handle. Otherwise
  104.                 read from disc.
  105. // Author   : Wang Fan
  106. // Date       : 30/10/01
  107. //-------------------------------------------------------------------------*/
  108. BOOL dc_cache_CacheData( DWORD lbn, DWORD offset, WORD  bytes , WORD sc_handle )
  109. {
  110. BOOL b_res;
  111. dbg_printf(("<G(%ld:%ld,%d, sc_handle=0x%08lx)", lbn, offset, bytes,sc_handle));
  112. GLB_NAV_DVD( b_first_seek_after_get_data ) = TRUE;
  113. b_res = sc_CopyFromCache( lbn + GLB_NAV_DVD(dw_ifobase) , offset,  bytes, sc_handle );
  114. dbg_printf(("g>n"));
  115. return b_res;
  116. }
  117. /*---------------------------------------------------------------------------
  118. // Function:  BOOL dc_cache_GetData( DWORD lbn, DWORD offset, WORD bytes, BYTE *buffer )
  119. //
  120. // Description :  If the data requested exists in cache, then copy to buffer. Otherwise
  121.                 read from disc.
  122. // Author   : Wang Fan
  123. // Date       : 30/10/01
  124. //-------------------------------------------------------------------------*/
  125. BOOL dc_cache_GetData( DWORD lbn, DWORD offset, WORD bytes, BYTE *buffer )
  126. {
  127. BOOL b_res;
  128. dbg_printf(("<G(%ld:%ld,%d, ptr=0x%08lx)", lbn, offset, bytes,buffer));
  129. GLB_NAV_DVD( b_first_seek_after_get_data ) = TRUE;
  130. b_res = cache_GetBytes( lbn + GLB_NAV_DVD(dw_ifobase), offset, bytes, buffer );
  131. dbg_printf(("g>n"));
  132. return b_res;
  133. }
  134. /*---------------------------------------------------------------------------
  135. // Function:  BOOL dc_cache_PreCacheData( DWORD lbn, DWORD offset, WORD bytes )
  136. //
  137. // Description :  If the data requested exists in cache, don't do anything. Otherwise
  138.                 read from disc and save in cache.
  139. // Author   : Wang Fan
  140. // Date       : 30/10/01
  141. //-------------------------------------------------------------------------*/
  142. BOOL dc_cache_PreCacheData( DWORD l_lbn, DWORD l_Offset, WORD i_NbrBytes )
  143. {
  144. DWORD dw_norm_lbn;
  145. WORD i_norm_offset;
  146. WORD i_remain_count;
  147. BOOL b_res = TRUE;
  148. BYTE  cache_slot_id;
  149.     dbg_printf(("<G(%ld:%ld,%d, ptr=0x%08lx)", l_lbn, l_Offset, i_NbrBytes, 0));
  150.     GLB_NAV_DVD( b_first_seek_after_get_data ) = TRUE;
  151.     l_lbn += GLB_NAV_DVD(dw_ifobase);
  152. dw_norm_lbn = l_lbn + ((l_Offset>>11) & 0x1fffffUL);
  153. i_norm_offset = (WORD)(l_Offset & 0x7FFL);
  154. i_remain_count = i_NbrBytes;
  155. while(i_remain_count && b_res){
  156. if (blk_in_first_slot == dw_norm_lbn)
  157. cache_slot_id = slot_list_head;
  158. else
  159. cache_slot_id = dc_cache_hit( dw_norm_lbn);
  160. if ( cache_slot_id ){ /* data is already cached */
  161. WORD i_request_count;
  162. i_request_count = (WORD) MIN( i_remain_count, (2048-i_norm_offset) );
  163. i_remain_count -= i_request_count;
  164. if (i_remain_count){ /* means we still have data to get from subsequent sectors */
  165. dw_norm_lbn++; /* set lbn and offset to beginning of next sector */
  166. i_norm_offset = 0;
  167. }
  168. }
  169. else{
  170. b_res = dc_cache_sector( dw_norm_lbn );
  171. }
  172. }
  173. dbg_printf(("g>n"));
  174. return b_res;
  175. }
  176. /*---------------------------------------------------------------------------
  177. // Function:  void dc_cache_init()
  178. //
  179. // Description :  Initialize disc cache
  180. // Author   : Wang Fan
  181. // Date       : 30/10/01
  182. //-------------------------------------------------------------------------*/
  183. void dc_cache_init(void)
  184. {
  185. BYTE slot_id;
  186. TAG_LIST_ITEM list_item = {0,0,0};
  187. for (slot_id = 1; slot_id <= CACHE_NBR_SLOT; slot_id++ )
  188. sc_SetBytes32((DWORD)slotTbl_get_scHandle(slot_id), 0, sizeof(TAG_LIST_ITEM), &list_item);
  189. slot_list_head = 0; slot_list_tail = 0;
  190. free_slot_count = (BYTE)CACHE_NBR_SLOT;
  191. blk_in_first_slot = 0;
  192. }
  193. #define COPYFROMDISC_CONTAINER_CNT 4
  194. #define COPYFROMDISC_XFER_SZ (COPYFROMDISC_CONTAINER_CNT*BYTE_PER_CONTAINER)
  195. /*---------------------------------------------------------------------------
  196. // Function:  BOOL sc_CopyFromCache( DWORD dw_lbn, DWORD dw_offset, WORD n_byte_count, WORD sc_handle )
  197. //
  198. // Description :  Copy data to SCPAD.
  199. // Author   : Wang Fan
  200. // Date       : 30/10/01
  201. //-------------------------------------------------------------------------*/
  202. BOOL sc_CopyFromCache( DWORD dw_lbn, DWORD dw_offset, WORD n_byte_count, WORD sc_handle )
  203. {
  204. BYTE buff[COPYFROMDISC_XFER_SZ];
  205. WORD fraction_count;
  206. while( n_byte_count ){
  207. fraction_count = MIN( n_byte_count, COPYFROMDISC_XFER_SZ);
  208. if (cache_GetBytes( dw_lbn, dw_offset, fraction_count, buff ) == FALSE)
  209. return FALSE;
  210. sc_Write( sc_handle, CONTAINER_COUNT(fraction_count), (Sc_cont *) buff );
  211. dw_offset += (DWORD) fraction_count;
  212. sc_handle += COPYFROMDISC_CONTAINER_CNT;
  213. n_byte_count -= fraction_count;
  214. }
  215. return TRUE;
  216. }
  217. /*---------------------------------------------------------------------------
  218. // Function:  BOOL cache_GetBytes(DWORD l_lbn, DWORD l_Offset, WORD i_NbrBytes, BYTE *buff)
  219. //
  220. // Description :  If the data requested exists in cache, then copy to buffer. Otherwise
  221.                 read from disc.
  222. // Author   : Wang Fan
  223. // Date       : 30/10/01
  224. //-------------------------------------------------------------------------*/
  225. BOOL cache_GetBytes(DWORD l_lbn, DWORD l_Offset, WORD i_NbrBytes, BYTE *buff)
  226. {
  227. DWORD dw_norm_lbn;
  228. WORD i_norm_offset;
  229. WORD i_remain_count;
  230. BOOL b_res = TRUE;
  231. BYTE  cache_slot_id;
  232. dw_norm_lbn = l_lbn + ((l_Offset>>11) & 0x1fffffUL) ;//LeonHe_0922_2003_a: Avoid offset caculated error when get bytes
  233. i_norm_offset = (WORD)(l_Offset & 0x7ffUL);
  234. i_remain_count = i_NbrBytes;
  235. while(i_remain_count && b_res){
  236. if (blk_in_first_slot == dw_norm_lbn)
  237. cache_slot_id = slot_list_head;
  238. else
  239. cache_slot_id = dc_cache_hit( dw_norm_lbn);
  240. if ( cache_slot_id ){ /* data is already cached */
  241. WORD i_request_count;
  242. i_request_count = (WORD) MIN( i_remain_count, (2048-i_norm_offset) );
  243. //sc_GetBytes( cache_get_scHandle(cache_slot_id), i_norm_offset, i_request_count, buff);
  244. sc_cache_getBytes(( DWORD)cache_get_scHandle(cache_slot_id), i_norm_offset, i_request_count, buff);
  245. i_remain_count -= i_request_count;
  246. if (i_remain_count){ /* means we still have data to get from subsequent sectors */
  247. dw_norm_lbn++; /* set lbn and offset to beginning of next sector */
  248. i_norm_offset = 0;
  249. buff += i_request_count; /* increment buffer ptr accordingly */
  250. }
  251. }
  252. else{
  253. b_res = dc_cache_sector( dw_norm_lbn );
  254. }
  255. }
  256. return b_res;
  257. }
  258. /*---------------------------------------------------------------------------
  259. // Function:  BOOL dc_cache_sector( DWORD lbn)
  260. //
  261. // Description :  Read data from disc, and save in cache
  262. // Author   : Wang Fan
  263. // Date       : 30/10/01
  264. //-------------------------------------------------------------------------*/
  265. BOOL dc_cache_sector( DWORD lbn)
  266. {
  267. BYTE slot_id = slot_GetNew();
  268. dbg_printf(("nCache sector %li to block %li",lbn,slot_id));
  269.     
  270. if (!sc_CopyFromDisc32( lbn, 0, 2048, cache_get_scHandle(slot_id)) )
  271. return FALSE;
  272. slot_set_tag( slot_id, lbn );
  273. return TRUE;
  274. }
  275. /*---------------------------------------------------------------------------
  276. // Function:  BOOL dc_cache_hit( DWORD lbn)
  277. //
  278. // Description :  Check if the request block is already in cache
  279. // Author   : Wang Fan
  280. // Date       : 30/10/01
  281. //-------------------------------------------------------------------------*/
  282. BYTE dc_cache_hit( DWORD lbn)
  283. {
  284. BYTE slot_id;
  285. TAG_LIST_ITEM list_item;
  286. //Search block list table to check if the target lbn is already cached
  287. for (slot_id=slot_list_head ; ;slot_id = list_item.next)
  288. {
  289. if (slot_id == 0)           // Vacant block
  290. break;
  291. sc_cache_getBytes( ( DWORD)slotTbl_get_scHandle(slot_id), 0, sizeof(TAG_LIST_ITEM), &list_item);
  292. if ( lbn == slot_get_tag(slot_id) )
  293. {
  294. slot_list_move2head( slot_id );
  295. return slot_id;
  296. }
  297. if (slot_id == slot_list_tail)     //Not cached
  298. break;
  299. }
  300. return 0;
  301. }
  302. /************************  Code for slot list of disc cache ******************************/
  303. /*---------------------------------------------------------------------------
  304. // Function:     void slot_list_insert2head( BYTE slot_id )
  305. // Description :  Insert specified slot to the head of slot list
  306. // Author   : Wang Fan
  307. // Date       : 30/10/01
  308. //-------------------------------------------------------------------------*/
  309. void slot_list_insert2head( BYTE slot_id )
  310. {
  311. TAG_LIST_ITEM list_item, temp_item;
  312. sc_cache_getBytes( ( DWORD)slotTbl_get_scHandle(slot_id), 0, sizeof(list_item), &list_item);
  313.     //list_item.next  = head
  314. list_item.next = slot_list_head;
  315. list_item.prev = 0;
  316. sc_SetBytes32( ( DWORD)slotTbl_get_scHandle(slot_id), 0, sizeof(list_item), &list_item);
  317.     // head.prev = list_item
  318.     if (slot_list_head != 0)
  319.     {
  320. sc_cache_getBytes( ( DWORD)slotTbl_get_scHandle(slot_list_head), 0, sizeof(temp_item), &temp_item);
  321. temp_item.prev = slot_id;
  322. sc_SetBytes32( ( DWORD)slotTbl_get_scHandle(slot_list_head), 0, sizeof(temp_item), &temp_item);     
  323.     }
  324. slot_list_head = slot_id; blk_in_first_slot = list_item.tag;
  325. if (slot_list_tail == 0)           // If list is empty
  326. slot_list_tail = slot_id;
  327. return;
  328. }
  329. /*---------------------------------------------------------------------------
  330. // Function:     void slot_list_move2head( BYTE slot_id)
  331. // Description :  Move specified slot to the head of slot list
  332. // Author   : Wang Fan
  333. // Date       : 30/10/01
  334. //-------------------------------------------------------------------------*/
  335. void slot_list_move2head( BYTE slot_id)
  336. {
  337. TAG_LIST_ITEM list_item, temp_item;
  338. sc_cache_getBytes( ( DWORD)slotTbl_get_scHandle(slot_id), 0, sizeof(list_item), &list_item);
  339.     //Remove from current position in list
  340. if (slot_id == slot_list_head)
  341. return;
  342. else  if (list_item.prev != 0)
  343. {
  344. //list_item.prev.next = list_item.next
  345. sc_cache_getBytes( ( DWORD)slotTbl_get_scHandle(list_item.prev), 0, sizeof(temp_item), &temp_item);
  346. temp_item.next = list_item.next;
  347. sc_SetBytes32( ( DWORD)slotTbl_get_scHandle(list_item.prev), 0, sizeof(temp_item), &temp_item);     
  348. }
  349. if (slot_id == slot_list_tail)                               //list_item.next.prev = list_item.prev
  350. slot_list_tail = list_item.prev;
  351. else if (list_item.next != 0)
  352. {
  353. //list_item.next.prev = list_item.prev
  354. sc_cache_getBytes( ( DWORD)slotTbl_get_scHandle(list_item.next), 0, sizeof(temp_item), &temp_item);
  355. temp_item.prev = list_item.prev;
  356. sc_SetBytes32(( DWORD) slotTbl_get_scHandle(list_item.next), 0, sizeof(temp_item), &temp_item);     
  357. }
  358.     //Insert to list head
  359. slot_list_insert2head( slot_id );
  360.     return;
  361. }
  362. /*---------------------------------------------------------------------------
  363. // Function:     void slot_list_test()
  364. // Description :  Display the status of slot list
  365. // Author   : Wang Fan
  366. // Date       : 30/10/01
  367. //-------------------------------------------------------------------------*/
  368. void slot_list_test()
  369. {
  370. TAG_LIST_ITEM list_item;
  371. int i;
  372. tr_printf(("nhead: %li",slot_list_head)); 
  373. tr_printf((" tail: %li",slot_list_tail)); 
  374. tr_printf(("nBlock table:n"));
  375. for (i=1; i<=CACHE_NBR_SLOT; i++)
  376. {
  377. sc_cache_getBytes( ( DWORD)slotTbl_get_scHandle(i), 0, sizeof(list_item), &list_item);
  378. tr_printf(("blk: %li",i));
  379. tr_printf((" tag: %li"));
  380. tr_printf((" prev: %li"));
  381. tr_printf((" next: %lin"));
  382. }
  383.     return;
  384. }
  385. /*---------------------------------------------------------------------------
  386. // Function:     BYTE slot_GetNew()
  387. // Description :  Get a available slot from cache. 
  388.                 If there is a empty slot, insert it to the head of slot list.
  389.                 Othwise, get the slot calculated by LRU algorithm
  390. // Author   : Wang Fan
  391. // Date       : 30/10/01
  392. //-------------------------------------------------------------------------*/
  393. BYTE slot_GetNew(void)
  394. {
  395. BYTE slot_id;
  396.     if (free_slot_count)
  397.     {
  398.         slot_id = (BYTE)CACHE_NBR_SLOT - free_slot_count + 1;
  399.         free_slot_count--;
  400.         slot_list_insert2head( slot_id );
  401.         return slot_id;
  402.     }  
  403.     slot_id = slot_list_tail;
  404. slot_list_move2head( slot_list_tail );
  405. return slot_id;
  406. }
  407. /*---------------------------------------------------------------------------
  408. // Function:     DWORD slot_get_tag( BYTE slot_id)
  409. // Description :  Get the tag(lbn) of specified slot
  410. // Author   : Wang Fan
  411. // Date       : 30/10/01
  412. //-------------------------------------------------------------------------*/
  413. DWORD slot_get_tag( BYTE slot_id)
  414. {
  415. TAG_LIST_ITEM list_item;
  416. sc_cache_getBytes( ( DWORD)slotTbl_get_scHandle(slot_id), 0, sizeof(list_item), &list_item);
  417. return list_item.tag;
  418. }
  419. /*---------------------------------------------------------------------------
  420. // Function:     void slot_set_tag( BYTE slot_id, DWORD lbn)
  421. // Description :  Set the tag(lbn) of specified slot
  422. // Author   : Wang Fan
  423. // Date       : 30/10/01
  424. //-------------------------------------------------------------------------*/
  425. void slot_set_tag( BYTE slot_id, DWORD lbn)
  426. {
  427. TAG_LIST_ITEM list_item;
  428. sc_cache_getBytes( ( DWORD)slotTbl_get_scHandle(slot_id), 0, sizeof(list_item), &list_item);
  429. list_item.tag = lbn;
  430. sc_SetBytes32( ( DWORD)slotTbl_get_scHandle(slot_id), 0, sizeof(list_item), &list_item);
  431. if (slot_id == slot_list_head)
  432.          blk_in_first_slot = lbn;
  433. return;
  434. }
  435. #if 0
  436. /************************ Code for read data from SCPAD cache ***************************/
  437.  
  438. //#define SC_BASE_ADDR 0x1E4C00 // 64M SDRAM   218K SCPAD
  439. /*---------------------------------------------------------------------------
  440. // Function:  void sc_read_cache_data( DWORD dw_abs_word_offset, WORD *p_buff,  WORD i_word_count )
  441. //
  442. // Description :  Read word from SCPAD
  443. // Author   : Wang Fan
  444. // Date       : 30/10/01
  445. //-------------------------------------------------------------------------*/
  446. void sc_read_cache_data( DWORD dw_abs_word_offset, WORD *p_buff,  WORD i_word_count )
  447. {
  448. //dw_abs_word_offset += SC_BASE_ADDR;
  449. if (!((DWORD) p_buff&0x01)){ /* case where destination ptr is EVEN */
  450. /* we can do WORD copy without any problem*/
  451. I49_ReadDRAMDataNSW( (UINT32)dw_abs_word_offset, (UINT16*)p_buff, i_word_count );
  452. }
  453. else{ /* case where destination ptr is ODD */
  454. /* must do a byte copy */
  455. BYTE *p_byte = (BYTE *)p_buff;
  456. WORD i_tmp;
  457. BYTE *p_tmp_byte;
  458. int i;
  459. p_tmp_byte = (BYTE *) &i_tmp;
  460. #ifdef MOTOROLA
  461. for(i=0;i<i_word_count;i++){
  462. I49_ReadDRAMDataNSW(dw_abs_word_offset+i, &i_tmp, 1 );
  463. p_byte[i<<1] = p_tmp_byte[0];
  464. p_byte[(i<<1)+1] = p_tmp_byte[1];
  465. }
  466. #else
  467. for(i=0;i<i_word_count;i++){
  468. I49_ReadDRAMDataNSW(dw_abs_word_offset+i, &i_tmp, 1 );
  469. p_byte[i<<1] = p_tmp_byte[1];
  470. p_byte[(i<<1)+1] = p_tmp_byte[0];
  471. }
  472. #endif
  473. }
  474. }
  475. #endif//if 0
  476. /*---------------------------------------------------------------------------
  477. // Function:  int  sc_cache_getBytes( DWORD sc_handle, WORD i_byte_offset, WORD i_byte_count, BYTE *p_buff )
  478. //
  479. // Description :  Read data from SCPAD. The usage is same with sc_GetBytes(), but is faster.
  480. // Author   : Wang Fan
  481. // Date       : 30/10/01
  482. //-------------------------------------------------------------------------*/
  483. void  sc_cache_getBytes( DWORD sc_handle, WORD i_byte_offset, WORD i_byte_count, BYTE *p_buff )
  484. {
  485. WORD i_VarTmp = 0;
  486. DWORD dw_absolute_offset;
  487. if (!i_byte_count)
  488. return;
  489. dw_absolute_offset = (((DWORD)sc_handle)<<2)+(DWORD) i_byte_offset;
  490. DEC_GetBytesInSDRAM( dw_absolute_offset,0, i_byte_count, p_buff,0x00);
  491. #if 0
  492. wai_sem(SEM_DRAM_ID);
  493. /* Odd Offset to retrieve */
  494. if(dw_absolute_offset & 0x01) {
  495. if (i_byte_count > 1) {
  496. /* Read the even part of the buffer */
  497. sc_read_cache_data((DWORD)((dw_absolute_offset+2)>>1), (WORD*)p_buff, (WORD)(i_byte_count>>1));
  498. /* Shift the Whole buffer to free the first byte */
  499. for (i_VarTmp=i_byte_count-1; i_VarTmp>0; i_VarTmp--)
  500. {
  501. p_buff[i_VarTmp]=p_buff[i_VarTmp-1];
  502. }
  503. }
  504. sc_read_cache_data((dw_absolute_offset>>1), &i_VarTmp, 1);
  505. /* Shift the WORD to get the Higher Byte */
  506. #ifndef MOTOROLA
  507. i_VarTmp = (i_VarTmp>>8)&0xFF;
  508. #endif
  509. /* Write the First Byte into the Buffer */
  510. p_buff[0]=(BYTE)i_VarTmp;
  511. }
  512. else if(!(dw_absolute_offset&0x01)&&(i_byte_count&0x01)) {
  513. /* Read the even part of the buffer */
  514. sc_read_cache_data((DWORD)(dw_absolute_offset>>1), (WORD*)p_buff, (WORD)(i_byte_count>>1));
  515. /* Read the last byte */
  516. sc_read_cache_data(((dw_absolute_offset+i_byte_count)>>1) , &i_VarTmp, 1);
  517. #ifdef MOTOROLA
  518. i_VarTmp = (i_VarTmp>>8)&0xFF;
  519. #endif
  520. i_VarTmp = i_VarTmp&0x00FF;
  521. /* Write the last Byte */
  522. p_buff[i_byte_count-1]=(BYTE)i_VarTmp;
  523. } else /* Odd Offset and Even Nbr of Bytes to retrieve */
  524. if(!(dw_absolute_offset&0x01)) {
  525. sc_read_cache_data((DWORD)(dw_absolute_offset>>1), (WORD*)p_buff, (WORD)(i_byte_count>>1));
  526. }
  527. sig_sem(SEM_DRAM_ID);
  528. #endif//if 0
  529. }
  530. #endif//DISC_CACHE_ENABLE