home *** CD-ROM | disk | FTP | other *** search
/ ANews 3 / AnewsCD3.iso / atari / ARTICLES / ASM / PLOT.S < prev   
Text File  |  1999-09-25  |  8KB  |  249 lines

  1. *   Routine d'affichage de points en ST Basse
  2. *
  3. *   Voici le premier exemple du deuxiŠme num‚ro de cette initiation
  4. * … l'ASM. Je n'ai pas test‚ cette routine mais elle doit pouvoir
  5. * faire plus de 800 points par VBL.
  6. *
  7. *   Je vais commencer par vous expliquer comment est structur‚e la
  8. * m‚moire vid‚o en ST Basse :
  9. *   Atari a opt‚ pour un systŠme dit "planaire" qui peut avoir ses
  10. * avantages mais qui est une g‚ne la plupart du temps comme vous
  11. * vous en appercevrez par la suite.
  12. *   Pour coder les 16 valeurs correspondant … chaque couleur il
  13. * faut 4 bits (car 2^4=16) mais les 4 bits decrivant la couleur ne
  14. * se suivent pas ! En fait l'ecran est cod‚ par goupe de 16 pixels
  15. * soit 16*4=64 bits. Le premier plan (qui correspond au premier bit
  16. * de la couleur de chacun des pixels) est stock‚ sous forme de 16
  17. * bits se suivant (donc un word) ensuite un second qui definit le
  18. * deuxiŠme plan, un troisiŠme et enfin le quatriŠme. Donc pour
  19. * d‚finir la couleur du 6Šme pixel du groupe de 16 il faut modifier
  20. * le 6Šme bit du 1er word (exceptionnelement comptez les bits de
  21. * gauche … droite pour cet exemple), puis le 6Šme bit du 2Šme word,
  22. * 6Šme du 3Šme word et enfin 6Šme du 4Šme word. Si on compte bit
  23. * par bit on a modifi‚ le 6Šme, le 22Šme, le 38Šme et le 54 Šme !
  24. *
  25. *    Ici on veut afficher un pixel donc il faut copier un word
  26. * dont tous les bits valent 0 sauf un vers le bon groupe de 16
  27. * pixels. Nous avons donc besion de determiner 2 choses … partir
  28. * des coordon‚es du point : tout d'abord l'adresse en memoire ecran
  29. * correspondant au bon groupe de 16 pix et le nø du bit qu'il faudra
  30. * mettre … 1. On pourrait utiliser les 16 couleurs et donc copier le
  31. * word sur le bon plan … chaque fois mais on ne le fera pas cette
  32. * fois ci (bien qu'en fait ca ne complique pas vraiment le programme).
  33. * on va donc toujours utiliser la couleur un et donc ne modifier que
  34. * le plan 1. Lorsqu'on a le nø du bit … mettre … 1 on pourrait
  35. * faire un decalage mais il y a plus rapide : il suffit de stocker
  36. * les 16 word possibles et en fonction de la valeur obtenue aller
  37. * directement au bon. C'est ce que nous ferons : les 16 word possibles
  38. * sont … la fin de ce programme (label pix).
  39. *
  40.     section    text
  41.  
  42.     bsr    init    ; ici je vais … une sous-routine qui
  43.             ; sauve quelques trucs, change de reslution
  44.             ; etc... nous verons ca plus tard. A la fin
  45.             ; de cette routine on a l'adr de l'ecran
  46.             ; en a1
  47.  
  48.     move.l    a1,a0    ; on copie a1 dans a0
  49.  
  50.     move.l    #7999,d0    ; On donne … d0 la valeur 7999 car on va
  51. eff_ecran:            ; executer une boucle 8000 fois : on efface
  52.     clr.l    (a0)+        ; les longs situ‚s … l'adresse a1 et on
  53.                 ; incr‚mente pour … chaque fois passer au
  54.                 ; suivant (sinon on effacerait 8000 fois le
  55.                 ; 1er long de l'ecran toujours au meme endroit.
  56.     dbf    d0,eff_ecran    ; on fait un dbf vers le label eff_ecran et on
  57.                 ; decr‚mente d0 … chaque fois, au bout de 8000
  58.                 ; fois il vaudra -1 donc on passera … la suite.
  59. ; l'instruction clr dont je n'avais pas encore parl‚ ne fait que mettre tous
  60. ; les bits du registre (ou du long word ou octet en memoire) … 0.
  61.  
  62.     move.w    #195,d0        ; abscisse du point
  63.     move.w    #57,d1        ; ordonn‚e du point
  64.                 ; vous pouvez les changer pour essayer mais
  65.                 ; n'oubliez pas que l'abscisse doit etre comprise
  66.                 ; entre 0 et 319 et l'ordonn‚e entre 0 et 199.
  67.  
  68.     move.w    d0,d2    ; on fait une copie de l'abscisse dans d2
  69.     and.w    #%1111111111110000,d2    ;et on fais ce and qui ne modifiera que les
  70.             ; 4 derniers bits en les mettant … 0. L'interet est de savoir
  71.             ; sur quel groupe de 16 pixels on va devoir afficher le sprite
  72.             ; car en metteant ces 4 bits … 0 on transforme d0 en son multiple
  73.             ; de 16 le plus proche par defaut. En effet si on a
  74.             ; %00110101=53 si on fait un and %11110000 on obtient
  75.             ; %00110000=48 (sui est bien le multiple de 16 le plus proche
  76.             ; par defaut
  77.     sub.w    d2,d0    ; ensuite on saustrait le resultat obtenu donc on obtient en d0
  78.             ; la valeur qui manque … d2 (cette valeur vaut donc de 0 … 15)
  79.     lsr.w    #1,d2    ; on divise par 2 car chaque groupe de 16 pixels fait 8 octets
  80.             ; donc pour aller au pixel 48 donc le 3Šme groupe il faut ajouter
  81.             ; 3*8=24 … l'adr ecran et 48/2 = 24 ! Magique !
  82.     add.w    d2,a1    ; donc on ajoute d2 … a1
  83.     add.w    d0,d0    ; on multiplie d0 par 2 car il va servir … pointer sur le bon
  84.             ; word … copier et comme un word fait 2 octets un decalage de
  85.             ; 3 bits corrrespondra a 6 octets apres le bebut de la table
  86.             ; (label pix).
  87.  
  88.     move.w    d1,d2    ; on copie d1 en d2, l'ancienne valeur de d2 est perdue mais
  89.             ; on n'en aura plus besion.
  90.     add.w    d2,d2    ; ici on va faire une multiplication par 160 avec des addition !
  91.             ; la on a ajout‚ d2 … lui meme donc on l'a multipli‚ par 2
  92.     add.w    d2,d2    ; on le refait don ca fait *4 depuis le bebut
  93.     add.w    d2,d1    ; on avait copi‚ d1 dans d2 donc on a d2=4*d1, on ajoute donc
  94.             ; 4*d1 … d1 donc maintenant d1 vaut 5 fois sa valeur initiale
  95.     lsl.w    #5,d1    ; on decale de 5 bits ce qui correspond … une multiplicaition
  96.             ; par 2^5=32. Et 5*32 = 160 ! On a r‚ussi !
  97.             ; "Mais pourquoi il veut absoluement multiplier d1 par 160
  98.             ; cet oiseau ?" Ben en fait une ligne fait 320 pixels, soit
  99.             ; 20 groupes de 16 pixels donc 20*8=160 octets, voila pourquoi !
  100.     add.w    d1,a1    ; on ajoute donc l'abscice * 160 … a1 donc a1 pointe maintenant
  101.             ; sur le bon word !
  102.  
  103.     lea.l    pix,a0    ; lea est une instruction qui copie l'adresse d'un
  104.             ; label. J'aurai pu aussi faire move.l    #pix,a0
  105.     move.w    (a0,d0.w),d0
  106.             ; on copie le word … l'adresse a0+d0 dans d0
  107.  
  108.     or.w    d0,(a1)    ; et on affiche avec un or pour ne pas effacer les eventuels
  109.             ; autres points quand on modifiera la routine pour qu'elle en
  110.             ; affiche plusieurs.
  111.  
  112. wspace:    cmp.b    #$39,$fffffc02.w    ; la on attends que la touhe espace
  113.     bne.s    wspace            ; soit appuy‚e (j'en parlerai plus tard
  114.  
  115.     bsr    end    ; la je branche sur une sous routine qui restaure
  116.             ; la rez, etc.
  117.  
  118.     move.w    #0,-(sp)    ; et on fait un GEMDOS 0 pour
  119.     trap    #1        ; induquer la fin du programme (j'en parlerai plus tard)
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126. end:    move.l    #mouse_on,-(sp)    
  127.     move.w    #0,-(sp)    
  128.     move.w    #25,-(sp)
  129.     trap    #14
  130.     addq.l    #8,sp
  131.  
  132.     move.w    #$30,-(sp)
  133.     trap    #1
  134.     adda    #2,sp
  135.     
  136.     cmp.w    #$1900,d0
  137.     bgt.s    r_f
  138.  
  139.     move.w    rez,-(sp)
  140.     move.l    physk,-(sp)
  141.     move.l    logk,-(sp)
  142.     move.w    #5,-(sp)    
  143.     trap    #14
  144.     lea.l    12(sp),sp
  145.     bra.s    user
  146.  
  147. r_f:    move.w    rez,-(sp)
  148.     move.w    #3,-(sp)
  149.     move.l    physk,-(sp)
  150.     move.l    logk,-(sp)
  151.     move.w    #5,-(sp)
  152.     trap    #14
  153.     lea.l    14(sp),sp
  154.     
  155. user:    move.l    super,-(sp)
  156.     move    #$20,-(sp)    
  157.     trap    #1
  158.     addq.l    #6,sp
  159.  
  160.     rts
  161.  
  162. init:    pea    0.w
  163.     move    #$20,-(sp)    
  164.     trap    #1
  165.     addq.l    #6,sp
  166.     move.l    d0,super
  167.     
  168.     move.w    #2,-(sp)
  169.     trap    #14
  170.     addq.l    #2,sp
  171.     move.l    d0,physk
  172.     
  173.     move.w    #3,-(sp)
  174.     trap    #14
  175.     addq.l    #2,sp
  176.     move.l    d0,logk
  177.  
  178.     move.w    #$30,-(sp)
  179.     trap    #1
  180.     adda    #2,sp
  181.     
  182.     cmp.w    #$1900,d0
  183.     bgt.s    f
  184.  
  185.     move.w    #4,-(sp)    ;st rez
  186.     trap    #14
  187.     addq.l    #2,sp
  188.     bra.s    s_rez
  189.  
  190. f:    move.w    #-1,-(sp)    ;falc rez
  191.     move.w    #88,-(sp)
  192.     trap    #14
  193.     addq.l    #4,sp
  194.  
  195. s_rez:    move.w    d0,rez
  196.  
  197.     move.l    #mouse_off,-(sp)
  198.     move.w    #0,-(sp)
  199.     move.w    #25,-(sp)
  200.     trap    #14
  201.     addq.l    #8,sp
  202.  
  203.     move.w    #0,-(sp)
  204.     move.l    #-1,-(sp)
  205.     move.l    #-1,-(sp)
  206.     move.w    #5,-(sp)    
  207.     trap    #14
  208.     lea.l    12(sp),sp
  209.  
  210.     move.w    #2,-(sp)
  211.     trap    #14
  212.     addq.l    #2,sp
  213.     move.l    d0,a1
  214.  
  215.     rts
  216.  
  217.  
  218.     section    data
  219.  
  220. pix:
  221.     dc.w    %1000000000000000
  222.     dc.w    %0100000000000000
  223.     dc.w    %0010000000000000
  224.     dc.w    %0001000000000000
  225.     dc.w    %0000100000000000
  226.     dc.w    %0000010000000000
  227.     dc.w    %0000001000000000
  228.     dc.w    %0000000100000000
  229.     dc.w    %0000000010000000
  230.     dc.w    %0000000001000000
  231.     dc.w    %0000000000100000
  232.     dc.w    %0000000000010000
  233.     dc.w    %0000000000001000
  234.     dc.w    %0000000000000100
  235.     dc.w    %0000000000000010
  236.     dc.w    %0000000000000001
  237.  
  238. mouse_off:
  239.     dc.b    18,0
  240. mouse_on:
  241.     dc.b    8,0
  242.  
  243.     section bss
  244.  
  245. super:    ds.l    1
  246. physk:    ds.l    1
  247. logk:    ds.l    1
  248. rez:    ds.w    1
  249.     even