ラベル CP/M の投稿を表示しています。 すべての投稿を表示
ラベル CP/M の投稿を表示しています。 すべての投稿を表示

2024年1月27日土曜日

FT245高速通信カードを用いるファイル転送ソフトのCP/M版とOS-9版をアセンブラで書き直しました

 Cで書いたCP/M版とOS-9版が満足できなかったのでアセンブラで書き直しました

先に作成したC版はサイズが12KB程度と大きく、そのために起動時や動作にやや時間がかかっていました。

その点が不満でしたのでアセンブラで書き直すことにしました。プログラム全体の構造はC版と同じで良いので、Cの命令をひとつひとつアセンブラの命令に置き換えていきました。CP/Mでのアセンブラ開発も初めてでしたので、命令表と首っ引きでしたが勘違いも多く、変なところで手間を食ったりしました。

結果、CP/M版もOS-9版もC版では12KBほどだったサイズが2KB程度と小さくなり、起動はもちろんですが動作も多少ですが速くなりました。


OS-9メニュー画面


CP/Mメニュー画面


メニュー3,4のディレクトリ表示のために、CP/M版ではディレクトリ表示ルーチンを作成してサブルーチンとして組み込みましたが、残念ながらOS-9版では今のところ、コンパクトなディレクトリ表示ルーチンをアセンブラで作成できていませんので、メニュー3,4は動作しません。メニュー3,4が必要な場合はC版を使用することになります。(以前、仮想ドライブ構築ソフトOs9DrvWin.exeをCで作成したときに、ディレクトリ表示部にはかなり複雑な処理が必要でしたので、これをアセンブラで作成できるかどうかは分かりません。)

これでF-BASIC版、FLEX9版、CP/M版、OS-9版の全てがアセンブラで作成できましたので、ファイル転送ソフトslwinftの制作はこれで一区切りをつけようと思います。あとはこれらをツールとしてプログラム開発に生かしていくつもりです。

参考までに、私のプログラム開発の手順を図で示します。


プログラム開発の手順

これで一区切りとしますので、今までに制作したFM側のF-BASIC版、FLEX9版、CP/M版、OS-9版のslwinftとWindows側のslwinft245.exeをOneDriveに上げておきます。ディスクイメージ転送ソフトft245も同梱してあり、簡単な使い方の説明も付けてあります。


2024年1月13日土曜日

FT245高速通信カードを用いるファイル転送ソフトのCP/M版ができました

 これでようやく、F-BASIC版、FLEX9版、OS-9版、CP/M版の4種が揃いました。

最後のCP/M版ができたので、FM-7で動作する全てのDOS(?)用の版(F-BASIC版、FLEX9版、OS-9版、CP/M版)が揃ったことになります。


CP/M版の動作画面です。FM-7上の富士通版CP/M-80上で動作しています。


CP/M版slwinft

しかし残念ながら、メニュー3,4のディレクトリ表示は未実装です。BDS-Cで書いたのですが、標準関数のexec()などではビルトインコマンドのdirは動作しないのです。ということで、dirコマンドに相当するものを作成する必要がありますが、それには時間がかかりそうです。

また、現在のところ、FM77AV2に装着してあるZ80Hカード(IDATEN)上のCP/Mでは何故か正常に動作していません。(ソフトは正常に動作しているように見えるのですが、実際にはファイルが転送されないのです...)AV2でもF-BASIC版など他の版では正常に転送できていますので、ハードには問題はないと思うのですが、原因はまだ分かっていません。


蛇足ですが、純正のCP/M-80カードは大切に保管してあるので、普段は自作のカードを使用しています。


自作CP/M-80カード


完成度については、F-BASIC版>FLEX9版>OS-9版>CP/M版という感じで、特にCP/M版についてはBDS-Cを使うのは初めてということもあり、試行錯誤の連続でした。現在のところ、メニューの3,4は実行できませんし、動作速度もアセンブラで書いたF-BASIC版やFLEX9版より遅いようです。

しかし、今まではディスクイメージ全体を転送するソフトしかなく、2Dディスク一枚の転送に1分ほどの時間がかかっていたので、Windows上のエディタでプログラムソースを作成し、それを各DOSに転送してアセンブルやコンパイルするという手順の繰り返しが面倒でしたが、これらのファイル転送ソフトのおかげで大幅に時間が短縮できるようになりました。これらのソフトの開発中も、Windowsー>FM-7方向の転送部分をまず作成し、それを繰り返し使いながらソフト全体を仕上げていくことができました。(CP/Mに標準添付のエディタEDを流石に使う気にはなれないので、制作途中の手直しは全てWindows上のエディタで行うという開発スタイルです。)

完成度の低いOS-9版とCP/M版についてはこれからも改善していくことになると思いますが、とりあえず一段落したということにして作成した4種の版をまとめてOneDriveに上げておきます。CP/M版以外の版も細かい修正を重ねていますので、ここに上げたものが最新版となります。また、ディスクイメージ転送ソフトも含まれています。


2023年11月17日金曜日

PC-G850V用USB-シリアルケーブルの作成

 以前作成してあったPC-G850V用のUSB-シリアルケーブルを新たに作り直しました

