]> 4ch.mooo.com Git - 16.git/commitdiff
added EMS support from arachne
authorsparky4 <sparky4@lappy4.4ch.mooo.com>
Wed, 10 Dec 2014 17:16:57 +0000 (11:16 -0600)
committersparky4 <sparky4@lappy4.4ch.mooo.com>
Wed, 10 Dec 2014 17:16:57 +0000 (11:16 -0600)
modified:   scroll.exe
new file:   src/lib/ems.c
modified:   src/scroll.c

scroll.exe
src/lib/ems.c [new file with mode: 0644]
src/scroll.c

index 3dcf363be4ec789890e74b9d6e7deaf6dfd6211a..1bb70ab2bc7804dfdc70ec7ee5f31fb602632f81 100644 (file)
Binary files a/scroll.exe and b/scroll.exe differ
diff --git a/src/lib/ems.c b/src/lib/ems.c
new file mode 100644 (file)
index 0000000..9883f60
--- /dev/null
@@ -0,0 +1,289 @@
+//------- PRACE S EMS pameti ---------------\r
+#include <stdio.h>\r
+#include <fcntl.h>\r
+#include <io.h>\r
+#include <dos.h>\r
+#include <mem.h>\r
+\r
+typedef struct\r
+  {\r
+  unsigned long length;         /* velikost prenasene pameti      */\r
+  unsigned int sourceH;         /* handle pro zdroj (0=konvencni  */\r
+  unsigned long sourceOff;      /* offset zdroje pameti           */\r
+  unsigned int destH;           /* handle pro terc (0=konvencni   */\r
+  unsigned long destOff;        /* offset terce pameti            */\r
+  } XMOVE;\r
+\r
+int get_emem(void);             // Fce pro zachazeni s EMS\r
+int alloc_emem(int n);          // Alokuje n KB pameti, vraci handle\r
+int dealloc_emem(int h);        // Dealokuje EMS (handle)\r
+int move_emem(XMOVE *p);        // presune blok z/do EMS\r
+int mem_emem(unsigned *total, unsigned *free);\r
+\r
+#define  pagesizeEMS 0x4000       // pamet EMS je ze 16k stranek\r
+\r
+//int   pagesAllocated = 0;\r
+//int   totalPages;\r
+char *EmsFrame;\r
+\r
+\r
+//------ Zda je EMS driver dostupny: ret=  1 - ANO, 0 - NE\r
+int isEMS(void)\r
+{\r
+    int fh;\r
+    union REGS rg;\r
+\r
+    if((fh=open("EMMXXXX0",O_RDONLY,&fh)) == -1) return( 0 );\r
+\r
+    rg.h.ah = 0x44;\r
+    rg.h.al = 0x00;\r
+    rg.x.bx = fh;\r
+    int86(0x21,&rg,&rg);\r
+    close(fh);\r
+    if(rg.x.cflag) return(0);\r
+    if(rg.x.dx & 0x80)\r
+     return( 1 );\r
+    else\r
+     return( 0 );\r
+}\r
+\r
+//----- Zda je EMS HW dostupny ret=  1 - ANO, 0 - NE\r
+int checkEMS(void)\r
+{\r
+    union REGS rg;\r
+\r
+    rg.h.ah = 0x40;\r
+    int86(0x67,&rg,&rg);\r
+    if(rg.h.ah == 0)\r
+     return( 1 );\r
+    else\r
+     return( 0 );\r
+}\r
+\r
+//----- Vraci totalni pocet stranek EMS nebo -1 ----\r
+int coretotalEMS(void)\r
+{\r
+    union REGS rg;\r
+\r
+    rg.h.ah = 0x42;\r
+    int86(0x67,&rg,&rg);\r
+    if(rg.x.cflag) return( -1 );\r
+    //if(!pagesAllocated)\r
+    // { pagesAllocated = 1;\r
+    //   totalPages = rg.x.dx;\r
+    // }\r
+    return(rg.x.bx);\r
+}\r
+\r
+//----- Vraci pocet volnych stranek EMS nebo -1 ----\r
+int coreleftEMS(void)\r
+{\r
+    union REGS rg;\r
+\r
+    //if(pagesAllocated) return(totalPages);\r
+    rg.h.ah = 0x42;\r
+    int86(0x67,&rg,&rg);\r
+    if(rg.x.cflag) return( -1 );\r
+    //if(!pagesAllocated)\r
+    //pagesAllocated = 1;\r
+    //totalPages = rg.x.dx;\r
+    //return(totalPages);\r
+    return(rg.x.dx);\r
+}\r
+\r
+//----- Vraci EMS page frame (pointr na EMS) nebo NULL ----\r
+char *pageframeEMS(void)\r
+{\r
+    union REGS rg;\r
+\r
+    rg.h.ah = 0x41;\r
+    int86(0x67,&rg,&rg);\r
+    if(rg.h.ah != 0)\r
+     return( NULL );\r
+    else\r
+     return((char *)MK_FP(rg.x.bx,0));\r
+}\r
+\r
+//----- Alokuje n stranek - vraci handle na blok stranek nebo 0 ----\r
+unsigned mallocEMS(int n)\r
+{\r
+    union REGS rg;\r
+\r
+    if(n > coreleftEMS() ) return( 0 );\r
+    rg.h.ah = 0x43;\r
+    rg.x.bx = n;\r
+    int86(0x67,&rg,&rg);\r
+    if(rg.h.ah)\r
+     return( 0 );\r
+    else\r
+     return(rg.x.dx);\r
+}\r
+\r
+//----- Dealokuje blok stranek ret = 1-O.K. 0-ERR -----\r
+unsigned freeEMS(unsigned h)\r
+{\r
+    union REGS rg;\r
+    int   i;\r
+\r
+    for(i=0; i<5; i++)\r
+     { rg.h.ah = 0x45;\r
+       rg.x.dx = h;\r
+       int86(0x67,&rg,&rg);\r
+       if(rg.h.ah == 0) break;\r
+     }\r
+    if(rg.h.ah == 0)\r
+     return( 1 );\r
+    else\r
+     return( 0 );\r
+}\r
+\r
+//----- Mapuje logiclou stranku do fyzicke stranky\r
+int mapEMS(unsigned h, int Ppage, int Lpage)\r
+{\r
+    union REGS rg;\r
+\r
+    if(Ppage < 0 || Ppage > 3) return( 0 );\r
+    rg.h.ah = 0x44;\r
+    rg.h.al = Ppage;\r
+    rg.x.bx = Lpage;\r
+    rg.x.dx = h;\r
+    int86(0x67,&rg,&rg);\r
+    if(rg.h.ah != 0)\r
+     return( 0 );\r
+    else\r
+     return( 1 );\r
+}\r
+\r
+// ##### Fce se stejnymi parametry pro EMS jako pro XMS\r
+\r
+//----- Zda je EMS dostupna\r
+int get_emem(void)\r
+{\r
+  int ist;\r
+\r
+  ist = checkEMS();\r
+  if(ist == 1)\r
+  { ist = isEMS();\r
+    if(ist == 1) return( 0x0300 );\r
+  }\r
+  return( -1 );\r
+}\r
+\r
+//----- Allokuje Kb pameti -------\r
+int alloc_emem(int kb)\r
+{\r
+   int Pages,hhh;\r
+\r
+   Pages = kb / 16;\r
+   if((Pages * 16) < kb) Pages++;\r
+\r
+   hhh = mallocEMS(Pages);\r
+   if(hhh == 0)\r
+    return( -1);\r
+   else\r
+    return(hhh);\r
+}\r
+\r
+//----- dealokuje EMS pres handle\r
+int dealloc_emem(int h)\r
+{\r
+   return( freeEMS( h ) );\r
+}\r
+\r
+//----- presune blok pameti\r
+//  unsigned long length;         /* velikost prenasene pameti      */\r
+//  unsigned int  sourceH;        /* handle pro zdroj (0=konvencni  */\r
+//  unsigned long sourceOff;      /* offset zdroje pameti           */\r
+//  unsigned int  destH;          /* handle pro terc (0=konvencni   */\r
+//  unsigned long destOff;        /* offset terce pameti            */\r
+int move_emem(XMOVE *pxm)\r
+{\r
+   unsigned char *SrcBuf,*DstBuf;\r
+   int      ist;\r
+   unsigned int  SrcOff, DstOff, BegPage, BegOff, FreeByte, CopyLen;\r
+\r
+   if(pxm->sourceH == 0 && pxm->destH != 0)    // Buffer->EMS\r
+   {\r
+     SrcBuf  = (unsigned char *)pxm->sourceOff;// buffer\r
+     SrcOff  = 0;\r
+     BegPage = pxm->destOff / pagesizeEMS;     // pocatecni page\r
+     BegOff  = pxm->destOff % pagesizeEMS;     // offset in page\r
+     FreeByte= pagesizeEMS - BegOff;           // volnych B na page\r
+     CopyLen = pxm->length;                    // celkova delka\r
+\r
+     Next_page:\r
+     if(CopyLen > FreeByte)\r
+     {\r
+       ist = mapEMS(pxm->destH, 0, BegPage);\r
+       if(ist==0) return( 0 );\r
+       memcpy(EmsFrame+BegOff, SrcBuf+SrcOff, FreeByte);\r
+\r
+       CopyLen  = CopyLen - FreeByte;\r
+       SrcOff  += FreeByte;\r
+       BegPage++;\r
+       BegOff   = 0;\r
+       FreeByte = pagesizeEMS;\r
+       goto Next_page;\r
+     }\r
+     else\r
+     {\r
+       ist = mapEMS(pxm->destH, 0, BegPage);\r
+       if(ist==0) return( 0 );\r
+       memcpy(EmsFrame+BegOff, SrcBuf+SrcOff, CopyLen);\r
+     }\r
+   }\r
+   else if(pxm->sourceH != 0 && pxm->destH == 0) // EMS->Buffer\r
+   {\r
+     DstBuf  = (unsigned char *)pxm->destOff;// buffer\r
+     DstOff  = 0;\r
+     BegPage = pxm->sourceOff / pagesizeEMS;     // pocatecni page\r
+     BegOff  = pxm->sourceOff % pagesizeEMS;     // offset in page\r
+     FreeByte= pagesizeEMS - BegOff;             // volnych B na page\r
+     CopyLen = pxm->length;                    // celkova delka\r
+\r
+     Next_page2:\r
+     if(CopyLen > FreeByte)\r
+     {\r
+       ist = mapEMS(pxm->sourceH, 0, BegPage);\r
+       if(ist==0) return( 0 );\r
+       memcpy(DstBuf+DstOff, EmsFrame+BegOff, FreeByte);\r
+\r
+       CopyLen  = CopyLen - FreeByte;\r
+       DstOff  += FreeByte;\r
+       BegPage++;\r
+       BegOff   = 0;\r
+       FreeByte = pagesizeEMS;\r
+       goto Next_page2;\r
+     }\r
+     else\r
+     {\r
+       ist = mapEMS(pxm->sourceH, 0, BegPage);\r
+       if(ist==0) return( 0 );\r
+       memcpy(DstBuf+DstOff, EmsFrame+BegOff, CopyLen);\r
+     }\r
+   }\r
+   else   // Error\r
+   { return( 0 );\r
+   }\r
+\r
+   return 1;\r
+}\r
+\r
+// ----- Vrati pocet volnych a max. KB EMS\r
+int mem_emem(unsigned int *total, unsigned int *freeall)\r
+{\r
+ int pom;\r
+\r
+ pom = coretotalEMS();\r
+ if(pom != -1 )\r
+  *total = pom * 16;\r
+ else\r
+  return( 0 );\r
+ pom = coreleftEMS();\r
+ if(pom != -1)\r
+  *freeall = pom * 16;\r
+ else\r
+  return( 0 );\r
+\r
+ return( 1 );\r
+}\r
index 0f6284b2987bca768a63727c08ee2cc147916d0c..4e13f5d7e64d1f759e2356af151e23f8843a5547 100644 (file)
@@ -3,7 +3,7 @@
 #include <stdlib.h>\r
 #include "src\lib\dos_kb.h"\r
 #include "src\lib\wtest\wtest.c"\r
