考虑以下宏:
pixelFast MACRO
; This macro draws a pixel, assuming the coordinates are already loaded in cx&dx and the color is in al.
xor bh, bh
mov ah, 0ch
int 10h
ENDM
drawRect MACRO x1, y1, x2, y2, color
LOCAL @@loop, @@row_loop
xor cx, cx
mov dx, y1
mov al, BYTE PTR [color]
@@loop:
mov cx, x1
@@row_loop:
pixelFast
inc cx
cmp cx, x2
jna @@row_loop
inc dx
cmp dx, y2
jna @@loop
ENDM
rendToolBar MACRO
drawRect COLORDISP_X1, COLORDISP_Y1, COLORDISP_X2, …Run Code Online (Sandbox Code Playgroud) 对于一个学校项目,我正在为DOSBOX编写一个程序集的绘图程序.在我的程序中,用户使用鼠标左键来绘制某种颜色的像素.我在模式13中使用直接写入.用户可以通过右键单击来更改该颜色,该颜色读取鼠标指向的像素的颜色.
这完全正常,直到用户启动某个用于擦除屏幕的子程序,并显示要从中选择的颜色调色板(具有相同的右键单击功能).然后,用户右键单击调色板中的颜色,使用int 10h,0dh读取颜色.无论用户在调色板屏幕中右键单击何处,用户稍后写入屏幕的颜色始终为白色.
tl; dr右键单击任意位置可以正确更改画笔颜色,但如果在调色板模式下完成,则后续颜色始终为白色.这是我的代码:
GRAPHICS equ 13h
H_HOTSPOT equ 7
V_HOTSPOT equ 7
H_RES equ 320
V_RES equ 200
PIXELCOUNT equ H_RES*V_RES
DISPLAY_SEG equ 0A000h
EXIT_KEY equ 1071h ; q key
COLORPICKER_KEY equ 1177h ; w key
PALETTE_SIZE equ 16
SQUARE_SIZE equ 10
SQUARE_PADDING equ 2
SQUARE_ROW_JUMP equ H_RES - SQUARE_SIZE
PALETTE_ROW_JUMP equ H_RES - (SQUARE_PADDING + SQUARE_SIZE)*PALETTE_SIZE
sseg SEGMENT
db 256 dup(?)
sseg ENDS
dseg SEGMENT
stdBrushMask dw 1111111011111111b
dw 1111111011111111b
dw 1111111011111111b
dw 1111111011111111b
dw 1111111011111111b
dw …Run Code Online (Sandbox Code Playgroud)