Aller au menu - Aller au contenu
Inscris-toi au e-camp "Héberge ton jeu Facebook sur Azure" de Microsoft vendredi 25 mai à 13h30 !

[ASM][ARM][GBA] Procédure hline : tracé d'une ligne horizontale

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1 
Auteur Message
1 visiteur sur ce sujet (1 Anonyme)
Page 1 
Hors ligne Kurapix # Posté le 27/04/2008 à 19:28:59
Avatar

Bonjour les zéros!!!

Bon je sais pas si y'en a qui font de l'ASM ARM ici mais je sollicite votre aide tout de même, j'arrive pas à trouver ce qui cloche dans mon code ASM (vline est good, je code hline là).
hline est une procédure qui trace un trait horizontal à l'écran.

Bon c'est du code pour GBA mais ça reste de l'ASM ARM (ARM 7 TDMI plus précisement).

Voilà le code :

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@ void asm_draw_hline (int y, int x1, int x2, int color);
@ met un pixel a une coordonnee (x, y) a une certaine valeur
.arm

        @.section .iwram,"ax",%progbits

        .align

        .global  asm_draw_hline

        .type    asm_draw_hline, function
@ adress = base + (y * w - (w - x)) * s
asm_draw_hline :
    push {r4, lr}                    @ sauvegarde du contexte (pile r2, puis rn)
    sub r6, r2, r1                   @ r4 = x2 - x1 (longueur de la ligne tracee)
    @ mov r2, r0                     @ temp = y
    @ mov r0, r1                     @ x = x
    @ mov r1, r2                     @ y = y
    @ mov r2, #240                   @ w = 240
    @ mov r3, #2                     @ s = 2
    @ bl asm_compute_pixel_adress    @ r0 = vram + (y * w - (w - x)) * 2
    ldr r7, =0x06000000              @ vram
    mov r4, #240                     @ r4 = w = 240
    sub r1, r4, r1                   @ r0 = w - x
    mul r5, r0, r4                   @ r5 = y * w
    sub r5, r5, r1                   @ r5 = y * w - (w - x)
    mov r0, r5, lsl #1               @ r0 = (y1 * w - (w - x)) * 2
    add r0, r0, r7                   @ r0 = adresseBase + (y1 * w - (w - x)) * 2

    eor r5, r5, r5
    drawing_hline :
        strh r3, [r0], #2            @ on ecrit le pixel puis on incremente de 2
        add r5, #1
        cmp r6, r5                   @ si on atteint la longueur de la ligne       
    bne drawing_hline                @ alors on a trace notre ligne horizontale
    pop {r4, lr}                     @ on restaure le contexte
    bx lr                            @ on retourne a l'appelant


Bon je ne fais aucunes vérification des bords (ni de vérification si x2 > x1 pour l'instant).

Voilà ce que je fais dans mon code :
0 - Sauvegarde du contexte (normal)
1 - Calcul de la longueur du segment en pixels
2 - Calcul de l'adresse où écrire (compute_adress était fais pour ça mais je l'ai recoder en inline dans hline)
3 - tant qu'on a pas dessiner la longueur de pixel on boucle
4 - On retourne à l'appelant (normal)

Pour info, 0x06000000 correspond au début de la mémoire vidéo, si on écrit dans la mémoire vidéo bah on affiche un pixel à l'écran ;) .

J'ai initialiser le mode 3 de la GBA donc ça ne vient pas de ça (vline et rectfill fonctionnent parfaitement ^^).

Voilà

Merci de votre aide d'avance.

Kurapix

Image utilisateur
Rejet de la loi HADOPI

;) La puissance n'est rien sans maîtrise.
-----------------------------------------------------------------------
[GCC] Re-arrangement de la pile
[Bash] Script d'installation de C::B a partir des sources.
[ASM][ARM][GBA] Procédure hline : tracé d'une ligne horizontale
srand(), rand() ... gné?

-----------------------------------------------------------------------

To follow the path:
look to the master,
follow the master,
walk with the master,
see through the master,
become the master.
 
Publicité # Posté le 27/04/2008 à 19:28:59

Retour au forum "Autres langages, outils et approches" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx