1

Voilà, autant continuer ici plutôt que sur le topic de la 84+ C SE (bon ok, ça n'a rien à voir avec les z80 et ça aurait sans doute sa plus sa place dans d'autres forums d'yN, mais j'aime ce forum, et perso pour l'instant ce ne sont que des tests, je reste fidèle au z80 après tout tongue) smile

Je rappelle quelques liens :

http://www.gbadev.org/
http://sourceforge.net/projects/devkitpro/files/devkitARM/
http://static.patater.com/gbaguy/gbaasm.htm
http://static.patater.com/gbaguy/oldgba/gbaasm.htm
http://morrow.ece.wisc.edu/ECE353/arm7tdmi_instruction_set_reference.pdf
http://benno.id.au/blog/2009/01/02/literal-pools

Prochaine étape pour moi : les sprites happy

2

Ici il y a beaucoup d'information sur pas mal de sujets : http://www.coranac.com/tonc/text/toc.htm
C'est de la programmation C mais on peut se servir de l'information smile En ce moment je suis en train d'écrire un simple "gba.inc".

3

Ahh ça m'intéresse cet include smile

Là je nettoie mon dossier, parce qu'enfaite beaucoup de dossiers semblent contenir que des trucs de C ou C++, non ?

Ça semble compiler parfaitement avec seulement les dossiers "arm-none-eabi", "bin", "lib" et "libexec"de DevKitArm.

4

Voici mon gba.inc :
@@ KEY PAD DEFINES @@
#define KEY_A 1
#define KEY_B 2
#define KEY_SELECT 4
#define KEY_START 8
#define KEY_RIGHT 16
#define KEY_LEFT 32
#define KEY_UP 64
#define KEY_DOWN 128
#define KEY_R 256
#define KEY_L 512
#define KEYS 0x04000130

@@ Display @@
#define MODE_0 0x00
#define MODE_1 0x01
#define MODE_2 0x02
#define MODE_3 0x03
#define MODE_4 0x04
#define MODE_5 0x05

#define BACKBUFFER 0x010
#define H_BLANK_OAM 0x020

#define OBJ_MAP_2D 0x00
#define OBJ_MAP_1D 0x040

#define FORCE_BLANK 0x080

#define BG0_ENABLE 0x0100
#define BG1_ENABLE 0x0200 
#define BG2_ENABLE 0x0400
#define BG3_ENABLE 0x0800
#define OBJ_ENABLE 0x01000 
#define WIN1_ENABLE 0x02000 
#define WIN2_ENABLE 0x04000
#define WINOBJ_ENABLE 0x08000
#define VRAM 0x06000000
#define VPAL 0x05000000
#define REG_DISPCNT 0x04000000


Et voici le code à un petit programme que j'ai écrit qui change le couleur de l'écran quand on appuie sur UP grin
#include "gba.inc"

.arm
.text
.global main
main:
	mov r0, #REG_DISPCNT	@ Registre du display
	mov r1, #BG2_ENABLE
	add r1, r1, #MODE_3
	str r1, [r0]			@ Ecrire r1 dans [r0]
	mov r0, #VRAM
	mov r1, #0x00			@ Le couleur
	mov r5, #0x400
	add r5, #0x21
	mov r2, #0x9600			@ Combien d'iterations
loop1:
	strh r1, [r0], #2		@ Store halfword (16 bits)
	subs r2, r2, #1			@ Sub et mettre (Set) les drapeaux
	bne loop1
	add r1, r5				@ Les bits RGB sont dividés dans des groupes de 5 bits
	add r1, r5, LSL #5		@ Donc on va ajouter un à chaque couleur
	add r1, r5, LSL #10		@ 
	mov r0, #VRAM
	mov r2, #0x9600			@ Combien d'iterations
infin:
	ldr r3,=KEYS
	ldr r4,[r3]
	ands r4,r4,#KEY_UP
	bne infin
	b loop1


EDIT: Pas grand chose, mais ... grin
3urA (test.png)
iHRC (test2.png)
6pAW (test3.png)

5

XWRU

Moi ça bug mourn

Je ne sais pas pourquoi il ne veut pas des #define...

6

Peut-être il ne faut pas les # ? Il semble que le fichier include ne s'inclue pas :/ Et qu'est-ce qu'il y a dans cette image-là ?? grin Je voulais justement porter Juego à la GBA. Tes sprites son très beaux !

EDIT: Voici mon script pour l'assembler :
#!/bin/bash
arm-none-eabi-gcc -mthumb-interwork -specs=gba.specs test.S
arm-none-eabi-objcopy -O binary a.out test.gba
gvba test.gba

7

Sans le # ça me met "bad instruction"... hum

L'image vient de Juego, oui grin

Je l'ai prise à partir de l'éditeur, puis je l'ai colorisée avec photofiltre pour avoir une image de fond (quand ça voudra compiler j’essaierai de faire bouger un sprite devant ce fond).

Plus tard il faudrait tenter d'utiliser le (les ?) tilemapper(s) de la gba (qui sont gérés par le hardware apparemment ?). Par contre j'ai lu que c'était un mapper avec des tiles 8*8 pixels, si c'est bien le cas c'est assez restrictif...

8

Et .include ? Si ça marche essaie avec ce fichier-ci :
@@ KEY PAD DEFINES @@
KEY_A = 1
KEY_B = 2
KEY_SELECT = 4
KEY_START = 8
KEY_RIGHT = 16
KEY_LEFT = 32
KEY_UP = 64
KEY_DOWN = 128
KEY_R = 256
KEY_L = 512
KEYS = 0x04000130

@@ Display @@
MODE_0 = 0x00
MODE_1 = 0x01
MODE_2 = 0x02
MODE_3 = 0x03
MODE_4 = 0x04
MODE_5 = 0x05

BACKBUFFER = 0x010
H_BLANK_OAM = 0x020

OBJ_MAP_2D = 0x00
OBJ_MAP_1D = 0x040

FORCE_BLANK = 0x080

BG0_ENABLE = 0x0100
BG1_ENABLE = 0x0200 
BG2_ENABLE = 0x0400
BG3_ENABLE = 0x0800
OBJ_ENABLE = 0x01000 
WIN1_ENABLE = 0x02000 
WIN2_ENABLE = 0x04000
WINOBJ_ENABLE = 0x08000
VRAM = 0x06000000
VPAL = 0x05000000
REG_DISPCNT = 0x04000000


Et oui, il semble que le hardware fait pas mal du travail, mais je ne sais comment ça marche avec des tiles 8x8 moi non plus. Il faudra voir demain, je vais dormir smile

9

Ok bonne nuit, de mon côté je vais tenter de voir pourquoi ça bug alors que j'utilise les mêmes fichiers et le même compilateur que toi...

edit : ça marche avec l'include en ./8, merci !

Voici mon code source (affiche une image, puis si on appui sur A, l'écran s'efface) :
.arm
.include "../gba.inc"
.text
.global main

main:
	mov r0,#REG_DISPCNT
	mov r1,#BG2_ENABLE
	add r1,r1,#MODE_3
	strh r1,[r0]
	mov r0,#VRAM
	ldr r1,=pic
	mov r2,#0x960

loop:
	ldmia r1!,{r3,r4,r5,r6,r7,r8,r9,r10}
	stmia r0!,{r3,r4,r5,r6,r7,r8,r9,r10}
	subs r2,r2,#1
	bne loop

pause:
	ldr r3,=KEYS
	ldr r4,[r3]
	ands r4,r4,#KEY_A
	bne pause

clear_screen:
	mov r0, #VRAM
	mov r1,#0x00
	mov r2,#0x9600

clear_screen_loop:
	strh r1,[r0],#2
	subs r2,r2,#1
	bne clear_screen_loop

end:
	b end

.ltorg

pic:
.incbin "../test.bin"

Autrement il fallait aussi faire attention à l'emplacement des fichiers (ils sont tous dans le dossier parent du dossier bin, donc je dois à chaque fois ajouter "../").

Ça fait bizarre de ne pas avoir de "ret" final grin

10

Bon j'étais partit pour tester les sprites, mais je n'ai pas trouvé d'outil me convenant donc j'ai décidé d'en faire un avec PureBasic smile

Je ne suis pas sûr qu'il fonctionne correctement (pas eut le temps de tester, et là je commence à... zzz) : img2asm.zip

Il gère les images 5-bits (16 couleurs), enfin en théorie smile

Le code source :
EnableExplicit
If OpenConsole() = 0
  MessageRequester("OpenConsole() error","Unable to open the console.",0)
  End
EndIf
Define i.l
Global str1$
For i = 1 To 17
  str1$ = str1$ + Chr(205)
Next
ConsoleTitle ("img2asm")
EnableGraphicalConsole(1)
PrintN(Chr(201)+str1$+Chr(187))
PrintN(Chr(186)+" img2asm - deeph "+Chr(186))
PrintN(Chr(200)+str1$+Chr(188))
PrintN("")
If CountProgramParameters() > 0
  Define file.s = ProgramParameter()
  If GetExtensionPart(file) = "jpg" Or GetExtensionPart(file) = "jpeg"
    UseJPEG2000ImageDecoder()
  ElseIf GetExtensionPart(file) = "png"
    UsePNGImageDecoder()
  ElseIf GetExtensionPart(file) = "tif"
    UseTIFFImageDecoder()
  ElseIf GetExtensionPart(file) = "tga"
    UseTGAImageDecoder()
  ElseIf GetExtensionPart(file) <> "bmp"
    PrintN("Error : image format unsupported.")
    Input()
    End
  EndIf
  If LoadImage(0, file)
    If ImageDepth(0, #PB_Image_OriginalDepth) <> 5
      If CreateFile(0, GetPathPart(ProgramFilename())+ReplaceString(GetFilePart(file), GetExtensionPart(file), "asm"))
        If StartDrawing(ImageOutput(0))
          WriteStringN(0, ReplaceString(GetFilePart(file), "."+GetExtensionPart(file), "")+":")
          WriteString(0, Chr(9)+"dcw ")
          Define y.l, x.l, i.l = 0
          For y = 0 To ImageHeight(0)-1
            For x = 0 To ImageWidth(0)-1
              If i=8
                WriteStringN(0, "")
                WriteString(0, Chr(9)+"dcw ")
                i=0
              ElseIf i>0
                WriteString(0, ",")
              EndIf
              i+1
              WriteString(0, "0x"+RSet(Hex(Int(Red(Point(x, y))/8)+Int(Green(Point(x, y))/8)<<5+Int(Blue(Point(x, y))/8)<<10), 4, "0")) ; (r)+(g<<5)+(b<<10)
            Next x
          Next y
          WriteStringN(0, "")
          StopDrawing()
        EndIf
        PrintN(ReplaceString(GetFilePart(file), GetExtensionPart(file), "asm")+" correctly generated.")
        CloseFile(0)
      Else
        PrintN("Error : unable to create the output file.")
      EndIf
    Else
      PrintN("Error : incorrect image depth (use 16 colors).")
    EndIf
  Else
    PrintN("Error : unable to open the image.")
  EndIf
Else
  PrintN("Error : no input.")
EndIf
End

Ah aussi, j'ai trouvé pas mal d'info ici : http://www.loirak.com/gameboy/gbatutor.php

11

Merci pour le lien smile J'ai trouvé un site qui a des explications très claires sur l'instruction set : http://www.heyrick.co.uk/assembler/qfinder.html

EDIT: Et je ne comprends pas comment exactement il fonctionne, mais Mappy semble les convertir : www.tilemap.co.uk/mappy.php seulement que tous les sprites sont mis ensemble.

12

Mon convertisseur ? Il suffit de lui passer en argument une image 16 couleurs (ou plus simplement de faire du "drag'n'drop").

Il faut que je vérifie le format de sortie parce que ça correspond à celui de Bimbo mais pas à celui de gifs2sprites...

Mappy a l'air bien mais un peu compliqué cheeky

Enfin ça va me servir d'inspiration pour améliorer mes éditeurs (d'ailleurs ça me fait penser que j'avais corrigé quelques bugs de celui de Juego, notamment un qui faisait qu'on ne pouvait plus dessiner sur la carte avec la nouvelle version de PureBasic...).

13

Ça y est j'ai pigé le format des sprites 16 couleurs grin

Enfaite il fallait définir une palette, puis y faire référence dans le sprite (chaque pixel est codé sur 4 bits : 2^4=16) cheeky

img2asm.zip

Code source :
EnableExplicit
If OpenConsole() = 0
  MessageRequester("OpenConsole() error","Unable to open the console.",0)
  End
EndIf
Global NewList color.l()
Define i.l
Global str1$
For i = 1 To 17
  str1$ = str1$ + Chr(205)
Next
ConsoleTitle ("img2asm")
EnableGraphicalConsole(1)
PrintN(Chr(201)+str1$+Chr(187))
PrintN(Chr(186)+" img2asm - deeph "+Chr(186))
PrintN(Chr(200)+str1$+Chr(188))
PrintN("")
If CountProgramParameters() > 0
  Define file.s = ProgramParameter()
  If GetExtensionPart(file) = "jpg" Or GetExtensionPart(file) = "jpeg"
    UseJPEG2000ImageDecoder()
  ElseIf GetExtensionPart(file) = "png"
    UsePNGImageDecoder()
  ElseIf GetExtensionPart(file) = "tif"
    UseTIFFImageDecoder()
  ElseIf GetExtensionPart(file) = "tga"
    UseTGAImageDecoder()
  ElseIf GetExtensionPart(file) <> "bmp"
    PrintN("Error : image format unsupported.")
    End
  EndIf
  If LoadImage(0, file)
    If ImageDepth(0, #PB_Image_OriginalDepth) <> 5
      If CreateFile(0, GetPathPart(ProgramFilename())+ReplaceString(GetFilePart(file), GetExtensionPart(file), "asm"))
        If StartDrawing(ImageOutput(0))
          Define y.l, x.l, i.l = 0, new_color.l = 1
          ; on commence par définir la palette
          For y = 0 To ImageHeight(0)-1
            For x = 0 To ImageWidth(0)-1
              new_color = 1
              ForEach color()
                If Int(Red(Point(x, y))/8)+Int(Green(Point(x, y))/8)<<5+Int(Blue(Point(x, y))/8)<<10 = color()
                  new_color = 0
                  Break
                EndIf
              Next color()
              If new_color
                AddElement(color())
                color() = Int(Red(Point(x, y))/8)+Int(Green(Point(x, y))/8)<<5+Int(Blue(Point(x, y))/8)<<10
              EndIf
            Next x
          Next y
          SortList(color(), #PB_Sort_Ascending)
          WriteStringN(0, ReplaceString(GetFilePart(file), "."+GetExtensionPart(file), "")+"_palette:")
          WriteString(0, Chr(9)+"@dcw ")
          ForEach color()
            If i = 8
              WriteStringN(0, "")
              WriteString(0, Chr(9)+"@dcw ")
              i = 0
            ElseIf i>0
              WriteString(0, ",")
            EndIf
            i+1
            WriteString(0, "0x"+RSet(Hex(color()), 4, "0"))
          Next
          WriteStringN(0, "")
          WriteStringN(0, "")
          i = 0
          ; puis le sprite
          WriteStringN(0, ReplaceString(GetFilePart(file), "."+GetExtensionPart(file), "")+":")
          WriteString(0, Chr(9)+"@dcw 0x")
          For y = 0 To ImageHeight(0)-1
            For x = 0 To ImageWidth(0)-1
              If i = 8
                WriteStringN(0, "")
                WriteString(0, Chr(9)+"@dcw 0x")
                i = 0
              ElseIf i = 4
                WriteString(0, ",0x")
              EndIf
              i+1
              ForEach color()
                If color() = Int(Red(Point(x, y))/8)+Int(Green(Point(x, y))/8)<<5+Int(Blue(Point(x, y))/8)<<10
                  WriteString(0, Hex(ListIndex(color())))
                  Break
                EndIf
              Next color()
            Next x
          Next y
          WriteStringN(0, "")
          StopDrawing()
        EndIf
        PrintN(ReplaceString(GetFilePart(file), GetExtensionPart(file), "asm")+" correctly generated.")
        CloseFile(0)
      Else
        PrintN("Error : unable to create the output file.")
      EndIf
    Else
      PrintN("Error : incorrect image depth (use 16 colors).")
    EndIf
  Else
    PrintN("Error : unable to open the image.")
  EndIf
Else
  PrintN("Error : no input.")
EndIf
End

Donc pour l'instant mon convertisseur ne gère que les images 16 couleurs mais il accepte pas mal de formats (.bmp, .jpg, .jpeg, .png, .tif et .tga). Je compte rajouter le support des images 16-bits ensuite (pour les modes 3 et 5 il me semble).

Par contre lorsque j'essaie de tester l'affichage d'un sprite, le compilateur me sort des erreurs :
.arm
.include "../gba.inc"
.text
.global main

main:
	ldr r0,=OAM
	ldr r1,=128
	ldr r2,=(300<<16)

reset_sprites_loop:
	str r2,[r0]+8!
	subs r1,r1,#1
	bne reset_sprites_loop
	ldr r1,=REG_DISPCNT
	ldr r2,=(MODE_0|BG2_ENABLE|OBJ_ENABLE|OBJ_MAP_1D)
	str r2,[r1]
	ldr r0,=OAM
	ldr r1,=(SQUARE|COLOR_16|10)|((SIZE_32|10)<<16)
	str r1,[r0]+4!
	ldr r1,=0
	str r1,[r0]
	ldr r1,=OBJPAL
	ldr r2,=128
	ldr r3,=sprite_palette

palette_loop:
	ldr r7,[r3]+4!
	str r7,[r1]+4!
	subs r2,r2,#1
	bne palette_loop
	ldr r1,=CHARMEM
	ldr r2,=128
	ldr r3,=sprite

sprite_loop:
	ldr r7,[r3]+4!
	str r7,[r1]+4!
	subs r2,r2,#1
	bne sprite_loop

end:
	b end

.ltorg

.include "../sprite.asm"

(Ah et j'ai dû rajouter quelques trucs à gba.inc, d'ailleurs il y en aura sûrement plus à rajouter plus tard :
@@ SPRITES @@
ROTATION_FLAG	=	0x100
SIZE_DOUBLE	=	0x200
MODE_NORMAL	=	0x0
MODE_TRANSPERANT	=	0x400
MODE_WINDOWED	=	0x800
MOSAIC	=	0x1000
COLOR_16	=	0x0000
COLOR_256	=	0x2000
SQUARE	=	0x0
TALL	=	0x8000
WIDE	=	0x4000
HORIZONTAL_FLIP	=	0x1000
VERTICAL_FLIP	=	0x2000
SIZE_8	=	0x0
SIZE_16	=	0x4000
SIZE_32	=	0x8000
SIZE_64	=	0xC000
OAM	=	0x07000000 
OBJPAL	=	0x5000200
CHARMEM	=	0x6010000
CHARMEM_MODE3	=	0x6012BFD
)

Les erreurs sont :
test.s:12: Error: garbage following instruction -- `str r2, [r0]+8!`
test.s:20: Error: garbage following instruction -- `str r1, [r0]+4!`
test.s:28: Error: garbage following instruction -- `ldr r7, [r3]+4!`etc...

14

Color: ldr r2, =color ldr r3, [r2] add r3, r3, #0x80 str r3, [r2] bx lr str r2,[r0,#8]! delay: mov r0,#0x1F00 delayLoop: subs r0,r0,#1 bne delayLoop bx lr .data x: .byte 200 y: .byte 21 .align 4 color: .word 0xFF
Je vais tester ton convertisseur maintenant, merci ! Et ne faut-il pas écrire str r2,[r0,#8]! ou quelque chose comme ça ? Je viens de finir un petit programme qui te permet faire bouger un pixel sur l'écran. Tu peux changer le couleur avec A :.arm
.include "gba.inc"
.text
.global main
main:
	mov r0, #REG_DISPCNT	@ Registre du display
	mov r1, #BG2_ENABLE
	add r1, r1, #MODE_3
	str r1, [r0]			@ Ecrire r1 dans [r0]
pixelLoop:
	bl delay				@ Comme la GBA est rapide !
	ldr r0, =x
	ldrb r0,[r0]			@ Lire l'octet (coordonnée X)
	ldr r1, =y
	ldrb r1,[r1]			@ Lire la coordonnée Y
	ldr r2, =color
	ldr r2,[r2]				@ Lire la coordonnée Y
	bl putPixel				@ bl = branch link, charger l'adresse de la prochaine instruction dans lr (r14)
	bl getKey				@ r4 = touche

@ Quelle touche a-t-on poussée ?
	ldr r0, =x
	ldr r1, =y

	tst r4, #KEY_UP
	bleq keyUp
	tst r4, #KEY_DOWN
	bleq keyDown
	tst r4, #KEY_RIGHT
	bleq keyRight
	tst r4, #KEY_LEFT
	bleq keyLeft
	tst r4, #KEY_A
	bleq changeColor
 	b pixelLoop

	mov r0, #VRAM
	mov r1, #0x00			@ Le couleur
	mov r5, #0x400
	add r5, #0x21
	mov r2, #0x9600			@ Combien d'iterations
loop1:
	strh r1, [r0], #2		@ Store halfword (16 bits)
	subs r2, r2, #1			@ Sub et mettre (Set) les drapeaux
	bne loop1
	add r1, r5				@ Les bits RGB sont dividés dans des groupes de 5 bits
	add r1, r5, LSL #5		@ Donc on va ajouter un à chaque couleur
	add r1, r5, LSL #10		@ 
	mov r0, #VRAM
	mov r2, #0x9600			@ Combien d'iterations
infin:
	ldr r3,=KEYS
	ldr r4,[r3]
	ands r4,r4,#KEY_UP
	bne infin
	b loop1

keyUp:
	ldrb r2, [r1]			@ Charger octet (Y) à [r1] dans r2
	subs r2, r2, #1			@ Y-1
	bxcc lr					@ Si Y-1 arme le drapeau C, quitter
	strb r2, [r1]			@ Sauver nouvelle coordonnée
	bx lr					@ Quitter la routine
keyDown:
	ldrb r2, [r1]			@ Y
	add r2, r2, #1			@ Y+1
	cmp r2, #160
	bxcs lr
	strb r2, [r1]			@ Sauver nouvelle coordonnée
	bx lr					@ Quitter la routine
keyRight:
	ldrb r2, [r0]			@ X
	add r2, r2, #1			@ X+1
	cmp r2, #240
	bxcs lr
	strb r2, [r0]			@ Sauver nouvelle coordonnée
	bx lr					@ Quitter la routine
keyLeft:
	ldrb r2, [r0]			@ X
	subs r2, r2, #1			@ X-1
	bxcc lr
	strb r2, [r0]			@ Sauver nouvelle coordonnée
	bx lr					@ Quitter la routine

@ r0 = X
@ r1 = Y
@ r2 = halfword à afficher
putPixel:
	mov r3, r1, LSL #4		@ r3 = r1*16
	sub r3, r3, r1			@ r3 = r1*15
	mov r3, r3, LSL #5		@ r3 = r1*240*2 (largueur de l'écran, et chaque pixel occupe deux octets)
	add r3, r0, LSL #1		@ r3 = r1*240+r0*2 (parce qu'un pixel occupe deux octets)
	add r3, #VRAM
	strh r2 , [r3]			@ SToRe Halfword en r2 dans [r3]
	bx lr					@ = br r14 (ret)
							@ On utilise bx pour sauter à une adresse dans un registre

getKey:
	mov r3, #KEYS_HIGH		@ MSB
	orr r3, r3, #KEYS_LOW	@ Ajouter LSB de l'adresse
	mov r2, #0x300
	orr r2, #0xFF			@ r2 = $3FF
getKeyLoop:
	ldr r4, [r3]			@ Lire les touches poussées
	teq r4, r2				@ Si nous n'avons pas appuyé sur une touche
	beq getKeyLoop			@ ... répéter
	bx lr					@ Quitter la routine

change

rSuE
Et merci pour les nouveaux equates grin J'ai fait quelques simples routines, une qui affiche un pixel, un genre de GetKey, et une routine pour faire un délai (la GBA est rapide ! Rapidissimo !)

15

Wow, c'est terrible smile

Le code pour tester le sprite est issu d'un tuto (j'étais pressé de tester pour voir si mon programme marche !), j'ai pas trop fait attention à la syntaxe, mais je vais tester ça.

edit : c'est quoi les valeurs de #KEYS_HIGH et #KEYS_LOW ?

16

Oups, désolé. Je l'ai fait pour n'avoir à charger une valeur de la mémoire, ce sont simplement le MSB et le LSB du registre de touches :
KEYS = 0x04000130
KEYS_HIGH = 0x04000000
KEYS_LOW = 0x00000130

17

Ah ok, merci smile

C'est rapide en effet !

Par contre pour les sprites ça ne marche toujours pas... Je testerai ça plus tard à tête reposée parce que là je commence à faire une overdose de programmation fou

18

Je crois que le formate du sprite n'est pas correct. Comme les sprites sont 8x8, il faut l'organiser comme ci :
sprite:
@ haut gauche
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
@ haut gauche+1
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
	.word  0x11111FFF
	.word  0x555431FF
	.word  0xAA55431F
	.word  0xFFA5541F
	.word  0xFFA55431
	.word  0xFAA55431
@ haut gauche+2
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
	.word  0xFFFFFFF1
	.word  0xFFFFFF14
	.word  0xFFFFF145
	.word  0xFFFF145A
	.word  0xFFFF145F
	.word  0xFFFF145A
@ haut gauche+3
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
	.word  0xFFFFFFFF
Il faut tenir en compte aussi que les nibbles du sprite vont s'afficher de droite à gauche, à vrai dire je ne sais pas pourquoi mais c'est ainsi (EDIT: ça sera parce que c'est BIG ENDIAN et pas LITTLE ENDIAN ??). J'ai commencé à convertir le sprite, mais j'ai pas envie de le terminer :
bty5
Tu peux voir que c'est à l'envers, et je ai dû les convertir à des words (pas des halfwords) parce que c'est plus facile à gérer comme ça.

EDIT: Et voici le code source (que je ne comprends pas encore !) : .arm .include "gba.inc" .text .global main main: ldr r0,=OAM ldr r1,=128 ldr r2,=(300<<16) reset_sprites_loop: str r2,[r0],#8 subs r1,r1,#1 bne reset_sprites_loop ldr r1,=REG_DISPCNT ldr r2,=(MODE_0|BG2_ENABLE|OBJ_ENABLE|OBJ_MAP_1D) str r2,[r1] ldr r0,=OAM ldr r1,=(SQUARE|COLOR_16|10)|((SIZE_32|10)<<16) @ 10 = coordonnée X str r1,[r0],#4 ldr r1,=0 str r1,[r0] ldr r1,=OBJPAL ldr r2,=128 ldr r3,=sprite_palette palette_loop: ldr r7,[r3],#4 str r7,[r1],#4 subs r2,r2,#1 bne palette_loop @ Charger le sprite ldr r1,=CHARMEM ldr r2,=128 ldr r3,=sprite sprite_loop: ldr r7,[r3],#4 str r7,[r1],#4 subs r2,r2,#1 bne sprite_loop end: b end .ltorg .include "sprite.asm"

EDIT2: Et pour te donner un peu plus d'information sur le formate des sprites :
1KJI
Chaque boîte est son propre 8x8 sprite, donc on peut pas lire le bitmap un pixel à la fois, après lire 8 pixels il faut sauter au prochain rang jusqu'à finir le sprite (et le premier pixel du bmp sera le LSN (least significant nibble) du .word).

19

... cheeky

Bon ok ça change pas mal de choses... Par contre la palette reste correcte ?

20

La palette est parfaite grin Et j'ai ajouté un peu plus à mon dernier post, je sais pas si tu l'as vu smile

EDIT: On pourrait aussi le gérer dans notre code, mais je crois qu'il sera plus simple (et plus rapide !) de changer le formate des sprites grin

21

Oui j'ai vu, je me demandais juste si tu avais dû la modifier.

Je vais corriger ça, ça m'a l'air pas trop compliqué smile

Par contre, est-ce qu'il existe .halfword ou quelque chose du genre ?

edit : voilà : http://deeph.servhome.org/ftp/Game%20Boy%20Advance/img2asm.zip

Voyons voir si ça marche...

22

Oui, ".hword". Il y a aussi ".byte". Mais je crois qu'il sera plus simple d'utiliser .word ici, sinon :
.word 0xFFFFDCBA (qui affichera ABCDFFFF à l'écran)
deviendra :
.hword 0xDCBA, 0xFFFF (qui affichera ABCDFFFF)

Il est plus compliqué comme ça je trouve.

23

Il faut changer les @dcw en des .hword's (@ = un comment :P) mais cette fois c'est meilleur :
O2Va

24

Oui ça me semblais bizarre mais ce tuto disait : "Remember to replace "DCW" with "@DCW"." cheeky

Et le .hword c'est bien pour la palette justement tongue

Ahh je vois d'où viens le problème, je corrige ça tout de suite.

25

J'ai réarrangé quelques choses et... :
iNPF
grin

EDIT: Et quant à @DCW, il utilisait un autre assembleur (Goldenrod ou quelque chose comme ça) et le syntaxe est un peu différent.

EDIT2: Avec un seul sprite dans CHARMEM (OAM fait tout le reste) grin
Pcon

Mon code :
	ldr r1,=REG_DISPCNT
	ldr r2,=(MODE_0|BG2_ENABLE|OBJ_ENABLE|OBJ_MAP_1D)
	str r2,[r1]
	ldr r0,=OAM
	ldr r1,=(SQUARE|COLOR_16|10)|((SIZE_32|0)<<16) @ 10 = coordonnée X
	str r1,[r0],#4
	mov r2,#0
	str r2,[r0],#4

	mov r3,#8
rowLoop:
	add r1, r1, #32<<16			@ changer coordonnée X
	str r1,[r0],#4
	str r2,[r0],#4
	subs r3, r3, #1
	bne rowLoop


EDIT3: un simple tilemap :P
hK7L
	ldr r1,=(SQUARE|COLOR_16|0)|((SIZE_32|0)<<16)
	mov r2,#0
	mov r4,#5
rowLoop:
	mov r3,#7
colLoop:
	str r1,[r0],#4
	str r2,[r0],#4
	subs r3, r3, #1
	add r1, r1, #32<<16			@ changer coordonnée X
	bne colLoop
	bic r1,r1,#0b11111111<<16		@ BIt Clear, remettre coordonnée X à zéro
	add r1,r1,#32
	subs r4,r4,#1
	bne rowLoop

26

Ça m'énerve je n'arrive pas à repositionner tout correctement fou

Mais j'y travail...

edit : c'est bon : http://deeph.servhome.org/ftp/Game%20Boy%20Advance/img2asm.zip smile

Génial ton tilemapper (ou plutôt ton armée tongue).

27

Ok je vous suis aussi dès que je peux vous m'avez convaincu. J'ai déjà fait un peu d'asm arm perso grin

Bravo déjà pour ce que vous arrivez à faire smile

28

Génial ! grin Je ne savais pas que l'arm était si puissant, une instruction peut faire comme 10 choses à la fois !

deeph : il marche parfaitement, merci ! J'ai ajouté un peu d'information sur les sprites dans gba.inc, rien de nouveau mais peut-être il te (vous smile) sera utile.
@@ KEY PAD DEFINES @@
KEY_A 		= 1
KEY_B 		= 2
KEY_SELECT	= 4
KEY_START	= 8
KEY_RIGHT	= 16
KEY_LEFT	= 32
KEY_UP		= 64
KEY_DOWN	= 128
KEY_R		= 256
KEY_L		= 512
KEYS		= 0x04000130
KEYS_HIGH	= 0x04000000
KEYS_LOW	= 0x00000130

@@ Display @@
MODE_0 = 0x00
MODE_1 = 0x01
MODE_2 = 0x02
MODE_3 = 0x03
MODE_4 = 0x04
MODE_5 = 0x05

BACKBUFFER = 0x010
H_BLANK_OAM = 0x020

OBJ_MAP_2D = 0x00
OBJ_MAP_1D = 0x040

FORCE_BLANK = 0x080

BG0_ENABLE = 0x0100
BG1_ENABLE = 0x0200 
BG2_ENABLE = 0x0400
BG3_ENABLE = 0x0800
OBJ_ENABLE = 0x01000 
WIN1_ENABLE = 0x02000 
WIN2_ENABLE = 0x04000
WINOBJ_ENABLE = 0x08000
VRAM = 0x06000000
VPAL = 0x05000000
REG_DISPCNT = 0x04000000	@

@@ SPRITES @@

@*** Attribute 0 ***
@ F E D C  B A 9 8  7 6 5 4  3 2 1 0
@ S S A M  T T D R  J J J J  J J J J
@ 0-7	(J) = Y co-ordinate of the sprite (pixels)
@ 8		(R) = Rotation/Scaling on/off 
@ 9		(D) = 0 - sprite is single sized;
@			  1 - sprite is virtually double sized
@ A-B	(T) = 00 - normal
@			  01 - semi-transparent
@			  10 - obj window
@ C		(M) = enables mosaic for this sprite.
@ D		(A) = 256 color if on, 16 color if off 
@ E-F	(S) = Size, MSB in attribute 0, LSB in attribute 1

@ Byte 1 = Y coordinate of the sprite, in pixels
@ Byte 2
ROTATION_FLAG	=  0x100
SIZE_DOUBLE		=  0x200
MODE_NORMAL		=  0x000
MODE_TRANSPERANT=  0x400
MODE_WINDOWED	=  0x800
MOSAIC			= 0x1000
COLOR_16		= 0x0000
COLOR_256		= 0x2000
SIZE_8			= 0x0000 @ Only valid for SQUARE
SIZE_16			= 0x4000 
SIZE_32			= 0x8000 
SIZE_64			= 0xC000 

@*** Atribute 1 ***
@ FEDC BA98 7654 3210
@ SSVH XXXI IIII IIII	(standard sprites)
@ SSFF FFFI IIII IIII	(rotation/scaling on)
@ 0-8 (I) = X coordinate of the sprite (pixels)
@ C   (H) = flip horizinal bit
@ D   (V) = flip vertical bit
@ 9-D (F) = rotation index (0-31). rotation/scaling data in OAM attribute 3
@ E-F (S) = Size of the sprite (LSB)
@			4-bit value which sets the size of the sprite in the following way:
@			00 00: 8  x 8		10 00: 8  x 16
@			00 01: 16 x 16		10 01: 8  x 32
@			00 10: 32 x 32		10 10: 16 x 32
@			00 11: 64 x 64		10 11: 32 x 64
@			01 00: 16 x 8		11 00: Not used
@			01 01: 32 x 8		11 01: Not used
@			01 10: 32 x 16		11 10: Not used
@			01 11: 64 x 32		11 11: Not used

@ Byte 3+1 bit = X coordinate of the sprite, in pixels (9-bit value)
@ Byte 4
SQUARE			= 0x0000
WIDE			= 0x4000 
TALL			= 0x8000 
HORIZONTAL_FLIP	= 0x1000 
VERTICAL_FLIP	= 0x2000 
OAM				= 0x07000000  
OBJPAL			= 0x5000200 
CHARMEM			= 0x6010000 
CHARMEM_MODE3	= 0x6012BFD

@.macro DrawMode3Pic picDataLabel
@ldr r1,=picDataLabel
@ldr r0,=REG_DMA3SAD
@str r1,[r0]
@ldr r1,=VRAM
@ldr r0,=REG_DMA3DAD
@str r1,[r0]
@ldr r1,=(19200|DMA_32NOW)
@ldr r0,=REG_DMA3CNT
@str r1,[r0]
@.endm

@.macro CLS
@ldr r1,=REG_DISPCNT
@ldr r2,=[r1]
@ldr r0,=REG_DISPCNT
@ldr r1,=0
@str r1,[r0]
@str r2,[r0]
@.endm

@.macro RandNum Seed
@gba_rand:
@ldr	r3, =Seed		@ Point at seeds.
@ldmia	r3, {r1, r2}		@ Load them.
@tst	r2, r2, lsr .1		@ Top bit into carry.
@movs	r4, r1, rrx		@ 33 bit rotate right.
@adc	r2, r2, r2		@ Carry into lsb of Rb.
@eor	r4, r4, r1, lsl .12	@ (involved!)
@eor	r1, r4, r4, lsr .20	@ (similarly involved!)
@stmia	r3, {r1, r2}		@ Use these next time.
@.endm


EDIT: J'ai trouvé un petit problème, la palette change pour chaque sprite (donc les nibbles qui corréspond au couleur aussi). Il semble qu'il faudra pouvoir charger une palette pour que tous les sprites utilisent la même palette.

29

Contra (./27) :
Ok je vous suis aussi dès que je peux vous m'avez convaincu.

Cool, je trouve ça plus motivant de coder à plusieurs ! happy

chickendude > merci, je met à jour mon gba.inc smile

Allez je laisse un peu de côté PureBasic et je me remet à l'asm ARM devil

edit : Pour la palette je peux pas faire grand chose, mon programme est un convertisseur, pas un éditeur... En gros il faut s'arranger avant (j'ai utilisé photofiltre).

Par contre j'ai fait en sorte que les couleurs de la palette soient triées par ordre croissant (en utilisant la formule R+G<<5+B<<10), ce que ne font pas tous les autres programmes que j'ai testé. Du coup si toutes tes sprites ont les mêmes couleurs, la palette sera strictement identique.

30

Hmm... il semble que zéro est toujours noir ? Bah je me retire, il est trop tard et je ne peux plus penser wink

Quant à la palette, oui, mais parfois on n'utilise pas tous les couleurs d'une palette dans chaque sprite, mais ce n'est pas un problème pour le moment, avant de continuer je devrais finir de lire tous ces tutoriels smile