楽天市場
[無料でホームページを作成] [通報・削除依頼]

PICで電大版TINYBASIC 実装編その2

<実装編その2:BASICインタープリタの移植1>

このページでは6800のBASICプログラムをPICに移植するための考えかたを述べます。

まず大前提としてBASICインタープリタのコードは0x07FFを超えないように作成することです。
movlp命令を使用せずにジャンプやサブルーチンコールを行うことでコードサイズの低減が図れます。
ただし最後尾の文字列データに関してはFSRレジスタで参照するだけなのでこの限りではありません。
電大版TINYBASICは文字列データとインタープリタ部分がきれいに分離されているため、
インタープリタ本体を0x07FFまでの領域に配置することは容易と思われます。


①6800のレジスタを如何にエミュレートするか

以下に6800のレジスタを示します。
img_20180618-074052.gif
6800のレジスタは8ビット長のアキュームレータA.BとインデックスレジスタX
スタックポインタS、フラグレジスタCにより構成されています。

エンハンスドミッドレンジのPICでは2組の16ビット長FSRレジスタがありますので、
FSR0をインデックスレジスタ、FSR1を仮想スタックポインタとして使用すれば
XレジスタとSレジスタのエミュレートは可能です。
※注) エンハンスドミッドレンジのPICに限る。
それ以外のPIC16FやPIC18Fでは16ビット長のFSRレジスタが存在しません。

アキュームレータA.BについてはRAM中にAreg,Bregと名付けた仮想レジスタを配置します。
Areg,Bregはどのバンクからもページ切り替え無しにアクセスできる0x70~0x7Fの領域に配置します。

フラグレジスタはエミュレートせずにPICのSTATUSレジスタで代用します。
ご承知のようにエンハンスドミッドレンジのPICの場合NフラグVフラグは無く、
算術後のCフラグは6800の場合と比べ反転します。

その他にFSRレジスタの一時保存用にXHreg,XLregを0x70~0x7Fの領域に配置します。
これらは6800の命令で例えば LDX 0,X などの命令をエミュレートする際に使用します。

②命令の違いを如何に克服するか
PICにはWレジスタしかないので名前のとうりWORKレジスタとして使用します。
命令のエミュレートは以下の基本形に準じます。
このようにエミュレートすることでコードサイズが増え一見不利なように見えますが、
一方でエンハンスドミッドレンジのPICには1ワード長の命令しか無いためコードサイズの増大はほとんどありません。
以下の要領で6800の命令の名前でマクロ化します。

<基本形1>
 ADDA(B),ADCA(B),ANDA(B),BITA(B),CMPA(B),EORA(B),LDA(B),ORA(B),STAA(B),SUBA(B),SBCA(B)

[6800]
CMPA     #3

[PIC]
movlw    .3
subwf    Areg,W

[6800]
CMPA     LN

[PIC]
movf     LN,W
subwf    Areg,W


<基本形2>
 CLRA(B),COMA(B),DECA(B),INC(B).ROLA(B),RORA(B),ASLA(B),ASRA(B),TSTA(B)

[6800]
DECA

[PIC]
decf      Areg,F

[6800]
TSTA

[PIC]
movf      Areg,F


<基本形3>
 ABA CBA SBA TAB TBA

[6800]
TBA

[PIC]
movf     Breg,W
movwf    Areg

<NEG命令>

[6800]
NEGA

[PIC]
comf      Areg,F
incf      Areg,F


<PSH/PUL命令>

[6800]
PSHA

[PIC]
movf     Areg,W
movwi    INDF1--

[6800]
PULA

[PIC]
moviw    ++INDF1
movwf    Areg


<CPX命令>

[6800]
CPX      #$1234

[PIC]
movlw    0x34
subwf    FSR0L,W
skpz
bra      $+3
movlw    0x12
subwf    FSR0H,
W

[6800]
CPX      LN

[PIC]
movf     LOW(LN)
subwf    FSR0L,W
skpz
bra      $+3
movf     HIGH(LN)
subwf    FSR0H,W


<LDX/LDS/STX/STS命令>

[6800]
LDX      #$1234

[PIC]
movlw    0x34
movwf    FSR0L
movlw    0x12
movwf    FSR0H


[6800]
LDX      LN

[PIC]
movf     LOW(LN)
movwf    FSR0L
movf     HIGH(LN)
movwf    FSR0H


<TXS命令>

[6800]
TXS

[PIC]
movf     FSR0H,W
movwf    FSR1H
movf     FSR0L,W
movwf    FSR1L
addfsr   FSR1,-1


<TSX命令>

[6800]
TSX

[PIC]
movf     FSR1H,W
movwf    FSR0H
movf     FSR1L,W
movwf    FSR0L
addfsr   FSR0,1