Indexed Addressing
It is often useful to use a pointer to reference a section of memory. The 68HC11 has two index registers, X and Y. These are the equivalent of pointers in C.
For example, let's say we want to fill the address range 0x0200 to 0x2FF with the number 0x60. One way would be to load an accumulator with 0x60 and store that to address 0x0200. Then we could store the value to address 0x0201, and so on:
LDAA #$60 ; STAA $0200 ; STAA $0201 ; STAA $0202 ; STAA $0203 ; STAA $0204 ; STAA $0205 ; STAA $0206 ; ... and so it goes
While this would do what we want, it makes for a long (and tedious) program. A simpler way is to use indexed addressing , with an index register pointing to each memory location in turn. The following program uses indexed addressing to achieve our goal:
LDX #$0200 ; load the X register with the number 0x0200
LDAA #$60 ; load the A accumulator with the value to be stored
LDAB #$FF ; load the B accumulator with the count
loop STAA 0,X ; store acc A to address pointed to by X with no offset
INX ; increment X to point to next address
DECB ; count down
BNE loop ; repeat until we have counted down to zeroThe LDX instruction loads an immediate value into the 16-bit X register. This is now our pointer into memory. The A accumulator is then loaded with the value to be stored in memory, and the B accumulator is loaded with the number of locations in memory we will be accessing. This will act as the counter for our loop.
The loop begins by storing the content of the ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access