Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在部件中打印bmp后返回正常BIOS调色板_Assembly_Colors_X86 16_Bios - Fatal编程技术网

Assembly 在部件中打印bmp后返回正常BIOS调色板

Assembly 在部件中打印bmp后返回正常BIOS调色板,assembly,colors,x86-16,bios,Assembly,Colors,X86 16,Bios,我正在8086汇编(在DOSBOX中)中进行一个游戏项目 我有一个在图形模式下工作的蛇游戏,还有一个在屏幕上打印BMP文件的菜单 我唯一的问题是,在打印过程中,我将调色板更改为bmp调色板 变色过程: (这是将bmp打印到屏幕的代码的一部分) 这段代码不是我的,我只知道它改变了整个程序的调色板 当我在打印图像后使用int 10h打印像素时,它仍然使用此调色板 但当我在打印任何图像之前打印一个像素时,该像素具有正常的BIOS颜色 我想知道如何将调色板更改回BIOS调色板 我找到的bmp调色板: 在

我正在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