ここから本文です
ブログを始めました・・・
1)C言語側(win、Linux)に保存するデータにヘッダを付加する件
製作13で予定してると言ったBASICソフトの試験はあまりしてません。
データにヘッダを付加する作業と同時進行で行うように予定変更します。
とにかくヘッダに続く残りのデータを然る可きアドレスに展開する仕組みは
実装したいです。自分も便利と考えるからですが、ただ実装は難儀してます。
FM-7にアプリ(データ)を展開するため第一段階として、製作10で公開した
ローダーを使って固定アドレス(現在テキストバッファ等を予定してます)に
ヘッダを展開しヘッダ情報を参照して、第二段階としてアドレス非固定の、
アプリ(データ)を然る可きアドレスに展開することを目指しています。

その際、読み書き用としてメモリ上に常駐するルーチン(含むローダー)を
128バイト以内に収めたいと考えてます。理由は共有RAMに隣接する$FC00から
$FC80間のRAMで使いたいからです。現時点でポジション・インディベンドに
なってますが上記のRAM上で使えば$8000まで使用するカセットアプリで便利に
使えるのでは考えてます。しかしながら製作10で公開したローダーはワーク
エリアを含めると既に96バイト使ってますので残りは32バイトしかありません。
受信バッファの状態監視用の1ビット分を受信データ用の74LS244の1端子に
振り分けたことが大きく影響してます。ハードを簡単にした影響でコード量が
増える結果になりました。ただ1ビットのために74LS244の増設もどうかなと。

と言うことで各々の思いが交差して現状はメモリ不足で行き詰まってます。
基板に対応するソフトを作っていくと機能的な欲が少しづつ出てきますし。
融通が利くように実装しようとするとソフト的な難易度が上がって来ます。
ただし納期等の期限はないので深刻に悩んでる訳ではありません。ただ単に
試行錯誤してるだけです。凡その仕様は固まってますから早晩、形になって
行くと楽観してます。ただ洗練した状態にすることは期待しないで下さい。
win、Linux側で最終的な手直しが必要になる可能性が濃厚です。
因みに、それなりに動作するコードの仕上りは年内を目処にしてます。

2)改訂版ハードとソフトにおける速度について
FM-7のデータ受信で多少遅くなると言ってましけど正確ではありません。
1バイトを合成するため2回受信しビット操作等もあるので実質コードが
倍になってます、正確な計算はしませんが倍の時間かかります。ただし
送信はバッファの状態監視をしてませんので、速くなってるハズです。

3)余談的になりますが、このソフトのI/OとFM-7のPSG基板を多少手直し
するとFM-8で動作する同様なツールを7のPSG基板で製作できると思います。
根拠はこのハードのプロトタイプがFM-7のPSG基板だったからです。
ただFT245RLを装着する時のピン変換用に更に小基板が必要になりますし
74LS74からFT245RLへ出す指令のために空中配線も必要になります。
(そこまでするなら多少の手直しではない、と言う意見も出そうですけど)

4)数少ない読者に対し御礼
ブログだと予定や願望も含めて、その時点の到達した事項を公開することが
多いです。ですので意図的ではないですけど情報の小出し的な感じになります。
特に自分は訂正も多いです。それにも関わらず読んでくれてる方に感謝します。
ただFT245RLを使ったデータ転送の例で自分が知る限りコードまで公開してる
例は1名を除き他にありませんので引き続き辛抱強くと願うばかりです。尤も
他に例があってもアセンブラは6809しか知らないので自分には理解できません。

5)今後の予定・展開
今回のFM-7用FT245RLモジュールに対応するソフトで片がつけば、この基板と
組み合わせてファミコン用のディスクシステムを読み書きするツールの紹介を
考えてます。回路図、基板(ハード)は30年以上前からあります。念の為、
補足すると自分が設計した回路ではありません。某雑誌で公開された記事・
回路図を元に当時はハードが判りませんでしたのでハードを共同製作しました。
読み書きが遅いのでソフトに焦点を絞って改修を考えてます。数ヵ月間は
かかると考えてます。当然早くできれば良いなとも考えてはいます。
なお配線図は時期を見て公開します。FM-7とディスクシステムのコラボに
なりますのでFM-7を所有していればディスクシステムのゲームを解析する時
には有効ではないかと考えてます。データを素早く容易に現在使用のPCに
保存できるようにしたいと考えてます。

それではまた。

この記事に

開くトラックバック(0)

