VGA中颜色调色板对某些颜色未起作用

4

我正在尝试在DOSBox上使用汇编语言设置VGA(640x480x16)的调色板,但是特定的颜色6、8-F没有改变。我已经尝试过使用中断和直接通过端口进行改变,其他颜色都可以工作,但这些不行。我正在使用默认配置下的DOSBox 0.74-3。以下是我的代码:

    setpalete MACRO index,r,g,b
            mov ax, 1010h
            mov bx, index
            mov ch, r
            mov cl, g
            mov dh, b
            int 10h
    ENDM
    Start:
        mov ax, 0A000h
        mov es, ax

        ;set video mode to 640x480 16 color ah=0 al=12h int 10h
        mov ax, 12h 
        int 10h

        setpalete 06h,030h,030h,030h

        mov dx, 03C4h ;dx = indexregister
        mov ah, 06h ;Color 
        mov al, 02h ;register select - map mask
        out dx, ax ;select the bitplanes.
        mov al, 0FFh
        mov di, 0
        mov cx,38400
        rep stosb

这里是使用端口设置调色板

setpalete MACRO index,r,g,b
    mov dx, 3c8h
    mov al, index
    out dx, al
    mov dx, 3c9h
    mov al, r
    out dx, al ; set R
    mov al, g
    out dx, al ; set G
    mov al, b
    out dx, al ; set B
ENDM

感谢您提前的支持。
1个回答

4
您的程序将颜色寄存器6设置为某种灰色。您观察到在16色视频模式12h中,调色板寄存器6映射到颜色寄存器20 (14h)。因此,应该更改颜色寄存器20 (14h),调色板寄存器8 (08h) 至 15 (0Fh)同理。
以下是调色板寄存器(颜色值)和颜色寄存器(您应该更改的DAC寄存器)之间的连接关系,所有数字都采用十六进制:
0  1  2  3  4  5  6 7  8  9  A  B  C  D  E  F     palette register
0  1  2  3  4  5 14 7 38 39 3A 3B 3C 3D 3E 3F     color register

例如,为了更新调色板寄存器号码0Ah中的颜色,您应该在颜色寄存器号码3Ah中进行更改。


此外,您的 setpalete 宏未加载正确的RGB寄存器。这是正确版本:

setpalete MACRO index,r,g,b
        mov bx, index
        mov dh, r
        mov ch, g
        mov cl, b
        mov ax, 1010h  ; BIOS.SetIndividualColorRegister
        int 10h
ENDM

这个有效!但是为什么有人会以如此奇怪的方式给颜色编号呢? - Saar BS
这一切都与图形卡随着时间的推移从MDA到CGA、EGA、VGA等的演变有关。不断增加更多的功能/能力,并始终努力保持尽可能兼容。 - Sep Roland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接