📄 stdio.c
字号:
#include <CsAgb.h>
#include <math.h>
#include <rb_math.h>
#include <ascii.h>
#include <rbasic.h>
#include <rb_data.h>
const char in_eng[]="E ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char in_engs[]="E abcdefghijklmnopqrstuvwxyz";
const char in_num[]="N 1234567890E-.";
const char in_sybm[]="S +-*/=?\'\"<>()[]{}";
const char in_syb[]="S :;,.~`!@#$%^&*";
extern void line_list(struct comtree *com);
void rb_scroll()
{
u8 i=0;
for (i=0;i<15;i++)
{
CS_BackupScreenMem(&gScreen,0,i*10+10,239,i*10+19,VSAVE,MODE_3);
CS_RestoreScreenMem(&gScreen,0,i*10,239,i*10+9,VSAVE,MODE_3);
}
r_box(0,150,239,159,rb_bg,1);
}
void print(u8 xp,u8 yp,u16 color,char ch)//显示单个字符
{
u8 i,j;
for (i=0;i<8;i++)
for (j=0;j<8;j++)
if (ascii[ch][i] & test[j]) *(mVRAM+xp+j+240*(yp+i))=color;
else *(mVRAM+xp+j+240*(yp+i))=rb_bg;
return;
}
void printf(u8 xp,u8 yp,u16 color, char *str)
{
u8 i=0;
while (*(str+i)!='\0')
{
print(xp+8*i,yp,color,*(str+i));
i++;
}
return;
}
void prtchar(u16 color,char ch)//显示单个字符并移到光标
{
if (ch=='\n') {rb_xp=0;rb_yp++;}
else
{
print(rb_xp*8,rb_yp*10+2,color,ch);
rb_xp++;
}
if (rb_xp==30) {rb_xp=0,rb_yp++;}
if (rb_yp==16) {rb_yp=15;rb_scroll();}
}
void endl()
{
prtchar(0,'\n');
}
void Vprint(u8 xp,u8 yp,u16 color,char *str)
{
u16 i=0;
u8 x=xp,y=yp;
while (*(str+i)!='\0')
{
if (*(str+i)=='\n') {x=0;y++;i++;} //自动换行
if (x>29) {x=0;y++;}
if (y>15) {y=15;rb_scroll();}
print(x*8,y*10+2,color,*(str+i));
i++;
x++;
}
rb_xp=x;
rb_yp=y;
if (rb_xp==30) {rb_xp=0,rb_yp++;}
if (rb_yp>15) {rb_yp=15;rb_scroll();}
return;
}
void Rprint(u16 color,char *str)
{
Vprint(rb_xp,rb_yp,color,str);
}
void RBprint(char *str)
{
Vprint(rb_xp,rb_yp,rb_co,str);
}
void prt_int_num(int num,u16 color)//显示整形数字
{
u8 flag=(num<0);
char str[11]="0000000000";
u8 i;
u32 temp=1000000000;
num=abs(num);
for (i=0;i<10;i++)
{
str[i]=num/temp+48;
num=num%temp;
temp=temp/10;
}
if (flag) prtchar(color,'-');
i=0;
while (str[i]=='0' && i<9) i++;
Vprint(rb_xp,rb_yp,color,str+i);
}
void char_back()//删除屏幂上的一个字符
{
if (rb_xp==0)
{
rb_xp=29;
if (rb_yp>0) rb_yp--;
}
else rb_xp--;
r_box(rb_xp*8,rb_yp*10+2,rb_xp*8+7,rb_yp*10+9,rb_bg,1);
}
void rb_input(char *str)
{
u8 i=0;
char *items[5]={in_eng,in_engs,in_num,in_sybm,in_syb};
u8 select=0;
u8 old=0,now=0;
u8 done=1;
u8 num;
u8 xp=rb_xp,yp=rb_yp;
CS_BackupScreenMem(&gScreen,0,147,239,159,VSAVE,MODE_3);
while (TRUE)
{
if (done==1)
{
r_box(0,147,239,159,RGB(20,10,20),1);
printf(5,150,RGB(30,30,30),items[select]);
now=0;old=0;
print(5+(now+2)*8,150,RGB(10,30,10),*(items[select]+now+2));
done=0;
num=strlen(items[select])-2;
}
if (done==2)
{
print(5+(old+2)*8,150,RGB(30,30,30),*(items[select]+old+2));
print(5+(now+2)*8,150,RGB(10,30,10),*(items[select]+now+2));
old=now;
done=0;
}
CS_ReadKey();
if (CS_IsKeyDown(KEY_R))
{
done=1;
select=(select+1)%5;
}
else if(CS_IsKeyDown(KEY_L))
{
if (select==0) select=4;
else select--;
done=1;
}
else if(CS_IsKeyDown(KEY_LEFT))
{
if (now==0) now=num-1;
else now--;
done=2;
}
else if(CS_IsKeyDown(KEY_RIGHT))
{
now=(now+1)%num;
done=2;
}
else if(CS_IsKeyDown(KEY_DOWN))
{
now=(now+num/4)%num;
done=2;
}
else if(CS_IsKeyDown(KEY_UP))
{
if (now<num/4) now=num-1;
else now=now-num/4;
done=2;
}
else if(CS_IsKeyDown(KEY_A))
{
str[i]=*(items[select]+now+2);
if (i<128) i++;
str[i]='\0';
Vprint(xp,yp,RGB(30,30,30),str);
}
else if(CS_IsKeyDown(KEY_SELECT))
{
str[i]=' ';
if (i<128) i++;
str[i]='\0';
Vprint(xp,yp,RGB(30,30,30),str);
}
else if(CS_IsKeyDown(KEY_B))
{
if (i>0)
{
i--;
str[i]='\0';
char_back();
}
}
else if(CS_IsKeyDown(KEY_START))
{
CS_RestoreScreenMem(&gScreen,0,147,239,159,VSAVE,MODE_3);
return;
}
}
}
void show_float(double x,u16 color)
{
char exp[11];
u32 int_n;
int index;
char is_neg=(x<0.0);
int i;
char dot=0;
char end=0;
if (x==0.0) {prtchar(color,'0');return;}
if (is_neg) prtchar(color,'-');
x=abs(x);
index=get_int(log10(x));
x=x/power10(index);
if (x>=10) {x=x/10;index++;}
x=x+0.0000000001;
for (i=0;i<10;i++)
{
exp[i]=48+(int)x;
x=x-(int)x;
x=x*10;
}
exp[10]='\0';
end=9;
for (i=9;i>=0;i--)
{
if (exp[i]!='0') {end=i;break;}
}//冗余0的首位置
if (index>=0 && index<9)
{
if (end<index) end=index;
for (i=0;i<=end;i++)
{
prtchar(color,exp[i]);
if (i==index && end!=index) prtchar(color,'.');
}
}
else if(abs(index)>=9)
{
for (i=0;i<=end;i++)
{
prtchar(color,exp[i]);
if (i==0) prtchar(color,'.');
}
if (end==0) prtchar(color,'0');
prtchar(color,'E');
prt_int_num(index,color);
}
else
{
dot=abs(index);
for (i=0;i<dot;i++)
{
prtchar(color,'0');
if (i==0) prtchar(color,'.');
}
for (i=dot;i<=end+dot;i++) prtchar(color,exp[i-dot]);
}
}
void paint_en(u8 xp,u8 yp,u16 color,char ch)
{
u8 i,j;
for (i=0;i<8;i++)
for (j=0;j<8;j++)
if (ascii[ch][i] & test[j]) *(mVRAM+xp+j+240*(yp+i))=color;
}
void paint_ch(u8 xp,u8 yp,u16 color,char *str)//汉字显示
{
u32 loc=(str[0]-161)*94+str[1]-161;
//u32 loc=15*94+3;
u8 i;
u8 j;
u32 blit;
loc=loc*20;
for (i=0;i<10;i++)
{
blit=loc+i+i;
for (j=0;j<8;j++)
{
if (testc[j]&gHzkBuf[blit]) *(mVRAM+(yp+i)*240+xp+j)=color;
}
for (j=8;j<10;j++)
{
if (testc[j-8]&gHzkBuf[blit+1]) *(mVRAM+(yp+i)*240+xp+j)=color;
}
}
}
void write(u8 xp,u8 yp,u16 color,char *str)//屏幂显示汉字(中英文混用)
{
u32 i=0;
while (str[i]!='\0')
{
if (str[i]>127)//是汉字
{
if (xp>229)
{
xp=0;yp=yp+12;
if (yp>159) yp=0;
}
paint_ch(xp,yp,color,str+i);
i=i+2;
xp=xp+12;
}
else
{
if (xp>231)
{
xp=0;yp=yp+12;
if (yp>159) yp=0;
}
paint_en(xp,yp+2,color,str[i]);
i++;
xp=xp+8;
}
}
}
void rb_report()//错误报告
{
endl();
if (rb_error)
{
Rprint(RGB(30,30,0),rb_error_content[rb_error-1]);
Rprint(RGB(30,30,0)," IN ");
prt_int_num(rb_now_line->line,RGB(0,30,30));
endl();
line_list(rb_now_line);
}
else Rprint(RGB(30,30,0),"OK.");
endl();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -