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) ?
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)