Files
sicspsi/sinqhm/monitor.c
cvs 064ec37e9a - Rearranged directory structure for forking out ANSTO
- Refactored site specific stuff into a site module
- PSI specific stuff is now in the PSI directory.
- The old version has been tagged with pre-ansto
2003-06-20 10:18:47 +00:00

355 lines
9.3 KiB
C

/*****************************************************************************
* File: monitor.c
* Purpose: to allow a user to easily edit memory using 1,2
* or 4 byte
* words.
* Author: Scott Johnson
* Host Sys: VxWorks
* Started: 01/20/90
* Updates: 02/13/90 added my own display routine
* 03/29/90 added history
* 08/22/90 fixed repeat command (return key)
* 11/13/90 bus errors are trapped
* Mark Koennecke
* 04/02/2002 for Tornado 2.0.2
*****************************************************************************/
/* tabstop = 4 */
#include "vxWorks.h"
#include "strLib.h"
#include "stdioLib.h"
int data_type = 2; /* 1 = byte 2 = word 4 = long */
static void help(void);
static int process_command(char *command);
int monitor (int a1, int a2, int a3, int a4, int a5, int a6, int a7,
int a8, int a9, int suspend)
{
char command [80];
char input [80];
char *from_read;
printf ("VxWorks history added 03/29/90\n");
printf ("Bus Error trapping added 11/13/90\n\n");
do
{
switch (data_type)
{
case 1 : printf ("byte>"); break;
case 2 : printf ("word>"); break;
case 4 : printf ("long>"); break;
}
if ((from_read = fgets(input,79,stdin)) != EOF)
{
if ( strlen(input) == 0 && (strlen(command) != 0))
{
printf ("%s\n", command);
process_command (command);
}
else
{
printf ("%s\n", input);
process_command (input);
strcpy (command, input);
}
}
} while ((input [0] != 'q') && (from_read != EOF));
fflush (stdin);
fflush (stdout);
return 1;
}
static int process_command (command)
char *command;
{
unsigned long longInt, longVal;
unsigned short shortInt;
unsigned char byte;
unsigned char *ptr;
unsigned char *address, *size;
unsigned int start, end, value;
int scanned;
char ch;
switch (command [0])
{
case 'q' : /* user wants to quit so do nothing */
case '#' : /* comment character */
break;
case 'f' : /* block fill */
scanned=sscanf(command,"%c %x %x %x",&ch,&address,&size,&longInt);
if (scanned != 4)
printf ("usage : f address size value\n");
else
{
for (ptr = address ;(int)ptr < ((int)size + (int)address);
ptr+=data_type)
{
switch (data_type)
{
case 1 :
if (vxMemProbe (ptr, READ, data_type, &byte) != OK)
{
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
return (1);
}
else
*((unsigned char *) ptr) = byte;
break;
case 2 :
if (vxMemProbe (ptr, READ, data_type, &shortInt) != OK)
{
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
return (1);
}
else
*((unsigned short *) ptr) = shortInt;
break;
case 4 :
if (vxMemProbe (ptr, READ, data_type, &longInt) != OK)
{
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
return (1);
}
else
*((unsigned long *) ptr) = longInt;
break;
}
}
}
break;
case 's' : /* scan range */
scanned=sscanf(command,"%c %x %x %x",&ch,&start,&end,&value);
if (scanned != 4)
printf ("usage : s start end value\n");
else
{
/**
scanning does not work: some memory locations lock up!!!!
*/
printf("Scanning from %x %x for %x\n", start, end, value);
for (ptr = start ;(unsigned int)ptr < end;
ptr+=data_type)
{
switch (data_type)
{
case 1 :
if (vxMemProbe (ptr, READ, data_type, &byte) != OK)
{
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
}
else {
if((unsigned char)*ptr == value){
printf("Value found at %08x\n",ptr);
}
}
break;
case 2 :
if (vxMemProbe (ptr, READ, data_type, &shortInt) != OK)
{
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
}
else
{
if((unsigned short)*ptr == value){
printf("Value found at %08x\n",ptr);
}
}
break;
case 4 :
if (vxMemProbe (ptr, READ, data_type, &longInt) != OK)
{
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
}
else
{
if((unsigned int)*ptr == value){
printf("Value found at %08x\n",ptr);
}
}
}
}
}
printf("Finished scanning....\n");
break;
case 'l' :
data_type = 4;
break;
case 'b' :
data_type = 1;
break;
case 'w' :
if (command [1] == 'o')
data_type = 2;
else
{
scanned=sscanf(command,"%c %x %x",&ch,&ptr,&longInt);
if (scanned != 3)
printf ("usage : w address value\n");
else
{
switch (data_type)
{
case 1 :
byte = (unsigned char) longInt;
if (vxMemProbe (ptr, WRITE, data_type, &byte) != OK)
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
else
printf("%06X : %02X\n",(unsigned) ptr, byte);
break;
case 2 :
shortInt = (unsigned short) longInt;
if (vxMemProbe (ptr, WRITE, data_type, &shortInt) != OK)
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
else
printf ("%06X : %04X\n", (unsigned) ptr, shortInt);
break;
case 4 :
if (vxMemProbe (ptr, WRITE, data_type, &longInt) != OK)
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
else
printf ("%06X : %08X\n", (unsigned) ptr, longInt);
break;
}
}
}
break;
case 'r' :
scanned = sscanf (command,"%c %x", &ch,&ptr);
if (scanned != 2)
printf ("usage : r address\n");
else
{
switch (data_type)
{
case 1 :
if (vxMemProbe (ptr, READ, data_type, &byte) != OK)
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
else
printf ("%06x : %02x\n",(unsigned) ptr, byte);
break;
case 2 :
if (vxMemProbe (ptr, READ, data_type, &shortInt) != OK)
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
else
printf ("%06x : %04x\n",(unsigned) ptr, shortInt);
break;
case 4 :
if (vxMemProbe (ptr, READ, data_type, &longInt) != OK)
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
else
printf ("%06X : %08X\n", (unsigned) ptr, longInt);
break;
}
}
break;
case 'd' : /* use VxWorks display routine */
scanned = sscanf (command,"%c %x", &ch,&ptr);
if (scanned != 2)
printf ("usage : d address\n");
else
{
int x,y;
for (y=0;y<16;y++)
{
printf ("%06X-", (unsigned int) ptr);
for (x=0;x<16/data_type;x++, ptr += data_type)
{
switch (data_type)
{
case 1 :
if (vxMemProbe (ptr, READ, data_type, &byte) != OK)
{
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
return (1);
}
else
printf (" %02x", byte);
break;
case 2 :
if (vxMemProbe (ptr, READ, data_type, &shortInt) != OK)
{
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
return (1);
}
else
printf (" %04x", shortInt);
break;
case 4 :
if (vxMemProbe (ptr, READ, data_type, &longInt) != OK)
{
printf ("Bus error: address = %06x, data size = %d\n",
(unsigned int) ptr, data_type);
return (1);
}
else
printf (" %08x", longInt);
break;
}
}
printf ("\n");
}
}
break;
case 'h' :
help ();
break;
default :
printf ("Unrecognized command. Use h for help.\n");
break;
}
return 1;
}
static void help ()
{
printf ("===================================================\n");
printf ("= Monitor =\n");
printf ("= By Scott Johnson =\n");
printf ("===================================================\n");
printf ("Commands:\n");
printf ("[r]ead address..................reads given address\n");
printf ("[w]rite address value...........writes value to address\n");
printf ("[b]yte..........................read/write 8 bits\n");
printf ("[wo]rd..........................read/write 16 bits\n");
printf ("[l]ong..........................read/write 32 bits\n");
printf ("[d]isplay address...............show memory at address\n");
printf ("[f]ill address size value.......fill a block with value\n");
printf
("[s]scan start end value.........scan range between start end for value\n");
printf ("[q]uit..........................quit\n");
printf ("\n");
printf ("Features:\n");
printf ("1) Hit return to do a command again.\n");
printf ("2) VxWorks history is supported\n");
printf ("3) Redirect a script file while in the shell to easily\n");
printf (" setup multiple locations.\n");
printf (" Ex: -> monitor < script_file \n");
printf ("\n");
printf ("Remember to end script files with a 'q'\n");
printf ("\n");
}