diff options
Diffstat (limited to 'sword2/mem_view.cpp')
-rw-r--r-- | sword2/mem_view.cpp | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/sword2/mem_view.cpp b/sword2/mem_view.cpp new file mode 100644 index 0000000000..11542ce576 --- /dev/null +++ b/sword2/mem_view.cpp @@ -0,0 +1,259 @@ +/* Copyright (C) 1994-2003 Revolution Software Ltd + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + */ + +//-------------------------------------------------------------------------------------- +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +//#include <windows.h> + +#include "driver/driver96.h" +#include "build_display.h" +#include "console.h" +#include "debug.h" +#include "defs.h" +#include "header.h" +#include "layers.h" +#include "mem_view.h" +#include "memory.h" +#include "resman.h" +#include "sword2.h" // (James11aug97) for CloseGame() + +//-------------------------------------------------------------------------------------- +//-------------------------------------------------------------------------------------- +//-------------------------------------------------------------------------------------- +//-------------------------------------------------------------------------------------- +//-------------------------------------------------------------------------------------- +//-------------------------------------------------------------------------------------- + +char buf[50]; //has to be global because a local in Fetch_mem_owner is destroyed on exit +//-------------------------------------------------------------------------------------- +void Console_mem_display(void) //Tony13Aug96 +{ +// + int pass,found_end,k,j,free=0; + _standardHeader *file_header; + int scrolls=0; + char c; + + char inf[][20]= + { + {"M_null "}, + {"M_free "}, + {"M_locked"}, + {"M_float "} + }; + + + j=base_mem_block; + do + { + + if (mem_list[j].uid<65536) + { + file_header = (_standardHeader*) res_man.Res_open(mem_list[j].uid); + res_man.Res_close(mem_list[j].uid); //close immediately so give a true count + + Zdebug("view %d", mem_list[j].uid); + + + pass=0; + found_end=0; + + for (k=0;k<30;k++) + { + if (file_header->name[k]==0) + { found_end=1; + break; + } + + if ( (file_header->name[k]<32)||(file_header->name[k]>'z')) + pass=1; + + } + + if (file_header->name[0]==0) + pass=1; //also illegal + + + if ((!pass)&&(found_end)) //&&(file_header->fileType<10)) + Print_to_console("%d %s, size 0x%.5x (%dk %d%%), res %d %s %s, A%d, C%d", j, + inf[mem_list[j].state], + mem_list[j].size, mem_list[j].size/1024, (mem_list[j].size*100)/total_free_memory, mem_list[j].uid, + + res_man.Fetch_cluster(mem_list[j].uid), + file_header->name, + res_man.Fetch_age(mem_list[j].uid), + res_man.Fetch_count(mem_list[j].uid)); + + else Print_to_console(" %d is an illegal resource", mem_list[j].uid); + + } + else + Print_to_console("%d %s, size 0x%.5x (%dk %d%%), %s", j, + inf[mem_list[j].state], + mem_list[j].size, mem_list[j].size/1024, (mem_list[j].size*100)/total_free_memory, + Fetch_mem_owner(mem_list[j].uid) ); + + if (mem_list[j].state==MEM_free) + free+=mem_list[j].size; + + + j=mem_list[j].child; + + scrolls++; + + Build_display(); + + + if (scrolls==18) + { + Temp_print_to_console("- Press ESC to stop or any other key to continue"); + Build_display(); + + do + { + //-------------------------------------------------- + // Service windows + while (!gotTheFocus) + if (ServiceWindows() == RDERR_APPCLOSED) + break; + + if (ServiceWindows() == RDERR_APPCLOSED) // if we pressed Ctrl-Q + { + Close_game(); //close engine systems down + RestoreDisplay(); + CloseAppWindow(); + exit(0); //quit the game + } + //-------------------------------------------------- + } + while(!KeyWaiting()); + + ReadKey(&c); //kill the key we just pressed + if (c==27) //ESC + break; + + Clear_console_line(); //clear the Press Esc message ready for the new line + scrolls=0; + } + } + while (j!=-1); + + Scroll_console(); + Print_to_console("(total memory block 0x%.8x %dk %dMB) %d / %d%% free", total_free_memory, + total_free_memory/1024, + total_free_memory/(1000*1024), + free, + (free*100)/total_free_memory); + + +} +//-------------------------------------------------------------------------------------- +//-------------------------------------------------------------------------------------- +char *Fetch_mem_owner(uint32 uid) //Tony3June96 +{ + + switch(uid) + { + case UID_memman: + return("MEMMAN"); + break; + + case UID_font: + return("font"); + break; + + case UID_temp: + return("temp ram allocation"); + break; + + case UID_decompression_buffer: + return("decompression buffer"); + break; + + case UID_shrink_buffer: + return("shrink buffer"); + break; + + case UID_con_sprite: + return("console sprite buffer"); + break; + + case UID_text_sprite: + return("text sprite"); + break; + + case UID_walk_anim: + return("walk anim"); + break; + + case UID_savegame_buffer: + return("savegame buffer"); + break; + + default: + sprintf(buf, "<sob> %d?", uid); + return(buf); + break; + } +} + +//-------------------------------------------------------------------------------------- +void Create_mem_string( char *string ) // James (21oct96 updated 4dec96) +{ + int blockNo = base_mem_block; + int blocksUsed=0; + int mem_free=0; + int mem_locked=0; + int mem_floating=0; + int memUsed=0; + int percent; + + + + while (blockNo != -1) + { + switch (mem_list[blockNo].state) + { + case MEM_free: + mem_free++; + break; + + case MEM_locked: + mem_locked++; + memUsed += mem_list[blockNo].size; + break; + + case MEM_float: + mem_floating++; + memUsed += mem_list[blockNo].size; + break; + } + + blocksUsed++; + blockNo = mem_list[blockNo].child; + } + + percent = (memUsed * 100) / total_free_memory; + + sprintf( string, "locked(%u)+float(%u)+free(%u) = %u/%u blocks (%u%% used)(cur %uk)", mem_locked, mem_floating, mem_free, blocksUsed, MAX_mem_blocks, percent, (res_man.Res_fetch_useage()/1024) ); +} +//-------------------------------------------------------------------------------------- +//-------------------------------------------------------------------------------------- |