PICで電大版TINYBASIC 実装編その2
<実装編その2:BASICインタープリタの移植1>
このページでは6800のBASICプログラムをPICに移植するための考えかたを述べます。
まず大前提としてBASICインタープリタのコードは0x07FFを超えないように作成することです。
movlp命令を使用せずにジャンプやサブルーチンコールを行うことでコードサイズの低減が図れます。
ただし最後尾の文字列データに関してはFSRレジスタで参照するだけなのでこの限りではありません。
電大版TINYBASICは文字列データとインタープリタ部分がきれいに分離されているため、
インタープリタ本体を0x07FFまでの領域に配置することは容易と思われます。
①6800のレジスタを如何にエミュレートするか
以下に6800のレジスタを示します。

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
このページでは6800のBASICプログラムをPICに移植するための考えかたを述べます。
まず大前提としてBASICインタープリタのコードは0x07FFを超えないように作成することです。
movlp命令を使用せずにジャンプやサブルーチンコールを行うことでコードサイズの低減が図れます。
ただし最後尾の文字列データに関してはFSRレジスタで参照するだけなのでこの限りではありません。
電大版TINYBASICは文字列データとインタープリタ部分がきれいに分離されているため、
インタープリタ本体を0x07FFまでの領域に配置することは容易と思われます。
①6800のレジスタを如何にエミュレートするか
以下に6800のレジスタを示します。

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
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT