X-Git-Url: http://4ch.mooo.com/gitweb/?p=16.git;a=blobdiff_plain;f=src%2Flib%2F16_mm.c;h=18c02bbb7da332a4260ca928391fd4d0cad08888;hp=b6636ddff4aa36cda45bda35902667a50461c32a;hb=be16a39d3ed2b062cca8167096a24dd7aa826b44;hpb=767a51ba929d4110350572d014665644fa2288d5 diff --git a/src/lib/16_mm.c b/src/lib/16_mm.c index b6636ddf..18c02bbb 100755 --- a/src/lib/16_mm.c +++ b/src/lib/16_mm.c @@ -32,7 +32,7 @@ Primary coder: John Carmack RELIES ON --------- -Quit (gvar, global_game_variables_t *gvar, char *error) function +Quit (global_game_variables_t *gvar, char *error) function WORK TO DO @@ -789,9 +789,9 @@ void MML_ClearBlock (global_game_variables_t *gvar) while(scan) { - if(!(scan->attributes&LOCKBIT) && (scan->attributes&PURGEBITS)) + if(!(scan->attributes&LOCKBIT) && (scan->attributes&PURGEBITS) ) { - MM_FreePtr(scan->useptr, gvar); + MM_FreePtr (scan->useptr, gvar); return; } scan = scan->next; @@ -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,13 +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); + MM_Reset (gvar); gvar->mm.mmstarted = true; gvar->mm.bombonerror = true; // @@ -850,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; @@ -869,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) { @@ -963,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__ @@ -1010,14 +1018,21 @@ void MM_GetPtr (memptr *baseptr,dword size, global_game_variables_t *gvar) gvar->mm.mmnew->attributes = BASEATTRIBUTES; //if(gvar->mm.mmnew->useptr==NULL){ #ifdef __DEBUG_MM__ - printf("MM_GetPtr\n"); if(dbg_debugmm>0){ + printf("===============================================================================\n"); + printf(" MM_GetPtr\n"); + printf("===============================================================================\n"); //%04x - printf(" baseptr=%Fp ", baseptr); printf("useptr=%Fp\n", gvar->mm.mmnew->useptr); - printf(" *baseptr=%Fp ", *baseptr); printf("*useptr=%Fp\n", *(gvar->mm.mmnew->useptr)); - printf(" &baseptr=%Fp ", &baseptr); printf("&useptr=%Fp\n", &(gvar->mm.mmnew->useptr)); +// printf(" baseptr=%Fp ", baseptr); printf("useptr=%Fp\n", gvar->mm.mmnew->useptr); +// //printf(" *baseptr=%Fp ", *baseptr); printf("*useptr=%Fp\n", *(gvar->mm.mmnew->useptr)); +// printf(" &baseptr=%Fp ", &baseptr); printf("&useptr=%Fp\n", &(gvar->mm.mmnew->useptr)); + + printf(" baseptr=%04x ", baseptr); printf("useptr=%04x\n", gvar->mm.mmnew->useptr); + //printf(" *baseptr=%04x ", *baseptr); printf("*useptr=%04x\n", *(gvar->mm.mmnew->useptr)); + printf(" &baseptr=%04u ", &baseptr); printf("&useptr=%04u\n", &(gvar->mm.mmnew->useptr)); + + printf(" size is %lu\n", size); } - printf(" size is %lu\n", size); #endif //Quit (gvar, "gvar->mm.mmnew->useptr==NULL"); } @@ -1248,8 +1263,10 @@ void MM_SortMem (global_game_variables_t *gvar) SD_StopSound();*/ +#ifdef __WATCOMC__ oldborder = gvar->video.bordercolor; - gvar->video.bordercolor = modexPalOverscan(15); + gvar->video.bordercolor = VL_modexPalOverscan(gvar->video.palette, 4); +#endif if (beforesort) beforesort(); @@ -1323,6 +1340,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 + /* ===================== = @@ -1331,18 +1357,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 ,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,q,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); @@ -1350,16 +1378,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: + q = 0; +#endif scan = gvar->mm.mmhead; end = -1; w = 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) { @@ -1378,20 +1413,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,"_"); @@ -1451,11 +1493,15 @@ 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; +#ifdef MMSMSCANINFO q++; -//if(color!=6) IN_Ack(gvar); +#endif +//0000if(q==1 && gvar->video.VL_Started && color!=6) IN_Ack(gvar); } CA_CloseDebug (gvar); @@ -1466,7 +1512,7 @@ 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(!gvar->in.inst->Keyboard[sc_Escape] && !gvar->in.inst->Keyboard[sc_Space]) { if(gvar->in.inst->Keyboard[sc_UpArrow]) { @@ -1498,128 +1544,155 @@ void MM_ShowMemory (global_game_variables_t *gvar) } #endif #ifdef MMSMSCANINFO + maxq = q; + if(restarted) q = oldq; + else q = 0; + restarted = false; + + IN_Ack(gvar); +// VL_ClearVideo (8); + 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; +//modexprint(page, x, y, t, tlsw, color, bgcolor, vidsw, const byte *str); +#define MMSMPRINTMEMINFO modexprint(&(gvar->video.page[0]), xpos, ypos, 1, 1, color, 8, gvar->video.VL_Started, global_temp_status_text); ypos+=8; +#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+=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 = ypos; + x = xpos; }else{ - ccolor = 2; // medium blue = non purgable - strcpy(scratch1, AABLUE); // medium blue = non purgable - //printf("%s", AABLUE); + //y = scaninfo[q].y; + //x = scaninfo[q].x; + y += gvar->video.page[0].dy; + x += gvar->video.page[0].dx; } - if(scaninfo[qq].scan->attributes & LOCKBIT) - { - ccolor = 1; // red = locked - strcpy(scratch1, AARED); // red = locked - //printf("%s", AARED); - } - 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, 0, ccolor, 8, gvar->video.VL_Started, global_temp_status_text); ypos+=8; - if(!gvar->video.VL_Started) clrscr(); else - { - 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); - } - 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, "%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) - { - sprintf(global_temp_status_text, "free: %05u", (unsigned)(scaninfo[qq].scan->next->start-scaninfo[qq].scan->start)); MMSMPRINTMEMINFO - } - if(gvar->video.VL_Started) + 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++) { - 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); + //strcat(scratch1, "+"); + printf("+"); } - else + } + + + 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++) { - 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.page[0].dx; + ypos = 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 = 16; - ypos = 16;//(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) q--; + else q = maxq; + break; + case sc_RightArrow: + if(q9) q-=10; + else q = maxq; + break; + case sc_DownArrow: + if(qvideo.page[0], gvar->video.page[0].dx, gvar->video.page[0].dy, gvar->video.page[0].sw, gvar->video.page[0].sh, 8); + goto reset; + break; + case sc_Escape: + done = true; + break; } } -#endif - +#else if(gvar->video.VL_Started) IN_Ack(gvar); +#endif gvar->video.BOFS = (byte __far *)temp; } //========================================================================== + /* ===================== = @@ -1636,22 +1709,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 @@ -1689,8 +1750,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"); } //==========================================================================