From: sparky4 Date: Thu, 12 Feb 2015 19:02:05 +0000 (-0600) Subject: added a EMS & XMS library X-Git-Url: http://4ch.mooo.com/gitweb/?a=commitdiff_plain;h=d3f8280463ec0bc9aede20aa5a2c38d8f0bd0fd7;hp=1656198fcaab120057b1f1dbff4556702571033a;p=16.git added a EMS & XMS library modified: Project 16.bfproject new file: src/lib/exmm/EMM.EXE new file: src/lib/exmm/emm.c new file: src/lib/exmm/emmret.h new file: src/lib/exmm/emmsize.h new file: src/lib/exmm/memory.c new file: src/lib/exmm/memory.h new file: src/lib/exmm/x.bat renamed: src/lib/xmem/xmem.asm -> src/lib/exmm/xmem.asm new file: src/lib/exmm/xmem.c renamed: src/lib/xmem/xmem.h -> src/lib/exmm/xmem.h renamed: src/lib/xmem/xmem.txt -> src/lib/exmm/xmem.txt renamed: src/lib/xmem/xmemc.c -> src/lib/exmm/xmemc.c --- diff --git a/Project 16.bfproject b/Project 16.bfproject index be3520aa..63ddf998 100644 --- a/Project 16.bfproject +++ b/Project 16.bfproject @@ -1,6 +1,6 @@ c2e.convert_special: 0 e2c.convert_num: 0 -openfiles: /dos/z/16/doc/project.txt:0:0:1: +openfiles: /dos/z/16/doc/project.txt:138:0:0: openfiles: /dos/z/16/src/palettec.c:0:0:0: openfiles: /dos/z/16/src/pcxtest.c:0:0:0: openfiles: /dos/z/16/src/scroll.c:0:0:0: @@ -12,6 +12,18 @@ openfiles: /dos/z/16/src/lib/ems.c:0:0:0: openfiles: /dos/z/16/src/lib/ems1.c:0:0:0: openfiles: /dos/z/16/src/lib/planar.h:0:0:0: openfiles: /dos/z/16/src/lib/PLANAR.C:0:0:0: +openfiles: /dos/z/16/src/lib/bitmap.c:0:0:0: +openfiles: /dos/z/16/src/lib/bitmap.h:0:0:0: +openfiles: /dos/z/16/src/lib/dos_kb.c:0:0:0: +openfiles: /dos/z/16/src/lib/dos_kb.h:0:0:0: +openfiles: /dos/z/16/src/lib/lib_head.cpp:0:0:0: +openfiles: /dos/z/16/src/lib/lib_head.h:0:0:0: +openfiles: /dos/z/16/src/lib/modex16.c:444:0:0: +openfiles: /dos/z/16/src/lib/modex16.h:0:0:0: +openfiles: /dos/z/16/src/lib/scroll.c:0:0:0: +openfiles: /dos/z/16/src/lib/scroll.h:0:0:0: +openfiles: /dos/z/16/src/lib/types.h:0:0:0: +openfiles: /dos/z/bakac.c:0:0:1: snr_recursion_level: 0 convertcolumn_horizontally: 0 adv_open_matchname: 0 @@ -23,7 +35,7 @@ view_left_panel: 0 default_mime_type: text/plain e2c.convert_xml: 1 c2e.convert_iso: 0 -opendir: file:///dos/z/16/doc +opendir: file:///dos/z wrap_text_default: 0 bookmarks_filename_mode: 1 snr_casesens: 0 @@ -55,8 +67,22 @@ recent_files: file:///dos/z/16/src/lib/ems1.c recent_files: file:///dos/z/16/src/lib/planar.h recent_files: file:///dos/z/16/src/lib/PLANAR.C recent_files: file:///dos/z/16/doc/project.txt +recent_files: file:///dos/z/16/src/lib/bitmap.c +recent_files: file:///dos/z/16/src/lib/bitmap.h +recent_files: file:///dos/z/16/src/lib/dos_kb.c +recent_files: file:///dos/z/16/src/lib/dos_kb.h +recent_files: file:///dos/z/16/src/lib/lib_head.cpp +recent_files: file:///dos/z/16/src/lib/lib_head.h +recent_files: file:///dos/z/16/src/lib/modex16.h +recent_files: file:///dos/z/16/src/lib/modex16.c +recent_files: file:///dos/z/16/src/lib/scroll.c +recent_files: file:///dos/z/16/src/lib/scroll.h +recent_files: file:///dos/z/16/src/lib/types.h +recent_files: file:///dos/z/rbaka.c +recent_files: file:///dos/z/baka.c +recent_files: file:///dos/z/bakac.c snr_replacetype: 0 -savedir: file:///dos/z/16/src +savedir: file:///dos/z spell_check_default: 1 spell_insert_entities: 0 last_filefilter: diff --git a/src/lib/exmm/EMM.EXE b/src/lib/exmm/EMM.EXE new file mode 100644 index 00000000..a0843535 Binary files /dev/null and b/src/lib/exmm/EMM.EXE differ diff --git a/src/lib/exmm/emm.c b/src/lib/exmm/emm.c new file mode 100644 index 00000000..f642fada --- /dev/null +++ b/src/lib/exmm/emm.c @@ -0,0 +1,78 @@ +// Cut this out as emm.c + +/* File: emm.c + * Module: All Modules + * Author(s): Chris Somers + * Date: December 1, 1992 + * Version: V.1.1 + + minor mods by Alex Russell to simplify + + Must use memory model with FAR code + + */ + + +#include +#include +#include + +#include "memory.c" + +void TransformData(char *pEmmData, unsigned int len) +{ + while ( len ) + { + (*pEmmData)++; + pEmmData++; + + len--; + } +} + +void main(void) +{ + char *pEmmData; + int hEData; + + if ( OpenEMM() != SUCCESS ) + { // make sure we got EMM + printf("EMM unavailable.\n"); + exit(1); + } + else + printf("Emm available\n"); + + pEmmData = (char *)EMMalloc(&hEData, 6); // get 6 * 16K bytes - 96K + if ( pEmmData == NULL ) + { + printf("Not enough EMM or out of handles.\n"); + exit(2); + } + else + printf("emm alloced OK\n"); + + + printf("Map 1st 4 pages\n"); + MapEMM(hEData, 0, 4); // load 1st 4 pages into page frame: 0-3 + + memset(pEmmData, 0x0e, 64000u); + UnmapEMM(hEData, 0, 4); // not absolutely necessary + + printf("Map next 2 pages\n"); + MapEMM(hEData, 4, 2); // map last 2 pages: 4-5 + memset(pEmmData, 0x0e, 32768u); + + MapEMM(hEData, 0, 4); + // do some stuff with the first 64K of file data. + printf("Transform data\n"); + TransformData(pEmmData, 64000UL); + MapEMM(hEData, 4, 2); // only unmaps 1st two pages of prior 64k mapping + // do stuff with remaining 32K of data + TransformData(pEmmData, 32768UL); + UnmapEMM(hEData, 0, 4); // should unmap before freeing + + printf("Close emm\n"); + EMMFree(hEData); // finished with the file data + CloseEMM(); +} diff --git a/src/lib/exmm/emmret.h b/src/lib/exmm/emmret.h new file mode 100644 index 00000000..1ef3e670 --- /dev/null +++ b/src/lib/exmm/emmret.h @@ -0,0 +1,84 @@ +// AJR notes: some of these are not used by the emm code + +// Cut this out as emmret.h + +/* File: EmmRet.h + * Module: All Modules + * Author(s): Chris Somers + * Date: May 8, 1992 + * Version: V.1.0 + */ + +#ifndef _EMM_RETURNS_DEF +#define _EMM_RETURNS_DEF 1 + +/* Module return values */ + +/* Return Values */ + +#define START 8 +#define END 7 +#define MOVABORT 6 +#define PRN_COMPLETE 5 +#define PRN_PROGRESS 4 +#define INCOMPLETE 3 +#define HAVEROOM 2 +#define SUCCESS 1 +#define TRUE 1 +#define YES 1 +#define FALSE 0 +#define NO 0 +#define NOTREADY 0 +#define NO_DATA 0 +#define NONE -1 + +/* Start of Recoverable error codes */ + +#define NO_SPACE -1001 +#define NOTPOLLING -1002 +#define ALREADYDONE -1003 +#define NO_PRN_DEV -1004 +#define OUTF_PAPER -1005 +#define NO_VIDEO -1006 +#define TIMEOUT -1007 +#define FILENOPEN -1008 +#define ABORT_REQ -1009 +#define DEV_IOERR -1010 + +#define MAXRERR 10 +#define RECOVERABLE -1999 /* all above errors are recoverable */ + +/* Start of Threadfatal error codes */ + +#define NOT_OPEN -2001 +#define NOT_ATTACHED -2002 +#define NO_CONNECTION -2003 +#define INSUFF_MEM -2004 +#define NR_TIMEOUT -2005 + +#define MAXTERR 5 +#define THREADFATAL -2999 /* above errors force task to cancel */ + +/* Start of Systemfatal error codes */ + +#define BAD_TASKNUM -3001 +#define BAD_HANDLE -3002 +#define BAD_HARDWARE -3003 +#define INVALIDACTION -3004 +#define NOFREEITEMS -3005 +#define NO_MEMORY -3006 +#define NO_EMS -3007 +#define VALUE_OUTF_RANGE -3008 +#define BAD_MODE -3009 +#define NO_PALETTE -3010 +#define BAD_DISPPAGE -3011 +#define NO_TSR -3012 +#define BUFTOOSMALL -3013 +#define BAD_NAME -3014 +#define BAD_DISPHW -3015 +#define NO_FLOPPY -3016 + +#define MAXSERR 16 +#define SYSTEMFATAL -3999 /* above errors are fatal to system */ + +#endif diff --git a/src/lib/exmm/emmsize.h b/src/lib/exmm/emmsize.h new file mode 100644 index 00000000..8570875d --- /dev/null +++ b/src/lib/exmm/emmsize.h @@ -0,0 +1,97 @@ +// Cut this out as emmsize.h + +/* File: EmmSize.h + * Module: All Modules + * Author(s): Chris Somers + * Date: May 8, 1992 + * Version: V.1.0 + */ + +#ifndef _EMMSIZES_DEF +#define _EMMSIZES_DEF 1 + + +/* Module size constants */ + +#define MAXACTIONS 29 +#define MAXCHANNELS 4 +#define MAXFOCUS 3 +#define MAXBUFTYPES 64 +#define MAXEMHANDLES 64 /* up to a max of 255 */ +#define MAXTIMERS 32 +#define MAXTITEMS 128 +#define MAXQUEUES 24 +#ifdef PRINTER +#define MAXPRNS 4 +#else +#define MAXPRNS 0 +#endif +#ifdef UTSCOM +#define MAXUTSSCRNS 2 +#else +#define MAXUTSSCRNS 0 +#endif +#ifdef CAPTURE +#define MAXCAPTURE 1 +#else +#define MAXCAPTURE 0 +#endif +#define MAXIRQS 10 +#define MAXTCPDSCPTITEMS 16 /*max # of TCP connections*/ + +#define FREEBUFF 1 /* CallIODevice flag for BuffSize arrays */ +#define DSCONLY 2 /* allocate a BufDscpt, only - no buffer */ + +#define EMMPAGESIZE 0x4000 /* 16K EMM page size */ +#define SETUPLEN 32 +#define NAMELEN 40 +#define UNIXLEN 32 +#define ADDRLEN 16 +#define TITLELEN 128 +#define TSLEN 80 +#define COMMENTLEN 65 +#define PALSIZE 768 +#define QSTRLEN 254 +#define PRNBUFSIZ 2048 +#define TXTSCRNSIZE 4096 +#define UTSBUFSIZ 4096 +#define UTSSCRNSIZ 1920 +#define QMEMSIZE 15 +#define KBUFLEN 16 +#define GXBUFFSIZE 0x4000 +#define TCPNDBUFFSIZE 0x1000 /*router auto-allocation buff size*/ + /* graphics printing scale values */ +#define SCALE_HALF 1 /* value must not change */ +#define SCALE_ONE 2 +#define SCALE_QUART 3 /* value must not change */ + +#define SIXTH_SECOND 3L /* shade over 1/6 of a second*/ +#define HALF_SECOND 9L +#define ONE_SECOND 18L +#define TWO_SECONDS 36L +#define FIVE_SECONDS 91L +#define TEN_SECONDS 182L +#define HALF_MINUTE 182*3L /* same as 18.2*30, right? */ +#define ONE_MINUTE 182*6L /* same as 18.2*60, right? */ +#define TWO_MINUTES 182*12L /* same as 18.2*120, right? */ +#define FIVE_MINUTES 182*30L /* same as 18.2*300, right? */ +#define TEN_MINUTES 182*60L /* same as 18.2*600, right? */ +#define HALF_HOUR 182*180L /* same as 18.2*1800, right? */ +#define ONE_HOUR 182*360L /* same as 18.2*3600, right? */ + +#define MAXROUTMOVES 24 /*max # of routing moves at one time*/ + /*also max # of Move Complete Events*/ +/* Event Channel Defines */ + +#define MAXRECALLEVENTS 1 /*max nm of Recall Event Channels*/ +#define MAXKBDEVENTS 1 /*max nm of Kbd Event Channels*/ +#define MAXPRNEVENTS 4 /*max nm of Prt Prog & Prt Cmplte Event Chan*/ +#define MAXUTSRCVEVENTS MAXUTSSCRNS /*max nm of Uts Rx Event Chans*/ +#define MAXUTSXMTEVENTS MAXUTSSCRNS /*max nm of Uts Tx Event Chans*/ +#define MAXCAPEVENTS 2 /* max number of capture event channels */ +#define MAXOP1CMPLTEVENTS 1 /*max nm of Operation 1 Cmplt Event Channels*/ +#define MAXOP2CMPLTEVENTS 1 /*max nm of Operation 2 Cmplt Event Channels*/ +#define MAXOP3CMPLTEVENTS MAXTCPDSCPTITEMS /*max nm of Op 3 Event Chans*/ +#define MAXTCPEVENTS MAXTCPDSCPTITEMS /* max nm of TCP Event types */ + +#endif diff --git a/src/lib/exmm/memory.c b/src/lib/exmm/memory.c new file mode 100644 index 00000000..ce58c3e4 --- /dev/null +++ b/src/lib/exmm/memory.c @@ -0,0 +1,397 @@ + +/* File: Memory.c + * Module: All Modules + * Author(s): Chris Somers + * Date: December 1, 1992 + * Version: V.1.1 + + minor mods by Alex Russell to simplify + + Must use memory model with FAR code + + */ + + + +#if !defined(__LARGE__) && !defined(__COMPACT__) && !defined(__HUGE__) +#error Invalid memory model for compiling MEMORY.C +#endif + +#include +#include +#include + +#include "memory.h" + +// static globals -------------------------------- + +static int ActiveEMList[MAXEMHANDLES]; +static unsigned int EMMSeg; + +// forward declarations --------------------------------- + +static int EMPresent(void); +static int EMReady(void); +static unsigned int GetEMMSeg(void); +static int GetEMHandle(int NumPages); +static int EMMap(int Handle, int LogPg, int PhyPg); +static int FreeEMHandle(int Handle); +static int GetNumPages(int Handle); +static int EMStateSave(int Handle); +static void EMStateRestore(int Handle); + + +/********************************************************************/ +int +OpenEMM(void) +{ + if (!EMPresent() || !EMReady()) return(NOTREADY); + if (!(EMMSeg = GetEMMSeg())) return(NOTREADY); /*lint !e720 */ + return(SUCCESS); +} /* End of OpenEMM() */ + +/********************************************************************/ + +void +CloseEMM(void) +{ + int i; + + if (!EMMSeg) return; + for (i = 0; i < MAXEMHANDLES; i++) { + if (ActiveEMList[i]) { + FreeEMHandle(ActiveEMList[i]); + ActiveEMList[i] = 0; + } + } + EMMSeg = 0; +} /* End of CloseEMM() */ + +/********************************************************************/ + +int +EMMInstalled(void) +{ + return((EMMSeg) ? TRUE : FALSE); /* successfully opened? */ +} /* End of EMMInstalled() */ + +/********************************************************************/ + +unsigned long +EMMCoreLeft(void) +{ + unsigned Pages; + unsigned long RtnVal = 0UL; + + _asm { + mov ah,0x42 /* get EMM free page count */ + int 0x67 + or ah,ah + //js InternalError /* returns 80, 81, or 84 hex on error */ + mov Pages,bx /* number of unallocated 16K pages */ + } + RtnVal = ((unsigned long)Pages << 14); /* Pages * 16K rtns bytes*/ + +//InternalError: + + return(RtnVal); +} /* End of EMMCoreLeft() */ + +/********************************************************************/ + +void far * +EMMalloc(int *Handle, int Pages) +{ + int i; + char *RtnPtr = NULL; + + if (!EMMSeg) { + *Handle = NOTREADY; + return(NULL); + } + if ((Pages < 1) || (Pages > 1020)) { + *Handle = VALUE_OUTF_RANGE; + return (NULL); + } + for (i = 0; (i < MAXEMHANDLES) && (ActiveEMList[i]); i++) ; + if (i == MAXEMHANDLES) { + *Handle = NOFREEITEMS; + return (NULL); + } + if ((ActiveEMList[i] = GetEMHandle(Pages)) > 0) { + RtnPtr = MK_FP(EMMSeg, 0); + } + *Handle = ActiveEMList[i]; + return((void far *)RtnPtr); +} /* End of EMMalloc() */ + +/********************************************************************/ + +int +EMMRealloc(int Handle, int Pages) +{ + int RtnCode = FALSE; + + if (!EMMSeg || (Pages < 0) || (Pages > 1020)) { + return (FALSE); + } + _asm { + mov ah,0x51 /* change # of pages */ + mov bx,Pages + mov dx,Handle + int 0x67 + or ah,ah + //js NoGo /* returns 80 to 88 hex on error */ + } + RtnCode = TRUE; + +//NoGo: + + return(RtnCode); +} /* End of EMMRealloc() */ + +/********************************************************************/ + +void +EMMFree(int Handle) +{ + int i, j; + + if (!EMMSeg) return; + for (i = 0; (i < MAXEMHANDLES) && (ActiveEMList[i] != Handle); i++) ; + if (i >= MAXEMHANDLES) return; + j = 16; + while (j--) { + if (FreeEMHandle(ActiveEMList[i])) break; + } + ActiveEMList[i] = 0; +} /* End of EMMFree() */ + +/********************************************************************/ + +int /* EMM map for application */ +MapEMM(int Handle, int Start, int Pages) +{ + int i; + + if (!EMMSeg) return(NOTREADY); + for (i = 0; (i < MAXEMHANDLES) && (ActiveEMList[i] != Handle); i++) ; + if (i == MAXEMHANDLES) return (NO_DATA); + if ((GetNumPages(Handle) < Pages) || (Pages < 1) || (Pages > 4)) { + return (VALUE_OUTF_RANGE); + } + for (i = Start; i < Start + Pages; i++) { + if (!EMMap(Handle, i, i - Start)) return(NO_DATA); + } + return(SUCCESS); +} /* End of MapEMM() */ + +/********************************************************************/ + +void /* EMM unmap for application */ +UnmapEMM(int Handle, int Start, int Pages) +{ + int i, j; + + if (!EMMSeg) return; + for (i = 0; (i < MAXEMHANDLES) && (ActiveEMList[i] != Handle); i++) ; + if (i == MAXEMHANDLES) return; + j = Start + Pages; + if ((Pages < 1) || (j > 4)) return; + + for (i = Start; i < j; i++) { + EMMap(Handle, NONE, i); + } +} /* End of UnmapEMM() */ + +/********************************************************************/ + +int /* EMM map for devices - saves EMM state */ +UseEMM(int Handle, int Start, int Pages) +{ + EMStateSave(Handle); + return(MapEMM(Handle, Start, Pages)); +} /* End of UseEMM() */ + +/********************************************************************/ + +void /* EMM unmap for devices - restores EMM state */ +SaveEMM(int Handle, int Start, int Pages) +{ + UnmapEMM(Handle, Start, Pages); + EMStateRestore(Handle); +} /* End of SaveEMM() */ + +/********************************************************************/ + +static int +EMPresent(void) +{ + int i, Segment; + char EMName[] = "EMMXXXX0"; + char *s, *t; + + _asm { /* can be replaced with getvect() */ + push es + mov ax,0x3567 /* get vector for int 67h */ + int 0x21 + mov ax,es + mov Segment,ax + pop es + } + t = MK_FP(Segment, 0x0A); /* point to driver name */ + s = EMName; + for (i = 0; (i < 8) && (*s++ == *t++); i++) ; /* strncmp equivalent */ + + if (i == 8) return(TRUE); + return(FALSE); +} /*End of EMPresent() */ + +/********************************************************************/ + +static int +EMReady(void) +{ + _asm { + mov ah,0x40 /* get EM Manager Status */ + int 0x67 + or ah,ah + //jns Ready /* returns 80, 81, or 84 hex on error */ + } + return(FALSE); + +//Ready: + return(TRUE); +} /* End of EMReady() */ + +/********************************************************************/ + +static unsigned int +GetEMMSeg(void) +{ + unsigned int EMSegment; + + _asm { + mov ah,0x41 /* get EMM page frame segment */ + int 0x67 + or ah,ah + //js NotReady /* returns 80, 81, or 84 hex on error */ + mov EMSegment,bx + } + return(EMSegment); /*lint !e530 */ + +//NotReady: + return(NOTREADY); +} /* End of GetEMMSeg() */ + +/********************************************************************/ + +static int +GetEMHandle(int NumPages) +{ + int NewHandle; + + _asm { + mov ah,0x43 /* get handle and allocate EM */ + mov bx,NumPages /* number of 16K pages to allocate */ + int 0x67 + or ah,ah /* returns 80 to 89 hex on error */ + //js NoHandle + mov NewHandle,dx /* retrieve handle */ + } + return(NewHandle); + +//NoHandle: + return(NO_DATA); +} /* End of GetEMHandle() */ + +/********************************************************************/ + +static int +EMMap(int Handle, int LogPg, int PhyPg) +{ + int RtnCode = NO_DATA; + + _asm { + mov ax,PhyPg /* physical page: 0 - 3 in AL only */ + mov ah,0x44 /* map logical to physical page */ + mov bx,LogPg /* logical page: 0 - 1020 */ + mov dx,Handle + int 0x67 + or ah,ah /* returns 80 to 8B hex on error */ + //js NoMapping + } + RtnCode = SUCCESS; + +//NoMapping: + return(RtnCode); +} /* End of EMMap() */ + +/********************************************************************/ + +static int +FreeEMHandle(int Handle) +{ + _asm { + mov ah,0x45 /* free handle and deallocate EM */ + mov dx,Handle + int 0x67 + or ah,ah /* returns 80 to 86 hex on error */ + //js NotFreed + } + return(SUCCESS); + +//NotFreed: /* must retry if unsuccessful */ + return(NO_DATA); +} /* End of FreeEMHandle() */ + +/********************************************************************/ + +static int +GetNumPages(int Handle) +{ + int NumPages = 0; + + _asm { + mov ah,0x4C /* get allocated pages for Handle */ + mov dx,Handle + int 0x67 + or ah,ah /* returns 80 to 84 hex on error */ + //js BadHandle + mov NumPages,bx + } +//BadHandle: + + return(NumPages); +} /* End of GetNumPages() */ + +/********************************************************************/ + +static int +EMStateSave(int Handle) +{ + int RtnCode = NO_MEMORY; + _asm { + mov ah,0x47 /* save page map under Handle */ + mov dx,Handle + int 0x67 + or ah,ah + //js Unsaved /* out of save space error */ + } + RtnCode = SUCCESS; + +//Unsaved: + return(RtnCode); +} /* End of EMStateSave() */ + +/********************************************************************/ + +static void +EMStateRestore(int Handle) +{ + _asm { + mov ah,0x48 /* restore page map for Handle */ + mov dx,Handle + int 0x67 /* ignore error */ + } +} /* End of EMStateRestore() */ diff --git a/src/lib/exmm/memory.h b/src/lib/exmm/memory.h new file mode 100644 index 00000000..7571ff3f --- /dev/null +++ b/src/lib/exmm/memory.h @@ -0,0 +1,34 @@ +// Cut this out as memory.h + +/* File: Memory.h + * Module: All Modules + * Author(s): Chris Somers + * Date: August 5, 1993 + * Version: V.1.1 + + modified by Alex Russell to simplify. + */ + + +#ifndef _MEMORY_DEF +#define _MEMORY_DEF 1 + +#include "emmret.h" +#include "emmsize.h" + +#define CMM 0 +#define EMM 1 + +extern int OpenEMM(void); +extern void CloseEMM(void); +extern int EMMInstalled(void); +extern void far *EMMalloc(int *Handle, int Pages); +extern int EMMRealloc(int Handle, int Pages); +extern void EMMFree(int Handle); +extern int MapEMM(int Handle, int Start, int Pages); +extern void UnmapEMM(int Handle, int Start, int Pages); +extern int UseEMM(int Handle, int Start, int Pages); +extern void SaveEMM(int Handle, int Start, int Pages); +extern unsigned long EMMCoreLeft(void); + +#endif diff --git a/src/lib/exmm/x.bat b/src/lib/exmm/x.bat new file mode 100644 index 00000000..5e8a8bfa --- /dev/null +++ b/src/lib/exmm/x.bat @@ -0,0 +1 @@ +"wcp -mh emm.c" at diff --git a/src/lib/xmem/xmem.asm b/src/lib/exmm/xmem.asm similarity index 100% rename from src/lib/xmem/xmem.asm rename to src/lib/exmm/xmem.asm diff --git a/src/lib/exmm/xmem.c b/src/lib/exmm/xmem.c new file mode 100644 index 00000000..ff15d1ec --- /dev/null +++ b/src/lib/exmm/xmem.c @@ -0,0 +1,314 @@ + +/* + + Copyright 1994 Alec Russell, ALL rights reserved + Permission granted to use as you wish. + + Slightly higher level xms calls than xmem.asm + +*/ + +#include +#include +#include +#include + +#include + +xms_head_t xms_head={0}; // set handle to zero + + +/* ---------------------- alloc_xms() ----------------- February 19,1994 */ +short alloc_xms(unsigned short far *size) // size in 16k blocks +{ + return(XMS_alloc(0, size)); +} + +/* ---------------------- xms_to_mem() ---------------- February 19,1994 */ +short xms_to_mem(unsigned short handle, void far *p, unsigned long off, unsigned short n) +{ + unsigned short block, boff; + + block=off >> XMSBLOCKSHIFT; + boff=off - (block << XMSBLOCKSHIFT); + + return(XMStoMem(handle, block, boff, n, p)); +} + +/* ---------------------- mem_to_xms() ---------------- February 19,1994 */ +short mem_to_xms(unsigned short handle, void far *p, unsigned long off, unsigned short n) +{ + unsigned short block, boff; + + block=off >> XMSBLOCKSHIFT; + boff=off - (block << XMSBLOCKSHIFT); + + return(MemToXMS(handle, block, boff, n, p)); +} + +/* ---------------------- qalloc_xms() -------------------- March 8,1994 */ +xms_node_t *qalloc_xms(unsigned long size) +{ + xms_node_t *node=NULL; + xms_node_t *t1; + + if ( size <= xms_head.avail ) + { + // look for existing node + t1=xms_head.next; + while ( t1 ) + { + if ( t1->used == 0 && t1->size >= size ) + { + t1->off=0; + t1->used=1; + node=t1; + break; + } + else + t1=t1->next; + } + + if ( node == NULL ) // didn't find existing node + { + node=malloc(sizeof(xms_node_t)); + if ( node ) + { + node->off=0; + node->used=1; + node->size=size; + node->next=NULL; + node->start=xms_head.next_off; + xms_head.avail-=size; + xms_head.next_off+=size; + if ( xms_head.next == NULL ) + { + xms_head.next=node; + } + else + { + t1=xms_head.next; + while ( t1->next ) + t1=t1->next; + t1->next=node; + } + } + else + pr2("out of near mem in qalloc_xms"); + } + } + else + pr2("out of xms mem in qalloc size %lu avail %lu", size, xms_head.avail); + + return(node); +} + +/* ---------------------- qfree_xms() --------------------- March 8,1994 */ +void qfree_xms(xms_node_t *node) +{ + xms_node_t *t1; + + if ( xms_head.next ) + { + t1=xms_head.next; + while ( t1 != node && t1 ) + t1=t1->next; + + if ( t1 ) + { + t1->used=0; + } + else + pr2("ERROR didn't find node qfree"); + } + else + { + pr2("ATTEMPTED to qfree empty list"); + } +} + +/* ---------------------- xms_open() ---------------------- March 8,1994 */ +xms_node_t *xms_open(char *file) +{ + int i; + xms_node_t *node=NULL; + FILE *fp; + char *buffer; + unsigned long off; + + fp=fopen(file, "rb"); + if ( fp ) + { + node=qalloc_xms(filelength(fileno(fp))); + if ( node ) + { + buffer=malloc(4096); + if ( buffer ) + { + off=0l; + while ( (i=fread(buffer, 1, 4096, fp)) ) + { + mem_to_xms(xms_head.handle, (char far *)buffer, off+node->start, i); + off+=i; + } + + free(buffer); + } + else + pr2("out of mem in xms_open 1"); + } + + fclose(fp); + } + else + pr2("ERROR opening %s in xms_open", file); + + return(node); +} + +/* ---------------------- xms_read() ---------------------- March 8,1994 */ +short xms_read(void far *buffer, unsigned short n, xms_node_t *node) +{ + + if ( node->off >= node->size ) + return 0; + + if ( n+node->off > node->size ) + n=node->size - node->off; + + xms_to_mem(xms_head.handle, buffer, node->start+node->off, n); + node->off+=n; + + return(n); +} + +/* ---------------------- xms_write() ---------------------- March 8,1994 */ +short xms_write(void far *buffer, unsigned short n, xms_node_t *node) +{ + + if ( node->off >= node->size ) + return 0; + + if ( n+node->off > node->size ) + n=node->size - node->off; + + mem_to_xms(xms_head.handle, buffer, node->start+node->off, n); + node->off+=n; + + return(n); +} + + +/* ---------------------- xms_tell() ---------------------- March 8,1994 */ +long xms_tell(xms_node_t *node) +{ + return node->off; +} + +/* ---------------------- xms_seek() ---------------------- March 8,1994 */ +short xms_seek(xms_node_t *node, long off, short whence) +{ + short err=0; + + switch ( whence ) + { + case SEEK_SET: + if ( off < 0l || off > node->size ) + err=1; + else + node->off=off; + break; + + case SEEK_END: + if ( off > 0l || (node->size + off) < 0l ) + err=1; + else + node->off=node->size + off; + break; + + case SEEK_CUR: + if ( node->off + off < 0l || node->off + off > node->size ) + err=1; + else + node->off+=off; + break; + } + + return(err); +} + +/* ---------------------- xms_close() --------------------- March 8,1994 */ +void xms_close(xms_node_t *node) +{ + qfree_xms(node); +} + +/* ---------------------- init_xms() ---------------------- March 8,1994 */ +short init_xms(unsigned short min_blocks) +{ + unsigned short blocks; + + blocks=XMSblk_available(); + if ( blocks >= min_blocks ) + { + memset(&xms_head, 0, sizeof(xms_head_t)); + if ( (xms_head.handle=alloc_xms(&blocks)) ) + { + pr2("blocks minus by = %u", blocks); + min_blocks-=blocks; + xms_head.avail=xms_head.total=(unsigned long)min_blocks*XMSBLOCK; + blocks=min_blocks; + } + else + blocks=0; + } + else + blocks=0; + + return(blocks); +} + +/* ---------------------- deinit_xms() -------------------- March 8,1994 */ +void deinit_xms(void) +{ + xms_node_t *t1, *t2; + + if ( xms_head.handle ) + { + XMS_dealloc(xms_head.handle); + if ( xms_head.next ) + { + t1=xms_head.next; + t2=t1->next; + while ( t1 ) + { + free(t1); + t1=t2; + t2=t1->next; + } + } + + memset(&xms_head, 0, sizeof(xms_head_t)); + } +} +/* --------------------------- end of file ------------------------- */ + +/* + +Not sure how to use this? + +call init_xms(x) to allocate a big chunk of xms. +x is in 'blocks' of 16Kb. Pick X big enough to buffer all the files +you want to place in xms. + +call xms_open("filename); for each file to be buffered. This copies the file +int xms. + +then use xms_read(), xms_write(), and xms_seek() to read the file from +xms instead of disk. + +call deinit_xms() just before exit to clean up. + +You can also use the lower level calls directly. + +*/ diff --git a/src/lib/xmem/xmem.h b/src/lib/exmm/xmem.h similarity index 100% rename from src/lib/xmem/xmem.h rename to src/lib/exmm/xmem.h diff --git a/src/lib/xmem/xmem.txt b/src/lib/exmm/xmem.txt similarity index 100% rename from src/lib/xmem/xmem.txt rename to src/lib/exmm/xmem.txt diff --git a/src/lib/xmem/xmemc.c b/src/lib/exmm/xmemc.c similarity index 100% rename from src/lib/xmem/xmemc.c rename to src/lib/exmm/xmemc.c