CALL/GOTO 不需要 PIC 16F84 PCLATH Bit3+4?

PIC 16F84 PCLATH Bit3+4 unnecessary for CALL/GOTO?

我正在尝试模拟 PIC16F84,现在需要实现 PCL / PCLATH 寄存器。

PIC16F84 有 1K 的程序内存。

PCL是8Bit宽,所以在这种情况下PCLATH的Bit 0和Bit 1用于在每个大小为256B的四个页面之间切换,我是不是到目前为止?

基于此,我不理解以下内容:

Datasheet 状态 GOTO:

The upper bits of PC are loaded from PCLATH<4:3>. GOTO is a two- cycle instruction.

但是 PCLATH 的高位是不是太多了?我的意思是只有 4 页,每页 256B,因此只需要 PCLATH 的第 0 位和第 1 位。或者换句话说 - PCLATH 的第 3 位和第 4 位总是 0 ?为什么我在执行 'CALL' 或 'GOTO' 时需要关心 'PCLATH' ?

程序计数器为 13 位。 GOTO 的操作数是 11 位,因此对于剩余的位,您需要从 11-sizeof(PCL) 开始的 PCLATH 的两位,即 3.

这里有一张图来说明这一点:

          12 11 10  9  8  7  6  5  4  3  2  1  0
-------------------------------------------------
|--|--|--|  |  |  |  |  |  |  |  |  |  |  |  |  |  PC (PCH:PCL)
-------------------------------------------------
          ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^
          |  |  |  |  |  |  |  |  |  |  |  |  |  
          |  | 10  9  8  7  6  5  4  3  2  1  0
          |  | ---------------------------------- 
          |  | |  |  |  |  |  |  |  |  |  |  |  |  GOTO operand
          |  | ----------------------------------
 7  6  5  4  3  2  1  0
-------------------------  
|--|--|--|  |  |  |  |  |  PCLATH
-------------------------

PCHPC的高字节)不能直接访问。相反,您通过 PCLATH 写入它。因此,为什么 PCLATH 的位 0 在我的图表中与 PC 的位 8 对齐。

PIC16F84 有 13 位程序计数器 (PC)。 GOTOCALL 指令有 11 位地址操作数,其余 2 位需要来自某个地方,即 PCLATH<4:3>。由于PIC16F84只有1K字的程序存储器,所以使用GOTO & CALL时不需要关心PCLATH。即使有一个 non-zero 随机值也不会影响寻址,因为数据表指出:

Accessing a location above the physically implemented address will cause a wraparound.

不过,最好保持 PCLATH<4:3> 位干净,以便将来与具有更大闪存的其他 PIC 型号兼容。

那么,PCLATH 与 PIC16F84 完全无关吗? No. 还有一种情况用到PCLATH:修饰PCL,PC的低8位。当修改PCL时,PC的剩余5位来自PCLATH<4:0>。修改 PCL,主要是通过向其添加一些值,用于创建 RETLW 表,可用于将常量值数组嵌入到闪存中。因此,最好在 PCLATH.

中始终有一个正确且有效的值