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