OSDN Git Service

added a EMS & XMS library
authorsparky4 <sparky4@cock.li>
Thu, 12 Feb 2015 19:02:05 +0000 (13:02 -0600)
committersparky4 <sparky4@cock.li>
Thu, 12 Feb 2015 19:02:05 +0000 (13:02 -0600)
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

13 files changed:
Project 16.bfproject
src/lib/exmm/EMM.EXE [new file with mode: 0644]
src/lib/exmm/emm.c [new file with mode: 0644]
src/lib/exmm/emmret.h [new file with mode: 0644]
src/lib/exmm/emmsize.h [new file with mode: 0644]
src/lib/exmm/memory.c [new file with mode: 0644]
src/lib/exmm/memory.h [new file with mode: 0644]
src/lib/exmm/x.bat [new file with mode: 0644]
src/lib/exmm/xmem.asm [moved from src/lib/xmem/xmem.asm with 100% similarity]
src/lib/exmm/xmem.c [new file with mode: 0644]
src/lib/exmm/xmem.h [moved from src/lib/xmem/xmem.h with 100% similarity]
src/lib/exmm/xmem.txt [moved from src/lib/xmem/xmem.txt with 100% similarity]
src/lib/exmm/xmemc.c [moved from src/lib/xmem/xmemc.c with 100% similarity]

