2
我想通过视频模式13向上移动一条垂直线。但每当我这样做时,它就会向下移动。这也是我第一次使用内存映射图形。有人能帮助我吗?我使用TASM /窗口不能向上移动垂直线(内存映射图形)
这里是我的宏:
drawSquare MACRO color,cy,cx,dy,dx
mov ah,06
mov al, 0
mov bh,color
mov ch,cy
mov cl,cx
mov dh,dy
mov dl,dx
int 10h
endm
clearscreen MACRO
drawSquare 00h, 00h, 00h, 18h, 27h
endm
include macros.txt
.model small
.stack
.data
saveMode db ?
xVal dw 40
yVal dw 90
R db 0
G db 0
B db 63
lengths dw 0
.code
main proc
mov ax, @data
mov ds, ax
call SetVideoMode
call SetScreenBackground ;blue for the tank
mov lengths, 20
call line_vertical
move:
mov ah, 07
int 21h
cmp al, "w"
je up
jmp outA
up:
dec yVal
clearscreen
mov lengths, 20
call line_vertical
jmp move
outA:
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, R
out dx, al
mov al, G
out dx, al
mov al, B
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 0A000h
pop es
ret
SetVideoMode endp
RestoreVideoMode proc
mov ah, 10h
int 16h
mov ah, 0
mov al, saveMode
int 10h
ret
RestoreVideoMode endp
line_horizontal proc
mov dx, 3c8h
mov al, 1
out dx, al
mov dx, 3c9h
mov al, 255
out dx, al
mov al, 255
out dx, al
mov al, 255
out dx, al
mov ax, 320
mul yVal
add ax, xVal
mov cx, lengths
mov di, ax
L1:
mov BYTE PTR es:[di], 1
add di, 1
loop L1
ret
line_horizontal endp
line_vertical proc
mov dx, 3c8h
mov al, 1
out dx, al
mov dx, 3c9h
mov al, 255
out dx, al
mov al, 255
out dx, al
mov al, 255
out dx, al
mov cx, lengths
L2:
mov ax, 320
mul yVal
add ax, xVal
mov di, ax
mov BYTE PTR es:[di], 1
inc yVal
loop L2
ret
line_vertical endp
end main
'line_vertical'在'L2'循环中修改了'yVal'。你应该改变它,这样你就可以在寄存器或堆栈中保存'yVal'的副本。 – Michael