OSDN Git Service

updated copyleft and need to test and fix newer version of open watcom
[proj16/16.git] / src / lib / 16_mm.c
index 5061b4d..47fde07 100755 (executable)
@@ -1,5 +1,5 @@
 /* Project 16 Source Code~\r
- * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
+ * Copyright (C) 2012-2022 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
  *\r
  * This file is part of Project 16.\r
  *\r
@@ -806,6 +806,38 @@ void MML_ClearBlock (global_game_variables_t *gvar)
 /*\r
 ===================\r
 =\r
+= MM_Reset\r
+=\r
+===================\r
+*/\r
+\r
+void MM_Reset (global_game_variables_t *gvar)\r
+{\r
+//     //has to be 16\r
+//     if(sizeof(mmblocktype)!=16)\r
+//             return;\r
+\r
+#ifdef __BORLANDC__\r
+       strcpy(gvar->handle.datadumpfilename, "mmdump.16b");\r
+#endif\r
+#ifdef __WATCOMC__\r
+       strcpy(gvar->handle.datadumpfilename, "mmdump.16w");\r
+#endif\r
+\r
+#ifdef __BORLANDC__\r
+       strcpy(gvar->handle.heapdumpfilename, "heap.16b");\r
+#endif\r
+#ifdef __WATCOMC__\r
+       strcpy(gvar->handle.heapdumpfilename, "heap.16w");\r
+#endif\r
+}\r
+\r
+\r
+//==========================================================================\r
+\r
+/*\r
+===================\r
+=\r
 = MM_Startup\r
 =\r
 = Grabs all space from turbo with malloc/farmalloc\r
@@ -817,17 +849,14 @@ void MML_ClearBlock (global_game_variables_t *gvar)
 void MM_Startup (global_game_variables_t *gvar)\r
 {\r
        int i;\r
-       dword length;\r
+       unsigned        long length;\r
        void far        *start;\r
        unsigned        segstart,seglength;//,endfree;\r
 \r
        if(gvar->mm.mmstarted)\r
                MM_Shutdown (gvar);\r
 \r
-       //has to be 16\r
-       if(sizeof(mmblocktype)!=16)\r
-               return;\r
-\r
+       MM_Reset (gvar);\r
        gvar->mm.mmstarted = true;\r
        gvar->mm.bombonerror = true;\r
 //\r
@@ -854,17 +883,8 @@ void MM_Startup (global_game_variables_t *gvar)
 //\r
 // get all available near conventional memory segments\r
 //\r
-#ifdef __WATCOMC__\r
-       _nheapgrow();\r
-#endif\r
-       length=(word)_memavl();//(word)coreleft();\r
-       //start = gvar->mm.nearheap = _fmalloc(length);\r
-#ifdef __WATCOMC__\r
-       start = (void __far *)(gvar->mm.nearheap = _nmalloc(length));\r
-#endif\r
-#ifdef __BORLANDC__\r
-       start = (void far *)(gvar->mm.nearheap = malloc(length));\r
-#endif\r
+       length=(word)coreleft();\r
+       start = (void far *)(gvar->mm.nearheap = _nmalloc(length));\r
 \r
        length -= 16-(FP_OFF(start)&15);\r
        length -= SAVENEARHEAP;\r
@@ -873,30 +893,19 @@ void MM_Startup (global_game_variables_t *gvar)
        MML_UseSpace (segstart,seglength, gvar);\r
        gvar->mmi.nearheap = length;\r
        //0000printf("near:     start=%Fp       segstart=%x     seglen=%lu      len=%lu\n", start, segstart, (dword)seglength, length);\r
-\r
 //\r
 // get all available far conventional memory segments\r
 //\r
-#ifdef __WATCOMC__\r
-       _fheapgrow();\r
-#endif\r
-#ifdef __BORLANDC__\r
-//     printf("farcoreleft()                           %lu\n", farcoreleft());\r
-//     printf("(farcoreleft()+32)-_FCORELEFT   %d\n", (sword)((farcoreleft()+32)-_FCORELEFT));\r
-#endif\r
-       length=_FCORELEFT;\r
-       start = gvar->mm.farheap = _fmalloc(length);//start = gvar->mm.farheap = halloc(length, 1);\r
-\r
+       length=farcoreleft();\r
+       start = gvar->mm.farheap = farmalloc(length);\r
        length -= 16-(FP_OFF(start)&15);\r
        length -= SAVEFARHEAP;\r
        seglength = length / 16;                        // now in paragraphs\r
        segstart = FP_SEG(start)+(FP_OFF(start)+15)/16;\r
        MML_UseSpace (segstart,seglength, gvar);\r
        gvar->mmi.farheap = length;\r
-       //0000printf("far:      start=%Fp       segstart=%x     seglen=%lu      len=%lu\n", start, segstart, (dword)seglength, length);\r
-\r
        gvar->mmi.mainmem = gvar->mmi.nearheap + gvar->mmi.farheap;\r
-\r
+       //0000printf("far:      start=%Fp       segstart=%x     seglen=%lu      len=%lu\n", start, segstart, (dword)seglength, length);\r
 #if !defined(__16_PM__)// && defined(__WATCOMC__)\r
 #if 0\r
        if(!dbg_debugpm) {\r
@@ -967,12 +976,7 @@ void MM_Shutdown (global_game_variables_t *gvar)
                return;\r
 \r
        _ffree(gvar->mm.farheap);//     printf("                far freed\n");\r
-#ifdef __WATCOMC__\r
        _nfree(gvar->mm.nearheap);//    printf("                near freed\n");\r
-#endif\r
-#ifdef __BORLANDC__\r
-       free(gvar->mm.nearheap);//      printf("                near freed\n");\r
-#endif\r
 #ifndef __16_PM__\r
 #if 0\r
 #ifdef __DEBUG__\r
@@ -1259,10 +1263,9 @@ void MM_SortMem (global_game_variables_t *gvar)
 \r
 \r
        SD_StopSound();*/\r
