5 bball(harib26d)

“bball”是笔者很喜欢的一个OSASK上的应用程序,这个名字是“beautiful ball”的缩写,通过绘制很多条直线,组成一个美丽的球形。程序本身很短也很简单,不过画出来的图形非常漂亮。我们把这个程序也移植到“纸娃娃系统”上来吧。

其实,笔者之所以在“纸娃娃系统”中编写了用来画直线的API,也正是为了在这里移植这个程序呢(笑)。

bball.c

  1. #include "apilib.h"
  2. void HariMain(void)
  3. {
  4. int win, i, j, dis;
  5. char buf[216 * 237];
  6. struct POINT {
  7. int x, y;
  8. };
  9. static struct POINT table[16] = {
  10. { 204, 129 }, { 195, 90 }, { 172, 58 }, { 137, 38 }, { 98, 34 },
  11. { 61, 46 }, { 31, 73 }, { 15, 110 }, { 15, 148 }, { 31, 185 },
  12. { 61, 212 }, { 98, 224 }, { 137, 220 }, { 172, 200 }, { 195, 168 },
  13. { 204, 129 }
  14. };
  15. win = api_openwin(buf, 216, 237, -1, "bball");
  16. api_boxfilwin(win, 8, 29, 207, 228, 0);
  17. for (i = 0; i <= 14; i++) {
  18. for (j = i + 1; j <= 15; j++) {
  19. dis = j - i; /*两点间的距离*/
  20. if (dis >= 8) {
  21. dis = 15 - dis; /*逆向计数*/
  22. }
  23. if (dis != 0) {
  24. api_linewin(win, table[i].x, table[i].y, table[j].x, table[j].y, 8 - dis);
  25. }
  26. }
  27. }
  28. for (;;) {
  29. if (api_getkey(1) == 0x0a) {
  30. break; /*按下回车键则break; */
  31. }
  32. }
  33. api_end();
  34. }

这种写法在结构数组声明部分直接赋予初始值,可能大家还是第一次见到。没关系,只要知道“嘿,原来还可以这样写啊”就可以啦。

■■■■■

好,我们来“make run”。啊,图形超出画面边界了,不过用VESA的人应该可以完全显示出来的哦。咦?显示的图形有问题啊……

5 bball(harib26d) - 图1

有些线没有显示出来

唔,这貌似是操作系统的bug呢,因为画线的程序并没有什么问题。我们把窗口移动一下看看。哦,果然好了。也就是说,这是refresh失败导致的。

于是我们来修正一下操作系统的bug。

本次的console.c节选

  1. int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax)
  2. {
  3. (中略)
  4. } else if (edx == 13) {
  5. sht = (struct SHEET *) (ebx & 0xfffffffe);
  6. hrb_api_linewin(sht, eax, ecx, esi, edi, ebp);
  7. if ((ebx & 1) == 0) { /*从此开始*/
  8. if (eax > esi) {
  9. i = eax;
  10. eax = esi;
  11. esi = i;
  12. }
  13. if (ecx > edi) {
  14. i = ecx;
  15. ecx = edi;
  16. edi = i;
  17. } /*到此结束*/
  18. sheet_refresh(sht, eax, ecx, esi + 1, edi + 1);
  19. }
  20. } else if (edx == 14) {
  21. (中略)
  22. }

为了保证refresh范围指定正确的左上角和右下角坐标,我们将变量进行比较后做了替换。

再来“make run”一次看看……成功了!怎么样,很漂亮吧?这样一个应用程序只需要350字节哦,“纸娃娃系统”真是相当给力不是吗?

5 bball(harib26d) - 图2

bball完成

不过图形超出画面范围看上去很不爽,我们用VESA模式再重新截一张图片下来。

5 bball(harib26d) - 图3

这就是bball的完整版啦!