home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 2 / RISC_DISC_2.iso / pd_share / program / code / andylib / c / memc < prev    next >
Encoding:
Text File  |  1994-10-04  |  1.0 KB  |  48 lines

  1. /* memc.c */
  2.  
  3. #include "kernel.h"
  4. #include "swis.h"
  5. #include "memc.h"
  6.  
  7. typedef struct
  8. {  int pageno;
  9.    int logaddr;
  10.    int protn;
  11. } memc_pageinfo;
  12.  
  13. /* Set the access mode for a bunch of pages */
  14.  
  15. int memc_setmode(char *addr, int size, int protn)
  16. {  _kernel_swi_regs regs;
  17.    _kernel_oserror *err;
  18.    memc_pageinfo page[2];
  19.    int pages, pagesize, logaddr = (int) addr;
  20.  
  21.    if (err = _kernel_swi(OS_ReadMemMapInfo, ®s, ®s), err)
  22.       return (int) err;
  23.  
  24.    pagesize = regs.r[0];
  25.    pages    = regs.r[1];
  26.  
  27.    while (size > 0)
  28.    {  page[0].pageno  = 0;
  29.       page[0].logaddr = logaddr;
  30.       page[0].protn   = 0;
  31.       page[1].pageno  = -1;
  32.  
  33.       regs.r[0] = (int) &page[0];
  34.       if (err = _kernel_swi(OS_FindMemMapEntries, ®s, ®s), err)
  35.          return (int) err;
  36.  
  37.       page[0].protn = protn;
  38.       
  39.       if (err = _kernel_swi(OS_SetMemMapEntries, ®s, ®s), err)
  40.          return (int) err;
  41.  
  42.       size -= (logaddr + pagesize) / pagesize * pagesize - logaddr;
  43.       logaddr = (logaddr + pagesize) / pagesize * pagesize;
  44.    }
  45.  
  46.    return 0;
  47. }
  48.