hankerstudio hankerstudio
关注数: 14 粉丝数: 91 发帖数: 310 关注贴吧数: 26
纸娃娃系统实现浮点数打印, sprintf(s, "%f", fv)的实现 在纸娃娃系统中, 有用过 sprintf(s, "%f", fv) 这个方法的, 都知道只会输出 "######", 无法正常输出数值 在不改变底层stdlib包的情况下, 我们可以把%f 改成 %s, 即将浮点数先转化成字符串,再打印, 下面代码直接用吧^_^ int float2str(float v) { int len = 7; struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR; char *c = (char *)memman_alloc_4k(memman, 32); //此处不可以char c[32]; 局部变量地址无法返回 char c0[32]; int i,j=0,v1=0,v1l=0,v2=0,v2l=0; v1 = (int)v; v -= v1; if(v1 > 0) {sprintf(c0, "%d", v1); j = strlen(c0);} else { j = 0; } if(j >= len) { //7位以上,超出精度直接放弃 2^31-1 = 2147483647 sprintf(c, "%d", v1); return (int)c; } //计算整数部分位数 int v1t = v1; while(v1t > 0) { v1t /= 10; v1l++; } v2l = len - (v1l > 1 ? v1l : 1); //得到小数部分可精确的位数, 整数长度最少为1, 0.xxx, 0也算一位 for(i = 0; i < v2l; i++) { v *= 10; v2 *= 10; v2 += (int)v; v -= (int)v; } if((int)(v*10) >= 5) { //四舍五入 v2 += 1; //五入 //四舍五入后验证是否有进位整数 int pre = 1; for(i = 0; i < v2l; i++) { pre *= 10; } if (v2 == pre) { //只有一种情况会进位,就是999 + 1 = 1000(例:保留3位小数时) v1 += 1; v2 = 0; v2l = 0; sprintf(c, "%d", v1); return (int)c; } } if(v2 == 0) { v2l = 0; } //去除小数最后的0 while(v2 % 10 == 0) { //=0说明后面带0 v2l--; v2 /= 10; } c0 = "%d.%0nd"; //小数位数最多为7位,所以此处只用一个n占位 c0[5] = v2l + 0x30; //将占位符换成数字 sprintf(c, c0, v1, v2); return (int)c; } //调用 float fv = 1.00301f; char *fvstr = (char*)float2str(fv); sprintf(s, "%s", fvstr); //输出结果: 1.00301
纸娃娃系统鼠标API的实现 两种实现思路 一. 发送原始鼠标数据给应用, 由应用解析鼠标x,y,btn值 (此思路未实现, 应用中解析鼠标数据是可行的, 但目前无法在应用中获取鼠标初始位置, 与应用的当前位置与尺寸) 二. 发送解析后的鼠标数据给应用, 同时把鼠标的x,y值处理成相对于应用的x,y值(当前屏幕鼠标x, y分别减去应用的left, top, 得到鼠标在应用中的x,y值, 同时判断鼠标是否在应用尺寸内, 超出应用的鼠标值置为-1, 应用中获取到-1时不响应鼠标即可), 此思路实现简单, 具体实现如下分析: 1. 在bookpack.h中 ...... extern int MOUSEX, MOUSEY, MOUSEBTN; /* 将这三个变量定义为全局变量,键盘接口中需要使用*/ ...... 2. 在bookpack.c中 ..... for(;;) { ...... else if (512 <= i && i <= 767) { /*鼠标数据*/ if (mouse_decode(&mdec, i - 512) != 0) { /* 这里添加开始 */ if ((key_win != 0) && (shtctl->top >= 12)) { //桌面图标10+桌面1+鼠标1,这些不发送 fifo32_put(&key_win->task->fifo, i); //将鼠标数据发给应用 }else{ key_win = 0; } /* 这里添加结束 */ /* 鼠标指针的移动 */ mx += mdec.x; my += mdec.y; if (mx < 0) { mx = 0; } if (my < 0) { my = 0; } if (mx > binfo->scrnx - 1) { mx = binfo->scrnx - 1; } if (my > binfo->scrny - 1) { my = binfo->scrny - 1; } new_mx = mx; new_my = my; MOUSEX = mx; //////这里添加 MOUSEY = my; //////这里添加 MOUSEBTN = mdec.btn; //////这里添加 ...... 3. 在console.c中 ...... int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax) { ...... } else if (edx == 15) { ...... if (i >= 512 && i <= 767) { /*512~767是鼠标数据*/ int x, y, b; extern int MOUSEX, MOUSEY, MOUSEBTN; //从bookpack中得到当前鼠标值 unsigned long int mdec = 0; /* sbxxxxyyyy 无符号int最大值4294967295,所以最大鼠标坐标[9496,7295], 其中第1位固定1作为鼠标数据标识,第2位作为鼠标按键值,第3~6位为X坐标,第7~10位为Y坐标 */ sht = shtctl->sheets[shtctl->top-1]; /* 不在当前窗体或鼠标不在窗体内的返回-1*/ x = ((sht->height != shtctl->top -1) || (MOUSEX - sht->vx0 < 0) || (MOUSEX - sht->vx0 - sht->bxsize > 0)) ? -1 : (MOUSEX - sht->vx0); y = ((sht->height != shtctl->top -1) || (MOUSEY - sht->vy0 < 0) || (MOUSEY - sht->vy0 - sht->bysize > 0)) ? -1 : (MOUSEY - sht->vy0); b = sht->height == shtctl->top -1 ? MOUSEBTN : 0; if (x < 0 || y < 0) { mdec = -1; } else { mdec += x; //X mdec += y * 10000; //Y mdec += b * 100000000; //Btn mdec += 1 * 1000000000; //标识, 把鼠标数据变成一个很大的值与其它数据区分出来 } reg[7] = mdec; return 0; } ...... 4. 应用中 ...... void HariMain(void) { ...... int m_x, m_y, m_btn; int i; for (;;) { i = api_getkey(1); if ( i > 1000 ) { //得到鼠标数据 i -= 1000000000; m_btn = (int) (i / 100000000); i %= 100000000; m_x = (int) (i / 10000); i %= 10000; m_y = (int) i; //鼠标操作 } else { //其它数据为键盘数据 //键盘操作 } } api_end(); } ...... 至此就可以愉快的在应用中玩耍鼠标了, 小日子说的半天能完成鼠标API还真的没说假话, 只是我太笨一开始没想到这个思路, 尝试+调试差不多花2个小时, 前面想到的用独立的一个接口传送鼠标数据性能不是很好,要用定时器不停的获取当前鼠标数据, 浪费了很多系统资源, 用这个键盘api通过系统中断发送数据资源就省了好多, 做东东前, 还是要多想,多试^_^ 继续努力~
纸娃娃系统中文键盘全键值实现(包括方向键) bootpack.h 第一行插入添加键值定义 //键值 #define F1 -1 #define F2 -2 #define F3 -3 #define F4 -4 #define F5 -5 #define F6 -6 #define F7 -7 #define F8 -8 #define F9 -9 #define F10 -10 #define F11 -11 #define F12 -12 #define ESC -350 //Esc退出 #define BCK 0x08 //Backspace回格 #define TAB 0x09 //Tab制表 #define LSH -158 //Shift左上档 #define LCT -187 //Ctrl左控制 #define LAL -141 //Alt左换档 #define FXU -111 //方向上↑ #define FXD -112 //方向下↓ #define FXL -113 //方向左← #define FXR -114 //方向右→ #define XEN -120 //Enter小键盘回车 #define RCT -121 //Ctrl右控制 #define XXG -122 // / 小键盘斜杠 #define RSH -123 //Shift右上档 #define RAL -124 //Alt右换档 #define HME -125 //Home起始 #define PGU -126 //PgUp上页 #define END -127 //END #define PGD -128 //PgDn下页 #define INS -129 //Insert插入 #define DEL -130 //Delete删除 #define WIN -131 //Window左窗口 #define RMN -132 //Menu右菜单 以上的具体数值可以自定义,我都定义为负数, 免得与现有键值冲突 bootpack.c 修改与添加 //3A+BA=capslock, 45+C5=NUM, E0+5B=左窗口, E0+38=右ALT, E0+5D=右菜单, E0+1D=右Ctrl, E0+36=右Shift //E0+1C=小回车, E0+53=DEL, E0+4F=END, E0+51=PgDn, E0+52=Insert, E0+47=HOME, E0+49=PgUp, E0+35=小/ //E0+48=方向上, E0+50=方向下, E0+4B=方向左, E0+4D=方向右 static char keytable0[0x80] = { 0, ESC, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', BCK, TAB, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '[', ']',0x0a, LCT, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';','\'', '`', LSH,'\\', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.', '/', 0, '*', LAL, ' ', 0, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', 0, 0, 0, F11, F12, 0, 0, 0, FXU, FXD, FXL, FXR, XEN, RCT, XXG, RSH, RAL, HME, PGU, END, PGD, INS, DEL, WIN, RMN, 0, 0, 0, 0, 0, 0, 0x5c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x5c, 0, 0 }; static char keytable1[0x80] = { 0, ESC, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', BCK, TAB, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}',0x0a, 0, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '~', 0, '|', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', 0, '*', 0, ' ', 0, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', 0, 0, F11, F12, 0, 0, 0, 0, FXU, FXD, FXL, FXR, XEN, RCT, XXG, RSH, RAL, HME, PGU, END, PGD, INS, DEL, WIN, RMN, 0, 0, 0, 0, 0, 0, '_', 0, 0, 0, 0, 0, 0, 0, 0, 0, '|', 0, 0 };在 for (;;) { 里面的 } else { i = fifo32_get(&fifo); //当前键值 j = fifo.buf[(fifo.q-2 + fifo.size) % fifo.size]; //上一个键值 /*********添加这个***********/ ...... if (256 <= i && i <= 511) { /*键盘数据*/ if (i < 0x80 + 256) { /*将按键编码转换为字符编码*/ /********添加开始*********/ if (j == 0xE0 + 256) { //特殊键 if(i == 0x1C + 256) { i = 0x60 + 256; } //小键盘回车 if(i == 0x1D + 256) { i = 0x61 + 256; } //右Ctrl if(i == 0x35 + 256) { i = 0x62 + 256; } //小键盘/ if(i == 0x36 + 256) { i = 0x63 + 256; } //右Shift if(i == 0x38 + 256) { i = 0x64 + 256; } //右ALT if(i == 0x47 + 256) { i = 0x65 + 256; } //HOME if(i == 0x49 + 256) { i = 0x66 + 256; } //PgUp if(i == 0x4F + 256) { i = 0x67 + 256; } //END if(i == 0x51 + 256) { i = 0x68 + 256; } //PgDn if(i == 0x52 + 256) { i = 0x69 + 256; } //Insert if(i == 0x53 + 256) { i = 0x6A + 256; } //DEL if(i == 0x5B + 256) { i = 0x6B + 256; } //左窗口 if(i == 0x5D + 256) { i = 0x6C + 256; } //右菜单 //冲突值, 这里 if(i == 0x48 + 256) { i = 0x5C + 256; } //方向键上 if(i == 0x50 + 256) { i = 0x5D + 256; } //方向键下 //这个修改后的值与原右菜单值冲突,需要放到它的后面 if(i == 0x4B + 256) { i = 0x5E + 256; } //方向键左 if(i == 0x4D + 256) { i = 0x5F + 256; } //方向键右 } /*******添加结束*******/ if (key_shift == 0) { s[0] = keytable0[i - 256]; } else { s[0] = keytable1[i - 256]; } } else { s[0] = 0; } ...... if (i == 256 + 0x63) {/*右Shift ON */ /********修改*********/ key_shift |= 2; } console.c 控制台使用方向
第一个鼠标应用 <井字棋游戏> //zjq.c #include "apilib.h" #include <stdio.h> #include <string.h> int rand(void);/*产生0~32767的随机数*/ void init_x(int win, unsigned char *buf, int x0, int y0); void init_o(int win, unsigned char *buf, int x0, int y0); void init_bc(int win, unsigned char *buf, int x0, int y0); void init_game(int win, unsigned char *buf); void game_start(int win, unsigned char *buf); void win_onclick(int win, unsigned char *buf, int mx, int my); void init_pre(int win, unsigned char *buf); void game_click(int win, unsigned char *buf, int x, int y); void game_end(int win, int now); int btnw=32, btnh=32, w=220, h=180; //每一格的尺寸 int game_status = 0; //0.未开始 1.开始 2.结束 int bc = 8; //背景色 0xc6c6c6 static char ico_x[32][32] = { //X "0000........................0000", ".0000......................0000.", "..0000....................0000..", "..0000....................0000..", "...0000..................0000...", "....0000................0000....", ".....0000..............0000.....", ".....0000..............0000.....", "......0000............0000......", "......0000............0000......", ".......0000..........0000.......", "........0000........0000........", ".........0000......0000.........", "..........0000....0000..........", "...........0000..0000...........", "...........0000000000...........", "...........0000000000...........", "...........0000..0000...........", "..........0000....0000..........", ".........0000......0000.........", "........0000........0000........", ".......0000..........0000.......", "......0000............0000......", "......0000............0000......", ".....0000..............0000.....", ".....0000..............0000.....", "....0000................0000....", "...0000..................0000...", "...0000..................0000...", "..0000....................0000..", ".0000......................0000.", "0000........................0000" }; static char ico_o[32][32] = { //O "............22222222............", ".........22222222222222.........", ".......222222......222222.......", "......2222............2222......", ".....222................222.....", "....222..................222....", "...222....................222...", "..222......................222..", "..22........................22..", ".222........................222.", ".22..........................22.", ".22..........................22.", "222..........................222", "22............................22", "22............................22", "22............................22", "22............................22", "22............................22", "22............................22", "222..........................222", ".22..........................22.", ".22..........................22.", ".222........................222.", "..22........................22..", "..222......................222..", "...222....................222...", "....222..................222....", ".....222................222.....", "......2222............2222......", ".......222222......222222.......", ".........22222222222222.........", "............22222222............" }; //记录游戏点击的落子是x还是o, 1.x, 2.o //三行三列正斜反斜(8种情况)有相同时结束 int game[3][3] = { {0,0,0}, {0,0,0}, {0,0,0} }; int game_now = 0; //当前落子, 0.清除, 1.x, 2.o void HariMain(void) { int win; int mx=0, my=0, mbtn=0, mx0=0, my0=0, mbtn0=0; char buf[w * h]; api_initmalloc(); win = api_openwin(buf, w, h, -1, "井字棋"); init_game(win, buf); for (;;) { mx = api_getmousex(); my = api_getmousey(); mbtn = api_getmousebtn(); if((mx == mx0) && (my == my0) && (mbtn == mbtn0)) { sleep(1); //api_sleep(1); //这个还有bug未解决先弃用 continue; } if ((mbtn & 0x01) != 0) { //单击 win_onclick(win, buf, mx, my); } mx0 = mx; my0 = my; mbtn0 = mbtn; } api_end(); } void win_onclick(int win, unsigned char *buf, int mx, int my) { int x, y, bs=40, b=2; //九格x,y坐标, [0,0]代表第一格即左上角的格 if (mx < 0 || my < 0) { //不在窗体内的点击 不操作 return; } if ((game_status == 0) && (10 <= mx) && (mx <= 52) && (130 <= my) && (my <= 158)) { //点击了开始按钮 game_start(win, buf); } if ((game_status == 1) && (74 <= mx) && (mx <= 200) && (38 <= my) && (my <= 164)) { //点击了九格之内 //找出具体点在哪格 x = (int)((my - 38) / (bs + b)); y = (int)((mx - 72) / (bs + b)); game_click(win, buf, x, y); } if ((game_status == 2) && (10 <= mx) && (mx <= 52) && (130 <= my) && (my <= 158)) { //点击任意地方重新开始 init_game(win, buf); } } void game_click(int win, unsigned char *buf, int x, int y) { int x0, y0; //实际坐标值 if (game[x][y] > 0) { return; } //已经有子的不可以再下 x0 = 74 + 42 * y + 4; //格子是40*40, 边是2, 图标是32*32, 所以要从格子的 4*4开始画图 y0 = 38 + 42 * x + 4; if (game_now == 1) { init_x(win, buf, x0, y0); } else if (game_now == 2) { init_o(win, buf, x0, y0); } game[x][y] = game_now; game_now = game_now == 1 ? 2 : 1; //换另一个下 init_pre(win, buf); chk_end(win, buf); } void chk_end(int win, unsigned char *buf) { int x,y,i; for (x = 0; x < 3; x++){ //行 if (game[x][0] > 0 && game[x][0] == game[x][1] && game[x][1] == game[x][2]) { game_end(win, game[x][0]); } } for (y = 0; y < 3; y++){ //列 if (game[0][y] > 0 && game[0][y] == game[1][y] && game[1][y] == game[2][y]) { game_end(win, game[0][y]); } } if (game[0][0] > 0 && game[0][0] == game[1][1] && game[1][1] == game[2][2]) { //反斜 game_end(win, game[0][0]); } if (game[0][2] > 0 && game[0][2] == game[1][1] && game[1][1] == game[2][0]) { //正斜 game_end(win, game[0][2]); } i = 1; for (x = 0; x < 3; x++) { for (y = 0; y < 3; y++) { if (game[x][y] == 0) { i = 0; break; } } } if (i == 1) { game_end(win, 0); //平局 } } void game_end(int win, int now) { game_status = 2; //游戏结束 char *s; if (now == 0) { s = "平局了!"; } else { sprintf(s, "%s 羸了~", now == 1 ? "X" : "O"); } api_boxfilwin(win, 60, 50, 158, 88, 6); api_putstrwin(win, 84, 60, 0 /*黑色*/, strlen(s), s); //COL8_000000 api_refreshwin(win, 60, 50, 158, 88); api_boxfilwin(win, 10, 130, 52, 158, 6 /*浅蓝色*/); //开始按钮 api_putstrwin(win, 15, 136, 0 /*黑色*/, 4, "重来"); //COL8_000000 api_refreshwin(win, 10, 130, 52, 158); } void init_pre(int win, unsigned char *buf) { if (game_now == 1) { init_x(win, buf, 15, 35); init_bc(win, buf, 15, 77); } else if (game_now == 2) { init_bc(win, buf, 15, 35); init_o(win, buf, 15, 77); } } void game_start(int win, unsigned char *buf) { int begin=0,i; if(game_status == 1) { return;} //已经点过开始了 game_status = 1; i = api_getsecond(); //时间因子(秒数^_^) for(; i >= 0; i--) { begin = rand();} //加入了时间因子更随机 if(begin % 2 == 0){ //第一个是X, 把O干掉 game_now = 1; } else { //第一个是O, 把X干掉 game_now = 2; } init_pre(win, buf); api_boxfilwin(win, 10, 130, 52, 158, 6 /*浅蓝色*/); //开始按钮 api_putstrwin(win, 15, 136, 15, 4, "开始"); //COL8_000000 api_refreshwin(win, 10, 130, 52, 158); } void init_game(int win, unsigned char *buf) { int i, bx=72, by=36, bs=40, b=2, x, y; game_status = 0; for(x = 0; x < 3; x++){ for(y = 0; y < 3; y++){ game[x][y] = 0; } } for (y = 21; y < h - 5; y++) {//整个界面重画,除标题 for (x = 5; x < w - 5; x++) { buf[y * w + x] = bc; } } api_refreshwin(win, 5, 21, w - 5, h - 5); //刷新界面 init_x(win, buf, 15, 35); init_o(win, buf, 15, 77); api_boxfilwin(win, 10, 130, 52, 158, 6 /*浅蓝色*/); //开始按钮 api_putstrwin(win, 15, 136, 0 /*黑色*/, 4, "开始"); //COL8_000000 /*开始画格子*/ for(i = 0; i < 4; i++) { //每格式大小为 40 * 40, 图大小为 32 * 32 api_boxfilwin(win, bx, by + i * (bs+b), bx + 2 + (bs+b)*3, by + 2 + i * (bs+b), 15 /*暗灰色*/); //横 api_boxfilwin(win, bx + i * (bs+b), by, bx + 2 + i * (bs+b), by + 2 + (bs+b)*3, 15 /*暗灰色*/); //竖 } api_refreshwin(win, 0, 0, w, h); /*可点击位置*/ /* 1. 开始按钮: ([10,130][52,158]) 2. 井字格 ([74, 38][114, 78]), ([116, 38][156, 78]), ([158, 38][198, 78]) ([74, 80][114,120]), ([116, 80][156,120]), ([158, 80][198, 80]) ([74,122][114,162]), ([116,122][156,162]), ([158,162][198,162]) */ } void init_x(int win, unsigned char *buf, int x0, int y0){ //刷新范围是x0,y0=>x0+32,y0+32 int x, y, xs, ys; if(btnh + y0 > h) { ys = h; } else { ys = btnh + y0; } if(btnw + x0 > w) { xs = w; } else { xs = btnw + x0; } for (y = y0; y < ys; y++) { for (x = x0; x < xs; x++) { if (ico_x[y-y0][x-x0] == '.') { buf[y * w + x] = bc; } else { buf[y * w + x] = ico_x[y-y0][x-x0] - 48; //字符数字转数字 } } } api_refreshwin(win, x0, y0, xs, ys); return; } void init_o(int win, unsigned char *buf, int x0, int y0){ //刷新范围是x0,y0=>x0+32,y0+32 int x, y, xs, ys; if(btnh + y0 > h) { ys = h; } else { ys = btnh + y0; } if(btnw + x0 > w) { xs = w; } else { xs = btnw + x0; } for (y = y0; y < ys; y++) { for (x = x0; x < xs; x++) { if (ico_o[y-y0][x-x0] == '.') { buf[y * w + x] = bc; } else { buf[y * w + x] = ico_o[y-y0][x-x0] - 48; //字符数字转数字 } } } api_refreshwin(win, x0, y0, xs, ys); return; } void init_bc(int win, unsigned char *buf, int x0, int y0){ //刷新范围是x0,y0=>x0+32,y0+32 int x, y, xs, ys; if(btnh + y0 > h) { ys = h; } else { ys = btnh + y0; } if(btnw + x0 > w) { xs = w; } else { xs = btnw + x0; } for (y = y0; y < ys; y++) { for (x = x0; x < xs; x++) { buf[y * w + x] = bc; } } api_refreshwin(win, x0, y0, xs, ys); return; } 鼠标api相关 //console.c } else if (edx == 30) { /* 鼠标X坐标 */ reg[7] = sht->height == shtctl->top -1 ? (MOUSEX - sht->vx0) : -1; //当前窗体在最前面时才返回值 } else if (edx == 31) { /* 鼠标Y坐标 */ reg[7] = sht->height == shtctl->top -1 ? (MOUSEY - sht->vy0) : -1; } else if (edx == 32) { /* 鼠标按键值 */ reg[7] = MOUSEBTN; } else if (edx == 33) { /* 休眠 */ api33_sleep(cons->timer, task, ecx); } else if (edx == 34) { /* 获取秒数(应用中随机数时会用到) */ reg[7] = get_sec_hex(); }
鼠标API 小白的实现方法(大佬们不愿意分享T_T) 1.apilib.h添加, //本人是真正的小白, 不会通过结构体传值, 只能把鼠标的X, Y, 和点击 一个个传了 int api_getmousex(void); int api_getmousey(void); int api_getmousebtn(void); void api_sleep(int time); 2. apilib目录下添加 1) api030.nas (文件名自己定义) [FORMAT "WCOFF"] [INSTRSET "i486p"] [BITS 32] [FILE "api030.nas"] GLOBAL_api_getmousex [SECTION .text] _api_getmousex:; int api_getmousex(void); MOVEDX,30 INT0x40 RET 2) api031.nas (文件名自己定义) [FORMAT "WCOFF"] [INSTRSET "i486p"] [BITS 32] [FILE "api031.nas"] GLOBAL_api_getmousey [SECTION .text] _api_getmousey:; int api_getmousey(void); MOVEDX,31 INT0x40 RET 3) api032.nas (文件名自己定义) [FORMAT "WCOFF"] [INSTRSET "i486p"] [BITS 32] [FILE "api032.nas"] GLOBAL_api_getmousebtn [SECTION .text] _api_getmousebtn:; int api_getmousebtn(void); MOVEDX,32 INT0x40 RET 4) api033.nas (文件名自己定义) [FORMAT "WCOFF"] [INSTRSET "i486p"] [BITS 32] [FILE "api033.nas"] GLOBAL_api_sleep [SECTION .text] _api_sleep:; void api_sleep(int time); PUSHEBX MOVEDX,33 MOVECX,[ESP+8]; time INT0x40 POPEBX RET 3. bootpack.h 添加 extern int MOUSEX, MOUSEY, MOUSEBTN; 4. bootpack.c 添加 int MOUSEX, MOUSEY, MOUSEBTN; (在void HariMain()前) 在for循环里 new_mx = mx; new_my = my; 的下面添加 MOUSEX = mx; MOUSEY = my; MOUSEBTN = mdec.btn; 5. 在 console.c 中添加 void api33_sleep(struct CONSOLE *cons, struct TASK *task, int time); //最上面添加 在hrb_api() 中添加 extern int MOUSEX, MOUSEY, MOUSEBTN; //中略 if(edx == 1){ //中略 } else if (edx == 30) { /* 鼠标X坐标 */ /*这里的edx值对应apilib文件名中的api编号,如我的是api030.nas文件中的30, 下同*/ reg[7] = MOUSEX; //(int) &mdec; //我不会结构体传值, 有哪位大佬愿意赐教的,小弟不胜感激, 如果能传结构体,那鼠标API只需要一个接口就可以了 } else if (edx == 31) { /* 鼠标Y坐标 */ reg[7] = MOUSEY; } else if (edx == 32) { /* 鼠标按键值 */ reg[7] = MOUSEBTN; } else if (edx == 33) { /* 休眠 */ api33_sleep(cons->timer, task, ecx); } return 0; } /* 实现sleep功能 */ void api33_sleep(struct CONSOLE *cons, struct TASK *task, int time) { int i; cons->timer = timer_alloc(); cons->timer->flags2 = 1; timer_init(cons->timer, &task->fifo, 128); timer_settime(cons->timer, time); //等待0.01 * ecx 秒 for (;;) { io_cli(); if (fifo32_status(&task->fifo) == 0) { // task_sleep(task); /* FIFO为空,休眠并等待*/ } i = fifo32_get(&task->fifo); // io_sti(); if(i == 128) { break; } } timer_free(cons->timer); } 6. app中的调用 void HariMain(void){ int i, mx=0, my=0, mbtn=0, mx0=0, my0=0, mbtn0=0; //中略 for(;;) { mx = api_getmousex(); my = api_getmousey(); mbtn = api_getmousebtn(); if((mx == mx0) && (my == my0) && (mbtn == mbtn0)) { api_sleep(1); continue; } mx0 = mx; my0 = my; mbtn0 = mbtn; //拿到了鼠标的值, 下面该干嘛干嘛^_^ }
1 下一页