不使用中断的VGA编程(仅限寄存器)

时间:2011-07-11 17:09:56

标签: interrupt vga

我想开发一个VGA图形驱动程序(用于Linux(Ubuntu)),支持基本图元,如putpixel,drawline,fillrect和bitblt。我想在保护模式下这样做。 我一直在谷歌搜索一周,以下四个链接是我找到的最好的链接:

http://www.brackeen....vga/basics.html HTTP://www.osdever.n...VGA/vga/vga.htm http://bos.asmhacker...sing%20bios.htm

不幸的是,第一个使用BIOS调用,所以我无法使用它。第二个链接有很多关于VGA寄存器的信息,但没有示例说明如何使它们一起工作。第三个例子是一个在13h模式下切换的例子,但我已经尝试过,没有任何反应。你们能给我一个暗示吗?提前谢谢!

- 蒙特拉

3 个答案:

答案 0 :(得分:1)

Christoffer 代码包含文件是 BOS 操作系统源代码,如 text.inc 和 font8x16.inc

http://bos.asmhackers.net/downloads.php

答案 1 :(得分:0)

我的代码http://bos.asmhackers.net/docs/vga_without_bios/snippet_5/vga.php 如果您处于具有完全硬件访问权限的32位模式,则可以正常工作不幸的是,我怀疑任何Linux变种都会让你直接访问VGA端口。我不确定你是如何开发这个驱动程序的,但如果你确定你可以完全访问VGA端口,它应该可以工作。在我的示例代码中,我只在模式0x03和0x13之间切换,但在上面的文件夹中,您将能够找到大多数其他常见VGA模式的端口值,以及如果您愿意,还可以使用C代码进行切换。

答案 2 :(得分:0)

这将在很多年后到来,但是我认为它仍然非常重要,如果有人在挣扎,我希望他们会发现它有用。

首先,完全有可能仅使用不带中断的寄存器来配置VGA,这可能会非常困难。 here可以找到有关寄存器以及如何配置它们的有用资源,但是除非您有大量时间来学习如何正确地进行所有操作,否则请转到以下部分。

如果您想真正学习如何做,建议您阅读前面提供的文档。但是,其中一些已经完成!

克里斯·吉斯(Chris Giese)出色地演示了如何针对MS-DOS系统执行此操作,尽管您可能认为这样做没有帮助,但确实可以。

可以在here中找到克里斯的代码。如果您想要其他有用的代码,也请选中here

现在,尽管它仅适用于MS-DOS,但实际上很容易转换为其他系统。该代码已经包含在许多不同模式下配置寄存器所需的所有数据。这就是节省您大量时间阅读文档的部分。

该代码使用功能outportbinportb(它们是MS-DOS函数)向端口写入/从端口读取单个字节。因此,您必须重新定义这些功能才能对自己的系统进行读/写。重新定义的复杂性取决于您所使用的系统。

此外,您还需要提供写入0xA0000-0xBFFFF之间与标准VGA存储区相对应的物理存储区的方法。分配完这些之后,还需要重新定义功能pokeb pokew peekb,这些功能将帮助您在屏幕上输出内容(文本或像素数据)。

最后一点:代码已经定义为可用于许多不同的模式,包括文本和显示模式。