如何在汇编语言中获得其他颜色组合?

时间:2016-01-28 06:46:22

标签: assembly colors inline-assembly tasm dosbox

美好的一天/晚上!

我一直试图弄清楚如何用汇编语言获得靛蓝色。

以下是我的示例代码:

mov ah, 06h
mov bh, 10h ; 8.Blue
mov ch, 13
mov cl, 0
mov dh, 16
mov dl, 11
int 10h

提前致谢!

1 个答案:

答案 0 :(得分:2)

TL; DR

使用此interrupt service
对不起这个很长的答案,我今晚真的无聊。

不幸的是,在原始CGA调色板中没有 Indigo 这样的颜色,它在硬件中被修复,因此无法进行自定义。

CGA有4位颜色深度,称为IRGB格式: bit 2 为红色, bit 1 为绿色,位0 为蓝色,位3 为强度。这些位驱动显示适配器的输出连接器中的等效信号,因此调色板实际上并不存在,给监视器带来了将它们转换为模拟电压信号的负担。

然而,您可能并没有真正使用真正的IBM CGA显示适配器,而是使用近期合理的视频卡。
在CGA之后,EGA引入了一个索引颜色系统:你有16个数字,你可以将每个数字与你选择的颜色相关联,总共64个。当着色像素/字符时,您使用十六个数字中的一个,称为索引。

为了向后兼容,与每个索引关联的颜色与CGA适配器为所述索引显示的颜色相同。

在EGA转向原始VGA后,原始VGA仍然很重要,因为它仍然可以通过所有现代视频卡支持(通过仿真),它是最后一个真正的硬件接口标准 1
这是您将用于编程的模式。

VGA,在它的时代,通过将RGB模式扩展到每通道6位,或者总共262.144种可能的颜色来熄灭对更多颜色的追求,这个数字更好地称为2 18

在某些模式下,原始VGA还将索引空间(数字的数量)扩大为256个索引。

您想知道如何在VGA显示适配器上获得Indigo

在256种默认颜色的VGA中,似乎没有Indigo,颜色#34,#56,#57是一个非常接近但不是真正的Indigo(参见:VGA default colors)。

但是你现在知道VGA有很多颜色,而不仅仅是256个预设颜色! 您可以获取Indigo的最佳近似值并将其指定给索引。

1。找到最佳近似值

靛蓝是根据Wikipedia#4B0082 ,或 4B h的红色成分(29,41%最亮的红色),00h成分蓝色(0%最亮绿色),82小时蓝色成分(50,98%最亮蓝色)。

颜色的VGA最大值为2 6 -1或63,因此使用此新的最大值将此百分比转换为数字可以得到RGB三元组(12h,00h,20h )

2。将三元组分配给索引

您可以让BIOS执行此操作,非常simple interrupt service 你可以自己动手programming the hardware registers,这里更有用reference

将索引号(作为字节)写入端口3c8h,然后对端口3c9h执行三次连续写操作,分别设置红色,绿色,蓝色组件。写入的最后三个字节被屏蔽到它们的低六位。

例如,您可以使用此代码更改默认红色(12或0ch)

;Using the BIOS                               ;Without BIOS
mov ax, 1010h                                 mov dx, 3c8h  ;Color write port
mov bx, 0ch      ;0ch is Red                  mov al, 0ch   ;Red index
mov dh, 12h      ;Red component               out dx, al   
mov cx, 20h      ;Green & Blue components     inc dl        ;Data port
int 10h                                       mov al, 0ch   ;Red component
                                              out dx, al
                                              xor al, al    ;Green component
                                              out dx, al
                                              mov al, 20h   ;Blue component
                                              out dx, al

<强>提防
模式13h 中,您可以直接使用索引号,在文本模式下,这可能不是真的。字符属性可能无法以直接的方式映射到索引。在我的旧视频卡中,我看到前8个属性(从00h到07h)被映射到它们的相同索引,但是从08h到0fh的属性被映射到从索引空间中间开始的8个索引的连续块。

我不认识你正在使用的中断服务,所以我无法确切地告诉你如何使用这些索引并且更具体。

这是CGA的遗产。
EGA使用RGB颜色模式,每通道2位;总色深为6位,或2 6 颜色
1 VESA 尝试推广标准化的软件界面,但随后视频卡变得越来越复杂并且彼此之间具有竞争力。