index be3520a..63ddf99 100644 (file)
@@ -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 (file)
index 0000000..a084353
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 (file)
index 0000000..f642fad
--- /dev/null
@@ -0,0 +1,78 @@
+// Cut this out as emm.c\r
+\r
+/*      File:       emm.c\r
+ *      Module:     All Modules\r
+ *      Author(s):  Chris Somers\r
+ *      Date:       December 1, 1992\r
+ *      Version:    V.1.1\r
+\r
+        minor mods by Alex Russell to simplify\r
+\r
+        Must use memory model with FAR code\r
+\r
+ */\r
+\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <mem.h>\r
+\r
+#include "memory.c"\r
+\r
+void TransformData(char *pEmmData, unsigned int len)\r
+{\r
+   while ( len )\r
+      {\r
+      (*pEmmData)++;\r
+      pEmmData++;\r
+\r
+      len--;\r
+      }\r
+}\r
+\r
+void main(void)\r
+{\r
+   char    *pEmmData;\r
+   int     hEData;\r
+\r
+   if ( OpenEMM() != SUCCESS )\r
+      {     // make sure we got EMM\r
+      printf("EMM unavailable.\n");\r
+      exit(1);\r
+      }\r
+   else\r
+      printf("Emm available\n");\r
+\r
+   pEmmData = (char *)EMMalloc(&hEData, 6);  // get 6 * 16K bytes - 96K\r
+   if ( pEmmData == NULL )\r
+      {\r
+      printf("Not enough EMM or out of handles.\n");\r
+      exit(2);\r
+      }\r
+   else\r
+      printf("emm alloced OK\n");\r
+\r
+\r
+   printf("Map 1st 4 pages\n");\r
+   MapEMM(hEData, 0, 4);   // load 1st 4 pages into page frame: 0-3\r
+\r
+   memset(pEmmData, 0x0e, 64000u);\r
+   UnmapEMM(hEData, 0, 4);          // not absolutely necessary\r
+   \r
+   printf("Map next 2 pages\n");\r
+   MapEMM(hEData, 4, 2);            // map last 2 pages: 4-5\r
+   memset(pEmmData, 0x0e, 32768u);\r
+\r
+   MapEMM(hEData, 0, 4);\r
+   // do some stuff with the first 64K of file data.\r
+   printf("Transform data\n");\r
+   TransformData(pEmmData, 64000UL);\r
+   MapEMM(hEData, 4, 2);  // only unmaps 1st two pages of prior 64k mapping\r
+   // do stuff with remaining 32K of data\r
+   TransformData(pEmmData, 32768UL);\r
+   UnmapEMM(hEData, 0, 4);  // should unmap before freeing\r
+\r
+   printf("Close emm\n");\r
+   EMMFree(hEData);     // finished with the file data\r
+   CloseEMM();\r
+}\r
diff --git a/src/lib/exmm/emmret.h b/src/lib/exmm/emmret.h
new file mode 100644 (file)
index 0000000..1ef3e67
--- /dev/null
@@ -0,0 +1,84 @@
+// AJR notes: some of these are not used by the emm code\r
+\r
+// Cut this out as emmret.h\r
+\r
+/*      File:       EmmRet.h\r
+ *      Module:     All Modules\r
+ *      Author(s):  Chris Somers\r
+ *      Date:       May 8, 1992\r
+ *      Version:    V.1.0\r
+ */\r
+\r
+#ifndef _EMM_RETURNS_DEF\r
+#define _EMM_RETURNS_DEF 1\r
+\r
+/* Module return values */\r
+\r
+/* Return Values */\r
+\r
+#define     START                8\r
+#define     END                  7\r
+#define     MOVABORT             6\r
+#define     PRN_COMPLETE         5\r
+#define     PRN_PROGRESS         4\r
+#define     INCOMPLETE           3\r
+#define     HAVEROOM             2\r
+#define     SUCCESS              1\r
+#define     TRUE                 1\r
+#define     YES                  1\r
+#define     FALSE                0\r
+#define     NO                   0\r
+#define     NOTREADY             0\r
+#define     NO_DATA              0\r
+#define     NONE                -1\r
+\r
+/* Start of Recoverable error codes */\r
+\r
+#define     NO_SPACE            -1001\r
+#define     NOTPOLLING          -1002\r
+#define     ALREADYDONE         -1003\r
+#define     NO_PRN_DEV          -1004\r
+#define     OUTF_PAPER          -1005\r
+#define     NO_VIDEO            -1006\r
+#define     TIMEOUT             -1007\r
+#define     FILENOPEN           -1008\r
+#define     ABORT_REQ           -1009\r
+#define     DEV_IOERR           -1010\r
+\r
+#define     MAXRERR                10\r
+#define     RECOVERABLE         -1999   /* all above errors are recoverable */\r
+\r
+/* Start of Threadfatal error codes */\r
+\r
+#define     NOT_OPEN            -2001\r
+#define     NOT_ATTACHED        -2002\r
+#define     NO_CONNECTION       -2003\r
+#define     INSUFF_MEM          -2004\r
+#define     NR_TIMEOUT          -2005\r
+\r
+#define     MAXTERR                 5\r
+#define     THREADFATAL         -2999   /* above errors force task to cancel */\r
+\r
+/* Start of Systemfatal error codes */\r
+\r
+#define     BAD_TASKNUM         -3001\r
+#define     BAD_HANDLE          -3002\r
+#define     BAD_HARDWARE        -3003\r
+#define     INVALIDACTION       -3004\r
+#define     NOFREEITEMS         -3005\r
+#define     NO_MEMORY           -3006\r
+#define     NO_EMS              -3007\r
+#define     VALUE_OUTF_RANGE    -3008\r
+#define     BAD_MODE            -3009\r
+#define     NO_PALETTE          -3010\r
+#define     BAD_DISPPAGE        -3011\r
+#define     NO_TSR              -3012\r
+#define     BUFTOOSMALL         -3013\r
+#define     BAD_NAME            -3014\r
+#define     BAD_DISPHW          -3015\r
+#define     NO_FLOPPY           -3016\r
+\r
+#define     MAXSERR                16\r
+#define     SYSTEMFATAL         -3999   /* above errors are fatal to system */\r
+\r
+#endif\r
diff --git a/src/lib/exmm/emmsize.h b/src/lib/exmm/emmsize.h
new file mode 100644 (file)
index 0000000..8570875
--- /dev/null
@@ -0,0 +1,97 @@
+// Cut this out as emmsize.h\r
+\r
+/*      File:       EmmSize.h\r
+ *      Module:     All Modules\r
+ *      Author(s):  Chris Somers\r
+ *      Date:       May 8, 1992\r
+ *      Version:    V.1.0\r
+ */\r
+\r
+#ifndef _EMMSIZES_DEF\r
+#define _EMMSIZES_DEF 1\r
+\r
+\r
+/* Module size constants */\r
+\r
+#define     MAXACTIONS          29\r
+#define     MAXCHANNELS          4\r
+#define     MAXFOCUS             3\r
+#define     MAXBUFTYPES         64\r
+#define     MAXEMHANDLES        64      /* up to a max of 255 */\r
+#define     MAXTIMERS           32\r
+#define     MAXTITEMS          128\r
+#define     MAXQUEUES           24\r
+#ifdef PRINTER\r
+#define     MAXPRNS              4\r
+#else\r
+#define     MAXPRNS              0\r
+#endif\r
+#ifdef UTSCOM\r
+#define     MAXUTSSCRNS          2\r
+#else\r
+#define     MAXUTSSCRNS          0\r
+#endif\r
+#ifdef CAPTURE\r
+#define     MAXCAPTURE           1\r
+#else\r
+#define     MAXCAPTURE           0\r
+#endif\r
+#define     MAXIRQS             10\r
+#define     MAXTCPDSCPTITEMS    16     /*max # of TCP connections*/\r
+\r
+#define FREEBUFF        1   /* CallIODevice flag for BuffSize arrays */\r
+#define DSCONLY         2   /* allocate a BufDscpt, only - no buffer */\r
+\r
+#define     EMMPAGESIZE     0x4000     /* 16K EMM page size */\r
+#define     SETUPLEN            32\r
+#define     NAMELEN             40\r
+#define     UNIXLEN             32\r
+#define     ADDRLEN             16\r
+#define     TITLELEN           128\r
+#define     TSLEN               80\r
+#define     COMMENTLEN          65\r
+#define     PALSIZE            768\r
+#define     QSTRLEN            254\r
+#define     PRNBUFSIZ         2048\r
+#define     TXTSCRNSIZE       4096\r
+#define     UTSBUFSIZ         4096\r
+#define     UTSSCRNSIZ        1920\r
+#define     QMEMSIZE            15\r
+#define     KBUFLEN             16\r
+#define     GXBUFFSIZE      0x4000\r
+#define     TCPNDBUFFSIZE   0x1000      /*router auto-allocation buff size*/\r
+                                        /* graphics printing scale values */\r
+#define     SCALE_HALF           1      /* value must not change */\r
+#define     SCALE_ONE            2\r
+#define     SCALE_QUART          3      /* value must not change */\r
+\r
+#define     SIXTH_SECOND         3L     /* shade over 1/6 of a second*/\r
+#define     HALF_SECOND          9L\r
+#define     ONE_SECOND          18L\r
+#define     TWO_SECONDS         36L\r
+#define     FIVE_SECONDS        91L\r
+#define     TEN_SECONDS        182L\r
+#define     HALF_MINUTE      182*3L     /* same as 18.2*30, right? */\r
+#define     ONE_MINUTE       182*6L     /* same as 18.2*60, right? */\r
+#define     TWO_MINUTES     182*12L     /* same as 18.2*120, right? */\r
+#define     FIVE_MINUTES    182*30L     /* same as 18.2*300, right? */\r
+#define     TEN_MINUTES     182*60L     /* same as 18.2*600, right? */\r
+#define     HALF_HOUR      182*180L     /* same as 18.2*1800, right? */\r
+#define     ONE_HOUR       182*360L     /* same as 18.2*3600, right? */\r
+\r
+#define MAXROUTMOVES            24      /*max # of routing moves at one time*/\r
+                                        /*also max # of Move Complete Events*/\r
+/* Event Channel Defines */\r
+\r
+#define MAXRECALLEVENTS    1   /*max nm of Recall Event Channels*/\r
+#define MAXKBDEVENTS       1   /*max nm of Kbd Event Channels*/\r
+#define MAXPRNEVENTS       4   /*max nm of Prt Prog & Prt Cmplte Event Chan*/\r
+#define MAXUTSRCVEVENTS    MAXUTSSCRNS       /*max nm of Uts Rx Event Chans*/\r
+#define MAXUTSXMTEVENTS    MAXUTSSCRNS       /*max nm of Uts Tx Event Chans*/\r
+#define MAXCAPEVENTS       2   /* max number of capture event channels */\r
+#define MAXOP1CMPLTEVENTS  1   /*max nm of Operation 1 Cmplt Event Channels*/\r
+#define MAXOP2CMPLTEVENTS  1   /*max nm of Operation 2 Cmplt Event Channels*/\r
+#define MAXOP3CMPLTEVENTS  MAXTCPDSCPTITEMS  /*max nm of Op 3 Event Chans*/\r
+#define MAXTCPEVENTS       MAXTCPDSCPTITEMS  /* max nm of TCP Event types */\r
+\r
+#endif\r
diff --git a/src/lib/exmm/memory.c b/src/lib/exmm/memory.c
new file mode 100644 (file)
index 0000000..ce58c3e
--- /dev/null
@@ -0,0 +1,397 @@
+\r
+/*      File:       Memory.c\r
+ *      Module:     All Modules\r
+ *      Author(s):  Chris Somers\r
+ *      Date:       December 1, 1992\r
+ *      Version:    V.1.1\r
+\r
+        minor mods by Alex Russell to simplify\r
+\r
+        Must use memory model with FAR code\r
+\r
+ */\r
+\r
+\r
+\r
+#if !defined(__LARGE__) && !defined(__COMPACT__) && !defined(__HUGE__)\r
+#error Invalid memory model for compiling MEMORY.C\r
+#endif\r
+\r
+#include <stdio.h>\r
+#include <dos.h>\r
+#include <mem.h>\r
+\r
+#include "memory.h"\r
+\r
+// static globals --------------------------------\r
+\r
+static int  ActiveEMList[MAXEMHANDLES];\r
+static unsigned int  EMMSeg;\r
+\r
+// forward declarations ---------------------------------\r
+\r
+static int  EMPresent(void);\r
+static int  EMReady(void);\r
+static unsigned int  GetEMMSeg(void);\r
+static int  GetEMHandle(int NumPages);\r
+static int  EMMap(int Handle, int LogPg, int PhyPg);\r
+static int  FreeEMHandle(int Handle);\r
+static int  GetNumPages(int Handle);\r
+static int  EMStateSave(int Handle);\r
+static void EMStateRestore(int Handle);\r
+\r
+\r
+/********************************************************************/\r
+int\r
+OpenEMM(void)\r
+{\r
+    if (!EMPresent() || !EMReady()) return(NOTREADY);\r
+    if (!(EMMSeg = GetEMMSeg())) return(NOTREADY);  /*lint !e720 */\r
+    return(SUCCESS);\r
+}               /* End of OpenEMM() */\r
+\r
+/********************************************************************/\r
+\r
+void\r
+CloseEMM(void)\r
+{\r
+    int     i;\r
+\r
+    if (!EMMSeg) return;\r
+    for (i = 0; i < MAXEMHANDLES; i++) {\r
+        if (ActiveEMList[i]) {\r
+            FreeEMHandle(ActiveEMList[i]);\r
+            ActiveEMList[i] = 0;\r
+        }\r
+    }\r
+    EMMSeg = 0;\r
+}               /* End of CloseEMM() */\r
+\r
+/********************************************************************/\r
+\r
+int\r
+EMMInstalled(void)\r
+{\r
+    return((EMMSeg) ? TRUE : FALSE);        /* successfully opened? */\r
+}               /* End of EMMInstalled() */\r
+\r
+/********************************************************************/\r
+\r
+unsigned long\r
+EMMCoreLeft(void)\r
+{\r
+    unsigned      Pages;\r
+    unsigned long RtnVal = 0UL;\r
+\r
+    _asm {\r
+        mov     ah,0x42             /* get EMM free page count */\r
+        int     0x67\r
+        or      ah,ah\r
+        //js      InternalError       /* returns 80, 81, or 84 hex on error */\r
+        mov     Pages,bx            /* number of unallocated 16K pages */\r
+    }\r
+    RtnVal = ((unsigned long)Pages << 14);  /* Pages * 16K rtns bytes*/\r
+\r
+//InternalError:\r
+\r
+    return(RtnVal);\r
+}               /* End of EMMCoreLeft() */\r
+\r
+/********************************************************************/\r
+\r
+void far *\r
+EMMalloc(int *Handle, int Pages)\r
+{\r
+    int     i;\r
+    char    *RtnPtr = NULL;\r
+\r
+    if (!EMMSeg) {\r
+        *Handle = NOTREADY;\r
+        return(NULL);\r
+    }\r
+    if ((Pages < 1) || (Pages > 1020)) {\r
+        *Handle = VALUE_OUTF_RANGE;\r
+        return (NULL);\r
+    }\r
+    for (i = 0; (i < MAXEMHANDLES) && (ActiveEMList[i]); i++) ;\r
+    if (i == MAXEMHANDLES) {\r
+        *Handle = NOFREEITEMS;\r
+        return (NULL);\r
+    }\r
+    if ((ActiveEMList[i] = GetEMHandle(Pages)) > 0) {\r
+        RtnPtr = MK_FP(EMMSeg, 0);\r
+    }\r
+    *Handle = ActiveEMList[i];\r
+    return((void far *)RtnPtr);\r
+}               /* End of EMMalloc() */\r
+\r
+/********************************************************************/\r
+\r
+int\r
+EMMRealloc(int Handle, int Pages)\r
+{\r
+    int     RtnCode = FALSE;\r
+\r
+    if (!EMMSeg || (Pages < 0) || (Pages > 1020)) {\r
+        return (FALSE);\r
+    }\r
+    _asm {\r
+        mov     ah,0x51             /* change # of pages */\r
+        mov     bx,Pages\r
+        mov     dx,Handle\r
+        int     0x67\r
+        or      ah,ah\r
+        //js      NoGo                /* returns 80 to 88 hex on error */\r
+    }\r
+    RtnCode = TRUE;\r
+\r
+//NoGo:\r
+\r
+    return(RtnCode);\r
+}               /* End of EMMRealloc() */\r
+\r
+/********************************************************************/\r
+\r
+void\r
+EMMFree(int Handle)\r
+{\r
+    int     i, j;\r
+\r
+    if (!EMMSeg) return;\r
+    for (i = 0; (i < MAXEMHANDLES) && (ActiveEMList[i] != Handle); i++) ;\r
+    if (i >= MAXEMHANDLES) return;\r
+    j = 16;\r
+    while (j--) {\r
+        if (FreeEMHandle(ActiveEMList[i])) break;\r
+    }\r
+    ActiveEMList[i] = 0;\r
+}               /* End of EMMFree() */\r
+\r
+/********************************************************************/\r
+\r
+int                                         /* EMM map for application */\r
+MapEMM(int Handle, int Start, int Pages)\r
+{\r
+    int     i;\r
+\r
+    if (!EMMSeg) return(NOTREADY);\r
+    for (i = 0; (i < MAXEMHANDLES) && (ActiveEMList[i] != Handle); i++) ;\r
+    if (i == MAXEMHANDLES) return (NO_DATA);\r
+    if ((GetNumPages(Handle) < Pages) || (Pages < 1) || (Pages > 4)) {\r
+        return (VALUE_OUTF_RANGE);\r
+    }\r
+    for (i = Start; i < Start + Pages; i++) {\r
+        if (!EMMap(Handle, i, i - Start)) return(NO_DATA);\r
+    }\r
+    return(SUCCESS);\r
+}               /* End of MapEMM() */\r
+\r
+/********************************************************************/\r
+\r
+void                                        /* EMM unmap for application */\r
+UnmapEMM(int Handle, int Start, int Pages)\r
+{\r
+    int     i, j;\r
+\r
+    if (!EMMSeg) return;\r
+    for (i = 0; (i < MAXEMHANDLES) && (ActiveEMList[i] != Handle); i++) ;\r
+    if (i == MAXEMHANDLES) return;\r
+    j = Start + Pages;\r
+    if ((Pages < 1) || (j > 4)) return;\r
+\r
+    for (i = Start; i < j; i++) {\r
+        EMMap(Handle, NONE, i);\r
+    }\r
+}               /* End of UnmapEMM() */\r
+\r
+/********************************************************************/\r
+\r
+int                     /* EMM map for devices - saves EMM state */\r
+UseEMM(int Handle, int Start, int Pages)\r
+{\r
+    EMStateSave(Handle);\r
+    return(MapEMM(Handle, Start, Pages));\r
+}               /* End of UseEMM() */\r
+\r
+/********************************************************************/\r
+\r
+void                    /* EMM unmap for devices - restores EMM state */\r
+SaveEMM(int Handle, int Start, int Pages)\r
+{\r
+    UnmapEMM(Handle, Start, Pages);\r
+    EMStateRestore(Handle);\r
+}               /* End of SaveEMM() */\r
+\r
+/********************************************************************/\r
+\r
+static int\r
+EMPresent(void)\r
+{\r
+    int     i, Segment;\r
+    char    EMName[] = "EMMXXXX0";\r
+    char    *s, *t;\r
+\r
+    _asm {                      /* can be replaced with getvect() */\r
+        push    es\r
+        mov     ax,0x3567       /* get vector for int 67h */\r
+        int     0x21\r
+        mov     ax,es\r
+        mov     Segment,ax\r
+        pop     es\r
+    }\r
+    t = MK_FP(Segment, 0x0A);   /* point to driver name */\r
+    s = EMName;\r
+    for (i = 0; (i < 8) && (*s++ == *t++); i++) ;   /* strncmp equivalent */\r
+\r
+    if (i == 8) return(TRUE);\r
+    return(FALSE);\r
+}               /*End of EMPresent() */\r
+\r
+/********************************************************************/\r
+\r
+static int\r
+EMReady(void)\r
+{\r
+    _asm {\r
+        mov     ah,0x40             /* get EM Manager Status */\r
+        int     0x67\r
+        or      ah,ah\r
+        //jns     Ready               /* returns 80, 81, or 84 hex on error */\r
+    }\r
+    return(FALSE);\r
+\r
+//Ready:\r
+    return(TRUE);\r
+}               /* End of EMReady() */\r
+\r
+/********************************************************************/\r
+\r
+static unsigned int\r
+GetEMMSeg(void)\r
+{\r
+    unsigned int     EMSegment;\r
+\r
+    _asm {\r
+        mov     ah,0x41             /* get EMM page frame segment */\r
+        int     0x67\r
+        or      ah,ah\r
+        //js      NotReady            /* returns 80, 81, or 84 hex on error */\r
+        mov     EMSegment,bx\r
+    }\r
+    return(EMSegment);              /*lint !e530 */\r
+\r
+//NotReady:\r
+    return(NOTREADY);\r
+}               /* End of GetEMMSeg() */\r
+\r
+/********************************************************************/\r
+\r
+static int\r
+GetEMHandle(int NumPages)\r
+{\r
+    int     NewHandle;\r
+\r
+    _asm {\r
+        mov     ah,0x43             /* get handle and allocate EM */\r
+        mov     bx,NumPages         /* number of 16K pages to allocate */\r
+        int     0x67\r
+        or      ah,ah               /* returns 80 to 89 hex on error */\r
+        //js      NoHandle\r
+        mov     NewHandle,dx        /* retrieve handle */\r
+    }\r
+    return(NewHandle);\r
+\r
+//NoHandle:\r
+    return(NO_DATA);\r
+}               /* End of GetEMHandle() */\r
+\r
+/********************************************************************/\r
+\r
+static int\r
+EMMap(int Handle, int LogPg, int PhyPg)\r
+{\r
+    int     RtnCode = NO_DATA;\r
+\r
+    _asm {\r
+        mov     ax,PhyPg            /* physical page: 0 - 3 in AL only */\r
+        mov     ah,0x44             /* map logical to physical page */\r
+        mov     bx,LogPg            /* logical page: 0 - 1020 */\r
+        mov     dx,Handle\r
+        int     0x67\r
+        or      ah,ah               /* returns 80 to 8B hex on error */\r
+        //js      NoMapping\r
+    }\r
+    RtnCode = SUCCESS;\r
+\r
+//NoMapping:\r
+    return(RtnCode);\r
+}               /* End of EMMap() */\r
+\r
+/********************************************************************/\r
+\r
+static int\r
+FreeEMHandle(int Handle)\r
+{\r
+    _asm {\r
+        mov     ah,0x45             /* free handle and deallocate EM */\r
+        mov     dx,Handle\r
+        int     0x67\r
+        or      ah,ah               /* returns 80 to 86 hex on error */\r
+        //js      NotFreed\r
+    }\r
+    return(SUCCESS);\r
+\r
+//NotFreed:                           /* must retry if unsuccessful */\r
+    return(NO_DATA);\r
+}               /* End of FreeEMHandle() */\r
+\r
+/********************************************************************/\r
+\r
+static int\r
+GetNumPages(int Handle)\r
+{\r
+    int     NumPages = 0;\r
+\r
+    _asm {\r
+        mov     ah,0x4C             /* get allocated pages for Handle */\r
+        mov     dx,Handle\r
+        int     0x67\r
+        or      ah,ah               /* returns 80 to 84 hex on error */\r
+        //js      BadHandle\r
+        mov     NumPages,bx\r
+    }\r
+//BadHandle:\r
+\r
+    return(NumPages);\r
+}               /* End of GetNumPages() */\r
+\r
+/********************************************************************/\r
+\r
+static int\r
+EMStateSave(int Handle)\r
+{\r
+    int     RtnCode = NO_MEMORY;\r
+    _asm {\r
+        mov     ah,0x47             /* save page map under Handle */\r
+        mov     dx,Handle\r
+        int     0x67\r
+        or      ah,ah\r
+        //js      Unsaved             /* out of save space error */\r
+    }\r
+    RtnCode = SUCCESS;\r
+\r
+//Unsaved:\r
+    return(RtnCode);\r
+}               /* End of EMStateSave() */\r
+\r
+/********************************************************************/\r
+\r
+static void\r
+EMStateRestore(int Handle)\r
+{\r
+    _asm {\r
+        mov     ah,0x48             /* restore page map for Handle */\r
+        mov     dx,Handle\r
+        int     0x67                /* ignore error */\r
+    }\r
+}               /* End of EMStateRestore() */\r
diff --git a/src/lib/exmm/memory.h b/src/lib/exmm/memory.h
new file mode 100644 (file)
index 0000000..7571ff3
--- /dev/null
@@ -0,0 +1,34 @@
+// Cut this out as memory.h\r
+\r
+/*      File:       Memory.h\r
+ *      Module:     All Modules\r
+ *      Author(s):  Chris Somers\r
+ *      Date:       August 5, 1993\r
+ *      Version:    V.1.1\r
+\r
+        modified by Alex Russell to simplify.\r
+ */\r
+\r
+\r
+#ifndef _MEMORY_DEF\r
+#define _MEMORY_DEF 1\r
+\r
+#include "emmret.h"\r
+#include "emmsize.h"\r
+\r
+#define     CMM                  0\r
+#define     EMM                  1\r
+\r
+extern int      OpenEMM(void);\r
+extern void     CloseEMM(void);\r
+extern int      EMMInstalled(void);\r
+extern void far *EMMalloc(int *Handle, int Pages);\r
+extern int      EMMRealloc(int Handle, int Pages);\r
+extern void     EMMFree(int Handle);\r
+extern int      MapEMM(int Handle, int Start, int Pages);\r
+extern void     UnmapEMM(int Handle, int Start, int Pages);\r
+extern int      UseEMM(int Handle, int Start, int Pages);\r
+extern void     SaveEMM(int Handle, int Start, int Pages);\r
+extern unsigned long EMMCoreLeft(void);\r
+\r
+#endif\r
diff --git a/src/lib/exmm/x.bat b/src/lib/exmm/x.bat
new file mode 100644 (file)
index 0000000..5e8a8bf
--- /dev/null
@@ -0,0 +1 @@
+"wcp -mh emm.c"  at\r
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 (file)
index 0000000..ff15d1e
--- /dev/null
@@ -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 <stdio.h>
+#include <io.h>
+#include <string.h>
+#include <malloc.h>
+
+#include <xmem.h>
+
+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.
+
+*/
similarity index 100%
rename from src/lib/xmem/xmem.h
rename to src/lib/exmm/xmem.h
similarity index 100%
rename from src/lib/xmem/xmem.txt
rename to src/lib/exmm/xmem.txt
similarity index 100%
rename from src/lib/xmem/xmemc.c
rename to src/lib/exmm/xmemc.c