Dwedit's Board

Enjoy the board

You are not logged in.


Welcome, fellow visitors from other websites!
Whenever you download a file, I'd appreciate it if you posted a nice "Thank You" message, then tell me which site you came from. Thanks.
- Dwedit

#1 2008-10-07 11:25:23 pm


Understanding interrupts with PocketNES code

So, I've been working on adding a menu to Pogoshell2GBA.  Since I'm lazy, and PocketNES already has a pretty good menuing system, I decided to just copy it.  The problem is, I don't understand interrupts on the GBA well enough (apparently), so I've become stuck quite quickly when it comes to mimicking the menuing system.  So far, I have the following:


REG_BASE = 0x04000000
REG_P1 = 0x130

REG_IE = 0x00
REG_IF = 0x02
REG_IME = 0x08


ldr r5,=REG_BASE
add r5,r5,#REG_INTERRUPT

mov r0,#0
str r0,[r5,#REG_IME]

mov r0,#-1
strh r0,[r5,#REG_IF]
ldr r0,=0x1001
strh r0,[r5,#REG_IE]

adr r2,irqhandler
str r2,[r1]

mov r0,#1
strh r0,[r5,#REG_IME]

mov r0,#0
mov r3,#0
bl waitframe
bl drawmenu


stmfd sp!,{r0-r1}
mov r0,#0
mov r1,#1
swi 0x040000
ldmfd sp!,{r0-r1}
bx lr

mov r2,#REG_BASE
add r2,r2,#REG_INTERRUPT
mov r3,#REG_BASE
ldr r1,[r2,#REG_IE]!
and r1,r1,r1,lsr#16
ldrh r0,[r3,#-8]
orr r0,r0,r1
strh r0,[r3,#-8]
strh r1,[r2,#REG_IF]
bx lr

I've confirmed that execution gets to the waitframe routine and that the 0x04000200-0x04000208 area looks right.  But, when I set a breakpoint on the irqhandler, it doesn't seem to be called at all.  I assume I'm missing something pretty major.  Any pointers/suggestions?

#2 2008-10-08 2:06:20 am

From: Chicago
Registered: 2004-12-12
Posts: 1,010

Re: Understanding interrupts with PocketNES code

There are four places for interrupts to be enabled and disabled:
* The processor's CPSR register

DISPSTAT has three interrupt enable flags, one for HBLANK interrupts, one for VBLANK interrupts, and one for VCOUNT interrupts.  Vblank IRQ enable is bit #3, hblank irq is bit #4, and vcount irq is bit #5.

CPSR has an interrupt disable bit which is bit #7.  When set to 1, interrupts are disabled.
The interrupt disable bit can changed in every mode except user mode.
mrs r0,cpsr
bic r0,r0,#0x80  @clear "interrupt disable" bit
msr cpsr,r0

The other alternative:
Use devkitarm + libgba's interrupt functions.  Really easy to use.

"We are merely sprites that dance at the beck and call of our button pressing overlord."


#3 2008-10-08 9:08:45 am


Re: Understanding interrupts with PocketNES code

Thanks for the help.  I wasn't setting DISPSTAT appropriately.

Registered users online in this topic: 0, guests: 1
[Bot] CCBot

Board footer

Powered by FluxBB
Modified by Visman