いつも興味深い記事が連載されているskyriverさんのブログ「PICマイコンは面白い」で、以前、PC-G850Vを入手されたという記事を読み、そういえば昔、同僚が面白いと言っていたポケコンだなと思い出し、私も入手してみました。同時に、skyriverさんが作られたUSB-シリアルケーブルを見習って同様なケーブルを作って使用してきました。

それがこれです。


以前作成したケーブル


そのアダプタ部

74HC00をインバータとして使用して、TxD,RxD,RTS,CTSを反転してUSB-TTL変換ケーブルに接続しているだけです。

機能的にはこれで十分でしたので、skyriverさんの実践をそのまま後追いする形で楽しく遊んできましたが、流石にCP/Mを走らせるまではやってみるつもりはありませんでした。


ところが、skyriverさんが開発されたCP/Mも実行できる増設メモリボード(EborsyEEP)を見て、そのコンパクトさと実用性に感心してしまいBOOTHで購入させていただきました。
見つけたコネクタ
さらに純正の電源も入手したので、これで本格的に遊べると思っていたところに、偶然PC-G850のシリアル端子用のコネクタを入手することができました。(右画像)
これでしたら、ピンの両側にガイドが付いているので安定感があります。

ということで、これを使用してUSB-シリアルケーブルを作成しようと考えてネットで参考資料を探していたところ、「ポケコン用USB通信ケーブルを作ろう」というサイトに、変換ケーブルがFTDI社のチップを使用していればFT_PROGというユーティリティを用いてピンの極性を反転させることができると書かれてありました。

私のケーブルは以前紹介しましたように、格安で入手したものですので、FTDI社の純正チップではないだろうと思ったのですが、試してみたところFT_PROGで認識できて、無事に書き換えることができました。

書き換えたケーブルを用いることで、アダプタの機能としては単なるケーブルの6ピンとPC-G850Vの11ピンとの間を接続するだけで良いことになります。

作成したアダプタです。
裏面画像で分かりますように、単なるピン間を接続しているだけです。


アダプタ表面・裏面


FT_PROGで書き換えたケーブルと組み合わせます。


新USB-シリアルケーブル


最後に動作画面を載せておきます。
右端のシステムバスに装着してあるのが増設メモリボード(EborsyEEP)です。
CP/Mをセット済みですので、増設メモリを装着して電源を入れれば、モニタに移ってG100でCP/Mが起動します。

動作画面

最後に
貴重な情報や資料を公開してくださったskyriverさん他の方々に感謝いたします。



2023年7月5日水曜日

コンパイラ作成の試み その3 番外編 (Z80版8ビットコンパイラの入力)

 Z80版8ビットコンパイラ stellarを入力してみました




5月20日の「コンパイラ作成の試み その1「ハイクラスC言語」のリストを入力」で参考文献として紹介しました「Z80CPU対応 新言語作成の技法 (大貫広幸著 MIA社)」中に掲載されています、CP/M-80で動作するコンパイラ言語 stellarのアセンブルリストを入力してみました。

120ページ以上ありましたが、何とか入力してCP/M-80のMacro-80でアセンブルして実行形式を作成することができました。

作成したファイルは

・stellar.com  コンパイラ オブジェクトファイルを生成

・convobj.com 生成されたオブジェクトファイルをHEX形式に変換

の2つで、コンパイルの手順は 下に例を示しましたが、stellar.com でコンパイル、convobj.com でHEX形式に変換、save.comでディスクに保存した後に実行となります。


d>stellar mdump

Stellar compiler Rev 1.01 ( CP/M-80,MSX-DOS Version )
Copyright (c) 1984 H.Ohnuki / MIA

Program  name : mdump
Function name : getchr
Function name : putchr
Function name : putnl
Function name : putstr
Function name : puthex
Function name : puthex1
Function name : bdos

Program  04EF (0100-05EE)
Data     0047 (4000-4046)

**  End of compile,  No error(s)

d>convobj mdump

Stellar utility,  convert object ==> intel HEX
Rev 1.00  Copyright (c) 1984  H.Ohnuki / MIA

Program  name : mdump = 0100
Function name : getchr = 0482
Function name : putchr = 04A1
Function name : putnl = 04C4
Function name : putstr = 0511
Function name : puthex = 0549
Function name : puthex1 = 057A
Function name : bdos = 05B6
Constant name : _work = 4000
Constant name : _var = 4030
Constant name : _code = 0100
Constant name : ngetchr = 0001
Constant name : nputchr = 0002
Variable name : d = 4030
Variable name : i = 4031
Variable name : sttadr = 4032
Variable name : endadr = 4036
Variable name : sadr = 403A
Variable name : eadr = 403C
Variable name : ch = 403E
Data     name : msttadr = 020D
Data     name : mendadr = 0217
Data     name : header = 0221

End address   : 05EE
Program size  : 04EF  [ 5 Page ]

d>save 5 mdump.com
d>
d>mdump
sttadr= $1234
endadr= $1567

      +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  0123456789ABCDEF
