SBC6303ルーズキットを作成したときに、電大版TinyBASICのワークアドレスを一部修正して動かしてみましたが挙動が怪しく….
その解決策がわかったのでまとめます。
※電大版TinyBASICは2kB以上の領域を使用するので増設RAMが必須です。
SBC6303とSBC6800のメモリーの使い方
SBC6303では、技術資料にもあるとおりSBC6800で使えたメモリーの一部がCPUやLILBUGでリザーブされています。
以下がそのイメージです。
- 電大版TinyBASICでは $1A〜$FFまでをワーク領域として使用しています。
- $0100以降はインタプリタプログラムなのでROMへ焼いてもOK
- SBC6303では、$00〜$1Fまでがレジスタ領域、$D0〜$FFがLILBUGの変数域です。
- $CFからLILBUGのスタック域としても使われてますので、上図よりもうちょっと使えないエリアがあるはず…
電大版TinyBASICのワークメモリーの移動
電大版TinyBASICの変数領域を RAM アドレス $20以降へ移動する必要があります。ただ、単純に6バイト移動させるだけでは正しく動きませんでした。
BASICのソースを読むと 、電大版TinyBASICでは変数は英大文字A〜Zで指定しますがソースではA〜Zのキャラクタコードを1ビット左シフト(x2倍)して変数値の格納アドレスとしていました。
つまり….
- アドレス $82からからの52バイトは、変数は英大文字A〜Zの変数領域なのでアドレスを動かせません。
- 変数領域の大半はダイレクトアドレシングモード命令で使用しているため $0100以降へ再配置するとオペコードが2バイト→3バイトへと増えてしまいます。
- BASIC内部では 分岐命令で *+2 などの記述を多用していたり、分岐命令が256バイトの範囲しか飛べないというMC6800の制約がありオペコードの増加は困ります。
- ただ、最後の64バイト(〜$0100)はFOR文のスタック域となっていて、元々$0100から逆に使われるということからエクステンドアドレッシングで使われていたためメモリー上どこに配置してもOKでした!
ということで、変数は英大文字A〜Zの変数領域($80のあたり)は固定にして、その他の変数域を調整することでBASICを動作させることが可能です。
SBC6303で 電大版TinyBASICが動きました!!
以前bit誌 を見ながら打ち込んだ 電大版TinyBASICのアセンブラソース について上記の変更を実施してアセンブリしました。(BASICインタプリタ本体もメモリー上で稼働させるときは $200あたりにずらしましたが…)
無事、電大版TinyBASICが 動くようになりました!!
1から10まで足し算してただしく計算できています。(変数域を動かしたときは計算間違いしてました ^^) )
ちなみに、SBC6303+PIA(パラレルI/O)のLEDチカチカプログラムもBASICで書くとこんな感じです。
電大版TinyBASICはPEEK/POKE構文があるのでメモリー入出力やI/Oデバイスの入出力が書けるのです。メモリーマップトI/Oの強みですね。
SBC6303+LILBUGでも電大版TinyBASICでLチカできました。
A-Zの変数域のアドレス($80あたり)を固定にして後段の64バイトFOR文スタックを$0100へ追い出しました。これでなんちゃって移植版MIKBUGが無くても稼働OKっぽいです。
EEPROMにLILBUG+電大BASIC焼いたら30kB以上のソースコード域ができました。 pic.twitter.com/MVoxzRTasm— KUNI-NET元シソペ (@kuninet) June 8, 2018
コメント