bx means branch exchange. It's an absolute branch with a register argument (the b instruction is a relative branch that takes an immediate argument, not a register) that is capable of switching between ARM/Thumb mode based on bit 0 of the target address.
bx lr (r14 is called "lr", which means Link Return. bl means "branch long" and works like "b" does, but with a larger range; when an address is bl'd to, lr is updated with the address to return from the subroutine being called by the bl) is commonly used for returning from subroutines.
Also, strh stores a halfword, so in your case, it was storing 0x0008, not 0x08. ldr loads a word (0xXXXXXXXX).
It looks like you got everything commented correctly.
Also, the correct way to say that something is at a specific address is to use the .org directive.
ldr r1 =020CACBCh @The GNU ARM assembler uses @ for comments.
@The above line loads 0x020CACBC into register 1 in the fashion "ldr r1, [pc (pc is r15), #0x(immediate offset)]"
strh r0, [r1] @Stores lower 16 bits of r0 at the address held by r1
bx r14 @Return
.org 0x020BB970
ldr r1, =0208B168h @Should know how this works by now
mov r0, r4 @r4 is a local variable, probably one placed here by a mov r4, r0 instruction near the
@beginning of the routine, which means that it was one of the arguments of the current function being executed
ldr r2, [r1] @r2 is set equal to the 32 bits at the address held by r1
add r1, r4, 400h @r1 = r4 + 0x400, as you've noticed
I recommend improving your whitespacing of assembly code.
Edit: I've just confirmed that setting a breakpoint on reads of a ROM address is indeed possible with No$GBA if you follow the documentation I've quoted from GBATEK (written by the same person No$GBA was written by).
Set a break on writes to 0x040001A8 and use No$GBA's conditional breakpoint feature to do it something like this:
[040001A8]!!, r(some register number; you may have to try r0 through r2) == 0xB7aaaaaa
Where aaaaaa is the upper 24 bits of the address you want to watch.
After you get a hit, setting a break on reads of 0x04100010 and continuing until that breakpoint is hit will show you the data at or around your address being loaded serially (4 bytes at a time, usually in groups of 0x200 bytes).
____________________

|