1230: 55 E5 22 DD 55 CD E8 12 3E 32 2B CD 79 23 21 00  U.".U...>2+.y#!.
1240: 00 22 DF 55 3A 93 55 FE 7B 28 1F FE 9A C2 19 2A  .".U:.U.{(.....*
1250: CD 1A 25 CD C5 17 FE 7B C2 19 2A 2A 6D 55 22 DF  ..%....{..**mU".
1260: 55 CD E8 12 3E 32 2B CD 79 23 CD 50 15 2A DD 55  U...>2+.y#.P.*.U
1270: CD 48 22 2A DB 55 CD 48 22 21 F9 12 CD A5 22 2A  .H"*.U.H"!...."*
1280: 69 55 2B 2B 22 D9 55 CD 93 11 2A DF 55 7C B5 20  iU++".U...*.U|.
1290: 19 2A DB 55 3E 21 CD 79 23 3E 34 CD 5E 23 2A D7  .*.U>!.y#>4.^#*.
12A0: 55 3E 20 CD 35 15 3E C2 18 19 CD 48 22 2A DB 55  U> .5.>....H"*.U
12B0: CD 48 22 21 04 13 CD A5 22 2A D7 55 3E 30 CD 35  .H"!...."*.U>0.5
12C0: 15 3E D2 DC 79 23 CD 68 15 E1 22 6D 55 01 06 00  .>..y#.h.."mU...
12D0: 21 DB 55 CD 0E 25 01 0F 00 21 73 55 CD 0E 25 21  !.U..%...!sU..%!
12E0: 73 55 CD 39 08 C3 1A 25 23 22 6D 55 EB 2A 6B 55  sU.9...%#"mU.*kU
12F0: B7 ED 52 EB D0 22 6B 55 C9 0A 3A B9 B9 21 BB BB  ..R.."kU..:..!..

      +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  0123456789ABCDEF
1300: 96 DA 00 00 08 3A B9 B9 21 BB BB 86 77 FE 23 CA  .....:..!...w.#.
1310: 97 13 3D C2 19 2A 21 73 55 CD C0 08 B7 C4 7F 28  ..=..*!sU......(
1320: 21 73 55 7E E6 2F FE 02 C2 19 2A 01 0F 00 CD FE  !sU~./....*.....
1330: 24 21 73 55 CB EE CD 39 08 2A DB 55 E5 2A 80 55  $!sU...9.*.U.*.U
1340: 22 DB 55 CD 1A 25 FE 2C C2 19 2A CD 1A 25 CD C5  ".U..%.,..*..%..
1350: 17 FE 7B C2 19 2A 3E 32 2A DB 55 CD 79 23 CD 50  ..{..*>2*.U.y#.P
1360: 15 CD 93 11 3E 21 2A DB 55 CD 79 23 3E 35 CD 5E  ....>!*.U.y#>5.^
1370: 23 2A D7 55 3E 20 CD 35 15 3E C2 DC 79 23 CD 68  #*.U> .5.>..y#.h
1380: 15 E1 22 DB 55 01 0F 00 21 73 55 CD 0E 25 21 73  ..".U...!sU..%!s
1390: 55 CD 39 08 C3 1A 25 21 96 55 7E B7 C2 19 2A 2F  U.9...%!.U~...*/
13A0: 77 CD 1A 25 FE 2C C2 19 2A CD 1A 25 CD 00 18 47  w..%.,..*..%...G
13B0: 3A 98 55 3D C2 48 2A 78 FE 7B C2 19 2A FD 7E FD  :.U=.H*x.{..*.~.
13C0: B7 28 11 21 F7 17 3D 28 08 21 FF 13 CD 9A 22 18  .(.!..=(.!....".
13D0: 08 CD 9A 22 3E 47 CD 5E 23 CD 50 15 CD 93 11 2A  ...">G.^#.P....*
13E0: D7 55 3E 10 CD 35 15 30 0C E5 3E 05 CD 5E 23 E1  .U>..5.0..>..^#.
13F0: 3E C2 CD 79 23 AF 32 96 55 CD 68 15 C3 1A 25 02  >..y#.2.U.h...%.

      +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  0123456789ABCDEF
1400: 06 B8 2A E3 55 E5 2A E1 55 E5 21 00 00 22 E3 55  ..*.U.*.U.!..".U
1410: 22 E1 55 CD C5 17 FE 94 C2 19 2A 3E B7 CD 5E 23  ".U.......*>..^#
1420: 3E CA 21 00 00 CD 79 23 2A 69 55 2B 2B 22 E1 55  >.!...y#*iU++".U
1430: CD 1A 25 CD 91 10 3A 93 55 FE BD 28 2A FE 95 28  ..%...:.U..(*..(
1440: 08 2A E1 55 CD C2 23 18 0D CD 1A 25 FE 93 28 17  .*.U..#....%..(.
1450: CD 6F 14 CD 91 10 2A E3 55 7C B5 C4 C2 23 E1 22  .o....*.U|...#."
1460: E1 55 E1 22 E3 55 C9 CD 6F 14 CD 1A 25 18 A4 2A  .U.".U..o...%..*
1470: E3 55 3E C3 CD 79 23 2A E1 55 CD C2 23 2A 69 55  .U>..y#*.U..#*iU
1480: 2B 2B 22 E3 55 C9 FE 3B C2 19 2A 3E C3 2A D9 55  ++".U..;..*>.*.U
1490: CD 79 23 2A 69 55 2B 2B 22 D9 55 C3 1A 25 FE 99  .y#*iU++".U..%..
14A0: C2 19 2A CD 1A 25 3D C2 19 2A 21 73 55 CD C0 08  ..*..%=..*!sU...
14B0: B7 28 0D 3E 98 32 73 55 21 00 00 22 80 55 18 1E  .(.>.2sU!..".U..
14C0: 3A 73 55 47 E6 0F FE 08 C2 19 2A 2A 80 55 78 87  :sUG......**.Ux.
14D0: 38 0C 3E 18 CD 35 15 3E C3 DC 79 23 18 13 3E C3  8.>..5.>..y#..>.
14E0: CD 79 23 2A 69 55 2B 2B 22 80 55 21 73 55 CD 39  .y#*iU++".U!sU.9
14F0: 08 CD 1A 25 FE 3B C2 19 2A C3 1A 25 FE 3B C2 19  ...%.;..*..%.;..

      +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  0123456789ABCDEF
1500: 2A 3A E9 55 B7 28 12 3E C3 2A EA 55 CD 79 23 2A  *:.U.(.>.*.U.y#*
1510: 69 55 2B 2B 22 EA 55 18 05 3E C9 CD 5E 23 C3 1A  iU++".U..>..^#..
1520: 25 FE 3B C2 19 2A 3E C3 2A 63 55 11 03 00 19 CD  %.;..*>.*cU.....
1530: 79 23 C3 1A 25 E5 F5 ED 5B 69 55 13 13 B7 ED 52  y#..%...[iU....R
1540: D1 5D 7D 87 9F BC E1 20 05 CD 6F 23 B7 C9 37 C9  .]}.... ..o#..7.
1550: DD E1 2A D7 55 E5 2A D9 55 E5 21 00 00 22 D9 55  ..*.U.*.U.!..".U
1560: 2A 69 55 22 D7 55 DD E9 DD E1 2A D9 55 7C B5 C4  *iU".U....*.U|..


stellar言語の特徴ですが、基本データ長は8ビットです。(68系のTL/1と同じですね)

しかし、64KBのメモリ範囲をアクセスできる関数が用意されているので、それ程不都合はないようです。また、制御構文も if, while, until, for, loop文があるのでプログラムが組みやすいようです。

特筆すべきは、inline文が用意されていて、プログラム中に機械語命令やデータを入れることができることと、インデックスレジスタ IX,IYを操作する文があることです。

書籍にはサンプルとしてファイルダンプ fdumpとハノイの塔 hanoi がありましたので、それらを参考にして、メモリダンププログラム mdump を作成してみました。


	/* memory dump */

prog	mdump();

cons    ngetchr := 1,                    /* get chr from console */
    	nputchr := 2;                    /* put chr to console   */

var		d, i,
        sttadr[4], endadr[4],
        sadr[2], eadr[2],
		ch;

data	msttadr: "sttadr= $",0,
        mendadr: "endadr= $",0,
		header:	 "      +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  0123456789ABCDEF",0;

{
    /* input disp adrs area */
    putstr(;.msttadr);
    for i:=0 to 3 {
        sttadr[i] := getchr();
    }
    putnl();
    putstr(;.mendadr);
    for i:=0 to 3 {
        endadr[i] := getchr();
    }
    putnl(2);
    sadr[0] := (sttadr[0]-$30)*$10+(sttadr[1]-$30);
    sadr[1] := (sttadr[2]-$30)*$10+(sttadr[3]-$30);
    eadr[0] := (endadr[0]-$30)*$10+(endadr[1]-$30);
    eadr[1] := (endadr[2]-$30)*$10+(endadr[3]-$30);
    
    /* disp memory data */
    sadr[1] := sadr[1] & $f0;                                           /* start from adrlow=$x0 */
    {
        putstr(;.header);
        putnl();
        {
            puthex(sadr[0]); puthex(sadr[1]);putchr(':');putchr(' ');   /* disp adrs */
            for i:=0 to 15 {
              puthex(memory[sadr[0], (sadr[1])+i]); putchr(' ');        /* disp by hex */
            }
            putchr(' ');
            for i:=0 to 15 {
                d:=memory[sadr[0], (sadr[1])+i];
                ch:= ?(d>=$20 & d<=$7e;d,'.');
                putchr(ch);                                             /* disp by ascii */
            }
            putnl();
            sadr[1] := sadr[1] + $10;
        } until (((sadr[0] <> eadr[0]) & (sadr[1] = $00)) | ((sadr[0] = eadr[0]) & (sadr[1] > eadr[1])));
        putnl();
        sadr[0] := sadr[0] + 1;
    } until  ((sadr[0] > eadr[0]));
}

/***** subroutine *****/

getchr();
{
    bdos(ngetchr);
}

putchr(x);
{
    bdos(nputchr, x);
}

putnl(n);
cons
    cr := $0d,
    lf := $0a;
var
    pn at ( _work );
{
    if pn=0 then n:=1;
    loop #,n {
        bdos(nputchr, cr);
        bdos(nputchr, lf);
    }
}

putstr(;ix);
var x;
{
    while x:=@[ix+] {
        bdos(nputchr, x);
    }
}

puthex(h);
{
    puthex1(h>>4);
    puthex1(h);
}

puthex1(h);
{
    bdos(nputchr, ?((h:=h & $0f)<10 0005h="" _work="" a="" argn="1" at="" bdos="" br="" c="" call="" cd="" d1="" dd="" de="" e1="" e5="" e="" else="" f="" fd="" func="" h="" hl="" if="" inline="" ix="" iy="" ld="" pop="" push="" then="" var="" x="">


この例で分かりますように、CP/MのBDOSを直接呼べますので、I/O関連のプログラムも容易に作成できます。ということで、GAMEやTL/1言語のようなマシンに密着したツールソフトを作成するのに向いている言語ではないかなという印象です。以上、書籍に掲載されていたCP/M版のZ80用の8ビットコンパイラを入力して、簡単なサンプルプログラムを作ってみたという報告でした。 

もし、使ってみたいという方がおられましたら、メールで連絡をくだされば実行ファイル(stellar.comとconvobj.com)を返信メールに添付してお送りできます。 (もっとも、書籍中の構文や文法の解説を読まないと、使ってみるのもなかなか大変ですが。)

2023年2月18日土曜日

FM-7/77用F-BASIC,OS-9,CP/M,FLEX9のディスクイメージを操作する

 Windows上でFM-7/77用F-BASIC,OS-9,CP/M,FLEX9のディスクイメージを操作するソフトの紹介

FM用のエミュレータであるXM7を使用されている方も多いと思います。私も使わせていただいています。素晴らしいソフトを作成された開発者に敬意を表します。

XM7を使用していると、しばしばD77形式のディスクイメージ中のファイルを操作したいことがあります。つまり、ディスクイメージ中にWindowsからファイルを書き込んだり、逆にディスクイメージからWindowsへファイルを読み出したりしたいということです。

今までにそのためのソフトを制作してきました。当然のことですが、各OS(?)によってディスク中への保存形式が異なりますので、ソフトも各OSで異なるものとなりました。

制作したソフトについてはその都度紹介してきましたが、扱えるファイル形式を今までのD77(D88)、DSKに加えて、FT245高速通信カードで用いられているDAT形式に対応するように拡張しましたので、ここでまとめて紹介します。

今までに制作したソフトは以下の4本です。

(1)F-BASIC用 FbasDrvWin.exe

(2)OS-9用   Os9DrvWin.exe

(3)CP/M用   CpmDrvWin.exe

(4)FLEX9用  FlexDrvWin.exe (DAT形式には対応しない)

それぞれ対応するOSが異なりますが、操作性は全て同じにしてあります。

(ただし、FLEX9用のみはディスク形式が異なるためにFT245通信カードを使用する転送ソフトは使用できませんので、DAT形式に対応する必要がありません。)

それぞれの画面イメージは次のようです。


FbasDrvWin.exe



Os9DrvWin.exe


CpmDrvWin.exe


FlexDrvWin.exe



イメージファイル処理ソフトとしての使い方


(1)処理したいイメージファイルをドライブ名ボックス(Drive 0~4)にドラッグ&ドロップすると、下のボックスにそのイメージファイル中のファイルが一覧表示される。
どのボックスに入れても構わない。また、いくつでも重ねて入れることができる。
(2)読み出し
読み出したいファイルをマウスの左ボタンで選択しておいて、右ボタンを押すと現れるメニューから「読み出し」を選択する。
(3)書き込み
書き込みたいWindows上のファイルをこのボックス中にドラッグ&ドロップする。
(4)全ファイルの一括読み出し
メインメニュー「編集」中の「全ファイル読み出し」を選択する。
(5)他の機能
右ボタンメニューには他のコマンドとして「削除」、「ファイル名変更」がある。


仮想ドライブ構築ソフトとして使用する


イメージファイル処理ソフトとしての使い方は上記のようですが、実はこれらのソフトは本来、Windows上の仮想ドライブ構築ソフトとして制作したものです。
(上の画面イメージ中のFlexDrvWin.exeで右側のボックス中にFM機がアクセスしたトラック/セクタが表示されています。)
ということで、FM機に各OSに対応するドライバをインストールすることで、FM機本体のドライブ(通常0と1)に加えて、これらのxxxxDrvWin.exeのDrive2と3が拡張ドライブとして使用できるようになります。
OS-9用以外の3つの仮想ドライブ構築ソフトについては以前紹介し、ドライバも公開しています。

RS-232C用のドライバをFT245通信カード用に書き換える


今までに、Flex用、F-BASIC用、CP/M用のドライバを紹介してきましたが、それらはいずれもFM機とWindows機との間の通信手段としてRS-232Cを使用していました。
しかし、最近はRS-232C機能を使用することはほとんどなくなり、もっぱら「思い付きハードでソフトに七転八倒」さん(ブログは下記)が製作されたFT-245高速通信カード(本ブログでも何回か紹介しています)を使用していますので、現在、各ドライバをFT-245通信カード用に書き換えているところです。完成し次第公開する予定ですが、残念ながら、私は80系は全くと言ってよいほど経験がないので、CpmDrvWin.exe用のドライバが作成できません。F-BASIC用、OS-9用の2つのみを作成中です。

「思い付きハードでソフトに七転八倒」さんのブログ
(1)FM-7用データ転送基板を使った新ユーティリティの紹介https://vehwk3yxv7hw.blog.fc2.com/blog-entry-39.html
 (2)FDDイメージをバックアップするFM-7専用ソフトの説明https://vehwk3yxv7hw.blog.fc2.com/blog-entry-31.html

以上、各OS用のイメージファイル処理ソフト(実は仮想ドライブ構築ソフト)の紹介でした。
これらの4ソフトと、共に使用することが多いD77,DSK,DATファイル間で形式を変換するソフト CvtDskD77.exeをOneDriveに上げておきます。

【注意】これらのソフトの制作にあたっては、それぞれのOSのFMS(ファイルマネージメントシステム)に相当するものの実装が必要ですが、OSの中身を知っているわけではないので、XM7上で読み書き、追加、削除などの操作をして、操作前後でイメージファイルのどの個所がどのように変化したかを確認することによってOS内の動作を推定し、それをもとにして実装しました。
従って実装が不完全、不十分なための誤動作が予想されますので、使用される場合はその点にご注意ください。特に、操作を何回も繰り返すとイメージファイルがおかしくなる可能性がありますので、何回か操作を繰り返したらXM7で別ファイルにコピーし直したり、転送ソフトを用いてフロッピーディスクにコピーしておくと安心です。(使用した感覚ですが、FlexDrvWin.exe以外は比較的安定しているようです。)

2020年12月26日土曜日

Z80H 韋駄天用のCP/Mをソースから構成する

 Z80H韋駄天用のCP/Mを公開されているソースから構成しました


Z80Hの作者はX1-CP/Mから韋駄天用のCP/Mを構成されていますが、前回のブログでは、私は手持ちのFM-CP/Mを利用しました。しかし、X1-CP/MやFM-CP/Mから構成する方法では試してみることができる方は限られます。

そもそもCP/Mの本体部分は共通(だと思っています)ですので、公開されているソースからでも構成できるはずです。ということで、以前中日電工の菱田さんのブログを参考にしてCP/Mを構成した時と同じように構成してみましたので、菱田さんのブログの記事を参照しながら私の行ったその手順を解説します。

[1]ソースからバイナリを作成する

(1-1)ソースとアセンブラを入手する

公開されているページからソース cpm2-asm.zip をダウンロードします。(中日電工のブログ第17,18回 以下同様)

使用するのはこれを展開してできるファイルのうちの cpm22.z80 です。

アセンブラはVectorで入手できるZASM1.64を使用します。

(1-2)ソースのエラーを修正する(第19,35,36回)

このままアセンブルするとエラーが生じますので数箇所を修正します。

・END文の追加

・ラベルHALTをHLTに変更

・NFUNCTSの定義文を前方に移動

・CKSUMTBL: DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 を次の2行に分割する

  CKSUMTBL: DEFW 0

      DEFB: 0,0,0,0,0,0,0,0,0,0,0,0,0,0

・ADD A,M をADD A,(HL) に変更(3箇所)

ブログ中のその他の変更はND80Zのためのものなので不要です。

(1-3)60K-CP/M用に設定する

先頭の MEM EQU 62 を60に変更する。

(1-4)アセンブルする

以上の修正を加えたソース(cpm60k.txt)をWindows上でアセンブルします。

>msdos zasm -L -Ccpm60k.bin cpm60k.txt

(1-5)得られたBINファイルの末尾256バイトを削除する

末尾の BIOS JUMP TABLE の部分はIDATENシステムの方で用意されるので不要です。

できあがったファイルは$0000~$15FFの6KBとなります。


[2]CP/Mディスクを作成する

(2-1)ソースを入力してアセンブルする

「6809活用研究」のZ80Hの記事中にはIPL20, CONFIG, BIOS14, KER14 のソースが掲載されていますので、それを入力してアセンブルします。

(2-2)システムディスクのイメージの作成

バイナリエディタなどで320KBサイズのディスクイメージを作成して、次の順にファイルを書き込みます。

・$0000 - $00FF に IPL         (TRK:0, SCT:1)

・$0100 - $16FF に cpm60k  (TRK:0, SCT:2 - 23)

・$1700 - $1CFF に bios14    (TRK:0, SCT:24 - 29)

・$1D00 - $1EFF に config    (TRK:0, SCT:30 - 31)

・$2000 - $3BFF に ker14     (TRK:1, SCT:1 - 28)

・$4000 以降(TRK:2以降)はDirectoryとProgram&Dataなので、様々なブログで公開されているCP/Mシステムからコピーすることで、トランジェントコマンドやアプリケーションが設定できます。

韋駄天システムはX1-CP/Mを元にしているので、システムのセクタが他のCP/Mとは異なり1セクタ前にずれています。(はせりんさまに教えていただきました。ありがとうございました。)

 最後に、$1CFFの値を$3C(60)に変更します。これは起動時に60K CP/Mと表示される値です。

(2-3)システムディスク、あるいはシステムイメージファイルの作成

私は以前のブログに書きましたように、ドライブ0にGOTEKを使用していますので、できあがったイメージファイル(.DSK)を.88ファイルに変換して、さらに.hfeファイルに変換してUSBメモリーに書き込めば終了です。

フロッピーディスクをお使いの方はイメージファイルをそのままディスクにベタに書き込めば良いのですが、その方法としては、RS-232Cカードや以前のブログでも紹介していますFT-245カードを使ってFM77やFM-7に転送して書き込むことになりますが、転送時間がかかっても良ければF-BASICのプログラムを組めば良いので、詳細は省略させていただきます。




試作第1作は修正箇所が見えていて見苦しかったので、作り直すとともにCPUをZilog Z84C0020PECに交換しました。



韋駄天システムは最終的には64K-CP/Mとなるのですが、今のところまだ60K-CP/Mのままです。

これで、ハンダ付けを伴う製作と雑誌記事からのソフトの入力の手間をを厭わなければ、FM77で8MHz動作のCP/Mが走ることになります。





2020年12月19日土曜日

Z80カードの第4作は77AV用のZ80Hカード(韋駄天)

 懲りもせずに、さらにZ80カードを作ってみました!

[12月21日追記]CP/Mも走りました!(はせりんさんのアドバイスのおかげです)


今回のZ80カードは、ほうめいさんによる77AV用のZ80Hカード(韋駄天)です。

「6809活用研究(工学社)」掲載の記事を見て、いつかは作ってみたいと思って記事のコピーを保存してあったのですが、ほうめいさんのブログ「まごころせいじつ堂」に回路図の訂正が載ったのを見て、ついに作ってみることにしました。

(うまく行けば、私の常用機であるFM77AV40SXでもCP/Mが走るかもという甘い希望を持っていますがどうでしょうか。) ←コネクタが違っていました。残念!


ハードの製作

ブログの回路図を元にしてKiCadで回路図を描き、ICの配置もブログの写真通りにしてプリント基板を製作しましたが、メモリーICを128KBに変更することで何とか10x8cmのサイズに収めることができました。

Z80Hは手持ちがありませんでしたので、古いD780C-1を使用してみましたが不思議なことに8MHzクロックのままで動作しています。

しかし、いつものようにポカをしてしまい、128KBメモリーのプルアップすべきCS端子をプルダウンしてしまったので、パターンカットや追加配線が必要となりました。




画像では、とりあえずメモリーのピン30を抜いて+5Vに接続していますが、こんなこともあろうかと作り直しを前提に、普段はTTL ICには使用しないことにしているソケットを使用しています。


FM77AVに装着した様子です。高さを8㎝に抑えたので、装着した状態でカバーを閉じることができます。

「6809活用研究」にはF-BasicのTiny Monitorも載っていましたので、入力して走らせてみました。



画像のように、コマンド M, D, S, R が機能していますのでハードは正常に動作しているようです。


CP/Mの移植

CP/Mの移植に必要なソフトも「6809活用研究」に載っているので、BIOS等はそれらを打ち込めばよいのですが、CP/M本体はX1用のものを使用することになっています。

もちろんX1用のCP/Mは所有していないので、最初に手持ちのFM-CP/Mのディスク中のFMCPM605.SYSが5インチ用の60K_CP/Mかと思って適用してみたり、動いている56K_CP/Mから60K_CP/Mを作成して適用してみたりしましたが、うまく行きません。さらに、CP/M2.2のソースをアセンブルしたものを適用したりしましたが、やはり動作しません。

ということで、CP/Mの移植については挑戦中ということで、先にそのまま入力していたBIOSなどのソースを改めて読んでいるところです。

[12月23日追記]FM-CP/Mの60K版を元にしたものが動作しましたので、次の課題は公開されているソースをアセンブルしたもので動作させることですね。


最後に

回路やソフトを公開して下さったほうめいさんに感謝いたします。

とりあえず製作した試作第一作の不完全なプリント基板(ミスがあるためパターンカットと追加配線が必要なのと、シルク印刷が不十分)ですが、余分が数枚ありますので、もしご希望の方がおられましたらメールで連絡を下さい。返信用封筒に切手を貼って送ってくださったら無料でお送りします。


2020年6月10日水曜日

FM-7用Z80カードの第3作を製作

富士通の回路を10x8㎝に収めたCP/Mカードを作ってしまいました

3月13日のブログ「FM-7用Z80カードの第2作などを製作」で紹介したI/O誌の記事を元にしたZ80カードでは富士通のCP/M-80が動作しましたし、特に不満はなかったのですが、実は、「F-BASIC解析マニュアル フェーズ2」に掲載されている富士通純正のCP/Mカードの回路図も、いずれ製作するつもりでKiCadで回路図を作成してありました。

しかし、IC数が19個と多いので10x10㎝の格安基板には収まりそうもなく(富士通純正のCP/Mカードのサイズは124x78mmです)、製作費を考えて二の足を踏んでいました。
でも10x10㎝以内のサイズに無理やり押し込んでみたらどうなるかと試してみたところ、何とか10x8cmのサイズに入りましたので、作ってみることにしました。

いつもですと電源ラインだけは太い線で手配線し、残りはFreeRouting.exeに任せるのですが、今回は電源ラインも太くする余裕もありませんし、また、いつも全ICにつけているパスコンもオリジナル回路を忠実に再現するということで少なくなっているので、安定して動作するかという点では不安がありますがとにかく作ってみたものが下の画像です。


製作した基板と完成基板


ICの配置はオリジナルと同じにしてありますし、他の部品もできる限り同じ配置になるようにしてあります。ご覧のように、これ以上は小さくできないというサイズです。

左:純正基板 右:製作した基板


左が純正のZ80カードで、右が製作したコンパクトサイズのZ80カードです。高さは同じ8cmで幅が10㎝と狭くなっています。


動作中の様子1



動作中の様子2


動作中の様子です。私としては珍しくミスがなく、組み立てたらすんなりと富士通のCP/M-80が動作しました。
まだ十分にテストしていませんが、今のところ純正基板と同様に動作しているように思えます。しかし上記しましたように、安定動作するかどうかはまだまだ確認する必要があります。

ということで、2種類のZ80基板を作ってしまいましたが、余った基板は現在発注してある40Pコネクタと共に配布する予定です。
(40Pコネクタが届くのが待ち遠しいです。今回は、以前作った基板から40Pコネクタを外して使用しました。)

2020年5月16日土曜日

FM-7用 58K CP/M-80が一応出来上がりました

RAMモードで動作する58K CP/M-80が一応出来上がりました


Z80カードを製作した勢いでつい手をだしてしまって、もっと簡単にできると思ったのに意外に手間取ってしまい、一ヶ月ほどもかかってしまいましたが、FM-7用のCP/Mが一応できあがりました。
まだまだ直すべき箇所が多々ありますので完成とは言いすぎですが、切りがないので一応の区切りとします。

実行画面


仮想ドライブ画面



装置全景(左がFM-7用のディスプレイ)



メモリマップ


前回のブログで紹介したのはROMモードで$0000~$7FFFの範囲で動作する26K CP/Mでしたが、BIOSを使用せずSubSystemを使用することで、下図のメモリマップのように$0000~$EFFFの範囲で動作する58K CP/Mとなりました。



  58K CP/M-80



3つのファイルから構成されています。


(1)CP/M本体
  サイト「The Unofficial CP/M Web site」中のソース cpm22.z80 を使用しました。
  中日電工さんのサイトに説明されている通りにソースのバグを修正し、ドライブ名の表示を大文字に変更しただけで、あとはオリジナル通りです。58K CP/Mとしてアセンブルしました。
(2)BIOS80
  BIOSのZ80部分で、BIOSのジャンプテーブル、DISKパラメータの他はほぼパラメータをセットしてコマンド番号を6809に送っているだけです。
(3)BIOS09
  BIOSの6809部分で、FM-7のBIOSは用いず、FDD関係はFDC (MB8877A) を直接コントロールし、それ以外はSubSystemを使用しています。


CP/Mとしての機能


CP/Mとしての機能はベーシックなもので、エスケープシーケンスなども実装していませんが、仮想ドライブは実装してありますので、フロッピーが2台、仮想ドライブが2台の計4台です。
ドライブA, Bがフロッピー、C, DがWindows上の仮想ドライブです。以前紹介したRS232Cカードを用いて38400baudで通信しています。



構成図

RS232Cのドライバも実装しているのでPUNCHとREADERも使えるのですが、実際にはまず使用することはなく、もっぱらWindows上のエディタでファイルを作成し、ドライブCかDにセットしたCP/Mのイメージファイル(.77または.DSK形式)にドラッグ&ドロップしてCP/Mでアセンブルしたり、必要があればフロッピーにコピーしたりして使用しています。


機能不足や不具合など


相変わらずブロッキング/デブロッキング機能は実装していませんので、ディスクアクセスは速くはありませんが、そのうちにということで今回はパス。(そもそもブロッキング/デブロッキングについては良く分かっていないので。)

現在分かっている不具合がいくつかあります。
(1)カーソルが表示されない。
  もちろん、SubSystemのCONSOLE CONTROLでカーソル表示をONにしていますが、6809側では表示されますが、Z80側に切り替わるとカーソルが消えます。
今のところ原因が分からず、直せていないので結構不便です。

(2)スタート時にドライブを指定する必要がある。
  スタート直後にディレクトリを表示させると、DIRやDIR A:は表示されるのですが、DIR B:などはダメです。最初にドライブチェンジのB:やC:などを一回実行しておけば以降は普通に表示できるのですが、なぜでしょうか。BIOSがおかしいのは間違いないのですが。


制作した2つのソフト


下にBIOS80とBIOS09を置いておきます。80系の知識がほとんどない私が作ったものなのでおかしな点が多々あるかと思いますが、おかしな箇所や不具合の原因などをご指摘いただけるとありがたいです。

◎BIOS80です。中日電工さんのブログで紹介されているZASM1.64でアセンブルしています。

 


 ◎BIOS09です。自作のクロスアセンブラでアセンブルしています。

 

上記のソフトはまだ制作途中ということで、エラー処理などは不十分ですのでディスクアクセスに失敗などするとハングアップしたりします。

ということで、不具合はありますが何とか使える状態なので、今は、最近入手した「応用CP/M 村瀬康治著」中のシステムコールの実習を一つずつ走らせて確認しているところです。

なお、仮想ドライブ構築ソフトCpmDrvWin.exeですが、もうしばらく使用して不具合が出ないかを確認してから公開する予定です。