#include #include #include #include "mtask.h" #include "itu.h" //#include "console.h" #include "debug.h" #define DUMP_LINE_SIZE 16 #define DUMP_LINE_HALF_SIZE 8 void hex1( char hex ) ; static const char HexChar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; static void( *DebugPort )( char a ) ; static void DumpCh( char* Address ) ; /****************************************************************************** 機能要約 機能 引き数 DumpWait: 一定時間待つための関数へのポインタ(端末によっては早すぎるので) WaitNumber: DumpWait に渡す引数 DumpStopCondition: ダンプを中止するための関数へのポインタ この関数が0以外を返すと、ダンプを終了する 戻り値 注意 ******************************************************************************/ void DumpAddress( long Start, long End, void( *DumpWait )( unsigned long a ), int WaitNumber, unsigned int( *DumpStopCondition )( void ) ) { long Address ; for( Address = Start ;Address < End; Address += DUMP_LINE_SIZE ) { Dump16Byte( ( char * )Address, -1 ) ; if( DumpWait != NULL ) { DumpWait( WaitNumber ) ; } if( DumpStopCondition != NULL ) { if( DumpStopCondition() != 0 ) { break ; } } } } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void Dump16Byte( char* Address, long DispAddress ) { int i; char* OrgAddress ; OrgAddress = Address ; if( DispAddress == -1 ) { dwordhex( ( long )Address ) ; } else { dwordhex( ( long )DispAddress ) ; } DbgOut( ':' ) ; for( i = 0 ; i < DUMP_LINE_HALF_SIZE ; i ++ ) { bytehex( *Address ) ; DbgOut( ' ' ) ; Address ++ ; } dbgprint( "- " ) ; for( i = DUMP_LINE_HALF_SIZE ; i < DUMP_LINE_SIZE ; i ++ ) { bytehex( *Address ) ; DbgOut( ' ' ) ; Address ++ ; } Address = OrgAddress ; for( i = 0 ; i < DUMP_LINE_HALF_SIZE ; i ++ ) { DumpCh( Address ) ; Address ++ ; } DbgOut( ' ' ) ; for( i = DUMP_LINE_HALF_SIZE ; i < DUMP_LINE_SIZE ; i ++ ) { DumpCh( Address ) ; Address ++ ; } DbgCrLf(); } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ static void DumpCh( char* Address ) { if( isprint( ( int )*Address ) & 0xff ) { DbgOut( *Address ) ; } else { DbgOut( '.' ) ; } } void NullPort( char a ) { } void InvalidateDebugPort( void ) { DebugPort = NullPort ; } void InitDebugPort( void( *Function )( char a ) ) { DebugPort = Function ; InitPrintf() ; } void DbgOut( char a ) { // PutCh( a ) ; DebugPort( a ) ; } void dbgprint( char* a ) { for( ; *a != 0 ; a ++ ) { //for(;;); DebugPort( *a ) ; } } void DbgPrintWithLen( char* a, int len ) { for( ; len >= 0 ; len -- ) { if( *a == 0 ) { return ; } DebugPort( *a ) ; a ++ ; } } void DbgCrLf( void ) { DebugPort( '\r' ) ; DebugPort( '\n' ) ; } /****************************************************************************** 機能要約 0〜0xf までの数字に対応するキャラクタを出力する 機能 引数 hex 出力したいデータ 戻り値 注意 ******************************************************************************/ void hex1( char hex ) { DbgOut( HexChar[ hex & 0xf ] ) ; } /****************************************************************************** 機能要約 1バイトを16進2桁で出力する 機能 引数 hex 出力したいデータ 戻り値 注意 ******************************************************************************/ void bytehex( char hex ) { hex1( hex >> 4 ) ; hex1( hex ) ; } /****************************************************************************** 機能要約 1ワードを16進4桁で出力する 機能 引数 戻り値 注意 ******************************************************************************/ void wordhex( int hex ) { bytehex( ( char )( hex >> 8 ) ) ; bytehex( ( char )hex ) ; } /****************************************************************************** 機能要約 1ワードを16進4桁で出力する 機能 引数 戻り値 注意 ******************************************************************************/ void dwordhex( unsigned long hex ) { wordhex( ( int )( hex >> 16 ) ) ; wordhex( ( int )hex ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void Dump32Byte( char* Address ) { int i; dwordhex( ( long )Address ) ; DbgOut( ':' ) ; for( i = 0 ; i < 8 ; i ++ ) { bytehex( *Address ) ; DbgOut( ' ' ) ; Address ++ ; } dbgprint( "- " ) ; for( i = 0x8 ; i < 0x10 ; i ++ ) { bytehex( *Address ) ; DbgOut( ' ' ) ; Address ++ ; } DbgCrLf(); } void DumpRam( void ) { unsigned int RecvLength1( void ) ; long Address ; Address = 0xffef10 ; for(; Address < 0xffff10 ;) { Dump32Byte( ( char * )Address ) ; Address += 16 ; if( RecvLength1() != 0 ) { break ; } } } long DigigValue(char c) { c = tolower( c ) ; if( isdigit( ( int )c ) ) return( c - '0' ) ; if( islower( ( int ) c ) ) return( c - 'a' + 10 ) ; return( 100 ) ; } long AtoL( char* s ) { long v, radix; char c, *p; p = s; for(;;) { if( isdigit( ( int )*p ) ) { break ; } if( *p == 0 ) { return( 0 ) ; } p ++ ; } c = *p; if (c != '0') radix = 10; /* decimal */ else if (*++p == 'x' || *p == 'X') p++, radix = 16; /* hexadecimal */ else radix = 8; /* octal */ v = 0; while ( ( long )(c = DigigValue(*p)) < radix) { v = v * radix + c; p++; } /* skip suffixes */ while ((c = tolower(*p)) == 'u' || c == 'l') p++; return (v); } long A10toL( char* Buf ) { // 1〜9 までの数字が出てくるまで読み飛ばし for( ; *Buf != 0 ; Buf ++ ) { if( ( '1' <= *Buf ) && ( *Buf <= '9' ) ) { return( AtoL( Buf ) ) ; } } return( 0 ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void dbgcr( char* Head ) { dbgprint( Head ) ; DbgCrLf(); } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void dbgsscr( char* Head, char* Tail ) { dbgprint( Head ) ; dbgprint( " " ) ; dbgprint( Tail ) ; DbgCrLf(); } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void dbgsws( char* Head, int Word, char* Tail ) { dbgprint( Head ) ; wordhex( Word ) ; dbgprint( Tail ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void dbgsls( char* Head, unsigned long Word, char* Tail ) { dbgprint( Head ) ; dwordhex( Word ) ; dbgprint( Tail ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void dbgswcr( char* Head, int Word ) { dbgprint( Head ) ; wordhex( Word ) ; dbgcr("") ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void dbgsbs( char* Head, char Word, char* Tail ) { dbgprint( Head ) ; bytehex( Word ) ; dbgprint( Tail ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void dbgsbcr( char* Head, char Word ) { dbgprint( Head ) ; bytehex( Word ) ; dbgcr("") ; } /****************************************************************************** 機能要約 機能 引き数 戻り値 注意 ******************************************************************************/ void OutputStrings( const char* const HowToUse[] ) { int i ; for( i = 0 ; HowToUse[ i ] != 0 ; i ++ ) { dbgcr( ( char* )HowToUse[ i ] ) ; } }