8个立方体重叠的3d特效
;MASM6.11 编译方法:
;masm /l %1.asm
;link /tiny %1.obj
;
Code Segment
assume cs:code,ds:code,es:code
.386P
Org 100h
start:
push cs
pop ds
mov ax,13h
int 10h
push 5000h
pop fs
@main:push fs
pop es
xor eax,eax
xor di,di
mov ch,3eh
rep stosd
push cs
pop es
mov cx,10
mov zof,2400
sh: push cx
lea di, p1 ;对P1~P8分别赋值
lea si, box
mov cx,8
so:call update
loop so
call drwline
pop cx
sub zof,200
loop sh
push fs
push 0a000h
pop es
pop ds
xor si,si
xor di,di
mov ch,3eh
rep movsd
push cs
push cs
pop ds
pop es
call wtforVideo
jmp short @main
exit: mov ax,3
int 10h
mov ah,4ch
int 21h
;==================
wtforVideo:
inc xrot
inc yrot
inc zrot
mov dx,3dah
ta: in al,dx
test al,8
jnz ta
tb: in al,dx
test al,8
jz tb
in al,60h
cmp al,1
je exit
ret
;==================
drwline:
sl Macro a,b
mov ax,[a]
mov Xdot,ax
mov ax,[a+2]
mov Ydot,ax
mov bx,[b]
mov ax,[b+2]
call line
endm
sl p1,p2
sl p2,p3
sl p3,p4
sl p4,p1
sl p5,p6
sl p6,p7
sl p7,p8
sl p8,p5
sl p1,p5
sl p2,p6
sl p3,p7
sl p4,p8
ret
;==================
line:PUSHA ;input(Xdot=beginX Ydot=beginY bx=endX ax=endY)
mov cx, 1
mov dx, 140h
@0: sub bx, Xdot ;BX=deX
Jns @1
neg cx
neg bx
@1: sub ax, Ydot ;AX=deY
Jns @2
neg dx
neg ax
@2: cmp bx, ax
Ja @3
Xchg cx,dx ;swap(sdx,sdy)
Xchg ax,bx ;swap(dex,dey)
@3: mov lcnt, bx ;save(count)
cmp bx,1
jl e
cmp bx,379
jg e
shl ax, 1 ;2dY
mov di, ax ;save 2dY
shl bx, 1 ;2dX
mov si, bx ;save 2dX
mov bp,Ydot
imul bp,140h
add bp,Xdot
@p:mov byte ptr fs:[bp],52h
nodot: add bp,cx
cmp ax,bx
Jl @n
add bp,dx
sub ax, si
@n:
add ax, di
dec lcnt
Jnz @p
e: POPA
ret
;=====================
sincos:
fldpi
fidiv rota
fimul word ptr [xrot+bp]
fst tan
fsincos
fxch
fimul zp
fistp zt
fimul yp
fisub zt
fistp yt
push yt
fld tan
fsincos
fimul zp
fistp zt
fimul yp
fiadd zt
fistp zp
pop yp
ret
resincos:
add bp, 2
mov ax, zp
xchg ax,xp
xchg ax,yp
xchg ax,zp
call sincos
ret
;==================
update:
lodsw
mov xp,ax
lodsw
mov yp,ax
lodsw
mov zp,ax
xor bp,bp
call sincos
call resincos
call resincos
mov bx, zp
add bx,zof
mov ax,xp
imul xof
idiv bx
add ax,Xpos
stosw ;send x
mov ax,yp
imul yof
idiv bx
add ax,Ypos
stosw ;send y
mov ax,zp
stosw ;send z ;di+=6
ret
;=====================
Xpos dw 160
Ypos dw 100
rota dw 180
Xof dw 256
Yof dw 256
Zof dw 640
box dw -o,-o,-o
dw o,-o,-o
dw o, o,-o
dw -o, o,-o
dw -o,-o,o
dw o,-o,o
dw o, o,o
dw -o, o,o
p1 dw ?,?,?
p2 dw ?,?,?
p3 dw ?,?,?
p4 dw ?,?,?
p5 dw ?,?,?
p6 dw ?,?,?
p7 dw ?,?,?
p8 dw ?,?,?
Xdot dw ?
Ydot dw ?
lcnt dw ?
Xt dw ?
Yt dw ?
Zt dw ?
Xp dw ?
Yp dw ?
Zp dw ?
Xrot dw ?
Yrot dw ?
Zrot dw ?
tan dd ?
o equ 120
;=====================
code ends
end START