汇编程序丰满/水动画

时间:2015-05-31 19:18:21

标签: assembly nasm interrupt dos

我是汇编程序的新手,我正在寻找如何在我的代码中插入循环的简单解决方案。你们能给我一个提示或答案吗?我在谷歌上发现了一些文章,我无法理解它们因为我很愚蠢。我做了一个项目:水动画,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

我想使用Circle,所以我找到了这段代码

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)并重绘它并可能隐藏最后一个圆形像素?

1 个答案:

答案 0 :(得分:1)

你不应该让你的半径大于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)重绘它。