次世代MSXBASICプロジェクト

=PCとMSXのデータ共有をする=

MSXturboRでV9990を見た方もいるでしょう。
海外のV9990カートリッジはマシン語から拡張するもので
多くのMSXユーザーは満足いかないものでした。
もし、MSX3ができても…セガサターンとかそんな程度かな。
MSXが3DOになるって言えばわかりますよね?
そこで次のマシンをXとして考えていこうというものです。
Xというのは、その時代によって変わってくると思います。
1chipMSXのスペックがメモリが4096KB、SDカード2GBとなれば
最低でも16ビットか32ビットマシンのようなスペックを私はイメージします。
そこで,LinuxをMSX3としても何かWndowsとかけ離れた感じがします。
解像度を変えるとドットが鋭利な感じが出て9801の感じに近くなる、
やはりあの音、あのドットがないといけないような気がしたりもします。
1chipMSXの登場により、PCをXとするマシンにMSX環境をつくることで
MSXがなくなったとしても、今までのMSXデータをXのマシンで使える
MSXBASICに近い環境をつくりたいとも思っています。
でも、これはMSXエミュレータを作るという事ではありません。
それよりも、優れている言語は山ほどあるし、
BASICの基本的な命令をちょこっと作る、そんな程度でよいと今は思っています。
プロジェクトは思い通りにならないこともあり、試作テストの続く長いものとなるでしょう。
使えるそうならば、どんな言語でもやってみようかなと…
すでに音声データをMSXで読むことができる8ビットデータに変換しており
また8ビットでは難しい処理などのデータ作りを今後も進めていきます。

プロジェクト例:
J-INの地名辞書、音訓辞書ファイル
MSXのテキスト画像データをExcelで活用する
MSXのSCREEN8の色をプログラミング言語で表示する
8ビットモノラルWAV音声データ

新しいBASICなどの言語を使う:
http://www.geocities.jp/fullmsx2/u-yan/newbasic.html

=MSXで次世代のプログラムを!MSX TOP STYLE=

MSX専門書が希少になった現在ではMSXを使うことは困難です。
そこで、MSXBASICのやさしい部分から作り直すことにしています。
また、マシン語についても再度、開発をはじめることにしました。
マシン語とC言語の共存に比べて、
マシン語とBASICインタプリタの共存はなかなか難しいものです。


ここまで、できます!
カラーコードMSX-MUSIC音色コードネームで!!
テストプログラムではダウンロードすれば
すぐに色を音色をテストできます。

MSXBASICでは1が黒とか1がピアノというふうに
ある程度コードを覚える必要があります。
こういうトコロを何とかできないのでしょうか?

次世代スタイルのMSXBASICを
多くの方に利用できるように実験をすすめていきます。
今までは拡張BASICなど新たな命令を覚える必要がでてきました。
そうですね、パソコンの使い方を覚えることでした。
これからは
自分で命令を作ってしまおう!」というプロジェクトです。

メリット:
変数の宣言が英数2文字の型式から、250文字以上のワード(理論値)に可能
配列変数をPRINT感覚で記述でき見やすくなるので、デバッグしやすい

デメリット:
拡張させたモジュールを通すために処理が増える
配列変数を使用するためにメモリが必要となる
ショートプログラミングのスタイルにはあまり適さない

MSXBASICなどのBASIC言語でVisual系言語のような記述は可能です。

現在は部分的なモジュールの組み立て中ですが、
テストではMSXBASICでの指定方法も表示しています。
このページをヒントにMSXBASICを拡げていきましょう。

■MSXはCUI(キャラクタユーザーインターフェイス)

MSXを起動するとMSXBASICの画面になります。
「ABCD」と、入力して、RETURNキーまたはEnterキーで実行します。
入力した文字(キャラクタ)が命令にないとエラーになります。
入力されていないと改行されます。
CUIはパソコンとユーザーを端末で入力という操作で
PCを思うとおりに動作させるというものです。
これをユーザーが自由にBASICという言語で作ることができます。

■INPUTとPRINT

文字を入力して文字で表示してこたえる…
このようなプログラムを作ればカンタンに
思ったとおりの動作にさせることができます。

10 INPUT"つかれはとれましたか";A$
20 IF A$="はい" THEN PRINT"このほうほうをつづけてみましょう。"
30 IF A$="いいえ" THEN PRINT"べつのほうほうをかんがえましょう。"

