Datasheet
© 2007 Microchip Technology Inc. DS41268D-page 25
PIC12F510/16F506
4.8 Indirect Data Addressing: INDF
and FSR Registers
The INDF register is not a physical register. Addressing
INDF actually addresses the register whose address is
contained in the FSR register (FSR is a pointer). This is
indirect addressing.
4.8.1 INDIRECT ADDRESSING EXAMPLE
• Register file 07 contains the value 10h
• Register file 08 contains the value 0Ah
• Load the value 07 into the FSR register
• A read of the INDF register will return the value
of 10h
• Increment the value of the FSR register by one
(FSR = 08)
• A read of the INDR register now will return the
value of 0Ah.
Reading INDF itself indirectly (FSR = 0) will produce
00h. Writing to the INDF register indirectly results in a
no operation (although Status bits may be affected).
A simple program to clear RAM locations 10h-1Fh
using indirect addressing is shown in Example 4-1.
EXAMPLE 4-1: HOW TO CLEAR RAM
USING INDIRECT
ADDRESSING
The FSR is a 5-bit wide register. It is used in conjunc-
tion with the INDF register to indirectly address the data
memory area.
The FSR<4:0> bits are used to select data memory
addresses 00h to 1Fh.
FIGURE 4-5: DIRECT/INDIRECT ADDRESSING (PIC12F510)
PIC16F506 – Uses FSR<6:5>. Selects from Bank 0 to
Bank 3. FSR<7> is unimplemented, read as ‘1’.
PIC12F510 – Uses FSR<5>. Selects from Bank 0 to
Bank 1. FSR<7:6> are unimplemented, read as ‘11’.
MOVLW 0x10 ;initialize pointer
MOVWF FSR ;to RAM
NEXT CLRF INDF ;clear INDF register
INCF FSR,F ;inc pointer
BTFSC FSR,4 ;all done?
GOTO NEXT ;NO, clear next
CONTINUE
: ;YES, continue
:
Note 1: For register map detail, see Figure 4-2.
2: Grey boxes are unimplemented and read as ‘1’.
Bank
Select
Location Select
Location Select
Bank Select
Indirect Addressing
Direct Addressing
Data
Memory
(1)
0Fh
10h
Bank 0 Bank 1
0
4
5
6
(FSR)
00 01
00h
1Fh 3Fh
(opcode)
04
5
6
(FSR)
Addresses map back to
addresses in Bank 0.
3
2
1
321