问题描述
我正在尝试在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