このプログラムは誰でもできそうなサンプルと思います。
IF〜THENは「もしも、ならば〜」という命令が入っています。
この3つの命令を使えばクイズ、英単語訳、選択問題などもできます。
何と伝えればよいのか…
例えばJ-INの「J」を入力すればJ-INが起動するとできれば
おもしろいと思いませんか?
ショートカットとか連携とかそういう事ではなくて
今までできなかったパソコンに通じたうれしさがあります。

■MSXBASIC入力環境を拡げる

今のキーボード入力からケータイ入力などに対応させます。
プログラム中で以下の命令の処理と定義をさせます。
環境変数のようにやっていくと

Input_Console = ke-tai
Console_buf = D00H

具体的には
押すたびに文字が変わるキー、押して決定するキー、押して編集するキーを
これを決めます。あとは改行する文字幅を決めます。




まず、サブモジュールke-taiからコンソールシステムに受け渡しするために
バッファをD00Hに作ります。
入力した文字がD00Hに入ります。これを実行させます。

■webカラーの感覚でネームで指定

MSX:COLOR 7

「カラーコードの7番をオレンジに設定する」
という事をテストしています。
あらかじめ「Color 7 =」まで入力されていると仮定します。
そして、orangeと入力すると
orange(オレンジ)とorangered(オレジンジレッド)の
2つの色を選ぶこともできます。
表示ではwebカラー名とRGB設定、MSXの色指定になります。
また、
webカラー名がわからなくても139色の色を選ぶことができます。
今まではRGBの3つの要素を数値で設定する必要がありますが、
この方法を使えばラクに思った色を使うことができそうです。

[ダウンロード:web-col.bas]

■音色コードをネーム化

FM音源は楽器と音のニュアンスが微妙なところがあります。
そこで、音色と音色名を使うことで、
慣れないユーザーのためにそれらしく聞こえるようにします。
私も正直なところ音色で迷ったりします。

Instrument(インストゥルメント) = 音色名
Instrument part 1= Clarinet

音色名はMSX-MUSICの略号にします。
サンプルでは64種類のうち主要の20種類を
音色名を選び、enterキーでテストできます。
ESCで終了です。

[ダウンロード:fmmus-s.bas]

-*-*-*-*-
このほか
SCREENの詳細設定など多くのコードがあります。

■入力はケータイ入力かジョイパッド入力か?

現在では推測変換、オートコンプリートなど入力補助機能があります。
QWERT配列のキーボードは
英文タイプライタからある古い歴史があります。
この昔のハードウェアであるキーボードはやめませんか?
もうプログラムにはキーボードが不要でもいい時期と思います。
というのは昔のケータイはアドレス帳を使っていました。
ところが、今のケータイは発着信履歴が99件までを使っています。
ですから履歴とかで十分ではないかと思いました。
MSX TOP STYLEは
ケータイ入力の9つのキーでします。
キーボードは刻印がなければタダの黒い109のボタンです。
このボタンを全て使いこなす事もないです。インターフェイスですからね。
そう思えばもっとラクに入力できる方法がないか考えてしまうわけです。
もう1つはMSX2はテンキーがオプションですから
ジョイパッド入力の4つのキーで
カーソル左右は行移動で上下キーで文字を選択します。
Enterキー(Aボタン)は決定、ESCキー(Bボタン)はメニューキーにします。
この操作も評価版で近日公開します。
そこがMSXユーザーでしょうかね。


ダウンロードセンター:
http://www.geocities.jp/fullmsx2/u-yan/download.html

■オープンモード4(OpenMode4)

1: GRP
2: INP
3: OUT
4: INP/OUT

MSXBASICのMAXFILESを4にして
ファイルの入出力などを拡張する方法。
これはN88BASIC系のHowmanyfilesと同じような
ことで15までの数値を指定することができる。
例えばファイルの読み書きで
開いて閉じる操作を開きながら閉じる
LoadingSaveが可能となり、
大きなファイルの一部書き換えが可能となる
また、メモリに入りきれないファイルは
編集範囲を自動分割することで
編集が可能となる。
この場合は全モードがアクティブになる。
今までは不可能だった、
辞書ファイルなどの膨大なファイルから
新たに辞書を作ることができるようになる。
次世代向けに同時に10オープンまでしてみたが、
PRINT#15というふうに指定はできそうだ。
将来的にはもっとモードを
増やせることがわかった。

■テキストエディタとラインエディタ

