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 + -
显示快捷键?