1)恒例になってしまった訂正からです。
以前のC言語ソースでは、パソコンに保存されているデータ長を切り上げて
64バイトの倍数として送る仕様でした。(実際は128バイトの倍数ですけど)
保存されているデータ長が64バイトの倍数とは限らないので切り上げた分は
データとしてはゴミです。FM-7と通信するPCからの送信データ長と同じ
データ長をFM-7が受信するために下に示す手直しをお願いします。
修正部分は do {    } while(FT245RL_BROCK == len) の中にあり
「20181011 修正」となってる部分です。整合性を保つために同時にFM-7側の
リミッタの確認もお願いします。

       do {
              len = fread(buf,1,FT245RL_BROCK,file);
          printf("fread %0d\n",len);  
            for(i = 0; i <FT245RL_BROCK; i++) {
                send_buf[2*i+1] = buf[i];      //     下位7ビットはそのままコピー
                send_buf[2*i] = buf[i] >> 1;   //     上位7ビットは1ビット右シフトしコピー
          }

            // write(fd, send_buf, FT245RL_BROCK*2); 20181011 修正
             write(fd, send_buf, len*2);
    
        } while(FT245RL_BROCK == len);

2)初期状態では $FDFE = FF になってるハズだと言う件について
このFT245RLを使ったFM-7用のモジュールは電源供給をFM-7側にしてますが
FM-7に電源を入れた直後には(FM-7から見た)受信バッファにゴミデータが
入るようです。しかしFM-7と通信しますので当然、その後にC言語で実装した
ソフトも起動します。この時に受信(送信も?)バッファのゴミはクリアされる
ようです。確認はLinuxで行いましたがWinで使う時にもバッファのゴミはクリア
されてると認識してます。根拠はwinで使ってる方から「ゴミが入っています」と
指摘を受けてないからです。と言うことでFM-7に電源を入れた後にWin、Linux
のアプリを起動した状態を初期状態と定義すれば、$FDFE = FF になってます。
この状況は何回も見てますが現在の自分の使い方がLinux側のソフトを起動した
直後に続けてFM-7にデータを送っていますので $FDFE = 7F の状況でした。
大事なことなので繰り返すと(FM-7の)電源投入直後はバッファにゴミデータが
入りますが続けてWin、Linuxの通信ソフトを起動すればソフト的にバッファの
ゴミはクリアされると言うことです。

更に思い出したことは、誤動作を回避するため一回は電源供給をFM-7側にして
失敗したと報告しましが、電源のみでなくハード的にリセットするため説明書を
見てゴチャゴチャ配線してました。ハード的にリセットするためにゴチャゴチャ
配線したことが失敗の原因だった可能性が濃厚です。ただしFM-7の電源の状況は
個々で違いますので影響ないとは言いませんが現状は順調に動作してます。

3)Linux側プログラムの中止は「Ctrl C」と端末からタイプして下さい。
30年前に覚えたことで当たり前的な感じで省いてました。因みに「fflush」は、
あの位置になければFM-7から送信したデータで2Kバイトほど取り零しが生じます。
fopen関連はバッファがあるので当然と言えば当然です。
と言いながら、取り零してた時もありましたので要確認「fflush」だなと・・・

更に続けて書くことがありますが今回はこの辺で、それではまた。

この記事に

開くトラックバック(0)

三度ここまでを振り返るとともに願望を込めて予定を書きます。

その前に恒例になってしまった修正です。
1)昨日の追加でコンパイルすると send_buf は未定義で
エラーになります。buf[512] なので下のように倍の数値で
定義して下さい。unsigned char send_buf[1024];
他にも未定義でエラーが出てたら定義して下さい。

2)下も微妙です。初期状態では $FDFE = FF のハズだけど・・・
>FM-7のモニタで送信の前後に$FDFEを確認すれば変化があります。
取り敢えず自分には支障はないですけど原因も調べねば・・・

次に「使い方」について説明します。してたかな、とフト思いました。
使う前にハードとソフトを用意しなければならないので、そこだけに
没頭してた傾向があます。念の為、遅蒔きながら書きます。
1)基板に実装した後はFM-7の32ピンに装着しUSBをコードを
FT245RLとパソコンのUSB端子に接続して下さい。
2)FM-7の電源を入れてFM-7用のプログラムをロードして下さい。
この時点でパソコン(win, linux)は起動させておいてください。
3)FM-7用、パソコン用のプログラムを順に起動する。

最後に本題ですけど現状は取り敢えず最低限、必要な読み書き
ルーチンは用意したので、これを土台に下記を目指してます。

1)現在マシン語も含めアスキー、バイナリデータの
読み書きができています。なおBASICソフトでの読み書きも
できるようになりましたが耐久的な試験がまだ足りません。
なお、アスキー形式ならシフトや合成をせず最上位ビットを
マスクして通信用でRS-232の如く使ってる方もいます。
むしろ、かってのシリアル通信の方式ですので、この使い方が
第一義の使い方で自分の使い方は副産物的かなと。

