Bonjour les développeurs!!!
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 :
Bon je ne fais aucunes vérification des bords (ni de vérification si x2 > x1 pour l'instant).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
38 @ 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 (r4, puis rn) sub r6, r2, r1 @ r6 = 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
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
Partager