45Fermer47
chickendudeLe 02/12/2012 à 20:16
J'ai fait quelques petites optimisations/changements à l'interruption, mais maintenant il ne marche pas sur VBA (mais mieux que jamais avec no$gba). Je ne comprends pas pourquoi avec VBA ça ne marche plus, si c'est un problème avec VBA (no$gba l'exécute sans problème) ou avec mon code :/
interrupt:
	mov r0, #REG_DISPCNT	@ Une petite optimisation, en lieu de "ldr r0,=REG_IE" on calcule l'offset de #REG_DISPCNT (0x0400:0000)
	ldr r1, [r0,#REG_IE-REG_DISPCNT]	@ r1 = REG_IE (2 octets) et REG_IF (2 octets)
	and r0, r1,r1, LSR #16	@ ANDer REG_IE et REG_IF
	tst r0, #INT_VBLANK
	 bxeq lr				@ Si l'interruption n'est pas un VBLANK, quitter
	ldr r0, =x
	ldr r1, =y

	ldr r0,[r0]				@ Charger X
	ldr r1,[r1]				@ Charger Y
	mov r0,r0,LSL #8		@ Premier 8 bits de REG_BG2X = fraction
	mov r1,r1,LSL #8
	ldr r3,=REG_BG2X
	str r0,[r3], #4			@ X
	str r1,[r3]				@ Y REG_BG2Y

@ Annoncer que l'on a fini son travail avec l'interruption
	mov r0, #REG_BASE		@ 0x04000000 (REG_DISPCNT)
	ldr r1, [r0, #REG_IF-REG_BASE]
	mov r2, #INT_VBLANK		@ 
	orr r2, r1				@ Desarmer toutes les interruptions (il faut les mettre à 1 pour les désarmer)
	str r2, [r0, #REG_IF-REG_BASE]	@ 
	ldr r1, [r0, #REG_IE-REG_BASE]	@ r1 = REG_IE (2 octets) et REG_IF (2 octets)
	and r3, r1,r1, LSR #16	@ ANDer REG_IE et REG_IF
	ldrh r2, [r0, #-8]		@ Les drapeaux d'interruptions du BIOS (0x3FFFFF8 est un miroir de 0x3007FF8)
	orr r2, r2, r3			@ (REG_IE & REG_IF) | "BIOS_IF"
	strh r2, [r0, #-8]		@ Les écrire (pour que le hardware les efface, il n'a pas de sens, je sais)
	bx lr
Dwedit m'a aidé avec la dernière partie. Il a dit que le BIOS gère les interruptions aussi et qu'il faut les effacer aussi si l'on veut utiliser certaines routines "swi". Et j'ai appris un petit truc aujourd'hui : pourquoi n'y a-t-il pas un "bx lr" (bx = sauter à l'adresse contenue dans un registre, donc ici comme un ret) à la fin de cette routine (c'est du code pour la NDS) ? wink
waitforVblank:
	stmfd sp!, {r0-r1, lr} 
	ldr r0, =REG_VCOUNT
waitforVblankLoop:									
	ldrh r1,[r0]						@ read REG_VCOUNT into r2
	cmp r1, #193						@ 193 is, of course, the first scanline of vblank
	bne waitforVblankLoop				@ loop if r2 is not equal to (NE condition) 193
	ldmfd sp!, {r0-r1, pc}
Bon je n'ai pas eu beaucoup de temps ces derniers jours, mais j'espère pouvoir écrire un simple tilemapper bientôt. Puis je veux jouer avec de la musique et les couches (avoir plus d'un fond) smile