调色板不适用于VGA中的某些颜色

问题描述

我正在尝试在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

        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,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

预先感谢

解决方法

您的程序将颜色寄存器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