组装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) 重新绘制它。