2)C言語側(win、Linux)に保存するデータにヘッダを
設定しFM-7にデータを送信した時に、ヘッダ情報に基き
残りのデータ部分を然る可きアドレスに展開する仕組み。

3)あくまで手が回ればの話しですが拡張BASICとして
ロード、セーブもできればと考えます。昔、似た使い方で
FM-7用ではない補助記憶装置をFM-7用にした時はバブル
命令を拝借しました。ある雑誌に投稿し採用されれば資料と
して残っていた可能性がありますが不採用のため紛失しました。
補助記憶装置でなくても既に用意されるバブル命令を借用する
ソフトをよく見かけた記憶があります。

次回はBASICソフトの読み書きの堅牢性を確認して報告します。
早くヘッダ付きのデータの読み書きができるようにしたいです。

ではまた。

この記事に

開くトラックバック(0)

C言語側からの送信プログラムです。

1)昨日、変更したC言語のソースの然るべき部分に下のステップを追加
#include <string.h>

2)昨日、変更・追加したソースのすぐ上に下記のコードを挿入する。
昨日の書き込み(保存データ)が正常にHDD等に記録されていれば
コマンドラインから「実行ファイル名 EXMON」でタイプすれば
FM-7へデータを送信します。FM-7での保存は適切なアドレスへ。
FM-7のモニタで送信の前後に$FDFEを確認すれば変化があります。

   printf("%s\n",argv[0]);
     // 20180917
    if((2 == argc) && (0 == strcmp("EXMON", argv[1]))){  
        file = fopen("sirial_20180925.dat","rb");
        if (NULL == file){
         close(fd);  
           printf("fopen error\n");
           return -2;
         }
     
        printf("FM-7_sirial_20180925.dat TRANSFER\n");  
        fseek(file,0,SEEK_SET);
        do {
              len = fread(buf,1,FT245RL_BROCK,file);
          printf("fread %0d\n",len);  
            for(i = 0; i <FT245RL_BROCK; i++) {
                send_buf[2*i+1] = buf[i];      //     下位7ビットはそのままコピー
                send_buf[2*i] = buf[i] >> 1;   //     上位7ビットは1ビット右シフトしコピー
          }

             write(fd, send_buf, FT245RL_BROCK*2);
    
        } while(FT245RL_BROCK == len);

        fclose (file);

    printf("FM-7_sirial_20180925.dat\n");
    }      
   // 20180917

この記事に

開くトラックバック(0)

C言語で参考にしたコードをそのまま引用することはできないので
下を参考に変更して利用して下さい。(Linuxでの動作確認済み)
FM-7から送って来たデータの保存(書き込み)プログラムです。
"sirial_20180925.dat" のファイル名で保存されます。

# dmesg に付いては下を参照して下さい。
(何故 "/dev/ttyUSB0" に変更するかが理解できます)
http://penguin.tantin.jp/hard/FT245.html

Linux側は端末(ターミナル)から管理者モードで実行する。
下のようにコマンドライン上でコンパイルして下さい。
 /usr/bin/gcc ./sirial_transfer2018V2.c -o ./sirial_transfer2018V2

<参考にしたコード>
Linuxでシリアル通信のプログラム(C言語)を書く
http://mcommit.hatenadiary.com/entry/2017/07/09/210840
Raspberry pi で動かしてみたコード(Raspberry piでなくてもLinuxなら動作可)

1)変更
// #define SERIAL_PORT "/dev/serial0"
#define SERIAL_PORT "/dev/ttyUSB0"

2)追加
#define FT245RL_BROCK 64
#define STORE_DATA
(この前に //  付けてコンパイルすれば端末にデータが表示されるだけ)

その他、このままコンパイルするとエラーが出ますの下も追加
    FILE *file;
    int i;

更に未定義とエラーが出てたら定義して下さい。

3)コードの修正
<参考にしたコード>で     while(1) { } を下記に変更して下さい

#ifdef STORE_DATA
    file = fopen( "sirial_20180925.dat", "wb" );
      if (NULL == file){
         close(fd); 
           printf("fopen error\n");
           return -4;
         }
 
#endif

    for(;;) { 
      len = read(fd, buf, FT245RL_BROCK);
        if (0 < len) {
#ifdef  STORE_DATA
          fwrite(buf,1,len,file);
            fflush(file);
#endif                      
            for(i = 0; i < len; i++) {
                printf("%02X", buf[i]);
            // fprintf(file,"%02X",buf[i]);        
               }

         printf("\n");

          }

      }

#ifdef  STORE_DATA
   fclose(file);
#endif

この記事に

開くトラックバック(0)

[ すべて表示 ]

本文はここまでですこのページの先頭へ
みんなの更新記事