テキストエディタはケータイ入力を対応します。
テキストエディタは文書をつくるエディタで
文書は前に戻って修正したりします。
ですから、テキストエディタは前後に動く必要があります。
開始行を指定してカーソルで終了行を指定します。
コーピー&ペーストは古くはWZエディタから使われてきた90年代の比較的に新しい機能です。
現在のクリップボード機能に発展しています。

ラインエディタは入力して実行が終わったので、元に戻る必要はない
という考えです。
訂正をする場合は次のコマンドでやり直せるというわけです。
文字を送受信するネット端末はオンライン書き込み
といって改行すると送信されるので、
訂正をする場合は最初から受信して訂正行を指定しました。
BASICコンソールは行番号式の構文で構成されていますが、
同じ構文をコピーしたい場合は
コピーしたい構文の行番号を加えたい番号に上書きをします。
現在はテキストの上書きよりも挿入が多いのです
80年代当時としてはこの方法です。
現在のヒストリー機能に発展しています。

■スクリプトとプログラム

この段階ではシステム構成をコーティングする使い方で
まだ、仮のテストモードの操作方法です。

スクリプト入力ができるようにするには
次世代方式で記述しています。たとえば
I$(0)="RGBshadow = on"
というプログラムをASCファイルでアスキーセーブします。
SYSRGB.ASC
というファイルができたとします。
スクリプトから
SYSRGB_RGBshadow
と入力します。
そうするとSYSRGBファイルをロードして
RGBshadowが入っている行を表示します。
120 I$(0)="RGBshadow = off"
と書き換えることができるようにします。

■変数を変える

MSXBASIC変数2文字の制約を文字列化させる新しい方法です。
この方法には一例があって、
以前カスタマイズファイルというものがありました。
実行ファイルとは別に例えば「表示する記事数」とあって
次の行が$def = 7というふうに
ユーザーが書き換えることができるファイルのことでしたが、
わざわざ、カスタマ実行させるよりプログラム行の初期部分に
配列変数に文字列を加えていけば見やすいし、
カスタマイズできるのが発端でした。
ローカル変数とグローバル変数がカブる問題がありました。
変数がカブるというのはA=3とB=4という数値ならば、
使用中にB=13などと数値が入ってしまい、
「A=3とB=4も使いたいけどB=13も欲しい。」という状態です。
その場合はB=13をC=13と別の変数へ回避させるか
B=4をB0=B4と回避させる方法になります。
それでもSXがStartXの略で
EXがEndXの略というふうに使い分けましたが
最近では変数が多くなってX1,X2,X3というふうに
何のX変数かわからなくなってしまいます。
そこでポインタを設けることで
グローバル変数を文字列とする格納方法が考案されました。
またプログラム用途によって変数名が変わるので、
Mouse_PointerFlug=1
というふうにとりあえず、格納できるようになりました。

■配列を使って変数をわかりやすく

もちろん、これはBASIC言語でしたら
MSXBASICに類似するBASICでも実行はできるかもしれません。
I$(2)="SCORE = 45"というように、文字列を番号で管理して、
用途をわかりやすくする方法を研究しています。
またはこういう場合があります。
従来のC変数をカラーコードの変数に使って
C=10の色番号を新しい色番号と加える場合はC2=4などとします。
これも
I$(3)="Current Color = 10"
I$(4)="New Color = 4"
とします。
私は恥ずかしい程、英語は適当ですが、
=イコールより前であれば日本語でもかまいません。
I$(3)="底辺 = 13"
という書き方もできるでしょう。
また、この方式には次の利点があります。
FOR I=3 TO 4:PRINT I$(I):NEXT
を実行すると
Current Color = 3
New Color = 4
Ok
というふうに、変数リストなどを作ることができ、
さらにデバッグがラクになります。
ただ、I=I+1などとインクリメントする場合は
専用のプログラムになってカンタンにいきませんが、
E−TOUCHの初期設定に一部試験的に行っています。

■文字列から識別子=を調べる

Current Color = 3

このような文字列があるとします。
まず、INSTR(I$(3),"=")
これでイコールの場所がわかります。
これ以降を変数、文字列として処理します。
RIGHT$という命令でいけば3という文字列が入ります。
これをVALすればよいです。
数値はこれで終わりです。

■文字列をコード化する

Current Color = TestColor#1

このような場合ですね。
まず、TestColor#1が文字列に入っています。
これを単にIFで分岐させます。

