7 绘制矩形(harib01g)

颜色备齐了,下面我们来画“画”吧。首先从VRAM与画面上的“点”的关系开始说起。在当前画面模式中,画面上有320×200(=64 000)个像素。假设左上点的坐标是(0,0),右下点的坐标是(319,319),那么像素坐标(x,y)对应的VRAM地址应按下式计算。

0xa0000 + x + y * 320

其他画面模式也基本相同,只是0xa0000这个起始地址和y的系数320有些不同。

根据上式计算像素的地址,往该地址的内存里存放某种颜色的号码,那么画面上该像素的位置就出现相应的颜色。这样就画出了一个点。继续增加x的值,循环以上操作,就能画一条长长的水平直线。再向下循环这条直线,就能够画很多的直线,组成一个有填充色的长方形。

根据这种思路,我们制作了函数boxfill8。源程序就是bootpack.c。并且在程序HariMain中,我们不再画条纹图案,而是使用这个函数3次,画3个矩形。也不知能不能正常运行,我们来“make run”看看。哦,好像成功了。

本次的bootpack.c节选

  1. #define COL8_000000 0
  2. #define COL8_FF0000 1
  3. #define COL8_00FF00 2
  4. #define COL8_FFFF00 3
  5. #define COL8_0000FF 4
  6. #define COL8_FF00FF 5
  7. #define COL8_00FFFF 6
  8. #define COL8_FFFFFF 7
  9. #define COL8_C6C6C6 8
  10. #define COL8_840000 9
  11. #define COL8_008400 10
  12. #define COL8_848400 11
  13. #define COL8_000084 12
  14. #define COL8_840084 13
  15. #define COL8_008484 14
  16. #define COL8_848484 15
  17. void HariMain(void)
  18. {
  19. char *p; /* p变量的地址 */
  20. init_palette(); /* 设置调色板 */
  21. p = (char *) 0xa0000; /* 将地址赋值进去 */
  22. boxfill8(p, 320, COL8_FF0000, 20, 20, 120, 120);
  23. boxfill8(p, 320, COL8_00FF00, 70, 50, 170, 150);
  24. boxfill8(p, 320, COL8_0000FF, 120, 80, 220, 180);
  25. for (;;) {
  26. io_hlt();
  27. }
  28. }
  29. void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)
  30. {
  31. int x, y;
  32. for (y = y0; y <= y1; y++) {
  33. for (x = x0; x <= x1; x++)
  34. vram[y * xsize + x] = c;
  35. }
  36. return;
  37. }

7 绘制矩形(harib01g) - 图1

画了3个矩形哦

这次新出现了#define声明方式,它用来表示常数声明。要记住哪种色号对应哪种颜色实在太麻烦了,所以为了便于理解,做了以上声明。