内存映射图形输出
Memory-Mapped Graphics Output
我正在研究使用内存映射图形绘制像素和线条。我在 Windows 的 Textpad 中使用 TASM。当我点击 运行 时,整个屏幕变成蓝色,仅此而已,没有绘制任何像素。
.model small
.stack
.data
saveMode db ?
xVal dw ?
yVal dw ?
.code
main proc
mov ax, @data
mov ds, ax
call SetVideoMode
call SetScreenBackground
call Draw_Some_Pixels
call RestoreVideoMode
mov ax, 4c00h
int 21h
main endp
SetScreenBackground proc
mov dx, 3c8h
mov al, 0
out dx, al
mov dx, 3c9h
mov al, 0
out dx, al
mov al, 0
out dx, al
mov al, 35
out dx, al
ret
SetScreenBackground endp
SetVideoMode proc
mov ah, 0fh
int 10h
mov saveMode, al
mov ah, 0
mov al, 13h
int 10h
push 0A00h
pop es
ret
SetVideoMode endp
RestoreVideoMode proc
mov ah, 10h
int 16h
mov ah, 0
mov al, saveMode
int 10h
ret
RestoreVideoMode endp
Draw_Some_Pixels proc
mov dx, 3c8h
mov al, 1
out dx, al
mov dx, 3c9h
mov al, 63
out dx, al
mov al, 63
out dx, al
mov al, 63
out dx, al
mov xVal, 160
mov yVal, 100
mov ax, 320
mul yVal
add ax, xVal
mov cx, 10
mov di, ax
DP1:
mov BYTE PTR es:[di], 1
add di, 5
Loop DP1
ret
Draw_Some_Pixels endp
问题似乎出在与 video mode 13h 关联的段上。
After setting the video mode, the next step is to draw something onto the screen. The VGA memory is located at physical address 0xA0000
您的代码:
SetVideoMode proc
mov ah, 0fh
int 10h
mov saveMode, al
mov ah, 0
mov al, 13h ; Video mode 13h
int 10h
push 0A00h ; Incorrect should be 0A000h
pop es
ret
SetVideoMode endp
视频模式 13h 将使用 segment:offset(在您的情况下为 ES:0)0A000h:0
进行寻址。 0A000h:0
将是物理地址 (0A000h << 4) + 0 = 0A0000h
.
代码可以通过将其更改为来修复:
push 0A000h
pop es
我正在研究使用内存映射图形绘制像素和线条。我在 Windows 的 Textpad 中使用 TASM。当我点击 运行 时,整个屏幕变成蓝色,仅此而已,没有绘制任何像素。
.model small
.stack
.data
saveMode db ?
xVal dw ?
yVal dw ?
.code
main proc
mov ax, @data
mov ds, ax
call SetVideoMode
call SetScreenBackground
call Draw_Some_Pixels
call RestoreVideoMode
mov ax, 4c00h
int 21h
main endp
SetScreenBackground proc
mov dx, 3c8h
mov al, 0
out dx, al
mov dx, 3c9h
mov al, 0
out dx, al
mov al, 0
out dx, al
mov al, 35
out dx, al
ret
SetScreenBackground endp
SetVideoMode proc
mov ah, 0fh
int 10h
mov saveMode, al
mov ah, 0
mov al, 13h
int 10h
push 0A00h
pop es
ret
SetVideoMode endp
RestoreVideoMode proc
mov ah, 10h
int 16h
mov ah, 0
mov al, saveMode
int 10h
ret
RestoreVideoMode endp
Draw_Some_Pixels proc
mov dx, 3c8h
mov al, 1
out dx, al
mov dx, 3c9h
mov al, 63
out dx, al
mov al, 63
out dx, al
mov al, 63
out dx, al
mov xVal, 160
mov yVal, 100
mov ax, 320
mul yVal
add ax, xVal
mov cx, 10
mov di, ax
DP1:
mov BYTE PTR es:[di], 1
add di, 5
Loop DP1
ret
Draw_Some_Pixels endp
问题似乎出在与 video mode 13h 关联的段上。
After setting the video mode, the next step is to draw something onto the screen. The VGA memory is located at physical address 0xA0000
您的代码:
SetVideoMode proc
mov ah, 0fh
int 10h
mov saveMode, al
mov ah, 0
mov al, 13h ; Video mode 13h
int 10h
push 0A00h ; Incorrect should be 0A000h
pop es
ret
SetVideoMode endp
视频模式 13h 将使用 segment:offset(在您的情况下为 ES:0)0A000h:0
进行寻址。 0A000h:0
将是物理地址 (0A000h << 4) + 0 = 0A0000h
.
代码可以通过将其更改为来修复:
push 0A000h
pop es