madimp.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 337 行
C
337 行
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: MAD imports interface.
*
****************************************************************************/
#include <stddef.h>
#include "madimp.h"
mad_client_routines *MadClient;
mad_imp_routines MadImpInterface = {
MAD_MAJOR,
MAD_MINOR,
sizeof( MadImpInterface ),
MIInit,
MIFini,
MIStateSize,
MIStateInit,
MIStateSet,
MIStateCopy,
MIAddrAdd,
MIAddrComp,
MIAddrDiff,
MIAddrMap,
MIAddrFlat,
MIAddrInterrupt,
MITypeWalk,
MITypeName,
MITypePreferredRadix,
MITypeForDIPType,
MITypeInfo,
MITypeDefault,
MITypeConvert,
MITypeToString,
MIRegistersSize,
MIRegistersHost,
MIRegistersTarget,
MIRegSetWalk,
MIRegSetName,
MIRegSetLevel,
MIRegSetDisplayGrouping,
MIRegSetDisplayGetPiece,
MIRegSetDisplayModify,
MIRegSetDisplayToggleList,
MIRegSetDisplayToggle,
MIRegModified,
MIRegInspectAddr,
MIRegWalk,
MIRegSpecialGet,
MIRegSpecialSet,
MIRegSpecialName,
MIRegFromContextItem,
MIRegUpdateStart,
MIRegUpdateEnd,
MICallStackGrowsUp,
MICallTypeList,
MICallBuildFrame,
MICallReturnReg,
MICallParmRegList,
NULL,
MIDisasmDataSize,
MIDisasmNameMax,
MIDisasm,
MIDisasmFormat,
MIDisasmInsSize,
MIDisasmInsUndoable,
MIDisasmControl,
MIDisasmInspectAddr,
MIDisasmMemRefWalk,
MIDisasmToggleList,
MIDisasmToggle,
MITraceSize,
MITraceInit,
MITraceOne,
MITraceHaveRecursed,
MITraceSimulate,
MITraceFini,
MIUnexpectedBreak,
MIDisasmInsNext,
MICallUpStackSize,
MICallUpStackInit,
MICallUpStackLevel,
};
#if defined( __386__ )
#if defined( __WATCOMC__ )
#pragma aux MADLOAD "*"
/* WD looks for this symbol to determine module bitness */
int __nullarea;
#pragma aux __nullarea "*";
#endif
#elif defined( __WINDOWS__)
#include <stdlib.h>
#include <windows.h>
#include <i86.h>
#pragma aux (pascal) MADLOAD export
typedef void (DIGENTRY INTER_FUNC)();
static HANDLE TaskId;
static HINSTANCE ThisInst;
extern mad_imp_routines *MADLOAD( mad_status *, mad_client_routines * );
#ifdef DEBUGGING
void Say( char *buff )
{
MessageBox( (HWND) NULL, buff, "IMP",
MB_OK | MB_ICONHAND | MB_SYSTEMMODAL );
}
#endif
void DIGENTRY MADUNLOAD()
{
PostAppMessage( TaskId, WM_QUIT, 0, 0 );
}
int PASCAL WinMain( HINSTANCE this_inst, HINSTANCE prev_inst,
LPSTR cmdline, int cmdshow )
/***********************************************
Initialization, message loop.
*/
{
MSG msg;
INTER_FUNC **func;
unsigned count;
struct {
INTER_FUNC *load;
INTER_FUNC *unload;
} *link;
unsigned seg;
unsigned off;
prev_inst = prev_inst;
cmdshow = cmdshow;
seg = strtoul( cmdline, &cmdline, 16 );
off = strtoul( cmdline, NULL, 16 );
if( seg == 0 || off == 0 ) return( 1 );
link = MK_FP( seg, off );
TaskId = GetCurrentTask();
ThisInst = this_inst;
func = (INTER_FUNC **)&MadImpInterface.MIInit;
count = (sizeof(mad_imp_routines)-offsetof(mad_imp_routines,MIInit))
/ sizeof( INTER_FUNC * );
while( count != 0 ) {
*func = (INTER_FUNC *)MakeProcInstance( (FARPROC)*func, this_inst );
++func;
--count;
}
link->load = (INTER_FUNC *)MakeProcInstance( (FARPROC)MADLOAD, this_inst );
link->unload = (INTER_FUNC *)MakeProcInstance( (FARPROC)MADUNLOAD, this_inst );
while( GetMessage( &msg, NULL, 0, 0 ) ) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return( 0 );
}
#elif defined( M_I86 )
#pragma aux MADLOAD "*" loadds
#else
/* nothing to do for Alpha, PowerPC etc. */
#endif
#if defined( __DOS__ ) || defined( __UNIX__ )
const char __based( __segname( "_CODE" ) ) Signature[4] = "MAD";
#endif
mad_imp_routines *MADLOAD( mad_status *status, mad_client_routines *client )
{
MadClient = client;
*status = MS_OK;
return( &MadImpInterface );
}
void *MCAlloc( unsigned amount )
{
return( MadClient->MADCliAlloc( amount ) );
}
void *MCRealloc( void *p, unsigned amount )
{
return( MadClient->MADCliRealloc( p, amount ) );
}
void MCFree( void *p )
{
MadClient->MADCliFree( p );
}
dig_fhandle MCOpen( char *name, dig_open mode )
{
return( MadClient->MADCliOpen( name, mode ) );
}
unsigned long MCSeek( dig_fhandle h, unsigned long p, dig_seek m )
{
return( MadClient->MADCliSeek( h, p, m ) );
}
unsigned MCRead( dig_fhandle h, void *d, unsigned l )
{
return( MadClient->MADCliRead( h, d, l ) );
}
void MCClose( dig_fhandle h )
{
MadClient->MADCliClose( h );
}
unsigned MCReadMem( address a, unsigned size, void *buff )
{
return( MadClient->MADCliReadMem( a, size, buff ) );
}
unsigned MCWriteMem( address a, unsigned size, void *buff )
{
return( MadClient->MADCliWriteMem( a, size, buff ) );
}
unsigned MCString( mad_string id, unsigned max, char *buff )
{
return( MadClient->MADCliString( id, max, buff ) );
}
mad_status MCAddString( mad_string id, const char *buff )
{
return( MadClient->MADCliAddString( id, buff ) );
}
unsigned MCRadixPrefix( unsigned radix, unsigned max, char *buff )
{
return( MadClient->MADCliRadixPrefix( radix, max, buff ) );
}
void MCNotify( mad_notify_type nt, void *d )
{
MadClient->MADCliNotify( nt, d );
}
unsigned MCMachineData( address a, unsigned info_type,
unsigned in_size, void *in,
unsigned out_size, void *out )
{
return( MadClient->MADCliMachineData( a, info_type, in_size, in, out_size, out ) );
}
mad_status MCAddrToString( address a, mad_type_handle th,
mad_label_kind lk, unsigned max, char *buff )
{
return( MadClient->MADCliAddrToString( a, th, lk, max, buff ) );
}
mad_status MCMemExpr( char *start, unsigned len, unsigned radix,
address *a )
{
return( MadClient->MADCliMemExpr( start, len, radix, a ) );
}
void MCAddrSection( address *a )
{
MadClient->MADCliAddrSection( a );
}
mad_status MCAddrOvlReturn( address *a )
{
return( MadClient->MADCliAddrOvlReturn( a ) );
}
system_config *MCSystemConfig( void )
{
return( MadClient->MADCliSystemConfig() );
}
mad_status MCTypeInfoForHost( mad_type_kind tk, int size, mad_type_info *mti )
{
return( MadClient->MADCliTypeInfoForHost( tk, size, mti ) );
}
mad_status MCTypeConvert( const mad_type_info *in_t, const void *in_d, const mad_type_info *out_t, void *out_d, addr_seg seg )
{
return( MadClient->MADCliTypeConvert( in_t, in_d, out_t, out_d, seg ) );
}
mad_status MCTypeToString( unsigned radix, const mad_type_info *mti, const void *data, unsigned *max, char *buff )
{
return( MadClient->MADCliTypeToString( radix, mti, data, max, buff ) );
}
void MCStatus( mad_status ms )
{
MCNotify( MNT_ERROR, &ms );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?