初始化调色板程序集

Initializing color palette assembly

有没有办法在使用端口 3C8h 更改其值后恢复标准调色板 (256)?这是我的改变方式。

proc copyPal
    mov si, offset palette
    mov cx, 256
    mov dx, 3C8h
    mov al, 0
    out dx, al
    inc dx
    palLoop:
    mov al, [si+2]
    shr al, 2
    out dx, al
    mov al, [si+1]
    shr al, 2
    out dx, al
    mov al, [si]
    out dx, al
    add si, 4
    loop palLoop
    ret
endp copyPal

你可以用类似的方法读取256个颜色寄存器。只需使用位于 03C7h 的 PEL 地址读取模式寄存器。
接下来的代码要求段寄存器 DSES 相等并且 方向标志已清除 (cld)。

PreservePal:
    mov di, offset Buffer768
    mov cx, 256
    mov dx, 03C7h   ; Address
    mov al, 0
    out dx, al
    mov dx, 03C9h   ; Data
  palLoop:
    in  al, dx      ; Red
    stosb
    in  al, dx      ; Green
    stosb
    in  al, dx      ; Blue
    stosb
    loop palLoop
    ret

要恢复,请使用下一个代码:

RestorePal:
    mov si, offset Buffer768
    mov cx, 256
    mov dx, 03C8h   ; Address
    mov al, 0
    out dx, al
    mov dx, 03C9h   ; Data
  palLoop:
    lodsb
    out dx, al      ; Red
    lodsb
    out dx, al      ; Green
    lodsb
    out dx, al      ; Blue
    loop palLoop
    ret

请注意,您的 palette 缓冲区有 1024 字节(每字节 8 位,因此您的转换系数为 4),而我的 Buffer768有 768 字节(每字节 6 位因此不需要转换)。