组装plump/water个动画
Assembler plump/water animation
我是汇编程序的新手,我正在寻找如何在我的代码中插入循环的简单解决方案。你们能给我提示或答案吗?我在 google 上找到了一些文章,但我无法理解它们,因为我很笨。我要做一个项目:水的动画,http://kino-ap.eng.hokudai.ac.jp/all-LiF.gif http://thumbs.dreamstime.com/z/circular-splash-drop-water-blue-forming-circle-waves-liquid-surface-37560386.jpg
我想用一个圆圈所以我找到了这段代码
; nasm -O999 -o kolo.com -f bin kolo.asm
org 100h
mov ax, 13h
int 10h
mov ax, 0a000h
mov es, ax
mov cx, 360
finit
fldpi
fild word [sto80]
fdivp st1, st0 ; pi/180
fld1
fild word [r] ; r, 1, pi/180
fldz ; angle=0, r, 1, pi/180
mov al, 15
draw:
fld st0 ; angle, angle, r, 1, pi/180
fmul st4 ; angle in radius
mov di, 100*320 + 160 ; middle of screen
fsin ; sin(angle), angle, r, 1, pi/180
fmul st2 ; sin(angle)*r, angle, r, 1, pi/180
fistp word [height] ; angle, r, 1, pi/180
fld st0 ; angle, angle, r, 1, pi/180
fmul st4 ; angle in radius
fcos ; cos(angle),angle, r, 1, pi/180
fmul st2 ; r*cos(angle), angle, r, 1, pi/180
fistp word [width] ; angle, r, 1, pi/180
add di, [width] ; add the horizontal length
mov dx, [height]
mov bx, dx
shl dx, 8
shl bx, 6
add dx, bx ; dx = height*320
sub di, dx ; We subtract the vertical distance
mov [es:di], al ; show pixel
fadd st0, st2 ; angle += 1
dec cx
jnz draw
finit
xor ah, ah
int 16h
mov ax, 3
int 10h
mov ax, 4c00h
int 21h
r dw 50
width dw 0
height dw 0
sto80 dw 180
现在我想添加一个圆圈,这个圆圈会增加。我需要添加一个循环来递增 r(对于 r=0;r<300;r++。在 r==300 之后更改 r=0)并重绘它并可能隐藏最后一个圆像素?
你不应该让你的半径大于 99,因为屏幕的尺寸是 320x200 并且你是从屏幕的中心绘制的,没有检查 DI 寄存器中的地址计算结果。
要获得所需的循环,请进行以下更改:
org 100h
mov ax, 0013h
int 10h
mov ax, 0a000h
mov es, ax
NextCircle: ; Add this
mov cx, 360
...
fadd st0, st2 ; angle += 1
dec cx
jnz draw
xor ah, ah ; Maybe add this (To wait between circles)
int 16h ; Maybe add this (To wait between circles)
inc word [r] ; Add this
cmp word [r], 100 ; Add this
jb NextCircle ; Add this
finit
xor ah, ah
int 16h
mov ax, 0003h
int 10h
mov ax, 4c00h
int 21h
要隐藏之前的圆圈,您可以使用黑色 (AL=0) 重新绘制它。
我是汇编程序的新手,我正在寻找如何在我的代码中插入循环的简单解决方案。你们能给我提示或答案吗?我在 google 上找到了一些文章,但我无法理解它们,因为我很笨。我要做一个项目:水的动画,http://kino-ap.eng.hokudai.ac.jp/all-LiF.gif http://thumbs.dreamstime.com/z/circular-splash-drop-water-blue-forming-circle-waves-liquid-surface-37560386.jpg
我想用一个圆圈所以我找到了这段代码
; nasm -O999 -o kolo.com -f bin kolo.asm
org 100h
mov ax, 13h
int 10h
mov ax, 0a000h
mov es, ax
mov cx, 360
finit
fldpi
fild word [sto80]
fdivp st1, st0 ; pi/180
fld1
fild word [r] ; r, 1, pi/180
fldz ; angle=0, r, 1, pi/180
mov al, 15
draw:
fld st0 ; angle, angle, r, 1, pi/180
fmul st4 ; angle in radius
mov di, 100*320 + 160 ; middle of screen
fsin ; sin(angle), angle, r, 1, pi/180
fmul st2 ; sin(angle)*r, angle, r, 1, pi/180
fistp word [height] ; angle, r, 1, pi/180
fld st0 ; angle, angle, r, 1, pi/180
fmul st4 ; angle in radius
fcos ; cos(angle),angle, r, 1, pi/180
fmul st2 ; r*cos(angle), angle, r, 1, pi/180
fistp word [width] ; angle, r, 1, pi/180
add di, [width] ; add the horizontal length
mov dx, [height]
mov bx, dx
shl dx, 8
shl bx, 6
add dx, bx ; dx = height*320
sub di, dx ; We subtract the vertical distance
mov [es:di], al ; show pixel
fadd st0, st2 ; angle += 1
dec cx
jnz draw
finit
xor ah, ah
int 16h
mov ax, 3
int 10h
mov ax, 4c00h
int 21h
r dw 50
width dw 0
height dw 0
sto80 dw 180
现在我想添加一个圆圈,这个圆圈会增加。我需要添加一个循环来递增 r(对于 r=0;r<300;r++。在 r==300 之后更改 r=0)并重绘它并可能隐藏最后一个圆像素?
你不应该让你的半径大于 99,因为屏幕的尺寸是 320x200 并且你是从屏幕的中心绘制的,没有检查 DI 寄存器中的地址计算结果。
要获得所需的循环,请进行以下更改:
org 100h
mov ax, 0013h
int 10h
mov ax, 0a000h
mov es, ax
NextCircle: ; Add this
mov cx, 360
...
fadd st0, st2 ; angle += 1
dec cx
jnz draw
xor ah, ah ; Maybe add this (To wait between circles)
int 16h ; Maybe add this (To wait between circles)
inc word [r] ; Add this
cmp word [r], 100 ; Add this
jb NextCircle ; Add this
finit
xor ah, ah
int 16h
mov ax, 0003h
int 10h
mov ax, 4c00h
int 21h
要隐藏之前的圆圈,您可以使用黑色 (AL=0) 重新绘制它。