2018年9月15日土曜日

FLEX9にコマンド履歴機能を追加

FLEX9にコマンド履歴(ヒストリー)機能を追加しました


FLEXは単純なOSの割には言語やユーティリティも充実していて使いやすいと思っていますが、もちろん不満も色々あります。
その一つがコマンドヒストリー機能がないことです。プログラムを作成する中で、何度も同じようなコマンドの入力を繰り返すのは苦痛でもあります。特にアセンブラの場合は繰り返し頻度が特に高いので、ストレスが溜まります。

繰り返し入力を少しでも軽減するために、アセンブラやMicroCによるプログラム開発の場合に使うMAKEA.CMDやMAKEC.CMDを作成して使用しています。


MAKEA.CMDの使用例



MAKEC.CMDの使用例

いずれもシステム(ASMB.CMD, MC09.CMDなど)がドライブ0に、対象ファイルがドライブ1にあると決め打ちしていますが、それなりに役に立ちます。
参考までに、それぞれのメイクファイル(MKFILEA.TXT, MKFILEC.TXT)の内容を下に示します。&1や&の位置に、対象ファイル名が読み込まれて実行されます。


メイクファイルの中身

しかし、このような特定の場合以外ではどうしてもヒストリー機能が必要です。

FLEXのコマンド入力をフックしてヒストリー機能を実現する


FLEXのソースを読むと、$CE2Bからがコマンド入力ルーチンなのですが、バックスペース(BS)位しか編集機能がありません。そこで、ここをフックして自作のコマンド入力ルーチンに置き換えます。
自作の入力ルーチンの置き場所ですが、$CC2B,2CのMemory Endの値を入力ルーチンのサイズの分だけ小さくしてシステムに使われない領域を作り、そこに置きます。
このようにして作成したのがSET_LIN.CMDです。


SET_LIN.CMDを常駐させる

コマンド入力待ちの状態でSET_LINと入力すると常駐し、もう一度SET_LINと入力すると常駐が解除されます。
編集機能としては、
 Ctrl-A  ヒストリー呼び出し。(履歴機能)
      コマンド入力途中では、その位置以降を呼び出す。(補完機能)
 Ctrl-E  カーソル位置以降を消去。
 ↑    コマンド文字列の先頭にジャンプ。
 ↓    コマンド文字列の最後尾にジャンプ。
 ←    一文字左に移動。
 →    一文字右に移動。
 BS    カーソル位置の左の一文字を削除。
 DEL   カーソル位置の一文字を削除。
 CR    編集終了。入力文字列をコマンドとして処理する。
があります。
直前のコマンドしか呼び出せないなど、ヒストリー機能としてはWindowsに慣れている私たちから見ると不十分ですが、これでも随分とストレスが軽減されます。

制作に関して


実は、FM77AV40SXでFLEX9やOS-9Level2を使っていた頃に、OS-9のヒストリー機能をFLEXでも実現すべく簡単なSET_LIN.CMDを作成して使用していました。(上記の機能のCtrl-Aの補完機能や↑,↓機能のないもの)
これでもOS-9の超単純なヒストリー機能よりも使いやすいものでした。
FM77のBIOSやSubSystemを用いて機能を実現したため、当然、矢印キーが使えましたので、今回制作するにあたっても、是非矢印キーによる処理を実現したかったのですが、ここで最も苦労しました。

TeraTermでの画面制御にエスケープシーケンスを用いているのですが、矢印キーを扱おうとすると$1B,$5B,$41(↑キー)のような3文字を扱うことになります。また、テンキー部のキーも全て3文字となるので、その扱いもプログラムで処理しなければなりませんでした。(矢印キーのみ3文字扱いでも仕方がないとして、その他は単純に1文字扱いできないものでしょうか?)
プログラムサイズもFM77での430バイト程度に対して、BIOSやSubSystemの編集機能もプログラムで実現しなければならないため1Kバイト位と倍以上になってしまいました。

もうしばらく使い続けて不具合がないことを確認してから公開する予定です。


0 件のコメント:

コメントを投稿