-#include "src\lib\xms.c"\r
+#include "src\lib\ems.c"\r
 \r
 //word far *clock= (word far*) 0x046C; /* 18.2hz clock */\r
 \r
@@ -477,11 +477,11 @@ void main() {
        printf("temporary player sprite 0: http://www.pixiv.net/member_illust.php?mode=medium&illust_id=45556867\n");\r
        printf("temporary player sprite 1: http://www.pixiv.net/member_illust.php?mode=medium&illust_id=44606385\n");\r
        printf("\n");
-       xmsfree(&map);
-       xmsfree(bg);
-       xmsfree(spri);
-       xmsfree(mask);
-       xmsreport();\r
+       //xmsfree(&map);
+       //xmsfree(bg);
+       //xmsfree(spri);
+       //xmsfree(mask);
+       //xmsreport();\r
        switch(detectcpu())\r
        {\r
                case 0: cpus = "8086/8088 or 186/88"; break;\r
@@ -501,9 +501,9 @@ allocMap(int w, int h) {
 \r
        result.width =w;\r
        result.height=h;\r
-       if(initxms()>0)\r
+       if(!isEMS())\r
        result.data = malloc(sizeof(byte) * w * h);\r
-       else result.data = (byte *)xmsmalloc(sizeof(byte) * w * h);\r
+       else result.data = (byte *)alloc_emem(sizeof(byte) * w * h);\r
 \r
        return result;\r
 }\r
@@ -515,19 +515,19 @@ initMap(map_t *map) {
        int x, y;\r
        int i;\r
        int tile = 1;\r
-       if(initxms()>0)\r
+       if(!isEMS())\r
        map->tiles = malloc(sizeof(tiles_t));\r
-       else map->tiles = (tiles_t *)xmsmalloc(sizeof(tiles_t));\r
+       else map->tiles = (tiles_t *)alloc_emem(sizeof(tiles_t));\r
 \r
        /* create the tile set */\r
-       if(initxms()>0)\r
+       if(!isEMS())\r
        map->tiles->data = malloc(sizeof(bitmap_t));\r
-       else map->tiles->data = (bitmap_t *)xmsmalloc(sizeof(bitmap_t));\r
+       else map->tiles->data = (bitmap_t *)alloc_emem(sizeof(bitmap_t));\r
        map->tiles->data->width = (TILEWH*2);\r
        map->tiles->data->height= TILEWH;\r
-       if(initxms()>0)\r
+       if(!isEMS())\r
        map->tiles->data->data = malloc((TILEWH*2)*TILEWH);\r
-       else map->tiles->data->data = (byte *)xmsmalloc((TILEWH*2)*TILEWH);\r
+       else map->tiles->data->data = (byte *)alloc_emem((TILEWH*2)*TILEWH);\r
        map->tiles->tileHeight = TILEWH;\r
        map->tiles->tileWidth =TILEWH;\r
        map->tiles->rows = 1;\r