这是我使用显存打印一个点(cx,dx)的功能。计算出偏移di后,我不知道如何改变点的颜色,所以我问gpt。 Gpt 给了我这种方式,但它只显示白点。如何生成不同颜色的点?
vmem1 PROC
mov ax, 0A000h ; video memory start point
mov es, ax
;offset=y*(640/8)+(x/8)
mov ax, dx
mov bx, 80
mul bx
mov di, ax
mov ax, cx
mov bx, 8
div bx
add di, ax ; di=offset
mov dx, 3c4h
mov al, 2
out dx, al
inc dx
mov al, 2
out dx, al
mov al, 4
mov es:[di], al
ret
vmem1 ENDP
现在我只能显示一个白点。我希望能生成其他颜色。
您所在的地方:
mov al, 4
mov es:[di], al
你应该在哪里:
mov al,es:[di]
mov al, 4
mov es:[di], al
“虚拟”读取加载锁存寄存器,如所述 http://www.osdever.net/FreeVGA/vga/vgamem.htm#read
默认调色板将 RED 分配给索引 4。
说实话,我也不会相信代码的其余部分,我不清楚对 map mask register 的操作是否必要或正确。 另一方面,显然需要位掩码寄存器来写入单个像素而不影响相邻像素。
此类操作的真实例子很多,而且并不难找到,而且比我建议的人工智能生成的废话更可靠。例如
https://www.fysnet.net/modex.htm中的
putpixel
示例:
; on entry X,Y = location and C = color (0-15)
putpixel proc near uses ax bx cx dx
; byte offset = Y * (horz_res / 8) + int(X / 8)
mov ax,Y ; calculate offset
mov dx,80 ;
mul dx ; ax = y * 80
mov bx,X ;
mov cl,bl ; save low byte for below
shr bx,03 ; div by 8
add bx,ax ; bx = offset this group of 8 pixels
mov dx,03CEh ; set to video hardware controller
and cl,07h ; Compute bit mask from X-coordinates
xor cl,07h ; and put in ah
mov ah,01h ;
shl ah,cl ;
mov al,08h ; bit mask register
out dx,ax ;
mov ax,0205h ; read mode 0, write mode 2
out dx,ax ;
mov al,es:[bx] ; load to latch register
mov al,Color
mov es:[bx],al ; write to register
ret
putpixel endp
X dw 00h
Y dw 00h
Color db 00h
此外,您最好详细了解 VGA 硬件(这样至少您可以了解 AI 做了什么 - 以及何时不起作用,为什么)。它在 http://www.osdever.net/FreeVGA/vga/vga.htm FF 或示例中有详细记录。