FLEX上でのアスキーファイルのやり取りができるツールをリモート側で全て操作できるように、
改造中のこと・・・・
ファイル名を通信回線からラインバッファにセットしFCBに渡そうとしたところ、ファイル名を
うまく受け取ってくれません。
そこで、仕組みはそのままにINBUFFでキーボードからファイル名を入力してみると正常に動作します。
メモリ内容を直接確認してみると通信回線からラインバッファへのセットはうまくいっている様子。
どうやらファイル名をFCBに渡すためにGETFILを呼ぶ場合、ラインバッファポインタに先頭の文字位置を
渡さなければいけないようで、色々調べると原因が見えてきました。
ラインバッファポインタは2バイトあるようですが、メモリ内容を観察してみると
私のFM-7では上位バイトは$C0固定
下位バイトは$80を先頭にデリミタまでの文字数が入っているようです。
通信回線から入力したファイル名はラインバッファの先頭からセットしているので$80で渡してみると動作ok
なぜ$80なのか、上位は$C0固定なのか、色々不明ですがとりあえずやりたいことはできそうです。
恐らく次回も躓くのでちとメモ・・・
: LBSR SMENU2 LEAX LINBUF,PCR SENDLP1 LBSR SRIN ;get filename loop ($D=delimitter) CMPA #$1A LBEQ ABORT ;crtl-z fail LBSR SROUT ;echo back CMPA #$0D BEQ SEND0 STA ,X+ BRA SENDLP1 SEND0 LDA #$0D ;file name input complete detect STA ,X LDA #$80 ;line buffer pointer set LEAX LINBFX,PCR STA 1,X LEAX FCB,PCR ;file accesss LBSR GETFIL LBCS ERROR LDA #$1 ;ext=text set STA ,X LBSR SETEXT LBSR FMS LBNE ERROR :
とりあえず使えるものが完成
端末側からコマンドでアップロード、ダウンロード操作が可能なので使いやすくなったような気はするのですが、使ってみると不満も多い^^;;;
ラインバッファへのバックスペース処理やファイルエラー時の処理、ファイル一覧表示なども欲しいし・・・・
しかし優先順位としてはACIA対応かな^^;;;;
View Comments
yuyamaです。こんにちは。
ファイル名をラインバッファ(LINBUF $C080~$C0FF)の先頭からセットしているので、ラインバッファポインタ(LINBFX $CC14,15)にセットすべき値は$C080で良いはずです。
>私のFM-7では上位バイトは$C0固定
既定のLINBUFを使う限り$C080の上位バイトですから$C0となります。
>下位バイトは$80を先頭にデリミタまでの文字数が入っているようです。
INBUFFはLINBUFの先頭から入力していきます。その実行直後のLINBFXはキーボードから入力した文字列の先頭位置(つまり、次に処理すべき文字列の先頭アドレス)を示すので、LINBUFの先頭アドレスの下位バイトの$80になっているはずですが、デリミタのアドレス(文字数ではなく位置ですね)が入っているということは、その文字列(コマンド)がまだ処理中である状態でLINBFXを見ているのではないでしょうか。適当なプログラムを用意し、その先頭でLINBFXの値を出力させてみると、そのプログラム名のデリミタの位置を指しているはずです。
yuyamaさま
コメントありがとうございます(^^)
おかげさまで、FLEX用のアスキー転送ソフトも使いやすくなってきました。
これまではWindows側のターミナルソフトを専用にして転送していましたが、汎用の通信ソフトで昔のBBSのようにコマンドで操作したほうが便利かと色々変更しています。
ファイル名を外部から受け取る仕組みは簡単そうでしたが、手探りでFLEXを弄っているので疑問点ばかりです。
ラインバッファポインタはゼロ番地からのポインタだったんですね。ラインバッファの先頭($C80)からの値かと勘違いしておりました^^;;;
なぜ2バイトのあるのかと考えていたのですが、0番地からの位置ということでは上位は$C0は当然でした^^;;;;
FLEXの英文取説を少しずつ整理してみます^^