glokyfull

routine pas fini pour deplacement sprite

Dec 21st, 2024
16
0
11 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. initcalcvitesse
  3.     lea sinusDX1,a1
  4.     lea sinusDX2,a2
  5.     lea sinusDY1,a3
  6.     lea sinusDY2,a3
  7.     lea sinus,a0
  8.     moveq #0,d6
  9.     move.w #32767,d6
  10.     move.l #64*5*$10000,d5
  11.     move.w #512-1,d7
  12. .loop
  13.     moveq #0,d0
  14.     move.w (a0)+,d0
  15.     move.l d0,d1
  16.     move.l d0,d2
  17.     move.l d0,d3
  18.     add.l d6,d0
  19.     add.l d6,d1
  20.     add.l d6,d2
  21.     add.l d6,d3
  22.     mulu #64*(160-8),d0
  23.     add.l d5,d0
  24.     mulu #64*(140-8),d1
  25.     mulu #64*(80-8),d2
  26.     mulu #64*(119-8),d3
  27.     move.l d0,(a1)+
  28.     move.l d1,(a2)+
  29.     move.l d2,(a3)+
  30.     move.l d3,(a4)+
  31.     dbf d7,.loop
  32.     rts
  33.    
  34. calcvitesse
  35. ; d0 = pas interne
  36. ; d1 = valeur de depart
  37. ; d2 = pas vbl
  38. ; d3 = nombre de vbl
  39. ; d4 = nombre d'element de la table
  40. ; a0 = adresse table
  41. ; a1, calcvitesse decide ou ca se trouve
  42.     lea fct,a6          ; a changer plus tard
  43.     lea 8(a6),a5
  44.     move.w (a6)+,d0     ; pas interne
  45.     move.w (a5)+,d2     ; pas vbl
  46.     move.w #128,d1      ; valeur de depart, c'est un cosinus
  47.     ; d3 = nombre de vbl, passé en parametre de la fonction calcvitesse
  48.     move.w #512,d4
  49.     ; a0 passé en parametre
  50.     lea sinDX1,a0
  51.     lea ramA,a1
  52.     jsr calcposition1
  53.    
  54.     move.w (a6)+,d0
  55.     move.w (a5)+,d2
  56.     move.w #128,d1
  57.     move.w #512,d4
  58.     lea sinDX2,a0
  59.     lea ramB,a1
  60.     jsr calcposition1
  61.  
  62.     lea ramA,a0
  63.     lea ramB,a1
  64.     move.w #nbsprites-1,d7
  65. .bcl1  
  66.     move.l (a0),d0
  67.     add.l (a1)+,d0
  68.     move.l d0,(a0)+     ; resultat addition sur ramA  position X.L
  69.     dbf d7,.bcl1
  70.    
  71.     ; dans ramA courbesinux1+ courbesinusx2 .L
  72.    
  73.     move.w (a6)+,d0
  74.     move.w (a5)+,d2
  75.     move.w #128,d1
  76.     move.w #512,d4
  77.     lea sinDY1,a0
  78.     lea ramB,a1
  79.     jsr calcposition1
  80.    
  81.     move.w (a6)+,d0
  82.     move.w (a5)+,d2
  83.     move.w #128,d1
  84.     move.w #512,d4
  85.     lea sinDY2,a0
  86.     lea ramC,a1
  87.     jsr calcposition1
  88.    
  89.     lea ramB,a0
  90.     lea ramC,a1
  91.     move.w #nbsprites-1,d7
  92. .bcl2
  93.     move.l (a0),d0
  94.     add.l (a1)+,d0
  95.     move.l d0,(a0)+
  96.     dbf d7,.bcl2
  97.    
  98.     ; dans ramB courbesinusY1+courbesinusY2 .L
  99.     ; ramA,ramB =x,y de la courbe a l'instant t = nombre de vbl a passer
  100.     ; now il faut les vitesse = courbe a l'instant t+1 - courbe a l'instant t
  101.     : ramC ramD ramE
  102.     addq.l #1,d3    ; on ajoute 1 a l'instant t
  103.     lea -8(a6),a6   ; retour au premier parametre de la fonction
  104.     lea -8(a5),a5   ; pasvbl
  105.    
  106.    
  107.     move.w (a6)+,d0     ; pas interne
  108.     move.w (a5)+,d2     ; pas vbl
  109.     move.w #128,d1      ; valeur de depart, c'est un cosinus
  110.     ; d3 = nombre de vbl, passé en parametre de la fonction calcvitesse
  111.     move.w #512,d4
  112.     ; a0 passé en parametre
  113.     lea sinDX1,a0
  114.     lea ramC,a1
  115.     jsr calcposition1
  116.    
  117.     move.w (a6)+,d0
  118.     move.w (a5)+,d2
  119.     move.w #128,d1
  120.     move.w #512,d4
  121.     lea sinDX2,a0
  122.     lea ramD,a1
  123.     jsr calcposition1
  124.  
  125.     lea ramA,a0
  126.         lea ramB,a1
  127.     lea ramC,a2
  128.     lea ramD,a3
  129.     move.w #nbsprites-1,d7
  130. .bcl3
  131.     move.l (a2),d0      ; ramC
  132.     add.l (a3)+,d0      ; +ramD
  133.     sub.l (a0)+,d0      ; - ramA (= old ramA+ramB)
  134.     move.l d0,(a2)+     ; ramC = vitesse X 
  135.    
  136.     dbf d7,.bcl3
  137.    
  138.     move.w (a6)+,d0     ; pas interne
  139.     move.w (a5)+,d2     ; pas vbl
  140.     move.w #128,d1      ; valeur de depart, c'est un cosinus
  141.     ; d3 = nombre de vbl, passé en parametre de la fonction calcvitesse
  142.     move.w #512,d4
  143.     ; a0 passé en parametre
  144.     lea sinDY1,a0
  145.     lea ramD,a1
  146.     jsr calcposition1
  147.    
  148.     move.w (a6)+,d0
  149.     move.w (a5)+,d2
  150.     move.w #128,d1
  151.     move.w #512,d4
  152.     lea sinDY2,a0
  153.     lea ramE,a1
  154.     jsr calcposition1
  155.    
  156.     ; a,b = x,y   c = vitesse x     d,e = intant t+1 position y
  157.     lea ramD,a0
  158.     lea ramE,a1
  159.     lea ramB,a2
  160.     move.w #nbsprites-1,d7
  161. .bcl4
  162.     move.l (a0),d0
  163.     add.l (a1)+,d0
  164.     sub.l (a2)+,d0
  165.     move.l d0,(a0)+
  166.     dbf d7,.bcl4
  167.    
  168.     ; ici ramD= vitesse y
  169.     ; recapitulons:
  170.     ;
  171.     ; ramA = positionX ramB= positionY
  172.     ; ramC = vitesseX  ramD = vitesse Y
  173.    
  174.     lea my64k,a0
  175. ; 320 pixel a gauche
  176.     move.w #320-16-1,d2
  177.     moveq #0,d0
  178.     move.w #256+8,d0        ; = routine vide
  179. .loooop
  180.     move.w #15,d3
  181. .reptrept
  182.     move.l d0,(a0)+
  183.    
  184.     dbf d3,.reptrept
  185.     dbf d2,.loooop  
  186.  
  187. ; premiere partie cliping gauche
  188.     moveq #-8,d0
  189.     moveq #4,d1
  190. .loopclipgauche
  191.     move.w #15,d2
  192. .repeat
  193.     move.w d0,(a0)+
  194.     move.w d1,(a0)+
  195.     dbf d2,.repeat
  196.     addq.w #8,D1
  197.     cmp.w #4+128,d1
  198.     bne.s .loopclipgauche
  199.     ; apres 16*16 truc on est ok
  200.    
  201.     ; convX normal (sur l'ecran et pas coupé)
  202.     moveq #0,d0
  203.     moveq #0,d1
  204. .loop
  205.     move.w #15,d2
  206. .repeter
  207.     move.w d0,(a0)+ ; offset
  208.     move.w d1,(a0)+ ; numero de sprite
  209.     dbf d2,.repeter
  210.     addq.w #8,d1
  211.     and.w #8*15,d1
  212.     bne.s .loop
  213.     addq.w #8,d0
  214.     cmp.w #160-8,d0
  215.     bne.s .loop
  216.  
  217. ; deuxieme partie clip droit
  218.     move.w #160-8,d0
  219.     move.w #128,d1
  220. .loopclipdroit
  221.     move.w #15,d2
  222. .repeat2
  223.     move.w d0,(a0)+
  224.     move.w d1,(a0)+  d1 de 128 a 256 par pas de 8 = routine specifique clip droit
  225.     dbf d2,.repeat2
  226.     addq #8,d1
  227.     cmp.w #128+128,d1
  228.     bne.s .loopclipdroit
  229.    
  230.     rts
  231.    
  232. calcposition1
  233. ; d0 = pas interne
  234. ; d1 = valeur de depart
  235. ; d2 = pas vbl
  236. ; d3 = nombre de vbl
  237. ; d4 = nombre d'element de la table
  238. ; a0 = adresse table de depart
  239. ; a1 = ram = adresse table arrivé
  240.  
  241.  
  242.     move.w d1,d5
  243.     move.w d2,d6  ; pas vbl
  244.     mulu d3,d6    ; *nb de vbl
  245.     add d1,d6     ; plus valeur de depart
  246. .compare
  247.     cmp.w d4,d6
  248.     bgt.s .1
  249.     sub d4,d6
  250.     bra.s .compare
  251. .1
  252. ;   d6<d4
  253.     move.w #nbpoint-1,d7
  254.     add d6,d6
  255.     add d6,d6
  256.     add d4,d4
  257.     add d4,d4
  258.     add d0,d0
  259.     add d0,d0
  260. .loop
  261.     move.l (a0,d6),(a1)+
  262.     add d0,d6
  263.     cmp.w d4,d6
  264.     blt.s .1
  265.     sub.w d4,d6
  266. .1
  267.     dbf d7,.loop
  268.     rts
  269.  
  270. ;
  271. ;  postition x,y  vecteur vitesse dx,dy  acceleration a
  272. ;
  273. ;
  274. ;
  275.  
  276. routinecalctrajrt               ; calcul de 16 x pour la physique
  277. ;
  278. ;  70*16 calcul x y
  279. ;  70 boucle/16  64/16 = 4
  280. ;
  281.     move.l ptrTrajX,a0
  282.     move.l ptrTrajY,a1
  283.     move.l a0,a4
  284.     move.l a1,a5
  285.     move.l ptrtrajX,a2
  286.     move.l ptrtrajY,a3
  287.  
  288.  
  289.  
  290.     move.w #3,d5        ; 16*4 = 64
  291. .loop
  292.  
  293.     move (a0)+,d0
  294.     move (a0)+,d1
  295.     move.w (a1)+,d2
  296.     move.w (a1)+,d3
  297. ;   move.w d0,(a4)+
  298. ;   move.w d1,(a4)+
  299.     move.w d1,(a2)+
  300.     rept 15
  301.       addx d2,d0
  302.       addx d3,d1
  303.       move.w d1,(a2)+
  304.     endr
  305.      move.w d0,(a4)+
  306.      move.w d1,(a4)+
  307.    
  308.     move (a0)+,d0   y
  309.     move (a0)+,d1   y
  310.     move (a1)+,d2
  311.     move (a1)+,d3
  312.     move.w d1,(a3)+
  313.     rept 15                   ; ainsi que 16 y
  314.       addx d2,d0
  315.       addx d3,d1
  316.       move.w d1,(a3)+
  317.       addx d6,d2
  318.       addx d7,d3
  319.     endr
  320.     move.w d0,(a4)+     ; a4=a0
  321.     move.w d1,(a4)+
  322.     move.w d2,(a5)+     ; a5=a1
  323.     move.w d3,(a5)+
  324.  
  325.     dbf d5,.loop
  326.  
  327.     rts
  328.    
  329. routinecalc2                    ; 'calcul' de la physique et
  330.                                 ; affichage
  331.     move.w #70-1,d6     ; nombre de sprite
  332.     lea .suite(pc),a4
  333.     move.l ptrTRAJX,a0
  334.     move.l ptrTRAJY,a1
  335.     move.l screenptr,d2
  336.     move.l convxptr,d0
  337.     move.l convyptr,d1
  338.     moveq #-4,d7
  339.     move.l routinespriteptr,d3
  340.    
  341. .loop
  342.     move.w (a0),d0
  343.     and.w d7,d0         ; and -4
  344.     move.l d0,a6
  345.     move.w (a6)+,d3 ; numero de sprite
  346.     move.w (a6)+,d2 ; offsetX
  347.    
  348.     move.w (a1),d1  ; y
  349.     and.w d7,d1
  350.     move.l d1,a6
  351.     add (a6),d2
  352.    
  353.     move.l d2,a0
  354.     ;lea .suite(pc),a4
  355.     move.l d3,a6
  356.     move.l (a6)+,a5
  357.     jmp (a5)  ;  affichage du sprite
  358. .suite
  359. adrretour   equ *
  360.     lea 16*2(a0),a0
  361.     lea 16*2(a1),a1
  362.     dbf d6,.loop
  363.  
  364. .suite2
  365. spriteclipgaucheproto
  366.     ; simplement offsetx -8
  367.     ; et saut au milieu donc stoqué sur convx
  368. spriteclipdroitproto
  369.     ; on fait un rts au milieu
  370.     move.l (a6)+,a5 ; adresse du milieu  
  371.     move.w (a5),d5
  372.     move.w #jmpa6,(a5)
  373.     lea .suite3(pc),a6
  374. automodifsprclprgt equ *+2
  375.     jmp $12345678       ; adressesprite
  376. .suite3
  377.     move.w d5,(a5)      ; restore l'instruction
  378.     jmp (a4)
  379.  
  380.  
  381. makeroutineclip
  382.     lea spriteclipdroitproto,a4
  383.     moveq #15,d7        ; 16 routine clip droit
  384.  
  385. ;   ... to be continued
  386.    
  387.        
  388.  
  389.  
  390.    
  391.  
  392. swapbuffertraj
  393.     lea ptrTrajX,a0
  394.     lea swaptraj,a1
  395.     move.l (a0)+,d0
  396.     move.l (a0)+,d1
  397.     move.l (a0)+,d2
  398.     move.l (a0),d3
  399.     lea -12(a0),a0
  400.     move.l d2,(a0)+
  401.     move.l d3,(a0)+
  402.     move.l d0,(a0)+
  403.     move.l d1,(a0)+
  404.     rts
  405.  
  406.  
  407.     DATA
  408. ptrTRAJX dc.l TrajX
  409. ptrTRAJY dc.l TrajY
  410. swaptraj    dc.l trajX2,trajY2
  411.  
  412.     BSS
  413. sinusDX1    ds.l 512
  414. sinusDX2    ds.l 512
  415. sinusDY1    ds.l 512
  416. sinusDY2    ds.l 512
  417.  
  418. nbsprites equ 70
  419. ramA        ds.l nbsprites
  420. ramB        ds.l nbsprites
  421. ramC        ds.l nbsprites
  422. ramD        ds.l nbsprites
  423. buffertraj
  424.     ds.w 80*16*8
  425.  
  426. TrajX   ds.w 64*16
  427. trajY  ds.w 64*16
  428.  
  429. trajX2 ds.w 64*16
  430. trajY2 ds.w 64*16
  431.  
  432.  
  433.  
  434.     ; x1.l x1.h y1.l y1.h
  435.     ; -> x * 16, y*16
  436.    
  437.  
Add Comment
Please, Sign In to add comment