PIC 16F88のPUSH POPについて

久しぶりのPICネタである

ミッドレンジのPICである16Fシリーズには、データスタックが無い
プログラムスタックは8段(最近のF1シリーズは拡張されている)となり、ネスティングが8段までとなり、プログラムスタックは、ソフトで読み書きは出来ないのである

PICでプログラムを書いていると、WレジスタがPUSH/POP出来るればと言う妄想が浮かんで来る、ついては、PUSH POPマクロをでっち上げてみた

マクロを使う場合、コードの中に以下のデータを定義する
.
.
dstack Udata_shr  h’78’
dstack_area res     8
;dstack_sp res  1
;dstack_fsr res 1
;dstack_w res  1
;dstack_data res 4
.
.

内容は Fレジスタの78番地からスタック用として8バイトを確保している
貴重な8バイトなのに、スタック出来るバイト数は4バイトなのは、愛嬌である

ちなみに70H~7FHのFレジスタは共用メモリとして重要である
メモリバンクがどこに設定されていても、必ず読めるアドレス空間である
従って、ここにスタックデータを置くことになる
以下がマクロである

;—————————————-
;Memory addrerss 00h-FFh 対応 (bank 0,1 only)
;PUSHW
;Wレジをスタックする
;78h dstack_sp データスタックポインタ
;79h dstack_w W reg save
;7ah dstack_fsr FSR save
;7bh-7fh dstack_data 5 level stack data
;

dstack_sp equ      h’80’-8
dstack_fsr equ     h’80’-7
dstack_w equ      h’80’-6
dstack_data equ  h’80’-5
;

;例: PUSHW
;—————————————-
PUSHW macro
movwf dstack_w    ;Wreg save
movfw FSR
movwf dstack_fsr   ;FSR save

movfw dstack_sp
addlw dstack_data   ;W=stack data offset
movwf FSR              ;FSR (stack_data)+sp

movfw dstack_w
movwf INDF            ;W → stack_data

incf dstack_sp,F        ;stack_sp ++

movfw dstack_fsr
movwf FSR               ;restore FSR
movfw dstack_w       ;restore W
endm

;—————————————-
;Memory addrerss 00h-FFh 対応 (bank 0,1 only)
;POPW
;スタックからWにデータをセットする
;78h dstack_sp データスタックポインタ
;79h dstack_w W reg save
;7ah dstack_fsr FSR save
;7bh-7fh dstack_data 5 level stack data
;
;例: POPW
;—————————————-
POPW macro
movwf dstack_w      ;Wreg save
movfw FSR
movwf dstack_fsr     ;FSR save

movfw dstack_sp       ;W=stack data offset
addlw dstack_data     ;W=stack data offset
movwf FSR
decf FSR,F                  ;FSR (stack_data)+sp-1

movfw INDF              ;stack_data → W

movwf dstack_w         ;Wreg save
movfw dstack_fsr
movwf FSR                  ;restore FSR
decf dstack_sp,F           ;stack_sp —
movfw dstack_w          ;restore W
endm

 

 

MPLABX

<MPLAB X IDE の画面>

デバッグはマダである
従って利用するには、大変な勇気が必要となると思われる
当然であるが、サポートは何も無いのである

実は少し使って見たので有ったが、WレジスタのPUSH/POPのために、貴重なプログラムエリアを無駄に消費してしまうのである

画期的と思ったのは私の妄想であった
。゚(゚´Д`゚)゚。

投稿者:

miniDATA

その昔PCのBIOS・デバイスドライバ等の開発と機器のファームウェア開発に従事した元技術者(主にアセンブラ)  なぜか、昔のモノが大好きで昭和時代のクルマやバイクに惹かれてしまい懐古趣味全開になりつつある自分が、怖いと感じている 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です