home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / tt / vmem11 / vmem_prg / vm_fill.c < prev    next >
C/C++ Source or Header  |  1990-08-02  |  2KB  |  75 lines

  1. #include "vmem.h"
  2.  
  3. /***********************************/
  4. /* Füllen eines Speicherbereiches: */
  5. /***********************************/
  6.  
  7. long vm_fill (address, count, value)
  8.     V_ADR address;
  9.     long count;
  10.     int value;
  11. {
  12.     BYTE    *page_ptr;
  13.     VPAGE    vmempage;
  14.     WORD    start_offset;
  15.     long    entry_size;
  16.  
  17.     vmempage = GET_PAGE (address);
  18.     start_offset = GET_OFFSET (address);
  19.  
  20. #ifdef DEBUG
  21.     printf ("VM_FILL: page: %x  offset: %x\n", vmempage, start_offset);
  22. #endif
  23.  
  24.     if ((vmempage >= info.count_page) || (flags [vmempage] == FREE))
  25.         return (ILLEGAL_ADDRESS);
  26.     
  27.     if ((count == 0) || (count < -1))
  28.         return (ILLEGAL_COUNT);
  29.  
  30.     entry_size = PAGE_TO_ADDR (MD_COUNT (md_find (vmempage)));
  31.  
  32.     if (count == -1)
  33.         count = entry_size - start_offset;
  34.     else
  35.         entry_size = count = MIN (count, (entry_size - start_offset));
  36.  
  37.     if (start_offset > 0)
  38.     {
  39.         long    size = info.page_size - start_offset;
  40.  
  41.         page_ptr = load_page (vmempage++, CACHE_WRITE) + start_offset;
  42.         if (count <= size)
  43.         {
  44.             memset (page_ptr, value, count);
  45.             return (count);
  46.         }
  47.         else
  48.         {
  49.             memset (page_ptr, value, size);
  50.             entry_size -= size;
  51.         }
  52.     }
  53.  
  54.     if (entry_size >= info.page_size)
  55.     {
  56.         FILL_CACHE (buffer, value);
  57. /*    memset (buffer, value, info.page_size);*/
  58.  
  59.         do
  60.         {
  61.             save_page (buffer, vmempage++);
  62.             entry_size -= info.page_size;
  63.         }
  64.         while (entry_size >= info.page_size);
  65.     }
  66.  
  67.     if (entry_size > 0)
  68.     {
  69.         page_ptr = load_page (vmempage, CACHE_WRITE);
  70.         memset (page_ptr, value, entry_size);
  71.     }
  72.  
  73.     return (count);
  74. }
  75.