tracage de ligne en assempleur
Publié : sam. 30/avr./2005 14:21
le tacage de ligne de purebasic et relativement lent.
voici une routine en assembleur integré dans un programme qui trace
beaucoup de ligne.
au lancement du programme c 'est le tracage en purebasic.
pour activer la routne assembleur, metre un";" devant les lignes suivantes:
; LineXY (x,y+z,tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
; LineXY (tableau(mempoint),tableau2(mempoint),tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
; LineXY (x,y+z,x2,y2,RGB(0,255,0))
; LineXY (x2,y2,tableau(mempoint),tableau2(mempoint),RGB(0,255,0))
; LineXY (x,y+z,tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
; LineXY (tableau(mempoint),tableau2(mempoint),tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
; LineXY (x,y+z,x2,y2,RGB(0,255,0))
; LineXY (x2,y2,tableau(mempoint),tableau2(mempoint),RGB(0,255,0))
; Goto pas_asm
voici une routine en assembleur integré dans un programme qui trace
beaucoup de ligne.
au lancement du programme c 'est le tracage en purebasic.
pour activer la routne assembleur, metre un";" devant les lignes suivantes:
; LineXY (x,y+z,tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
; LineXY (tableau(mempoint),tableau2(mempoint),tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
; LineXY (x,y+z,x2,y2,RGB(0,255,0))
; LineXY (x2,y2,tableau(mempoint),tableau2(mempoint),RGB(0,255,0))
; LineXY (x,y+z,tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
; LineXY (tableau(mempoint),tableau2(mempoint),tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
; LineXY (x,y+z,x2,y2,RGB(0,255,0))
; LineXY (x2,y2,tableau(mempoint),tableau2(mempoint),RGB(0,255,0))
; Goto pas_asm
Code : Tout sélectionner
InitSprite()
InitKeyboard()
InitMouse()
OpenScreen(1024,768, 32, "")
Dim tableau(1500)
Dim tableau2(1500)
x1.f
y1.f
posi.f
a.f
mempoint=0
emp=0 ;amplitude de depart
ampli=1
z=0
b=100
prem=0
posi=3
limite =posi*70
zoom=200
npt=0
ptx=0
ptx1=0
pty=0
pty1=0
deb1:
emp+ampli
If emp>20
ampli=-ampli
EndIf
If emp<-20
ampli=-ampli
EndIf
; emp=-10
prem=0
x=205
y=300
a=0
x1=-150
y1=-150
StartDrawing(ScreenOutput())
addecr = DrawingBuffer()
Gosub dessin
;Goto finie
prempt=0
x2=0
y2=0
dessin1:
coox=x
cooy=(y+z)
x=x+8
x1=x1+4
z=(Cos((Sqr((x1*x1)/zoom+(y1*y1)/zoom))))*emp
If npt<100
If prempt=1
coo=(y+z)
LineXY (x,y+z,tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
LineXY (tableau(mempoint),tableau2(mempoint),tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
LineXY (x,y+z,x2,y2,RGB(0,255,0))
LineXY (x2,y2,tableau(mempoint),tableau2(mempoint),RGB(0,255,0))
LineXY (x,y+z,tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
LineXY (tableau(mempoint),tableau2(mempoint),tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
LineXY (x,y+z,x2,y2,RGB(0,255,0))
LineXY (x2,y2,tableau(mempoint),tableau2(mempoint),RGB(0,255,0))
Goto pas_asm
ptx=x
pty=y+z
ptx1=tableau(mempoint+1)
pty1=tableau2(mempoint+1)
Gosub tracage
ptx=tableau(mempoint)
pty=tableau2(mempoint)
ptx1=tableau(mempoint+1)
pty1=tableau2(mempoint+1)
Gosub tracage
ptx=x
pty=y+z
ptx1=x2
pty1=y2
Gosub tracage
ptx=x2
pty=y2
ptx1=tableau(mempoint)
pty1=tableau2(mempoint)
Gosub tracage
ptx=x
pty=y+z
ptx1=tableau(mempoint+1)
pty1=tableau2(mempoint+1)
Gosub tracage
ptx=tableau(mempoint)
pty=tableau2(mempoint)
ptx1=tableau(mempoint+1)
pty1=tableau2(mempoint+1)
Gosub tracage
ptx=x
pty=y+z
ptx1=x2
pty1=y2
Gosub tracage
ptx=x2
pty=y2
ptx1=tableau(mempoint)
pty1=tableau2(mempoint)
Gosub tracage
pas_asm:
tableau(mempoint)=x2
tableau2(mempoint)=y2
mempoint=mempoint+1
EndIf
x2=x
y2=y+z
prempt=1
npt=npt+1
Goto dessin1
EndIf
tableau(mempoint)=x2
tableau2(mempoint)=y2
mempoint=0
npt=0
prempt=0
x=205
x1=-150
y1=y1+7.6;3.8
a=a+posi
ADD y,4
x=x-a
If a <limite
Goto dessin1
EndIf
finie:
FlipBuffers()
ClearScreen(0,0,0)
StopDrawing()
stopit:
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
posampli=posampli+1
negampli=negampli-1
emp=emp+1
EndIf
If KeyboardPushed(#PB_Key_Right)
posampli=posampli-1
negampli=negampli+1
emp=emp-1
EndIf
If KeyboardPushed(#PB_Key_Up)
zoom=zoom+1
EndIf
If KeyboardPushed(#PB_Key_Down)
zoom=zoom-1
EndIf
If KeyboardPushed(#PB_Key_Escape)
StopDrawing()
End
EndIf
If KeyboardPushed(#pb_key_a)
Goto stopit
EndIf
Goto deb1
dessin:
coox=x
cooy=(y+z)
x=x+8
x1=x1+4
z=(Cos((Sqr((x1*x1)/zoom+(y1*y1)/zoom))))*emp
If npt<100
Plot(x,y+z,RGB(0,255,0))
tableau(mempoint)=x
tableau2(mempoint)=y+z
mempoint =mempoint+1
npt=npt+1
Goto dessin
EndIf
npt=0
x=205
x1=-150
y1=y1+7.6;3.8
a=a+posi
ADD y,4
x=x-a
mempoint=0
Return
tracage:
difx=0
dify=0
MOV eax,ptx1
SUB eax,ptx
JNS l_positifx
NEG eax
positifx:
INC eax
MOV difx,eax
MOV eax,pty1
SUB eax,pty
JNS l_positify
NEG eax
positify:
INC eax
MOV dify,eax
MOV eax,ptx1
CMP eax,ptx
JGE l_gd
dg:
MOV eax,pty1
CMP eax,pty
JLE l_bh1
MOV eax,difx
CMP eax,dify
JGE l_line5
JMP l_line6
bh1:
MOV eax,difx
CMP eax,dify
JGE l_line7
JMP l_line8
gd:
MOV eax,pty1
CMP eax,pty
JLE l_bh
MOV eax,difx
CMP eax,dify
JGE l_line1
JMP l_line2
bh:
MOV eax,difx
CMP eax,dify
JGE l_line3
JMP l_line4
line1:
MOV eax,ptx
ROL eax,2
MOV ebx,pty
ROL ebx,8
ROL ebx,4
ADD eax,ebx
MOV edi,addecr
ADD edi,eax
MOV ecx,difx
MOV ebx,dify
MOV edx,ecx
MOV esi,edx
MOV eax,000ff00h
depx:
SUB edx,ebx
JGE l_depx1
ADD edi,4096
ADD edx,esi
depx1:
MOV [edi],eax
ADD edi,4
LOOP l_depx
JMP l_fintrace
line2:
MOV eax,ptx1
ROL eax,2
MOV ebx,pty1
ROL ebx,8
ROL ebx,4
ADD eax,ebx
MOV edi,addecr
ADD edi,eax
MOV ecx,dify
MOV ebx,difx
MOV edx,ecx
MOV esi,edx
MOV eax,000ff00h
depx2:
SUB edx,ebx
JGE l_depx12
SUB edi,4
ADD edx,esi
depx12:
MOV [edi],eax
SUB edi,4096
LOOP l_depx2
JMP l_fintrace
line3:
MOV eax,ptx
ROL eax,2
MOV ebx,pty
ROL ebx,8
ROL ebx,4
ADD eax,ebx
MOV edi,addecr
ADD edi,eax
MOV ecx,difx
MOV ebx,dify
MOV edx,difx
MOV esi,edx
MOV eax,000ff00h
depx3:
SUB edx,ebx
JGE l_depx13
SUB edi,4096
ADD edx,esi
depx13:
MOV [edi],eax
ADD edi,4
LOOP l_depx3
JMP l_fintrace
line4:
MOV eax,ptx
ROL eax,2
MOV ebx,pty
ROL ebx,8
ROL ebx,4
ADD eax,ebx
MOV edi,addecr
ADD edi,eax
MOV ecx,dify
MOV ebx,difx
MOV edx,dify
MOV esi,edx
MOV eax,000ff00h
depx4:
SUB edx,ebx
JGE l_depx14
ADD edi,4
ADD edx,esi
depx14:
MOV [edi],eax
SUB edi,4096
LOOP l_depx4
JMP l_fintrace
line5:
MOV eax,ptx1
ROL eax,2
MOV ebx,pty1
ROL ebx,8
ROL ebx,4
ADD eax,ebx
MOV edi,addecr
ADD edi,eax
MOV ecx,difx
MOV ebx,dify
MOV edx,ecx
MOV esi,edx
MOV eax,000ff00h
depx5:
SUB edx,ebx
JGE l_depx15
SUB edi,4096
ADD edx,esi
depx15:
MOV [edi],eax
ADD edi,4
LOOP l_depx5
JMP l_fintrace
line6:
MOV eax,ptx1
ROL eax,2
MOV ebx,pty1
ROL ebx,8
ROL ebx,4
ADD eax,ebx
MOV edi,addecr
ADD edi,eax
MOV ecx,dify
MOV ebx,difx
MOV edx,ecx
MOV esi,edx
MOV eax,000ff00h
depx6:
SUB edx,ebx
JGE l_depx16
ADD edi,4
ADD edx,esi
depx16:
MOV [edi],eax
SUB edi,4096
LOOP l_depx6
JMP l_fintrace
line7:
MOV eax,ptx
ROL eax,2
MOV ebx,pty
ROL ebx,8
ROL ebx,4
ADD eax,ebx
MOV edi,addecr
ADD edi,eax
MOV ecx,difx
MOV ebx,dify
MOV edx,difx
MOV esi,edx
MOV eax,000ff00h
depx7:
SUB edx,ebx
JGE l_depx17
SUB edi,4096
ADD edx,esi
depx17:
MOV [edi],eax
SUB edi,4
LOOP l_depx7
JMP l_fintrace
line8:
MOV eax,ptx1
ROL eax,2
MOV ebx,pty1
ROL ebx,8
ROL ebx,4
ADD eax,ebx
MOV edi,addecr
ADD edi,eax
MOV ecx,dify
MOV ebx,difx
MOV edx,dify
MOV esi,edx
MOV eax,000ff00h
depx8:
SUB edx,ebx
JGE l_depx18
ADD edi,4
ADD edx,esi
depx18:
MOV [edi],eax
ADD edi,4096
LOOP l_depx8
JMP l_fintrace
fintrace:
Return
End