IF I$="TestColor#1" THEN R=7:G=7:B=0:RETURN

これでよいですね。
今までコードになっていたものを文字列として使います。
予定しているのはwebカラーとFM音源の楽器名です。

BoxColor3 = Red
Instrument  = Piano



■コメント

Current Color = 7 ;3


セミコロンにしようかと思っています。
このように;はコメントというふうにして
この場合の3は初期(デフォルト)の数にしておき
数値を変更した場合でも書き直せるようにします。

■初期設定で制作中のモジュールへジャンプ

10 I$="VAL A":GOSUB 100
100 IF I$="VAL A"THEN 340
340 A=VAL(A$):RETURN

このようにラベルの代用として使うことができます。
ラベルを判別する手間が1プロセスかかりますが、
プログラミングする時にI$="<ラベル>":GOSUB100
というふうに100行を固定することができます。
行番号を覚えておく必要がなくなります。
サブルーチンを書き換えたら、
100行から340行へ飛ぶ、この部分だけでよいです。
この方式を採用することで
I$="ESC cancel":GOSUB100というふうに
BASICでも構造化を楽しむことができるでしょう。

■なぜFORI=0TO1?

ようするにプログラムはループさせればよいです。
今までは1,2,3,4,5と数字を変化させたり、
2,4,6,8とSTEP2と指定しました。
次世代MSXBASICではその他のループも
有効にします。
代用策としてL=L+1、L=L+2などとします。
また7がS=7でなければループというふうにもできます。
I=-(S=7)をFOR文の中に入れればよいです。

Loop Set (S=7)

このような感じにしようかと思いますが、
今のところは実用化していません。

■高速モードの新設 2010/06/01追加

MSXBASICは多様性がありますが、
処理は遅いという欠点があります。
MSXBASICとマシン語は速さが違います。
そこで、同じような処理を数十回繰り返す
場合にはマシン語の方が速いと思われます。

■GOSUB命令を多様化

またGOSUBなどの1サブルーチンを廃止して、
I$="jump Colorcheck"などとします。
リターンしたい場合はI$="jump colorcheck/r"とします。
処理の途中でR変数に1が入って
RETURNへ行くようにしますって、おいおい。
MSXBASICは最大3ネストなので、
多重ネストの構造化BASICには向いていませんが、
ルートラベルを定義して
ラベルごとに分岐させてみるプログラムを考えています。
要するにcolorchek(仮称)は分岐先の仮想ラベルではなく、
そのラベルの場合の処理をさせる意味にします。
MSXガジェットプロジェクト2009に一部試験的に行っています。
その他としてはI$="jump chock_adjust_min"とか
I$="jump clock_erase_screen"とか考えています。
あとはFOR〜NEXTでNEXTでFORに戻る特性を利用して
ループ、リターンの応用も思考しています。

■配列変数からテキストファイルへ

このように配列変数を行番号として記述します。

10 I$(1)="Color 7  = Orange"
20 I$(2)="Line(0,0)-(16,7),7,Boxfull"

このままでは間に命令を加えると番号をつけなおすことになります。
そこでテキストファイルに記述することができれば

color 7 = Orange
'Screen set
Line(0,0)-(16,7),Boxfull

このように注釈を加えることもできます。
読み出しはLINEINPUT#で読み込めば今までのとおりにできます。

■if命令

if命令にしますと
IF SC<HS THEN
これを次世代風にすれば
if Score < High_score THEN
となります。
やはり短い方がよいですね。

■コールイン/コールアウト

CUIに慣れない人向けにGUIで簡単な操作を可能にします。
内部API呼び出しと外部API呼び出しを入れようかも思っていますが、
処理が遅いのでインクルードした
どちらかといえば内部API呼び出しの実現の可能性の方があります。

例えば画像変換ソフトを作る場合

画像のSC5ファイルのみを表示

カスタム化したアイコン風表示ファイラーのプログラムで
ファイル読み込み

ファイルを決定したら画像変換をする

■THRU(スルー)命令

プログラムのマージによってグローバル変数の競合による
不具合を解決するためにTHRUは一時待避させるコマンドです。
thru_in #034:3,4,45
thru_out #034
#は格納番号です。
例えば画面矩形範囲 X1,Y1.X2,Y2などパラメータでなどの
特記する必要のない変数などが対象です。
ここでは変数Lを変数を変えて回避できない場合に
通し番号によって回避するものです。
一見複雑そうなことですが、
変数を変えたりする大幅な改良が必要ないので便利でしょう。
thru命令はプログラム開発者が
ローカルかグローバル変数かを判断するので上級者向けです。
マシン語ではPUSH,POP操作に近い感じの命令でしょう。

