Masm:以ax=12h,int 10h 640*480 16色vga模式直接写入显存

问题描述 投票:0回答:1

这是我使用显存打印一个点(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

现在我只能显示一个白点。我希望能生成其他颜色。

x86 masm video-memory
1个回答
0
投票

您所在的地方:

    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 或示例中有详细记录。

© www.soinside.com 2019 - 2024. All rights reserved.