装配中的自定义显示模式

时间:2018-04-26 20:25:59

标签: assembly interrupt x86-16 screen-resolution

我正在设计一个迷你bootloader-kernel组合在一个文件中作为一个有趣的项目,但我一直想知道如何使自定义显示模式适合我的屏幕大小,而不是预制的显示模式。我的屏幕尺寸为1366x768,我查看了ctyme.com's Ralph Brown's List of Interrupts

import traceback try: cursor.execute("CALL proc_commande_clts_detail7();") catch Exception as e: email_msg = traceback.format_exc() #send email logic 似乎对我不起作用,因为没有1366x768分辨率可供选择。

int 10h/ah=0也没有1366x768选项。我考虑过使用int 10h/ax=00F2h选项,因为它接近于我需要的大分辨率和多种颜色的项目,但我想知道是否可以完美地获得分辨率,就像关于每个主要的操作系统都设法做到了。

bx=11Bh在ctyme网站上看起来非常有前景,但是当我试用它时......

int 10h/ax=007Eh

......什么都没发生。 我使用nasm组装它并在qemu上运行程序(我的操作系统是Ubuntu的最新版本,顺便说一下是64位),通过这样做:

    [BITS 16]
    org 0x7C00
    mov ax, 0
    mov es, ax
    mov ah, 2
    mov al, 1
    mov ch, 0
    mov dh, 0
    mov cl, 2
    mov bx, stage2
    int 0x13
    jmp stage2
    times 510-($-$$) db 0
    dw 0xAA55

    stage2:
            mov ax, 0x007E
            mov bx, 1366
            mov cx, 768
            mov dx, 256 ;placeholder, was going to replace it with a higher number
            int 10h
            jmp $

我没有在.iso文件上运行它,因为qemu可以运行bin文件,而且我计划在操作系统上获得大量进展后将它放在.iso上。

注意:
预先制作的图形模式适用于我(或者至少其中一些模式适用于常见但古老的 nasm boot.asm qemu-system-x86_64 boot

我想知道int 10h/ah=0/al=13h是否只是加载预制图形模式的另一种方式,但后来我输入了int 10h/ah=007Eh的分辨率和颜色,但它仍然无效。

我知道ctyme上的int 10h/ah=0/al=13h是填充整个屏幕的,但我试过了,没有发生任何事情。

另一个注意:
在模式不起作用的每个实例中,都没有显示错误,根本没有发生任何事情。我知道它何时起作用,因为它清除了qemu在成功加载模式时写入启动的原始文本。

1 个答案:

答案 0 :(得分:1)

最初有各种各样的视频卡(CGA,EGA,Hercules,VGA ..);而且它们都不打算成为任何一种(硬件)标准。对于每个新的视频卡,“ int 0x10,ah = 0x00”已扩展为支持新的视频模式。由于软件可以询问视频卡是否为CGA,EGA,VGA等(并且较新的卡与较旧的卡具有有限的向后兼容性),因此,这在当时大多可行。

但是,在1980年代后期,市场上充斥着提供更多功能的视频卡(例如,超过256 KiB的视频RAM,分辨率高于620 * 480,超过“ 256色”)。发生这种情况时,不同的视频卡制造商开始将随机的非标准模式放入“ int 0x10,ah = 0x00”可以支持的视频模式列表中(这就是为什么Ralph Brown列表中列出的大多数视频模式都提到了哪些特定的视频卡支持每种特定的视频模式);但是软件无法确定视频卡实际是什么,因此无法确定可能支持的“ int 0x10,ah = 0x00”(对于较旧的软件而言,要更好地支持较新的视频卡就更不可能了。)

最终(很早在1990年代初),此灾难由视频电子标准协会(VESA)修复,并带有一组称为“ VBE”(https://en.wikipedia.org/wiki/VESA_BIOS_Extensions)的BIOS扩展。本质上,为了向后兼容,保留了严重不足的“ int 0x10,ah = 0x00”;但主要由功能(都共享“ int 0x10,ax = 0x4F”范围,并且以al作为子功能)取代,以确定视频卡的功能(并获得其支持的视频模式列表)每个模式编号实际上是,设置视频模式,以及执行其他操作(例如,银行切换等)。

但是;使用更现代的VBE时,您仍然只能使用视频卡提供的任何视频模式,并且可能无法提供1366x768的分辨率。

绕过该限制的唯一方法是编写几千个不同的视频卡驱动程序。从询问显示器实际支持什么开始。请注意,这需要了解“视频模式”和“视频模式定时”之间的区别-有数百万种不同的视频模式定时(具有不同的垂直同步宽度,不同的水平/垂直边距等),所有这些都可以算作“ 1366x768 @ 60 Hz刷新率”,以及显示器可能支持的数百万种视频模式时序中的一种;并且如果您发现时间错误,它将无法正常工作(并且您可能不会知道它没有正常工作)。

换句话说;您可能需要花费数月的时间才能使“显示器兼容性”发挥作用(了解视频时序值之间的关系并解析显示器的EDID以确定其支持的功能);然后是1000个月(为10000个不同的视频卡编写10000个非常小的驱动程序);但是当您花费83年以上的时间进行此操作时,视频卡制造商将继续发布更多您不支持的新视频卡。

基本上,自定义显示模式(以任何语言显示)对于单身的开发人员来说甚至都不可行(您需要由100多个开发人员组成的团队);并且也不适合“迷你引导加载程序/内核”(您希望使用完整的内核,最好具有设备枚举和视频驱动程序接口,以将第三方设备驱动程序作为“运行时可加载”模块来支持)降低了视频驱动程序开发的痛苦)。

我知道在ctyme上说的int 10h / ax = 4F02h / bx = 81FFh可以填满整个屏幕,但是我尝试了一下却没有任何反应。

拉尔夫·布朗(Ralph Brown)的中断列表仅给出了一个非常简短的描述(并且大多是“陈旧的”-信息大约25年没有更新)。不能完全阅读完整的VBE规范(可以从Wikipedia页面底部的链接https://en.wikipedia.org/wiki/VESA_BIOS_Extensions#Further_reading轻松获得)。