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

164 lines
3.1 KiB
Text

ALIGN 4
invm dd 0,0,0,0,0,0 ,0,0
dd 0,0,0,0,0,0 ,0,0
dd 0,0,0,0,0,0 ,0,0
invswap MACRO zl1,zl2
zzz=0
REPT 6
mov eax,cs:invm[zl1*32+zzz]
xchg eax,cs:invm[zl2*32+zzz]
mov cs:invm[zl1*32+zzz],eax
zzz=zzz+4
ENDM
ENDM
submacro MACRO zsub,zto,zmul,zdiv
;row[to]-=row[add]*zmul/zdiv
zzz=0
REPT 6
mov eax,cs:invm[zzz+zsub*32]
imul zmul
idiv zdiv
sub cs:invm[zzz+zto*32],eax
zzz=zzz+4
ENDM
ENDM
addmacro MACRO zadd,zto
;row[to]+=row[add]
zzz=0
REPT 6
mov eax,cs:invm[zzz+zadd*32]
add cs:invm[zzz+zto*32],eax
zzz=zzz+4
ENDM
ENDM
scalemacro MACRO zto,zdiv
mov ecx,32767
zzz=0
REPT 6
mov eax,cs:invm[zzz+zto*32]
imul ecx
idiv zdiv
mov cs:invm[zzz+zto*32],eax
zzz=zzz+4
ENDM
ENDM
;entry: es:di=matrix1
; exit: es:di=matrix1 (overwritten by it's inverse)
invmatrix PROC NEAR
xor ecx,ecx
mov ebx,32767
movsx eax,word ptr es:[di+0]
mov cs:invm[0],eax
movsx eax,word ptr es:[di+2]
mov cs:invm[4],eax
movsx eax,word ptr es:[di+4]
mov cs:invm[8],eax
mov cs:invm[12],ebx
mov cs:invm[16],ecx
mov cs:invm[20],ecx
movsx eax,word ptr es:[di+6]
mov cs:invm[32+0],eax
movsx eax,word ptr es:[di+8]
mov cs:invm[32+4],eax
movsx eax,word ptr es:[di+10]
mov cs:invm[32+8],eax
mov cs:invm[32+12],ecx
mov cs:invm[32+16],ebx
mov cs:invm[32+20],ecx
movsx eax,word ptr es:[di+12]
mov cs:invm[64+0],eax
movsx eax,word ptr es:[di+14]
mov cs:invm[64+4],eax
movsx eax,word ptr es:[di+16]
mov cs:invm[64+8],eax
mov cs:invm[64+12],ecx
mov cs:invm[64+16],ecx
mov cs:invm[64+20],ebx
;
int 3
mov ecx,cs:invm[4*0+32*0]
mov ebx,cs:invm[4*0+32*1]
mov eax,cs:invm[4*0+32*2]
or ecx,ecx
jnz @@1
or ebx,ebx
jnz @@2
or eax,eax
jz @@0
mov ecx,eax
addmacro 0,2
jmp @@1
@@2: mov ecx,ebx
addmacro 0,1
@@1: mov ebx,cs:invm[4*0+32*1]
or ebx,ebx
jz @@3
submacro 0,1,ebx,ecx
@@3: mov ebx,cs:invm[4*0+32*2]
or ebx,ebx
jz @@4
submacro 0,2,ebx,ecx
@@4:
mov ecx,cs:invm[4*1+32*1]
mov ebx,cs:invm[4*1+32*2]
or ecx,ecx
jnz @@b1
or ebx,ebx
jz @@0
mov ecx,ebx
addmacro 1,2
@@b1: mov ebx,cs:invm[4*1+32*0]
or ebx,ebx
jz @@b3
submacro 1,0,ebx,ecx
@@b3: mov ebx,cs:invm[4*1+32*2]
or ebx,ebx
jz @@b4
submacro 1,2,ebx,ecx
@@b4:
mov ecx,cs:invm[4*2+32*2]
or ecx,ecx
jz @@0
mov ebx,cs:invm[4*2+32*0]
or ebx,ebx
jz @@c3
submacro 2,0,ebx,ecx
@@c3: mov ebx,cs:invm[4*2+32*1]
or ebx,ebx
jz @@c4
submacro 2,1,ebx,ecx
@@c4:
mov ebx,cs:invm[4*0+32*0]
scalemacro 0,ebx
mov ebx,cs:invm[4*1+32*1]
scalemacro 1,ebx
mov ebx,cs:invm[4*2+32*2]
scalemacro 2,ebx
int 3
mov ax,word ptr cs:invm[12+4*0+32*0]
mov es:[di+0],ax
mov ax,word ptr cs:invm[12+4*1+32*0]
mov es:[di+2],ax
mov ax,word ptr cs:invm[12+4*2+32*0]
mov es:[di+4],ax
mov ax,word ptr cs:invm[12+4*0+32*1]
mov es:[di+6],ax
mov ax,word ptr cs:invm[12+4*1+32*1]
mov es:[di+8],ax
mov ax,word ptr cs:invm[12+4*2+32*1]
mov es:[di+10],ax
mov ax,word ptr cs:invm[12+4*0+32*2]
mov es:[di+12],ax
mov ax,word ptr cs:invm[12+4*1+32*2]
mov es:[di+14],ax
mov ax,word ptr cs:invm[12+4*2+32*2]
mov es:[di+16],ax
@@0: ret
invmatrix ENDP