■メモリに変数を使えるエリア(ワークエリア)を作る


次世代MSXBASICの基本アドレス

この図はC000Hから256文字でC100Hになるということを示している。
これで上位アドレスC0、C1、C2と変えるだけで管理できる。
マシン語でもBASICでも使いやすく考慮したもので、
高速でロードしたい時に便利ではないかなと思う。
使い方は上位アドレスで大まかに区切る。
さらに下位アドレスでたとえば
最小で16バイトを16ブロックで区切るように使うやり方にしたい。

addres = D37EH : data length = 10
というふうに変数をメモリに保存させることも考えます。
マシン語ではDS(データストレージ)命令、
C言語ではポインタの宣言と呼びますが、

この方法は有用かもしれません。
アセンブラではマシン語に変換してから逆アセンブラで
アドレスから調べるということになりますから、
直接データを操作できればMSXBASICからマシン語に
プログラミングを変えることもできます。

これにより、別のプログラムから読み込むこともできます。

C言語で言うポインタ概念というんか、
例えば10文字以内の配列の格納型式をI$で3つ作る場合は
I$(0),I$(1),I$(2)となります。
開始アドレスを0からすると9までがI$(0)の格納領域になります。
*I$(0)ならば0、*I$(1)ならば10、*I$(2)ならば20というふうに
10進表現になってしまいましたが、そういうふうにします。
*(アスタリスク)をアドレスにすれば使いやすいです。

BASICでは設定したメモリまたはVRAMから変数エリアへ、
設定した変数エリアからメモリへコピーをユーザーが設定するようにします。
*I$(3)=SETADR(addres = D37EH : data_length = 10)
SETADR(addres = D37EH : data_length = 10)=*I$(3)
アセンブラではDBなどをラベルとして定義して
データ開始アドレス(ポインタ)を求めます。


■キャッシュを作る

計算、検索など時間がかかる履歴結果をキャッシュとして保存してみます。
*1次が5バイト(高速処理向け)、2次が10バイト(使用頻度が高いもの)の例
 例えば1を入れるとA、2を入れるとBとなるプログラムで
1次のキャッシュのメモリがABCDEとする。

3を入力するとCが出ると

1次のキャッシュの順番は
CABCDでEは2次の10バイトキャッシュに入るが、
EFGHIJKLMN
と1バイトで表現するとこんな感じです。
書きっぱなしでアドレスのキャッシュポインタを移動するようにしたい。
処理が終わってガベージコレクションさせる方式がいいかもしれない。
単純なプログラムですが、何か使えないかなと思います。

■キャッシュの格納形式

まだ決まっていませんが、
たとえば、10+10が送り値として20が返ってくるキャッシュとすると
10+10の数式の検索をすることになります。
そこで00H〜FFHキャッシュコードと、データ長をつくります。
具体的には3EHを1.41421356などと格納すれば
SQR関数を使う必要がなくなります。
なお、キャッシュ操作についてはユーザー独自に行う必要があります。
この数値はキャッシュするかしないかなどを判断します。
キャッシュというのは先進の技術ではなく一般的な技術で
現在のような大規模なものではなかったようです。
マシン語でステートが大きくかかる処理の場合は
数値を一旦ストレージさせて、キャッシュ化させます。
毎回の動作で同じ結果のものはこのようにして
処理の軽減を行っていたようです。

■プログラムは表示が変わればいい

このように実際の結果データをキャッシュとして蓄積することで
大きな時間短縮につながります。
プログラムは1回ロードしてラインを引いても、
数回ロードしてラインを引いても結果が同じであれば
なんでもよいのです。
現在の実験では複雑な画面を設定後にキャプチャして
キャッシュのように使う方法があります。

細分化が進めばおもしろい事ができるかもしれません。

■新命令をつくる?

いつも同じようなプログラムでいつも似たような事…
1つずつ打っていくよりもショートカットで
全命令をウイザード化してみるのも案。
んーどうするか、考えています。
このページは日々更新する予定です。

■最後に

確か1chipMSXにRAMDISKに載る程度で作って
SDカードはHDDに比べて高信頼性はないのでバックアップをPCでとるとか
最初はファイル周りの改善でしょうかね。うーん。