超ミニBASIC for H8/3048 ユーザーズガイド

Copyright (C) 2002 A.Hiramatsu (02/09/23)



 この文章は、ユーザーが実際に超ミニBASIC for H8/3048 を使う際にヒントになると思われることを書いたものです。

初期化動作

 CPUがリセットされるとBASICインタプリタはH8/3048CPUの内蔵I/OをBASICを使うのに必要最小限なだけ初期化します。詳しくはI/O初期化についての項を見てください。

 次にワークエリアを初期化します。

 そして、$10000番地にBASICテキストがあるかどうか調べ、BASICテキストがあると思われればそれを実行します。この、最初に実行されるBASICテキストをスタートアップスクリプトといいます。ふつう、$10000番地は内蔵ROMですから、BASICインタプリタをROMに書き込む際にいっしょに$10000番地にBASICテキストも書き込んで置けば、リセット後シリアルターミナルからのコマンド受け付け状態になる前にBASICプログラムを走らせることができます。
 また、スタートアップスクリプトにメインの処理を全て書いて、スタートアップスクリプトの中でループしてしまえば、シリアルターミナル無しでも動くワンチップアプリケーションにすることができます。

 スタートアップスクリプトはテキストエディターで書いたものを cmb2mot.exe で変換してください。

 スタートアップスクリプトが存在しないか、またはスタートアップスクリプトの実行が終了するとシリアルターミナルからのコマンド受けつけ状態になります。

I/O初期化について

 超ミニBASIC for H8/3048は、リセット後本当に最小限の初期化しかしません。具体的にはシリアルコミュニケーションインターフェースのチャネル0、1を9600ボー、8ビット、ストップビット1に設定するだけです。
 インタプリタはSCIチャネル0は使わないので、初期化しなくてもいいのですが、秋月電子さんのAKI−H8ボードなどはチャネル0にもすでにRS−232Cコンバータがつながっており、これを普通のI/Oポートとして使うことは考えにくいのでシリアルポートとして使うよう設定しています。


 I/Oポートについては一切初期化を行っていません(ポート9のビット0〜3のみ、SCIとして初期化されます)。リセット直後の「入力」のままになっています。これは、超ミニBASIC for H8/3048が実際にどのようなハードウエアに載せられるかわからないので、うかつにI/Oポートを出力に設定してしまうとハードウエアによっては出力どうしがぶつかってしまう危険があるからです。

INITLCD文を実行すると、キャラクタ液晶モジュールを接続しているポートについては初期化されます。


 そこで、I/Oポートはユーザー側で、それぞれのハードウエアに合わせて初期化していただくことになります。初期化プログラムはスタートアップスクリプトに書いておくとよいでしょう。

 何もつながっていない(プルアップ/プルダウンすらされていない)ポートを入力のまま放っておくと静電気等の悪影響を受ける可能性がありますので、出力に設定するか、内蔵プルアップMOSを持っているポートならプルアップをONにするなど適宜設定してください。

・初期化の例

外付けメモリなしの場合
(秋月電子さんのAKI−H8/3048+AKI−H8マザーボードにおける初期化例)
 10 POKE &P1DDR,$FF ' OUTPUT (NO CONNECTION)
 20 POKE &P2PCR,$FF ' PULLUP ON (DIP-SW)
 30 POKE &P3DDR,$FF ' OUTPUT (LCD)
 40 POKE &P4PCR,$FF ' PULLUP ON (BIT4..7 PUSH-SW)
 50 POKE &P5DDR,$FF ' OUTPUT (BIT0,1 LED)
 60 POKE &P6DDR,$FF ' OUTPUT (NO CONNECTION)
 70 POKE &P8DDR,$FF ' OUTPUT (NO CONNECTION)
 80 POKE &P9DDR,$FF ' OUTPUT (BIT4,5 NO CONNECTION)
 90 POKE &PADDR,$FF ' OUTPUT (NO CONNECTION)
100 POKE &PBDDR,$FF ' OUTPUT (NO CONNECTION)
110 END

