1260 lines
23 KiB
NASM
1260 lines
23 KiB
NASM
|
||
.386p
|
||
jumps
|
||
|
||
.model SMALL, SYSCALL
|
||
|
||
include P_define.ash
|
||
|
||
.data
|
||
|
||
include \projet\lib386\lib_sys\lib_sys.ash
|
||
|
||
Comment @
|
||
|
||
SqrTab dw 0807Fh,0817Dh,08279h,08374h,0846Ch,08562h,08657h,0874Ah
|
||
dw 0883Ch,0892Bh,08A19h,08B06h,08BF1h,08CDAh,08DC2h,08EA9h
|
||
dw 08F8Eh,09071h,09153h,09234h,09314h,093F2h,094CFh,095AAh
|
||
dw 09684h,0975Dh,09835h,0990Ch,099E2h,09AB6h,09B89h,09C5Bh
|
||
dw 09D2Ch,09DFCh,09ECBh,09F99h,0A066h,0A132h,0A1FCh,0A2C6h
|
||
dw 0A38Fh,0A457h,0A51Eh,0A5E4h,0A6A9h,0A76Dh,0A830h,0A8F3h
|
||
dw 0A9B4h,0AA75h,0AB35h,0ABF4h,0ACB2h,0AD6Fh,0AE2Ch,0AEE7h
|
||
dw 0AFA2h,0B05Ch,0B116h,0B1CFh,0B286h,0B33Eh,0B3F4h,0B4AAh
|
||
dw 0B55Fh,0B613h,0B6C7h,0B77Ah,0B82Ch,0B8DEh,0B98Fh,0BA3Fh
|
||
dw 0BAEEh,0BB9Dh,0BC4Ch,0BCF9h,0BDA6h,0BE53h,0BEFFh,0BFAAh
|
||
dw 0C055h,0C0FFh,0C1A8h,0C251h,0C2FAh,0C3A1h,0C449h,0C4EFh
|
||
dw 0C595h,0C63Bh,0C6E0h,0C784h,0C828h,0C8CCh,0C96Fh,0CA11h
|
||
dw 0CAB3h,0CB55h,0CBF5h,0CC96h,0CD36h,0CDD5h,0CE74h,0CF13h
|
||
dw 0CFB1h,0D04Eh,0D0EBh,0D188h,0D224h,0D2C0h,0D35Bh,0D3F6h
|
||
dw 0D490h,0D52Ah,0D5C4h,0D65Dh,0D6F5h,0D78Eh,0D825h,0D8BDh
|
||
dw 0D954h,0D9EAh,0DA81h,0DB16h,0DBACh,0DC41h,0DCD5h,0DD69h
|
||
dw 0DDFDh,0DE91h,0DF24h,0DFB6h,0E049h,0E0DBh,0E16Ch,0E1FDh
|
||
dw 0E28Eh,0E31Fh,0E3AFh,0E43Eh,0E4CEh,0E55Dh,0E5EBh,0E67Ah
|
||
dw 0E708h,0E795h,0E823h,0E8B0h,0E93Ch,0E9C9h,0EA55h,0EAE0h
|
||
dw 0EB6Ch,0EBF7h,0EC82h,0ED0Ch,0ED96h,0EE20h,0EEA9h,0EF32h
|
||
dw 0EFBBh,0F044h,0F0CCh,0F154h,0F1DCh,0F263h,0F2EAh,0F371h
|
||
dw 0F3F7h,0F47Dh,0F503h,0F589h,0F60Eh,0F693h,0F718h,0F79Ch
|
||
dw 0F821h,0F8A4h,0F928h,0F9ABh,0FA2Fh,0FAB1h,0FB34h,0FBB6h
|
||
dw 0FC38h,0FCBAh,0FD3Ch,0FDBDh,0FE3Eh,0FEBFh,0FF3Fh,0FFBFh
|
||
|
||
@
|
||
|
||
ALIGN 4
|
||
|
||
public NoLanguage Distance
|
||
public NoLanguage Sqr
|
||
|
||
Distance dd 0000
|
||
|
||
public NoLanguage EX0
|
||
public NoLanguage EY0
|
||
|
||
EX0 dd 0000
|
||
EY0 dd 0000
|
||
|
||
extrn nolanguage P_SinTab:WORD
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
.code
|
||
|
||
public NoLanguage Rot2D
|
||
public NoLanguage Distance2D
|
||
public NoLanguage Distance3D
|
||
public NoLanguage GetAngle
|
||
public NoLanguage RegleTrois32
|
||
public NoLanguage BoundRegleTrois
|
||
public NoLanguage InitRealValue
|
||
public NoLanguage InitRealAngle
|
||
public NoLanguage InitRealAngleConst
|
||
public NoLanguage GetRealValue
|
||
public NoLanguage GetRealAngle
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
; ÛßßßÛ Ûßßßß ÛßßßÛ Û ßßÛßß Û ÛÜ ÜÛ Ûßßßß
|
||
; ÛÛßÛß ÛÛßß ÛÛßßÛ ÛÛ ÛÛ ÛÛ ÛÛß Û ÛÛßß
|
||
; ßß ß ßßßßß ßß ß ßßßßß ßßßßß ßß ßß ßß ß ßßßßß
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*/
|
||
;*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*/
|
||
|
||
InitRealValue proc \
|
||
StartValue:DWORD,\
|
||
EndValue:DWORD,\
|
||
TimeValue:DWORD,\
|
||
ptrstruct:DWORD
|
||
|
||
mov edx, ptrstruct
|
||
|
||
mov ax, word ptr[StartValue]
|
||
mov word ptr[edx], ax
|
||
mov ax, word ptr[EndValue]
|
||
mov word ptr[edx+2], ax
|
||
mov ax, word ptr[TimeValue]
|
||
mov word ptr[edx+4], ax
|
||
|
||
mov eax, [ TimerRef ]
|
||
mov dword ptr[edx+6], eax ; memoticks init
|
||
|
||
ret
|
||
|
||
InitRealValue endp
|
||
|
||
comment @
|
||
|
||
InitRealValue proc uses edi,\
|
||
StartValue:DWORD,\
|
||
EndValue:DWORD,\
|
||
TimeValue:DWORD,\
|
||
ptrstruct:DWORD
|
||
|
||
mov edi, ptrstruct
|
||
|
||
mov ax, word ptr[StartValue]
|
||
mov word ptr[edi], ax
|
||
mov ax, word ptr[EndValue]
|
||
mov word ptr[edi+2], ax
|
||
mov ax, word ptr[TimeValue]
|
||
mov word ptr[edi+4], ax
|
||
|
||
mov eax, [ TimerRef ]
|
||
mov dword ptr[edi+6], eax ; memoticks init
|
||
|
||
ret
|
||
|
||
InitRealValue endp
|
||
|
||
@
|
||
|
||
;*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*/
|
||
|
||
InitRealAngle proc \
|
||
StartValue:DWORD,\
|
||
EndValue:DWORD,\
|
||
TimeValue:DWORD,\
|
||
ptrstruct:DWORD
|
||
|
||
mov edx, ptrstruct
|
||
|
||
mov ax, word ptr[StartValue]
|
||
and ax, 1023
|
||
mov word ptr[edx], ax
|
||
mov ax, word ptr[EndValue]
|
||
and ax, 1023
|
||
mov word ptr[edx+2], ax
|
||
|
||
mov ax, word ptr[TimeValue]
|
||
mov word ptr[edx+4], ax
|
||
|
||
mov eax, [TimerRef]
|
||
mov dword ptr[edx+6], eax ; memoticks init
|
||
|
||
ret
|
||
|
||
InitRealAngle endp
|
||
|
||
comment @
|
||
|
||
InitRealAngle proc uses edi,\
|
||
StartValue:DWORD,\
|
||
EndValue:DWORD,\
|
||
TimeValue:DWORD,\
|
||
ptrstruct:DWORD
|
||
|
||
mov edi, ptrstruct
|
||
|
||
mov ax, word ptr[StartValue]
|
||
and ax, 1023
|
||
mov word ptr[edi], ax
|
||
mov ax, word ptr[EndValue]
|
||
and ax, 1023
|
||
mov word ptr[edi+2], ax
|
||
|
||
mov ax, word ptr[TimeValue]
|
||
mov word ptr[edi+4], ax
|
||
|
||
mov eax, [TimerRef]
|
||
mov dword ptr[edi+6], eax ; memoticks init
|
||
|
||
ret
|
||
|
||
InitRealAngle endp
|
||
|
||
@
|
||
|
||
;*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*/
|
||
|
||
InitRealAngleConst proc \
|
||
StartValue:DWORD,\
|
||
EndValue:DWORD,\
|
||
TimeValue:DWORD,\
|
||
ptrstruct:DWORD
|
||
|
||
mov edx, ptrstruct
|
||
|
||
xor eax, eax ; for imul later on
|
||
mov ax, word ptr[StartValue]
|
||
and ax, 1023
|
||
mov word ptr[edx], ax
|
||
mov cx, word ptr[EndValue]
|
||
and cx, 1023
|
||
mov word ptr[edx+2], cx
|
||
|
||
sub ax, cx
|
||
shl ax, 6
|
||
jns short irac0
|
||
|
||
neg ax
|
||
irac0:
|
||
shr ax, 6
|
||
imul eax, dword ptr[TimeValue]
|
||
shr eax, 8 ; /256
|
||
mov word ptr[edx+4], ax
|
||
|
||
mov eax, [TimerRef]
|
||
mov dword ptr[edx+6], eax ; memoticks init
|
||
|
||
ret
|
||
|
||
InitRealAngleConst endp
|
||
|
||
comment @
|
||
|
||
InitRealAngleConst proc uses edi ebx,\
|
||
StartValue:DWORD,\
|
||
EndValue:DWORD,\
|
||
TimeValue:DWORD,\
|
||
ptrstruct:DWORD
|
||
|
||
mov edi, ptrstruct
|
||
|
||
mov ax, word ptr[StartValue]
|
||
and ax, 1023
|
||
mov bx, ax
|
||
mov word ptr[edi], ax
|
||
mov ax, word ptr[EndValue]
|
||
and ax, 1023
|
||
mov cx, ax
|
||
mov word ptr[edi+2], ax
|
||
|
||
|
||
add bx, 1024
|
||
sub bx, cx
|
||
and bx, 1023
|
||
cmp bx, 512
|
||
jle irac0
|
||
sub bx, 1024
|
||
neg bx
|
||
|
||
irac0: mov ax, word ptr[TimeValue]
|
||
imul bx
|
||
mov al, ah
|
||
mov ah, dl ; /256
|
||
|
||
mov word ptr[edi+4], ax
|
||
|
||
mov eax, [TimerRef]
|
||
mov dword ptr[edi+6], eax ; memoticks init
|
||
|
||
ret
|
||
|
||
InitRealAngleConst endp
|
||
|
||
@
|
||
|
||
;*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*
|
||
|
||
|
||
GetRealValue proc uses ebx,\
|
||
ptrstruct:DWORD
|
||
|
||
mov ebx, ptrstruct
|
||
|
||
movsx eax, word ptr[ebx+2] ; End Value
|
||
|
||
mov cx, word ptr[ebx+4] ; TimeValue
|
||
or cx, cx ; TimeValue Reach = 0
|
||
jz elapsed
|
||
|
||
mov edx, [TimerRef]
|
||
sub edx, [ebx+6] ; memoticks
|
||
cmp dx, cx ; if step >= nbstep
|
||
jae sao2 ; poke EndValue
|
||
|
||
; nb step = time to come here
|
||
|
||
sub ax, word ptr[ebx+0] ; start value
|
||
imul dx ; resul DX:AX
|
||
idiv cx ; /NbStep
|
||
add ax, word ptr[ebx+0] ; Valeur1
|
||
movsx eax, ax
|
||
|
||
ret
|
||
|
||
sao2: mov word ptr[ebx+4], 0 ; TimeValue reset
|
||
elapsed: ; return EndValue
|
||
ret
|
||
|
||
GetRealValue endp
|
||
|
||
comment @
|
||
|
||
GetRealValue proc uses esi ebx ebp,\
|
||
ptrstruct:DWORD
|
||
|
||
mov esi, ptrstruct
|
||
|
||
mov dx, word ptr[esi+4] ; TimeValue
|
||
|
||
or dx, dx ; TimeValue Reach = 0
|
||
jz elapsed
|
||
|
||
mov ecx, [esi+6] ; memoticks
|
||
|
||
mov eax, [TimerRef]
|
||
|
||
sub eax, ecx
|
||
cmp ax, dx ; if step >= nbstep
|
||
jae sao2 ; poke EndValue
|
||
|
||
movzx ebx, dx ; nb step = time to come here
|
||
mov ebp, eax ; step en cours
|
||
|
||
movsx eax, word ptr[esi+2] ; End Value
|
||
movsx ecx, word ptr[esi+0] ; start value
|
||
sub eax, ecx
|
||
imul ebp ; resul DX:AX
|
||
idiv ebx ; /NbStep
|
||
add eax, ecx ; cx = Valeur1
|
||
|
||
ret
|
||
|
||
sao2: mov word ptr[esi+4], 0 ; TimeValue reset
|
||
|
||
elapsed: movsx eax, word ptr[esi+2] ; EndValue
|
||
ret
|
||
|
||
GetRealValue endp
|
||
|
||
@
|
||
|
||
;*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*
|
||
|
||
GetRealAngle proc uses ebx,\
|
||
ptrstruct:DWORD
|
||
|
||
mov ebx, ptrstruct
|
||
|
||
xor eax, eax
|
||
mov ax, word ptr[ebx+2] ; EndValue
|
||
|
||
mov cx, word ptr[ebx+4] ; TimeAngle
|
||
or cx, cx ; TimeAngle Reach = 0
|
||
jz elapsed
|
||
|
||
mov edx, [TimerRef]
|
||
|
||
sub edx, [ebx+6] ; memoticks
|
||
cmp dx, cx ; if step >= nbstep
|
||
jae sao2 ; poke EndValue
|
||
|
||
; nb step = time to come here
|
||
|
||
sub ax, word ptr[ebx+0] ; start value
|
||
cmp ax, -512
|
||
jl short art1
|
||
cmp ax, 512
|
||
jle short ok
|
||
|
||
art0: sub ax, 2048
|
||
art1: add ax, 1024
|
||
ok:
|
||
imul dx ; resul DX:AX
|
||
idiv cx ; / NbStep
|
||
add ax, word ptr[ebx+0] ; start value
|
||
ret
|
||
|
||
sao2: mov word ptr[ebx+4], 0 ; TimeValue reset
|
||
elapsed: ; return EndValue
|
||
ret
|
||
|
||
GetRealAngle endp
|
||
|
||
comment @
|
||
|
||
GetRealAngle proc uses esi ebx ebp,\
|
||
ptrstruct:DWORD
|
||
|
||
mov esi, ptrstruct
|
||
|
||
mov dx, word ptr[esi+4] ; TimeAngle
|
||
|
||
or dx, dx ; TimeAngle Reach = 0
|
||
jz elapsed
|
||
|
||
mov ecx, [esi+6] ; memoticks
|
||
|
||
mov eax, [TimerRef]
|
||
|
||
sub eax, ecx
|
||
cmp ax, dx ; if step >= nbstep
|
||
jae sao2 ; poke EndValue
|
||
|
||
mov bx, dx ; nb step = time to come here
|
||
mov bp, ax ; step en cours
|
||
|
||
mov ax, word ptr[esi+2] ; EndValue
|
||
and ax, 1023
|
||
mov cx, word ptr[esi+0] ; start value
|
||
and cx, 1023
|
||
mov dx, ax
|
||
|
||
sub ax, cx
|
||
|
||
cmp ax, 512
|
||
jg art0
|
||
cmp ax,-512
|
||
jl art1
|
||
|
||
imul bp ; resul DX:AX
|
||
idiv bx ; bx ; /NbStep
|
||
add ax, cx ; cx = Valeur1
|
||
movzx eax, ax
|
||
ret
|
||
|
||
art0: add cx, 1024
|
||
sub dx, cx
|
||
mov ax, dx
|
||
|
||
imul bp ; resul DX:AX
|
||
idiv bx ; bx ; /NbStep
|
||
add ax, cx ; cx = Valeur1
|
||
movzx eax, ax
|
||
ret
|
||
|
||
art1: add dx, 1024
|
||
sub dx, cx
|
||
mov ax, dx
|
||
|
||
imul bp ; resul DX:AX
|
||
idiv bx ; bx ; /NbStep
|
||
add ax, cx ; cx = Valeur1
|
||
movzx eax, ax
|
||
ret
|
||
|
||
sao2: mov word ptr[esi+4], 0 ; TimeValue reset
|
||
|
||
elapsed: movsx eax, word ptr[esi+2] ; EndValue
|
||
ret
|
||
|
||
GetRealAngle endp
|
||
|
||
@
|
||
|
||
;*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*
|
||
comment #
|
||
|
||
StopRealValue proc uses ds si,\
|
||
value:WORD, ptrstruct:PTR
|
||
|
||
lds si,ptrstruct
|
||
|
||
mov bx,ss:word ptr[FlagFlip] ; Cmpt 60 hz
|
||
|
||
mov ax,value
|
||
cmp word ptr[si+0],ax ; start value
|
||
jz srv0
|
||
|
||
mov word ptr[si+0],ax ; start value
|
||
|
||
mov cx,word ptr[si+6] ; memoticks
|
||
mov ax,word ptr[si+4] ; time value
|
||
sub bx,cx
|
||
sub ax,bx
|
||
mov word ptr[si+4],ax ; new time value
|
||
|
||
srv0: mov word ptr[si+6],bx ; new memoticks
|
||
ret
|
||
|
||
StopRealValue endp
|
||
|
||
#
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
; ÛßßßÛ Ûßßßß Ûßßßß Û Ûßßßß ßßßÛÛ
|
||
; ÛÛßÛß ÛÛßß ÛÛ ßÛ ÛÛ ÛÛßß ßßßÛÛ
|
||
; ßß ß ßßßßß ßßßßß ßßßßß ßßßßß ßßßßß ßßßßß
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
;*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*
|
||
|
||
BoundRegleTrois proc \
|
||
Valeur1:DWORD, Valeur2:DWORD, \
|
||
NbStep:DWORD, Step:DWORD
|
||
|
||
mov eax, Valeur2
|
||
mov ecx, Valeur1
|
||
mov edx, Step
|
||
|
||
or edx, edx
|
||
jle troppetit
|
||
cmp edx, NbStep
|
||
jge tropgrand
|
||
|
||
sub eax, ecx ; delta valeurs
|
||
imul edx ; * Step
|
||
idiv NbStep ; /NbStep
|
||
add eax, ecx ; + Valeur1
|
||
|
||
tropgrand: ret
|
||
|
||
troppetit: mov eax, ecx
|
||
ret
|
||
|
||
BoundRegleTrois endp
|
||
|
||
comment @
|
||
|
||
BoundRegleTrois proc uses ebx ,\
|
||
Valeur1:DWORD, Valeur2:DWORD ,\
|
||
NbStep:DWORD, Step:DWORD
|
||
|
||
mov eax, Valeur2
|
||
mov ecx, Valeur1
|
||
mov ebx, NbStep
|
||
mov edx, Step
|
||
|
||
or edx, edx
|
||
jle troppetit
|
||
cmp edx, ebx
|
||
jge tropgrand
|
||
|
||
sub eax, ecx ; delta valeurs
|
||
imul edx ; * Step
|
||
idiv ebx ; /NbStep
|
||
add eax, ecx ; + Valeur1
|
||
|
||
tropgrand: ret
|
||
|
||
troppetit: mov eax, ecx
|
||
ret
|
||
|
||
BoundRegleTrois endp
|
||
|
||
@
|
||
|
||
RegleTrois32 proc \
|
||
Valeur1:DWORD, Valeur2:DWORD, \
|
||
NbStep:DWORD, Step:DWORD
|
||
|
||
mov eax, Valeur2
|
||
|
||
mov ecx, NbStep
|
||
or ecx, ecx ; essai global 8-o
|
||
jle short erreur
|
||
|
||
sub eax, Valeur1
|
||
imul Step ; resul DX:AX
|
||
idiv ecx ; /NbStep
|
||
add eax, Valeur1 ; cx = Valeur1
|
||
|
||
erreur: ret
|
||
|
||
RegleTrois32 endp
|
||
|
||
comment @
|
||
|
||
RegleTrois32 proc uses ebx ,\
|
||
Valeur1:DWORD, Valeur2:DWORD ,\
|
||
NbStep:DWORD, Step:DWORD
|
||
|
||
mov eax, Valeur2
|
||
mov ecx, Valeur1
|
||
sub eax, ecx
|
||
imul Step ; resul DX:AX
|
||
|
||
mov ebx, NbStep
|
||
; dec ebx
|
||
or ebx, ebx ; essai global 8-o
|
||
jle erreur
|
||
|
||
idiv ebx ; /NbStep
|
||
|
||
add eax, ecx ; cx = Valeur1
|
||
ret
|
||
|
||
erreur: mov eax, ecx
|
||
ret
|
||
|
||
RegleTrois32 endp
|
||
|
||
@
|
||
|
||
comment #
|
||
|
||
RegleTrois proc \
|
||
Valeur1:WORD, Valeur2:WORD ,\
|
||
NbStep:WORD, Step:WORD
|
||
|
||
mov ax, Valeur2
|
||
mov cx, Valeur1
|
||
sub ax, cx
|
||
imul Step ; resul DX:AX
|
||
|
||
mov bx, NbStep
|
||
dec bx
|
||
jbe erreur
|
||
|
||
idiv bx ; /NbStep
|
||
|
||
add ax, cx ; cx = Valeur1
|
||
ret
|
||
|
||
erreur: xor ax, ax
|
||
ret
|
||
|
||
RegleTrois endp
|
||
|
||
#
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
; ÛÛßßß ÛßßßÛ ÛßßßÛ
|
||
; ßßßßÛ ÛÛ ÜÛ ÛÛßÛß
|
||
; ßßßßß ßßßß ßß ß
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
;*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
; EAX = Sqr(EAX)
|
||
|
||
Sqr PROC NEAR USES EBX
|
||
|
||
cmp eax, 3
|
||
jbe short asqr_0_1
|
||
|
||
xor edx, edx
|
||
mov ebx, eax
|
||
|
||
bsr eax, ebx ; cherche dernier bit … 1
|
||
mov cl, 33
|
||
sub cl, al
|
||
and cl, -2 ; calcul de combien decaler
|
||
; … gauche pour avoir le
|
||
; premier doublet non nul
|
||
; dans edx
|
||
shld edx, ebx, cl
|
||
shl ebx, cl
|
||
|
||
mov ecx, eax ; doublets restants
|
||
shr ecx, 1
|
||
|
||
mov eax, 1
|
||
dec edx
|
||
|
||
asqr_loop: shld edx, ebx, 2
|
||
shl ebx, 2
|
||
shl eax, 2
|
||
cmp edx, eax
|
||
jc short asqr_neg
|
||
|
||
inc eax
|
||
sub edx, eax
|
||
jnc short asqr_1
|
||
add edx, eax
|
||
asqr_neg: shr eax, 1
|
||
dec ecx
|
||
jnz short asqr_loop
|
||
ret
|
||
|
||
asqr_1: inc eax
|
||
shr eax, 1
|
||
dec ecx
|
||
jnz short asqr_loop
|
||
ret
|
||
|
||
asqr_0_1: or eax, eax
|
||
jz short asqr_00
|
||
mov eax, 1
|
||
asqr_00: ret
|
||
|
||
Sqr ENDP
|
||
|
||
comment @
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
; EAX = Sqr(EAX)
|
||
|
||
Sqr proc near
|
||
|
||
cmp eax, 3
|
||
jbe short asqr_0_1
|
||
|
||
mov esi, eax
|
||
mov eax, 1
|
||
xor edx, edx
|
||
|
||
bsr ebx, esi ; cherche dernier bit … 1
|
||
|
||
mov cx, 33
|
||
sub cx, bx
|
||
and cx, -2 ; calcul de combien decaler
|
||
; … gauche pour avoir le
|
||
; premier doublet non nul
|
||
; dans edx
|
||
shld edx, esi, cl
|
||
shl esi, cl
|
||
|
||
mov ecx, ebx ; doublets restants
|
||
shr ecx, 1
|
||
inc cx
|
||
|
||
dec edx
|
||
dec ecx
|
||
jnz short asqr_loop
|
||
ret
|
||
|
||
asqr_loop: shld edx, esi, 2
|
||
shl esi, 2
|
||
shl eax, 1
|
||
mov ebx, edx
|
||
shr ebx, 1
|
||
sub ebx, eax
|
||
jc short asqr_neg
|
||
|
||
mov ebx, eax
|
||
stc
|
||
rcl ebx, 1
|
||
sub edx, ebx
|
||
jc short asqr_0
|
||
inc eax
|
||
dec ecx
|
||
jnz short asqr_loop
|
||
ret
|
||
|
||
asqr_0: add edx, ebx
|
||
asqr_neg: dec ecx
|
||
jnz short asqr_loop
|
||
ret
|
||
|
||
asqr_0_1: or eax, eax
|
||
jnz asqr_1
|
||
ret
|
||
asqr_1: mov eax, 1
|
||
ret
|
||
|
||
Sqr endp
|
||
|
||
@
|
||
|
||
comment @
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
; AX = Sqr(DX:AX)
|
||
|
||
Sqr proc near
|
||
|
||
xor cx,cx
|
||
test dx,dx
|
||
jne sq1
|
||
test ax,ax
|
||
je is0
|
||
xchg ax,dx
|
||
mov cx,8
|
||
sq1:
|
||
test dh,dh
|
||
jne sq2
|
||
xchg dh,dl
|
||
xchg dl,ah
|
||
xchg ah,al
|
||
add cx,4
|
||
sq2:
|
||
test dh,0f0h
|
||
jne sq3
|
||
|
||
; shld dx, ax, 4
|
||
; shl ax, 4
|
||
|
||
shl ax, 1
|
||
rcl dx, 1
|
||
shl ax, 1
|
||
rcl dx, 1
|
||
shl ax, 1
|
||
rcl dx, 1
|
||
shl ax, 1
|
||
rcl dx, 1
|
||
|
||
add cx,2
|
||
sq3:
|
||
test dh,0c0h
|
||
jne sq4
|
||
|
||
; shld dx, ax, 2
|
||
; shl ax, 2
|
||
|
||
shl ax, 1
|
||
rcl dx, 1
|
||
shl ax, 1
|
||
rcl dx, 1
|
||
|
||
inc cx
|
||
sq4:
|
||
mov bl,dh
|
||
xor bh,bh
|
||
shl bx,1
|
||
mov bx,[ SqrTab + bx-64*2 ]
|
||
cmp dx,bx
|
||
jae sq5
|
||
div bx
|
||
add ax,bx
|
||
rcr ax,1
|
||
shr ax,cl
|
||
is0:
|
||
ret
|
||
sq5:
|
||
mov ax,dx
|
||
stc
|
||
rcr ax,1
|
||
shr ax,cl
|
||
|
||
ret
|
||
|
||
Sqr endp
|
||
|
||
@
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
; ÛßßßÜ Û ÛÛßßß ßßÛßß ÛßßßÛ ÛÛÜ Û Ûßßßß Ûßßßß
|
||
; ÛÛ Û ÛÛ ßßßßÛ ÛÛ ÛÛßßÛ ÛÛßÛÛ ÛÛ ÛÛßß
|
||
; ßßßß ßß ßßßßß ßß ßß ß ßß ß ßßßßß ßßßßß
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
;*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
|
||
Distance2D proc \
|
||
px0:DWORD,py0:DWORD, px1:DWORD,py1:DWORD
|
||
|
||
mov eax, px1
|
||
sub eax, px0 ; Dx = x1-x0
|
||
imul eax, eax ; Dxý
|
||
|
||
mov ecx, py1
|
||
sub ecx, py0 ; Dy = y1-y0
|
||
imul ecx, ecx ; Dyý
|
||
add eax, ecx ; Dxý + Dyý
|
||
|
||
call Sqr ; eax = û (Dxý+Dyý)
|
||
|
||
ret
|
||
|
||
Distance2D endp
|
||
|
||
comment @
|
||
|
||
Distance2D proc uses ebx,\
|
||
px0:DWORD,py0:DWORD, px1:DWORD,py1:DWORD
|
||
|
||
mov eax, px1
|
||
sub eax, px0 ; Dx = x1-x0
|
||
imul eax, eax ; Dxý
|
||
|
||
mov ebx, py1
|
||
sub ebx, py0 ; Dy = y1-y0
|
||
imul ebx, ebx ; Dyý
|
||
add eax, ebx ; Dxý + Dyý
|
||
|
||
call Sqr ; eax = û (Dxý+Dyý)
|
||
|
||
ret
|
||
|
||
Distance2D endp
|
||
|
||
@
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
|
||
Distance3D proc \
|
||
px0:DWORD,py0:DWORD,pz0:DWORD, px1:DWORD,py1:DWORD,pz1:DWORD
|
||
|
||
|
||
mov eax, px1
|
||
sub eax, px0
|
||
imul eax, eax ; Dxý
|
||
|
||
mov ecx, py1
|
||
sub ecx, py0
|
||
imul ecx, ecx ; Dyý
|
||
add eax, ecx
|
||
|
||
mov ecx, pz1
|
||
sub ecx, pz0
|
||
imul ecx, ecx ; Dzý
|
||
add eax, ecx
|
||
|
||
call Sqr ; eax = û (Dxý+Dyý+Dzý)
|
||
|
||
ret
|
||
|
||
Distance3D endp
|
||
|
||
comment @
|
||
|
||
Distance3D proc uses ebx,\
|
||
px0:DWORD,py0:DWORD,pz0:DWORD, px1:DWORD,py1:DWORD,pz1:DWORD
|
||
|
||
|
||
mov eax, px1
|
||
sub eax, px0
|
||
imul eax, eax ; Dxý
|
||
|
||
mov ebx, py1
|
||
sub ebx, py0
|
||
imul ebx, ebx ; Dyý
|
||
add eax, ebx
|
||
|
||
mov ebx, pz1
|
||
sub ebx, pz0
|
||
imul ebx, ebx ; Dzý
|
||
add eax, ebx
|
||
|
||
call Sqr ; eax = û (Dxý+Dyý+Dzý)
|
||
|
||
ret
|
||
|
||
Distance3D endp
|
||
|
||
@
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
; ßßÛßß ÛßßßÛ Û Ûßßßß ÛßßßÛ
|
||
; ÛÛ ÛÛßÛß ÛÛ ÛÛ ßÛ ÛÛ Û
|
||
; ßß ßß ß ßß ßßßßß ßßßßß
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
;*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
|
||
GetAngle proc uses esi edi ebx ebp,\
|
||
x0:DWORD, z0:DWORD, x1:DWORD, z1:DWORD
|
||
|
||
|
||
mov edx, z1
|
||
sub edx, z0 ; z = z1 - z0
|
||
mov edi, edx ; save z
|
||
|
||
mov eax, x1
|
||
sub eax, x0 ; x = x1 - x0
|
||
mov ebp, eax ; save x
|
||
|
||
imul eax, eax ; xý
|
||
imul edx, edx ; zý
|
||
cmp eax, edx
|
||
jae noswap
|
||
xchg ebp, edi ; permute x z
|
||
or ebp, 1
|
||
jmp short carre
|
||
noswap:
|
||
and ebp, -2
|
||
carre:
|
||
add eax, edx ; eax = xý + zý
|
||
call Sqr ; eax = sqr(xý + zý)
|
||
|
||
mov [Distance], eax
|
||
|
||
or eax, eax ; si longueur 0 alors angle 0
|
||
jz fgetangle
|
||
|
||
xchg eax, edi
|
||
sal eax, 14
|
||
cdq
|
||
idiv edi
|
||
|
||
mov esi, offset P_SinTab + 384 * 2
|
||
lea edi, [esi+256*2]
|
||
|
||
ga2: mov ebx, esi
|
||
add ebx, edi
|
||
shr ebx, 1
|
||
|
||
cmp ax, [ebx]
|
||
jle ga0
|
||
mov edi, ebx
|
||
jmp short ga1
|
||
ga0: mov esi, ebx
|
||
je short fgaloop
|
||
|
||
mov ebx, edi
|
||
ga1: sub ebx, esi
|
||
dec ebx
|
||
jnz short ga2
|
||
|
||
movsx ebx, word ptr [esi]
|
||
movsx edx, word ptr [edi]
|
||
add ebx, edx
|
||
sar ebx, 1
|
||
cmp bx, ax
|
||
jg short fgaloop
|
||
mov esi, edi
|
||
|
||
fgaloop: sub esi, offset P_SinTab + 256 * 2
|
||
mov eax, esi
|
||
shr eax, 1
|
||
|
||
or ebp, ebp
|
||
jns short fga
|
||
neg eax
|
||
fga:
|
||
test ebp, 1
|
||
jz short norestore
|
||
neg eax
|
||
add eax, 256
|
||
norestore:
|
||
and eax, 1023
|
||
fgetangle:
|
||
ret
|
||
|
||
GetAngle endp
|
||
|
||
|
||
comment @
|
||
|
||
|
||
GetAngle proc uses esi edi ebx ebp,\
|
||
x0:DWORD, z0:DWORD, x1:DWORD, z1:DWORD
|
||
|
||
|
||
mov edx, z1
|
||
sub edx, z0 ; z = z1 - z0
|
||
mov edi, edx ; save z
|
||
jns nonegedx ; abs(z)
|
||
neg edx
|
||
nonegedx:
|
||
mov eax, x1
|
||
sub eax, x0 ; x = x1 - x0
|
||
mov ebp, eax ; save x
|
||
jns nonegeax ; abs(x)
|
||
neg eax
|
||
nonegeax:
|
||
cmp eax, edx
|
||
jae noswap
|
||
xchg eax, edx ; permute x z
|
||
xchg ebp, edi
|
||
or ebp, 1
|
||
jmp short carre
|
||
noswap:
|
||
and ebp, -2
|
||
carre:
|
||
imul eax, eax
|
||
imul edx, edx
|
||
add eax, edx ; eax = xý + zý
|
||
|
||
call Sqr
|
||
|
||
mov [Distance], eax
|
||
|
||
or eax, eax ; si longueur 0 alors angle 0
|
||
jz fgetangle
|
||
|
||
|
||
xchg eax, edi
|
||
sal eax, 14
|
||
cdq
|
||
idiv edi
|
||
|
||
mov esi, offset P_SinTab + 384 * 2
|
||
mov edi, esi
|
||
add edi, 256 * 2
|
||
|
||
ga2: mov ebx, esi
|
||
add ebx, edi
|
||
shr ebx, 1
|
||
|
||
cmp ax, [ebx]
|
||
jle ga0
|
||
mov edi, ebx
|
||
jmp short ga1
|
||
ga0: mov esi, ebx
|
||
je fgaloop
|
||
|
||
mov ebx, edi
|
||
ga1: sub ebx, esi
|
||
dec ebx
|
||
jnz ga2
|
||
|
||
movsx ebx, word ptr [esi]
|
||
movsx edx, word ptr [edi]
|
||
add ebx, edx
|
||
sar ebx, 1
|
||
cmp bx, ax
|
||
jg fgaloop
|
||
mov esi, edi
|
||
|
||
|
||
fgaloop: sub esi, offset P_SinTab + 256 * 2
|
||
mov eax, esi
|
||
shr eax, 1
|
||
|
||
or ebp, ebp
|
||
jns fga
|
||
neg eax
|
||
|
||
fga:
|
||
test ebp, 1
|
||
jz norestore
|
||
mov ebx, eax
|
||
mov eax, 256
|
||
sub eax, ebx
|
||
norestore:
|
||
and eax, 1023
|
||
fgetangle:
|
||
ret
|
||
|
||
GetAngle endp
|
||
|
||
@
|
||
|
||
comment @
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
; Rotation 2D autour d'un axe
|
||
; entr‚e: eax=X ecx=Y edx=T
|
||
;
|
||
; sortie: eax = X'=X*cos(T)-Y*sin(T)
|
||
; ecx = Y'=X*sin(T)+Y*cos(T)
|
||
;
|
||
; ( ebx, ebp, edi d‚truits )
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
|
||
RotEXY proc
|
||
|
||
or edx, edx
|
||
jz short norot
|
||
|
||
and edx, 03FFh
|
||
movsx ebx, word ptr[P_SinTab + edx*2] ; ebx = Sin( T )
|
||
add dx, 256
|
||
and dx, 03FFh
|
||
movsx edx, word ptr[P_SinTab + edx*2] ; edx = Cos( T )
|
||
|
||
mov ebp, eax ; ebp = X
|
||
mov edi, ecx ; edi = Y
|
||
|
||
imul eax, edx ; X*cos(T)
|
||
imul edi, ebx ; Y*sin(T)
|
||
sub eax, edi
|
||
sar eax, 15 ; eax = X' = X*cos(T)-Y*sin(T)
|
||
|
||
imul ecx, edx ; Y*cos(T)
|
||
imul ebp, ebx ; X*sin(T)
|
||
add ecx, ebp
|
||
sar ecx, 15 ; ecx = Y' = X*sin(T) + Y*cos(T)
|
||
norot: ret
|
||
|
||
RotEXY endp
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
; Rotation 2D autour d'un axe
|
||
; entr‚e: ebx=X ecx=Y ebp=T
|
||
;
|
||
; sortie: eax = X'=X*cos(T)-Y*sin(T)
|
||
; edx = Y'=X*sin(T)+Y*cos(T)
|
||
;
|
||
; ( ebx, ebp, edi d‚truits )
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
|
||
RotEXY proc
|
||
|
||
or ebp, ebp
|
||
jz norot
|
||
|
||
mov eax, ebp ; T
|
||
and eax, 03FFh
|
||
mov edi, offset P_SinTab
|
||
movsx ebp, word ptr[ edi+eax*2 ] ; ebp = Sin( T )
|
||
add eax, 256
|
||
and eax, 03FFh
|
||
movsx edx, word ptr[ edi+eax*2 ] ; edx = Cos( T )
|
||
; X*cos(T)
|
||
mov eax, ebx
|
||
imul eax, edx
|
||
mov edi, eax
|
||
; Y*sin(T)
|
||
mov eax, ecx
|
||
imul eax, ebp
|
||
sub edi, eax
|
||
sar edi, 15 ; di= X'= X*cos(T)-Y*sin(T)
|
||
; Y*cos(T)
|
||
imul edx, ecx
|
||
; X*sin(T)
|
||
imul ebx, ebp
|
||
add edx, ebx ; Y' = X*sin(T) + Y*cos(T)
|
||
sar edx, 15 ; edx = Y'
|
||
|
||
mov eax, edi ; eax = X'
|
||
xor ecx, ecx
|
||
|
||
ret
|
||
|
||
norot: mov eax, ebx ; ax = X' = X
|
||
mov edx, ecx ; dx = Y' = Y
|
||
ret
|
||
|
||
RotEXY endp
|
||
|
||
@
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
|
||
Rot2D proc uses ebx,\
|
||
coorx:DWORD,coory:DWORD,angle:DWORD
|
||
|
||
mov edx, angle
|
||
mov eax, coorx
|
||
mov ecx, coory
|
||
|
||
or edx, edx
|
||
jz short norot
|
||
|
||
and edx, 03FFh
|
||
movsx ebx, word ptr[P_SinTab + edx*2] ; ebx = Sin( T )
|
||
add dx, 256
|
||
and dx, 03FFh
|
||
movsx edx, word ptr[P_SinTab + edx*2] ; edx = Cos( T )
|
||
|
||
imul eax, edx ; X*cos(T)
|
||
imul ecx, ebx ; Y*sin(T)
|
||
sub eax, ecx
|
||
sar eax, 15 ; eax = X' = X*cos(T)-Y*sin(T)
|
||
mov [EX0], eax
|
||
|
||
imul edx, coory ; Y*cos(T)
|
||
imul ebx, coorx ; X*sin(T)
|
||
add edx, ebx
|
||
sar edx, 15 ; edx = Y' = X*sin(T) + Y*cos(T)
|
||
mov [EY0], edx
|
||
|
||
ret
|
||
|
||
norot: mov [EX0], eax
|
||
mov [EY0], ecx
|
||
ret
|
||
|
||
Rot2D endp
|
||
|
||
comment @
|
||
|
||
Rot2D proc uses ebx ebp edi,\
|
||
coorx:DWORD,coory:DWORD,angle:DWORD
|
||
|
||
mov eax, coorx
|
||
mov ecx, coory
|
||
mov edx, angle
|
||
call RotEXY
|
||
mov [EX0], eax
|
||
mov [EY0], ecx
|
||
ret
|
||
|
||
Rot2D endp
|
||
|
||
@
|
||
|
||
;*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*
|
||
|
||
END
|