diff --git a/lib/3d.asm b/lib/3d.asm new file mode 100644 index 0000000..3345e07 --- /dev/null +++ b/lib/3d.asm @@ -0,0 +1,1203 @@ +model tiny,stdcall +p586 +locals +jumps +codeseg +option procalign:byte + +include "..\include\mem.h" +include "..\include\graphic.h" +include "..\include\3d.h" + +org 0h + +header exe <"CE",1,0,0,offset exports,offset imports,,> + +exporting +declare draw3d_point +declare draw3d_line +declare draw3d_hidden +declare draw3d_hidden_fill +;declare load3ds +declare translate +declare translatex +declare translatey +declare translatez +declare scale +declare rescale +declare copy +declare fill +declare identity +declare rotationx +declare rotationy +declare rotationz +declare rotation +declare project +declare transform +declare multiply +ende + +importing +use GRAPHIC.LIB,line +use GRAPHIC.LIB,polyFill +use VIDEO,showpixel +endi + +;affiche liste vertex %0 +PROC draw3d_point FAR + ARG @vertex3d:word,@vertex2d:word,@camera:word,@color:word + USES cx,si + mov si,[@vertex2d] + call project,si,[@vertex3d],[@camera] + mov cx,[si] + inc si + inc si +@@draw: + call [cs:showpixel],[(vertex2d si).px],[(vertex2d si).py],[@color] + add si,4 + dec cx + jnz @@draw + ret +endp draw3d_point + +;affiche liste vertex %0 +PROC draw3d_line FAR + ARG @nbfaces:word,@faces:word,@vertex3d:word,@vertex2d:word,@camera:word,@color:word + USES ax,bx,cx,dx,si,di + mov di,[@faces] + mov si,[@vertex2d] + call project,si,[@vertex3d],[@camera] + mov cx,[di] + inc si + inc si + inc di + inc di +@@draw: + mov ax,[@nbfaces] + dec al + mov dx,di +@@drawset: + mov bx,[di] + shl bx,2 + push [@color] + push [(vertex2d bx+si).py] + push [(vertex2d bx+si).px] + add di,2 + mov bx,[di] + shl bx,2 + push [(vertex2d bx+si).py] + push [(vertex2d bx+si).px] + call [cs:line] + dec al + jnz @@drawset + push di + mov di,dx + mov bx,[di] + pop di + shl bx,2 + push [@color] + push [(vertex2d bx+si).py] + push [(vertex2d bx+si).px] + mov bx,[di] + shl bx,2 + push [word ptr bx+si+2] + push [word ptr bx+si] + call [cs:line] + add di,2 + dec cx + jnz @@draw + ret +endp draw3d_line + +;affiche liste vertex %0 +PROC draw3d_hidden FAR + ARG @nbfaces:word,@faces:word,@vertex3d:word,@vertex2d:word,@camera:word,@color:word + LOCAL @@a1:word,@@a2:word,@@b1:word + USES ax,bx,cx,dx,si,di + mov di,[@faces] + mov si,[@vertex2d] + call project,si,[@vertex3d],[@camera] + mov cx,[di] + inc si + inc si + inc di + inc di +@@draw: + push cx + mov si,[@vertex2d] + inc si + inc si + mov bx,[di+2] + shl bx,2 + mov cx,[(vertex2d bx+si).px] + mov dx,[(vertex2d bx+si).py] + mov bx,[di] + shl bx,2 + mov ax,[(vertex2d bx+si).px] + sub ax,cx + mov [@@a1],ax + mov ax,[(vertex2d bx+si).py] + sub ax,dx + mov [@@b1],ax + mov bx,[di+4] + shl bx,2 + mov ax,[(vertex2d bx+si).px] + sub ax,cx + mov [@@a2],ax + mov ax,[(vertex2d bx+si).py] + sub ax,dx + xor edx,edx + imul [@@a1] + and eax,0FFFFh + rol eax,16 + add eax,edx + rol eax,16 + mov ecx,eax + mov ax,[@@b1] + imul [@@a2] + and eax,0FFFFh + rol eax,16 + add eax,edx + rol eax,16 + sub ecx,eax + pop cx + jge @@nohidden + mov ax,[@nbfaces] + shl ax,1 + add di,ax + dec cx + jnz @@draw + jmp @@endof +@@nohidden: + mov ax,[@nbfaces] + dec al + mov dx,di +@@drawset: + mov bx,[di] + shl bx,2 + push [@color] + push [(vertex2d bx+si).py] + push [(vertex2d bx+si).px] + add di,2 + mov bx,[di] + shl bx,2 + push [(vertex2d bx+si).py] + push [(vertex2d bx+si).px] + call [cs:line] + dec al + jnz @@drawset + push di + mov di,dx + mov bx,[di] + pop di + shl bx,2 + push [@color] + push [(vertex2d bx+si).py] + push [(vertex2d bx+si).px] + mov bx,[di] + shl bx,2 + push [word ptr bx+si+2] + push [word ptr bx+si] + call [cs:line] + add di,2 + dec cx + jnz @@draw +@@endof: + ret +endp draw3d_hidden + +;creer table pour face caché %0 +PROC draw3d_hidden_fill FAR + ARG @nbfaces:word,@faces:word,@vertex3d:word,@vertex2d:word,@camera:word,@color:word + USES eax,bx,ecx,edx,si,di + LOCAL @@a1:word,@@a2:word,@@b1:word + mov di,[@faces] + call project,[@vertex2d],[@vertex3d],[@camera] + mov cx,[di] + inc di + inc di +@@calculvect: + push cx + mov si,[@vertex2d] + inc si + inc si + mov bx,[di+2] + shl bx,2 + mov cx,[(vertex2d bx+si).px] + mov dx,[(vertex2d bx+si).py] + mov bx,[di] + shl bx,2 + mov ax,[(vertex2d bx+si).px] + sub ax,cx + mov [@@a1],ax + mov ax,[(vertex2d bx+si).py] + sub ax,dx + mov [@@b1],ax + mov bx,[di+4] + shl bx,2 + mov ax,[(vertex2d bx+si).px] + sub ax,cx + mov [@@a2],ax + mov ax,[(vertex2d bx+si).py] + sub ax,dx + xor edx,edx + imul [@@a1] + rol eax,16 + add eax,edx + rol eax,16 + mov ecx,eax + mov ax,[@@b1] + imul [@@a2] + rol eax,16 + add eax,edx + rol eax,16 + sub ecx,eax + pop cx + jl @@hidden + mov ax,[@nbfaces] + mov si,[@vertex3d] + inc si + inc si + fld [cs:zero] +@@calcz: + mov bx,[di] + mov dx,bx + shl dx,2 + shl bx,3 + add bx,dx + fadd [(vertex3d bx+si).tz] + add di,2 + dec al + jnz @@calcz +@@hidden: + mov ax,[@nbfaces] + shl ax,1 + add di,ax +@@enofvalue: + dec cx + jnz @@calculvect + ret +endp draw3d_hidden_fill + + +;charge un fichier 3ds logé en %0 renvoie error +;1 non 3ds +;2 non 3 et > +;PROC load3ds FAR + ;ARG @pointer:word + ;USES eax,bx,cx,si,di +; + ;mov si,[@pointer] + ;cmp [word ptr si],main + ;jne @@error1 + ;cmp [word ptr si+28],3 + ;jb @@error2 +;@@reading: + ;mov ax,[si] + ;mov bx,[si+2] + ;cmp ax,main + ;je @@enter + ;cmp ax,edit + ;je @@enter + ;cmp ax,mesh + ;je @@enter + ;cmp ax,object + ;je @@readobject + ;cmp ax,vertex + ;je @@readvertex + ;cmp ax,locale + ;je @@readmatrix + ;cmp ax,face + ;je @@readfaces +;@@next: + ;add si,bx + ;jmp @@reading +;@@enter: + ;add si,6 + ;jmp @@reading +;@@readobject: + ;add si,6 + ;mov di,si + ;mov al,0 + ;cld + ;repne scasb + ;mov cx,di + ;sub cx,si + ;mov di,offset objectnamep + ;rep movsb + ;jmp @@reading +;@@readvertex: + ;add si,6 + ;mov ax,[si] + ;mov vertexnbp,ax + ;inc si + ;inc si + ;mov cx,ax + ;shl ax,1 + ;add cx,ax + ;mov di,offset vertexp + ;cld + ;rep movsd + ;jmp @@reading +;@@readmatrix: + ;add si,6 + ;mov di,offset matrixp + ;mov eax,[si] + ;mov [(mat di).p1],eax + ;mov eax,[si+4*1] + ;mov [(mat di).p5],eax + ;mov eax,[si+4*2] + ;mov [(mat di).p9],eax + ;mov eax,[si+4*3] + ;mov [(mat di).p2],eax + ;mov eax,[si+4*4] + ;mov [(mat di).p6],eax + ;mov eax,[si+4*5] + ;mov [(mat di).p10],eax + ;mov eax,[si+4*6] + ;mov [(mat di).p3],eax + ;mov eax,[si+4*7] + ;mov [(mat di).p7],eax + ;mov eax,[si+4*8] + ;mov [(mat di).p11],eax + ;mov eax,[si+4*9] + ;mov [(mat di).p4],eax + ;mov eax,[si+4*10] + ;mov [(mat di).p8],eax + ;mov eax,[si+4*11] + ;mov [(mat di).p12],eax + ;mov eax,[cs:un] + ;mov [(mat di).p16],eax + ;mov eax,0 + ;mov [(mat di).p13],eax + ;mov [(mat di).p14],eax + ;mov [(mat di).p15],eax + ;add si,12*4 + ;jmp @@reading +;@@readfaces: + ;add si,6 + ;mov ax,[si] + ;mov facenbp,ax + ;inc si + ;inc si + ;mov di,offset facep + ;cld +;@@readall: + ;mov cx,3 + ;rep movsw + ;inc si + ;inc si + ;dec ax + ;jnz @@readall + ;;jmp @@reading +; +;@@error1: +;@@error2: + ;ret +;endp load3ds + +un dd 1.0 +zero dd 0.0 + +;initialise une matrice de translation pour une translation TX,TY,TZ (%1,%2,%3) dans MATRICE %0 +; mat[ 0] = 1.0 +; mat[ 5] = 1.0 +; mat[10] = 1.0 +; mat[15] = 1.0 +; mat[ 3] = vecteur->x +; mat[ 7] = vecteur->y +; mat[11] = vecteur->z +PROC translate FAR + ARG @mat:word,@x:dword,@y:dword,@z:dword + USES eax,ecx,di,es + mov di,[@mat] + mov ecx,16 + mov eax,0 + push ds + pop es + cld + rep stosd + mov di,[@mat] + mov eax,[cs:un] + mov [di+0*4],eax + mov [di+5*4],eax + mov [di+10*4],eax + mov [di+15*4],eax + mov eax,[@x] + mov [di+3*4],eax + mov eax,[@y] + mov [di+7*4],eax + mov eax,[@z] + mov [di+11*4],eax + ret +ENDP translate + +;initialise une matrice de translation pour une translation TX %1 dans MATRICE %0 +; mat[ 0] = 1.0 +; mat[ 5] = 1.0 +; mat[10] = 1.0 +; mat[15] = 1.0 +; mat[ 3] = value +; mat[ 7] = 1 +; mat[11] = 1 +PROC translatex FAR + ARG @mat:word,@value:dword + USES eax,ecx,di,es + mov di,[@mat] + mov ecx,16 + mov eax,0 + push ds + pop es + cld + rep stosd + mov di,[@mat] + mov eax,[cs:un] + mov [di+0*4],eax + mov [di+5*4],eax + mov [di+10*4],eax + mov [di+15*4],eax + mov [di+7*4],eax + mov [di+11*4],eax + mov eax,[@value] + mov [di+3*4],eax + ret +ENDP translatex + + +;initialise une matrice de translation pour une translation TY %1 dans MATRICE %0 +; mat[ 0] = 1.0 +; mat[ 5] = 1.0 +; mat[10] = 1.0 +; mat[15] = 1.0 +; mat[ 3] = 1 +; mat[ 7] = value +; mat[11] = 1 +PROC translatey FAR + ARG @mat:word,@value:dword + USES eax,ecx,di,es + mov di,[@mat] + mov ecx,16 + mov eax,0 + push ds + pop es + cld + rep stosd + mov di,[@mat] + mov eax,[cs:un] + mov [di+0*4],eax + mov [di+5*4],eax + mov [di+10*4],eax + mov [di+15*4],eax + mov [di+3*4],eax + mov [di+11*4],eax + mov eax,[@value] + mov [di+7*4],eax + ret +ENDP translatey + +;initialise une matrice de translation pour une translation TZ %1 dans MATRICE %0 +; mat[ 0] = 1.0 +; mat[ 5] = 1.0 +; mat[10] = 1.0 +; mat[15] = 1.0 +; mat[ 3] = 1 +; mat[ 7] = 1 +; mat[11] = value +PROC translatez FAR + ARG @mat:word,@value:dword + USES eax,ecx,di,es + mov di,[@mat] + mov ecx,16 + mov eax,0 + push ds + pop es + cld + rep stosd + mov di,[@mat] + mov eax,[cs:un] + mov [di+0*4],eax + mov [di+5*4],eax + mov [di+10*4],eax + mov [di+15*4],eax + mov [di+3*4],eax + mov [di+7*4],eax + mov eax,[@value] + mov [di+11*4],eax + ret +ENDP translatez + +;initialise une matrice d'echelle %0 de facteur (x,y,z) %1-%3 +; mat[ 0] = factorx +; mat[ 5] = factory +; mat[10] = factorz +; mat[15] = 1.0 +; reste a 0 +PROC scale FAR + ARG @mat:word,@x:dword,@y:dword,@z:dword + USES eax,ecx,di,es + mov di,[@mat] + mov ecx,16 + mov eax,0 + push ds + pop es + cld + rep stosd + mov di,[@mat] + mov eax,[@x] + mov [di+0*4],eax + mov eax,[@y] + mov [di+5*4],eax + mov eax,[@z] + mov [di+10*4],eax + mov eax,[cs:un] + mov [di+15*4],eax + ret +ENDP scale + +;initialise une matrice d'echelle %0 de facteur value %1 +; mat[ 0] = factor +; mat[ 5] = factor +; mat[10] = factor +; mat[15] = 1.0 +; reste a 0 +PROC rescale FAR + ARG @mat:word,@value:dword + USES eax,ecx,di,es + mov di,[@mat] + mov ecx,16 + mov eax,0 + push ds + pop es + cld + rep stosd + mov di,[@mat] + mov eax,[@value] + mov [di+0*4],eax + mov [di+5*4],eax + mov [di+10*4],eax + mov eax,[cs:un] + mov [di+15*4],eax + ret +ENDP rescale + +;copy une matrice %0 en %1 +;mat2=mat1 +PROC copy FAR + ARG @mat1:word,@mat2:word + USES ecx,si,di,es + mov si,[@mat1] + mov di,[@mat2] + mov ecx,16 + push ds + pop es + cld + rep stosd + ret +ENDP copy + +;initialise une matrice %0 avec la valeur %1 +;mat[i]=value +PROC fill FAR + ARG @mat:word,@value:dword + USES eax,ecx,di,es + mov di,[@mat] + mov eax,[@value] + mov ecx,16 + push ds + pop es + cld + rep stosd + ret +ENDP fill + +;initialise une matrice d'identité %0 +; mat[0] = 1.0 +; mat[5] = 1.0 +; mat[10] = 1.0 +; mat[15] = 1.0 +; reste a 0 +PROC identity FAR + ARG @mat:word + USES eax,ecx,di,es + mov di,[@mat] + mov ecx,16 + mov eax,0 + push ds + pop es + cld + rep stosd + mov di,[@mat] + mov eax,[cs:un] + mov [di+0*4],eax + mov [di+5*4],eax + mov [di+10*4],eax + mov [di+15*4],eax + ret +ENDP identity + + +;initialise une matrice de rotation %0 autour de X de %1 degrees +; mat[ 5] = cos(angle) +; mat[ 6] = -sin(angle) +; mat[ 9] = sin(angle) +; mat[10] = cos(angle) +; mat[ 0] = 1.0 +; mat[15] = 1.0 +; reste a 0 +PROC rotationx FAR + ARG @mat:word,@value:dword + USES eax,ecx,di,es + mov di,[@mat] + mov ecx,16 + mov eax,0 + push ds + pop es + cld + rep stosd + mov di,[@mat] + fld [@value] + fsincos +;mat[ 5] = cos(angle); + fst [dword ptr di+5*4] +;mat[ 10] = cos(angle); + fstp [dword ptr di+10*4] +;mat[ 9] = sin(angle); + fst [dword ptr di+9*4] +;mat[ 6] = -sin(angle); + fchs + fstp [dword ptr di+6*4] +;mat[ 0] = 1.0 +;mat[15] = 1.0 + mov eax,[cs:un] + mov [di+0*4],eax + mov [di+15*4],eax + ret +endp rotationx + +;initialise une matrice de rotation BX autour de Y de %0 degrees +; mat[ 0] = cos(angle) +; mat[ 8] = -sin(angle) +; mat[ 2] = sin(angle) +; mat[10] = cos(angle) +; mat[ 5] = 1.0 +; mat[15] = 1.0 +; reste a 0 +PROC rotationy FAR + ARG @mat:word,@value:dword + USES eax,ecx,di,es + mov di,[@mat] + mov ecx,16 + mov eax,0 + push ds + pop es + cld + rep stosd + mov di,[@mat] + fld [@value] + fsincos +;mat[ 0] = cos(angle) + fst [dword ptr di+0*4] +;mat[ 10] = cos(angle) + fstp [dword ptr di+10*4] +;mat[ 2] = sin(angle) + fst [dword ptr di+2*4] + fchs +;mat[ 8] = -sin(angle) + fstp [dword ptr di+8*4] +;mat[ 5] = 1.0 +;mat[15] = 1.0 + mov eax,[cs:un] + mov [di+5*4],eax + mov [di+15*4],eax + ret +endp rotationy + +;initialise une matrice de rotation %0 autour de Z de %1 degrees +; mat[ 0] = cos(angle) +; mat[ 1] = -sin(angle) +; mat[ 4] = sin(angle) +; mat[ 5] = cos(angle) +; mat[10] = 1.0 +; mat[15] = 1.0 +; reste a 0 +PROC rotationz FAR + ARG @mat:word,@value:dword + USES eax,ecx,di,es + mov di,[@mat] + mov ecx,16 + mov eax,0 + push ds + pop es + cld + rep stosd + mov di,[@mat] + fld [@value] + fsincos +;mat[ 0] = cos(angle) + fst [dword ptr di+0*4] +;mat[ 5] = cos(angle) + fstp [dword ptr di+5*4] +;mat[ 4] = sin(angle) + fst [dword ptr di+4*4] + fchs +;mat[ 1] = -sin(angle) + fstp [dword ptr di+1*4] +;mat[10] = 1.0 +;mat[15] = 1.0 + mov eax,[cs:un] + mov [di+10*4],eax + mov [di+15*4],eax + ret +endp rotationz + +;initialise une matrice de rotation %0 autour de X,Y,Z de %0-%3 degrees +; mat[ 0] = cos(angleY)*cos(angleZ) +; mat[ 1] = cos(angleY)*sin(angleZ) +; mat[ 2] = -sin(angleY) +; mat[ 4] = sin(angleX)*sin(angleY)*cos(angleZ)+cos(angleX)*-sin(angleZ) +; mat[ 5] = sin(angleX)*sin(angleY)*sin(angleZ)+cos(angleX)*cos(angleZ) +; mat[ 6] = sin(angleX)*cos(angleY) +; mat[ 8] = cos(angleX)*sin(angleY)*cos(angleZ)+sin(angleX)*sin(angleZ) +; mat[ 9] = cos(angleX)*sin(angleY)*sin(angleZ)-sin(angleX)*cos(angleZ) +; mat[ 10] = cos(angleX)*cos(angleY) +; mat[3] = 0.0 +; mat[7] = 0.0 +; mat[11] = 0.0 +; mat[12] = 0.0 +; mat[13] = 0.0 +; mat[14] = 0.0 +; mat[15] = 1.0 +; reste a 0 +PROC rotation FAR + ARG @mat:word,@anglex:dword,@angley:dword,@anglez:dword + USES eax,ecx,di,es + mov di,[@mat] + mov ecx,16 + mov eax,0 + push ds + pop es + cld + rep stosd + mov di,[@mat] +;st(1) sin(angleZ) +;st(2) cos(angleZ) +;st(3) sin(angleY) +;st(4) cos(angleY) +;st(5) sin(angleX) +;st(6) cos(angleX) + fld [@anglex] + fsincos + fld [@angley] + fsincos + fld [@anglez] + fsincos +;Cos(angleY)*Cos(angleZ) + fld st(3) + fmul st(0),st(2) +;mat[0] + fstp [dword ptr di+0*4] +;Cos(angleY)*Sin(angleZ) + fld st(3) + fmul st(0),st(1) +;mat[1] + fstp [dword ptr di+1*4] +;-Sin(angley) + fld st(2) + fchs +;mat[2] + fstp [dword ptr di+2*4] + mov eax,[cs:un] + mov [di+15*4],eax + ret +endp rotation + + +factor dd 128.0 + +;Transforme la liste de vertex 3D pointé par %0 en vertex 2D dans %1 en utilisant %2 comme origine pour %3 valeurs +; vertex2d[i].px=int((vertex3d[i].tx*factor)/(vertex3d[i].tz+origin.Z)+origin.X) +; vertex2d[i].py=int((vertex3d[i].ty*factor)/(vertex3d[i].tz+origin.Z)+origin.Y) +PROC project FAR + ARG @vertex2d:word,@vertex3d:word,@origin:word + USES cx,bx,si,di + mov si,[@vertex3d] + mov bx,[@vertex2d] + mov di,[@origin] + mov cx,[si] + mov [bx],cx + inc si + inc si + inc bx + inc bx +@@boucle: +;(vertex3d[i].z+origZ) + fld [(vertex3d si).tz] + fadd [(vertex3d di).tz] +;(vertex3d[i].tx*factor) + fld [(vertex3d si).tx] + fmul [cs:factor] +;(vertex3d[i].tx*factor)/(vertex3d[i].tz+origZ) + fdiv st,st(1) +;(vertex3d[i].tx*factor)/(vertex3d[i].tz+origZ)+origX + fadd [(vertex3d di).tx] +;vertex2d[i].tx=int((vertex3d[i].tx*factor)/(vertex3d[i].tz+origZ)+origX) + fistp [(vertex2d bx).px] +;(vertex3d[i].z+origZ) +;(vertex3d[i].ty*factor) + fld [(vertex3d si).ty] + fmul [cs:factor] +;(vertex3d[i].ty*factor)/(vertex3d[i].tz+origZ) + fdivrp st(1) +;(vertex3d[i].ty*factor)/(vertex3d[i].tz+origZ)+origY + fadd [(vertex3d di).ty] +;vertex2d[i].ty=int((vertex3d[i].ty*factor)/(vertex3d[i].tz+origZ)+origY) + fistp [(vertex2d bx).py] + add si,size vertex3d + add bx,size vertex2d + dec cx + jnz @@boucle + ret +endp project + + +;transforme les points %0 avec la matrice %1 + +; vertex3d_2 = mat * vertex3d + +; w = mat[12]*vertex3d[i].tx + mat[13]*vertex3d[i].ty + mat[14]*vertex3d[i].tz + mat[15] +; vertex3d_2[i].tx = mat[ 0]*vertex3d[i].tx + mat[ 1]*vertex3d[i].ty + mat[ 2]*vertex3d[i].tz + mat[ 3] +; vertex3d_2[i].ty = mat[ 4]*vertex3d[i].tx + mat[ 5]*vertex3d[i].ty + mat[ 6]*vertex3d[i].tz + mat[ 7] +; vertex3d_2[i].tz = mat[ 8]*vertex3d[i].tx + mat[ 9]*vertex3d[i].ty + mat[10]*vertex3d[i].tz + mat[11] +PROC transform FAR + ARG @vertex3d:word,@mat:word + USES cx,si,di + mov si,[@vertex3d] + mov cx,[si] + inc si + inc si + mov di,[@mat] +@@boucle: +;Calcul du facteur echelle +;mat[12]*vertex3d[i].tx + fld [(vertex3d si).tx] + fmul [dword ptr di+12*4] +;mat[13]*vertex3d[i].ty + fld [(vertex3d si).ty] + fmul [dword ptr di+13*4] +;mat[12]*vertex3d[i].tx + mat[13]*vertex3d[i].ty + faddp st(1) +;mat[14]*vertex3d.tz + fld [(vertex3d si).tz] + fmul [dword ptr di+14*4] +;mat[12]*vertex3d[i].tx + mat[13]*vertex3d[i].ty + mat[14]*vertex3d[i].tz + faddp st(1) +;mat[12]*vertex3d[i].tx + mat[13]*vertex3d[i].ty + mat[14]*vertex3d[i].tz + mat[15] + fadd [dword ptr di+15*4] +;w=0.0 ?? + ftst +;-> AX + fstsw ax + +;vertex3d.tx vertex3d.ty et vertex3d.tz + fld [(vertex3d si).tx] + fmul [dword ptr di+0*4] + fld [(vertex3d si).ty] + fmul [dword ptr di+1*4] + faddp st(1) + fld [(vertex3d si).tz] + fmul [dword ptr di+2*4] + faddp st(1) + fadd [dword ptr di+3*4] + + fld [(vertex3d si).tx] + fmul [dword ptr di+4*4] + fld [(vertex3d si).ty] + fmul [dword ptr di+5*4] + faddp st(1) + fld [(vertex3d si).tz] + fmul [dword ptr di+6*4] + faddp st(1) + fadd [dword ptr di+7*4] + + fld [(vertex3d si).tx] + fmul [dword ptr di+8*4] + fld [(vertex3d si).ty] + fmul [dword ptr di+9*4] + faddp st(1) + fld [(vertex3d si).tz] + fmul [dword ptr di+10*4] + faddp st(1) + fadd [dword ptr di+11*4] + +;w=0.0 + sahf + jz @@divby0 +;vertex3d.tx=vertex3d[i].tz/w + fdiv st,st(3) + fstp [(vertex3d si).tz] +;vertex3d.ty=vertex3d[i].ty/w + fdiv st,st(2) + fstp [(vertex3d si).ty] +;vertex3d.tz=vertex3d[i].tx/w + fdivrp st(1),st + fstp [(vertex3d si).tx] +;No div by 0 + jmp @@nodiv +@@divby0: + fstp [(vertex3d si).tz] + fstp [(vertex3d si).ty] + fstp [(vertex3d si).tx] + ffree +@@nodiv: + add si,size vertex3d + dec cx + jnz @@boucle + ret +endp transform + +;Multiplie la matrice de transformation %0 par celle en %1 et met les resultat en %2 + +; mat = p1 * p2 + +; mat[ 0] = (p1[ 0]*p2[ 0])+(p1[ 1]*p2[ 4])+(p1[ 2]*p2[ 8])+(p1[ 3]*p2[12]); +; mat[ 4] = (p1[ 4]*p2[ 0])+(p1[ 5]*p2[ 4])+(p1[ 6]*p2[ 8])+(p1[ 7]*p2[12]); +; mat[ 8] = (p1[ 8]*p2[ 0])+(p1[ 9]*p2[ 4])+(p1[10]*p2[ 8])+(p1[11]*p2[12]); +; mat[12] = (p1[12]*p2[ 0])+(p1[13]*p2[ 4])+(p1[14]*p2[ 8])+(p1[15]*p2[12]); +; mat[ 1] = (p1[ 0]*p2[ 1])+(p1[ 1]*p2[ 5])+(p1[ 2]*p2[ 9])+(p1[ 3]*p2[13]); +; mat[ 5] = (p1[ 4]*p2[ 1])+(p1[ 5]*p2[ 5])+(p1[ 6]*p2[ 9])+(p1[ 7]*p2[13]); +; mat[ 9] = (p1[ 8]*p2[ 1])+(p1[ 9]*p2[ 5])+(p1[10]*p2[ 9])+(p1[11]*p2[13]); +; mat[13] = (p1[12]*p2[ 1])+(p1[13]*p2[ 5])+(p1[14]*p2[ 9])+(p1[15]*p2[13]); +; mat[ 2] = (p1[ 0]*p2[ 2])+(p1[ 1]*p2[ 6])+(p1[ 2]*p2[10])+(p1[ 3]*p2[14]); +; mat[ 6] = (p1[ 4]*p2[ 2])+(p1[ 5]*p2[ 6])+(p1[ 6]*p2[10])+(p1[ 7]*p2[14]); +; mat[10] = (p1[ 8]*p2[ 2])+(p1[ 9]*p2[ 6])+(p1[10]*p2[10])+(p1[11]*p2[14]); +; mat[14] = (p1[12]*p2[ 2])+(p1[13]*p2[ 6])+(p1[14]*p2[10])+(p1[15]*p2[14]); +; mat[ 3] = (p1[ 0]*p2[ 3])+(p1[ 1]*p2[ 7])+(p1[ 2]*p2[11])+(p1[ 3]*p2[15]); +; mat[ 7] = (p1[ 4]*p2[ 3])+(p1[ 5]*p2[ 7])+(p1[ 6]*p2[11])+(p1[ 7]*p2[15]); +; mat[11] = (p1[ 8]*p2[ 3])+(p1[ 9]*p2[ 7])+(p1[10]*p2[11])+(p1[11]*p2[15]); +; mat[15] = (p1[12]*p2[ 3])+(p1[13]*p2[ 7])+(p1[14]*p2[11])+(p1[15]*p2[15]); + +PROC multiply FAR + ARG @p1:word,@p2:word,@mat:word + USES bx,si,di + mov si,[@p1] + mov di,[@p2] + mov bx,[@mat] +;0,0 +;p1[ 0]*p2[ 0] + fld [dword ptr si+0*4] + fmul [dword ptr di+0*4] +;p1[ 1]*p2[ 4] + fld [dword ptr si+1*4] + fmul [dword ptr di+4*4] +;(p1[ 0]*p2[ 0])+(p1[ 1]*p2[ 4]) + faddp st(1) +;p1[ 2]*p2[ 8] + fld [dword ptr si+2*4] + fmul [dword ptr di+8*4] +;(p1[ 0]*p2[ 0])+(p1[ 1]*p2[ 4])+(p1[ 2]*p2[ 8]) + faddp st(1) +;p1[ 3]*p2[12] + fld [dword ptr si+3*4] + fmul [dword ptr di+12*4] +;(p1[ 0]*p2[ 0])+(p1[ 1]*p2[ 4])+(p1[ 2]*p2[ 8])+(p1[ 3]*p2[12]) + faddp st(1) + fstp [dword ptr bx+0*4] +;mat[ 0] + +;1,0 + fld [dword ptr si+0*4] + fmul [dword ptr di+1*4] + fld [dword ptr si+1*4] + fmul [dword ptr di+5*4] + faddp st(1) + fld [dword ptr si+2*4] + fmul [dword ptr di+9*4] + faddp st(1) + fld [dword ptr si+3*4] + fmul [dword ptr di+13*4] + faddp st(1) + fstp [dword ptr bx+1*4] +;2,0 + fld [dword ptr si+0*4] + fmul [dword ptr di+2*4] + fld [dword ptr si+1*4] + fmul [dword ptr di+6*4] + faddp st(1) + fld [dword ptr si+2*4] + fmul [dword ptr di+10*4] + faddp st(1) + fld [dword ptr si+3*4] + fmul [dword ptr di+14*4] + faddp st(1) + fstp [dword ptr bx+2*4] +;3,0 + fld [dword ptr si+0*4] + fmul [dword ptr di+3*4] + fld [dword ptr si+1*4] + fmul [dword ptr di+7*4] + faddp st(1) + fld [dword ptr si+2*4] + fmul [dword ptr di+11*4] + faddp st(1) + fld [dword ptr si+3*4] + fmul [dword ptr di+15*4] + faddp st(1) + fstp [dword ptr bx+3*4] +;0,1 + fld [dword ptr si+4*4] + fmul [dword ptr di+0*4] + fld [dword ptr si+5*4] + fmul [dword ptr di+4*4] + faddp st(1) + fld [dword ptr si+6*4] + fmul [dword ptr di+8*4] + faddp st(1) + fld [dword ptr si+7*4] + fmul [dword ptr di+12*4] + faddp st(1) + fstp [dword ptr bx+4*4] +;1,1 + fld [dword ptr si+4*4] + fmul [dword ptr di+1*4] + fld [dword ptr si+5*4] + fmul [dword ptr di+5*4] + faddp st(1) + fld [dword ptr si+6*4] + fmul [dword ptr di+9*4] + faddp st(1) + fld [dword ptr si+7*4] + fmul [dword ptr di+13*4] + faddp st(1) + fstp [dword ptr bx+5*4] +;2,1 + fld [dword ptr si+4*4] + fmul [dword ptr di+2*4] + fld [dword ptr si+5*4] + fmul [dword ptr di+6*4] + faddp st(1) + fld [dword ptr si+6*4] + fmul [dword ptr di+10*4] + faddp st(1) + fld [dword ptr si+7*4] + fmul [dword ptr di+14*4] + faddp st(1) + fstp [dword ptr bx+6*4] +;3,1 + fld [dword ptr si+4*4] + fmul [dword ptr di+3*4] + fld [dword ptr si+5*4] + fmul [dword ptr di+7*4] + faddp st(1) + fld [dword ptr si+6*4] + fmul [dword ptr di+11*4] + faddp st(1) + fld [dword ptr si+7*4] + fmul [dword ptr di+15*4] + faddp st(1) + fstp [dword ptr bx+7*4] +;0,2 + fld [dword ptr si+8*4] + fmul [dword ptr di+0*4] + fld [dword ptr si+9*4] + fmul [dword ptr di+4*4] + faddp st(1) + fld [dword ptr si+10*4] + fmul [dword ptr di+8*4] + faddp st(1) + fld [dword ptr si+11*4] + fmul [dword ptr di+12*4] + faddp st(1) + fstp [dword ptr bx+8*4] +;1,2 + fld [dword ptr si+8*4] + fmul [dword ptr di+1*4] + fld [dword ptr si+9*4] + fmul [dword ptr di+5*4] + faddp st(1) + fld [dword ptr si+10*4] + fmul [dword ptr di+9*4] + faddp st(1) + fld [dword ptr si+11*4] + fmul [dword ptr di+13*4] + faddp st(1) + fstp [dword ptr bx+9*4] +;2,2 + fld [dword ptr si+8*4] + fmul [dword ptr di+2*4] + fld [dword ptr si+9*4] + fmul [dword ptr di+6*4] + faddp st(1) + fld [dword ptr si+10*4] + fmul [dword ptr di+10*4] + faddp st(1) + fld [dword ptr si+11*4] + fmul [dword ptr di+14*4] + faddp st(1) + fstp [dword ptr bx+10*4] +;3,2 + fld [dword ptr si+8*4] + fmul [dword ptr di+3*4] + fld [dword ptr si+9*4] + fmul [dword ptr di+7*4] + faddp st(1) + fld [dword ptr si+10*4] + fmul [dword ptr di+11*4] + faddp st(1) + fld [dword ptr si+11*4] + fmul [dword ptr di+15*4] + faddp st(1) + fstp [dword ptr bx+11*4] +;0,3 + fld [dword ptr si+12*4] + fmul [dword ptr di+0*4] + fld [dword ptr si+13*4] + fmul [dword ptr di+4*4] + faddp st(1) + fld [dword ptr si+14*4] + fmul [dword ptr di+8*4] + faddp st(1) + fld [dword ptr si+15*4] + fmul [dword ptr di+12*4] + faddp st(1) + fstp [dword ptr bx+12*4] +;1,3 + fld [dword ptr si+12*4] + fmul [dword ptr di+1*4] + fld [dword ptr si+13*4] + fmul [dword ptr di+5*4] + faddp st(1) + fld [dword ptr si+14*4] + fmul [dword ptr di+9*4] + faddp st(1) + fld [dword ptr si+15*4] + fmul [dword ptr di+13*4] + faddp st(1) + fstp [dword ptr bx+13*4] +;2,3 + fld [dword ptr si+12*4] + fmul [dword ptr di+2*4] + fld [dword ptr si+13*4] + fmul [dword ptr di+6*4] + faddp st(1) + fld [dword ptr si+14*4] + fmul [dword ptr di+10*4] + faddp st(1) + fld [dword ptr si+15*4] + fmul [dword ptr di+14*4] + faddp st(1) + fstp [dword ptr bx+14*4] +;3,3 + fld [dword ptr si+12*4] + fmul [dword ptr di+3*4] + fld [dword ptr si+13*4] + fmul [dword ptr di+7*4] + faddp st(1) + fld [dword ptr si+14*4] + fmul [dword ptr di+11*4] + faddp st(1) + fld [dword ptr si+15*4] + fmul [dword ptr di+15*4] + faddp st(1) + fstp [dword ptr bx+15*4] + ret +endp multiply