/msxterm

CUI terminal software for MSX0.

Primary LanguageRust

msxterm ver.0.4.0 (2023/10/29)

Release 0.4.0

  • MSX0製品版対応 (0.4以前は「MSX0 試作機用」となります)
  • 製品版仕様変更に伴う 文字コード変更
  • Kanji Basic 対応 (#kanji_off / #kanji_on)
  • MSX ASCII コード / ShiftJIS コード 切り替え
  • エディタモードに vi モード追加
  • エディタ切り替えコマンド追加 (#vi / #emacs)
  • シリアルポート確認コマンド追加 (--port)
  • 送信受信高速化に伴う #lowsend 廃止
  • 製品版仕様変更に伴う BASIC 一時停止機能廃止

msxterm とは

  • msxterm とは PC から MSX0 に対して wifi による「TCP/IP接続」、あるいは USBケーブルによる「シリアル接続」をするための専用ターミナルソフトです。 (ただし製品版の仕様変更箇所の調査中のため ver.0.4.0 ではシリアル接続は機能停止しています) CUI で主にプログラム作成に使用する事を想定しています。 BASICでプログラムを組む際に色々便利な機能を内蔵しています。
  • MSX0 の文字コードをフルにサポートして文字化けなどの問題が発生しないようにしています。

対応プラットフォーム

  • CUI のコマンドラインから起動するようになっており、Windows、mac, Linux に対応します。
  • Windows版、Mac版 のバイナリは Release ページからダウンロードしてください。
  • Linux の方は各自でビルドしてください。
  • 既知の問題としてWindows版の実行ファイルがウィルスと検知される場合があるようです。
    • #2
    • ツールの構造的にセキュリティーチェックには引っかかりやすい事になります。
    • セキュリティーを外してインストールするか、心配であればソースコードからビルドしてください。

バイナリからインストールする場合

  • zip を展開してパスの通った場所にコピーしてください。

ソースコードからインストールする場合

  • ビルドの際には rust のインストールが必要です。

  • rust がインストール済みであれば下記の方法でOKです。

> git clone https://github.com/akio-se/msxterm.git
> cd msxterm
> cargo install --path ./

起動方法

  • Mac、Linux の場合通常のシェルから実行します。
  • Windows の場合コマンドプロンプトあるいは powershell から実行してください。

wifi 接続の場合

引数として MSX0 の「IPアドレス:ポート番号」を指定して接続します。

> msxterm -f history.txt 192.168.100.2:2223
  • -f で「ヒストリファイル名」を指定します。
    • オプションを省略した場合、history.txt というファイル名になります。

シリアルポート接続の場合(現在機能停止中)

MSX0にUSBケーブルで接続する場合はシリアルデバイスの Path を指定する必要があります。 パスの指定方法は各OSプラットフォーム毎に違います。

パスの例

MAC
> msxterm /dev/tty.usbserial-569C0128081

Win
> msxterm com3

Linux
> msxterm /dev/ttyUSB1

シリアルデバイスは複数存在しうるためプログラム側からはどれが MSX0 に繋がっているか分かりません。 そこでパスを列挙するコマンドを用意しました。

> msxterm -p

これで表示されているUSBデバイスの中から目的のものを見つけてください。

文字の入力

  • 通常のプロンプトが出ている状態で文字を入力します。
  • Enter を押すと文字列がMSXに送信されます。
  • Enter を押すまではカーソルキーやコントロールキーで文字列が編集できます。
  • 送信された文字列はヒストリに記録されます。カーソルの上下で過去のヒストリを呼び出せます。
  • BASICであればこのヒストリで簡単にプログラムの修正ができます。

プログラムの流し込み

  • PC側のファイルをMSX0側にロードする機能があります。
  • テキストのコピペにも対応しています。
  • 複数行のテキストを貼り付けても一行ずつ分解されて MSX0 側に送られます。
  • その際にヒストリにも一行ずつ登録されます。

特に覚えておいてほしいキー

  • BASICのプログラムを停止するのは Ctrl-C となります。
  • BASICのプログラムの Pause/解除 は Ctrl-D となります。 (製品版仕様変更に伴いこの機能は廃止)
  • ターミナル側の画面のクリアは Ctrl-L です。
  • MSX側の画面のクリアは CLS 命令を使ってください。
  • Ctrl-R で目的の行を探すのが便利だと思います。

キーバインド詳細

デフォルトでは Emacs 相当のバインドになっています。

key action
Ctrl-A 行頭に戻る
Ctrl-B カーソル左
Ctrl-C Stop
Ctrl-D 一文字削除 / Pause
Ctrl-E 行末へ移動
Ctrl-F カーソル右
Ctrl-G 検索キャンセル
Ctrl-H BackSpace
Ctrl-I TAB
Ctrl-J 改行
Ctrl-K カーソル位置から行末まで削除
Ctrl-L 表示クリア
Ctrl-M 改行
Ctrl-N カーソル下
Ctrl-O
Ctrl-P カーソル上
Ctrl-Q
Ctrl-R インクリメンタル検索 後方
Ctrl-S インクリメンタル検索 前方
Ctrl-T 文字入れ替え
Ctrl-U カーソル位置手前を削除
Ctrl-V
Ctrl-W スペースで区切られた単語単位で削除
Ctrl-X-U Undo
Ctrl-Y ヤンクバッファからペースト
Ctrl-Z サスペンド (Linux)

vi command mode

vi タイプのキーバインドも使えるようにしました。

Key Action
$, End 行末までカーソル移動
. 最後のテキスト変更を Redo
; 最後の文字検索コマンドを Redo
, 最後の文字検索コマンドを反対方向に Redo
0, Home 行頭までカーソルを移動
^ 行の最初の非ブランク文字に移動する
a カーソルの後に挿入
A 行末に挿入
b 単語またはトークンを 1 つ左に移動
B 空白以外の単語を 1 つ左に移動する
c 移動コマンドのテキストを変更する
C テキストを行末まで変更する (c$ と同等)
d 移動コマンドのテキストを削除する
D, Ctrl-K 行末まで削除
e 現在の単語の末尾に移動する
E 現在の非空白単語の末尾に移動する
f 右方向 次の 'char' に移動する
F 左方向 直前の'char' に移動する
h, Ctrl-H 1 文字左に移動
l, Space 1 文字右に移動
Ctrl-L 表示クリア
i カーソルの前に挿入
I 行頭に挿入
+, j, Ctrl-N 履歴内のコマンドを 1 つ進める
-, k, Ctrl-P 履歴内のコマンドを 1 つ戻る
p ヤンクしたテキストをカーソル位置に挿入
P ヤンクされたテキストをカーソルの前に挿入する
r カーソルの下の 1 文字を置き換えます (コマンド モードを終了せずに)
s カーソルの下の文字を 1 文字削除し、入力モードに入る
S 現在の行を変更する (0c$ に相当)
t 右方向次の 'char' まで移動して、そこから 1 文字後方に移動
T 左方向 直前の 'char' まで移動して、そこから 1 文字前に移動
u Undo
w 単語またはトークンを 1 つ右に移動する
W 空白以外の単語を 1 つ右に移動する
x カーソルの下の 1 文字を削除する
X カーソルの前の文字を削除する
y 移動をバッファにヤンクする(コピー)

vi insert mode

Key Action
Ctrl-H, Backspace カーソルの前の文字を削除する
Ctrl-I, Tab 次の補完
Esc コマンドモードに切り替える

ターミナルコマンド

文字入力の先頭が # から始まる行は MSX0 側には送られずターミナル側のコマンドとして解釈されます。

quit

> #quit

msxterm を終了します。

hex

> #hex 40 6e 3c 0d
  • スペースで区切られた2桁の16進数を ASCIIコードとして MSX0 側へ送信します。
  • MSX0試作機のASCIIコードはかなり特殊なものとなっていました。
  • そのへんの検証用の機能と思ってください。

load

> #load ./hello_world.bas
  • PC側にあるテキストファイルのパスを指定します。
  • それを読み込んで MSX0 側に送信します。
  • 同時にターミナルのヒストリ、プログラムバッファにも登録されます。
  • 空白を含むパスを指定する場合はダブルクォートで囲ってください。
> #load "c:\my file name"

clear_history

  • ヒストリバッファの履歴を全て消去します。
> #clear_history

何も聞かずに消すので気をつけて実行して下さい。

dump_on

MSX0からの文字出力をダンプモードにします。

> #dump_on
  • MSX0側の出力のデバッグ用の機能だと思ってください。
  • 各文字のASCIIコードが16進数2桁で表示されます。

dump_off

MSX0からの文字出力をテキストモードへ戻します。

> #dump_off

kanji_on

MSX0側の BASIC は漢字モードがあります。

  • 通常モード中は MSX ASCII コード
  • 漢字モード中は Shift JIS コード

BASIC側で漢字モードにする場合下記のコマンドになります

CALL KANJI

BASIC側の文字コード変更に合わせてターミナル側も文字コードの切り替えが必要です。

> #kanji_on

これで Shift JIS に切り替わります。

ただしMSX0製品版にはバグがあります。MSX0 既知の問題の項目を参照。

kanji_off

MSX0側の BASIC で漢字モードから MSX ASCIIモードに戻す場合に使います。 まずBASIC側で通常モードに戻す場合下記のコマンドになります

CALL ANK

BASIC側の文字コード変更に合わせてターミナル側も文字コードの切り替えが必要です。

 > #kanji_off

これで MSX ASCII に切り替わります。

vi

エディタの挙動を vi モードに切り替えます。

> #vi

emacs

エディタの挙動を emacs モードに切り替えます。

> #emacs

プログラムバッファについて

ターミナル側にはヒストリバッファとは別にプログラムバッファが存在します。 行の先頭から行番号がついた文字列はプログラムとみなしてプログラムバッファに溜めます。ターミナル側にプログラムのバックアップがある状態と思ってください。

list

> #list

ターミナル側のプログラムバッファからlistを表示します。 引数で表示する範囲指定ができます。(MSXの仕様に倣って0~65530まで)

> #list 100-1000

100行目から1000行目まで表示します。

> #list -1000

先頭から 1000 行目まで表示。

> #list 1000-

1000行目から末尾まで

ターミナル側の #list とMSX0側の list で見分けがつくように、暫定対応として行番号に色をつけています。

save

> #save ./save_file.bas
  • ターミナル側のプログラムバッファに登録されている内容を保存します。
  • 空白を含むパスを指定する場合はダブルクォートで囲ってください。
  • MSX0 側の内容とズレている場合があります。
  • その場合、Reload で MSX0 側と同期をとります。(未実装)

new

#new

プログラムバッファの中を消去します。 特に何も聞かずに消すので注意して下さい。

廃止予定の機能

以下のコマンドは MSX0 のファーム更新により不要となった機能です。 互換性のためまだ機能としては存在しますが、いずれ無くなる予定です。

lowsend_on (廃止予定の機能)

小文字化送信モードをオンにします。 起動時はオフになっています。

> #lowsend_on

試作機のMSX0で BASICは基本的に大文字で入力をするのが普通なのですが、それを MSX0 に送る際に小文字に変換してから送信します。 なぜそんな事をするかというと通信の高速化のためです。 試作機のMSX0では大文字を送信する際に小文字を送信するより2倍遅いという問題がありました。 最新のファームではこの問題が解消したため、機能自体が不要になりました。

lowsend_off (廃止予定の機能)

小文字化送信モードをオフにします。 起動時はオフになっています。

> #lowsend_off

小文字化送信で何かトラブルが起きた場合はこれでオフにしてください。

ここから先はまだ未実装のコマンド

reload_from (未実装)

> #reload_from
  • ターミナル側のプログラムバッファを破棄して MSX0側のプログラムを読み込みます。
  • list 命令で表示している内容を取り込む形になるので途中で Ctrl-C などで止めないようにしてください。

reload_to (未実装)

> #reload_to
  • MSX0側のプログラムをNEWしてターミナル側のプログラムバッファから読み込みます。
  • リロードの向きを間違って消さないように気をつけてください。

MSX0試作機の文字コードの問題について

MSX0試作機の初期ファームウェアでは MSX0側の受信処理は M5 Faces Keyboard からの入力処理が流用されていました。 その為かなり特殊な文字コードとなっていて構造上どうしても送れない文字がありました。 最新のファームウェアアップデートでこの問題が解消されました。送信できない文字などは無くなりました。 これに伴い、MSXTERM でも文字コードの変換処理を変更しました。 Ver 0.4 以降ではファームの古いMSX0試作機には対応しませんのでご注意下さい。

MSX0試作機の FacesKey コード表 MSX0 Key

MSX0製品版の問題について

MSX0試作機から製品版になるにあたり、修正されて良くなった部分もあれば悪くなった部分もあります。

  1. 文字出力が止まるバグがある
  2. BASICの一時停止などができなくなった

文字出力のバグ

ターミナルから入力した文字は問題なくMSX0に届くのですが、MSX0側の文字出力がターミナルへ帰ってこなくなる場合があります。MSX0とターミナル間の通信は保たれたままなので、MSX0のシステム側で何かバグが起きていると思われます。出力側が不安定になった事は退化と言わざるを得ません。これはターミナル側では対応できない部分となります。 発生条件はまちまちですが、私が気づいた所だと下記のパターンなどがあります。他にも気づいた点がありましたらご報告下さい。

MSX0側のスワイプで U0、U1 のインスタンスを切り替えたとき

大丈夫な場合とダメな場合があるように思います。

CALL KANJI などでモードを切り替えたとき

ASCII文字と漢字でMSXの内部処理が違っていて単純に漢字への対応もれかも知れませんが、ANK に戻しても出力が戻らないので困ってしまいます。

BASICの一時停止など

入力時の文字コードが「FacesKey Code」から「MSX ASCII」に変わったことにより、対応できなくなった機能となります。「FacesKey Code」による入力不可文字などのデメリットに比べればまぁ仕方ないかなと言える範囲かと思います。

文字コードの流れについて

MSXへの入力側

ver.0.4 以前の文字コードの流れ

msxterm(UTF-8) → (FacesKeybord Code) → MSX0 (MSX ASCII)

ver.0.4 以降の文字コードの流れ FacesKeyboard Code への変換が必要が無くなり、入力不可の文字なども無くなりました。

msxterm(UTF-8) → MSX0 (MSX ASCII)

半角かな の扱い

MSX ASCII コードでは「半角ひらがな」という特殊文字が入っています。 ターミナル側で全角ひらがな・カタカナを入力すると、MSX ASCIIのひらがな・カタカナになって届きます。ひらがな・カタカナ以外の全角文字は無視されます。

msxterm(UTF-8) → (全角かなを半角かな化) → MSX0 (MSX ASCII)

ver.0.4 からBASICの漢字モードに対応しました。 MSX0 側では下記のコマンドで漢字モードに切り替わります。

CALL kanji

ターミナル側でも #kanji_on とすると文字コードの変換方法が変わります。

msxterm (UTF-8) → (Shift JIS) → MSX0 (MSX SHIFT JIS)

#kanji_on の時は全角文字は全て ShiftJIS に変換されて届きます。

MSXからの出力側

MSX0 (MSX ASCII) → msxterm (UTF-8)

出力側は MSX ASCII コードが送られて来ています。 英数字などの範囲はそのままでも問題ありませんが、半角ひらがな、GRAPH文字などは通常のPCでは対応していない文字のため変換が必要です。

ひらがな、カタカナなどはターミナル側では半角ではなく全角で表示されるようになっています。MSX特有のGRAPH文字も全角で表示されるように対応しています。

#kanji_on の場合は全て ShiftJIS として変換処理します。

MSX0 (ShiftJIS) → msxterm (UTF-8)

リリース履歴

  • 0.1系 エディタなどの基本構造、Wifi TCP/IP接続の作成
  • 0.2系 文字コード関連の対応全般
  • 0.3系 USBケーブルでのシリアル接続に対応 (未公開)
  • 0.4系 製品版対応 MSX0 文字コード対応、漢字モード対応

ロードマップ

大まかな予定。

  • 0.5系 シリアル接続正式対応