From 8cdd69d75d0d1f2b820dc4fa0ebf8892ab70f03d Mon Sep 17 00:00:00 2001 From: sparky4 Date: Thu, 22 Sep 2016 11:20:42 -0500 Subject: [PATCH] 16_pm tweakings --- DEBUG.16W | 20 +++---- MMDUMP.16W | Bin 66 -> 66 bytes makefile | 3 +- src/exmmtest.c | 5 +- src/lib/16_head.h | 18 ++++++- src/lib/16_mm.c | 62 ++++++++++++---------- src/lib/16_mm.h | 6 +-- src/lib/16_pm.c | 128 ++++++++++++++++++++++++++------------------- src/lib/typdefst.h | 3 +- 9 files changed, 142 insertions(+), 103 deletions(-) diff --git a/DEBUG.16W b/DEBUG.16W index 443a5fd6..5fb5e282 100755 --- a/DEBUG.16W +++ b/DEBUG.16W @@ -1,12 +1,12 @@ -Seg:0 Size:10392 Owner:0x7cfc -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0 -Seg:2898 Size:256 Owner:0x638e -+++++ -Seg:2998 Size:401 Owner:0xa41a -++++++ -Seg:2e11 Size:36 Owner:0x0 -+000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Seg:be35 Size:8651 Owner:0x0 -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +Seg:0 Size:8568 Owner:0xfe7e +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0 +Seg:2178 Size:256 Owner:0x5434 +++++ +Seg:2278 Size:17 Owner:0x9480 ++ +Seg:27ec Size:44 Owner:0x0 +++0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Seg:b818 Size:10216 Owner:0x0 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Seg:e000 Size:8191 Owner:0x0 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \ No newline at end of file diff --git a/MMDUMP.16W b/MMDUMP.16W index 300e3279762e6d5eb41f81bd1adea17b2d92d237..4bf1c809f6d6b2988d2b2f86a1bfb477c54c02e3 100755 GIT binary patch literal 66 zcmXr0FfcGmu`)F=Hc`;fWzbZxRWRV?GJuF$nphYBMFo*WO_HtBQq5C=q7_h40KNAO AMF0Q* literal 66 zcmXr0FfcGmu`)BZNLA3#WzbZxRWRV?G60I2BwLv$rzHbLXCR3J)h3!4CIUq#LPY`U CXbx!r diff --git a/makefile b/makefile index 2496bbd8..e8aa09fc 100755 --- a/makefile +++ b/makefile @@ -106,9 +106,8 @@ LIBFLAGS=$(WLIBQ) -b -n # objects # VGMSNDOBJ = vgmSnd.$(OBJ) 16_snd.$(OBJ) -COREOBJS = 16_mm.$(OBJ) 16_pm.$(OBJ) 16_ca.$(OBJ) 16_lib.$(OBJ) 16_in.$(OBJ) 16_head.$(OBJ) 16_dbg.$(OBJ) kitten.$(OBJ) 16_hc.$(OBJ) GFXLIBOBJS = modex16.$(OBJ) bitmap.$(OBJ) 16text.$(OBJ) bakapee.$(OBJ) scroll16.$(OBJ) 16render.$(OBJ) 16_vrs.$(OBJ) 16_sprit.$(OBJ) -16LIBOBJS = $(COREOBJS) wcpu.$(OBJ) 16_timer.$(OBJ) +16LIBOBJS = 16_mm.$(OBJ) 16_pm.$(OBJ) 16_ca.$(OBJ) 16_lib.$(OBJ) 16_in.$(OBJ) 16_head.$(OBJ) 16_dbg.$(OBJ) kitten.$(OBJ) 16_hc.$(OBJ) wcpu.$(OBJ) 16_timer.$(OBJ) #16planar.$(OBJ) planar.$(OBJ) DOSLIBOBJ = adlib.$(OBJ) 8254.$(OBJ) 8259.$(OBJ) dos.$(OBJ) cpu.$(OBJ) !ifeq DEBUGSERIAL 1 diff --git a/src/exmmtest.c b/src/exmmtest.c index 046380ce..bddf4a09 100755 --- a/src/exmmtest.c +++ b/src/exmmtest.c @@ -95,11 +95,10 @@ main(int argc, char *argv[]) bakapee1 = "data/koishi~.pcx"; bakapee2 = "data/test.map"; } -// printf("main()=%Fp start MM\n", *argv[0]); + //printf("main()=%Fp start MM\n", *argv[0]); MM_Startup(&gvar); PM_Startup(&gvar); - PM_UnlockMainMem(&gvar); - //PM_LockMainMem(&gvar); + //PM_UnlockMainMem(&gvar); CA_Startup(&gvar); // printf(" done!\n"); PRINTBB; diff --git a/src/lib/16_head.h b/src/lib/16_head.h index baa983e8..b3423ed0 100755 --- a/src/lib/16_head.h +++ b/src/lib/16_head.h @@ -160,7 +160,23 @@ extern int profilehandle,debughandle; //make it into game global #endif #ifdef __WATCOMC__ #define _FCORELEFT 0x90000UL+16UL -extern union REGS CPURegs; +static union REGS CPURegs; + +#define _AX CPURegs.x.ax +#define _BX CPURegs.x.bx +#define _CX CPURegs.x.cx +#define _DX CPURegs.x.dx + +#define _SI CPURegs.x.si + +#define _AH CPURegs.h.ah +#define _AL CPURegs.h.al +#define _BH CPURegs.h.bh +#define _BL CPURegs.h.bl +#define _CH CPURegs.h.ch +#define _CL CPURegs.h.cl +#define _DH CPURegs.h.dh +#define _DL CPURegs.h.dl #define geninterrupt(n) int86(n,&CPURegs,&CPURegs); #define peekb(segm,ofs) (*(byte far*)MK_FP((segm),(ofs))) diff --git a/src/lib/16_mm.c b/src/lib/16_mm.c index 9eb93c67..9333d380 100755 --- a/src/lib/16_mm.c +++ b/src/lib/16_mm.c @@ -157,8 +157,8 @@ byte MML_SetupEMS(global_game_variables_t *gvar) unsigned int EMSVer = 0; //byte EMS_status; - unsigned totalEMSpages,freeEMSpages,EMSpageframe,EMSpagesmapped,EMShandle; - totalEMSpages = freeEMSpages = EMSpageframe = EMSpagesmapped = 0; + unsigned totalEMSpages,freeEMSpages,EMSPageFrame,EMSpagesmapped,EMSHandle; + totalEMSpages = freeEMSpages = EMSPageFrame = EMSpagesmapped = 0; __asm { mov ah,EMS_STATUS @@ -179,7 +179,7 @@ byte MML_SetupEMS(global_game_variables_t *gvar) int EMS_INT // find the page frame address or ah,ah jnz error - mov [EMSpageframe],bx + mov [EMSPageFrame],bx mov ah,EMS_GETPAGES int EMS_INT // find out how much EMS is there @@ -218,7 +218,7 @@ byte MML_SetupEMS(global_game_variables_t *gvar) int EMS_INT or ah,ah jnz error - mov [EMShandle],dx + mov [EMSHandle],dx jmp End #ifdef __BORLANDC__ } @@ -245,12 +245,12 @@ End: printf("%s\n",str); return err; } - gvar->mm.totalEMSpages=totalEMSpages; - gvar->mm.freeEMSpages=freeEMSpages; - gvar->mm.EMSpageframe=EMSpageframe; - gvar->mm.EMSpagesmapped=EMSpagesmapped; - gvar->mm.EMShandle=EMShandle; - gvar->mm.EMSVer=EMSVer; + gvar->pm.emm.totalEMSpages=totalEMSpages; + gvar->pm.emm.freeEMSpages=freeEMSpages; + gvar->pm.emm.EMSPageFrame=EMSPageFrame; + gvar->pm.emm.EMSpagesmapped=EMSpagesmapped; + gvar->pm.emm.EMSHandle=EMSHandle; + gvar->pm.emm.EMSVer=EMSVer; return 0; } @@ -266,13 +266,13 @@ End: void MML_ShutdownEMS(global_game_variables_t *gvar) { boolean errorflag=false; - unsigned EMShandle=gvar->mm.EMShandle; + unsigned EMSHandle=gvar->pm.emm.EMSHandle; - if(!EMShandle) + if(!EMSHandle) return; __asm { mov ah,EMS_FREEPAGES - mov dx,[EMShandle] + mov dx,[EMSHandle] int EMS_INT or ah,ah jz ok @@ -303,11 +303,11 @@ void MML_ShutdownEMS(global_game_variables_t *gvar) byte MM_MapEMS(global_game_variables_t *gvar) { byte str[160]; - unsigned EMShandle; + unsigned EMSHandle; byte err; boolean errorflag=false; int i; - EMShandle=gvar->mm.EMShandle; + EMSHandle=gvar->pm.emm.EMSHandle; for (i=0;i<4/*MAPPAGES*/;i++) { @@ -315,7 +315,7 @@ byte MM_MapEMS(global_game_variables_t *gvar) mov ah,EMS_MAPPAGE mov bx,[i] // logical page mov al,bl // physical page - mov dx,[EMShandle] // handle + mov dx,[EMSHandle] // handle int EMS_INT or ah,ah jnz error @@ -375,12 +375,12 @@ byte MM_MapXEMS(global_game_variables_t *gvar) //END SUB byte str[160]; byte err; - word EMShandle; + word EMSHandle; boolean errorflag=false; int i; - EMShandle=gvar->mm.EMShandle; + EMSHandle=gvar->pm.emm.EMSHandle; - if(gvar->mm.EMSVer<0x40) + if(gvar->pm.emm.EMSVer<0x40) return 5; for (i=0;imm.EMSpageframe,(MAPPAGES)*0x4000lu, gvar); + MML_UseSpace(gvar->pm.emm.EMSPageFrame,(MAPPAGES)*0x4000lu, gvar); //if(gvar->pm.emm.EMSVer<0x40) MM_MapEMS(gvar); // map in used pages //else @@ -964,9 +964,10 @@ void MM_GetPtr (memptr *baseptr, dword size, global_game_variables_t *gvar) gvar->mm.mmnew->useptr = baseptr; //if(gvar->mm.mmnew->useptr==NULL){ #ifdef __DEBUG__ - printf("baseptr=%04x ", baseptr); printf("useptr=%04x\n", gvar->mm.mmnew->useptr); - printf("*baseptr=%04x ", *baseptr); printf("*useptr=%04x\n", *(gvar->mm.mmnew->useptr)); - printf("*baseptr=%Fp ", *baseptr); printf("*useptr=%Fp\n", *(gvar->mm.mmnew->useptr)); + printf(" MM_GetPtr\n"); + printf(" baseptr=%04x ", baseptr); printf("useptr=%04x\n", gvar->mm.mmnew->useptr); + printf(" *baseptr=%04x ", *baseptr); printf("*useptr=%04x\n", *(gvar->mm.mmnew->useptr)); + printf(" *baseptr=%Fp ", *baseptr); printf("*useptr=%Fp\n", *(gvar->mm.mmnew->useptr)); #endif //exit(-5); } gvar->mm.mmnew->attributes = BASEATTRIBUTES; @@ -1124,8 +1125,11 @@ void MM_SetPurge(memptr *baseptr, int purge, global_game_variables_t *gvar) gvar->mm.mmrover = gvar->mm.mmhead; else if(gvar->mm.mmrover == start) { - Quit("MM_SetPurge: Block not found!"); - //return; + //Quit("MM_SetPurge: Block not found!"); + printf("%Fp %u\n", start->start, start->length); + printf("MM_SetPurge: Block not found!\n"); + exit(1); + return; } } while(1); @@ -1605,9 +1609,9 @@ void MM_Report_(global_game_variables_t *gvar) if(MML_CheckForEMS()) { printf(" LIMEMS\n"); - printf(" EMM v%x.%x available\n", gvar->mm.EMSVer>>4,gvar->mm.EMSVer&0x0F); - printf(" totalEMSpages: %u ", gvar->mm.totalEMSpages); printf("freeEMSpages: %u\n", gvar->mm.freeEMSpages); - printf(" EMSpageframe: %x\n", gvar->mm.EMSpageframe); + printf(" EMM v%x.%x available\n", gvar->pm.emm.EMSVer>>4,gvar->pm.emm.EMSVer&0x0F); + printf(" totalEMSpages: %u ", gvar->pm.emm.totalEMSpages); printf("freeEMSpages: %u\n", gvar->pm.emm.freeEMSpages); + printf(" EMSPageFrame: %x\n", gvar->pm.emm.EMSPageFrame); } if(MML_CheckForXMS(gvar)) { diff --git a/src/lib/16_mm.h b/src/lib/16_mm.h index 7995bf23..206a3c8b 100755 --- a/src/lib/16_mm.h +++ b/src/lib/16_mm.h @@ -26,9 +26,9 @@ #include "src/lib/16_head.h" #include "src/lib/16_hc.h" #include "src/lib/16_lib.h" -//#include "src/lib/modex16.h" //++++mh #include "src/lib/16_in.h" + #ifdef __DEBUG__ // 1 == Debug/Dev ; 0 == Production/final #define OUT_OF_MEM_MSG "MM_GetPtr: Out of memory!\nYou were short :%lu bytes\n" #else @@ -205,12 +205,12 @@ void MM_FreePtr(memptr *baseptr, global_game_variables_t *gvar); void MM_SetPurge(memptr *baseptr, int purge, global_game_variables_t *gvar); void MM_SetLock(memptr *baseptr, boolean locked, global_game_variables_t *gvar); void MM_SortMem(global_game_variables_t *gvar); -void MM_ShowMemory(global_game_variables_t *gvar);//,/*page_t *page, */mminfo_t *mm); +void MM_ShowMemory(global_game_variables_t *gvar); void MM_DumpData(global_game_variables_t *gvar); dword MM_UnusedMemory(global_game_variables_t *gvar); dword MM_TotalFree(global_game_variables_t *gvar); void MM_Report_(global_game_variables_t *gvar); -static void MM_EMSerr(byte *stri, byte err); +/*static */void MM_EMSerr(byte *stri, byte err); void MM_BombOnError(boolean bomb, global_game_variables_t *gvar); //void MM_GetNewBlock(mminfo_t *mm); //void MM_FreeBlock(mmblocktype *x, mminfo_t *mm); diff --git a/src/lib/16_pm.c b/src/lib/16_pm.c index 97401951..8ebf0ec0 100755 --- a/src/lib/16_pm.c +++ b/src/lib/16_pm.c @@ -28,7 +28,7 @@ #include "src/lib/16_pm.h" #pragma hdrstop -union REGS CPURegs; + /* // Main Mem specific variables boolean MainPresent; @@ -77,23 +77,50 @@ static char *ParmStrings[] = {"nomain","noems","noxms",nil}; // // PML_MapEMS() - Maps a logical page to a physical page // -void -PML_MapEMS(word logical, word physical, global_game_variables_t *gvar) +byte +PML_MapEMS(word logical, byte physical, global_game_variables_t *gvar) { - union REGS CPURegs; - CPURegs.h.al = physical; - CPURegs.x.bx = logical; - CPURegs.x.dx = gvar->pm.emm.EMSHandle; - CPURegs.h.ah = EMS_MAPPAGE; + byte str[160]; + unsigned EMShandle; + byte err; + boolean errorflag=false; + int i; + EMShandle=gvar->pm.emm.EMSHandle; + __asm { + mov ah,EMS_MAPPAGE + mov al,physical + mov bx,logical + mov dx,EMShandle int EMS_INT + or ah,ah + jnz error + jmp End +#ifdef __BORLANDC__ } - - if(CPURegs.h.ah) +#endif + error: +#ifdef __BORLANDC__ + __asm { +#endif + mov err,ah + mov errorflag,1 +#ifdef __BORLANDC__ + } +#endif + End: +#ifdef __WATCOMC__ + } +#endif + if(errorflag==true) { + strcpy(str,"MM_MapEMS: EMS error "); + MM_EMSerr(str, err); + printf("%s\n",str); Quit("PML_MapEMS: Page mapping failed\n"); - return; + return err; } + return 0; } // @@ -111,7 +138,6 @@ boolean PML_StartupEMS(global_game_variables_t *gvar) { boolean emmcfems; - union REGS CPURegs; int i; long size; @@ -121,8 +147,8 @@ PML_StartupEMS(global_game_variables_t *gvar) emmcfems=0; __asm { - //CPURegs.x.dx = (word)EMMDriverName; - //CPURegs.x.ax = 0x3d00; + //_DX = (word)EMMDriverName; + //_AX = 0x3d00; //geninterrupt(0x21); // try to open EMMXXXX0 device mov dx,OFFSET EMMDriverName mov ax,0x3d00 @@ -139,8 +165,8 @@ gothandle: #ifdef __BORLANDC__ __asm { #endif - //CPURegs.x.bx = CPURegs.x.ax; - //CPURegs.x.ax = 0x4400; + //_BX = _AX; + //_AX = 0x4400; //geninterrupt(0x21); // get device info mov bx,ax mov ax,0x4400 @@ -159,43 +185,43 @@ gotinfo: #endif if(emmcfems!=0) goto error; __asm and dx,0x80 - if (!CPURegs.x.dx) + if (!_DX) goto error; - CPURegs.x.ax = 0x4407; + _AX = 0x4407; geninterrupt(0x21); // get status __asm mov emmcfems,1 if(emmcfems!=0) goto error; - if (!CPURegs.h.al) + if (!_AL) goto error; - CPURegs.h.ah = 0x3e; + _AH = 0x3e; geninterrupt(0x21); // close handle - CPURegs.h.ah = EMS_STATUS; + _AH = EMS_STATUS; geninterrupt(EMS_INT); - if (CPURegs.h.ah) + if (_AH) goto error; // make sure EMS hardware is present - CPURegs.h.ah = EMS_VERSION; + _AH = EMS_VERSION; geninterrupt(EMS_INT); - if (CPURegs.h.ah || (CPURegs.h.al < 0x32)) // only work on EMS 3.2 or greater (silly, but...) + if (_AH || (_AL < 0x32)) // only work on EMS 3.2 or greater (silly, but...) goto error; - CPURegs.h.ah = EMS_GETFRAME; + _AH = EMS_GETFRAME; geninterrupt(EMS_INT); - if (CPURegs.h.ah) + if (_AH) goto error; // find the page frame address - gvar->pm.emm.EMSPageFrame = CPURegs.x.bx; + gvar->pm.emm.EMSPageFrame = _BX; - CPURegs.h.ah = EMS_GETPAGES; + _AH = EMS_GETPAGES; geninterrupt(EMS_INT); - if (CPURegs.h.ah) + if (_AH) goto error; - if (CPURegs.x.bx < 2) + if (_BX < 2) goto error; // Require at least 2 pages (32k) - gvar->pm.emm.EMSAvail = CPURegs.x.bx; + gvar->pm.emm.EMSAvail = _BX; // Don't hog all available EMS size = gvar->pm.emm.EMSAvail * (long)EMSPageSize; @@ -205,12 +231,12 @@ gotinfo: gvar->pm.emm.EMSAvail = size / EMSPageSize; } - CPURegs.h.ah = EMS_ALLOCPAGES; - CPURegs.x.bx = gvar->pm.emm.EMSAvail; + _AH = EMS_ALLOCPAGES; + _BX = gvar->pm.emm.EMSAvail; geninterrupt(EMS_INT); - if (CPURegs.h.ah) + if (_AH) goto error; - gvar->pm.emm.EMSHandle = CPURegs.x.dx; + gvar->pm.emm.EMSHandle = _DX; gvar->mmi.EMSmem += gvar->pm.emm.EMSAvail * (long)EMSPageSize; @@ -230,14 +256,12 @@ error: void PML_ShutdownEMS(global_game_variables_t *gvar) { - union REGS CPURegs; - if (gvar->pm.emm.EMSPresent) { - CPURegs.h.ah=EMS_FREEPAGES; - CPURegs.x.ax=gvar->pm.emm.EMSHandle; + _AH=EMS_FREEPAGES; + _AX=gvar->pm.emm.EMSHandle; geninterrupt(EMS_INT); - if (CPURegs.h.ah) + if (_AH) { Quit("PML_ShutdownEMS: Error freeing EMS\n"); //return; @@ -260,15 +284,13 @@ PML_ShutdownEMS(global_game_variables_t *gvar) boolean PML_StartupXMS(global_game_variables_t *gvar) { - union REGS CPURegs; - XMSD; gvar->pm.xmm.XMSPresent = false; // Assume failure gvar->pm.xmm.XMSAvail = 0; - CPURegs.x.ax=0x4300; + _AX=0x4300; geninterrupt(XMS_INT); // Check for presence of XMS driver - if (CPURegs.h.al != 0x80) + if (_AL != 0x80) goto error; @@ -280,19 +302,19 @@ PML_StartupXMS(global_game_variables_t *gvar) } XMS_CALL(XMS_QUERYFREE, gvar); // Find out how much XMS is available - gvar->pm.xmm.XMSAvail = CPURegs.x.ax; - if (!CPURegs.x.ax) // AJR: bugfix 10/8/92 + gvar->pm.xmm.XMSAvail = _AX; + if (!_AX) // AJR: bugfix 10/8/92 goto error; gvar->pm.xmm.XMSAvail &= ~(PMPageSizeKB - 1); // Round off to nearest page size if (gvar->pm.xmm.XMSAvail < (PMPageSizeKB * 2)) // Need at least 2 pages goto error; - CPURegs.x.dx = gvar->pm.xmm.XMSAvail; + _DX = gvar->pm.xmm.XMSAvail; XMS_CALL(XMS_ALLOC, gvar); // And do the allocation - gvar->pm.xmm.XMSHandle = CPURegs.x.dx; + gvar->pm.xmm.XMSHandle = _DX; - if (!CPURegs.x.ax) // AJR: bugfix 10/8/92 + if (!_AX) // AJR: bugfix 10/8/92 { gvar->pm.xmm.XMSAvail = 0; goto error; @@ -340,12 +362,12 @@ PML_XMSCopy(boolean toxms,byte far *addr,word xmspage,word length, global_game_v __asm { push si } - CPURegs.x.si = (word)© + _SI = (word)© XMS_CALL(XMS_MOVE, gvar); __asm { pop si } - if (!CPURegs.x.ax) + if (!_AX) { Quit("PML_XMSCopy: Error on copy"); //return; @@ -386,9 +408,9 @@ PML_ShutdownXMS(global_game_variables_t *gvar) XMSD; if (gvar->pm.xmm.XMSPresent) { - CPURegs.x.dx = gvar->pm.xmm.XMSHandle; + _DX = gvar->pm.xmm.XMSHandle; XMS_CALL(XMS_FREE, gvar); - if (CPURegs.h.bl) + if (_BL) { Quit("PML_ShutdownXMS: Error freeing XMS"); //return; diff --git a/src/lib/typdefst.h b/src/lib/typdefst.h index 5aa4c8c3..4d031f9e 100755 --- a/src/lib/typdefst.h +++ b/src/lib/typdefst.h @@ -170,8 +170,6 @@ typedef struct void __near *nearheap; #endif //byte EMS_status; - unsigned totalEMSpages,freeEMSpages,EMSpageframe,EMSpagesmapped,EMShandle;//TODO: PM use - unsigned int EMSVer; word numUMBs,UMBbase[MAXUMBS]; //dword numUMBs,UMBbase[MAXUMBS]; //huge mmblocktype huge mmblocks[MAXBLOCKS],huge *mmhead,huge *mmfree,huge *mmrover,huge *mmnew; @@ -248,6 +246,7 @@ typedef struct boolean EMSPresent; word EMSAvail,EMSPagesAvail,EMSHandle, EMSPageFrame,EMSPhysicalPage, EMSVer; + word totalEMSpages, freeEMSpages, EMSpagesmapped; EMSListStruct EMSList[EMSFrameCount]; } pm_emmi_t; -- 2.39.2