extern void *WndAsmInspect( address addr ) { // used by examine/assembly command int i; char buff[256]; mad_disasm_data *dd; _AllocA( dd, MADDisasmDataSize() ); for( i = 0; i < 10; ++i ) { MADDisasm( dd, &addr, 0 ); MADDisasmFormat( dd, MDP_ALL, CurrRadix, buff, sizeof( buff ) ); InsMemRef( dd ); printf( "%-40s%s\n", buff, TxtBuff ); } return( NULL ); }
static void AsmSetFirst( a_window *wnd, address addr, bool use_first_source ) { int row,rows; asm_window *asw = WndAsm( wnd ); char chr; mad_disasm_data *dd; unsigned addr_len; DIPHDL( cue, ch ); _AllocA( dd, asw->ddsize ); if( IS_NIL_ADDR( addr ) || ProgPeek( addr, &chr, 1 ) != 1 ) { addr = NilAddr; } asw->ins[ 0 ].addr = addr; asw->ins[ 0 ].line = 0; addr_len = AddrToString( &addr, MAF_OFFSET, TxtBuff, TXT_LEN ) - TxtBuff; if( addr_len != asw->addr_len ) { asw->addr_len = addr_len; AsmResize( wnd ); // recusively calls this routine! WndZapped( wnd ); return; } rows = WndRows( wnd ); for( row = 0; row < rows; ++row ) { asw->ins[ row ].addr = addr; if( IS_NIL_ADDR( addr ) ) continue; if( ExactCueAt( asw, addr, ch ) ) { if( row != 0 || use_first_source ) { asw->ins[ row ].addr = addr; asw->ins[ row ].line = CueLine( ch ); ++row; if( row >= rows ) break; } } asw->ins[ row ].addr = addr; asw->ins[ row ].line = 0; if( MADDisasm( dd, &addr, 0 ) != MS_OK ) { addr = NilAddr; } } }