繁体   English   中英

在 C 中创建自己的 moveto() function 用于 0x13 VGA 模式 xv6

[英]Creating own moveto() function in C for use in 0x13 VGA mode xv6

我正在做一个任务,我想知道是否有人能指出我正确的方向。

我需要使用我个人创建的 4 个系统调用方法来绘制一个正方形。 我不能使用 graphics.h 之类的东西

我需要做的函数如下(不包括参数): int sys_moveto() // 移动当前图形 position。 int sys_lineto() // 从当前图形 position 到给定坐标画一条线。 int sys_setpixel() //将当前图形 position 坐标处的像素设置为白色。

我似乎已经弄清楚了 setpixel() 和 lineto(),问题出在 moveto() function 上。 我不知道如何将当前图形 position 移动到 0x13 VGA 模式显示器上的给定像素坐标。 我假设这是通过操纵某种形式的 memory 位置来完成的?

该任务特别说明了以这种方式构建它。 所以从逻辑上讲,系统将“光标”移动到屏幕上的一个点,然后在移动到下一个点之前对其进行着色,然后对其进行着色等等......

由于这是系统调用,这一切都在受保护的级别完成!

我只需要知道如何在不使用 graphics.h 的情况下移动当前图形 position! 任何资源或建议将不胜感激!

提前致谢!

The sys_moveto(newX, newY, color) would just do a line from the previous position (in global variables like posX and posY ) to the new position, then set the new position (in the global variables, like posX = newX; ) for下次。

您将遇到的问题是sys_lineto()需要支持对角线(这更难); 并且不应使用sys_setpixel()来重新计算沿线的每个像素的地址效率低下(而不是执行address += step;这避免了重复大部分地址计算)。 请注意, sys_lineto()可以/应该针对可能的特殊情况进行优化(例如,水平线可以是“ memset() ”); 并且可能应该处理剪辑(例如,这样您就可以sys_moveto(INT_MAX, INT_MAX, color)sys_lineto()将仅绘制实际在屏幕上的部分行(如果有),而不会损坏 memory 当部分行不是屏幕上。

我还建议编写一个calcPixelAddress()使用的sys_lineto() (查找要绘制的第一个像素的地址)和sys_setpixel() (可能变成address = calcPixelAddress(x, y); *address = color; )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM