PICで電大版TINYBASIC 実装編その3
<実装編その3:BASICインタープリタの移植2>
前ページから続きます。
③変数の割付けアドレスの検討
先述しましたが6800のコードでは変数が$1A~$FFのアドレスに割付けられています。
6800においてはこれら全ての変数にDirect命令が適用でき、短いコードでアクセスできます。
一方エンハンスドミッドレンジのPICの場合,バンクは0のままでバンク切り替えしないことを前提にすると
最短のコードでアクセスできる領域はバンク0のRAM(0x20~0x6F)とバンク共通RAM(0x70~0x7F)を
合わせた96バイトとなります。
そこで、6800のコードでDirect命令を使用している変数のみバンク0に配置し、
残りの変数はバンク1以降に配置してFSRで間接アドレッシングすることを考えました。
検討結果を以下に示します。
右側でコメントアウトしているのがオリジナルコード、左側がPICのコードです。
注意1.変数RAMENDは使用していません。
注意2.BUFFER以降80バイトを変数FORSPの後ろに移動しています。
注意3.BASICで使用するA~Zの変数領域がオリジナルの0x82から0x38に移動しています。
インタープリタのコードはこの領域が0x82に存在することを前提に作成されていますが、
インタープリタをPICに移植する際にインタープリタ側のコードを修正します。
注意4.変数SUBSPとFORSPはバンク共通RAM(0x70~0x7F)に移動
注意5. BUFFER以降の領域にはFSRアドレスを割り当てます。(BUFFERの実アドレスは0xA0)
cblock 0x20 ; ORG $001A
V:2 ;0x20 ;V RMB 2
_W:2 ;0x22 ;W RMB 2
_Z:2 ;0x24 ;Z RMB 2
RND:2 ;0x26 ;RND RMB 2
LN:2 ;0x28 ;LN RMB 2
PX:2 ;0x2A ;PX RMB 2
SP:2 ;0x2C ;SP RMB 2
LNADRS:2 ;0x2E ;LNADRS RMB 2
BUFEND:2 ;0x30 ;BUFEND RMB 2
LDFLG ;0x32 ;LDFLG RMB 1
AFLG ;0x33 ;AFLG RMB 1
CHCNT ;0x34 ;CHCNT RMB 1
_F ;0x35 ;F RMB 1
;BUFFER RMB 80
;EXSTK EQU *
EXSP:2 ;0x36 ;EXSP RMB 2
ATOZ:52 ;0x38 ; RMB 52
PRSTRT:2 ;0x6C ;PRSTRT RMB 2
PREND:2 ;0x6E ;PREND RMB 2
;RAMEND RMB 2
SUBSP:2 ;0x70 ;SUBSP RMB 2
FORSP:2 ;0x72 ;FORSP RMB 2
; RMB 64
;FORSTK EQU *
Areg ;0x74
Breg ;0x75
XHreg ;0x76
XLreg ;0x77
SHreg ;0x78 ハードウエアスタックのスタックポインタ
SLreg ;0x79 ハードウエアスタックのスタックポインタ
Temp ;0x7A
TSTATUS ;0x7B BASICランチャーで使用
TAreg ;0x7C BASICランチャーで使用
TBreg ;0x7D BASICランチャーで使用
THreg ;0x7E BASICランチャーで使用
TLreg ;0x7F BASICランチャーで使用
endc
BUFFER equ 0x70-0x20+0x2000 ;UMTOP EQU $0940
EXSTK equ BUFFER+80 ;UMBTM EQU $7FFF
FORSTK equ EXSTK+64 ;BRKCHK EQU $8004
STACK equ FORSTK+0x37 ;STACK EQU $A047
SUBBTM equ STACK+3 ;SUBBTM EQU $A04A
SUBSTK equ FORSTK+0x60 ;SUBSTK EQU $A080
④スタックポインタの扱いをどうするか
6800ではRAM上にスタックポインタを形成するためスタック容量は自由に設定できますが、
エンハンスドミッドレンジのPICでは16段のハードウエアスタックなので、いったんオーバー
フローを起こすと戻り先を失ってプログラムがクラッシュします。
電大版TINYBASICではFOR-NEXT用に独立のスタックを用いてスタックのオーバーフローを防止していますが、
これ以外にもたとえば括弧を多重に使った演算などを行うとPICの16段のスタックは簡単にオーバーフローして
しまいます。
PICのハードウエアスタックのためにオリジナルの電大版TINYBASICで設定しているスタックのほかに
新たにスタック領域を作成してハードウエアスタックを逃避させる工夫が必要です。
ハードウエアスタックのスタック
○考えかた
デバッグ時の経験から最もスタックを消費するのはEXPR3ルーチンなので,
EXPR3ルーチンの前でハードウエアスタックをPUSH,EXPR3ルーチンの後でPOPさせる。
スタック領域はRAMの最後尾から240バイトとする。

前ページから続きます。
③変数の割付けアドレスの検討
先述しましたが6800のコードでは変数が$1A~$FFのアドレスに割付けられています。
6800においてはこれら全ての変数にDirect命令が適用でき、短いコードでアクセスできます。
一方エンハンスドミッドレンジのPICの場合,バンクは0のままでバンク切り替えしないことを前提にすると
最短のコードでアクセスできる領域はバンク0のRAM(0x20~0x6F)とバンク共通RAM(0x70~0x7F)を
合わせた96バイトとなります。
そこで、6800のコードでDirect命令を使用している変数のみバンク0に配置し、
残りの変数はバンク1以降に配置してFSRで間接アドレッシングすることを考えました。
検討結果を以下に示します。
右側でコメントアウトしているのがオリジナルコード、左側がPICのコードです。
注意1.変数RAMENDは使用していません。
注意2.BUFFER以降80バイトを変数FORSPの後ろに移動しています。
注意3.BASICで使用するA~Zの変数領域がオリジナルの0x82から0x38に移動しています。
インタープリタのコードはこの領域が0x82に存在することを前提に作成されていますが、
インタープリタをPICに移植する際にインタープリタ側のコードを修正します。
注意4.変数SUBSPとFORSPはバンク共通RAM(0x70~0x7F)に移動
注意5. BUFFER以降の領域にはFSRアドレスを割り当てます。(BUFFERの実アドレスは0xA0)
cblock 0x20 ; ORG $001A
V:2 ;0x20 ;V RMB 2
_W:2 ;0x22 ;W RMB 2
_Z:2 ;0x24 ;Z RMB 2
RND:2 ;0x26 ;RND RMB 2
LN:2 ;0x28 ;LN RMB 2
PX:2 ;0x2A ;PX RMB 2
SP:2 ;0x2C ;SP RMB 2
LNADRS:2 ;0x2E ;LNADRS RMB 2
BUFEND:2 ;0x30 ;BUFEND RMB 2
LDFLG ;0x32 ;LDFLG RMB 1
AFLG ;0x33 ;AFLG RMB 1
CHCNT ;0x34 ;CHCNT RMB 1
_F ;0x35 ;F RMB 1
;BUFFER RMB 80
;EXSTK EQU *
EXSP:2 ;0x36 ;EXSP RMB 2
ATOZ:52 ;0x38 ; RMB 52
PRSTRT:2 ;0x6C ;PRSTRT RMB 2
PREND:2 ;0x6E ;PREND RMB 2
;RAMEND RMB 2
SUBSP:2 ;0x70 ;SUBSP RMB 2
FORSP:2 ;0x72 ;FORSP RMB 2
; RMB 64
;FORSTK EQU *
Areg ;0x74
Breg ;0x75
XHreg ;0x76
XLreg ;0x77
SHreg ;0x78 ハードウエアスタックのスタックポインタ
SLreg ;0x79 ハードウエアスタックのスタックポインタ
Temp ;0x7A
TSTATUS ;0x7B BASICランチャーで使用
TAreg ;0x7C BASICランチャーで使用
TBreg ;0x7D BASICランチャーで使用
THreg ;0x7E BASICランチャーで使用
TLreg ;0x7F BASICランチャーで使用
endc
BUFFER equ 0x70-0x20+0x2000 ;UMTOP EQU $0940
EXSTK equ BUFFER+80 ;UMBTM EQU $7FFF
FORSTK equ EXSTK+64 ;BRKCHK EQU $8004
STACK equ FORSTK+0x37 ;STACK EQU $A047
SUBBTM equ STACK+3 ;SUBBTM EQU $A04A
SUBSTK equ FORSTK+0x60 ;SUBSTK EQU $A080
④スタックポインタの扱いをどうするか
6800ではRAM上にスタックポインタを形成するためスタック容量は自由に設定できますが、
エンハンスドミッドレンジのPICでは16段のハードウエアスタックなので、いったんオーバー
フローを起こすと戻り先を失ってプログラムがクラッシュします。
電大版TINYBASICではFOR-NEXT用に独立のスタックを用いてスタックのオーバーフローを防止していますが、
これ以外にもたとえば括弧を多重に使った演算などを行うとPICの16段のスタックは簡単にオーバーフローして
しまいます。
PICのハードウエアスタックのためにオリジナルの電大版TINYBASICで設定しているスタックのほかに
新たにスタック領域を作成してハードウエアスタックを逃避させる工夫が必要です。
ハードウエアスタックのスタック
○考えかた
デバッグ時の経験から最もスタックを消費するのはEXPR3ルーチンなので,
EXPR3ルーチンの前でハードウエアスタックをPUSH,EXPR3ルーチンの後でPOPさせる。
スタック領域はRAMの最後尾から240バイトとする。

- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 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