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 34e6ccb..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
@@ -1263,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
@@ -1360,10 +1359,16 @@ extern char global_temp_status_text2[512];
 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
@@ -1371,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
@@ -1399,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
@@ -1457,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
@@ -1478,7 +1500,8 @@ void MM_ShowMemory (global_game_variables_t *gvar)
 \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
@@ -1489,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
@@ -1521,148 +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
-\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
-       if(gvar->video.VL_Started) IN_Ack(gvar);\r
+       while (!(scancode = gvar->in.inst->LastScan)){}\r
+//     IN_ClearKey(scancode);\r
+//     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 __far*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 ccolor = 3;\r
-               IN_Ack(gvar);\r
-//             VL_ClearVideo (8);\r
-               for (q = 0,done = false;!done;)\r
+               if(scaninfo[q].scan->attributes & PURGEBITS)\r
                {\r
-                       if(scaninfo[q].scan->attributes & PURGEBITS)\r
-                       {\r
-                               ccolor = 6;             // dark purple = purgable\r
-                               strcpy(scratch1, AAMAGENTA);            // dark purple = purgable\r
-                               //printf("%s", AAMAGENTA);\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[q].scan->attributes & LOCKBIT)\r
-                       {\r
-                               ccolor = 1;             // red = locked\r
-                               strcpy(scratch1, AARED);                // red = locked\r
-                               //printf("%s", AARED);\r
-                       }\r
-                       end = scaninfo[q].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
+                       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
-                               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\r
+               if(gvar->video.VL_Started)\r
+               {\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
-                               clrscr();\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
+                       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
-                               sprintf(global_temp_status_text, "free: %05u", (unsigned)(scaninfo[q].scan->next->start-scaninfo[q].scan->start)); MMSMPRINTMEMINFO\r
+                               y = gvar->video.print.y;//ypos;\r
+                               x = gvar->video.print.x;//xpos;\r
+                       }else{\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[q].scan->start/width;\r
-                               x = xpos;//scaninfo[q].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
-                               if(scaninfo[q].scan->length<64000)\r
-                               for(w=(scaninfo[q].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[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
-                                               //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
+               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
-//0000                 fprintf(stdout, "q=%u   maxq=%u\n", q, maxq);\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(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>10) q-=10;\r
-                                       else    q = maxq;\r
-                               break;\r
-                               case sc_DownArrow:\r
-                                       if(q<maxq+10) q+=10;\r
-                                       else q = 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