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