美好的一天/晚上!
我一直试图弄清楚如何用汇编语言获得靛蓝色。
以下是我的示例代码:
mov ah, 06h
mov bh, 10h ; 8.Blue
mov ch, 13
mov cl, 0
mov dh, 16
mov dl, 11
int 10h
提前致谢!
答案 0 :(得分:2)
使用此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个索引。
在256种默认颜色的VGA中,似乎没有Indigo,颜色#34,#56,#57是一个非常接近但不是真正的Indigo(参见:VGA default colors)。
但是你现在知道VGA有很多颜色,而不仅仅是256个预设颜色! 您可以获取Indigo的最佳近似值并将其指定给索引。
靛蓝是根据Wikipedia,#4B0082 ,或 4B h的红色成分(29,41%最亮的红色),00h成分蓝色(0%最亮绿色),82小时蓝色成分(50,98%最亮蓝色)。
颜色的VGA最大值为2 6 -1或63,因此使用此新的最大值将此百分比转换为数字可以得到RGB三元组(12h,00h,20h )强>
您可以让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 尝试推广标准化的软件界面,但随后视频卡变得越来越复杂并且彼此之间具有竞争力。