From 0c47a862860b6ae769429092860ecd9ae1591ba9 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Thu, 15 Sep 2016 10:52:30 -0500 Subject: [PATCH] pm mm and ca i am working on pm started wwww --- bcexmm.dsk | Bin 261 -> 261 bytes bcexmm.exe | Bin 62488 -> 66176 bytes bcexmm.prj | Bin 5357 -> 7269 bytes makefile | 3 +- pm.use | 562 ++++++++++----------------------------------- src/exmmtest.c | 2 +- src/lib/16_head.c | 76 +++--- src/lib/16_head.h | 1 + src/lib/16_mm.c | 13 +- src/lib/16_mm.h | 2 +- src/lib/16_pm.c | 165 ++++++++----- src/lib/16_pm.h | 10 +- src/lib/typdefst.h | 123 +++++++++- 13 files changed, 401 insertions(+), 556 deletions(-) diff --git a/bcexmm.dsk b/bcexmm.dsk index 9d1c2ae5dac26efd4b845a894173c649cc46b58c..115d6b994d2d69428d3381c954644d065babb4e3 100755 GIT binary patch delta 110 zcmZo=YGs0tL;#M(HsmL3IiD!z%mRBlht0xfYbo#iNVg;)H4BPL$Inp Oq|B&3u|RU-e>MPzZyIj^ diff --git a/bcexmm.exe b/bcexmm.exe index d4ca4af8941a6d2e8f1b3552122810b957b51599..b0c69877343329517c174e3d05a2959544c08036 100755 GIT binary patch delta 33194 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 y-z;>mDT5r)${}0#JW`!pO#cmQ31*xC delta 29393 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 Y(%N$-QaW4h)4yBq58j`HyNVC~4=7;J#sB~S diff --git a/bcexmm.prj b/bcexmm.prj index 6a7ef6315f8aa11cdcd50480cf8f75c87940f4a6..8ea92c50e953a811ce892d6391feba6c4563ef26 100755 GIT binary patch literal 7269 zcmeI1`EwLS6vyA}83;!R2_Yen0hS|Bk5L^Y4Y#^Gj7!nlJfO1({ zSP1-L6+bB62gsq8WqDCrmdc@}$mLJ^4|su!BIEn^Bsi(CyGa&=vYe`X_Vt_B@96I7 zIij_-)W&5+4z@thG%o@=K$1ij zi6L1TWCQGg13D)oKZ8-q}`C7h4dWoJn#bW zBJdJ}_5u6RJOCU-^JU-_hV@lQuK|02y};|ho4{K@HbM?X201`3Fbv3(j4>R}4Jlv3 zco#rF0w{!XB&1OcYZ00mfD0H0j7R6J2`o((Ztk(Lcn3qe6Sxbg1?qr$AO-avSTIKiy0{`W~Q{5mC|B%N{cxuEpA9@abrr0n^IcboYLZ!looS&;a=;* zeeIX0N6MgSWwU2sD7-AsDxb|)5>eH)Pfg*gxI_tsXr8!L=sI7|Cr#EW7+(|HSf&S;ev|5R5Evhh$eM9Q21Y*`;v9ADK51 z*;TMmygJ@kFHb6|lY15A>Kh-{rFKm`$hlXoiZ$0Z#aa>t)!Y$(qH}%Gm--jVrHfR# zG$^~SwC}#;)7L&nbTUS;-4m;ATed9m2vTc(UxQq}pUb<@8*uyo&Aa{O6G>Bh^wJRW z%R~deMkFAQgwbaFACEmO;@hFBB^8lnTyRNju^i%4S zhc9?9RGU}ETUupbV{OaQmd2$k5;#)*p)2~3>$=ho6Xboh)nDqkNB@7MH3HM=EWaXK zD1#qzE;@)*_O_fgk+2fwRTmA^xC7DKR88{+N))=Bu4mzgQZ@|{rh_PxWBIN8vd`@T zQ>^kCi>nom;*Dt0&iI|Wo<%XNhEXo%2yqk*;#lW7#)teSeUNqV>s{#gYaE0_;YY+W z>3S22#?WYzMUOF*&9V0M!&e8QIs9v?L2-AlOXzwNtcXU@NYTMXIUMU&{!Eg~?YH^Q z6sy|n_Mo&bV`%7l9<7i@P=PQXPx&0{Q<o2cmZvPIq>Ywb>5!!H7dc&LQXx&CuvV&$rUlG?)DXB(Wfyb` z<_Zp@80&}7JK<6_TgWz{cL-((4i)+wA?FEsfMBLzf1w{PIFMrNGSqzfm?oi32*W4Hu6i(|bSfD%_{r&6m4dAwD8Ct^K@$fWm1pv1Z_De3mbHOgND za2k8aA&bo28$DInL@x@_Qi)_0q zm9CcN$CV`GQ>6qnU$Wdp=KSvx{znjE8XKQ6+r|!U-u{e@$=HvLz1i5OjjhdiNKH7C zk(x*}qPfKqNHp6KEvyFSA>YIn9)4O&X0bRh-zQ2=p*$$K;Z6D#Slg|^cUdVn_3W~!zzMM$G1w3KS8iJEBzt)aE7=hebHV{KiW d{dKOKOD*0W4H>&lZJo(X>5w~~Y7HyQ(%)EJo#6lg delta 93 zcmaEA@m6y~4F_{{lh)>Xjt3m93=F(YT9Z=*(}AoAAnO8{6$xb72!X^vtQA7(9AK8` fB<9KD!YTX^&N&4J26=7<2Fb}?!pA3{l%4|s1~wX5 diff --git a/makefile b/makefile index 22929918..41c58178 100755 --- a/makefile +++ b/makefile @@ -91,7 +91,7 @@ UPXQ=-qqq S_FLAGS=-sg -st -of+ -zu -zdf -zff -zgf -k32768#54096#60000 Z_FLAGS=-zk0 -zc -zp8 -zm O_FLAGS=-obmilr -oe=24 -out -oh -ei -onac -ol+ -ok##x -T_FLAGS=-bt=dos -mh -0 -fpi87 -fo=.$(OBJ) -d1 +T_FLAGS=-bt=dos -mh -0 -fpi87 -fo=.$(OBJ) -d1 -e=256 CPPFLAGS=-DTARGET_MSDOS=16 -DMSDOS=1 !ifeq DEBUGSERIAL 1 @@ -288,6 +288,7 @@ mapread.$(OBJ): $(SRCLIB)/mapread.c $(SRCLIB)/mapread.h 16_timer.$(OBJ): $(SRCLIB)/16_timer.c $(SRCLIB)/16_timer.h 16_in.$(OBJ): $(SRCLIB)/16_in.c $(SRCLIB)/16_in.h 16_mm.$(OBJ): $(SRCLIB)/16_mm.c $(SRCLIB)/16_mm.h +16_pm.$(OBJ): $(SRCLIB)/16_pm.c $(SRCLIB)/16_pm.h 16_ca.$(OBJ): $(SRCLIB)/16_ca.c $(SRCLIB)/16_ca.h 16_dbg.$(OBJ): $(SRCLIB)/16_dbg.c $(SRCLIB)/16_dbg.h midi.$(OBJ): $(SRCLIB)/midi.c $(SRCLIB)/midi.h diff --git a/pm.use b/pm.use index e96744a7..a255a3a3 100755 --- a/pm.use +++ b/pm.use @@ -66,7 +66,7 @@ 16/wf3d8086/id_sd.c: PM_CheckMainMem(); 16/wf3d8086/id_sd.c: p = (word far *)MK_FP(PM_GetPage(ChunksInFile - 1),0); 16/wf3d8086/id_sd.c: PM_UnlockMainMem(); -Binary file 16/wf3d8086/obj/wolf3d.exe matches +Binary file 16/wf3d8086/obj/wolf3d.exe matches 16/wf3d8086/obj/wolf3d.map: 1A268H 1B44AH 011E3H ID_PM_TEXT CODE 16/wf3d8086/obj/wolf3d.map: 1A26:0008 11E3 C=CODE S=ID_PM_TEXT G=(none) M=ID_PM.C ACBP=28 16/wf3d8086/obj/wolf3d.map: 1A26:02F3 _PM_CheckMainMem @@ -145,438 +145,128 @@ Binary file 16/wf3d8086/obj/wolf3d.exe matches 16/wf3d8086/wolf3d.map: 1912:114B _PM_Shutdown 16/wf3d8086/wolfhack.c: src = PM_GetPage(0); 16/wf3d8086/wolfhack.c: src = PM_GetPage(1); -16/wolf3d/WOLFSRC/CONTIGSC.C: shape = PM_GetSpritePage (shapenum); -16/wolf3d/WOLFSRC/CONTIGSC.C: shape = PM_GetSpritePage (shapenum); -16/wolf3d/WOLFSRC/ID_PM.C:// PM_SetMainMemPurge() - Sets the purge level for all allocated main memory -16/wolf3d/WOLFSRC/ID_PM.C:// blocks. This shouldn't be called directly - the PM_LockMainMem() and -16/wolf3d/WOLFSRC/ID_PM.C:// PM_UnlockMainMem() macros should be used instead. -16/wolf3d/WOLFSRC/ID_PM.C:PM_SetMainMemPurge(int level) -16/wolf3d/WOLFSRC/ID_PM.C:// PM_CheckMainMem() - If something besides the Page Mgr makes requests of -16/wolf3d/WOLFSRC/ID_PM.C:// This routine now calls PM_LockMainMem() to make sure that any allocation -16/wolf3d/WOLFSRC/ID_PM.C:// of the other blocks. Because PM_LockMainMem() is called, -16/wolf3d/WOLFSRC/ID_PM.C:// PM_UnlockMainMem() needs to be called before any other part of the -16/wolf3d/WOLFSRC/ID_PM.C:PM_CheckMainMem(void) -16/wolf3d/WOLFSRC/ID_PM.C: PM_LockMainMem(); -16/wolf3d/WOLFSRC/ID_PM.C:// necessary to make requests of the Memory Mgr, PM_UnlockMainMem() -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PM_SetupMainMem: Not enough main memory"); -16/wolf3d/WOLFSRC/ID_PM.C:// PM_GetPageAddress() - Returns the address of a given page -16/wolf3d/WOLFSRC/ID_PM.C:PM_GetPageAddress(int pagenum) -16/wolf3d/WOLFSRC/ID_PM.C: PML_CopyToXMS(PM_GetPageAddress(pagenum),page->xmsPage,page->length); -16/wolf3d/WOLFSRC/ID_PM.C: addr = PM_GetPageAddress(orig); -16/wolf3d/WOLFSRC/ID_PM.C:// PM_GetPage() - Returns the address of the page, loading it if necessary -16/wolf3d/WOLFSRC/ID_PM.C:PM_GetPage(int pagenum) -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PM_GetPage: Invalid page request"); -16/wolf3d/WOLFSRC/ID_PM.C: if (!(result = PM_GetPageAddress(pagenum))) -16/wolf3d/WOLFSRC/ID_PM.C: result = PM_GetPageAddress(pagenum); -16/wolf3d/WOLFSRC/ID_PM.C:// PM_SetPageLock() - Sets the lock type on a given page -16/wolf3d/WOLFSRC/ID_PM.C:PM_SetPageLock(int pagenum,PMLockType lock) -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PM_SetPageLock: Locking/unlocking non-sound page"); -16/wolf3d/WOLFSRC/ID_PM.C:// PM_Preload() - Loads as many pages as possible into all types of memory. -16/wolf3d/WOLFSRC/ID_PM.C:PM_Preload(boolean (*update)(word current,word total)) -16/wolf3d/WOLFSRC/ID_PM.C: Quit ("PM_Preload: Pages>=ChunksInFile"); -16/wolf3d/WOLFSRC/ID_PM.C: PM_GetPage(page); -16/wolf3d/WOLFSRC/ID_PM.C: addr = PM_GetPage(oogypage); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PM_Preload: XMS buffer failed"); -16/wolf3d/WOLFSRC/ID_PM.C: Quit ("PM_Preload: Pages>=ChunksInFile"); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PM_Preload: Exceeded XMS pages"); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PM_Preload: Page too long"); -16/wolf3d/WOLFSRC/ID_PM.C:// PM_NextFrame() - Increments the frame counter and adjusts the thrash -16/wolf3d/WOLFSRC/ID_PM.C:PM_NextFrame(void) -16/wolf3d/WOLFSRC/ID_PM.C: sprintf(buf,"PM_NextFrame: Page %d is locked",i); -16/wolf3d/WOLFSRC/ID_PM.C:// PM_Reset() - Sets up caching structures -16/wolf3d/WOLFSRC/ID_PM.C:PM_Reset(void) -16/wolf3d/WOLFSRC/ID_PM.C:// PM_Startup() - Start up the Page Mgr -16/wolf3d/WOLFSRC/ID_PM.C:PM_Startup(void) -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PM_Startup: No main or EMS"); -16/wolf3d/WOLFSRC/ID_PM.C: PM_Reset(); -16/wolf3d/WOLFSRC/ID_PM.C:// PM_Shutdown() - Shut down the Page Mgr -16/wolf3d/WOLFSRC/ID_PM.C:PM_Shutdown(void) -16/wolf3d/WOLFSRC/ID_PM.H:#define PM_GetSoundPage(v) PM_GetPage(PMSoundStart + (v)) -16/wolf3d/WOLFSRC/ID_PM.H:#define PM_GetSpritePage(v) PM_GetPage(PMSpriteStart + (v)) -16/wolf3d/WOLFSRC/ID_PM.H:#define PM_LockMainMem() PM_SetMainMemPurge(0) -16/wolf3d/WOLFSRC/ID_PM.H:#define PM_UnlockMainMem() PM_SetMainMemPurge(3) -16/wolf3d/WOLFSRC/ID_PM.H:extern void PM_Startup(void), -16/wolf3d/WOLFSRC/ID_PM.H: PM_Shutdown(void), -16/wolf3d/WOLFSRC/ID_PM.H: PM_Reset(void), -16/wolf3d/WOLFSRC/ID_PM.H: PM_Preload(boolean (*update)(word current,word total)), -16/wolf3d/WOLFSRC/ID_PM.H: PM_NextFrame(void), -16/wolf3d/WOLFSRC/ID_PM.H: PM_SetPageLock(int pagenum,PMLockType lock), -16/wolf3d/WOLFSRC/ID_PM.H: PM_SetMainPurge(int level), -16/wolf3d/WOLFSRC/ID_PM.H: PM_CheckMainMem(void); -16/wolf3d/WOLFSRC/ID_PM.H:extern memptr PM_GetPageAddress(int pagenum), -16/wolf3d/WOLFSRC/ID_PM.H: PM_GetPage(int pagenum); // Use this one to cache page -16/wolf3d/WOLFSRC/ID_PM.H:void PM_SetMainMemPurge(int level); -16/wolf3d/WOLFSRC/ID_SD.C: addr = PM_GetSoundPage(page); -16/wolf3d/WOLFSRC/ID_SD.C: PM_SetPageLock(PMSoundStart + page,pml_Locked); -16/wolf3d/WOLFSRC/ID_SD.C: PM_SetPageLock(i + PMSoundStart,pml_Unlocked); -16/wolf3d/WOLFSRC/ID_SD.C: PM_UnlockMainMem(); -16/wolf3d/WOLFSRC/ID_SD.C: PM_CheckMainMem(); -16/wolf3d/WOLFSRC/ID_SD.C: p = (word far *)MK_FP(PM_GetPage(ChunksInFile - 1),0); -16/wolf3d/WOLFSRC/ID_SD.C: PM_UnlockMainMem(); -16/wolf3d/WOLFSRC/OLDSCALE.C: shape = PM_GetSpritePage (shapenum); -16/wolf3d/WOLFSRC/OLDSCALE.C: shape = PM_GetSpritePage (shapenum); -16/wolf3d/WOLFSRC/WL_ACT2.C: PM_UnlockMainMem (); -16/wolf3d/WOLFSRC/WL_ACT2.C: PM_CheckMainMem (); -16/wolf3d/WOLFSRC/WL_DEBUG.C: addr = PM_GetPageAddress(i); -16/wolf3d/WOLFSRC/WL_DEBUG.C: PM_GetPage(j); -16/wolf3d/WOLFSRC/WL_DEBUG.C: PM_GetPage(i); -16/wolf3d/WOLFSRC/WL_DRAW.C: *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic); -16/wolf3d/WOLFSRC/WL_DRAW.C: *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic); -16/wolf3d/WOLFSRC/WL_DRAW.C: *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(doorpage); -16/wolf3d/WOLFSRC/WL_DRAW.C: *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(doorpage+1); -16/wolf3d/WOLFSRC/WL_DRAW.C: *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic); -16/wolf3d/WOLFSRC/WL_DRAW.C: *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic); -16/wolf3d/WOLFSRC/WL_DRAW.C: PM_NextFrame(); -16/wolf3d/WOLFSRC/WL_GAME.C: PM_UnlockMainMem(); -16/wolf3d/WOLFSRC/WL_GAME.C: PM_CheckMainMem (); -16/wolf3d/WOLFSRC/WL_GAME.C: PM_CheckMainMem (); -16/wolf3d/WOLFSRC/WL_GAME.C: PM_CheckMainMem (); -16/wolf3d/WOLFSRC/WL_GAME.C: PM_CheckMainMem (); -16/wolf3d/WOLFSRC/WL_INTER.C: PM_Preload (PreloadUpdate); -16/wolf3d/WOLFSRC/WL_MAIN.C: PM_Shutdown (); -16/wolf3d/WOLFSRC/WL_MAIN.C: PM_Startup (); -16/wolf3d/WOLFSRC/WL_MAIN.C: PM_UnlockMainMem (); -16/wolf3d/WOLFSRC/WL_MENU.C: PM_CheckMainMem (); -16/wolf3d/WOLFSRC/WL_MENU.C: PM_CheckMainMem (); -16/wolf3d/WOLFSRC/WL_PLAY.C: PM_CheckMainMem (); -16/wolf3d/WOLFSRC/WL_PLAY.C: PM_CheckMainMem (); -16/wolf3d/WOLFSRC/WL_PLAY.C: PM_CheckMainMem (); -16/wolf3d/WOLFSRC/WL_PLAY.C: PM_CheckMainMem (); -16/wolf3d/WOLFSRC/WL_PLAY.C: PM_CheckMainMem (); -16/wolf3d/WOLFSRC/WL_SCALE.C: shape = PM_GetSpritePage (shapenum); -16/wolf3d/WOLFSRC/WL_SCALE.C: shape = PM_GetSpritePage (shapenum); -Binary file 16/wolf3d/WOLFSRC/WOLF3D.EXE matches -16/wolf3d/WOLFSRC/WOLF3D.MAP: 19127H 1A286H 01160H ID_PM_TEXT CODE -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0007 1160 C=CODE S=ID_PM_TEXT G=(none) M=ID_PM.C ACBP=28 -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:02DF _PM_CheckMainMem -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0C71 _PM_GetPage -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:07BF _PM_GetPageAddress -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0FBA _PM_NextFrame -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0D60 _PM_Preload -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:1034 idle _PM_Reset -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:02B8 _PM_SetMainMemPurge -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0D31 _PM_SetPageLock -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:114B _PM_Shutdown -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:10A0 _PM_Startup -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:02B8 _PM_SetMainMemPurge -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:02DF _PM_CheckMainMem -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:07BF _PM_GetPageAddress -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0C71 _PM_GetPage -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0D31 _PM_SetPageLock -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0D60 _PM_Preload -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0FBA _PM_NextFrame -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:1034 idle _PM_Reset -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:10A0 _PM_Startup -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:114B _PM_Shutdown -16/wolf3d/WOLFSRC/WOLFHACK.C: src = PM_GetPage(0); -16/wolf3d/WOLFSRC/WOLFHACK.C: src = PM_GetPage(1); -16/wf3d8086/id_pm.c:// PML_MapEMS() - Maps a logical page to a physical page -16/wf3d8086/id_pm.c:PML_MapEMS(word logical,word physical) -16/wf3d8086/id_pm.c: Quit("PML_MapEMS: Page mapping failed"); -16/wf3d8086/id_pm.c:// PML_StartupEMS() - Sets up EMS for Page Mgr's use -16/wf3d8086/id_pm.c:PML_StartupEMS(void) -16/wf3d8086/id_pm.c:// PML_ShutdownEMS() - If EMS was used, deallocate it -16/wf3d8086/id_pm.c:PML_ShutdownEMS(void) -16/wf3d8086/id_pm.c: Quit ("PML_ShutdownEMS: Error freeing EMS"); -16/wf3d8086/id_pm.c:// PML_StartupXMS() - Starts up XMS for the Page Mgr's use -16/wf3d8086/id_pm.c:PML_StartupXMS(void) -16/wf3d8086/id_pm.c:// PML_XMSCopy() - Copies a main/EMS page to or from XMS -16/wf3d8086/id_pm.c:PML_XMSCopy(boolean toxms,byte far *addr,word xmspage,word length) -16/wf3d8086/id_pm.c: Quit("PML_XMSCopy: zero address"); -16/wf3d8086/id_pm.c: Quit("PML_XMSCopy: Error on copy"); -16/wf3d8086/id_pm.c:#define PML_CopyToXMS(s,t,l) PML_XMSCopy(true,(s),(t),(l)) -16/wf3d8086/id_pm.c:#define PML_CopyFromXMS(t,s,l) PML_XMSCopy(false,(t),(s),(l)) -16/wf3d8086/id_pm.c:// PML_CopyToXMS() - Copies the specified number of bytes from the real mode -16/wf3d8086/id_pm.c:PML_CopyToXMS(byte far *source,int targetpage,word length) -16/wf3d8086/id_pm.c: PML_XMSCopy(true,source,targetpage,length); -16/wf3d8086/id_pm.c:// PML_CopyFromXMS() - Copies the specified number of bytes from an XMS -16/wf3d8086/id_pm.c:PML_CopyFromXMS(byte far *target,int sourcepage,word length) -16/wf3d8086/id_pm.c: PML_XMSCopy(false,target,sourcepage,length); -16/wf3d8086/id_pm.c:// PML_ShutdownXMS() -16/wf3d8086/id_pm.c:PML_ShutdownXMS(void) -16/wf3d8086/id_pm.c: Quit("PML_ShutdownXMS: Error freeing XMS"); -16/wf3d8086/id_pm.c:// PML_StartupMainMem() - Allocates as much main memory as is possible for -16/wf3d8086/id_pm.c:PML_StartupMainMem(void) -16/wf3d8086/id_pm.c:// PML_ShutdownMainMem() - Frees all of the main memory blocks used by the -16/wf3d8086/id_pm.c:PML_ShutdownMainMem(void) -16/wf3d8086/id_pm.c:// PML_ReadFromFile() - Reads some data in from the page file -16/wf3d8086/id_pm.c:PML_ReadFromFile(byte far *buf,long offset,word length) -16/wf3d8086/id_pm.c: Quit("PML_ReadFromFile: Null pointer"); -16/wf3d8086/id_pm.c: Quit("PML_ReadFromFile: Zero offset"); -16/wf3d8086/id_pm.c: Quit("PML_ReadFromFile: Seek failed"); -16/wf3d8086/id_pm.c: Quit("PML_ReadFromFile: Read failed"); -16/wf3d8086/id_pm.c:// PML_OpenPageFile() - Opens the page file and sets up the page info -16/wf3d8086/id_pm.c:PML_OpenPageFile(void) -16/wf3d8086/id_pm.c: Quit("PML_OpenPageFile: Unable to open page file"); -16/wf3d8086/id_pm.c: Quit("PML_OpenPageFile: Offset read failed"); -16/wf3d8086/id_pm.c: Quit("PML_OpenPageFile: Length read failed"); -16/wf3d8086/id_pm.c:// PML_ClosePageFile() - Closes the page file -16/wf3d8086/id_pm.c:PML_ClosePageFile(void) -16/wf3d8086/id_pm.c:// PML_GetEMSAddress() -16/wf3d8086/id_pm.c:PML_GetEMSAddress(int page,PMLockType lock) -16/wf3d8086/id_pm.c: PML_MapEMS(page / PMEMSSubPage,emspage); -16/wf3d8086/id_pm.c: Quit("PML_GetEMSAddress: EMS find failed"); -16/wf3d8086/id_pm.c:PML_GetEMSAddress(int page,PMLockType lock) -16/wf3d8086/id_pm.c: PML_MapEMS(page / PMEMSSubPage,emspage); -16/wf3d8086/id_pm.c: return(PML_GetEMSAddress(page->emsPage,page->locked)); -16/wf3d8086/id_pm.c:// PML_GiveLRUPage() - Returns the page # of the least recently used -16/wf3d8086/id_pm.c:PML_GiveLRUPage(boolean mainonly) -16/wf3d8086/id_pm.c: Quit("PML_GiveLRUPage: LRU Search failed"); -16/wf3d8086/id_pm.c:// PML_GiveLRUXMSPage() - Returns the page # of the least recently used -16/wf3d8086/id_pm.c:PML_GiveLRUXMSPage(void) -16/wf3d8086/id_pm.c:// PML_PutPageInXMS() - If page isn't in XMS, find LRU XMS page and replace -16/wf3d8086/id_pm.c:PML_PutPageInXMS(int pagenum) -16/wf3d8086/id_pm.c: usexms = PML_GiveLRUXMSPage(); -16/wf3d8086/id_pm.c: Quit("PML_PutPageInXMS: No XMS LRU"); -16/wf3d8086/id_pm.c: PML_CopyToXMS(PM_GetPageAddress(pagenum),page->xmsPage,page->length); -16/wf3d8086/id_pm.c:// PML_TransferPageSpace() - A page is being replaced, so give the new page -16/wf3d8086/id_pm.c:PML_TransferPageSpace(int orig,int new) -16/wf3d8086/id_pm.c: Quit("PML_TransferPageSpace: Identity replacement"); -16/wf3d8086/id_pm.c: Quit("PML_TransferPageSpace: Killing locked page"); -16/wf3d8086/id_pm.c: Quit("PML_TransferPageSpace: Reusing non-existent page"); -16/wf3d8086/id_pm.c: PML_PutPageInXMS(orig); -16/wf3d8086/id_pm.c: Quit("PML_TransferPageSpace: Zero replacement"); -16/wf3d8086/id_pm.c:// PML_GetAPageBuffer() - A page buffer is needed. Either get it from the -16/wf3d8086/id_pm.c:// main/EMS free pool, or use PML_GiveLRUPage() to find which page to -16/wf3d8086/id_pm.c:// will be looked at by PML_GiveLRUPage(). -16/wf3d8086/id_pm.c:PML_GetAPageBuffer(int pagenum,boolean mainonly) -16/wf3d8086/id_pm.c: addr = PML_GetEMSAddress(page->emsPage,page->locked); -16/wf3d8086/id_pm.c: Quit("PML_GetPageBuffer: MainPagesAvail lied"); -16/wf3d8086/id_pm.c: Quit("PML_GetPageBuffer: Purged main block"); -16/wf3d8086/id_pm.c: addr = PML_TransferPageSpace(PML_GiveLRUPage(mainonly),pagenum); -16/wf3d8086/id_pm.c: Quit("PML_GetPageBuffer: Search failed"); -16/wf3d8086/id_pm.c:// PML_GetPageFromXMS() - If page is in XMS, find LRU main/EMS page and -16/wf3d8086/id_pm.c:PML_GetPageFromXMS(int pagenum,boolean mainonly) -16/wf3d8086/id_pm.c: checkaddr = PML_GetAPageBuffer(pagenum,mainonly); -16/wf3d8086/id_pm.c: Quit("PML_GetPageFromXMS: Non segment pointer"); -16/wf3d8086/id_pm.c: PML_CopyFromXMS(addr,page->xmsPage,page->length); -16/wf3d8086/id_pm.c:// PML_LoadPage() - A page is not in main/EMS memory, and it's not in XMS. -16/wf3d8086/id_pm.c:PML_LoadPage(int pagenum,boolean mainonly) -16/wf3d8086/id_pm.c: addr = PML_GetAPageBuffer(pagenum,mainonly); -16/wf3d8086/id_pm.c: PML_ReadFromFile(addr,page->offset,page->length); -16/wf3d8086/id_pm.c: if (!(result = PML_GetPageFromXMS(pagenum,mainonly))) -16/wf3d8086/id_pm.c: PML_LoadPage(pagenum,mainonly); -16/wf3d8086/id_pm.c: PML_ReadFromFile((byte far *)addr,p->offset,p->length); -16/wf3d8086/id_pm.c: PML_CopyToXMS((byte far *)addr,p->xmsPage,p->length); -16/wf3d8086/id_pm.c: PML_ReadFromFile((byte far *)addr,p->offset,p->length); -16/wf3d8086/id_pm.c: PML_OpenPageFile(); -16/wf3d8086/id_pm.c: PML_StartupEMS(); -16/wf3d8086/id_pm.c: PML_StartupXMS(); -16/wf3d8086/id_pm.c: PML_StartupMainMem(); -16/wf3d8086/id_pm.c: PML_ShutdownXMS(); -16/wf3d8086/id_pm.c: PML_ShutdownEMS(); -16/wf3d8086/id_pm.c: PML_ClosePageFile(); -16/wf3d8086/id_pm.c: PML_ShutdownMainMem(); -Binary file 16/wf3d8086/obj/wolf3d.exe matches -16/wf3d8086/obj/wolf3d.map: 1A26:06F7 idle _PML_ClosePageFile -16/wf3d8086/obj/wolf3d.map: 1A26:0AFB idle _PML_GetAPageBuffer -16/wf3d8086/obj/wolf3d.map: 1A26:0731 idle _PML_GetEMSAddress -16/wf3d8086/obj/wolf3d.map: 1A26:0C08 idle _PML_GetPageFromXMS -16/wf3d8086/obj/wolf3d.map: 1A26:0866 idle _PML_GiveLRUPage -16/wf3d8086/obj/wolf3d.map: 1A26:0907 idle _PML_GiveLRUXMSPage -16/wf3d8086/obj/wolf3d.map: 1A26:0C8C idle _PML_LoadPage -16/wf3d8086/obj/wolf3d.map: 1A26:0008 idle _PML_MapEMS -16/wf3d8086/obj/wolf3d.map: 1A26:0510 idle _PML_OpenPageFile -16/wf3d8086/obj/wolf3d.map: 1A26:0979 idle _PML_PutPageInXMS -16/wf3d8086/obj/wolf3d.map: 1A26:0490 idle _PML_ReadFromFile -16/wf3d8086/obj/wolf3d.map: 1A26:0160 idle _PML_ShutdownEMS -16/wf3d8086/obj/wolf3d.map: 1A26:0469 idle _PML_ShutdownMainMem -16/wf3d8086/obj/wolf3d.map: 1A26:02A4 idle _PML_ShutdownXMS -16/wf3d8086/obj/wolf3d.map: 1A26:002B idle _PML_StartupEMS -16/wf3d8086/obj/wolf3d.map: 1A26:03EC idle _PML_StartupMainMem -16/wf3d8086/obj/wolf3d.map: 1A26:0184 idle _PML_StartupXMS -16/wf3d8086/obj/wolf3d.map: 1A26:0A28 idle _PML_TransferPageSpace -16/wf3d8086/obj/wolf3d.map: 1A26:01F7 idle _PML_XMSCopy -16/wf3d8086/obj/wolf3d.map: 1A26:0008 idle _PML_MapEMS -16/wf3d8086/obj/wolf3d.map: 1A26:002B idle _PML_StartupEMS -16/wf3d8086/obj/wolf3d.map: 1A26:0160 idle _PML_ShutdownEMS -16/wf3d8086/obj/wolf3d.map: 1A26:0184 idle _PML_StartupXMS -16/wf3d8086/obj/wolf3d.map: 1A26:01F7 idle _PML_XMSCopy -16/wf3d8086/obj/wolf3d.map: 1A26:02A4 idle _PML_ShutdownXMS -16/wf3d8086/obj/wolf3d.map: 1A26:03EC idle _PML_StartupMainMem -16/wf3d8086/obj/wolf3d.map: 1A26:0469 idle _PML_ShutdownMainMem -16/wf3d8086/obj/wolf3d.map: 1A26:0490 idle _PML_ReadFromFile -16/wf3d8086/obj/wolf3d.map: 1A26:0510 idle _PML_OpenPageFile -16/wf3d8086/obj/wolf3d.map: 1A26:06F7 idle _PML_ClosePageFile -16/wf3d8086/obj/wolf3d.map: 1A26:0731 idle _PML_GetEMSAddress -16/wf3d8086/obj/wolf3d.map: 1A26:0866 idle _PML_GiveLRUPage -16/wf3d8086/obj/wolf3d.map: 1A26:0907 idle _PML_GiveLRUXMSPage -16/wf3d8086/obj/wolf3d.map: 1A26:0979 idle _PML_PutPageInXMS -16/wf3d8086/obj/wolf3d.map: 1A26:0A28 idle _PML_TransferPageSpace -16/wf3d8086/obj/wolf3d.map: 1A26:0AFB idle _PML_GetAPageBuffer -16/wf3d8086/obj/wolf3d.map: 1A26:0C08 idle _PML_GetPageFromXMS -16/wf3d8086/obj/wolf3d.map: 1A26:0C8C idle _PML_LoadPage -16/wf3d8086/wolf3d.map: 1912:06B1 idle _PML_ClosePageFile -16/wf3d8086/wolf3d.map: 1912:0A96 idle _PML_GetAPageBuffer -16/wf3d8086/wolf3d.map: 1912:06E8 idle _PML_GetEMSAddress -16/wf3d8086/wolf3d.map: 1912:0BA0 idle _PML_GetPageFromXMS -16/wf3d8086/wolf3d.map: 1912:0812 idle _PML_GiveLRUPage -16/wf3d8086/wolf3d.map: 1912:08B0 idle _PML_GiveLRUXMSPage -16/wf3d8086/wolf3d.map: 1912:0C21 idle _PML_LoadPage -16/wf3d8086/wolf3d.map: 1912:0007 idle _PML_MapEMS -16/wf3d8086/wolf3d.map: 1912:04E8 idle _PML_OpenPageFile -16/wf3d8086/wolf3d.map: 1912:0920 idle _PML_PutPageInXMS -16/wf3d8086/wolf3d.map: 1912:046E idle _PML_ReadFromFile -16/wf3d8086/wolf3d.map: 1912:0155 idle _PML_ShutdownEMS -16/wf3d8086/wolf3d.map: 1912:0447 idle _PML_ShutdownMainMem -16/wf3d8086/wolf3d.map: 1912:0293 idle _PML_ShutdownXMS -16/wf3d8086/wolf3d.map: 1912:0029 idle _PML_StartupEMS -16/wf3d8086/wolf3d.map: 1912:03D0 idle _PML_StartupMainMem -16/wf3d8086/wolf3d.map: 1912:0178 idle _PML_StartupXMS -16/wf3d8086/wolf3d.map: 1912:09C9 idle _PML_TransferPageSpace -16/wf3d8086/wolf3d.map: 1912:01EA idle _PML_XMSCopy -16/wf3d8086/wolf3d.map: 1912:0007 idle _PML_MapEMS -16/wf3d8086/wolf3d.map: 1912:0029 idle _PML_StartupEMS -16/wf3d8086/wolf3d.map: 1912:0155 idle _PML_ShutdownEMS -16/wf3d8086/wolf3d.map: 1912:0178 idle _PML_StartupXMS -16/wf3d8086/wolf3d.map: 1912:01EA idle _PML_XMSCopy -16/wf3d8086/wolf3d.map: 1912:0293 idle _PML_ShutdownXMS -16/wf3d8086/wolf3d.map: 1912:03D0 idle _PML_StartupMainMem -16/wf3d8086/wolf3d.map: 1912:0447 idle _PML_ShutdownMainMem -16/wf3d8086/wolf3d.map: 1912:046E idle _PML_ReadFromFile -16/wf3d8086/wolf3d.map: 1912:04E8 idle _PML_OpenPageFile -16/wf3d8086/wolf3d.map: 1912:06B1 idle _PML_ClosePageFile -16/wf3d8086/wolf3d.map: 1912:06E8 idle _PML_GetEMSAddress -16/wf3d8086/wolf3d.map: 1912:0812 idle _PML_GiveLRUPage -16/wf3d8086/wolf3d.map: 1912:08B0 idle _PML_GiveLRUXMSPage -16/wf3d8086/wolf3d.map: 1912:0920 idle _PML_PutPageInXMS -16/wf3d8086/wolf3d.map: 1912:09C9 idle _PML_TransferPageSpace -16/wf3d8086/wolf3d.map: 1912:0A96 idle _PML_GetAPageBuffer -16/wf3d8086/wolf3d.map: 1912:0BA0 idle _PML_GetPageFromXMS -16/wf3d8086/wolf3d.map: 1912:0C21 idle _PML_LoadPage -16/wolf3d/WOLFSRC/ID_PM.C:// PML_MapEMS() - Maps a logical page to a physical page -16/wolf3d/WOLFSRC/ID_PM.C:PML_MapEMS(word logical,word physical) -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_MapEMS: Page mapping failed"); -16/wolf3d/WOLFSRC/ID_PM.C:// PML_StartupEMS() - Sets up EMS for Page Mgr's use -16/wolf3d/WOLFSRC/ID_PM.C:PML_StartupEMS(void) -16/wolf3d/WOLFSRC/ID_PM.C:// PML_ShutdownEMS() - If EMS was used, deallocate it -16/wolf3d/WOLFSRC/ID_PM.C:PML_ShutdownEMS(void) -16/wolf3d/WOLFSRC/ID_PM.C: Quit ("PML_ShutdownEMS: Error freeing EMS"); -16/wolf3d/WOLFSRC/ID_PM.C:// PML_StartupXMS() - Starts up XMS for the Page Mgr's use -16/wolf3d/WOLFSRC/ID_PM.C:PML_StartupXMS(void) -16/wolf3d/WOLFSRC/ID_PM.C:// PML_XMSCopy() - Copies a main/EMS page to or from XMS -16/wolf3d/WOLFSRC/ID_PM.C:PML_XMSCopy(boolean toxms,byte far *addr,word xmspage,word length) -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_XMSCopy: zero address"); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_XMSCopy: Error on copy"); -16/wolf3d/WOLFSRC/ID_PM.C:#define PML_CopyToXMS(s,t,l) PML_XMSCopy(true,(s),(t),(l)) -16/wolf3d/WOLFSRC/ID_PM.C:#define PML_CopyFromXMS(t,s,l) PML_XMSCopy(false,(t),(s),(l)) -16/wolf3d/WOLFSRC/ID_PM.C:// PML_CopyToXMS() - Copies the specified number of bytes from the real mode -16/wolf3d/WOLFSRC/ID_PM.C:PML_CopyToXMS(byte far *source,int targetpage,word length) -16/wolf3d/WOLFSRC/ID_PM.C: PML_XMSCopy(true,source,targetpage,length); -16/wolf3d/WOLFSRC/ID_PM.C:// PML_CopyFromXMS() - Copies the specified number of bytes from an XMS -16/wolf3d/WOLFSRC/ID_PM.C:PML_CopyFromXMS(byte far *target,int sourcepage,word length) -16/wolf3d/WOLFSRC/ID_PM.C: PML_XMSCopy(false,target,sourcepage,length); -16/wolf3d/WOLFSRC/ID_PM.C:// PML_ShutdownXMS() -16/wolf3d/WOLFSRC/ID_PM.C:PML_ShutdownXMS(void) -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_ShutdownXMS: Error freeing XMS"); -16/wolf3d/WOLFSRC/ID_PM.C:// PML_StartupMainMem() - Allocates as much main memory as is possible for -16/wolf3d/WOLFSRC/ID_PM.C:PML_StartupMainMem(void) -16/wolf3d/WOLFSRC/ID_PM.C:// PML_ShutdownMainMem() - Frees all of the main memory blocks used by the -16/wolf3d/WOLFSRC/ID_PM.C:PML_ShutdownMainMem(void) -16/wolf3d/WOLFSRC/ID_PM.C:// PML_ReadFromFile() - Reads some data in from the page file -16/wolf3d/WOLFSRC/ID_PM.C:PML_ReadFromFile(byte far *buf,long offset,word length) -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_ReadFromFile: Null pointer"); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_ReadFromFile: Zero offset"); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_ReadFromFile: Seek failed"); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_ReadFromFile: Read failed"); -16/wolf3d/WOLFSRC/ID_PM.C:// PML_OpenPageFile() - Opens the page file and sets up the page info -16/wolf3d/WOLFSRC/ID_PM.C:PML_OpenPageFile(void) -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_OpenPageFile: Unable to open page file"); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_OpenPageFile: Offset read failed"); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_OpenPageFile: Length read failed"); -16/wolf3d/WOLFSRC/ID_PM.C:// PML_ClosePageFile() - Closes the page file -16/wolf3d/WOLFSRC/ID_PM.C:PML_ClosePageFile(void) -16/wolf3d/WOLFSRC/ID_PM.C:// PML_GetEMSAddress() -16/wolf3d/WOLFSRC/ID_PM.C:PML_GetEMSAddress(int page,PMLockType lock) -16/wolf3d/WOLFSRC/ID_PM.C: PML_MapEMS(page / PMEMSSubPage,emspage); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_GetEMSAddress: EMS find failed"); -16/wolf3d/WOLFSRC/ID_PM.C:PML_GetEMSAddress(int page,PMLockType lock) -16/wolf3d/WOLFSRC/ID_PM.C: PML_MapEMS(page / PMEMSSubPage,emspage); -16/wolf3d/WOLFSRC/ID_PM.C: return(PML_GetEMSAddress(page->emsPage,page->locked)); -16/wolf3d/WOLFSRC/ID_PM.C:// PML_GiveLRUPage() - Returns the page # of the least recently used -16/wolf3d/WOLFSRC/ID_PM.C:PML_GiveLRUPage(boolean mainonly) -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_GiveLRUPage: LRU Search failed"); -16/wolf3d/WOLFSRC/ID_PM.C:// PML_GiveLRUXMSPage() - Returns the page # of the least recently used -16/wolf3d/WOLFSRC/ID_PM.C:PML_GiveLRUXMSPage(void) -16/wolf3d/WOLFSRC/ID_PM.C:// PML_PutPageInXMS() - If page isn't in XMS, find LRU XMS page and replace -16/wolf3d/WOLFSRC/ID_PM.C:PML_PutPageInXMS(int pagenum) -16/wolf3d/WOLFSRC/ID_PM.C: usexms = PML_GiveLRUXMSPage(); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_PutPageInXMS: No XMS LRU"); -16/wolf3d/WOLFSRC/ID_PM.C: PML_CopyToXMS(PM_GetPageAddress(pagenum),page->xmsPage,page->length); -16/wolf3d/WOLFSRC/ID_PM.C:// PML_TransferPageSpace() - A page is being replaced, so give the new page -16/wolf3d/WOLFSRC/ID_PM.C:PML_TransferPageSpace(int orig,int new) -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_TransferPageSpace: Identity replacement"); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_TransferPageSpace: Killing locked page"); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_TransferPageSpace: Reusing non-existent page"); -16/wolf3d/WOLFSRC/ID_PM.C: PML_PutPageInXMS(orig); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_TransferPageSpace: Zero replacement"); -16/wolf3d/WOLFSRC/ID_PM.C:// PML_GetAPageBuffer() - A page buffer is needed. Either get it from the -16/wolf3d/WOLFSRC/ID_PM.C:// main/EMS free pool, or use PML_GiveLRUPage() to find which page to -16/wolf3d/WOLFSRC/ID_PM.C:// will be looked at by PML_GiveLRUPage(). -16/wolf3d/WOLFSRC/ID_PM.C:PML_GetAPageBuffer(int pagenum,boolean mainonly) -16/wolf3d/WOLFSRC/ID_PM.C: addr = PML_GetEMSAddress(page->emsPage,page->locked); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_GetPageBuffer: MainPagesAvail lied"); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_GetPageBuffer: Purged main block"); -16/wolf3d/WOLFSRC/ID_PM.C: addr = PML_TransferPageSpace(PML_GiveLRUPage(mainonly),pagenum); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_GetPageBuffer: Search failed"); -16/wolf3d/WOLFSRC/ID_PM.C:// PML_GetPageFromXMS() - If page is in XMS, find LRU main/EMS page and -16/wolf3d/WOLFSRC/ID_PM.C:PML_GetPageFromXMS(int pagenum,boolean mainonly) -16/wolf3d/WOLFSRC/ID_PM.C: checkaddr = PML_GetAPageBuffer(pagenum,mainonly); -16/wolf3d/WOLFSRC/ID_PM.C: Quit("PML_GetPageFromXMS: Non segment pointer"); -16/wolf3d/WOLFSRC/ID_PM.C: PML_CopyFromXMS(addr,page->xmsPage,page->length); -16/wolf3d/WOLFSRC/ID_PM.C:// PML_LoadPage() - A page is not in main/EMS memory, and it's not in XMS. -16/wolf3d/WOLFSRC/ID_PM.C:PML_LoadPage(int pagenum,boolean mainonly) -16/wolf3d/WOLFSRC/ID_PM.C: addr = PML_GetAPageBuffer(pagenum,mainonly); -16/wolf3d/WOLFSRC/ID_PM.C: PML_ReadFromFile(addr,page->offset,page->length); -16/wolf3d/WOLFSRC/ID_PM.C: if (!(result = PML_GetPageFromXMS(pagenum,mainonly))) -16/wolf3d/WOLFSRC/ID_PM.C: PML_LoadPage(pagenum,mainonly); -16/wolf3d/WOLFSRC/ID_PM.C: PML_ReadFromFile((byte far *)addr,p->offset,p->length); -16/wolf3d/WOLFSRC/ID_PM.C: PML_CopyToXMS((byte far *)addr,p->xmsPage,p->length); -16/wolf3d/WOLFSRC/ID_PM.C: PML_ReadFromFile((byte far *)addr,p->offset,p->length); -16/wolf3d/WOLFSRC/ID_PM.C: PML_OpenPageFile(); -16/wolf3d/WOLFSRC/ID_PM.C: PML_StartupEMS(); -16/wolf3d/WOLFSRC/ID_PM.C: PML_StartupXMS(); -16/wolf3d/WOLFSRC/ID_PM.C: PML_StartupMainMem(); -16/wolf3d/WOLFSRC/ID_PM.C: PML_ShutdownXMS(); -16/wolf3d/WOLFSRC/ID_PM.C: PML_ShutdownEMS(); -16/wolf3d/WOLFSRC/ID_PM.C: PML_ClosePageFile(); -16/wolf3d/WOLFSRC/ID_PM.C: PML_ShutdownMainMem(); -Binary file 16/wolf3d/WOLFSRC/WOLF3D.EXE matches -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:06B1 idle _PML_ClosePageFile -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0A96 idle _PML_GetAPageBuffer -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:06E8 idle _PML_GetEMSAddress -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0BA0 idle _PML_GetPageFromXMS -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0812 idle _PML_GiveLRUPage -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:08B0 idle _PML_GiveLRUXMSPage -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0C21 idle _PML_LoadPage -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0007 idle _PML_MapEMS -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:04E8 idle _PML_OpenPageFile -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0920 idle _PML_PutPageInXMS -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:046E idle _PML_ReadFromFile -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0155 idle _PML_ShutdownEMS -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0447 idle _PML_ShutdownMainMem -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0293 idle _PML_ShutdownXMS -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0029 idle _PML_StartupEMS -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:03D0 idle _PML_StartupMainMem -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0178 idle _PML_StartupXMS -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:09C9 idle _PML_TransferPageSpace -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:01EA idle _PML_XMSCopy -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0007 idle _PML_MapEMS -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0029 idle _PML_StartupEMS -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0155 idle _PML_ShutdownEMS -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0178 idle _PML_StartupXMS -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:01EA idle _PML_XMSCopy -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0293 idle _PML_ShutdownXMS -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:03D0 idle _PML_StartupMainMem -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0447 idle _PML_ShutdownMainMem -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:046E idle _PML_ReadFromFile -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:04E8 idle _PML_OpenPageFile -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:06B1 idle _PML_ClosePageFile -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:06E8 idle _PML_GetEMSAddress -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0812 idle _PML_GiveLRUPage -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:08B0 idle _PML_GiveLRUXMSPage -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0920 idle _PML_PutPageInXMS -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:09C9 idle _PML_TransferPageSpace -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0A96 idle _PML_GetAPageBuffer -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0BA0 idle _PML_GetPageFromXMS -16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0C21 idle _PML_LoadPage +16/wolf3d/WOLFSRC/CONTIGSC.C: shape = PM_GetSpritePage (shapenum); +16/wolf3d/WOLFSRC/CONTIGSC.C: shape = PM_GetSpritePage (shapenum); +16/wolf3d/WOLFSRC/ID_PM.C:// PM_SetMainMemPurge() - Sets the purge level for all allocated main memory +16/wolf3d/WOLFSRC/ID_PM.C:// blocks. This shouldn't be called directly - the PM_LockMainMem() and +16/wolf3d/WOLFSRC/ID_PM.C:// PM_UnlockMainMem() macros should be used instead. +16/wolf3d/WOLFSRC/ID_PM.C:PM_SetMainMemPurge(int level) +16/wolf3d/WOLFSRC/ID_PM.C:// PM_CheckMainMem() - If something besides the Page Mgr makes requests of +16/wolf3d/WOLFSRC/ID_PM.C:// This routine now calls PM_LockMainMem() to make sure that any allocation +16/wolf3d/WOLFSRC/ID_PM.C:// of the other blocks. Because PM_LockMainMem() is called, +16/wolf3d/WOLFSRC/ID_PM.C:// PM_UnlockMainMem() needs to be called before any other part of the +16/wolf3d/WOLFSRC/ID_PM.C:PM_CheckMainMem(void) +16/wolf3d/WOLFSRC/ID_PM.C: PM_LockMainMem(); +16/wolf3d/WOLFSRC/ID_PM.C:// necessary to make requests of the Memory Mgr, PM_UnlockMainMem() +16/wolf3d/WOLFSRC/ID_PM.C: Quit("PM_SetupMainMem: Not enough main memory"); +16/wolf3d/WOLFSRC/ID_PM.C:// PM_GetPageAddress() - Returns the address of a given page +16/wolf3d/WOLFSRC/ID_PM.C:PM_GetPageAddress(int pagenum) +16/wolf3d/WOLFSRC/ID_PM.C: PML_CopyToXMS(PM_GetPageAddress(pagenum),page->xmsPage,page->length); +16/wolf3d/WOLFSRC/ID_PM.C: addr = PM_GetPageAddress(orig); +16/wolf3d/WOLFSRC/ID_PM.C:// PM_GetPage() - Returns the address of the page, loading it if necessary +16/wolf3d/WOLFSRC/ID_PM.C:PM_GetPage(int pagenum) +16/wolf3d/WOLFSRC/ID_PM.C: Quit("PM_GetPage: Invalid page request"); +16/wolf3d/WOLFSRC/ID_PM.C: if (!(result = PM_GetPageAddress(pagenum))) +16/wolf3d/WOLFSRC/ID_PM.C: result = PM_GetPageAddress(pagenum); +16/wolf3d/WOLFSRC/ID_PM.C:// PM_SetPageLock() - Sets the lock type on a given page +16/wolf3d/WOLFSRC/ID_PM.C:PM_SetPageLock(int pagenum,PMLockType lock) +16/wolf3d/WOLFSRC/ID_PM.C: Quit("PM_SetPageLock: Locking/unlocking non-sound page"); +16/wolf3d/WOLFSRC/ID_PM.C:// PM_Preload() - Loads as many pages as possible into all types of memory. +16/wolf3d/WOLFSRC/ID_PM.C:PM_Preload(boolean (*update)(word current,word total)) +16/wolf3d/WOLFSRC/ID_PM.C: Quit ("PM_Preload: Pages>=ChunksInFile"); +16/wolf3d/WOLFSRC/ID_PM.C: PM_GetPage(page); +16/wolf3d/WOLFSRC/ID_PM.C: addr = PM_GetPage(oogypage); +16/wolf3d/WOLFSRC/ID_PM.C: Quit("PM_Preload: XMS buffer failed"); +16/wolf3d/WOLFSRC/ID_PM.C: Quit ("PM_Preload: Pages>=ChunksInFile"); +16/wolf3d/WOLFSRC/ID_PM.C: Quit("PM_Preload: Exceeded XMS pages"); +16/wolf3d/WOLFSRC/ID_PM.C: Quit("PM_Preload: Page too long"); +16/wolf3d/WOLFSRC/ID_PM.C:// PM_NextFrame() - Increments the frame counter and adjusts the thrash +16/wolf3d/WOLFSRC/ID_PM.C:PM_NextFrame(void) +16/wolf3d/WOLFSRC/ID_PM.C: sprintf(buf,"PM_NextFrame: Page %d is locked",i); +16/wolf3d/WOLFSRC/ID_PM.C:// PM_Reset() - Sets up caching structures +16/wolf3d/WOLFSRC/ID_PM.C:PM_Reset(void) +16/wolf3d/WOLFSRC/ID_PM.C:// PM_Startup() - Start up the Page Mgr +16/wolf3d/WOLFSRC/ID_PM.C:PM_Startup(void) +16/wolf3d/WOLFSRC/ID_PM.C: Quit("PM_Startup: No main or EMS"); +16/wolf3d/WOLFSRC/ID_PM.C: PM_Reset(); +16/wolf3d/WOLFSRC/ID_PM.C:// PM_Shutdown() - Shut down the Page Mgr +16/wolf3d/WOLFSRC/ID_PM.C:PM_Shutdown(void) +16/wolf3d/WOLFSRC/ID_PM.H:#define PM_GetSoundPage(v) PM_GetPage(PMSoundStart + (v)) +16/wolf3d/WOLFSRC/ID_PM.H:#define PM_GetSpritePage(v) PM_GetPage(PMSpriteStart + (v)) +16/wolf3d/WOLFSRC/ID_PM.H:#define PM_LockMainMem() PM_SetMainMemPurge(0) +16/wolf3d/WOLFSRC/ID_PM.H:#define PM_UnlockMainMem() PM_SetMainMemPurge(3) +16/wolf3d/WOLFSRC/ID_PM.H:extern void PM_Startup(void), +16/wolf3d/WOLFSRC/ID_PM.H: PM_Shutdown(void), +16/wolf3d/WOLFSRC/ID_PM.H: PM_Reset(void), +16/wolf3d/WOLFSRC/ID_PM.H: PM_Preload(boolean (*update)(word current,word total)), +16/wolf3d/WOLFSRC/ID_PM.H: PM_NextFrame(void), +16/wolf3d/WOLFSRC/ID_PM.H: PM_SetPageLock(int pagenum,PMLockType lock), +16/wolf3d/WOLFSRC/ID_PM.H: PM_SetMainPurge(int level), +16/wolf3d/WOLFSRC/ID_PM.H: PM_CheckMainMem(void); +16/wolf3d/WOLFSRC/ID_PM.H:extern memptr PM_GetPageAddress(int pagenum), +16/wolf3d/WOLFSRC/ID_PM.H: PM_GetPage(int pagenum); // Use this one to cache page +16/wolf3d/WOLFSRC/ID_PM.H:void PM_SetMainMemPurge(int level); +16/wolf3d/WOLFSRC/ID_SD.C: addr = PM_GetSoundPage(page); +16/wolf3d/WOLFSRC/ID_SD.C: PM_SetPageLock(PMSoundStart + page,pml_Locked); +16/wolf3d/WOLFSRC/ID_SD.C: PM_SetPageLock(i + PMSoundStart,pml_Unlocked); +16/wolf3d/WOLFSRC/ID_SD.C: PM_UnlockMainMem(); +16/wolf3d/WOLFSRC/ID_SD.C: PM_CheckMainMem(); +16/wolf3d/WOLFSRC/ID_SD.C: p = (word far *)MK_FP(PM_GetPage(ChunksInFile - 1),0); +16/wolf3d/WOLFSRC/ID_SD.C: PM_UnlockMainMem(); +16/wolf3d/WOLFSRC/OLDSCALE.C: shape = PM_GetSpritePage (shapenum); +16/wolf3d/WOLFSRC/OLDSCALE.C: shape = PM_GetSpritePage (shapenum); +16/wolf3d/WOLFSRC/WL_ACT2.C: PM_UnlockMainMem (); +16/wolf3d/WOLFSRC/WL_ACT2.C: PM_CheckMainMem (); +16/wolf3d/WOLFSRC/WL_DEBUG.C: addr = PM_GetPageAddress(i); +16/wolf3d/WOLFSRC/WL_DEBUG.C: PM_GetPage(j); +16/wolf3d/WOLFSRC/WL_DEBUG.C: PM_GetPage(i); +16/wolf3d/WOLFSRC/WL_DRAW.C: *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic); +16/wolf3d/WOLFSRC/WL_DRAW.C: *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic); +16/wolf3d/WOLFSRC/WL_DRAW.C: *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(doorpage); +16/wolf3d/WOLFSRC/WL_DRAW.C: *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(doorpage+1); +16/wolf3d/WOLFSRC/WL_DRAW.C: *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic); +16/wolf3d/WOLFSRC/WL_DRAW.C: *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic); +16/wolf3d/WOLFSRC/WL_DRAW.C: PM_NextFrame(); +16/wolf3d/WOLFSRC/WL_GAME.C: PM_UnlockMainMem(); +16/wolf3d/WOLFSRC/WL_GAME.C: PM_CheckMainMem (); +16/wolf3d/WOLFSRC/WL_GAME.C: PM_CheckMainMem (); +16/wolf3d/WOLFSRC/WL_GAME.C: PM_CheckMainMem (); +16/wolf3d/WOLFSRC/WL_GAME.C: PM_CheckMainMem (); +16/wolf3d/WOLFSRC/WL_INTER.C: PM_Preload (PreloadUpdate); +16/wolf3d/WOLFSRC/WL_MAIN.C: PM_Shutdown (); +16/wolf3d/WOLFSRC/WL_MAIN.C: PM_Startup (); +16/wolf3d/WOLFSRC/WL_MAIN.C: PM_UnlockMainMem (); +16/wolf3d/WOLFSRC/WL_MENU.C: PM_CheckMainMem (); +16/wolf3d/WOLFSRC/WL_MENU.C: PM_CheckMainMem (); +16/wolf3d/WOLFSRC/WL_PLAY.C: PM_CheckMainMem (); +16/wolf3d/WOLFSRC/WL_PLAY.C: PM_CheckMainMem (); +16/wolf3d/WOLFSRC/WL_PLAY.C: PM_CheckMainMem (); +16/wolf3d/WOLFSRC/WL_PLAY.C: PM_CheckMainMem (); +16/wolf3d/WOLFSRC/WL_PLAY.C: PM_CheckMainMem (); +16/wolf3d/WOLFSRC/WL_SCALE.C: shape = PM_GetSpritePage (shapenum); +16/wolf3d/WOLFSRC/WL_SCALE.C: shape = PM_GetSpritePage (shapenum); +Binary file 16/wolf3d/WOLFSRC/WOLF3D.EXE matches +16/wolf3d/WOLFSRC/WOLF3D.MAP: 19127H 1A286H 01160H ID_PM_TEXT CODE +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0007 1160 C=CODE S=ID_PM_TEXT G=(none) M=ID_PM.C ACBP=28 +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:02DF _PM_CheckMainMem +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0C71 _PM_GetPage +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:07BF _PM_GetPageAddress +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0FBA _PM_NextFrame +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0D60 _PM_Preload +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:1034 idle _PM_Reset +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:02B8 _PM_SetMainMemPurge +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0D31 _PM_SetPageLock +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:114B _PM_Shutdown +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:10A0 _PM_Startup +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:02B8 _PM_SetMainMemPurge +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:02DF _PM_CheckMainMem +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:07BF _PM_GetPageAddress +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0C71 _PM_GetPage +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0D31 _PM_SetPageLock +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0D60 _PM_Preload +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:0FBA _PM_NextFrame +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:1034 idle _PM_Reset +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:10A0 _PM_Startup +16/wolf3d/WOLFSRC/WOLF3D.MAP: 1912:114B _PM_Shutdown +16/wolf3d/WOLFSRC/WOLFHACK.C: src = PM_GetPage(0); +16/wolf3d/WOLFSRC/WOLFHACK.C: src = PM_GetPage(1); diff --git a/src/exmmtest.c b/src/exmmtest.c index 02fafeb6..06835abf 100755 --- a/src/exmmtest.c +++ b/src/exmmtest.c @@ -133,7 +133,7 @@ for(w=0;w<2;w++) getch(); MM_ShowMemory(&gvar, &gvar.mm); MM_DumpData(&gvar.mm); - MM_Report(&gvar); + MM_Report_(&gvar); if(baka) printf("\nyay!\n"); else printf("\npoo!\n"); printf("press any key to continue!\n"); diff --git a/src/lib/16_head.c b/src/lib/16_head.c index 027693d5..69f69db2 100755 --- a/src/lib/16_head.c +++ b/src/lib/16_head.c @@ -95,6 +95,8 @@ US_CheckParm(char *parm,char **strings) return(-1); } +//=========================================================================== + /* ========================== = @@ -103,60 +105,58 @@ US_CheckParm(char *parm,char **strings) ========================== */ -/*void Quit(char *error, ...) +void Quit (char *error) { - short exit_code=0; - unsigned finscreen; - - va_list ap; - - va_start(ap,error); + unsigned finscreen; + memptr screen; + union REGS in, out; -#ifndef CATALOG - if (!error) + //ClearMemory (); + if (!*error) + { + //WriteConfig (); + } + else { - CA_SetAllPurge (); - CA_CacheGrChunk (PIRACY); - finscreen = (unsigned)grsegs[PIRACY]; + //CA_CacheGrChunk (ERRORSCREEN); + //screen = grsegs[ERRORSCREEN]; } -#endif //ShutdownId (); + //IN_Shutdown(); + //modexLeave(); + in.h.ah = 0x00; + in.h.al = 0x3; + int86(0x10, &in, &out); if (error && *error) { - vprintf(error,ap); - exit_code = 1; + movedata ((unsigned)screen,7,0xb800,0,7*160); + //gotoxy (10,4); + puts(error); + //gotoxy (1,8); + exit(1); } -#ifndef CATALOG else - if (!NoWait) + if (!error || !(*error)) { - movedata (finscreen,0,0xb800,0,4000); - bioskey (0); + //clrscr(); + //#ifndef JAPAN + movedata ((unsigned)screen,7,0xb800,0,4000); + //gotoxy(1,24); + //#endif +//asm mov bh,0 +//asm mov dh,23 // row +//asm mov dl,0 // collumn +//asm mov ah,2 +//asm int 0x10 } -#endif - va_end(ap); + exit(0); +} -#ifndef CATALOG - if (!error) - { - _argc = 2; - _argv[1] = "LAST.SHL"; - _argv[2] = "ENDSCN.SCN"; - _argv[3] = NULL; - if (execv("LOADSCN.EXE", _argv) == -1) - { - clrscr(); - puts("Couldn't find executable LOADSCN.EXE.\n"); - exit(1); - } - } -#endif +//=========================================================================== - exit(exit_code); -}*/ byte dirchar(byte in) { diff --git a/src/lib/16_head.h b/src/lib/16_head.h index 74822da2..e804410f 100755 --- a/src/lib/16_head.h +++ b/src/lib/16_head.h @@ -176,6 +176,7 @@ void wait(clock_t wait); long int filesize(FILE *fp); void printmeminfoline(byte *strc, const byte *pee, size_t h_total, size_t h_used, size_t h_free); int US_CheckParm(char *parm,char **strings); +void Quit (char *error); byte dirchar(byte in); #endif/*_LIBHEAD_H_*/ diff --git a/src/lib/16_mm.c b/src/lib/16_mm.c index add7707e..a8a5a467 100755 --- a/src/lib/16_mm.c +++ b/src/lib/16_mm.c @@ -284,7 +284,8 @@ void MML_ShutdownEMS(mminfo_t *mm) #ifdef __WATCOMC__ } #endif - if(errorflag==true) printf("MML_ShutdownEMS: Error freeing EMS!\n"); //++++ add something + if(errorflag==true) + Quit("MML_ShutdownEMS: Error freeing EMS!\n"); //++++ add something } /* @@ -1123,8 +1124,8 @@ void MM_SetPurge(memptr *baseptr, int purge, mminfo_t *mm) mm->mmrover = mm->mmhead; else if(mm->mmrover == start) { - printf("MM_SetPurge: Block not found!"); - return; + Quit("MM_SetPurge: Block not found!"); + //return; } } while(1); @@ -1163,8 +1164,8 @@ void MM_SetLock(memptr *baseptr, boolean locked, mminfo_t *mm) mm->mmrover = mm->mmhead; else if(mm->mmrover == start) { - printf("MM_SetLock: Block not found!"); - return; + Quit("MM_SetLock: Block not found!"); + //return; } } while(1); @@ -1596,7 +1597,7 @@ dword MM_TotalFree(mminfo_t *mm) ===================== */ -void MM_Report(global_game_variables_t *gvar) +void MM_Report_(global_game_variables_t *gvar) { printf("========================================\n"); printf(" MM_Report\n"); diff --git a/src/lib/16_mm.h b/src/lib/16_mm.h index 3b1eac3d..6d4e8ec0 100755 --- a/src/lib/16_mm.h +++ b/src/lib/16_mm.h @@ -196,7 +196,7 @@ void MM_ShowMemory(global_game_variables_t *gvar,/*page_t *page, */mminfo_t *mm) void MM_DumpData(mminfo_t *mm); dword MM_UnusedMemory(mminfo_t *mm); dword MM_TotalFree(mminfo_t *mm); -void MM_Report(global_game_variables_t *gvar); +void MM_Report_(global_game_variables_t *gvar); static void MM_EMSerr(byte *stri, byte err); void MM_BombOnError(boolean bomb, mminfo_t *mm); //void MM_GetNewBlock(mminfo_t *mm); diff --git a/src/lib/16_pm.c b/src/lib/16_pm.c index bc9ba74c..7d112a9e 100755 --- a/src/lib/16_pm.c +++ b/src/lib/16_pm.c @@ -6,7 +6,7 @@ #include "src/lib/16_pm.h" #pragma hdrstop - +/* // Main Mem specific variables boolean MainPresent; memptr MainMemPages[PMMaxMainMem]; @@ -22,7 +22,7 @@ // XMS specific variables boolean XMSPresent; word XMSAvail,XMSPagesAvail,XMSHandle; - longword XMSDriver; + dword XMSDriver; int XMSProtectPage = -1; // File specific variables @@ -42,7 +42,7 @@ long PMFrameCount; PageListStruct far *PMPages, _seg *PMSegPages; - +*/ static char *ParmStrings[] = {"nomain","noems","noxms",nil}; ///////////////////////////////////////////////////////////////////////////// @@ -56,19 +56,22 @@ static char *ParmStrings[] = {"nomain","noems","noxms",nil}; // void PML_MapEMS(word logical,word physical) -{ +{ union REGS CPURegs; CPURegs.h.al = physical; CPURegs.x.bx = logical; CPURegs.x.dx = EMSHandle; CPURegs.h.ah = EMS_MAPPAGE; - __asm - { - int EMS_INT + __asm + { + int EMS_INT } if(CPURegs.h.ah) - printf("PML_MapEMS: Page mapping failed\n"); + { + Quit("PML_MapEMS: Page mapping failed\n"); + return; + } } // @@ -85,62 +88,63 @@ PML_MapEMS(word logical,word physical) boolean PML_StartupEMS(void) { + union REGS CPURegs; int i; long size; EMSPresent = false; // Assume that we'll fail EMSAvail = 0; - _DX = (word)EMMDriverName; - _AX = 0x3d00; + CPURegs.x.dx = (word)EMMDriverName; + CPURegs.x.ax = 0x3d00; geninterrupt(0x21); // try to open EMMXXXX0 device asm jnc gothandle goto error; gothandle: - _BX = _AX; - _AX = 0x4400; + CPURegs.x.bx = CPURegs.x.ax; + CPURegs.x.ax = 0x4400; geninterrupt(0x21); // get device info asm jnc gotinfo; goto error; gotinfo: asm and dx,0x80 - if (!_DX) + if (!CPURegs.x.dx) goto error; - _AX = 0x4407; + CPURegs.x.ax = 0x4407; geninterrupt(0x21); // get status asm jc error - if (!_AL) + if (!CPURegs.l.al) goto error; - _AH = 0x3e; + CPURegs.h.ah = 0x3e; geninterrupt(0x21); // close handle - _AH = EMS_STATUS; + CPURegs.h.ah = EMS_STATUS; geninterrupt(EMS_INT); - if (_AH) + if (CPURegs.h.ah) goto error; // make sure EMS hardware is present - _AH = EMS_VERSION; + CPURegs.h.ah = EMS_VERSION; geninterrupt(EMS_INT); - if (_AH || (_AL < 0x32)) // only work on EMS 3.2 or greater (silly, but...) + if (CPURegs.h.ah || (CPURegs.l.al < 0x32)) // only work on EMS 3.2 or greater (silly, but...) goto error; - _AH = EMS_GETFRAME; + CPURegs.h.ah = EMS_GETFRAME; geninterrupt(EMS_INT); - if (_AH) + if (CPURegs.h.ah) goto error; // find the page frame address - EMSPageFrame = _BX; + EMSPageFrame = CPURegs.x.bx; - _AH = EMS_GETPAGES; + CPURegs.h.ah = EMS_GETPAGES; geninterrupt(EMS_INT); - if (_AH) + if (CPURegs.h.ah) goto error; - if (_BX < 2) + if (CPURegs.x.bx < 2) goto error; // Require at least 2 pages (32k) - EMSAvail = _BX; + EMSAvail = CPURegs.x.bx; // Don't hog all available EMS size = EMSAvail * (long)EMSPageSize; @@ -150,12 +154,12 @@ asm jc error EMSAvail = size / EMSPageSize; } - _AH = EMS_ALLOCPAGES; - _BX = EMSAvail; + CPURegs.h.ah = EMSCPURegs.l.alLOCPAGES; + CPURegs.x.bx = EMSAvail; geninterrupt(EMS_INT); - if (_AH) + if (CPURegs.h.ah) goto error; - EMSHandle = _DX; + EMSHandle = CPURegs.x.dx; mminfo.EMSmem += EMSAvail * (long)EMSPageSize; @@ -177,11 +181,16 @@ PML_ShutdownEMS(void) { if (EMSPresent) { - asm mov ah,EMS_FREEPAGES - asm mov dx,[EMSHandle] - asm int EMS_INT - if (_AH) - printf("PML_ShutdownEMS: Error freeing EMS\n"); + __asm { + mov ah,EMS_FREEPAGES + mov dx,[EMSHandle] + int EMS_INT + } + if (CPURegs.h.ah) + { + Quit("PML_ShutdownEMS: Error freeing EMS\n"); + //return; + } } } @@ -205,7 +214,7 @@ PML_StartupXMS(void) asm mov ax,0x4300 asm int XMS_INT // Check for presence of XMS driver - if (_AL != 0x80) + if (CPURegs.l.al != 0x80) goto error; @@ -215,19 +224,19 @@ asm mov [WORD PTR XMSDriver],bx asm mov [WORD PTR XMSDriver+2],es // function pointer to XMS driver XMS_CALL(XMS_QUERYFREE); // Find out how much XMS is available - XMSAvail = _AX; - if (!_AX) // AJR: bugfix 10/8/92 + XMSAvail = CPURegs.x.ax; + if (!CPURegs.x.ax) // AJR: bugfix 10/8/92 goto error; XMSAvail &= ~(PMPageSizeKB - 1); // Round off to nearest page size if (XMSAvail < (PMPageSizeKB * 2)) // Need at least 2 pages goto error; - _DX = XMSAvail; - XMS_CALL(XMS_ALLOC); // And do the allocation - XMSHandle = _DX; + CPURegs.x.dx = XMSAvail; + XMS_CALL(XMSCPURegs.l.alLOC); // And do the allocation + XMSHandle = CPURegs.x.dx; - if (!_AX) // AJR: bugfix 10/8/92 + if (!CPURegs.x.ax) // AJR: bugfix 10/8/92 { XMSAvail = 0; goto error; @@ -250,17 +259,20 @@ PML_XMSCopy(boolean toxms,byte far *addr,word xmspage,word length) dword xoffset; struct { - longword length; + dword length; word source_handle; - longword source_offset; + dword source_offset; word target_handle; - longword target_offset; + dword target_offset; } copy; if (!addr) - printf("PML_XMSCopy: zero address\n"); + { + Quit("PML_XMSCopy: zero address\n"); + //return; + } - xoffset = (longword)xmspage * PMPageSize; + xoffset = (dword)xmspage * PMPageSize; copy.length = (length + 1) & ~1; copy.source_handle = toxms? 0 : XMSHandle; @@ -269,11 +281,14 @@ PML_XMSCopy(boolean toxms,byte far *addr,word xmspage,word length) copy.target_offset = toxms? xoffset : (long)addr; asm push si - _SI = (word)© + CPURegs.i.si = (word)© XMS_CALL(XMS_MOVE); asm pop si - if (!_AX) + if (!CPURegs.x.ax) + { Quit("PML_XMSCopy: Error on copy"); + //return; + } } #if 1 @@ -309,10 +324,13 @@ PML_ShutdownXMS(void) { if (XMSPresent) { - _DX = XMSHandle; + CPURegs.x.dx = XMSHandle; XMS_CALL(XMS_FREE); - if (_BL) + if (CPURegs.l.bl) + { Quit("PML_ShutdownXMS: Error freeing XMS"); + //return; + } } } @@ -440,7 +458,10 @@ PML_StartupMainMem(void) if (mmerror) mmerror = false; if (MainPagesAvail < PMMinMainMem) + { Quit("PM_SetupMainMem: Not enough main memory"); + //return; + } MainPresent = true; } @@ -473,13 +494,24 @@ void PML_ReadFromFile(byte far *buf,long offset,word length) { if (!buf) + { Quit("PML_ReadFromFile: Null pointer"); + //return; + } if (!offset) + { Quit("PML_ReadFromFile: Zero offset"); + //return; + } if (lseek(PageFile,offset,SEEK_SET) != offset) + { Quit("PML_ReadFromFile: Seek failed"); + //return; + } if (!CA_FarRead(PageFile,buf,length)) Quit("PML_ReadFromFile: Read failed"); + //return; + } } // @@ -490,14 +522,17 @@ PML_OpenPageFile(void) { int i; long size; - void _seg *buf; - longword far *offsetptr; + __SEGA *buf; + dword far *offsetptr; word far *lengthptr; PageListStruct far *page; PageFile = open(PageFileName,O_RDONLY + O_BINARY); if (PageFile == -1) + { Quit("PML_OpenPageFile: Unable to open page file"); + //return; + } // Read in header variables read(PageFile,&ChunksInFile,sizeof(ChunksInFile)); @@ -512,11 +547,14 @@ PML_OpenPageFile(void) _fmemset(PMPages,0,sizeof(PageListStruct) * PMNumBlocks); // Read in the chunk offsets - size = sizeof(longword) * ChunksInFile; + size = sizeof(dword) * ChunksInFile; MM_GetPtr(&buf,size); if (!CA_FarRead(PageFile,(byte far *)buf,size)) + { Quit("PML_OpenPageFile: Offset read failed"); - offsetptr = (longword far *)buf; + //return; + } + offsetptr = (dword far *)buf; for (i = 0,page = PMPages;i < ChunksInFile;i++,page++) page->offset = *offsetptr++; MM_FreePtr(&buf); @@ -525,7 +563,10 @@ PML_OpenPageFile(void) size = sizeof(word) * ChunksInFile; MM_GetPtr(&buf,size); if (!CA_FarRead(PageFile,(byte far *)buf,size)) + { Quit("PML_OpenPageFile: Length read failed"); + //return; + } lengthptr = (word far *)buf; for (i = 0,page = PMPages;i < ChunksInFile;i++,page++) page->length = *lengthptr++; @@ -543,7 +584,7 @@ PML_ClosePageFile(void) if (PMSegPages) { MM_SetLock(&(memptr)PMSegPages,false); - MM_FreePtr(&(void _seg *)PMSegPages); + MM_FreePtr(&(__SEGA *)PMSegPages); } } @@ -560,7 +601,7 @@ PML_ClosePageFile(void) // to map our page in. If normal page, use EMS physical page 3, else // use the physical page specified by the lock type // -#if 1 +#ifdef __DEBUG__ #pragma argsused // DEBUG - remove lock parameter memptr PML_GetEMSAddress(int page,PMLockType lock) @@ -585,7 +626,7 @@ PML_GetEMSAddress(int page,PMLockType lock) // If page isn't already mapped in, find LRU EMS frame, and use it if (emspage == -1) { - longword last = MAXLONG; + dword last = MAXLONG; for (i = 0;i < EMSFrameCount;i++) { if (EMSList[i].lastHit < last) @@ -1175,10 +1216,10 @@ PM_Startup(void) if (!noxms) PML_StartupXMS(); - if (nomain && !EMSPresent) + if (nomain && !EMSPresent) { - printf("PM_Startup: No main or EMS\n"); - return; + Quit("PM_Startup: No main or EMS\n"); + //return; } else PML_StartupMainMem(); diff --git a/src/lib/16_pm.h b/src/lib/16_pm.h index 54f1600b..f8b62c40 100755 --- a/src/lib/16_pm.h +++ b/src/lib/16_pm.h @@ -7,7 +7,7 @@ #include "src/lib/16_hc.h" #include "src/lib/16_mm.h" -// NOTE! PMPageSize must be an even divisor of EMSPageSize, and >= 1024 +/*// NOTE! PMPageSize must be an even divisor of EMSPageSize, and >= 1024 #define EMSPageSize 16384 #define EMSPageSizeSeg (EMSPageSize >> 4) #define EMSPageSizeKB (EMSPageSize >> 10) @@ -38,7 +38,7 @@ typedef enum typedef struct { - longword offset; // Offset of chunk into file + dword offset; // Offset of chunk into file word length; // Length of the chunk int xmsPage; // If in XMS, (xmsPage * PMPageSize) gives offset into XMS handle @@ -47,13 +47,13 @@ typedef struct int emsPage; // If in EMS, logical page/offset into page int mainPage; // If in Main, index into handle array - longword lastHit; // Last frame number of hit + dword lastHit; // Last frame number of hit } PageListStruct; typedef struct { int baseEMSPage; // Base EMS page for this phys frame - longword lastHit; // Last frame number of hit + dword lastHit; // Last frame number of hit } EMSListStruct; extern boolean XMSPresent,EMSPresent; @@ -61,7 +61,7 @@ extern word XMSPagesAvail,EMSPagesAvail; extern word ChunksInFile, PMSpriteStart,PMSoundStart; -extern PageListStruct far *PMPages; +extern PageListStruct far *PMPages;*///moved to src/lib/typdefst.h #define PM_GetSoundPage(v) PM_GetPage(PMSoundStart + (v)) #define PM_GetSpritePage(v) PM_GetPage(PMSpriteStart + (v)) diff --git a/src/lib/typdefst.h b/src/lib/typdefst.h index fdf96a27..137b00b6 100755 --- a/src/lib/typdefst.h +++ b/src/lib/typdefst.h @@ -135,6 +135,12 @@ typedef struct //0000word startclk; float clk, tickclk; //timer } video_t; +//from 16_mm +//========================================================================== + +#define MAXBLOCKS 1024 +#define MAXUMBS 12 + typedef struct mmblockstruct { word start,length; @@ -146,12 +152,6 @@ typedef struct mmblockstruct struct mmblockstruct far *next; } mmblocktype; -//from 16_mm -//========================================================================== - -#define MAXBLOCKS 1024 -#define MAXUMBS 12 - typedef struct { dword nearheap,farheap,EMSmem,XMSmem,mainmem; @@ -180,6 +180,116 @@ typedef struct //========================================================================== + +//from 16_pm +//========================================================================== + +// NOTE! PMPageSize must be an even divisor of EMSPageSize, and >= 1024 +#define EMSPageSize 16384 +#define EMSPageSizeSeg (EMSPageSize >> 4) +#define EMSPageSizeKB (EMSPageSize >> 10) +#define EMSFrameCount 4 +#define PMPageSize 4096 +#define PMPageSizeSeg (PMPageSize >> 4) +#define PMPageSizeKB (PMPageSize >> 10) +#define PMEMSSubPage (EMSPageSize / PMPageSize) + +#define PMMinMainMem 10 // Min acceptable # of pages from main +#define PMMaxMainMem 100 // Max number of pages in main memory + +#define PMThrashThreshold 1 // Number of page thrashes before panic mode +#define PMUnThrashThreshold 5 // Number of non-thrashing frames before leaving panic mode + +typedef enum + { + pml_Unlocked, + pml_Locked + } PMLockType; + +typedef enum + { + pmba_Unused = 0, + pmba_Used = 1, + pmba_Allocated = 2 + } PMBlockAttr; + +typedef struct + { + dword offset; // Offset of chunk into file + word length; // Length of the chunk + + int xmsPage; // If in XMS, (xmsPage * PMPageSize) gives offset into XMS handle + + PMLockType locked; // If set, this page can't be purged + int emsPage; // If in EMS, logical page/offset into page + int mainPage; // If in Main, index into handle array + + dword lastHit; // Last frame number of hit + } PageListStruct; + +typedef struct + { + int baseEMSPage; // Base EMS page for this phys frame + dword lastHit; // Last frame number of hit + } EMSListStruct; + +// Main Mem specific variables +typedef struct +{ + boolean MainPresent; + memptr MainMemPages[PMMaxMainMem]; + PMBlockAttr MainMemUsed[PMMaxMainMem]; + int MainPagesAvail; +} pm_mmi_t; + +// EMS specific variables +typedef struct +{ + boolean EMSPresent; + word EMSAvail,EMSPagesAvail,EMSHandle, + EMSPageFrame,EMSPhysicalPage; + EMSListStruct EMSList[EMSFrameCount]; +} pm_emmi_t; + +// XMS specific variables +typedef struct +{ + boolean XMSPresent; + word XMSAvail,XMSPagesAvail,XMSHandle; + dword XMSDriver; + int XMSProtectPage;// = -1; +} pm_xmmi_t; + +// File specific variables +typedef struct +{ + char PageFileName[13];// = {"VSWAP."}; + int PageFile;// = -1; + word ChunksInFile; + word PMSpriteStart,PMSoundStart; +} pm_fi_t; + +// General usage variables +typedef struct +{ + boolean PMStarted, + PMPanicMode, + PMThrashing; + word XMSPagesUsed, + EMSPagesUsed, + MainPagesUsed, + PMNumBlocks; + long PMFrameCount; + PageListStruct far *PMPages; + __SEGA *PMSegPages; + pm_mmi_t mm; + pm_emmi_t emm; + pm_xmmi_t xmm; + pm_fi_t fi; +} pm_t; + +//========================================================================== + //from 16_ca //========================================================================== @@ -221,6 +331,7 @@ typedef struct { video_t video; // video settings variable ca_t ca; // ca stuff + pm_t pm; // pm stuff byte *pee; // message for fps loghandle_t handle; //handles for file logging kurokku_t kurokku; //clock struct -- 2.39.2