--- /dev/null
+//------- 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
#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
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
\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
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