初始化调色板程序集
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 地址读取模式寄存器。
接下来的代码要求段寄存器 DS
和 ES
相等并且
方向标志已清除 (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 位因此不需要转换)。
有没有办法在使用端口 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 地址读取模式寄存器。
接下来的代码要求段寄存器 DS
和 ES
相等并且
方向标志已清除 (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 位因此不需要转换)。