SecondReality/VISU/MATRIX.CUT
2017-09-24 01:45:36 +02:00

123 lines
1.7 KiB
Text

;used for matrix inverses
invmacro MACRO row1,row2,col1,col2
mov ax,es:[di+col1+row1*6]
imul word ptr es:[di+col2*2+row2*6]
mov cx,dx
mov bx,ax
mov ax,es:[di+col1*2+row2*6]
imul word ptr es:[di+col2*2+row1*6]
sub cx,dx
sbb bx,ax
shld ecx,bx,1+16
ENDM
;entry: es:di=matrix1
; exit: es:di=matrix1 (overwritten by it's inverse)
invmatrix PROC NEAR
invmacro 1,2,1,2
push ecx ;(0,0)
movsx eax,es:[di+0*2+0*6]
imul ecx
mov esi,eax
invmacro 2,0,1,2
neg ecx
push ecx ;(1,0)
movsx eax,es:[di+1*2+0*6]
imul ecx
add esi,eax
invmacro 0,1,1,2
push ecx ;(2,0)
movsx eax,es:[di+2*2+0*6]
imul ecx
add esi,edx
;si=determinant
or si,si
jnz @@1
pop cx
pop cx
pop cx
ret ;matrix can not be inversed
@@1:
invmacro 1,2,0,2
neg ecx
push ecx ;(0,0)
invmacro 2,0,0,2
push ecx ;(1,0)
invmacro 0,1,0,2
neg ecx
push ecx ;(2,0)
invmacro 1,2,0,1
push ecx ;(0,0)
invmacro 2,0,0,1
neg ecx
push ecx ;(1,0)
invmacro 0,1,0,1
push ecx ;(2,0)
pop dx
xor ax,ax
sar dx,1
rcr ax,1
idiv si
mov es:[di+0*2+0*6],ax
pop dx
xor ax,ax
sar dx,1
rcr ax,1
idiv si
mov es:[di+0*2+1*6],ax
pop dx
xor ax,ax
sar dx,1
rcr ax,1
idiv si
mov es:[di+0*2+2*6],ax
pop dx
xor ax,ax
sar dx,1
rcr ax,1
idiv si
mov es:[di+1*2+0*6],ax
pop dx
xor ax,ax
sar dx,1
rcr ax,1
idiv si
mov es:[di+1*2+1*6],ax
pop dx
xor ax,ax
sar dx,1
rcr ax,1
idiv si
mov es:[di+1*2+2*6],ax
pop dx
xor ax,ax
sar dx,1
rcr ax,1
idiv si
mov es:[di+2*2+0*6],ax
pop dx
xor ax,ax
sar dx,1
rcr ax,1
idiv si
mov es:[di+2*2+1*6],ax
pop dx
xor ax,ax
sar dx,1
rcr ax,1
idiv si
mov es:[di+2*2+2*6],ax
ret
invmatrix ENDP