Fix IO memory access .. SB128 driver makes noises in VMWare - CMI is untested (Curren...
[AROS.git] / test / exec / dumpmem.c
blobeca966a61fde4e12a3b5b38339dbfa1648b33458
1 /*
2 Copyright © 1995-2004 The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Memory Dump util functions.
6 Lang: english
7 */
9 #define DEBUG 1
10 #include <aros/debug.h>
12 #include <exec/memory.h>
13 #include <dos/dos.h>
14 #include <dos/exall.h>
15 #include <dos/datetime.h>
16 #include <proto/dos.h>
17 #include <proto/utility.h>
18 #include <utility/tagitem.h>
19 #include <utility/utility.h>
21 #include <proto/alib.h>
22 #include <proto/exec.h>
23 #include <proto/dos.h>
25 #include <stdio.h>
26 #include <string.h>
27 #include <stdlib.h>
28 #include <memory.h>
30 static const char version[] = "$VER: dumpmem.c 45.0 (10.2.2004)\n";
32 #define ARG_TEMPLATE "ADDRESS/A,SIZE/N/A,SERIAL/S,QUIET/S"
34 enum
36 ARG_ADDRESS,
37 ARG_SIZE,
38 ARG_SERIAL,
39 ARG_QUIET,
40 NOOFARGS
43 /* unsigned int hextoint( char **value ); */
44 void clean_string( char *dirtystring );
46 int main(int argc, char **argv)
48 IPTR args[NOOFARGS] = { (IPTR) NULL, // ARG_ADDRESS
49 (IPTR) NULL, // ARG_SIZE
50 FALSE, // ARG_SERIAL
51 FALSE // ARG_QUIET
54 struct RDArgs *rda;
55 char outpstring[sizeof(unsigned int)*6];
56 IPTR offset,start_address,dump_size = 0;
57 int PROGRAM_ERROR = RETURN_OK;
58 char *ERROR_TEXT,*HELPTXT;
60 HELPTXT =
61 "ADDRESS The start address to dump from (in hex)\n"
62 "SIZE The number of bytes to dump\n"
63 "SERIAL If specified, output will use serial debugging instead of stdout\n"
64 "QUIET Do not display warnings\n";
66 rda = ReadArgs(ARG_TEMPLATE, args, NULL);
67 if (NULL != rda)
69 if (args[ARG_ADDRESS]!=0)
72 if (args[ARG_SIZE]!=0)
74 BOOL serial_out = (BOOL)args[ARG_SERIAL];
75 BOOL quiet_out = (BOOL)args[ARG_QUIET];
76 ULONG *sizptr = (ULONG *)args[ARG_SIZE];
77 char * pEnd;
79 if ( sizptr != NULL ) dump_size = *sizptr;
80 else PROGRAM_ERROR = RETURN_FAIL;
82 start_address = strtoul((CONST_STRPTR) args[ARG_ADDRESS], &pEnd, 16 );
83 dump_size = ( dump_size / sizeof(unsigned int));
85 if ( dump_size <= 0)
87 ERROR_TEXT = "Size must be a positive value\n";
88 PROGRAM_ERROR = RETURN_FAIL;
91 /* a quick warning */
92 if ( ( !quiet_out ) && ( PROGRAM_ERROR != RETURN_FAIL ) )
94 TEXT szInput[256];
95 printf( "\n *Some memory areas should NOT be read\n use this tool carefully!\n would you like to proceed? ");
97 gets ( szInput );
99 printf( "\n" );
101 if ( ( strncmp( szInput, "n", 1) )||( strncmp( szInput, "N", 1) ) )
103 ERROR_TEXT = "User canceled..\n";
104 PROGRAM_ERROR = RETURN_FAIL;
108 if ( PROGRAM_ERROR != RETURN_FAIL )
110 if (serial_out) kprintf("dumpmem - Memory Dump tool.\n© Copyright the AROS Dev Team.\n-----------------------------\n\nDumping From [%p] for %d bytes..\n\n", (void *)start_address, (dump_size * sizeof(unsigned int))); /* use kprintf so it is output on serial.. */
111 else printf("dumpmem - Memory Dump tool.\n© Copyright the AROS Dev Team.\n-----------------------------\n\nDumping From [%p] for %d bytes..\n\n", (void *)start_address, (int)(dump_size * sizeof(unsigned int))); /* use kprintf so it is output on serial.. */
113 for ( offset = 0 ; offset < dump_size ; offset += sizeof(unsigned int) )
115 if ( SetSignal(0L,0L) & SIGBREAKF_CTRL_C )
117 SetIoErr( ERROR_BREAK );
118 PROGRAM_ERROR = RETURN_WARN;
119 break;
122 if ( ( (offset/sizeof(unsigned int) ) % 6) == 0 )
124 if (serial_out) kprintf("0x%8.8llX ",(unsigned long long)(start_address+offset));
125 else printf("0x%8.8llX ",(unsigned long long)(start_address+offset));
128 if (serial_out) kprintf("%8.8X", (unsigned int)((IPTR *)start_address+offset)[0]); /* use kprintf so it is output on serial.. */
129 else printf("%8.8X", (unsigned int)((IPTR *)start_address+offset)[0]); /* use kprintf so it is output on serial.. */
130 sprintf( (char *) &outpstring + ((((offset/sizeof(unsigned int)) % 6) * 4)) ,"%4.4s", (char *)((IPTR *)start_address+offset)[0]);
132 if ( ((offset/sizeof(unsigned int)) % 6) == 5 )
134 clean_string( outpstring );
136 if (serial_out) kprintf(" '%24.24s' \t\n",outpstring);
137 else printf(" '%24.24s' \t\n",outpstring);
139 else
141 if (serial_out) kprintf(" ");
142 else printf(" ");
147 if (serial_out) kprintf("\n\nDump Complete. ");
148 else printf("\n\nDump Complete. ");
151 else ERROR_TEXT = HELPTXT;
153 else ERROR_TEXT = HELPTXT;
154 FreeArgs(rda);
156 else ERROR_TEXT = HELPTXT;
158 if (ERROR_TEXT) puts( ERROR_TEXT );
159 return PROGRAM_ERROR;
162 /* convert a hex string to an int - deprecated */
164 unsigned int hextoint(char **value)
166 struct CHexMap
168 char chr;
169 int value;
171 const int HexMapL = 16;
172 struct CHexMap HiHexMap[] =
174 {"0", 0}, {"1", 1},
175 {"2", 2}, {"3", 3},
176 {"4", 4}, {"5", 5},
177 {"6", 6}, {"7", 7},
178 {"8", 8}, {"9", 9},
179 {"A", 10}, {"B", 11},
180 {"C", 12}, {"D", 13},
181 {"E", 14}, {"F", 15},
182 {""}
184 struct CHexMap LoHexMap[] =
186 {"0", 0}, {"1", 1},
187 {"2", 2}, {"3", 3},
188 {"4", 4}, {"5", 5},
189 {"6", 6}, {"7", 7},
190 {"8", 8}, {"9", 9},
191 {"a", 10}, {"b", 11},
192 {"c", 12}, {"d", 13},
193 {"e", 14}, {"f", 15},
194 {""}
196 unsigned int result = 0,start=0;
198 printf(" converting %s to an int..\n",value);
200 if ((char *)value[0] == '0' && (((char *)value[1] == 'X')||((char *)value[1] == 'x') ) ) start = 2;
202 BOOL firsttime = TRUE;
204 int vallen;
206 for (vallen = start; vallen < strlen(value) ; vallen++)
208 BOOL found = FALSE;
209 int i;
211 printf(" Parsing $s\n",(char *)value[vallen]);
213 for ( i = 0 ; i < HexMapL; i++)
215 if (( (char *)value[vallen] == HiHexMap[i].chr )||( (char *)value[vallen] == LoHexMap[i].chr ))
217 if (!firsttime) result <<= 4;
218 result |= HiHexMap[i].value;
219 found = TRUE;
220 break;
223 if (!found) break;
224 firsttime = FALSE;
226 return result;
229 /* Replace all non printable characters with a '.' */
231 void clean_string( char *dirtystring )
233 int i;
235 for (i = 0 ; i < (sizeof(unsigned int) * 6) ; i++)
237 if ((dirtystring[i] < 32) || (dirtystring[i] > 126))
238 dirtystring[i] = '.';