123 lines
1.7 KiB
Text
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
|