home *** CD-ROM | disk | FTP | other *** search
/ The Best of Mecomp Multimedia 2 / MECOMP-CD-II.iso / amiga / emulation / shapeshifter / videodrivers / a2410evd / a2410refresh.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-06-15  |  2.6 KB  |  86 lines

  1. #include <exec/exec.h>
  2. #include <exec/types.h>
  3. #include <intuition/intuition.h>
  4. #include <proto/intuition.h>
  5. #include <proto/exec.h>
  6.  
  7. extern void __asm __regargs hst2gsp32(    register __d0 BYTE *gsp_addr,
  8.                                         register __d6 ULONG screen_width,
  9.                                         register __a0 BYTE *src_addr);
  10.  
  11. extern ULONG __asm __regargs MemCmpCpy(    register __a5 ULONG width_in_bytes,
  12.                                         register __a0 BYTE *src_addr,
  13.                                         register __a1 BYTE *dst_addr);
  14.  
  15. void __asm __regargs refresh(    register __d0 UWORD delta_used,
  16.                                 register __d1 BYTE *delta_base,
  17.                                 register __d6 ULONG screen_width,
  18.                                 register __d7 UWORD page_number,
  19.                                 register __a0 BYTE *scr_base,
  20.                                 register __a1 ULONG amount,
  21.                                 register __a2 UWORD num_pages)
  22. {
  23.     ULONG full_scan_lines, left_over_bytes1, left_over_bytes2, 
  24.           actual_page, remainder;
  25.     BYTE *buffer_address, *gsp_addr, *delta_address;
  26.     int loop = 0;
  27.     
  28.     if(amount == 0)
  29.         return;
  30.  
  31.     /* page_number is given as 128, total pages is 158, actual page
  32.        is 30-1 = 29!!! */
  33.     actual_page = (num_pages - page_number) - 1;
  34.     
  35.     /* Find position in screen buffer memory:
  36.        - amount is MMU page size
  37.        - scr_base is base address of screen buffer
  38.        - actual_page is index */
  39.     buffer_address = (BYTE *)(actual_page * amount + scr_base);
  40.     delta_address  = (BYTE *)(actual_page * amount + delta_base);
  41.         
  42.     if(actual_page)
  43.         left_over_bytes1 = screen_width-((ULONG)(buffer_address - scr_base) % screen_width);
  44.     else
  45.         left_over_bytes1 = 0;
  46.     remainder = amount - left_over_bytes1;
  47.     left_over_bytes2 = remainder % screen_width;
  48.     remainder -= left_over_bytes2;
  49.     full_scan_lines = remainder / screen_width;
  50.     
  51.     if(left_over_bytes1) // Not a complete scan-line to transfer
  52.         gsp_addr = (BYTE *)( 0xFE000000 + (screen_width - left_over_bytes1)*8 +
  53.         ( (buffer_address - scr_base) / screen_width )*8192 );
  54.     else // Complete scan-line to transfer
  55.         gsp_addr = (BYTE *)(0xFE000000+((buffer_address-scr_base)/screen_width)*8192);
  56.  
  57.     if(left_over_bytes1)
  58.     {
  59.         hst2gsp32(gsp_addr,left_over_bytes1,buffer_address);
  60.         gsp_addr += (1024 - (screen_width - left_over_bytes1))*8;
  61.         buffer_address += left_over_bytes1;
  62.         delta_address  += left_over_bytes1;
  63.     }
  64.     
  65.     for(loop;loop<full_scan_lines;loop++)
  66.     {
  67.         if(delta_used==3)
  68.         {
  69.             if(MemCmpCpy(screen_width,buffer_address,delta_address))
  70.                 hst2gsp32(gsp_addr,screen_width,buffer_address);
  71.         }
  72.         else
  73.         {
  74.             hst2gsp32(gsp_addr,screen_width,buffer_address);
  75.         }
  76.         gsp_addr += 1024*8;
  77.         buffer_address += screen_width;
  78.         delta_address  += screen_width;
  79.     }
  80.  
  81.     if(left_over_bytes2)
  82.     {
  83.         hst2gsp32(gsp_addr,left_over_bytes2,buffer_address);
  84.     }
  85. }
  86.