/* dm.c Display Memory Command dm [option] address [length] where: option may be -b, -w or -l address is the start address length is the number of units (acc to option) of memory locations to be displayed ASCIIs are always printed rightmost if no option given: BYTE is assumed if no length given, length is set according to size, i.e BYTE: 256 bytes HALFWORD: 128 halfwords WORD: 64 words */ #include "defs.h" void bindisplay(int size,int address,int length ,int page ) { while( length > 0 ){ length--; if( (address & 0xF) == 0){ smallprintf("\n%X ",address); } // display the memory until length is exhausted switch( size ){ /* size MUST have a legal value */ case 1: /* display byte */ puthex( (unsigned char) * ((unsigned char *) address) ); _outchar(' '); if( (address & 0xF) == 0xf ) /* last addr on line */ printable( (char *) (address-15), 16 ); address = address+1; break; case 2: /* display word */ smallprintf("%x ", (unsigned short) *(( unsigned short *) address ) ); if( (address & 0xF) == 0xE ) /* last addr on line */ printable( (char *) (address-14) ,16 ); address = address+2; break; case 4: /* display long */ smallprintf("%X ", (unsigned long) *( ( unsigned long *) address ) ); if( (address & 0xF) == 0xC ) /* last addr on line */ printable( (char *) (address-12) ,16 ); address = address+4; break; default: length = 0; // just in case } } } void dm(int argc ,char **argv ) { int size,cargc,hassize,page; int address; int length; if( (argc <= 1) || (argc >4) ) { help_dm(); return; // error } if( argv[1][0] == '-' ){ // dm -b|w|l size = getsize ( argv[1] ,1 ); cargc = 2; hassize = 1; }else{ size = 4; cargc = 1; hassize = 0; } // this has to be present ... if( ! strtoint(argv[cargc], 16, 0, &address, &page) ) { smallprintf("Illegal address"); return; } // setup default display size if(size==1) length = 256; else if(size==2) length = 128; else length = 64; if( argc == 3 ) { if( hassize ){ // dm -SIZE address }else{ // dm address length length = decval( argv[2], 1 ); } } if( argc == 4 ){ // dm -SIZE address length length = decval( argv[3], size ); } // This is only for 68000... // check for pending Adress Errors switch( size ){ case 1: break; case 2: if ( address & 1 ){ smallprintf("\nHalfword alignment violation"); restart(); } break; case 4: if ( address & 3 ){ smallprintf("\nWord alignment violation"); restart(); } break; } bindisplay(size,address,length,page); }