※ポート7については、プログラムではどうしようもない(ビット6、7だけDA出力に設定しても焼け石に水、という感じです)ので何もつながっていない場合プルアップ/プルダウン抵抗をつけるなどして対処してください。

外付けメモリありの場合
(秋月電子さんのAKI−H8/3048+AKI−H8−USBボード、RAM628128相当実装、における初期化例)
 10 POKE &P1DDR,$FF ' OUTPUT (A0..A7)
 20 POKE &P2DDR,$FF ' OUTPUT (A8..A15)
 30 POKE &P4PCR,$FF ' PULL-UP ON (NO CONNECTION)
 40 POKE &P5DDR,$FF ' OUTPUT (A16..A19)
 50 POKE &P6DDR,$FF ' OUTPUT
 60 POKE &P8DDR,$FF ' OUTPUT (CS)
 70 POKE &P9DDR,$DF ' BIT5:INPUT(IRQ) BIT4:OUT(NO CONNECTION)
 80 POKE &PADDR,$F0 ' UPPER OUTPUT,LOWER INPUT(SW)
 90 POKE &PBDDR,$FF ' OUTPUT(LED,LCD)
100 POKE &PBDR,$0F  ' LED OFF
110 POKE &WCR,$F0   ' PROGRAMABLE WAIT MODE,WAIT COUNT=0(3STATE)
120 POKE &WCER,$FF  ' USE WSC
130 NEW $220000,131072

 AKI−H8−USBボードでは、RAMは8ビットバス接続されており、CS1端子(P8−3)によってイネーブルされます。
 130番は、外付けメモリをBASICのテキスト領域とするためのものです。単にRAMをイネーブルしたいだけなら不要です。
※外付けメモリなしの場合と同様、ポート7については何もつながっていない場合プルアップ/プルダウン抵抗をつけるなどして対処してください。

割り込みについて

 超ミニBASIC for H8/3048は、割り込みを一切使用していません。リセット後割り込み禁止のまま立ち上がり、その後CCRのIビット、UIビットには全く手をふれません。

 ユーザーがマシン語で割り込みルーチンを自作し、それを使用したい場合は割り込みジャンプテーブルを設定した上でCCRのIビット、UIビットを0にします。

・割り込みジャンプテーブル

 ふつう、0〜$FF番地の割り込みベクタ領域はROMになっており、プログラム実行中には書き換えられないのですが、超ミニBASIC for H8/3048 は、ユーザーが割り込みを使うことができるよう、割り込みジャンプテーブルというものを用意しています。

 割り込みジャンプテーブルは、$FFFE04〜$FFFF00番地にあり、1エントリ4バイトで計63エントリあります。これは、$04〜$FF番地の割り込みベクタエントリと一対一対応しています。たとえば、$04番地(ベクタ番号1番)には $00FFFE04 と書いてあり、同様に$08番地には $00FFFE08、$0C番地には $00FFFE0Cと、ベクタ番号63まで一対一対応するようになっています。
 
 ユーザーが割り込みルーチンをつくった場合、この割り込みジャンプテーブルの該当エントリに割り込みルーチンへのジャンプ命令($5Aとジャンプ先3バイトの計4バイト)を書いておけば割り込み発生時ユーザーの割り込みルーチンを起動することができます。

メモリマップ

  超ミニBASIC for H8/3048は、デフォルトのままではCPU内蔵のRAMしか使いません。その内訳は以下のようになっています。
$FFEF10〜FRE(1)-1
BASICテキスト
FRE(1)〜FRE(2)-1
フリーエリア
FRE(2)〜$FFFDFF
BASICインタプリタのワークエリア
$FFFE00〜$FFFEFF
割り込みジャンプテーブル
$FFFF00〜$FFFF0F
未使用

※H8/3052暫定対応版(cmb3052.mot)ではBASICテキストの開始番地は $FFDF10 になります

 $FFFF00からの16バイトは使用していないので、ユーザーのマシン語ルーチンなどで高速アクセスが可能なワークエリア必要な場合など、自由に使ってください。