s37txt.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,685 行 · 第 1/4 页
C
1,685 行
case ASM_S:
cur = DmpSX( cur, cur_f->op.sx, FALSE );
break;
case ASM_SX:
cur = DmpSX( cur, cur_f->op.sx, TRUE );
break;
case ASM_I:
cur = fmt_dec( cur, cur_f->op.i );
break;
}
if( --fcount == 0 )break;
*cur++ = ',';
++cur_f;
}
}
static void DmpLabel( txt_obj *obj, bead_label *bead ) {
/****************************************/
hw_sym *sym;
char *code;
char const cd[] = "*XH?F???D";
char align;
sym = bead->sym;
if( obj->opts & LST_ASM ) {
if( obj->opts & LST_OBJ ) {
fmt_hex( &obj->ocodes->c[0], bead->common.address, 5 );
}
OutSym( obj->asm->label, sym, TRUE );
align = bead->align;
switch( bead->class ) {
case LBL_EQU:
code = "EQU";
break;
case LBL_DS:
code = "DS";
break;
case LBL_DC:
code = "DC";
break;
}
fmt_str( obj->asm->code, code );
obj->asm->ops[0] = '0';
obj->asm->ops[1] = cd[align];
}
}
static void DmpBindex( txt_obj *obj, bead_bindex *bead ) {
/****************************************/
if( obj->opts & LST_ASM ) {
obj->asm->code[0] = '*';
fmt_str( obj->asm->ops, "SWITCH" );
}
if( bead->size != 0 ) {
Zoiks( ZOIKS_064 ); /* unexpanded macro */
}
}
static void DmpData( txt_obj *obj, bead_data *bead ) {
/**************************************/
int count;
offset addr;
addr = bead->common.address;
for( count = bead->rep; count > 0; --count ) {
TxtOut( obj, addr, bead->value, bead->length );
addr+= bead->length;
}
if( obj->opts & LST_ASM ) {
if( obj->opts & LST_OBJ ) {
fmt_hex( &obj->ocodes->c[0], bead->common.address, 5 );
count = bead->length;
if( count > 7 ) {
count = 7;
}
fmt_lxstr( &obj->ocodes->c[6], bead->value, count );
}
fmt_str( obj->asm->code,"DC" );
PrtData( obj->asm->ops, bead );
}
}
static void DmpStore( txt_obj *obj, bead_store *bead ) {
/**************************************/
if( obj->opts & LST_ASM ) {
fmt_str( obj->asm->code,"DS" );
obj->asm->ops[0] = 'X';
obj->asm->ops[1] = 'L';
fmt_dec( &obj->asm->ops[2], bead->length );
}
}
static void DmpAddr( txt_obj *obj, bead_addr *bead ) {
/**************************************/
byte out[4];
offset num_part;
bead_def *def;
num_part = 0;
if( bead->ref->def != NULL ) {
def = bead->ref->def;
if( def->class != BEAD_XSYM ) {
num_part = def->address;
}
}
num_part += bead->val;
Stick32( out, num_part );
TxtOut( obj, bead->common.address, out, 4 );
if( obj->opts & LST_ASM ) {
if( obj->opts & LST_OBJ ) {
fmt_hex( &obj->ocodes->c[0], bead->common.address, 5 );
fmt_hex( &obj->ocodes->c[6], num_part, 8 );
}
fmt_str( obj->asm->code,"DC" );
PrtAddr( obj->asm->ops, bead );
}
}
static void DmpInt( txt_obj *obj, bead_int *bead ) {
/**************************************/
byte out[4];
offset num_part;
num_part = bead->value;
switch( bead->size ) {
case 1 :
out[0] = num_part&0xff;
break;
case 2 :
Stick16( out, num_part );
break;
case 3 :
Stick24( out, num_part );
break;
case 4 :
Stick32( out, num_part );
break;
}
TxtOut( obj, bead->common.address, out, bead->size );
if( obj->opts & LST_ASM ) {
if( obj->opts & LST_OBJ ) {
fmt_hex( &obj->ocodes->c[0], bead->common.address, 5 );
fmt_hex( &obj->ocodes->c[6], num_part, bead->size*2 );
}
fmt_str( obj->asm->code,"DC" );
PrtInt( obj->asm->ops, bead );
}
}
static void DmpFlt( txt_obj *obj, bead_flt *bead ) {
/**************************************/
byte out[8];
fmt_double( out, bead->value );
TxtOut( obj, bead->common.address, out, bead->size );
if( obj->opts & LST_ASM ) {
if( obj->opts & LST_OBJ ) {
fmt_hex( &obj->ocodes->c[0], bead->common.address, 5 );
fmt_lxstr( &obj->ocodes->c[6], out, bead->size );
}
fmt_str( obj->asm->code,"DC" );
PrtFlt( obj->asm->ops, bead );
}
}
static void DmpDisp( txt_obj *obj, bead_disp *bead ) {
/**************************************/
byte out[4];
offset num_part;
bead_def *def;
num_part = 0;
def = bead->ref->def;
num_part = def->address;
num_part += bead->val;
def = bead->base->def;
if( bead->op_len & DISP_SUB ) {
num_part -= def->address;
} else {
num_part += def->address;
}
switch( bead->op_len & DISP_LEN ) {
case 1 :
out[0] = num_part&0xff;
break;
case 2 :
Stick16( out, num_part );
break;
case 3 :
Stick24( out, num_part );
break;
case 4 :
Stick32( out, num_part );
break;
}
TxtOut( obj, bead->common.address, out, bead->op_len & DISP_LEN );
if( obj->opts & LST_ASM ) {
if( obj->opts & LST_OBJ ) {
fmt_hex( &obj->ocodes->c[0], bead->common.address, 5 );
fmt_hex( &obj->ocodes->c[6], num_part,(bead->op_len&DISP_LEN)*2 );
}
fmt_str( obj->asm->code,"DC" );
PrtDisp( obj->asm->ops, bead );
}
}
static char *PrtData( char *cur, bead_data *bead ) {
/************** print data bead *******/
char *data;
cur = fmt_dec( cur, bead->rep );
*cur++ = 'X';
*cur++ = '\'';
data = bead->value;
cur = fmt_lxstr( cur, bead->value, bead->length );
*cur++ = '\'';
return( cur );
}
static char *PrtAddr( char *cur, bead_addr *bead ) {
/**************************************/
hw_sym *ref;
*cur++ = 'A';
*cur++ = '(';
ref = bead->ref;
cur = OutSym( cur, ref, TRUE );
if( bead->val != 0 ) {
*cur++ = '+';
cur = fmt_dec( cur, bead->val );
}
ref = bead->rel;
if( ref != NULL ){
*cur++ = '-';
cur = OutSym( cur, ref, TRUE );
}
*cur++ = ')';
return( cur );
}
static char *PrtInt( char *cur, bead_int *bead ) {
/**************************************/
offset num_part;
num_part = bead->value;
switch( bead->size ) {
case 1 :
*cur++ = 'X';
*cur++ = '\'';
cur = fmt_hex( cur, num_part, 2 );
*cur++ = '\'';
break;
case 2 :
*cur++ = 'H';
*cur++ = '\'';
cur = fmt_dec( cur, num_part );
*cur++ = '\'';
break;
case 3 :
*cur++ = 'X';
*cur++ = 'L';
*cur++ = '3';
*cur++ = '(';
cur = fmt_dec( cur, num_part );
*cur++ = ')';
break;
case 4 :
*cur++ = 'F';
*cur++ = '\'';
cur = fmt_dec( cur, num_part );
*cur++ = '\'';
break;
}
return( cur );
}
static char *PrtFlt( char *cur, bead_flt *bead ) {
/**************************************/
double num_part;
char num_str[20];
num_part = bead->value;
if( bead->size == 4 ) {
*cur++ = 'E';
} else {
*cur++ = 'D';
}
*cur++ = '\'';
sprintf( num_str, "%E", num_part );
cur = fmt_str( cur, num_str );
*cur++ = '\'';
return( cur );
}
static char *PrtDisp( char *cur, bead_disp *bead ) {
/**************************************/
*cur++ = 'A';
*cur++ = 'L';
cur = fmt_dec( cur, bead->op_len & DISP_LEN );
*cur++ = '(';
cur = OutSym( cur, bead->ref, TRUE );
if( bead->val != 0 ) {
*cur++ = '+';
cur = fmt_dec( cur, bead->val );
}
*cur++ = bead->op_len & DISP_SUB ? '-' : '+';
cur = OutSym( cur, bead->base, TRUE );
*cur++ = ')';
return( cur );
}
static void DmpXsym( txt_obj *obj, bead_xsym *bead ) {
/*********************************/
char *code;
char *id_area;
if( bead->class == XSYM_CSECT ) {
TxtFlush( obj );
obj->csect = bead->id;
obj->address = bead->common.address;
}
if( _IsntModel( ASM_OUTPUT ) ) {
return;
}
if( obj->opts & LST_ASM ) {
switch( bead->class ) {
case XSYM_CSECT:
code = "CSECT";
id_area = obj->asm->label;
break;
case XSYM_EXTRN:
code = "EXTRN";
id_area = obj->asm->ops;
break;
case XSYM_ENTRY:
code = "ENTRY ";
id_area = obj->asm->ops;
break;
}
OutSym( id_area, bead->sym, TRUE );
fmt_str( obj->asm->code, code );
}
}
static void DmpUsing( txt_obj *obj, bead_using *bead ) {
/*********************************/
char *cur;
bead_def *using_start;
if( bead->sym ) {
using_start = bead->sym->def;
} else {
using_start = (bead_def* )bead;
}
obj->using.base_reg = bead->reg;
obj->using.base_disp = using_start->address;
if( obj->opts & LST_ASM ) {
if( obj->opts & LST_OBJ ) {
fmt_hex( &obj->ocodes->c[27], using_start->address, 5 );
}
fmt_str( obj->asm->code, "USING" );
cur = obj->asm->ops;
if( bead->sym ) {
cur = OutSym( cur, bead->sym, TRUE );
} else {
*cur++ = '*';
}
*cur++ = ',';
fmt_dec( cur, bead->reg );
}
}
static void DmpDrop( txt_obj *obj, bead_drop *bead ) {
/*********************************/
obj->using.base_reg = 0;
obj->using.base_disp = -1;
if( obj->opts & LST_ASM ) {
fmt_str( obj->asm->code, "DROP" );
fmt_dec( obj->asm->ops, bead->reg );
}
}
static bead_def *DmpLtorg( txt_obj *obj, bead_ltorg *bead ) {
/*********************************/
bead_def *current, *done;
lst_opts curr_opts;
current = (bead_def *)bead;
if( obj->opts & LST_ASM ) {
fmt_str( obj->asm->code, "LTORG" );
curr_opts = obj->opts;
if( !(obj->opts & LST_OBJ) ) {
obj->opts &= ~LST_ASM;
}
current = current->next; /*skip ltorg */
done = bead->end->next; /* end is last in pool */
while( current != done ){
if( obj->opts & LST_ASM ){
PutAsm( obj );
}
switch( current->class ){
case BEAD_ADDR:
DmpAddr( obj, (bead_addr*)current );
break;
case BEAD_INT:
DmpInt( obj, (bead_int*)current );
break;
case BEAD_FLT:
DmpFlt( obj, (bead_flt*)current );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?