www.pudn.com > FUN_2V.rar > ucvm9.cpp


#ifndef UCVM9_CPP 
#define UCVM9_CPP 
//--------------------------------------------------------------------------- 
TUCVM9::TUCVM9() 
{ 
    m_var_count = 0; 
    m_fun_count = 0; 
    m_ins_count = 0; 
} 
 
TUCVM9::~TUCVM9() 
{ 
    cln_var(); 
    cln_fun(); 
} 
//--------------------------------------------------------------------------- 
int TUCVM9::load_asm_file(char *file_name) 
{ 
    FILE *fp; 
 
    if((fp = fopen(file_name, "r+")) != NULL) 
    { 
        char buf_a[1024]; 
        char str_a[1024]; 
        char str_b[1024]; 
 
        int i; 
 
        for(i = 0; i < 512; i ++) 
        { 
            if(fgets(buf_a, 1022, fp) == NULL) 
                break; 
 
            str_a[0] = 0; 
            str_b[0] = 0; 
 
            sscanf(buf_a, "%s %s", str_a, str_b); 
 
            if(strcmp("push_c", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x01; 
                m_ins_array[i].ins_data = new char[1]; 
                *(char *)(m_ins_array[i].ins_data) = str_b[0]; 
            } 
            else 
            if(strcmp("push_i", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x02; 
                m_ins_array[i].ins_data = new long[1]; 
                *(long *)(m_ins_array[i].ins_data) = atoi(str_b); 
            } 
            else 
            if(strcmp("push_r", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x03; 
                m_ins_array[i].ins_data = new REAL[1]; 
                *(REAL *)(m_ins_array[i].ins_data) = atof(str_b); 
            } 
            else 
            if(strcmp("push_s", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x04; 
                m_ins_array[i].ins_data = cclone_str(str_b); 
            } 
            else 
            if(strcmp("push_v", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x05; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("pop_lo", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x06; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("add_nb", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x07; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("sub_nb", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x08; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("mul_nb", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x09; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("div_nb", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x0a; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("rem_nb", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x0b; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("umi_nb", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x0c; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("and_bt", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x0d; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("xor_bt", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x0e; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("oor_bt", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x0f; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("shl_bt", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x10; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("shr_bt", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x11; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("not_bt", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x12; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("and_lg", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x13; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("oor_lg", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x14; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("not_lg", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x15; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("assign", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x16; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("add_as", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x17; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("sub_as", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x18; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("mul_as", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x19; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("div_as", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x1a; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("rem_as", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x1b; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("and_as", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x1c; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("xor_as", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x1d; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("oor_as", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x1e; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("shl_as", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x1f; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("shr_as", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x20; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("cmp_ne", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x21; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("cmp_eq", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x22; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("cmp_le", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x23; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("cmp_ge", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x24; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("cmp_ll", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x25; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("cmp_gg", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x26; 
                m_ins_array[i].ins_data = 0; 
            } 
            else 
            if(strcmp("jmp_ez", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x27; 
                m_ins_array[i].ins_data = cclone_str(str_b); 
            } 
            else 
            if(strcmp("jmp_nz", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x28; 
                m_ins_array[i].ins_data = cclone_str(str_b); 
            } 
            else 
            if(strcmp("jmp_to", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x29; 
                m_ins_array[i].ins_data = cclone_str(str_b); 
            } 
            else 
            if(strcmp("jmp_ne", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x2a; 
                m_ins_array[i].ins_data = cclone_str(str_b); 
            } 
            else 
            if(strcmp("jmp_eq", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x2b; 
                m_ins_array[i].ins_data = cclone_str(str_b); 
            } 
            else 
            if(strcmp("jmp_le", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x2c; 
                m_ins_array[i].ins_data = cclone_str(str_b); 
            } 
            else 
            if(strcmp("jmp_ge", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x2d; 
                m_ins_array[i].ins_data = cclone_str(str_b); 
            } 
            else 
            if(strcmp("jmp_ll", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x2e; 
                m_ins_array[i].ins_data = cclone_str(str_b); 
            } 
            else 
            if(strcmp("jmp_gg", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x2f; 
                m_ins_array[i].ins_data = cclone_str(str_b); 
            } 
            else 
            if(strcmp("inc_af", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x30; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("inc_bf", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x31; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("dec_af", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x32; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("dec_bf", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x33; 
                m_ins_array[i].ins_data = search_var(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("call_f", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x34; 
                m_ins_array[i].ins_data = search_fun(str_b); 
 
                if(m_ins_array[i].ins_data == NULL) 
                    return(-2); 
            } 
            else 
            if(strcmp("label:", str_a) == 0) 
            { 
                m_ins_array[i].ins_code = 0x35; 
                m_ins_array[i].ins_data = cclone_str(str_b); 
            } 
            else 
            { 
                fclose(fp); 
                return(-1); 
            } 
        } 
 
        m_ins_count = i; 
 
        for(i = 0; i < m_ins_count; i ++) 
        { 
            if(m_ins_array[i].ins_code >= 0x27 
            && m_ins_array[i].ins_code <= 0x2f) 
            { 
                m_ins_array[i].ins_data = search_lab((char *) 
                m_ins_array[i].ins_data); 
            } 
        } 
 
        for(i = 0; i < m_ins_count; i ++) 
        { 
            if(m_ins_array[i].ins_code == 0x35) 
            { 
                delete [] ((char *)(m_ins_array[i].ins_data)); 
 
                m_ins_array[i].ins_code = 0; 
                m_ins_array[i].ins_data = 0; 
            } 
        } 
 
        fclose(fp); 
        return( 1); 
    } 
 
    return(0); 
} 
//--------------------------------------------------------------------------- 
int TUCVM9::save_ins_file(char *file_name) 
{ 
    return(0); 
} 
//--------------------------------------------------------------------------- 
int TUCVM9::reg_var(char *var_name, int var_type, void *var_addr) 
{ 
    if(m_var_count < 256) 
    { 
        if(search_var(var_name) == NULL) 
        { 
            m_var_array[m_var_count].var_name = cclone_str(var_name); 
            m_var_array[m_var_count].var_type = var_type; 
            m_var_array[m_var_count].var_addr = var_addr; 
 
            m_var_count ++; 
 
            return(1); 
        } 
    } 
 
    return(0); 
} 
//--------------------------------------------------------------------------- 
int TUCVM9::reg_fun(char *fun_name, int fun_type, FUNC  fun_addr) 
{ 
    if(m_fun_count < 256) 
    { 
        if(search_fun(fun_name) == NULL) 
        { 
            m_fun_array[m_fun_count].fun_name = cclone_str(fun_name); 
            m_fun_array[m_fun_count].fun_type = fun_type; 
            m_fun_array[m_fun_count].fun_addr = fun_addr; 
 
            m_fun_count ++; 
 
            return(1); 
        } 
    } 
 
    return(0); 
} 
//--------------------------------------------------------------------------- 
int TUCVM9::cln_var() 
{ 
    int i; 
 
    for(i = 0; i < m_var_count; i ++) 
    { 
        delete [] ((char *)(m_var_array[i].var_name)); 
    } 
 
    m_var_count = 0; 
 
    return(1); 
} 
//--------------------------------------------------------------------------- 
int TUCVM9::cln_fun() 
{ 
    int i; 
 
    for(i = 0; i < m_fun_count; i ++) 
    { 
        delete [] ((char *)(m_fun_array[i].fun_name)); 
    } 
 
    m_fun_count = 0; 
 
    return(1); 
} 
//--------------------------------------------------------------------------- 
int TUCVM9::exe_fun() 
{ 
    memset(m_dat_stack, m_dat_point = 0, sizeof(m_dat_stack)); 
 
    int i; 
 
    for(i = 0; i < m_ins_count; i += 1) 
    { 
        switch(m_ins_array[i].ins_code) 
        { 
        case 0x00: 
            break; 
 
        case 0x01: 
            m_dat_point ++; 
            m_dat_stack[m_dat_point].dat_type = UCVM9_TYPE_CHR; 
            m_dat_stack[m_dat_point].dat_addr = m_ins_array[i].ins_data; 
            break; 
 
        case 0x02: 
            m_dat_point ++; 
            m_dat_stack[m_dat_point].dat_type = UCVM9_TYPE_INT; 
            m_dat_stack[m_dat_point].dat_addr = m_ins_array[i].ins_data; 
            break; 
 
        case 0x03://push_r; 
            m_dat_point ++; 
            m_dat_stack[m_dat_point].dat_type = UCVM9_TYPE_FLT; 
            m_dat_stack[m_dat_point].dat_addr = m_ins_array[i].ins_data; 
            break; 
 
        case 0x04: 
            m_dat_point ++; 
            m_dat_stack[m_dat_point].dat_type = UCVM9_TYPE_STR; 
            m_dat_stack[m_dat_point].dat_addr = m_ins_array[i].ins_data; 
            break; 
 
        case 0x05://push_v; 
            m_dat_point ++; 
 
            m_dat_stack[m_dat_point].dat_type = 
                ((T_VAR *)(m_ins_array[i].ins_data))->var_type; 
 
            m_dat_stack[m_dat_point].dat_addr = 
                ((T_VAR *)(m_ins_array[i].ins_data))->var_addr; 
            break; 
 
        case 0x06://pop_lo; 
            if(m_dat_stack[m_dat_point].dat_free != NULL) 
            { 
                delete [] m_dat_stack[m_dat_point].dat_free; 
 
                m_dat_stack[m_dat_point].dat_free = NULL; 
            } 
 
            m_dat_point --; 
 
            break; 
 
        case 0x07://add_nb; 
            pop_rparame(); 
            pop_lparame(); 
 
            if(m_dat_lparame->dat_type == UCVM9_TYPE_FLT 
            || m_dat_rparame->dat_type == UCVM9_TYPE_FLT) 
                push_flt(lparame_to_flt() + rparame_to_flt()); 
            else 
                push_int(lparame_to_int() + rparame_to_int()); 
 
            free_rparame(); 
            free_lparame(); 
            break; 
 
        case 0x08://sub_nb; 
            pop_rparame(); 
            pop_lparame(); 
 
            if(m_dat_lparame->dat_type == UCVM9_TYPE_FLT 
            || m_dat_rparame->dat_type == UCVM9_TYPE_FLT) 
                push_flt(lparame_to_flt() - rparame_to_flt()); 
            else 
                push_int(lparame_to_int() - rparame_to_int()); 
 
            free_rparame(); 
            free_lparame(); 
            break; 
 
        case 0x09://mul_nb; 
            pop_rparame(); 
            pop_lparame(); 
 
            if(m_dat_lparame->dat_type == UCVM9_TYPE_FLT 
            || m_dat_rparame->dat_type == UCVM9_TYPE_FLT) 
                push_flt(lparame_to_flt() * rparame_to_flt()); 
            else 
                push_int(lparame_to_int() * rparame_to_int()); 
 
            free_rparame(); 
            free_lparame(); 
            break; 
 
        case 0x0a://div_nb; 
            pop_rparame(); 
            pop_lparame(); 
 
            if(m_dat_lparame->dat_type == UCVM9_TYPE_FLT 
            || m_dat_rparame->dat_type == UCVM9_TYPE_FLT) 
                push_flt(lparame_to_flt() / rparame_to_flt()); 
            else 
                push_int(lparame_to_int() / rparame_to_int()); 
 
            free_rparame(); 
            free_lparame(); 
            break; 
 
        case 0x0b://rem_nb; 
            pop_rparame(); 
            pop_lparame(); 
 
            push_int(lparame_to_int() % rparame_to_int()); 
 
            free_rparame(); 
            free_lparame(); 
            break; 
 
        case 0x0c://umi_nb; 
            pop_rparame(); 
 
            if(m_dat_rparame->dat_type == UCVM9_TYPE_FLT) 
                push_flt(- *((REAL *)(m_dat_rparame->dat_addr))); 
            else 
            if(m_dat_rparame->dat_type == UCVM9_TYPE_INT) 
                push_int(- *((long *)(m_dat_rparame->dat_addr))); 
            else 
                push_chr(- *((char *)(m_dat_rparame->dat_addr))); 
 
            free_rparame(); 
            break; 
 
        case 0x0d://and_bt; 
            pop_rparame(); 
            pop_lparame(); 
 
            push_int(lparame_to_int() & rparame_to_int()); 
 
            free_rparame(); 
            free_lparame(); 
            break; 
 
        case 0x0e://xor_bt; 
            pop_rparame(); 
            pop_lparame(); 
 
            push_int(lparame_to_int() ^ rparame_to_int()); 
 
            free_rparame(); 
            free_lparame(); 
            break; 
 
        case 0x0f://oor_bt; 
            pop_rparame(); 
            pop_lparame(); 
 
            push_int(lparame_to_int() | rparame_to_int()); 
 
            free_rparame(); 
            free_lparame(); 
            break; 
 
        case 0x10://shl_bt; 
            pop_rparame(); 
            pop_lparame(); 
 
            push_int(lparame_to_int() << rparame_to_int()); 
 
            free_rparame(); 
            free_lparame(); 
            break; 
 
        case 0x11://shr_bt; 
            pop_rparame(); 
            pop_lparame(); 
 
            push_int(lparame_to_int() >> rparame_to_int()); 
 
            free_rparame(); 
            free_lparame(); 
            break; 
 
        case 0x12://not_bt; 
            pop_rparame(); 
 
            push_int(~ rparame_to_int()); 
 
            free_rparame(); 
            break; 
 
        case 0x13://and_lg; 
            pop_rparame(); 
            pop_lparame(); 
 
            push_int(lparame_to_int() && rparame_to_int()); 
 
            free_rparame(); 
            free_lparame(); 
            break; 
 
        case 0x14://oor_lg; 
            pop_rparame(); 
            pop_lparame(); 
 
            push_int(lparame_to_int() || rparame_to_int()); 
 
            free_rparame(); 
            free_lparame(); 
            break; 
 
        case 0x15://not_lg; 
            pop_rparame(); 
 
            push_int(! rparame_to_int()); 
 
            free_rparame(); 
            break; 
 
        case 0x16://assign; 
            pop_rparame(); 
 
            switch(((T_VAR *)(m_ins_array[i].ins_data))->var_type) 
            { 
            case UCVM9_TYPE_CHR: 
                *(char *)(((T_VAR *)(m_ins_array[i].ins_data))->var_addr) = rparame_to_chr(); 
                break; 
 
            case UCVM9_TYPE_STR: 
                if(NULL != (char *)(((T_VAR *)(m_ins_array[i].ins_data))->var_addr)) 
                 delete [] (char *)(((T_VAR *)(m_ins_array[i].ins_data))->var_addr); 
 
                 (char *)(((T_VAR *)(m_ins_array[i].ins_data))->var_addr) = rparame_to_str(); 
                break; 
 
            case UCVM9_TYPE_INT: 
                *(long *)(((T_VAR *)(m_ins_array[i].ins_data))->var_addr) = rparame_to_int(); 
                break; 
 
            case UCVM9_TYPE_FLT: 
                *(REAL *)(((T_VAR *)(m_ins_array[i].ins_data))->var_addr) = rparame_to_flt(); 
                break; 
            } 
 
            free_rparame(); 
            break; 
 
        case 0x17://add_as; 
            break; 
 
        case 0x18://sub_as; 
            break; 
 
        case 0x19://mul_as; 
            break; 
 
        case 0x1a://div_as; 
            break; 
 
        case 0x1b://rem_as; 
            break; 
 
        case 0x1c://and_as; 
            break; 
 
        case 0x1d://xor_as; 
            break; 
 
        case 0x1e://oor_as; 
            break; 
 
        case 0x1f://shl_as; 
            break; 
 
        case 0x20://shr_as; 
            break; 
 
        case 0x21://cmp_ne; 
            break; 
 
        case 0x22://cmp_eq; 
            break; 
 
        case 0x23://cmp_le; 
            break; 
 
        case 0x24://cmp_ge; 
            break; 
 
        case 0x25://cmp_ll; 
            break; 
 
        case 0x26://cmp_gg; 
            break; 
 
        case 0x27://jmp_ez; 
            break; 
 
        case 0x28://jmp_nz; 
            break; 
 
        case 0x29://jmp_to; 
            break; 
 
        case 0x2a://jmp_ne; 
            break; 
 
        case 0x2b://jmp_eq; 
            break; 
 
        case 0x2c://jmp_le; 
            break; 
 
        case 0x2d://jmp_ge; 
            break; 
 
        case 0x2e://jmp_ll; 
            break; 
 
        case 0x2f://jmp_gg; 
            break; 
 
        case 0x30://inc_af; 
            break; 
 
        case 0x31://inc_bf; 
            break; 
 
        case 0x32://dec_af; 
            break; 
 
        case 0x33://dec_bf; 
            break; 
 
        case 0x34://call_f; 
            { 
                T_FUN *func; 
                long   nmbr; 
                void  *addr; 
                char   type; 
 
                func = (T_FUN *)(m_ins_array[i].ins_data); 
                nmbr = *(long *)(m_dat_stack[m_dat_point --].dat_addr); 
 
                type = func->fun_type; 
                addr = func->fun_addr(nmbr, m_dat_stack + m_dat_point); 
 
                while(nmbr -- > 0) 
                { 
                    if(m_dat_stack[m_dat_point].dat_free != NULL) 
                    { 
                        delete [] m_dat_stack[m_dat_point].dat_free; 
                        m_dat_stack[m_dat_point].dat_free = NULL; 
                    } 
 
                    m_dat_point --; 
                }; 
 
                m_dat_point ++; 
 
                m_dat_stack[m_dat_point].dat_type = type; 
 
                m_dat_stack[m_dat_point].dat_addr = 
                m_dat_stack[m_dat_point].dat_free = (char *)addr; 
            } 
            break; 
        } 
    } 
} 
//--------------------------------------------------------------------------- 
void * TUCVM9::search_fun(char *fun_name) 
{ 
    int i; 
 
    for(i = 0; i < m_fun_count; i ++) 
    { 
        if(strcmp(fun_name, (const char *)m_fun_array[i].fun_name) == 0) 
        { 
            return(m_fun_array + i); 
        } 
    } 
 
    return(0); 
} 
//--------------------------------------------------------------------------- 
void * TUCVM9::search_var(char *var_name) 
{ 
    int i; 
 
    for(i = 0; i < m_var_count; i ++) 
    { 
        if(strcmp(var_name, (const char *)m_var_array[i].var_name) == 0) 
        { 
            return(m_var_array + i); 
        } 
    } 
 
    return(0); 
} 
//--------------------------------------------------------------------------- 
void * TUCVM9::search_lab(char *lab_name) 
{ 
    int i; 
 
    for(i = 0; i < m_ins_count; i ++) 
    { 
        if(m_ins_array[i].ins_code == 0x35) 
        { 
            if(strcmp(lab_name, (const char *)m_ins_array[i].ins_data) == 0) 
            { 
                delete [] lab_name; 
 
                return(m_ins_array + i); 
            } 
        } 
    } 
 
    delete [] lab_name; 
 
    return(0); 
} 
//--------------------------------------------------------------------------- 
char * TUCVM9::cclone_str(char *str_data) 
{ 
    char *result; 
 
    result = new char[strlen(str_data) + 1]; 
 
    strcpy(result, str_data); 
 
    return(result); 
} 
//--------------------------------------------------------------------------- 
void TUCVM9::pop_rparame() 
{ 
    m_dat_rparame->dat_type = m_dat_stack[m_dat_point].dat_type; 
    m_dat_rparame->dat_addr = m_dat_stack[m_dat_point].dat_addr; 
    m_dat_rparame->dat_free = m_dat_stack[m_dat_point].dat_free; 
 
    m_dat_stack[m_dat_point].dat_free = NULL; 
 
    m_dat_point --; 
} 
//--------------------------------------------------------------------------- 
void TUCVM9::pop_lparame() 
{ 
    m_dat_lparame->dat_type = m_dat_stack[m_dat_point].dat_type; 
    m_dat_lparame->dat_addr = m_dat_stack[m_dat_point].dat_addr; 
    m_dat_lparame->dat_free = m_dat_stack[m_dat_point].dat_free; 
 
    m_dat_stack[m_dat_point].dat_free = NULL; 
 
    m_dat_point --; 
} 
//--------------------------------------------------------------------------- 
void TUCVM9::free_rparame() 
{ 
    if(m_dat_rparame->dat_free != NULL) 
        delete [] m_dat_rparame->dat_free; 
} 
//--------------------------------------------------------------------------- 
void TUCVM9::free_lparame() 
{ 
    if(m_dat_lparame->dat_free != NULL) 
        delete [] m_dat_lparame->dat_free; 
} 
//--------------------------------------------------------------------------- 
void TUCVM9::push_chr(char vchr) 
{ 
    m_dat_point ++; 
 
    m_dat_stack[m_dat_point].dat_type = UCVM9_TYPE_CHR; 
    m_dat_stack[m_dat_point].dat_addr = 
    m_dat_stack[m_dat_point].dat_free = (char *)new char[sizeof(char)]; 
 
    *(char *)(m_dat_stack[m_dat_point].dat_free) = vchr; 
} 
//--------------------------------------------------------------------------- 
void TUCVM9::push_int(long vint) 
{ 
    m_dat_point ++; 
 
    m_dat_stack[m_dat_point].dat_type = UCVM9_TYPE_INT; 
    m_dat_stack[m_dat_point].dat_addr = 
    m_dat_stack[m_dat_point].dat_free = (char *)new char[sizeof(long)]; 
 
    *(long *)(m_dat_stack[m_dat_point].dat_free) = vint; 
} 
//--------------------------------------------------------------------------- 
void TUCVM9::push_flt(REAL vflt) 
{ 
    m_dat_point ++; 
 
    m_dat_stack[m_dat_point].dat_type = UCVM9_TYPE_FLT; 
    m_dat_stack[m_dat_point].dat_addr = 
    m_dat_stack[m_dat_point].dat_free = (char *)new char[sizeof(REAL)]; 
 
    *(REAL *)(m_dat_stack[m_dat_point].dat_free) = vflt; 
} 
//--------------------------------------------------------------------------- 
char TUCVM9::rparame_to_chr() 
{ 
    if(m_dat_rparame->dat_type == UCVM9_TYPE_FLT) 
        return(*(REAL *)m_dat_rparame->dat_addr); 
    else 
    if(m_dat_rparame->dat_type == UCVM9_TYPE_INT) 
        return(*(long *)m_dat_rparame->dat_addr); 
    else 
        return(*(char *)m_dat_rparame->dat_addr); 
} 
//--------------------------------------------------------------------------- 
char TUCVM9::lparame_to_chr() 
{ 
    if(m_dat_lparame->dat_type == UCVM9_TYPE_FLT) 
        return(*(REAL *)m_dat_lparame->dat_addr); 
    else 
    if(m_dat_lparame->dat_type == UCVM9_TYPE_INT) 
        return(*(long *)m_dat_lparame->dat_addr); 
    else 
        return(*(char *)m_dat_lparame->dat_addr); 
} 
//--------------------------------------------------------------------------- 
long TUCVM9::rparame_to_int() 
{ 
    if(m_dat_rparame->dat_type == UCVM9_TYPE_FLT) 
        return(*(REAL *)m_dat_rparame->dat_addr); 
    else 
    if(m_dat_rparame->dat_type == UCVM9_TYPE_INT) 
        return(*(long *)m_dat_rparame->dat_addr); 
    else 
        return(*(char *)m_dat_rparame->dat_addr); 
} 
//--------------------------------------------------------------------------- 
long TUCVM9::lparame_to_int() 
{ 
    if(m_dat_lparame->dat_type == UCVM9_TYPE_FLT) 
        return(*(REAL *)m_dat_lparame->dat_addr); 
    else 
    if(m_dat_lparame->dat_type == UCVM9_TYPE_INT) 
        return(*(long *)m_dat_lparame->dat_addr); 
    else 
        return(*(char *)m_dat_lparame->dat_addr); 
} 
//--------------------------------------------------------------------------- 
REAL TUCVM9::rparame_to_flt() 
{ 
    if(m_dat_rparame->dat_type == UCVM9_TYPE_FLT) 
        return(*(REAL *)m_dat_rparame->dat_addr); 
    else 
    if(m_dat_rparame->dat_type == UCVM9_TYPE_INT) 
        return(*(long *)m_dat_rparame->dat_addr); 
    else 
        return(*(char *)m_dat_rparame->dat_addr); 
} 
//--------------------------------------------------------------------------- 
REAL TUCVM9::lparame_to_flt() 
{ 
    if(m_dat_lparame->dat_type == UCVM9_TYPE_FLT) 
        return(*(REAL *)m_dat_lparame->dat_addr); 
    else 
    if(m_dat_lparame->dat_type == UCVM9_TYPE_INT) 
        return(*(long *)m_dat_lparame->dat_addr); 
    else 
        return(*(char *)m_dat_lparame->dat_addr); 
} 
//--------------------------------------------------------------------------- 
char * TUCVM9::rparame_to_str() 
{ 
    if(m_dat_rparame->dat_type == UCVM9_TYPE_STR) 
        return(cclone_str((char *)m_dat_rparame->dat_addr)); 
    else 
        return(cclone_str("")); 
} 
//--------------------------------------------------------------------------- 
char * TUCVM9::lparame_to_str() 
{ 
    if(m_dat_lparame->dat_type == UCVM9_TYPE_STR) 
        return(cclone_str((char *)m_dat_lparame->dat_addr)); 
    else 
        return(cclone_str("")); 
} 
//--------------------------------------------------------------------------- 
#endif//UCVM9_CPP