簡體   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