Assembly 在部件中打印bmp后返回正常BIOS调色板
我正在8086汇编(在DOSBOX中)中进行一个游戏项目 我有一个在图形模式下工作的蛇游戏,还有一个在屏幕上打印BMP文件的菜单 我唯一的问题是,在打印过程中,我将调色板更改为bmp调色板 变色过程: (这是将bmp打印到屏幕的代码的一部分) 这段代码不是我的,我只知道它改变了整个程序的调色板 当我在打印图像后使用int 10h打印像素时,它仍然使用此调色板 但当我在打印任何图像之前打印一个像素时,该像素具有正常的BIOS颜色 我想知道如何将调色板更改回BIOS调色板 我找到的bmp调色板:Assembly 在部件中打印bmp后返回正常BIOS调色板,assembly,colors,x86-16,bios,Assembly,Colors,X86 16,Bios,我正在8086汇编(在DOSBOX中)中进行一个游戏项目 我有一个在图形模式下工作的蛇游戏,还有一个在屏幕上打印BMP文件的菜单 我唯一的问题是,在打印过程中,我将调色板更改为bmp调色板 变色过程: (这是将bmp打印到屏幕的代码的一部分) 这段代码不是我的,我只知道它改变了整个程序的调色板 当我在打印图像后使用int 10h打印像素时,它仍然使用此调色板 但当我在打印任何图像之前打印一个像素时,该像素具有正常的BIOS颜色 我想知道如何将调色板更改回BIOS调色板 我找到的bmp调色板: 在
在更改BIOS标准调色板之前,必须先保存该调色板,然后在更改完成后将其存储回原处 执行此操作的示例代码可能是
;WORD Buffer Segment
;WORD Buffer Offset
;DF = Direction of saving
SavePalette:
push bp
mov bp, sp
push es
push di
push ax
push dx
push cx
mov es, WORD [bp+06h]
mov di, WORD [bp+04h]
xor al, al
mov dx, 3c7h
out dx, al ;Read from index 0
inc dx
inc dx
mov cx, 300h ;3x256 reads
rep insb
pop cx
pop dx
pop ax
pop di
pop es
pop bp
ret 04h
;WORD Buffer Segment
;WORD Buffer Offset
;DF = Direction of loading
RestorePalette:
push bp
mov bp, sp
push ds
push si
push ax
push dx
push cx
mov ds, WORD [bp+06h]
mov si, WORD [bp+04h]
xor al, al
mov dx, 3c8h
out dx, al ;Write from index 0
inc dx
mov cx, 300h ;3x256 writes
rep outsb
pop cx
pop dx
pop ax
pop si
pop ds
pop bp
ret 04h
要使用此代码,您需要一个300h字节的缓冲区,假设它被称为palettbuffer
,并且位于DS
段中
push ds
push WORD PaletteBuffer
call SavePalette
;Change palette for bitmap
push ds
push WORD PaletteBuffer
call RestorePalette
值得注意的是,改变整个调色板是缓慢的,考虑改变代码只保存或恢复你需要的颜色(很可能是前16个),或者将位图颜色映射到高指数,只要它们的数量小于256。
另外,这是NASM程序集,我没有测试代码,只是画了个草图,因为我不想设置DosBox。->inter61a.zip->INTERRUP.a
--------V-101017-----------------------------
INT 10 - VIDEO - READ BLOCK OF DAC REGISTERS (VGA/MCGA)
AX = 1017h
BX = starting palette register
CX = number of palette registers to read
ES:DX -> buffer (3 * CX bytes in size) (see also AX=1012h)
Return: buffer filled with CX red, green and blue triples
SeeAlso: AX=1012h,AX=1015h,INT 62/AX=00A4h
--------V-101012-----------------------------
INT 10 - VIDEO - SET BLOCK OF DAC REGISTERS (VGA/MCGA)
AX = 1012h
BX = starting color register
CX = number of registers to set
ES:DX -> table of 3*CX bytes where each 3 byte group represents one
byte each of red, green and blue (0-63)
Return: nothing
SeeAlso: AX=1010h,AX=1017h,INT 62/AX=00A5h
这个词是“调色板”,而不是“普拉特”。请编辑您的问题并进行更改。您的意思是在两次调用中都使用
push WORD PaletteBuffer
,还是我需要另一个名为PaletteSegment
的缓冲区?两次调用中都使用PaletteBuffer,对不起,这是一个错误typo@knm241a)你的两项权利;3x255。。。评论是错误的。必须是;3x256。。。b) 使用SavePalette时,您需要第二个inc dx
,以在03C9h到达PEL数据寄存器。
--------V-101017-----------------------------
INT 10 - VIDEO - READ BLOCK OF DAC REGISTERS (VGA/MCGA)
AX = 1017h
BX = starting palette register
CX = number of palette registers to read
ES:DX -> buffer (3 * CX bytes in size) (see also AX=1012h)
Return: buffer filled with CX red, green and blue triples
SeeAlso: AX=1012h,AX=1015h,INT 62/AX=00A4h
--------V-101012-----------------------------
INT 10 - VIDEO - SET BLOCK OF DAC REGISTERS (VGA/MCGA)
AX = 1012h
BX = starting color register
CX = number of registers to set
ES:DX -> table of 3*CX bytes where each 3 byte group represents one
byte each of red, green and blue (0-63)
Return: nothing
SeeAlso: AX=1010h,AX=1017h,INT 62/AX=00A5h