久しぶりの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
<MPLAB X IDE の画面>
デバッグはマダである
従って利用するには、大変な勇気が必要となると思われる
当然であるが、サポートは何も無いのである
実は少し使って見たので有ったが、WレジスタのPUSH/POPのために、貴重なプログラムエリアを無駄に消費してしまうのである
画期的と思ったのは私の妄想であった
。゚(゚´Д`゚)゚。