assembly - 调色板不适用于 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,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
提前致谢
解决方案
您的程序将颜色寄存器 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。
此外,您的setpalette宏不会加载正确的 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
推荐阅读
- mongodb - 猫鼬,在深层种群中使用上模型场进行匹配
- ios - 远程音频流未路由到蓝牙耳机
- javascript - 在 python3 中解码 application/x-www-form-urlencoded 类型请求
- python - DRF request.data 没有属性 _mutable
- arrays - 在 Julia 中,如何计算两个 DateTime 数组之间的平均值(平均值)?
- sql - 计算 URL bigquery sql 中的特定模式
- spring - GET 请求在 Postman 中有效,但不适用于 RestTemplate - SpringBoot
- grafana - Prometheus - 不允许多对多匹配:匹配的标签在一侧必须是唯一的
- django - html文件中未显示数据库多个数据-django 2.1
- c - 使用 openssl 中间证书连接到 AWS MQTT 代理