📄 ucvm9.cpp
字号:
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();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -