Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- initcalcvitesse
- lea sinusDX1,a1
- lea sinusDX2,a2
- lea sinusDY1,a3
- lea sinusDY2,a3
- lea sinus,a0
- moveq #0,d6
- move.w #32767,d6
- move.l #64*5*$10000,d5
- move.w #512-1,d7
- .loop
- moveq #0,d0
- move.w (a0)+,d0
- move.l d0,d1
- move.l d0,d2
- move.l d0,d3
- add.l d6,d0
- add.l d6,d1
- add.l d6,d2
- add.l d6,d3
- mulu #64*(160-8),d0
- add.l d5,d0
- mulu #64*(140-8),d1
- mulu #64*(80-8),d2
- mulu #64*(119-8),d3
- move.l d0,(a1)+
- move.l d1,(a2)+
- move.l d2,(a3)+
- move.l d3,(a4)+
- dbf d7,.loop
- rts
- calcvitesse
- ; d0 = pas interne
- ; d1 = valeur de depart
- ; d2 = pas vbl
- ; d3 = nombre de vbl
- ; d4 = nombre d'element de la table
- ; a0 = adresse table
- ; a1, calcvitesse decide ou ca se trouve
- lea fct,a6 ; a changer plus tard
- lea 8(a6),a5
- move.w (a6)+,d0 ; pas interne
- move.w (a5)+,d2 ; pas vbl
- move.w #128,d1 ; valeur de depart, c'est un cosinus
- ; d3 = nombre de vbl, passé en parametre de la fonction calcvitesse
- move.w #512,d4
- ; a0 passé en parametre
- lea sinDX1,a0
- lea ramA,a1
- jsr calcposition1
- move.w (a6)+,d0
- move.w (a5)+,d2
- move.w #128,d1
- move.w #512,d4
- lea sinDX2,a0
- lea ramB,a1
- jsr calcposition1
- lea ramA,a0
- lea ramB,a1
- move.w #nbsprites-1,d7
- .bcl1
- move.l (a0),d0
- add.l (a1)+,d0
- move.l d0,(a0)+ ; resultat addition sur ramA position X.L
- dbf d7,.bcl1
- ; dans ramA courbesinux1+ courbesinusx2 .L
- move.w (a6)+,d0
- move.w (a5)+,d2
- move.w #128,d1
- move.w #512,d4
- lea sinDY1,a0
- lea ramB,a1
- jsr calcposition1
- move.w (a6)+,d0
- move.w (a5)+,d2
- move.w #128,d1
- move.w #512,d4
- lea sinDY2,a0
- lea ramC,a1
- jsr calcposition1
- lea ramB,a0
- lea ramC,a1
- move.w #nbsprites-1,d7
- .bcl2
- move.l (a0),d0
- add.l (a1)+,d0
- move.l d0,(a0)+
- dbf d7,.bcl2
- ; dans ramB courbesinusY1+courbesinusY2 .L
- ; ramA,ramB =x,y de la courbe a l'instant t = nombre de vbl a passer
- ; now il faut les vitesse = courbe a l'instant t+1 - courbe a l'instant t
- : ramC ramD ramE
- addq.l #1,d3 ; on ajoute 1 a l'instant t
- lea -8(a6),a6 ; retour au premier parametre de la fonction
- lea -8(a5),a5 ; pasvbl
- move.w (a6)+,d0 ; pas interne
- move.w (a5)+,d2 ; pas vbl
- move.w #128,d1 ; valeur de depart, c'est un cosinus
- ; d3 = nombre de vbl, passé en parametre de la fonction calcvitesse
- move.w #512,d4
- ; a0 passé en parametre
- lea sinDX1,a0
- lea ramC,a1
- jsr calcposition1
- move.w (a6)+,d0
- move.w (a5)+,d2
- move.w #128,d1
- move.w #512,d4
- lea sinDX2,a0
- lea ramD,a1
- jsr calcposition1
- lea ramA,a0
- lea ramB,a1
- lea ramC,a2
- lea ramD,a3
- move.w #nbsprites-1,d7
- .bcl3
- move.l (a2),d0 ; ramC
- add.l (a3)+,d0 ; +ramD
- sub.l (a0)+,d0 ; - ramA (= old ramA+ramB)
- move.l d0,(a2)+ ; ramC = vitesse X
- dbf d7,.bcl3
- move.w (a6)+,d0 ; pas interne
- move.w (a5)+,d2 ; pas vbl
- move.w #128,d1 ; valeur de depart, c'est un cosinus
- ; d3 = nombre de vbl, passé en parametre de la fonction calcvitesse
- move.w #512,d4
- ; a0 passé en parametre
- lea sinDY1,a0
- lea ramD,a1
- jsr calcposition1
- move.w (a6)+,d0
- move.w (a5)+,d2
- move.w #128,d1
- move.w #512,d4
- lea sinDY2,a0
- lea ramE,a1
- jsr calcposition1
- ; a,b = x,y c = vitesse x d,e = intant t+1 position y
- lea ramD,a0
- lea ramE,a1
- lea ramB,a2
- move.w #nbsprites-1,d7
- .bcl4
- move.l (a0),d0
- add.l (a1)+,d0
- sub.l (a2)+,d0
- move.l d0,(a0)+
- dbf d7,.bcl4
- ; ici ramD= vitesse y
- ; recapitulons:
- ;
- ; ramA = positionX ramB= positionY
- ; ramC = vitesseX ramD = vitesse Y
- lea my64k,a0
- ; 320 pixel a gauche
- move.w #320-16-1,d2
- moveq #0,d0
- move.w #256+8,d0 ; = routine vide
- .loooop
- move.w #15,d3
- .reptrept
- move.l d0,(a0)+
- dbf d3,.reptrept
- dbf d2,.loooop
- ; premiere partie cliping gauche
- moveq #-8,d0
- moveq #4,d1
- .loopclipgauche
- move.w #15,d2
- .repeat
- move.w d0,(a0)+
- move.w d1,(a0)+
- dbf d2,.repeat
- addq.w #8,D1
- cmp.w #4+128,d1
- bne.s .loopclipgauche
- ; apres 16*16 truc on est ok
- ; convX normal (sur l'ecran et pas coupé)
- moveq #0,d0
- moveq #0,d1
- .loop
- move.w #15,d2
- .repeter
- move.w d0,(a0)+ ; offset
- move.w d1,(a0)+ ; numero de sprite
- dbf d2,.repeter
- addq.w #8,d1
- and.w #8*15,d1
- bne.s .loop
- addq.w #8,d0
- cmp.w #160-8,d0
- bne.s .loop
- ; deuxieme partie clip droit
- move.w #160-8,d0
- move.w #128,d1
- .loopclipdroit
- move.w #15,d2
- .repeat2
- move.w d0,(a0)+
- move.w d1,(a0)+ d1 de 128 a 256 par pas de 8 = routine specifique clip droit
- dbf d2,.repeat2
- addq #8,d1
- cmp.w #128+128,d1
- bne.s .loopclipdroit
- rts
- calcposition1
- ; d0 = pas interne
- ; d1 = valeur de depart
- ; d2 = pas vbl
- ; d3 = nombre de vbl
- ; d4 = nombre d'element de la table
- ; a0 = adresse table de depart
- ; a1 = ram = adresse table arrivé
- move.w d1,d5
- move.w d2,d6 ; pas vbl
- mulu d3,d6 ; *nb de vbl
- add d1,d6 ; plus valeur de depart
- .compare
- cmp.w d4,d6
- bgt.s .1
- sub d4,d6
- bra.s .compare
- .1
- ; d6<d4
- move.w #nbpoint-1,d7
- add d6,d6
- add d6,d6
- add d4,d4
- add d4,d4
- add d0,d0
- add d0,d0
- .loop
- move.l (a0,d6),(a1)+
- add d0,d6
- cmp.w d4,d6
- blt.s .1
- sub.w d4,d6
- .1
- dbf d7,.loop
- rts
- ;
- ; postition x,y vecteur vitesse dx,dy acceleration a
- ;
- ;
- ;
- routinecalctrajrt ; calcul de 16 x pour la physique
- ;
- ; 70*16 calcul x y
- ; 70 boucle/16 64/16 = 4
- ;
- move.l ptrTrajX,a0
- move.l ptrTrajY,a1
- move.l a0,a4
- move.l a1,a5
- move.l ptrtrajX,a2
- move.l ptrtrajY,a3
- move.w #3,d5 ; 16*4 = 64
- .loop
- move (a0)+,d0
- move (a0)+,d1
- move.w (a1)+,d2
- move.w (a1)+,d3
- ; move.w d0,(a4)+
- ; move.w d1,(a4)+
- move.w d1,(a2)+
- rept 15
- addx d2,d0
- addx d3,d1
- move.w d1,(a2)+
- endr
- move.w d0,(a4)+
- move.w d1,(a4)+
- move (a0)+,d0 y
- move (a0)+,d1 y
- move (a1)+,d2
- move (a1)+,d3
- move.w d1,(a3)+
- rept 15 ; ainsi que 16 y
- addx d2,d0
- addx d3,d1
- move.w d1,(a3)+
- addx d6,d2
- addx d7,d3
- endr
- move.w d0,(a4)+ ; a4=a0
- move.w d1,(a4)+
- move.w d2,(a5)+ ; a5=a1
- move.w d3,(a5)+
- dbf d5,.loop
- rts
- routinecalc2 ; 'calcul' de la physique et
- ; affichage
- move.w #70-1,d6 ; nombre de sprite
- lea .suite(pc),a4
- move.l ptrTRAJX,a0
- move.l ptrTRAJY,a1
- move.l screenptr,d2
- move.l convxptr,d0
- move.l convyptr,d1
- moveq #-4,d7
- move.l routinespriteptr,d3
- .loop
- move.w (a0),d0
- and.w d7,d0 ; and -4
- move.l d0,a6
- move.w (a6)+,d3 ; numero de sprite
- move.w (a6)+,d2 ; offsetX
- move.w (a1),d1 ; y
- and.w d7,d1
- move.l d1,a6
- add (a6),d2
- move.l d2,a0
- ;lea .suite(pc),a4
- move.l d3,a6
- move.l (a6)+,a5
- jmp (a5) ; affichage du sprite
- .suite
- adrretour equ *
- lea 16*2(a0),a0
- lea 16*2(a1),a1
- dbf d6,.loop
- .suite2
- spriteclipgaucheproto
- ; simplement offsetx -8
- ; et saut au milieu donc stoqué sur convx
- spriteclipdroitproto
- ; on fait un rts au milieu
- move.l (a6)+,a5 ; adresse du milieu
- move.w (a5),d5
- move.w #jmpa6,(a5)
- lea .suite3(pc),a6
- automodifsprclprgt equ *+2
- jmp $12345678 ; adressesprite
- .suite3
- move.w d5,(a5) ; restore l'instruction
- jmp (a4)
- makeroutineclip
- lea spriteclipdroitproto,a4
- moveq #15,d7 ; 16 routine clip droit
- ; ... to be continued
- swapbuffertraj
- lea ptrTrajX,a0
- lea swaptraj,a1
- move.l (a0)+,d0
- move.l (a0)+,d1
- move.l (a0)+,d2
- move.l (a0),d3
- lea -12(a0),a0
- move.l d2,(a0)+
- move.l d3,(a0)+
- move.l d0,(a0)+
- move.l d1,(a0)+
- rts
- DATA
- ptrTRAJX dc.l TrajX
- ptrTRAJY dc.l TrajY
- swaptraj dc.l trajX2,trajY2
- BSS
- sinusDX1 ds.l 512
- sinusDX2 ds.l 512
- sinusDY1 ds.l 512
- sinusDY2 ds.l 512
- nbsprites equ 70
- ramA ds.l nbsprites
- ramB ds.l nbsprites
- ramC ds.l nbsprites
- ramD ds.l nbsprites
- buffertraj
- ds.w 80*16*8
- TrajX ds.w 64*16
- trajY ds.w 64*16
- trajX2 ds.w 64*16
- trajY2 ds.w 64*16
- ; x1.l x1.h y1.l y1.h
- ; -> x * 16, y*16
Add Comment
Please, Sign In to add comment