From 1cd7d6a6135b715e3157847e70971376c5bdf9a0 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Tue, 21 Jul 2015 11:17:14 -0500 Subject: [PATCH 1/1] added EMSERR function! modified: exmmtest.exe modified: src/lib/16_mm.c modified: src/lib/16_mm.h --- exmmtest.exe | Bin 54827 -> 59105 bytes src/lib/16_mm.c | 197 +++++++++++++++++++++++++++++++++++++----------- src/lib/16_mm.h | 2 +- 3 files changed, 155 insertions(+), 44 deletions(-) diff --git a/exmmtest.exe b/exmmtest.exe index 22a4fa56d6dad04c5d383a827a6832d25e3ca6b5..c269317a25ee2fdd94e0869dd958f94eed7d858d 100644 GIT binary patch delta 21319 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 Z_AA)N4ilv65niaRq~;%U6oooM{vRWy+(rNZ diff --git a/src/lib/16_mm.c b/src/lib/16_mm.c index fda0a9dd..05a72f8c 100644 --- a/src/lib/16_mm.c +++ b/src/lib/16_mm.c @@ -207,11 +207,10 @@ End: if(errorflag==true) { //err = CPURegs.h.ah; - strcpy(str,"MML_SetupEMS: EMS error 0x"); + strcpy(str,"MM_SetupEMS: EMS error"); //itoa(err,str2,16); - //strcat(str,&err); - //printf("%s\n",str); - printf("%s%x\n",str,err); + strcat(str,MM_EMSerr(err)); + printf("%s\n",str); return err; } mm->totalEMSpages=totalEMSpages; @@ -293,11 +292,10 @@ byte MM_MapEMS(mminfo_t *mm, mminfotype *mmi) if(errorflag==true) { //err = CPURegs.h.ah; - strcpy(str,"MM_MapEMS: EMS error 0x"); + strcpy(str,"MM_MapEMS: EMS error"); //itoa(err,str2,16); - //strcat(str,&err); - //printf("%s\n",str); - printf("%s%x\n",str, err); + strcat(str,MM_EMSerr(err)); + printf("%s\n",str); //printf("FACK! %x\n", err); return err; } @@ -309,27 +307,27 @@ byte MM_MapEMS(mminfo_t *mm, mminfotype *mmi) byte MM_MapXEMS(mminfo_t *mm, mminfotype *mmi) { -//SUB EMS.MapXPages (PhysicalStart, LogicalStart, NumPages, Handle) - - //Maps up to 4 logical EMS pages to physical pages in the page frame, where: - //PhysicalStart = Physical page first logical page is mapped to - //LogicalStart = First logical page to map - //NumPages = Number of pages to map (1 to 4) - //Handle = EMS handle logical pages are allocated to - - /*//Create a buffer containing the page information -// FOR x = 0 TO NumPages - 1 -// MapInfo$ = MapInfo$ + MKI$(LogicalStart + x) + MKI$(PhysicalStart + x) -// NEXT*/ - -// Regs.ax = &H5000 //Map the pages in the buffer -// Regs.cx = NumPages //to the pageframe -// Regs.dx = Handle -// Regs.ds = VARSEG(MapInfo$) -// Regs.si = SADD(MapInfo$) -// InterruptX &H67, Regs, Regs -// EMS.Error = (Regs.ax AND &HFF00&) \ &H100 //Store the status code - +//SUB EMS.MapXPages (PhysicalStart, LogicalStart, NumPages, Handle) + + //Maps up to 4 logical EMS pages to physical pages in the page frame, where: + //PhysicalStart = Physical page first logical page is mapped to + //LogicalStart = First logical page to map + //NumPages = Number of pages to map (1 to 4) + //Handle = EMS handle logical pages are allocated to + + /*//Create a buffer containing the page information +// FOR x = 0 TO NumPages - 1 +// MapInfo$ = MapInfo$ + MKI$(LogicalStart + x) + MKI$(PhysicalStart + x) +// NEXT*/ + +// Regs.ax = 0x5000 //Map the pages in the buffer +// Regs.cx = NumPages //to the pageframe +// Regs.dx = Handle +// Regs.ds = VARSEG(MapInfo$) +// Regs.si = SADD(MapInfo$) +// InterruptX 0x67, Regs, Regs +// EMS.Error = (Regs.ax AND 0xFF00&) \ 0x100 //Store the status code + //END SUB char str[80]; byte err; @@ -361,11 +359,12 @@ byte MM_MapXEMS(mminfo_t *mm, mminfotype *mmi) if(errorflag==true) { //err = CPURegs.h.ah; - strcpy(str,"MM_MapXEMS: EMS error 0x"); + //strcpy(str,"MM_MapXEMS: EMS error 0x"); + strcpy(str,"MM_MapXEMS: EMS error"); //itoa(err,str2,16); - //strcat(str,&err); - //printf("%s\n",str); - printf("%s%x\n",str, err); + strcat(str,MM_EMSerr(err)); + printf("%s\n",str); + //printf("%s%x\n",str, err); //printf("FACK! %x\n", err); return err; } @@ -1382,22 +1381,134 @@ void MM_Report(page_t *page, mminfo_t *mm, mminfotype *mmi) /* ===================== = -= MM_EMSVer += MM_EMSerr = ===================== +*/ - -int MM_EMSVer(void) +byte *MM_EMSerr(byte err) { - int EMSver; - __asm + //Returns a text string describing the error code in EMS.Error. + static byte msag[128]; + switch(err) { - mov ah,EMS_VERSION - int EMS_INT - mov EMSver,ax + case 0x0: + strcpy(msag, "successful"); + break; + case 0x80: + strcpy(msag, "internal error"); + break; + case 0x81: + strcpy(msag, "hardware malfunction"); + break; + case 0x82: + strcpy(msag, "busy .. retry later"); + break; + case 0x83: + strcpy(msag, "invalid handle"); + break; + case 0x84: + strcpy(msag, "undefined function requested by application"); + break; + case 0x85: + strcpy(msag, "no more handles available"); + break; + case 0x86: + strcpy(msag, "error in save or restore of mapping context"); + break; + case 0x87: + strcpy(msag, "insufficient memory pages in system"); + break; + case 0x88: + strcpy(msag, "insufficient memory pages available"); + break; + case 0x89: + strcpy(msag, "zero pages requested"); + break; + case 0x8A: + strcpy(msag, "invalid logical page number encountered"); + break; + case 0x8B: + strcpy(msag, "invalid physical page number encountered"); + break; + case 0x8C: + strcpy(msag, "page-mapping hardware state save area is full"); + break; + case 0x8D: + strcpy(msag, "save of mapping context failed"); + break; + case 0x8E: + strcpy(msag, "restore of mapping context failed"); + break; + case 0x8F: + strcpy(msag, "undefined subfunction"); + break; + case 0x90: + strcpy(msag, "undefined attribute type"); + break; + case 0x91: + strcpy(msag, "feature not supported"); + break; + case 0x92: + strcpy(msag, "successful, but a portion of the source region has been overwritten"); + break; + case 0x93: + strcpy(msag, "length of source or destination region exceeds length of region allocated to either source or destination handle"); + break; + case 0x94: + strcpy(msag, "conventional and expanded memory regions overlap"); + break; + case 0x95: + strcpy(msag, "offset within logical page exceeds size of logical page"); + break; + case 0x96: + strcpy(msag, "region length exceeds 1 MB"); + break; + case 0x97: + strcpy(msag, "source and destination EMS regions have same handle and overlap"); + break; + case 0x98: + strcpy(msag, "memory source or destination type undefined"); + break; + case 0x9A: + strcpy(msag, "specified alternate map register or DMA register set not supported"); + break; + case 0x9B: + strcpy(msag, "all alternate map register or DMA register sets currently allocated"); + break; + case 0x9C: + strcpy(msag, "alternate map register or DMA register sets not supported"); + break; + case 0x9D: + strcpy(msag, "undefined or unallocated alternate map register or DMA register set"); + break; + case 0x9E: + strcpy(msag, "dedicated DMA channels not supported"); + break; + case 0x9F: + strcpy(msag, "specified dedicated DMA channel not supported"); + break; + case 0xA0: + strcpy(msag, "no such handle name"); + break; + case 0xA1: + strcpy(msag, "a handle found had no name, or duplicate handle name"); + break; + case 0xA2: + strcpy(msag, "attempted to wrap around 1M conventional address space"); + break; + case 0xA3: + strcpy(msag, "source array corrupted"); + break; + case 0xA4: + strcpy(msag, "operating system denied access"); + break; + default: + strcpy(msag, "undefined error"); + break; } - return(EMSver); -}*/ + return &msag; +} //========================================================================== diff --git a/src/lib/16_mm.h b/src/lib/16_mm.h index 8b729644..27a397c9 100644 --- a/src/lib/16_mm.h +++ b/src/lib/16_mm.h @@ -187,7 +187,7 @@ void MM_DumpData(mminfo_t *mm); dword MM_UnusedMemory(mminfo_t *mm); dword MM_TotalFree(mminfo_t *mm); void MM_Report(page_t *page, mminfo_t *mm, mminfotype *mmi); -//int MM_EMSVer(void); +byte *MM_EMSerr(byte err); void MM_BombOnError(boolean bomb, mminfo_t *mm); void MM_GetNewBlock(mminfo_t *mm); void MM_FreeBlock(mmblocktype *x, mminfo_t *mm); -- 2.39.2