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

東大版TINYBASIC (STM32)


前回STM32G030J6M6を用いたMINOLベースの1kワードTinyBasicをご紹介しました。
今回、前回と同じ回路構成で東大版TinyBasicを移植しましたのでご紹介します。
試作の結果プログラムサイズは3kバイト(thumb命令で1.5kワード)となりました。

2020.05.25 追記
一部のコマンドを変更した新版(v1.01)をアップロードしました。
内容:VAL関数の廃止
  $定数(16進数)の機能変更 従来$7FFFまでしか表記できなかったところを$FFFFまで表記できるように変更。
これに伴い下記◎文法の7~12の図、◎プログラム例の[usr]の図を変更しました。
追記ここまで

◎文法
STM32G030J6M6のレジスタに対応可能なよういくつかのコマンドを追加してオリジナルから機能拡張を行っています。
図中”赤文字”で記載された箇所、および欄外のコメントがオリジナルからの相違点です。
img_20200524-093428.jpg
img_20200525-030408.jpg

◎回路図(割愛)
前回ご紹介のMINOLベースの1kワードTinyBasicと同じです。Boot0(8番PIN)を有効にするための設定も前回と同じ。


◎メモリーマップ
Basicプログラムは$20000020から収納されます。Basicプログラム領域の次が変数領域、
配列はBasicプログラム領域の最後からアドレスが小さくなる方向に作成されます。
 変数の配置 ・・・@(3),@(2),@(1),@(0),A,B,C,・・・ (アドレス増加方向->)
img_20200524-093642.jpg

◎BASICで使用する特別なアドレス レジスタの読み書きをメモリを介して行う手法は前回と同様です。
アドレス $20000009のメモリは変数印字の際の印字桁数の初期値を決めるメモリです。
※印字桁数は変数/定数表示のみ有効となり、文字列には適用されません。
(参考)
<PRINT文に何も指定しないで数値のみを印字したときの比較>
[電大版]...符号を含め行頭から印字。
#PRINT -45
-45
[1kワード版]...数値の前に空白1文字を挿入。
]PR 45
 45
[東大版]...空白、符号を含め最後の文字が6文字目となるように印字、$20000009=0とすると電大版のイメージとなる。
>PRINT -45
   -45
>PRINT -32767
-32767

img_20200524-093755.jpg

◎プログラム例
[CALC]
20-40:数値計算は乗除算が優先される。
60-90:論理計算はAND,XOR,ORの3つ
110-120:括弧を用いた計算の例
140-180:絶対値の計算 (160行:16進数表記に$を使用している)
180行で表示数のオーバーフロー(32768)を生じエラーで停止
img_20200524-093855.jpg

[ECHO]
シリアルポートを用いたエコーバックプログラム
KEY関数で入力キーのASCIIコードを取得、CHR関数でASCIIコードを出力、Escキー入力でプログラム停止
img_20200524-094334.jpg

[FLASHDUMP]
FOR-NEXT文の実例、BASICインタープリタ領域($08000000)のメモリダンプ
130行目はFOR-NEXT文中からサブルーチン呼び出し、
140行目はサブルーチン中にFOR-NEXT文を構成
FLASH領域4バイトを読み出すため190行目でRDコマンドを実行
img_20200524-094841.jpg

[IF]
東大版では通常のIF文の動作の他、大小関係式を数値化できる(真:1,偽:0)
故にPRINT (A>B)のような表記が可能
img_20200524-095142.jpg

[PRTINP]
PRINT文とINPUT文の例
文字 '_' はカーソルを行頭に移す。 文字 '_' の後のカンマはPRINT文では必要だがINPUT文では不要。
文字 '#' はPRINT文中で変数/定数の表示桁数(デフォルト値=6)を変更するときに使用する。
'#'での変更は一行中で有効となる。(180~200行)
POKE 9,nで表示桁数のデフォルト値をnに変更できる。
img_20200524-095843.jpg

[USR]
ユーザーサブルーチンコールの例、下記に示すユーザープログラムは引数の値を+3して戻る。
ユーザープログラムは必ず偶数アドレスから配置する。引数と戻り値にはともにr1レジスタが使用される。
〇前半はプログラムをメモリに構成した例、
プログラム開始アドレスを$200に設定し、プログラムはPOKE文で8ビットずつ書き込んでいる。
〇後半はプログラムを配列に構成した例、
配列はアドレスが小さくなる方向に作成されるので@(1)、@(0)の順に16ビットビットずつプログラムを書き込んでいる。
変数に16ビットの16進値を直接代入するときは=$XXYYか=VAL($XX,$YY)のいずれかの形式を選択できるが、
$8000~$FFFFの数値を代入する場合=$ の形式では負の数を入力する必要がある。

$1EA0は@(0)の配置されているアドレスの値(固定値)。ちなみに変数Aの配置アドレスは$1EA2、Bは$1EA4
img_20200524-231223.jpg


参考にしたページ、いくつかコードを使用させていただきました。ありがとうございます。

クロサワ式乱数
https://qlosawa.sakura.ne.jp/computer/krnd.html

P112 Tiny Basic User's Guide - P112 Support Page
http://p112.sourceforge.net/tbp112.html

SHERRY BROTHERS TINY BASIC VERSION 3.1
https://www.tramm.li/i8080/tinidisk.txt



ダウンロードはこちらから バグあればご報告おねがいします。
https://box.yahoo.co.jp/guest/viewer?sid=box-l-ynvbblq5wtn3l5nx64zrgryqbm-1001&uniqid=656c213f-ff91-4a2c-9a28-817dfca71f62&viewtype=detail

2020.05.25 改訂版
https://drive.google.com/file/d/1IaFwRETCNN6vnVcMr3SV2Q3palsXuzdC/view?usp=sharing