home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
vol_100
/
199_01
/
ged9.c
< prev
next >
Wrap
Text File
|
1987-12-17
|
4KB
|
204 lines
/*
Header: CUG199;
Title: Module 9 of ged editor;
Last Updated: 11/29/87;
Description: "PURPOSE: manages virtual memory";
Keywords: e, editor, qed, ged, DeSmet, MSDOS;
Filename: ged9.c;
Warnings: "O file must be present during link for ged";
Authors: G. Nigel Gilbert, James W. Haefner, and Mel Tearle;
Compilers: DeSmet 2.51;
References:
Endref;
*/
/*
e/qed/ged screen editor
(C) G. Nigel Gilbert, MICROLOGY, 1981 - August-December 1981
Modified: Aug-Dec 1984: BDS-C 'e'(vers 4.6a) to 'qe' (J.W. Haefner)
March 1985: BDS-C 'qe' to DeSmet-C 'qed' (J.W. Haefner)
May 1986: qed converted to ged (Mel Tearle)
August 1987: ged converted to MSC 4.0 (Mel Tearle)
File: ged9.c
Functions: initvm, freememslot, swapout, writepage,
swappin, readpage, fatalerror
*/
#ifndef TC
#include "ged.h"
#else
#include "ged.t"
#endif
/* initialise virtual memory system
*/
void initvm()
{
int slot;
unsigned int mem, stk;
unsigned char *base, *pagemem, *stkaddr;
#ifdef MSC
mem = _memavl();
stk = stackavail();
slotsinmem = ( mem - stk )/PAGESIZE;
pagemem = (char *)( 65535 - mem );
#else
freeall( 5000 );
stkaddr = _showsp();
pagemem = _memory();
slotsinmem = ( stkaddr-STKSPACE-pagemem )/PAGESIZE;
#endif
if ( slotsinmem < 3 ) {
putstr( " More memory needed to run 'ged' " );
exit(0);
}
if ( slotsinmem > MAXMEMSLOTS ) slotsinmem = MAXMEMSLOTS;
for ( slot = 0, base = pagemem;
slot < slotsinmem; slot++, base += PAGESIZE ) {
usage[slot] = FREE;
slotaddr[slot] = base;
}
pclock = 0;
/* reserve slot 0 for tp
*/
tp = ( struct addr * )pagemem;
tppages = 1;
usage[0] = NOTAVAIL;
/* force balloc to find a new page to start
*/
pageloc[(newpage = 0)] = FREE;
allocp = PAGESIZE+1;
/* paging file not yet created
*/
pagefd = NOFILE;
strcpy( pagingfile, " :$$$.@@@" );
pagingfile[0] = ( ( pagingdisk ) ? pagingdisk : ( char )( curdsk+'A' ) );
/* don't remove - needed to initialize environment
*/
puttext();
}
/* returns the number of a free memory slot,
* possibly by swapping out the least recently
* used page currently in memory
*/
int freememslot()
{
int use, u;
int i, slot;
for ( use = MAXINT, i = 0; use && i < slotsinmem; i++ )
if ( ( u = usage[i] ) != NOTAVAIL && u < use ) {
use = u;
slot = i;
}
/* no free slots */
if ( use )
swapout( slot );
return slot;
}
/* swaps page currently in memory at 'slot' to disk,
* updating pageloc to show new location
*/
void swapout(slot)
int slot;
{
int *pl;
/* find page number of page at 'slot'
*/
for ( pl = &pageloc[0]; *pl != slot; pl++ );
*pl =-( writepage( slot ) );
/* update pageloc with disk slot written to */
}
/* writes page currently in memory at 'slot' to disk;
* returns disk slot where written
*/
unsigned writepage(slot)
int slot;
{
unsigned loc;
long sekbytes;
if ( pagefd == NOFILE ) {
if ( ( pagefd = creat( pagingfile ) ) == FAIL )
fatalerror( " Can't create a buffer file" );
for ( loc = 0; loc < MAXSLOTS; loc++ )
dskslots[loc] = FREE;
}
for ( loc = 0; dskslots[loc] != FREE; loc++ ); /* find a free slot */
sekbytes = 1L*loc*PAGESIZE;
if ( lseek( pagefd, sekbytes, ABSOLUTE ) == -1L )
fatalerror(" Bad seek in writing buffer ");
if ( write( pagefd, slotaddr[slot], PAGESIZE ) == FAIL )
fatalerror(" Can't write to buffer - disk full " );
dskslots[loc] = INUSE;
usage[slot] = FREE;
return loc;
}
/* get 'page', currently on disk,
* into memory and return slot where placed
*/
int swappin(page)
int page;
{
int slot;
readpage( ( slot = freememslot() ), -pageloc[page] );
usage[slot] = INUSE;
return pageloc[page] = slot;
}
/* read a page from disk into memory at 'memslot'
*/
void readpage(memslot,dskslot)
unsigned memslot, dskslot;
{
long sekbytes;
sekbytes = 1L*dskslot*PAGESIZE;
if ( lseek( pagefd, sekbytes, ABSOLUTE ) == -1L )
fatalerror(" Bad seek in reading buffer ");
if ( read( pagefd, slotaddr[memslot], PAGESIZE ) != PAGESIZE )
fatalerror(" Can't read buffer ");
dskslots[dskslot] = FREE;
}