-#ifdef __WATCOMC__\r
+\r
        oldborder = gvar->video.bordercolor;\r
        gvar->video.bordercolor = VL_modexPalOverscan(gvar->video.palette, 4);\r
-#endif\r
 \r
        if (beforesort)\r
                beforesort();\r
@@ -1336,6 +1339,15 @@ void MM_SortMem (global_game_variables_t *gvar)
 \r
 //==========================================================================\r
 \r
+#ifdef __BORLANDC__\r
+extern char global_temp_status_text[512];\r
+extern char global_temp_status_text2[512];\r
+#endif\r
+#ifdef __WATCOMC__\r
+//#define MMSMPANVID\r
+#define MMSMSCANINFO\r
+#endif\r
+\r
 /*\r
 =====================\r
 =\r
@@ -1344,18 +1356,19 @@ void MM_SortMem (global_game_variables_t *gvar)
 =====================\r
 */\r
 \r
-#ifdef __WATCOMC__\r
-//#define MMSMPANVID\r
-#define MMSMSCANINFO\r
-#endif\r
-\r
 void MM_ShowMemory (global_game_variables_t *gvar)\r
 {\r
        mmblocktype far *scan;\r
-       unsigned color,temp,x,y         ,w,q,width;\r
+       unsigned color,temp,x,y         ,q,w/*,width*/,sw;\r
        sdword  end,owner;\r
        byte            scratch[160],scratch0[4096],str[16];\r
+#ifdef MMSMSCANINFO\r
        mmshowmemoryinfo_t scaninfo[MAXBLOCKS];\r
+       byte scratch1[4];\r
+       unsigned                /*xpos,ypos, */oldq,maxq;\r
+       boolean         done,restarted,mmsmscaninfoxyposinew;\r
+       ScanCode                scancode;\r
+#endif\r
 \r
        if(!gvar->video.page[0].width) gvar->video.page[0].sw = gvar->video.page[0].width = 320;        //to prevent division by 0\r
 //--   VL_SetLineWidth(40, gvar);\r
@@ -1363,16 +1376,23 @@ void MM_ShowMemory (global_game_variables_t *gvar)
        //gvar->video.ofs.bufferofs = gvar->video.ofs.displayofs;\r
        temp = BDOFSCONV gvar->video.BOFS;\r
        gvar->video.BOFS = gvar->video.DOFS;\r
+#ifdef MMSMSCANINFO\r
+       oldq = 0; restarted = false; mmsmscaninfoxyposinew = false;\r
+reset:\r
+#endif\r
        scan = gvar->mm.mmhead;\r
 \r
-       end = -1; w = 0;\r
+       end = -1; w = 0; q = 0;\r
 \r
-       width = gvar->video.page[0].width; q = 0;\r
+       //width = gvar->video.page[0].width;\r
+       sw = gvar->video.page[0].sw;\r
 \r
        CA_OpenDebug (gvar);\r
        while (scan)\r
        {\r
+#ifdef MMSMSCANINFO\r
                scaninfo[q].scan = scan;\r
+#endif\r
                strcpy(scratch, AARESET);\r
                if(scan->attributes & PURGEBITS)\r
                {\r
@@ -1391,20 +1411,27 @@ void MM_ShowMemory (global_game_variables_t *gvar)
                {\r
                        printf("\nend==%d\n\n", end);\r
                        strcat(scratch, "MM_ShowMemory: Memory block order currupted!\n");\r
-                       strcat(scratch, "End's Size: ");\r
-                       ultoa (end,str,10);\r
-                       strcat (scratch,str);\r
-                       strcat(scratch, "\nscan->start's Size: ");\r
-                       ultoa (scan->start,str,10);\r
-                       strcat (scratch,str);\r
+                       strcat(scratch, "End's Size: ");        ultoa (end,str,10);     strcat (scratch,str);\r
+                       strcat(scratch, "\nscan->start's Size: ");      ultoa (scan->start,str,10);     strcat (scratch,str);\r
                        write(gvar->handle.debughandle,scratch,strlen(scratch));\r
                        Quit (gvar, "MM_ShowMemory: Memory block order currupted!");\r
                }\r
                end = scan->length-1;\r
-               y = scan->start/width;\r
-               x = scan->start%width;\r
-               scaninfo[q].x = x;\r
-               scaninfo[q].y = y;\r
+               y = gvar->video.page[0].dx+(scan->start/sw);\r
+               x = gvar->video.page[0].dy+(scan->start%sw);\r
+#if 0\r
+//def MMSMSCANINFO\r
+               if(restarted){\r
+                       y += gvar->video.page[0].dy;\r
+                       x += gvar->video.page[0].dx;\r
+               }\r
+#if 0\r
+               else{\r
+                       scaninfo[q].y = y;\r
+                       scaninfo[q].x = x;\r
+               }\r
+#endif\r
+#endif\r
                VW_Hlin(x,x+end,y,color,gvar);\r
                VL_Plot(x,y,5,gvar);\r
 //++==++==optional                     strcat(scratch0, AARESET); strcat(scratch0, AAGREY); strcat(scratch0,"_");\r
@@ -1449,7 +1476,10 @@ void MM_ShowMemory (global_game_variables_t *gvar)
 #endif\r
                strcat(scratch0, AARESET);\r
                //strcat(scratch0,"\n");\r
-               strcat(scratch,"Seg:");\r
+               strcat(scratch,"Block:");\r
+               ultoa (q,str,10);\r
+               strcat (scratch,str);\r
+               strcat(scratch,"\tSeg:");\r
                ultoa (scan->start,str,16);\r
                strcat (scratch,str);\r
 //             strcat(scratch, AABLACK); strcat(scratch,"\t"); strcat(scratch, AARESET);\r
@@ -1464,11 +1494,14 @@ void MM_ShowMemory (global_game_variables_t *gvar)
                strcat (scratch,"\n");\r
                write(gvar->handle.debughandle,scratch,strlen(scratch));\r
                write(gvar->handle.debughandle,scratch0,strlen(scratch0));\r
-//fprintf(stdout, "%s", scratch);\r
+//0000fprintf(stdout, "\n[%s]", scratch);\r
+//0000fprintf(stdout, "[\n%s\n]", scratch0);\r
+//0000fprintf(stdout, "[%u]\n", q);\r
 \r
                scan = scan->next;\r
                q++;\r
-//if(color!=6) IN_Ack(gvar);\r
+\r
+//0000if(gvar->video.VL_Started && color!=6) IN_Ack(gvar);\r
        }\r
 \r
        CA_CloseDebug (gvar);\r
@@ -1479,7 +1512,9 @@ void MM_ShowMemory (global_game_variables_t *gvar)
                odx = gvar->video.page[0].dx;\r
                ody = gvar->video.page[0].dy;\r
                dx = dy = 0;\r
-               while(!gvar->in.inst->Keyboard[sc_Escape])\r
+\r
+               while (!(scancode = gvar->in.inst->LastScan)){}\r
+               while(!gvar->in.inst->Keyboard[sc_Escape] && !gvar->in.inst->Keyboard[sc_Space])\r
                {\r
                        if(gvar->in.inst->Keyboard[sc_UpArrow])\r
                        {\r
@@ -1511,143 +1546,167 @@ void MM_ShowMemory (global_game_variables_t *gvar)
        }\r
 #endif\r
 #ifdef MMSMSCANINFO\r
-       MM_ShowMemoryDetail (x, y, w, q, end, &scaninfo, gvar);\r
-#endif\r
+       if (gvar->video.VL_Started) IN_Ack(gvar);\r
+       maxq = q-1;\r
+       if(restarted) q = oldq;\r
+       else q = 0;\r
+       restarted = false;\r
 \r
+       while (!(scancode = gvar->in.inst->LastScan)){}\r
+//     IN_ClearKey(scancode);\r
+//     IN_Ack(gvar);\r
 \r
-       if(gvar->video.VL_Started) IN_Ack(gvar);\r
-\r
-       gvar->video.BOFS = (byte __far *)temp;\r
-}\r
-\r
-#ifdef MMSMSCANINFO\r
-void MM_ShowMemoryDetail (unsigned x, unsigned y, unsigned w, unsigned q, sdword end, mmshowmemoryinfo_t *scaninfo, global_game_variables_t *gvar)\r
+       for (done = false;!done;)\r
        {\r
-               byte scratch1[4];\r
-               unsigned                maxq = q;\r
-               boolean                 done;\r
-               ScanCode                scancode;\r
-               int xpos,ypos;\r
-               word qq, ccolor = 3;\r
-               IN_Ack(gvar);\r
-//             VL_ClearVideo (8);\r
-               for (qq = 0,done = false;!done;)\r
+               if(scaninfo[q].scan->attributes & PURGEBITS)\r
+               {\r
+                       color = 6;              // dark purple = purgable\r
+                       strcpy(scratch1, AAMAGENTA);            // dark purple = purgable\r
+                       //printf("%s", AAMAGENTA);\r
+               }else{\r
+                       color = 2;              // medium blue = non purgable\r
+                       strcpy(scratch1, AABLUE);               // medium blue = non purgable\r
+                       //printf("%s", AABLUE);\r
+               }\r
+               if(scaninfo[q].scan->attributes & LOCKBIT)\r
+               {\r
+                       color = 1;              // red = locked\r
+                       strcpy(scratch1, AARED);                // red = locked\r
+                       //printf("%s", AARED);\r
+               }\r
+               end = scaninfo[q].scan->length-1;\r
+\r
+               gvar->video.print.t=1;\r
+               gvar->video.print.tlsw=1;\r
+               gvar->video.print.color=color;\r
+               gvar->video.print.bgcolor=8;\r
+#define MMSMPRINTMEMINFO       VL_print(global_temp_status_text, 0, gvar); gvar->video.print.y+=8;\r
+//modexprint(&(gvar->video.page[0]), xpos, ypos, 1, 1, color, 8, gvar->video.VL_Started, global_temp_status_text);\r
+#ifdef __WATCOMC__\r
+               if(gvar->video.VL_Started)\r
                {\r
-                       if(scaninfo[qq].scan->attributes & PURGEBITS)\r
+                       VL_ShowPage(&gvar->video.page[0], 1, 0);\r
+                       modexClearRegion(&gvar->video.page[0], gvar->video.page[0].dx, gvar->video.page[0].dy, gvar->video.page[0].sw, gvar->video.page[0].sh, 8);\r
+               }else\r
+#endif\r
+               {\r
+                       clrscr();\r
+               }\r
+               sprintf(global_temp_status_text, "block #%04u", q); MMSMPRINTMEMINFO\r
+//             sprintf(global_temp_status_text, "%Fp", scaninfo[q].scan->useptr); MMSMPRINTMEMINFO\r
+               sprintf(global_temp_status_text, "start:  %04x", (unsigned)scaninfo[q].scan->start); MMSMPRINTMEMINFO\r
+               sprintf(global_temp_status_text, "useptr: %04x", (unsigned)scaninfo[q].scan->useptr); MMSMPRINTMEMINFO\r
+               sprintf(global_temp_status_text, "size: %05u", (unsigned)scaninfo[q].scan->length); MMSMPRINTMEMINFO\r
+               if (scaninfo[q].scan->next && scaninfo[q].scan->next->start > end+1)\r
+               {\r
+                       sprintf(global_temp_status_text, "free: %05u", (unsigned)(scaninfo[q].scan->next->start-scaninfo[q].scan->start)); MMSMPRINTMEMINFO\r
+               }else   /*ypos*/gvar->video.print.y+=8;\r
+               if(gvar->video.VL_Started)\r
+               {\r
+                       y = scaninfo[q].scan->start/sw;\r
+                       x = scaninfo[q].scan->start%sw;\r
+                       if(!mmsmscaninfoxyposinew)\r
                        {\r
-                               ccolor = 6;             // dark purple = purgable\r
-                               strcpy(scratch1, AAMAGENTA);            // dark purple = purgable\r
-                               //printf("%s", AAMAGENTA);\r
+                               y = gvar->video.print.y;//ypos;\r
+                               x = gvar->video.print.x;//xpos;\r
                        }else{\r
-                               ccolor = 2;             // medium blue = non purgable\r
-                               strcpy(scratch1, AABLUE);               // medium blue = non purgable\r
-                               //printf("%s", AABLUE);\r
-                       }\r
-                       if(scaninfo[qq].scan->attributes & LOCKBIT)\r
-                       {\r
-                               ccolor = 1;             // red = locked\r
-                               strcpy(scratch1, AARED);                // red = locked\r
-                               //printf("%s", AARED);\r
-                       }\r
-                       end = scaninfo[qq].scan->length-1;\r
-/*typedef struct mmblockstruct{\r
-       word    start,length;\r
-       unsigned        attributes;\r
-       memptr          *useptr;        // pointer to the segment start\r
-       struct mmblockstruct far *next;\r
-} mmblocktype;*/\r
-                       //modexprint(page, x, y, t, tlsw, color, bgcolor, vidsw, const byte *str);\r
-#define MMSMPRINTMEMINFO modexprint(&(gvar->video.page[0]), xpos, ypos, 1, 1, ccolor, 8, gvar->video.VL_Started, global_temp_status_text); ypos+=8;\r
-                       if(gvar->video.VL_Started)\r
-                       {\r
-                               VL_ShowPage(&gvar->video.page[0], 1, 0);\r
-                               modexClearRegion(&gvar->video.page[0], 0, 0, gvar->video.page[0].width, gvar->video.page[0].height, 8);\r
-                       }else clrscr();\r
-                       sprintf(global_temp_status_text, "block #%04u", qq); MMSMPRINTMEMINFO\r
-//                     sprintf(global_temp_status_text, "%Fp", scaninfo[qq].scan->useptr); MMSMPRINTMEMINFO\r
-                       sprintf(global_temp_status_text, "start:  %04x", (unsigned)scaninfo[qq].scan->start); MMSMPRINTMEMINFO\r
-                       sprintf(global_temp_status_text, "useptr: %04x", (unsigned)scaninfo[qq].scan->useptr); MMSMPRINTMEMINFO\r
-                       sprintf(global_temp_status_text, "size: %05u", (unsigned)scaninfo[qq].scan->length); MMSMPRINTMEMINFO\r
-                       if (scaninfo[qq].scan->next && scaninfo[qq].scan->next->start > end+1)\r
-                       {\r
-                               sprintf(global_temp_status_text, "free: %05u", (unsigned)(scaninfo[qq].scan->next->start-scaninfo[qq].scan->start)); MMSMPRINTMEMINFO\r
+                               //y = scaninfo[q].y;\r
+                               //x = scaninfo[q].x;\r
+                               y += gvar->video.page[0].dy;\r
+                               x += gvar->video.page[0].dx;\r
                        }\r
-                       if(gvar->video.VL_Started)\r
+                       VW_Hlin(x,x+end,y,color,gvar);\r
+                       VL_Plot(x,y,5,gvar);\r
+               }\r
+               else\r
+               {\r
+                       printf("%s", scratch1);\r
+                       printf("%s", AAGREY); printf("_");\r
+                       for(w=(scaninfo[q].scan->start)/80;w<=end/80;w++)\r
                        {\r
-                               y = ypos;//scaninfo[qq].scan->start/width;\r
-                               x = xpos;//scaninfo[qq].scan->start%width;\r
-                               VW_Hlin(x,x+end,y,ccolor,gvar);\r
-                               VL_Plot(x,y,5,gvar);\r
+                               //strcat(scratch1, "+");\r
+                               printf("+");\r
                        }\r
-                       else\r
+               }\r
+\r
+\r
+               if (scaninfo[q].scan->next && scaninfo[q].scan->next->start > end+1) if(!gvar->video.VL_Started)\r
+               {\r
+                       //strcat(scratch1, AARESET);\r
+                       printf("%s", AARESET);\r
+                       //strcat(scratch1,AAGREEN);\r
+                       printf("%s", AAGREEN);\r
+                       for(w=(end+1)/80;w<=((scaninfo[q].scan->next->start-scaninfo[q].scan->start)/80);w++)\r
                        {\r
-                               printf("%s", scratch1);\r
-                               printf("%s", AAGREY); printf("_");\r
-                               for(w=(scaninfo[qq].scan->start)/80;w<=end/80;w++)\r
-                               {\r
-                                       //strcat(scratch1, "+");\r
-                                       printf("+");\r
-                               }\r
+                               //strcat(scratch1,"0");\r
+                               printf("0");\r
                        }\r
+               }else VW_Hlin(x+end+1,x+(scaninfo[q].scan->next->start-scaninfo[q].scan->start),y,3,gvar);      // black = free//now green\r
 \r
 \r
-                               if (scaninfo[qq].scan->next && scaninfo[qq].scan->next->start > end+1) if(!gvar->video.VL_Started)\r
-                               {\r
-                                       //strcat(scratch1, AARESET);\r
-                                       printf("%s", AARESET);\r
-                                       //strcat(scratch1,AAGREEN);\r
-                                       printf("%s", AAGREEN);\r
-                                       for(w=(end+1)/80;w<=((scaninfo[qq].scan->next->start-scaninfo[qq].scan->start)/80);w++)\r
-                                       {\r
-                                               //strcat(scratch1,"0");\r
-                                               printf("0");\r
-                                       }\r
-                               }else VW_Hlin(x+end+1,x+(scaninfo[qq].scan->next->start-scaninfo[qq].scan->start),y,3,gvar);    // black = free//now green\r
+               if(gvar->video.VL_Started)\r
+               {\r
+                       //if (scan->next && scan->next->start > end+1) free\r
+                       /*xpos*/gvar->video.print.x = gvar->video.page[0].dx;\r
+                       /*ypos*/gvar->video.print.y = gvar->video.page[0].dy;\r
+               }\r
+               else\r
+               {\r
+                       //printf("%s\n", scratch1);\r
+                       printf("%s", AARESET);\r
+                       printf("\n");\r
+               }\r
 \r
 \r
-                       if(gvar->video.VL_Started)\r
-                       {\r
-                               //if (scan->next && scan->next->start > end+1) free\r
-                               xpos = gvar->video.page[0].dx;\r
-                               ypos = gvar->video.page[0].dy;//(gvar->video.page[0].sh-(32));//8*4\r
-                       }\r
-                       else\r
-                       {\r
-                               //printf("%s\n", scratch1);\r
-                               printf("%s", AARESET);\r
-                               printf("\n");\r
-                       }\r
-                       while (!(scancode = gvar->in.inst->LastScan)){}\r
+               while (!(scancode = gvar->in.inst->LastScan)){}\r
 \r
-                       IN_ClearKey(scancode);\r
-                       switch (scancode)\r
-                       {\r
-                               case sc_LeftArrow:\r
-                                       if(qq>0) qq--;\r
-                                       else    qq = maxq;\r
-                               break;\r
-                               case sc_RightArrow:\r
-                                       if(qq<maxq) qq++;\r
-                                       else qq = 0;\r
-                               break;\r
-/*                             case sc_UpArrow:\r
-                                       if(qq>0) qq-=100;\r
-                                       else    qq = maxq;\r
-                               break;\r
-                               case sc_DownArrow:\r
-                                       if(qq<maxq) qq+=100;\r
-                                       else qq = 0;\r
-                               break;*/\r
-                               case sc_Escape:\r
-                                       done = true;\r
-                               break;\r
-                       }\r
+               IN_ClearKey(scancode);\r
+               switch (scancode)\r
+               {\r
+                       case sc_Enter:\r
+                               if(!mmsmscaninfoxyposinew) mmsmscaninfoxyposinew = true;\r
+                               else mmsmscaninfoxyposinew = false;\r
+                               //mmsmscaninfoxyposinew!=mmsmscaninfoxyposinew;\r
+                       break;\r
+                       case sc_LeftArrow:\r
+                               if(q>0) q--;\r
+                               else    q = maxq;\r
+                       break;\r
+                       case sc_RightArrow:\r
+                               if(q<maxq) q++;\r
+                               else q = 0;\r
+                       break;\r
+                       case sc_UpArrow:\r
+                               if(q>9) q-=10;\r
+                               else    q = maxq;\r
+                       break;\r
+                       case sc_DownArrow:\r
+                               if(q<maxq-9) q+=10;\r
+                               else q = 0;\r
+                       break;\r
+                       case sc_Space:\r
+                               oldq = q;\r
+                               restarted = true;\r
+#ifdef __WATCOMC__\r
+                               if(gvar->video.VL_Started) modexClearRegion(&gvar->video.page[0], gvar->video.page[0].dx, gvar->video.page[0].dy, gvar->video.page[0].sw, gvar->video.page[0].sh, 8);\r
+#endif\r
+                               goto reset;\r
+\r
+                       case sc_Escape:\r
+                               done = true;\r
+                       break;\r
                }\r
        }\r
+#else\r
+       if(gvar->video.VL_Started) IN_Ack(gvar);\r
 #endif\r
 \r
+       gvar->video.BOFS = (byte __far *)temp;\r
+}\r
+\r
 //==========================================================================\r
 \r
+\r
 /*\r
 =====================\r
 =\r
@@ -1664,22 +1723,10 @@ void MM_DumpData (global_game_variables_t *gvar)
        char    lock,purge;\r
        FILE    *dumpfile;\r
 \r
-#ifdef __WATCOMC__\r
        _nfree(gvar->mm.nearheap);\r
-#endif\r
-#ifdef __BORLANDC__\r
-       free(gvar->mm.nearheap);\r
-#endif\r
-#ifdef __BORLANDC__\r
-               dumpfile = fopen ("mmdump.16b","w");\r
-#endif\r
-#ifdef __WATCOMC__\r
-               dumpfile = fopen ("mmdump.16w","w");\r
-#endif\r
-       if (!dumpfile){\r
-               printf("MM_DumpData: Couldn't open MMDUMP.16!\n");\r
-               return;\r
-       }\r
+       dumpfile = fopen (gvar->handle.datadumpfilename, "w");\r
+       if (!dumpfile)\r
+               Quit (gvar, "MM_DumpData: Couldn't open MMDUMP.16!\n");\r
 \r
        lowest = -1;\r
        do\r
@@ -1717,8 +1764,16 @@ void MM_DumpData (global_game_variables_t *gvar)
 \r
        } while (lowest != 0xffff);\r
 \r
-       fclose(dumpfile);\r
-       printf("MMDUMP.16 created.\n");\r
+       fclose (dumpfile);\r
+\r
+       //reset filename\r
+#ifdef __BORLANDC__\r
+       strcpy(gvar->handle.datadumpfilename, "mmdump.16b");\r
+#endif\r
+#ifdef __WATCOMC__\r
+       strcpy(gvar->handle.datadumpfilename, "mmdump.16w");\r
+#endif\r
+//00   printf ("MMDUMP.16 created.\n");\r
 }\r
 \r
 //==========================================================================\r