# Lab02 Addressing Mode
## (1) What is Addressing Mode?
Link:[IS for PIC18F4520](http://technology.niagarac.on.ca/staff/mboldin/18F_Instruction_Set/)
## (2) PIC18F4520 Adressing Mode
#### <font size=4>No Operation
- NOP
#### Inherent Addressing (Implied Addressing)
- SLEEP、RESET、DAW
#### Literal Addressing (Immediate Addressing)
- MOVLW、ADDLW、SUBLW、ANDLW、GOTO、CALL...
#### Direct Addressing (Absolute Addressing)
#### <font color=red>Indirect Addressing</font>
#### Bit Addressing
#### Relative addressing
---
### No Operation
- NOP

Sample code:
```as=
#INCLUDE <p18f4520.inc>
CONFIG OSC = INTIO67
CONFIG WDT = OFF
org 0x10 ;PC = 0x10
start:
nop
nop
nop
nop
nop
end
```
- PC += 2
- "wasting" 1 clock cycle
- delay loop
### Inherent Addressing
- SLEEP、RESET、DAW
- SLEEP

- RESET

- DAW

- BCD addition adjustment

### Literal Addressing
- 8-bits literal MOVLW、ADDLW、SUBLW、ANDLW
- 20-bits literal *GOTO...
Sample code:
```as=
#INCLUDE <p18f4520.inc>
CONFIG OSC = INTIO67
CONFIG WDT = OFF
org 0x10 ;PC = 0x10
start:
MOVLW 0x05
end
```

### Direct Addressing
- Data Memory MAP

<font color=red>12-bits memory address, higher 4 bits for bank select.
==> 將整塊4096Bytes的記憶體區分成16個小區(bank0~bank15)</font>
- Some data movement instructions on file register
- *Access Bank
- Access RAM ( or GPRs) (0x000 ~ 0x07F and 0xF80 ~ 0xFFF)
- Bank Select (higher address) (0x000 ~ 0xFFF)
<font color=red>(*) 因為 data movement 的 file register 欄位只有 8 個 bits,所以 Access Bank 方式只能存取 256 個 bytes 的記憶體空間(0x000 ~ 0x07F 和 0xF80 ~ 0xFFF)。
因此若要存取整個 4096-bytes 大小的記憶體空間,要使用 Bank Select 的方式存取。</font>
- MOVWF

- MOVLB (Use MOVLB to select bank)

- MOVFF

<font color = red>MOVFF 是一個很特別的指令,他的指令格式是給你兩個 12-bits 的 file register 欄位去填,所以在整個 4096-bytes 大小的記憶體裡,想去哪就去哪,不需要在乎bank這件事,也就是這個指令可以隨意在 4096-bytes 大小的記憶體空間裡存取。</font>
Sample code: Access Bank
```as=
#INCLUDE <p18f4520.inc>
CONFIG OSC = INTIO67
CONFIG WDT = OFF
org 0x10 ;PC = 0x10
start:
MOVLW 0x99 ; WREG = 0x99
MOVWF 0x10 ; [0x010] = 0x99
end
```

Sample code: Bank Select
```as=
#INCLUDE <p18f4520.inc>
CONFIG OSC = INTIO67
CONFIG WDT = OFF
org 0x10 ;PC = 0x10
start:
MOVLW 0x99 ; WREG = 0x99
MOVLB 0x4 ; BSR = 4
MOVWF 0x10, 1 ; use BSR select bank ; [0x410] = 0x99
end
```

Sample code: MOVFF
```as=
#INCLUDE <p18f4520.inc>
CONFIG OSC = INTIO67
CONFIG WDT = OFF
org 0x10 ;PC = 0x10
start:
MOVLW 0x99 ; WREG = 0x99
MOVLB 0x4 ; BSR = 4
MOVWF 0x10, 1 ; use BSR select bank ; [0x410] = 0x99
MOVFF 0x410, 0x420 ; [0x420] = 0x99
end
```

### Indirect Addressing
#### Three SFRs call FSRx (x for 0~2)
- FSR0、FSR1、FSR2
- 16bits (FSRxH : FSRxL) to cover all data memory address
- they are pointer
- LFSR ( let FSRx point to memory address k )
- 
#### Some SFRs related to pointer FSRx (x for 0~2)
- INDFx:指針不變,對指向的記憶體位置進行操作
- PLUSWx:指針 + WREG = 新的記憶體位置後,對指向的記憶體位置進行操作
- POSTINCx:對指向的記憶體位置進行操作後,指針 + 1
- POSTDECx:對指向的記憶體位置進行操作後,指針 - 1
- PREINCx:指針 + 1 後,對指向的記憶體位置進行操作
Sample code:
```as=
#INCLUDE <p18f4520.inc>
CONFIG OSC = INTIO67
CONFIG WDT = OFF
org 0x00 ;PC = 0x00
setup1:
LFSR 0, 0x000 ; FSR0 point to 0x000
LFSR 1, 0x010 ; FSR1 point to 0x010
LFSR 2, 0x020 ; FSR2 point to 0x020
MOVLW 0x10 ; WREG = 0x10
start:
INCF POSTINC0
; [0x000] += 1; FSR0 point to 0x001
INCF PREINC1
; FSR1 point to 0x011 ;[0x011] += 1
INCF POSTDEC2
; [0x020] += 1 ; FSR2 point to 0x01F
INCF INDF2
; [0x01F] += 1 ;
; FSR2 point to 0x01F(unchanged)
INCF PLUSW2
; [0x01F+0x10] += 1
; FSR2 point to 0x01F(unchanged)
end
```
### Bit Addressing
- BSF、BCF、BTFSC、BTFSS
- Set or clear specific bit file register
Sample code:
```as=
#INCLUDE <p18f4520.inc>
CONFIG OSC = INTIO67
CONFIG WDT = OFF
org 0x10 ;PC = 0x10
start:
BSF 0x000, 1
end
```

### Relative Addressing
- BC、BN、BNC、BNN、BNZ(branch if not zero) ...
- for all the "Branch" instruction to addressing
- relative address to PC value (branch的下一行)
- offset is word address(for PIC18F4520 1 word = 2Bytes)
- if branch: PC = PC + 2 + n * 2 (2's complement)
if not branch: PC = PC + 2

- Example:

</font>