home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource3 / 158_01 / qe9 < prev    next >
Encoding:
Text File  |  1987-10-12  |  3.3 KB  |  134 lines

  1. /*  VERSION 0001    (DATE: 28.III.85)  (TIME: 9:54 am)                  */
  2. /*
  3.     e (qe) screen editor
  4.  
  5.     (C) G. Nigel Gilbert, MICROLOGY, 1981
  6.  
  7.     August-December 1981
  8.     Modified: To QE from e (ver 4.6a) by J.W. Haefner -- Oct 84-Mar 85
  9.  
  10.     FILE: qe9
  11.  
  12.     FUNCTIONS: initvm,freememslot,swapout,writepage,swappin,readpage,
  13.             fatalerror
  14.  
  15.     PURPOSE: manages virtual memory
  16.  
  17. */
  18.  
  19. #include "qe.h"
  20.  
  21. initvm()    /*initialise virtual memory system*/
  22. {
  23.     sint slot;
  24.     unsigned *cpm, base;
  25.  
  26.     cpm=6;    /*address of base of BDOS*/
  27.     slotsinmem=(*cpm-7-TOP-(wboot?0:CCP))/PAGESIZE;
  28.     if (slotsinmem < 3) {
  29.         puts("More memory needed to run 'e'"); 
  30.         exit();
  31.         }
  32.     for (slot=0, base=TOP; slot < slotsinmem; slot++, base+=PAGESIZE) {
  33.         usage[slot]=FREE;
  34.         slotaddr[slot]=base;
  35.         }
  36.     clock=0;
  37.  
  38.     /*reserve slot 0 for tp*/
  39.     tp=TOP; 
  40.     tppages=1;
  41.     usage[0]=NOTAVAIL;
  42.  
  43.     /*force balloc to find a new page to start*/
  44.     pageloc[(newpage=0)]=FREE; 
  45.     allocp=PAGESIZE+1;
  46.  
  47.     /*paging file not yet created*/
  48.     pagefd=NOFILE;
  49.     strcpy(pagingfile,"  e$$$.$$$");
  50.     if (pagingdisk) {
  51.         pagingfile[0]=pagingdisk; 
  52.         pagingfile[1]=':';
  53.         }
  54. }
  55.  
  56. freememslot()    /*returns the number of a free memory slot, possibly by swapping
  57.           out the least recently used page currently in memory*/
  58. {
  59.     int use, u;
  60.     sint i, slot;
  61.  
  62.     for (use=MAXINT, i=0; use && i < slotsinmem; i++)
  63.         if ( (u=usage[i]) != NOTAVAIL && u < use) {
  64.             use=u; 
  65.             slot=i;
  66.             }
  67.     if (use) /*no free slots*/ swapout(slot);
  68.     return slot;
  69. }
  70.  
  71. swapout(slot)    /*swaps page currently in memory at 'slot' to disk,
  72.           updating pageloc to show new location*/
  73. sint slot;
  74. {
  75.     int *pl;
  76.  
  77.     /*find page number of page at 'slot'*/
  78.     for (pl=&pageloc[0]; *pl != slot; pl++);
  79.     *pl=-writepage(slot); /*update pageloc with disk slot written to */
  80. }
  81.  
  82. writepage(slot)    /*writes page currently in memory at 'slot' to disk;
  83.           returns disk slot where written*/
  84. sint slot;
  85. {
  86.     sint loc;
  87.  
  88.     if (pagefd == NOFILE) { /*haven't opened paging file yet*/
  89.         if (dskcheck(setjmp(dskerr)) || (pagefd=creat(pagingfile)) == FAIL)
  90.             fatalerror("Can't create a buffer file");
  91.         for (loc=0; loc < MAXSLOTS; loc++) dskslots[loc]=FREE;
  92.         }
  93.     for (loc=0; dskslots[loc] != FREE; loc++); /*find a free slot*/
  94.  
  95.     if (dskcheck(setjmp(dskerr)) || seek(pagefd,loc*PAGESECTS,ABSOLUTE) == FAIL)
  96.         fatalerror("Bad seek in writing buffer");
  97.     if (write(pagefd,slotaddr[slot],PAGESECTS) != PAGESECTS)
  98.         fatalerror("Can't write to buffer - disk full");
  99.     dskslots[loc]=INUSE;
  100.     usage[slot]=FREE;
  101.     return loc;
  102. }
  103.  
  104. swappin(page)    /*get 'page', currently on disk, into memory and return slot
  105.           where placed*/
  106. sint page;
  107. {
  108.     sint slot;
  109.  
  110.     readpage( (slot=freememslot()), -pageloc[page]);
  111.     usage[slot]=INUSE;
  112.     return pageloc[page]=slot;
  113. }
  114.  
  115. readpage(memslot,dskslot)    /*read a page from disk into memory at 'memslot'*/
  116. sint memslot, dskslot;
  117. {
  118.     if (seek(pagefd,dskslot*PAGESECTS,ABSOLUTE) == FAIL)
  119.         fatalerror("Bad seek in reading buffer");
  120.     if (read(pagefd,slotaddr[memslot],PAGESECTS) != PAGESECTS)
  121.         fatalerror("Can't read buffer");
  122.     dskslots[dskslot]=FREE;
  123. }
  124.  
  125. fatalerror(message)    /*displays message, returns to a known good screen*/
  126. char *message;
  127. {
  128.     error(message);
  129.     moveline(goodline-cline);
  130.     longjmp(mainmenu);
  131. }
  132. least recently used page currently in memory*/
  133. {
  134.     i