OSI 8K BASICはOhio Scientific Instrumentsが販売していたパーソナルコンピュータに搭載されていた実数型BASICインタプリタで、1977年にリリースされています。
OSI 8K BASICが搭載されていたOSIのパーソナルコンピュータの概要は、以下のWEBページをご参照ください。
- http://www.technology.niagarac.on.ca/people/mcsele/hobby/vintage-ohio-scientific-computers/
- https://en.wikipedia.org/wiki/Ohio_Scientific
- https://osi.marks-lab.com/boards/boards.html
OSI 8K BASICのソースコード
6502は様々なパーソナルコンピュータのMPUとして利用されたため、それらのパーソナルコンピュータのメーカーから製品として提供されたBASICインタプリタや、オープンソースで提供されたBASICインタプリタなど、たくさんの実装があり、それらのソースコードを入手することができます。
これらの中でも、OSI 8K BASICのソースコードが(。。。というよりもそれも含めて)提供されている[Create your own Version of Microsoft BASIC for 6502]とそのGitHubは強烈で、6502を使用したパーソナルコンピュータ用の8種類のBASICインタプリタを作成できるソースコード群が提供されています。また、様々なオプションがあり、それらを個別に設定すると、膨大な種類のBASICインタプリタを作成することができます。
これらのソースコードを使用すると、ちょっと面倒ではありますが、あなたも自身の要求に合ったカスタム版のBASICインタプリタを作成することができます。
利用させていただいたソースコードや移植のための情報は下記のWEBページから取得することができます。
- https://www.pagetable.com/?p=46
- Create your own Version of Microsoft BASIC for 6502
- https://github.com/mist64/msbasic
- Microsoft BASIC for 6502
OSI 8K BASICのマニュアルは下記のWEBページから取得することができます。
OSI 8K BASICのシングルボードコンピュータへの移植に関しては、Grant氏による移植版が有名で、日本でも多くの方が利用されているようです。
Grant氏による移植版の情報は以下のWEBページをご参照ください。
OSI 8K BASICの実数の有効桁数について
OSI 8K BASICのオリジナルは、実数値の有効数字が6桁ですが、9桁に拡張したバージョンも作成したので、6桁では精度上の問題があったり、少し物足りなかった方はご活用ください。
OSI 8K BASICの実行ファイルは以下の様なファイル名となっています。
- 有効桁数6桁版: XUM-osi-basic-fp6-std.SREC
- 有効桁数9桁版: XUM-osi-basic-fp9-ram.SREC
オリジナルの有効桁数6桁版に対して、設定を変更して作成した有効桁数9桁版には、以下のような特徴があります。
用途に応じて特徴を生かした使い分けをしてください。
- 10進数換算で、2桁少しの計算精度が向上している。
- \ref{sec:osi-basic-benchmark}節で行ったベンチマークの例では、十数パーセントの速度低下がみられる。
- 各変数が占有するバイト数が1バイト増加するため、大きな配列を必要とするプログラムでは、メモリが不足する場合がある。
- また、メモリを最大限活用するためには、STD構成ではなくRAM構成でご利用ください。
有効数字6桁版のアドレスマップ構成
OSI BASICの本来の実数計算精度のBASICインタプリタです。
BASICインタプリタは8KBに収まるので、STD構成の$D000-$EFFFの移植領域に組み込めるように構成しています。
このため、STD構成のみで利用できます。
有効数字9桁版のアドレスマップ構成
アセンブル時のオプション指定を変更し、OSI BASICの実数計算精度を9桁に拡張したBASICインタプリタです。
コードは8KBを少し超えているため、$D000からではなく$0300から格納されるように構成しています。
このためSTD,RAM,ROMのどのアドレスマップ構成でも利用可能ですが、実装されているRAMを最も有効に利用できるのはRAM構成となっています。
アドレスマップを表\ref{tab:demo-basic-std-conf}に示すようにSTD構成のままで使用することもできますが、表\ref{tab:demo-osi9basic-ram-conf}に示すようにRAM構成にして使用すると、使用できるメモリ領域が8KB程度増加します。
ブロック | ジャンパ | 設定 | 機能 | 選択 |
JP1 | SEL2 | オープン | アドレスマップ | RAMモード |
SEL3 | ショート | |||
JP2 | ROM0 | オープン | モニタ | Universal Monitor (IO-E) |
ROM1 | オープン | |||
JP3 | ショート | タイマー割込み | 10ミリ秒 |
OSI BASICインタプリタの変更と拡張
編集キー
現在のキーボードの使用法に合わせて、プログラム入力等の行編集キーの割り当てを変更しています。
- 一文字消去
- ‘_’
- BS
- 一行消去
- @
計時機能
OSI BASICインタプリタには、BASICインタプリタの起動後の経過時間を秒単位で取得できるUPTIME関数を追加しています。この関数の主要な利用目的は、プログラムのベンチマーク実施時の計時や、経過時間に関与する簡単なプログラムでの計時です。
UPTIME関数が返す数値は、9時間少しでオーバーフローし0に戻るのでご注意ください。
UPTIME関数は1引数の関数ですが、引数の値はUPTIMEの機能に影響を与えません。
UPTIME関数は、図\ref{fig:osi-basic-uptime-1}のように使用して、プログラムの処理時間を秒単位で計測し表示することができます。
10 T=UPTIME(0)
:
:
90 PRINT "EXEC TIME: "; UPTIME(0)-T; " sec"
UPTIME関数を利用した計時機能
OSI BASICインタプリタの起動
OSI-BASICの有効数字6桁版[XUM-osi-basic-fp6-std.SREC]を例としてプログラムのロードと実行の手順を説明します。有効数字9桁[XUM-osi-basic-fp9-ram.SREC]も同じ手順で使用できます。
まず、6502-COREにプログラムをロードする手順は、\ref{sec:execute-basic}節に示している方法と同様ですので、それを参照して実行してください。
ここでは、プログラムのロード後の手順を示します。
[XUM-osi-basic-fp6-std.SREC]には、プログラムの開始アドレスをモニタに設定する機能が組み込まれています。プログラムのロード後に開始アドレスがPCに設定されているか確認するために、Rコマンドを実行してみましょう。PCに$D000が設定されていれば正常です。この確認作業は省略してかまいません。
開始アドレスが正しくPCに設定されているので、BASICを起動するために単純にGコマンドを入力します。
BASICが起動されると、最初に使用するメモリ量の入力が求められます。これに数値を入力せずエンターを押すと、システムが使用可能なメモリの最大量を調査して自動的に設定します。
次に、端末の文字幅の入力を求められるので80を入力します。この数値は、目的や用途に応じて変更してもかまいません。デフォルトは72になっています。
これでBASIC起動時の設定は終わり、使用できるメモリ量と起動メッセージを表示してBASICインタプリタが「OSI-BASICの起動」の様に待機状態になります。この例では、48K程度のメモリを確保できたようです。
なお、実行しているBASICインタプリタの有効桁数は、1/3をPRINTすると簡単に確認できます。この例では6桁であることが示されています。
新たに追加された計時関数UPTIMEの動作確認もしてみましょう。