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年12月11日金曜日

Ndittを使用しないでGOTEK用のHFEファイルを作成する(その3)

 

ついに実用レベルの高速化を実現できました


前々回(その1)のブログでFDをイメージ化するのに「思い付きハードでソフトに七転八倒」さんが製作されたFT245RL使用の高速転送カードを使用できればもっと速くなるだろうと書きましたが、実際に2Dディスク(320KB)でわずか1分という、RS232Cカード使用の場合の10倍ほどの高速化を実現することができました。

使用したFT245カードは、FT245RLモジュールの他にはTTL-ICがわずか5個という簡素なものですが、その速さには目を見張るものがあります。




FM-7側のソフトはもちろん、「思い付きハードでソフトに七転八倒」さんがハードに合わせて作成されたものをそのまま使用させていただきました。
WindowsPC側のソフトは、とりあえずの間に合わせで私が作成したものを用いました。




使用法


(1)Windows側でmkd88img.exeを起動し、Port Noと保存ファイル名を指定して「データ受信開始」ボタンを押します。
ステータスバーに Data receive start ... が表示されて、データ受信待ち状態になります。




(2)FM-7側でLOADM”RDFDIMG",,RでRDFDIMGを起動します。
プログラムサイズは243バイトで$6800からに入り、実行開始アドレスは$6850です。デフォルトではドライブ0が指定されていますが、アドレス$6856の0を希望のドライブ番号に変えることで他のドライブも読めます。
Windows側では、track no = nn のように、読み終わったトラック番号が表示されます。




(3)40トラックの読み込みが終了すると(track no = 39はほとんど見えません...)、続いてDSKファイルとD88ファイルの作成に進みますが一瞬で終了します。



2つのファイルが作成されると DSK, D88 file created. が表示されて処理が終了します。
そのまま、別のFDの処理を続けることもできますが、同じファイル名のままだと重ね書きになります。

Windows上にD88形式のイメージファイルが作成できれば、後は、8月9日のブログ「FM-7/77にGOTEKを接続する」に書きましたように、HxCFloppyEmulator.exeを用いてD88ファイルをHFEファイルに変換してUSBメモリに書き込むだけです。

使用感など


ディスク一枚が1分で処理できるのは結構実用的ではないでしょうか。
私はこれを用いて手持ちのF-BASICの2Dディスクを全部読み込んでイメージファイル化してみましたが、それ程の手間ではありませんでした。

最後に


NDittを使わずにFM-7自身でFDを読んでそのままWindowsPCに転送することでイメージ化できないかという着想から始まった試みでしたが、WindowsPCへのデータ転送にRS-232Cを用いた場合はFD1枚に10分もかかり、出来ないことはないが普段使うツールとしては非実用的といえる結果となりました。
そんな時に、FT245基板を製作された「思い付きハードでソフトに七転八倒」の秋田さんが趣旨に賛同してFM-7側のFD読み込み・転送ソフト RDFDIMG を作成してくださいました。
これによってFD1枚のイメージ化が1分でできるようになり、実用的なツールになりました。

ということで、「FM-7側ソフト担当:秋田さん(企画の賛同者)、Windows側ソフト担当:私(企画・仕様設計)」という合同作品となりました。

使用したRDFDIMG(「思い付きハードでソフトに七転八倒」の秋田さん制作)とmkd88img.exe(拙作)をOneDriveに上げておきます。
なお、RDFDIMG にはFM-7からWindowsへの送信ルーチンだけでなく、Windowsからの受信ルーチンも含まれていますので、更なる用途も考えられると思います。

2020年12月3日木曜日

Ndittを使用しないでGOTEK用のHFEファイルを作成する(その2)

 

前回紹介したプログラムを改良し、多少の高速化を図りました


前回紹介したプログラムは、FM-7側はF-BASICで作成し、WindowsPC側は2つのプログラムに分かれていましたが、FM-7側のプログラムをアセンブラで、WindowsPC側のプログラムを一つにまとめることで、より使い易くするとともに多少の高速化を図ることができました。

(1)FM-7側(RDIMG)
アセンブラで書き直すにあたって、最初はFDCを直接コントロールしてトラックリードコマンドで、1トラックを一気に読み込んでメモリに展開し、そこからセクタデータを取り出すと高速になるのではないか(ディスクの読み込みが40x2の80回で済むので)と考えて作成してみました。
結果、セクタデータは得られたのですが、標準のフォーマットとは異なる個所もあり、また、読み込むたびに値が変わる部分もあり、全てに対応するのは結構面倒そうです。
ちなみに、読み込んだトラックデータは以下のようでした。

                            標準の値                     実際の値
----------------------------------------------------------------------------------------------
GAP1                      4E                             4E,その他の値
----------------------------------------------------------------------------------------------
SYNC                      00 (12バイト)            00,その他の値
IDアドレスマーク    A1,A1,A1,FE             14,A1,A1,FE or C2,A1,A1,FE
IDとCRC(4+2バイト)             同じ
----------------------------------------------------------------------------------------------
GAP2                      4E                              4E,その他の値
SYNC                      00 (12バイト)            00,その他の値
IDアドレスマーク    A1,A1,A1,FB             14,A1,A1,FB or C2,A1,A1,FB
                                                                 (FBはF8の場合もあり)
DATAとCRC(256+2バイト)    同じ
----------------------------------------------------------------------------------------------
GAP3                       4E                             4E,その他の値
----------------------------------------------------------------------------------------------

これを見る限り12バイトの00に続いた後、 14(orC2),A1,A1,FEの後にID(TRK,SIDE,SCT,セクタ長)+CRCが、14(orC2),A1,A1,FBの後にDATA(256バイト)+CRCがあると決め打ちして良いようにも思いますが、ちょっと不安です。

ということで結局、BIOSを用いてセクタリードを40x2x16の1280回繰り返すことにしました。1セクタ読むごとに256バイトのデータとチェックサム値を転送しています。ファイル名をRDIMGとしました。


(2)WindowsPC側(mkd88img.exe)
前回のプログラムはFM-7から送られたデータをそのままセクタ順に保存してできたDSKファイルをまず作り、次に別のプログラムを用いてD88ファイルを作成するものでしたが、それを一体化してmkd88img.exeとしました。処理結果としてDSKファイルとD88ファイルの2つが生成されます。

FDイメージファイル作成の手順


(1)FM-7とWindowsPCをRS232Cボードで接続して適切なボーレートに設定します。RTS/CTS制御可能なボードであれば19200Baudが可能です。
(2)WindowsPC側のmkd88img.exeを起動します。オプションを付けずに起動するとCOM4,19200Baud,生成ソフト名FDIMG.DSK, FDIMG.D88となりますので、変更する場合は下記のようにオプションを付けて起動します。
 mkd88img [p=n] [b=nn] fname (fnameはディレクトリを含んでも良い)
(3)FM-7側のRDIMGを起動します。デフォルトではドライブ0のディスクを読むようになっているので、他のドライブの場合は一旦Loadして(&H6000からに入ります)から&H6002の値0を希望のドライブ番号に変えた後、Exec &H6000で実行します。
(4)指定したディレクトリにDSKファイルとD88ファイルが作成されます。


結果など


速度ですが、2Dディスクを処理するのにおよそ10分(19200Baud)、15分(9600Baud)、20分(4800Baud)、35分(2400Baud)程度となりました。
8251Aを直接コントロールしているのでRTS/CTS制御をしてボーレートを上げることができていますが、2400Baudでは前回の結果と同じ程度なので、処理時間はディスクの読み込み方法とはあまり関係がなく、ほぼ転送速度で決まってしまっているようです。

作成したRDIMGとmkd88img.exeをOneDriveにMakeD88ImageFile2.zipとして上げておきます。FM-7にRDIMGを直接入力する場合はRDIMG.bin(236バイトもありますが...)を打ち込みます。(RDIMGはF-BASICの機械語形式に合わせたもので仮想ドライブにドラッグ&ドロップする場合に用います。)



2020年11月24日火曜日

Ndittを使用しないでGOTEK用のHFEファイルを作成する

 Ndittを使わないGOTEK用のHFEファイルの作成方法を紹介します


8月9日のブログ「FM-7/77にGOTEKを接続する」でFM-7/77でGOTEKが使えるという紹介をしましたが、実際にGOTEKを使用する場合の最大の障壁は、如何にして手持ちのフロッピーディスクの内容をWindowsPCに取り込むかだと思います。

〇標準的な方法

下図の左の方法で、3.5インチ又は5インチのFDDを装着したWindowsPCを用意し、Nditt.exeでフロッピーディスクを読み込んで.D88(.D77)イメージファイルに変換するというものです。

実際、私もこのためだけに3.5インチと5インチFDD付きの古いWindowsXPパソコンを保管しています。しかし、これは如何にも面倒です。

そこで、FDDのないWindowsPCでも可能な方法を紹介します。

〇FM-7を使用する方法

下図の右のように、FM-7上でフロッピーディスクの全セクタを読み出してWindowsPCに転送し、作成された.DSKファイルを.D77形式に変換するというものです。







このために必要なソフト(FM-7側:SNDIMG,  WindowsPC側:rcvfdimg.exe)を作成しました。

さらに最後の手順の.DSKから.D88への変換には従来から使用しているソフト FbDsktoD77.exe を使用しました。


各ソフトの機能

・転送ソフト SNDIMG:

FM-7上で動作するF-BASICのソフトで、フロッピーディスクの全セクタを読み込み、バイナリのままでWindowsPCに送信します。

ドライブは0を設定してありますので、他ドライブの場合は直接プログラムを修正します。

・受信ソフト rcvfdimg.exe:

WindowsPC上で動作するコンソールソフトで、受信したセクタデータをTrack0,Sector1からTrack39,Sector32までそのまま順に並べた.DSK形式のファイルを作成します。

  Usage:rcvfdimg [p=n] [b=nnnn] [filename](全て省略可)

        (省略時:p(ポート)は4、b(ボーレート)は4800baud、filenameはFDIMG.DSK)

・.DSKファイル変換ソフト FbDsktoD77.exe:

WindowsPC上で動作するコンソールソフトで、.DSK形式のF-BASICファイルを.D88形式に変換します。私が普段Windows上の仮想ディスクで使用するファイルを作成するために使用しているものなので、ファイルの拡張子が.D77にしてありますが、それを.D88にリネームします。また、デフォルトでは640KBのファイル用なのでオプションとして39を付けて変換する必要があります。(ファイル名のみで起動するとUsageが表示されます。)

  Usage:FbDsktoD77 filename 39 (ファイル名の拡張子は不要)



使用感など

最近はFDDがついていないPCが普通になってしまったようで、結構困ることがありますので、この方法もありかと思います。

ただ、速度的にはかなり遅くて2Dディスクの320KBで30分余りかかります。。。

ディスクの読み込みが遅い上にBASICでのRS232C通信ですのでさらに遅くなるのは当然ですが、FM-7(と普通のWindowsPC)でイメージファイルが作成できるのはメリットではないでしょうか。

GOTEKを使おうと考えるということは、当然、FM-7にはフロッピードライブが装着されていると思いますので、あとはWindowsPCとの通信手段としてのRS232Cカードなどがあれば良いわけです。

RS232Cカードの自作もそれ程大変ではないと思いますし、他にも「思い付きハードでソフトに七転八倒」さんが製作されたFT245RL使用の高速転送カードを使用できればもっと速くなると思います。また、以前ブログで紹介したArduinoMega2560を使用したカードを使うという手もあるかと思いますが、まだ試していません。

使用したソフト(SNDIMG,rcvfdimg.exeソース付き,FbDsktoD77.exe)をOneDriveに上げておきます。rcvfdimg.exeは以前のブログ「ASSIST09に追加したLoad, Saveコマンドを改良しました」で紹介したslwinr.exeを手直しして作成しましたが、ソースもつけておきましたので改良して使っていただければと。

蛇足になりますが、F-BASICのソフト SNDIMG だけは何とかしてFM-7に読み込む必要がありますが、40行足らずですので直接打ち込んだ方が早いと思います。


2020年10月11日日曜日

F-BASIC版のP-ROM Writerカード用ドライバが完成

 

F-BASIC版のP-ROM Writerカード用ドライブソフトも作りました


9月16日のブログで、P-ROMライター用のドライブソフトが完成したと書きましたが、それは、私が常用しているFlex9上で動作するものでしたので、オリジナルのOS-9版と同様、一般的ではありませんでした。
そこで、普段はほとんど使うことがないF-BASIC上で動作するものを作ろうとしたのですが、Flex9ではデータバッファとして32KBを確保できたのに対してF-BASICでは$8000番地から上がROMですのでそんなには取れません。
初めは裏RAMを使用することを考えたのですが、それでも32KBは無理です。(32KBにこだわるのは27256の容量だからです。)
結局、裏RAM使用は止めて少ないバッファ容量に合わせてデータを分割して読み込み、複数回の書き込みをすることとしました。(Flex9版でも27512では2回に分けて書き込んでいます。)
下図で分かりますように、バッファ容量として8KB確保しましたので、2716, 2732, 2764は一回で書き込めますが、27128では2回、27256では4回、27512では8回の書き込みを繰り返すことになります。







これに合わせて、Block選択コマンドを追加しました。(1ブロックは8KB)0を選択すると自動的に書き込みを繰り返して全ブロックを書き込みます。0以外では選択したブロックのみを書き込みます。
また、書き込むデータも全体をメモリ上には置いておけず、機械語ファイルとしてディスクに保存することになりますので、そのファイルのLoad, Saveコマンドも追加しました。
さらに、データファイルを8KB単位に分割して機械語ファイル形式に変換するためのソフトも別途必要です。

結局、実装したコマンドは Info, Type, Block, Pwidth, Dump, Erase, Read, Write, Verify, Load, Save, Quitの計12個となりました。


27512を選択した例を示します。




ブランクチェックをした後、書き込んでいます。
ブロック1から8までを連続して書き込んでいます。




ドライブソフトですが、ほとんどの機能を機械語サブルーチンに任せているので、BASIC部は基本的に初期化とコマンド選択・実行準備だけという簡単なものです。

BASIC部を示します。

  1. 1000 'PROM READ/WRITE PROGRAM FOR FM-7
  2. 1010 '
  3. 1020 WIDTH 80,25
  4. 1030 CLEAR ,&H47FF
  5. 1040 MADR=&H4800 :'store subroutine
  6. 1050 BUFTOP%=&H5000
  7. 1060 BUFEND%=&H7000 :'buffer size is 8KB
  8. 1070 POKE MADR+&H12,BUFTOP% \ &H100
  9. 1080 POKE MADR+&H13,BUFTOP% MOD &H100
  10. 1090 POKE MADR+&H14,BUFEND% \ &H100
  11. 1100 POKE MADR+&H15,BUFEND% MOD &H100
  12. 1110 PRINT:PRINT"Initializing..."
  13. 1120 'PIA INIT
  14. 1130 PIA=&HFD9C:PIADA=PIA:PIACA=PIA+1:PIADB=PIA+2:PIACB=PIA+3
  15. 1140 POKE PIACA,&H30 :'DDRA
  16. 1150 POKE PIACB,&H30 :'DDRB
  17. 1160 POKE PIADA,&HFF :'PORTA OUT
  18. 1170 POKE PIADB,&HFF :'PORTB OUT
  19. 1180 POKE PIACA,&H3C
  20. 1190 POKE PIACB,&H3C
  21. 1200 '
  22. 1210 CMD$="ITBPDERWVLSQ"
  23. 1220 ROMTYP$(0)="2716 ":ROMTYP$(1)="2732 ":ROMTYP$(2)="2764 "
  24. 1230 ROMTYP$(3)="27128":ROMTYP$(4)="27256":ROMTYP$(5)="27512"
  25. 1240 ROMNO%=3 :'default ROM type is 2764
  26. 1250 PWIDTH%=1 :'default write pulse width is 1ms
  27. 1260 BLKNO%=1 :'default block no
  28. 1270 LDFN$="ROMDAT"
  29. 1280 SVFN$="ROMDATS"
  30. 1290 '
  31. 1300 '===== SET PROGRAM CODE =====
  32. 1310 LOADM "PWRSUB" :'Load subroutine
  33. 1320 '
  34. 1330 '+++++ COMMAND INPUT +++++
  35. 1340 PRINT:PRINT "Command:"
  36. 1350 PRINT " I)nfo T)ype B)lock P)width D)ump E)rase R)ead W)rite V)erify L)oad S)ave Q)uit"
  37. 1360 PRINT "Command in: ";
  38. 1370 KIN$=INKEY$ :IF KIN$="" THEN 1370
  39. 1380 PRINT KIN$
  40. 1390 IF ASC(KIN$)>&H61 THEN KIN$=CHR$(ASC(KIN$)-&H20)
  41. 1400 CMD=INSTR(1,CMD$,KIN$)
  42. 1410 IF CMD=1 THEN GOSUB 1560 :GOTO 1340 :'Info
  43. 1420 IF CMD=2 THEN GOSUB 1640 :GOTO 1340 :'Type
  44. 1430 IF CMD=3 THEN GOSUB 1740 :GOTO 1340 :'Block
  45. 1440 IF CMD=4 THEN GOSUB 1960 :GOTO 1340 :'Pwidth
  46. 1450 IF CMD=5 THEN GOSUB 2880 :GOTO 1340 :'Dump
  47. 1460 IF CMD=6 THEN GOSUB 2030 :GOTO 1340 :'Erase
  48. 1470 IF CMD=7 THEN GOSUB 2110 :GOTO 1340 :'Read
  49. 1480 IF CMD=8 THEN GOSUB 2360 :GOTO 1340 :'Write
  50. 1490 IF CMD=9 THEN GOSUB 2620 :GOTO 1340 :'Verify
  51. 1500 IF CMD=10 THEN GOSUB 2930 :GOTO 1340 :'Load
  52. 1510 IF CMD=11 THEN GOSUB 2990 :GOTO 1340 :'Save
  53. 1520 IF CMD=12 THEN END :'Quit
  54. 1530 GOTO 1340
  55. 1540 '
  56. 1550 '===== INFORMATION =====
  57. 1560 PRINT:PRINT "ROM type is ";ROMTYP$(ROMNO%-1)
  58. 1570 PRINT "Block no (0:ALL) is";BLKNO%
  59. 1580 PRINT "Write pulse width is";PWIDTH%;"ms"
  60. 1590 PRINT "Load Filename is ";LDFN$
  61. 1600 PRINT "Save Filename is ";SVFN$
  62. 1610 RETURN
  63. 1620 '
  64. 1630 '===== SELECT ROM TYPE =====
  65. 1640 PRINT:PRINT "Select ROM: ";
  66. 1650 FOR I=0 TO 5
  67. 1660 PRINT USING "#!& &";I+1;")";ROMTYP$(I);
  68. 1670 NEXT
  69. 1680 PRINT
  70. 1690 INPUT "Input ROM no (1..6):";ROMNO%
  71. 1700 IF ROMNO%<1 OR ROMNO%>6 THEN 1690
  72. 1710 PRINT:PRINT "ROM type is ";ROMTYP$(ROMNO%-1)
  73. 1720 '
  74. 1730 '===== SELECT BLOCK NO =====
  75. 1740 PRINT:PRINT "Select Block No: "
  76. 1750 BLKNO%=1
  77. 1760 IF ROMNO%<=3 THEN PRINT "2716,32,64 is BlockNo=1" :GOTO 1860
  78. 1770 PRINT "Input block no (0:ALL,";
  79. 1780 ON ROMNO%-3 GOTO 1790,1810,1830
  80. 1790 INPUT "1-2):";KIN$
  81. 1800 IF KIN$<"0" OR KIN$>"2" THEN 1770 ELSE 1850
  82. 1810 INPUT "1-4):";KIN$
  83. 1820 IF KIN$<"0" OR KIN$>"4" THEN 1770 ELSE 1850
  84. 1830 INPUT "1-8):";KIN$
  85. 1840 IF KIN$<"0" OR KIN$>"8" THEN 1770 ELSE 1850
  86. 1850 BLKNO%=VAL(KIN$)
  87. 1860 POKE MADR+&H1B,ROMNO%-1
  88. 1870 RETURN
  89. 1880 '
  90. 1890 '===== SET VARIABLE =====
  91. 1900 POKE MADR+&H1A,PWIDTH%
  92. 1910 POKE MADR+&H1B,ROMNO%-1
  93. 1920 POKE MADR+&H1C,BLKNO%
  94. 1930 RETURN
  95. 1940 '
  96. 1950 '===== SET WRITE PULSE WIDTH =====
  97. 1960 PRINT:INPUT "Write pulse width (1..50ms): ";KIN$
  98. 1970 IF VAL(KIN$)<1 OR VAL(KIN$)>50 THEN 1960
  99. 1980 PWIDTH%=VAL(KIN$)
  100. 1990 POKE MADR+&H1A,PWIDTH%
  101. 2000 RETURN
  102. 2010 '
  103. 2020 '===== ERASE CHECK =====
  104. 2030 PRINT:PRINT "Erase checking"
  105. 2040 GOSUB 1900
  106. 2050 DEF USR1=MADR+3:'Erase check command
  107. 2060 A%=USR1(0) :'Exec command
  108. 2070 IF A%=0 THEN PRINT " Erase check complete!" ELSE PRINT " !!! not BLANK !!!"
  109. 2080 RETURN
  110. 2090 '
  111. 2100 '===== READ =====
  112. 2110 PRINT :PRINT "Reading BlockNo:"
  113. 2120 'set variable
  114. 2130 GOSUB 1900
  115. 2140 DEF USR2=MADR+6 :'Read command
  116. 2150 SVBLKNO%=BLKNO%
  117. 2160 IF ROMNO%<=3 THEN MAXNO%=1 ELSE MAXNO%=2^(ROMNO%-3)
  118. 2170 IF BLKNO%=0 THEN STNO%=1 ELSE STNO%=BLKNO% :MAXNO%=BLKNO%
  119. 2180 'Read
  120. 2190 GOSUB 2250
  121. 2200 'Read end
  122. 2210 BLKNO%=SVBLKNO%
  123. 2220 IF A%=0 THEN PRINT "Read complete!"
  124. 2230 RETURN
  125. 2240 '
  126. 2250 'Read subroutine
  127. 2260 FOR I=STNO% TO MAXNO%
  128. 2270 BLKNO%=I
  129. 2280 PRINT BLKNO%;
  130. 2290 POKE MADR+&H1C,BLKNO%
  131. 2300 A%=USR2(0) :'Exec
  132. 2310 IF A%=0 THEN PRINT ELSE PRINT " !!! Read ERROR !!!"
  133. 2320 NEXT
  134. 2330 RETURN
  135. 2340 '
  136. 2350 '===== WRITE =====
  137. 2360 PRINT:PRINT "Writing BlockNo:"
  138. 2370 'set variable
  139. 2380 GOSUB 1900
  140. 2390 DEF USR3=MADR+9:'Write command
  141. 2400 SVBLKNO%=BLKNO%
  142. 2410 IF ROMNO%<=3 THEN MAXNO%=1 ELSE MAXNO%=2^(ROMNO%-3)
  143. 2420 IF BLKNO%=0 THEN STNO%=1 ELSE STNO%=BLKNO% :MAXNO%=BLKNO%
  144. 2430 'Write
  145. 2440 GOSUB 2500
  146. 2450 'Write end
  147. 2460 BLKNO%=SVBLKNO%
  148. 2470 IF A%=0 THEN PRINT "Write complete!"
  149. 2480 RETURN
  150. 2490 '
  151. 2500 'Write subroutine
  152. 2510 FOR I=STNO% TO MAXNO%
  153. 2520 BLKNO%=I
  154. 2530 PRINT BLKNO%;
  155. 2540 POKE MADR+&H1C,BLKNO%
  156. 2550 LOADM LDFN$+HEX$(BLKNO%)
  157. 2560 A%=USR3(0) :'Exec
  158. 2570 IF A%=0 THEN PRINT ELSE PRINT " !!! Write ERROR !!!"
  159. 2580 NEXT
  160. 2590 RETURN
  161. 2600 '
  162. 2610 '===== VERIFY =====
  163. 2620 PRINT:PRINT "Verifying BlockNo:"
  164. 2630 'set variable
  165. 2640 GOSUB 1900
  166. 2650 DEF USR4=MADR+12 :'Verify command
  167. 2660 SVBLKNO%=BLKNO%
  168. 2670 IF ROMNO%<=3 THEN MAXNO%=1 ELSE MAXNO%=2^(ROMNO%-3)
  169. 2680 IF BLKNO%=0 THEN STNO%=1 ELSE STNO%=BLKNO% :MAXNO%=BLKNO%
  170. 2690 'Verify
  171. 2700 GOSUB 2760
  172. 2710 'Verify end
  173. 2720 BLKNO%=SVBLKNO%
  174. 2730 IF A%=0 THEN PRINT "Verify complete!"
  175. 2740 RETURN
  176. 2750 '
  177. 2760 'Verify subroutine
  178. 2770 FOR I=STNO% TO MAXNO%
  179. 2780 BLKNO%=I
  180. 2790 PRINT BLKNO%;
  181. 2800 POKE MADR+&H1C,BLKNO%
  182. 2810 LOADM LDFN$+HEX$(BLKNO%)
  183. 2820 A%=USR4(0) :'Exec
  184. 2830 IF A%=0 THEN PRINT ELSE PRINT " !!! Verify ERROR !!!"
  185. 2840 NEXT
  186. 2850 RETURN
  187. 2860 '
  188. 2870 '===== Memory Dump =====
  189. 2880 DEF USR5=MADR+15 'Buffer dump command
  190. 2890 A%=USR5(0) :'Exec
  191. 2900 RETURN
  192. 2910 '
  193. 2920 '===== Load from File =====
  194. 2930 INPUT "Load Filename (except block no):";LDFN$
  195. 2940 PRINT "Load for BlockNo:";BLKNO%
  196. 2950 LOADM LDFN$+HEX$(BLKNO%)
  197. 2960 RETURN
  198. 2970 '
  199. 2980 '===== Save to File =====
  200. 2990 INPUT "Save Filename (except block no):";SVFN$
  201. 3000 PRINT "Save for BlockNo:";BLKNO%
  202. 3010 SAVEM SVFN$+HEX$(BLKNO%),BUFTOP%,BUFEND%,&H0
  203. 3020 RETURN
  204. 3030 '
  205. 3040 END


機械語サブルーチン部を示します。

  1. *
  2. * PROMSUB
  3. *
  4. * PROM Read/Write subroutine for FM-7
  5. *
  6. * argument of USR function
  7. * MADR+&H17 :PWIDTH
  8. * MADR+&H18 :ROMNO-1
  9. * MADR+&H19 :BLKNO
  10. *
  11. * First version Ver 1.0 '2020.10.10
  12. * Original FLEX9 version '2020.09.13
  13. * Copyright by Y.Yamamoto
  14. *
  15. BIOS EQU $FBFA ;F-Basic bios
  16. PIA EQU $FD9C
  17. PIADA EQU PIA ;ADRSH,ADRSL,DATA
  18. PIACA EQU PIA+1
  19. PIADB EQU PIA+2 ;PB5:VPPCNT,PB4:OE,PB3:CE,PB1:AHI,PB0:ALO for 2716,32,256,512
  20. * ;PB5:VPPCNT,PB4:OE,PB3:PGM,PB2:CE:PB1:AHI,PB0:ALO for 2764,128
  21. PIACB EQU PIA+3
  22. *
  23. ORG $4800
  24.  
  25. START EQU *
  26. LBRA SETPRM point by USR0() ;+0
  27. LBRA CERASE point by USR1() ;+3
  28. LBRA CREAD point by USR2() ;+6
  29. LBRA CWRITE point by USR3() ;+9
  30. LBRA CVERIFY point by USR4() ;+12
  31. LBRA CDUMP point by USR5() ;+15
  32. *
  33. BUFTOP FDB $5000 ;start addr
  34. BUFEND FDB $7000 ;end addr
  35. STADR FDB 0000 ;page top addr
  36. EDADR FDB 0000 ;page end addr
  37. PWIDTH FCB 01 ;PWIDTH:write pulse length (default 1ms)
  38. ROMNO FCB 00 ;ROMNO-1 (0..5)
  39. BLKNO FCB 00 ;BLKNO (0,1..8)
  40. DATCNT FCB 00 ;data count for disp
  41. CPARA1 FCB 00 ;cmd parameter(9bytes)
  42. CPARA2 FCB 00
  43. CPARA3 FCB 00
  44. CPARA4 FCB 00
  45. CPARA5 FCB 00
  46. CPARA6 FCB 00
  47. CPARA7 FCB 00
  48. CPARA8 FCB 00
  49. CPARA9 FCB 00
  50. *
  51. *------------------------------
  52. * get parameter & set read param
  53. *------------------------------
  54. GETPRM EQU *
  55. PSHS B,X
  56. LDB ROMNO ;ROMNO-1 (0..5)
  57. LEAX PARARD,PCR
  58. LSLB
  59. LSLB x4
  60. ABX
  61. LDB #4 ;counter
  62. BSR SETPRM
  63. PULS B,X,PC
  64. *
  65. *------------------------------
  66. * set read/write parameter
  67. * B:counter
  68. * X:adr of CPARARD or CPARAWR
  69. *------------------------------
  70. SETPRM EQU *
  71. PSHS A,Y
  72. LEAY CPARA1,PCR
  73. SR1 LDA ,X+
  74. STA ,Y+
  75. DECB
  76. BNE SR1
  77. PULS A,Y,PC
  78. *
  79. *read,verify,erase parameter
  80. PARARD EQU *
  81. FCB $28,$2A,$2B,$23 ;for 2716
  82. FCB $28,$2A,$2B,$23 ;for 2732
  83. FCB $20,$22,$23,$2B ;for 2764
  84. FCB $20,$22,$23,$2B ;for 27128
  85. FCB $28,$2A,$2B,$23 ;for 27256
  86. FCB $28,$2A,$2B,$23 ;for 27512
  87. *
  88. *write parameter
  89. PARAWR EQU *
  90. FCB $10,$12,$13,$13,$1B,$13,$13,$03,$13 ;for 2716
  91. FCB $28,$2A,$2B,$0B,$03,$0B,$2B,$23,$2B ;for 2732
  92. FCB $1C,$1E,$1F,$1B,$13,$1B,$1B,$0B,$1B ;for 2764
  93. FCB $1C,$1E,$1F,$1B,$13,$1B,$1B,$0B,$1B ;for 27128
  94. FCB $38,$3A,$3B,$1B,$13,$1B,$1B,$0B,$1B ;for 27256
  95. FCB $28,$2A,$2B,$0B,$03,$0B,$2B,$23,$2B ;for 27512
  96. *
  97. *------------------------------
  98. * set start & end adrs
  99. * 2716,32,64 :whole rom(2k,4k,8k)
  100. * 27128,256,512 :8k(block specified by BLKNO)
  101. *
  102. * STADR decided by BLKNO
  103. *------------------------------
  104. SETADR EQU *
  105. PSHS A,B,X
  106. LDX #0
  107. STX STADR
  108. STX EDADR
  109. LDB BLKNO ;BLKNO
  110. BEQ SE1
  111. DECB
  112. LDA #$20 ;8kb
  113. MUL
  114. EXG A,B
  115. STD STADR
  116. STD EDADR
  117. SE1 LDA #$08 ;2kb
  118. LDB ROMNO ;ROMNO-1
  119. BEQ SE2 ;2716 2kb
  120. LSLA
  121. DECB
  122. BEQ SE2 ;2732 4kb
  123. LSLA else ;8kb
  124. SE2 ADDA EDADR
  125. STA EDADR ;2k,4,8k
  126. *set bufend
  127. LDA #$58 ;$5000+2k
  128. LDB ROMNO ;ROMNO-1
  129. BEQ SE3 ;if 2716
  130. ADDA #$08 ;4k
  131. DECB
  132. BEQ SE3 ;if 2732
  133. ADDA #$10 ;8k
  134. SE3 STA BUFEND ;2k,4k,8k
  135. PULS A,B,X,PC
  136. *
  137. *============================
  138. * ERASE CHECK all ROM area
  139. *============================
  140. CERASE EQU *
  141. *set read parameter
  142. PSHS X ;save for return parameter
  143. *get param & set read param
  144. LBSR GETPRM
  145. *set start & end adrs
  146. LDX #0
  147. STX STADR ;start adrs is 0
  148. STX EDADR
  149. LDB ROMNO ;ROMNO-1
  150. INCB ROMNO
  151. LDA #$04 ;assume 1k
  152. CE0 LSLA
  153. DECB
  154. BNE CE0
  155. STA EDADR ;2k,4k,8k,16k,32k,64k
  156. *
  157. *erase check
  158. LDX STADR
  159. LDY EDADR
  160. CE1 LDA CPARA1
  161. STA PIADB
  162. *ADRS SET
  163. TFR X,D ;read adrs
  164. STA PIADA ;adrsH
  165. LDA CPARA2
  166. STA PIADB ;adrsH set
  167. STB PIADA ;adrsL
  168. LDA CPARA3
  169. STA PIADB ;adrsL set
  170. *READ DATA & CHECK
  171. LDA CPARA4
  172. STA PIADB ;ce:H->L
  173. LDA #$FF
  174. STA PIADA ;change to input mode
  175. LDA PIADA ;read data
  176. CMPA #$FF ;blank data?
  177. BNE CERERR
  178. LEAX 1,X
  179. LEAY -1,Y
  180. BHI CE1
  181. CLRA ;no error
  182. CEEND
  183. PULS X
  184. STA 2,X
  185. STA 3,X
  186. RTS
  187. *
  188. CERERR
  189. LDA #-1 ;error
  190. BRA CEEND
  191. *
  192. *============================
  193. * READ DATA of 1 block
  194. *============================
  195. CREAD EQU *
  196. *set read parameter
  197. PSHS X save for return parameter
  198. *get param & set read param
  199. LBSR GETPRM
  200. *
  201. *set start & end adrs
  202. CR0 LBSR SETADR
  203. *read data
  204. LDX STADR
  205. LDY BUFTOP
  206. *
  207. CR1 BSR DSPCNT
  208. LDA CPARA1
  209. STA PIADB
  210. *ADRS SET
  211. TFR X,D ;read adrs
  212. STA PIADA ;adrsH
  213. LDA CPARA2
  214. STA PIADB ;adrsH set
  215. STB PIADA ;adrsL
  216. LDA CPARA3
  217. STA PIADB ;adrsL set
  218. *READ DATA
  219. LDA CPARA4
  220. STA PIADB ;ce:H->L
  221. LDA #$FF
  222. STA PIADA ;change to input mode
  223. LDA PIADA ;read data
  224. STA ,Y+
  225. LEAX 1,X
  226. BEQ CR2 ;for EDADR=0 (27512)
  227. CMPY BUFEND
  228. BLO CR1
  229. CR2 CLRA ;no error
  230. PULS X
  231. STA 2,X
  232. STA 3,X
  233. RTS
  234. *
  235. *-------------------------
  236. * DISP READ/WRITE COUNTER
  237. *-------------------------
  238. DSPCNT EQU *
  239. PSHS A,B,X
  240. TFR X,D
  241. TSTB
  242. BNE DSPEND
  243. LDA #'.
  244. JSR PUTCHR
  245. DSPEND PULS A,B,X,PC
  246. *
  247. *============================
  248. * WRITE DATA of 1 block
  249. *============================
  250. CWRITE EQU *
  251. PSHS X ;SAVE for return parameter
  252. LDB ROMNO ;ROMNO-1
  253. PSHS B
  254. LEAX PARAWR,PCR
  255. LSLB
  256. LSLB
  257. LSLB x8
  258. ABX
  259. PULS B
  260. ABX x9
  261. LDB #9 ;counter
  262. LBSR SETPRM
  263. *set start & end adrs
  264. CW0 LBSR SETADR
  265. *write data
  266. LDX STADR
  267. LDY BUFTOP
  268. *
  269. CW1 BSR DSPCNT
  270. LDA CPARA1
  271. STA PIADB ;start
  272. *ADRS SET
  273. TFR X,D
  274. STA PIADA ;adrsH
  275. LDA CPARA2
  276. STA PIADB ;adrsH set
  277. STB PIADA ;adrsL
  278. LDA CPARA3
  279. STA PIADB ;adrsL set
  280. LDA ,Y
  281. CMPA #$FF ;if $ff then skip
  282. BEQ CW4
  283. STA PIADA ;data
  284. LDA CPARA4
  285. STA PIADB ;data set
  286. *WRITE PULSE
  287. LDB PWIDTH ;write pulse width
  288. LDA CPARA5
  289. STA PIADB ;write pulse
  290. PSHS X
  291. CW2 LDX #256
  292. CW3 LEAX -1,X
  293. BNE CW3
  294. DECB
  295. BNE CW2
  296. PULS X
  297. LDA CPARA6 ;end write pulse
  298. STA PIADB
  299. LDA CPARA7 ;gap
  300. STA PIADB
  301. *DATA READ for VERIFY
  302. LDA CPARA8
  303. STA PIADB ;verify
  304. LDA #$FF
  305. STA PIADA ;change to input mode
  306. LDA PIADA ;data read
  307. CMPA ,Y
  308. BNE CWERR
  309. LDA CPARA9
  310. STA PIADB ;end verify
  311. CW4 LEAY 1,Y
  312. LEAX 1,X
  313. BEQ CW5 ;for EDADR=0 (27512)
  314. CMPY BUFEND
  315. BLO CW1
  316. CW5 CLRA ;no error
  317. CWEND
  318. PULS X
  319. STA 2,X
  320. STA 3,X
  321. LDA #$38 ;VPP=0,OE,CE=H
  322. STA PIADB
  323. RTS
  324. *
  325. CWERR LDA #-1
  326. BRA CWEND
  327. *
  328. *============================
  329. * VERIFY DATA of 1 block
  330. * compare ROM(STADR-EDADR) and BUF(TOP-END)
  331. *============================
  332. CVERIFY EQU *
  333. *set read parameter
  334. PSHS X ;save for return parameter
  335. *get param & set read param
  336. LBSR GETPRM
  337. *set start & end adrs
  338. CV0 LBSR SETADR
  339. *verify check
  340. LDX STADR
  341. LDY BUFTOP
  342. *
  343. CV1 LBSR DSPCNT
  344. LDA CPARA1
  345. STA PIADB
  346. *ADRS SET
  347. TFR X,D ;read adrs
  348. STA PIADA ;adrsH
  349. LDA CPARA2
  350. STA PIADB ;adrsH set
  351. STB PIADA ;adrsL
  352. LDA CPARA3
  353. STA PIADB ;adrsL set
  354. *READ DATA & CHECK
  355. LDA CPARA4
  356. STA PIADB ;ce:H->L
  357. LDA #$FF
  358. STA PIADA ;change to input mode
  359. LDA PIADA ;read data
  360. CMPA ,Y+ ;match data?
  361. BNE CVERR
  362. LEAX 1,X
  363. BEQ CV2 ;for EDADR=0 (27512)
  364. CMPY BUFEND
  365. BLO CV1
  366. CV2 CLRA ;no error
  367. CVEND
  368. PULS X
  369. STA 2,X
  370. STA 3,X
  371. RTS
  372. *
  373. CVERR
  374. LDA #-1 ;error
  375. BRA CVEND
  376. *
  377. *============================
  378. * DUMP BUFFER DATA
  379. *============================
  380. CDUMP EQU *
  381. LBSR PCRLF
  382. LDX BUFTOP
  383. STX STADR
  384. MDMP0 LBSR DSPTTL
  385. LDX STADR
  386. LDB #16
  387. STB DATCNT ;data cntr in line
  388. MDMP1 STX STADR
  389. PSHS B
  390. LEAX STADR,PCR
  391. LBSR OUTADR
  392. LDA #':
  393. LBSR PUTCHR
  394. LDA #$20
  395. LBSR PUTCHR
  396. * display hexa data
  397. LDX STADR
  398. LDB DATCNT
  399. LBSR HEXDSP
  400. LDB DATCNT
  401. * display ascii data
  402. LDX STADR
  403. LDB DATCNT
  404. LBSR ASCDSP
  405. STX STADR ;set new start addr
  406. LBSR PCRLF
  407. * page ?
  408. PULS B
  409. DECB
  410. BNE MDMP1
  411. *
  412. MD1 LDX STADR
  413. CMPX BUFEND
  414. BLO MD2
  415. MDEND LBSR PCRLF
  416. RTS
  417. *
  418. MD2 LEAX MSKIN,PCR
  419. LBSR PSTRNG
  420. LBSR GETCHR
  421. ANDA #$DF
  422. CMPA #'Q quit?
  423. BEQ MDEND
  424. CMPA #'P Prev page?
  425. BEQ MD5
  426. CMPA #'S Set address?
  427. BNE MD4
  428. MD3 LEAX MADRS,PCR
  429. LBSR PSTRNG
  430. LBSR ADRIN
  431. CMPX BUFTOP
  432. BLO MD3
  433. PSHS X
  434. LEAX -$100,X
  435. CMPX BUFEND
  436. PULS X
  437. BHS MD3
  438. TFR X,D
  439. CLRB
  440. TFR D,X
  441. STX STADR
  442. MD4 LBRA MDMP0
  443. *
  444. MD5 LDX STADR
  445. LEAX -$200,X
  446. CMPX BUFTOP
  447. BMI MD6
  448. BRA MD7
  449. MD6 LEAX $100,X
  450. MD7 STX STADR
  451. BRA MD4
  452. *
  453. *--------------------
  454. * display title
  455. DSPTTL EQU *
  456. LEAX MDTTL1,PCR
  457. BSR OUTSTR
  458. DEND BSR PCRLF
  459. RTS
  460. *--------------------
  461. * hexa data disp of 1 line
  462. * B:counter
  463. HEXDSP
  464. BSR OUTHEX
  465. LDA #$20
  466. BSR PUTCHR
  467. DECB
  468. BNE HEXDSP
  469. RTS
  470. *--------------------
  471. * ascii data disp of 1 line
  472. * B:counter
  473. ASCDSP LDA ,X+
  474. CMPA #$20
  475. BHS ADSP1
  476. LDA #'.
  477. BRA ADSP2
  478. ADSP1 CMPA #$7F
  479. BLS ADSP2
  480. LDA #'.
  481. ADSP2
  482. BSR PUTCHR
  483. DECB
  484. BNE ASCDSP
  485. RTS
  486. *
  487. *--------------------
  488. OUTSTR EQU *
  489. OU1 LDA ,X+
  490. BEQ OUEND
  491. BSR PUTCHR
  492. BRA OU1
  493. OUEND RTS
  494. *
  495. *--------------------
  496. * display split line
  497. VSPLN
  498. LDB #57 display split line
  499. LDA #'-
  500. VSP BSR PUTCHR
  501. DECB
  502. BNE VSP
  503. BSR PCRLF
  504. RTS
  505. *
  506. *--------------------
  507. GETCHR EQU *
  508. PSHS X,Y
  509. LEAX RCBKIN,PCR
  510. LEAY DBAKIN,PCR
  511. STY 2,X
  512. GE1 JSR [BIOS]
  513. LDA DBAKIN+1
  514. BEQ GE1
  515. LDA DBAKIN
  516. PULS X,Y
  517. *
  518. PUTCHR EQU *
  519. PSHS X,Y
  520. LEAX RCBOUT,PCR
  521. LEAY DBAOUT,PCR
  522. STY 2,X
  523. STA 6,X
  524. JSR [BIOS]
  525. PULS X,Y,PC
  526. *
  527. PCRLF EQU *
  528. LDA #$0D
  529. BSR PUTCHR
  530. LDA #$0A
  531. BSR PUTCHR
  532. RTS
  533. *
  534. PSTRNG EQU *
  535. PS1 LDA ,X+
  536. CMPA #4
  537. BEQ PS2
  538. BSR PUTCHR
  539. BRA PS1
  540. PS2 RTS
  541. *
  542. OUTHEX EQU *
  543. LDA ,X+
  544. PSHS A
  545. ANDA #$F0
  546. LSRA
  547. LSRA
  548. LSRA
  549. LSRA
  550. BSR PHEX
  551. PULS A
  552. ANDA #$0F
  553. BSR PHEX
  554. RTS
  555. *
  556. PHEX EQU *
  557. CMPA #10
  558. BCS PH1
  559. ADDA #7
  560. PH1 ADDA #$30
  561. BSR PUTCHR
  562. RTS
  563. *
  564. OUTADR EQU *
  565. BSR OUTHEX
  566. BSR OUTHEX
  567. RTS
  568. *
  569. ADRIN EQU *
  570. *clear buffer
  571. LEAX INBUF+6,PCR
  572. LDB #6
  573. CLRA
  574. AD1 STA ,-X
  575. DECB
  576. BNE AD1
  577. *input 4chr
  578. LDB #4
  579. AD2 BSR GETCHR
  580. CMPA #$0D
  581. BEQ AD3
  582. STA ,X+
  583. DECB
  584. BNE AD2
  585. *change hex
  586. LDB #2
  587. LEAY INADRS,PCR
  588. AD3 LEAX INBUF,PCR
  589. AD4 PSHS B
  590. LDD ,X++
  591. SUBA #$30
  592. CMPA #10
  593. BCS AD5
  594. SUBA #7
  595. AD5 LSLA
  596. LSLA
  597. LSLA
  598. LSLA
  599. STA ,Y
  600. SUBB #$30
  601. CMPB #10
  602. BCS AD6
  603. SUBB #7
  604. AD6 ADDB ,Y
  605. STB ,Y+
  606. PULS B
  607. DECB
  608. BNE AD4
  609. *get adrs
  610. LDX -2,Y
  611. RTS
  612. *
  613. INBUF FCB 0,0,0,0
  614. INADRS FCB 0,0
  615. *
  616. RCBKIN EQU *
  617. FCB 21 KEYIN
  618. FCB 0
  619. FDB DBAKIN
  620. FDB 00
  621. *
  622. DBAKIN FCB 0,0
  623. *
  624. RCBOUT EQU *
  625. FCB 20 OUTPUT
  626. FCB 0
  627. FDB DBAOUT
  628. FDB 0001
  629. *
  630. DBAOUT FCB 0,0
  631. *
  632. MDTTL1 FCC $0D,$0A,$0D,$0A,/ADDR: +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF/
  633. FCC $0D,$0A,/---- ----------------------------------------------- ----------------/
  634. FCB 0
  635. MSKIN FCC $0D,$0A,/Keyin (Q:Quit, P:Prev page, S:Select address, else:Next page):/
  636. FCB 4
  637. MADRS FCC $0D,$0A,/Address ($xxxx) = $/
  638. FCB 4
  639.  
  640. END START

また、P-ROMに書き込むデータはF-BASICの機械語データ形式なので、先頭が 0x00,データサイズ(2bytes),書き込みアドレス(2bytes)の計5バイトで始まり、その後にデータ本体が続き、末尾が 0xFF,0x00,0x00,0x00,0x00の計5バイトで終わる形となります。
Windows上でデータファイルを8KB毎に分割し、上記の機械語形式に合わせて先頭と末尾に必要な各5バイトを追加するためのツールソフト spltdat.exeを作成しました。

以上より、私の場合のP-ROMに書き込む標準的な手順をまとめると、
(1)Windows上で書き込むバイナリデータを作成する。
(2)spltdat.exeで8KB単位のデータファイルに分割する。
        元ファイル ROMDAT --> 変換後ファイル ROMDAT1, ROMDAT2,...,ROMDAT8
(3)作成されたデータファイルをFM-7に転送する。
     転送手段としてはRS-232Cカードを使用できますが、それ以外にも思い付きハードでソフトに七転八倒さんによるFT-245使用の高速転送カードやArduinoMega2560使用のカードも使用できます。
(4)ドライバ PROMWRと書き込みデータを同じディスクに入れておいて、PROMWRを起動する。
(5)P-ROMの種類、書き込むブロック範囲、書き込みパルス幅を指定して書き込む。
以上です。
もちろんF-BASIC上で書き込みデータを直接作成して、そのまま書き込むこともできますが、その場合には$5000~$6FFFのバッファにデータを置き、一旦SAVEMで末尾にブロック番号を付けたファイル名で保存する必要があります。

作成した 書き込みソフトPROMWR, PWRSUBとツールspltdat.exeをOneDriveに置いておきます。なお、PROMWRはF-BASICのASCIIセーブ形式、PWRSUBは機械語データ形式になっていますので、そのままでF-BASICのディスクに保存できます。

2020年9月16日水曜日

P-ROM Writerカードのドライブソフトが完成

 ようやくP-ROM Writerカード用のドライブソフトが完成しました


6月26日のブログで紹介したP-ROM Writerカードですが、元になった記事ではOS-9上のソフトでコントロールしていました。
その際には、とりあえずOS-9 Level1で動作させて27C256に書き込めることを確認しましたが、OS-9上ではなく他のOS上で動作するドライブソフトを作成する必要があると考えていました。
また、ブログには2716の書き込みができていないと書きましたが、その原因は使用した270uHのインダクタにあり、流れる電流が許容値を大幅に超えており、かなりの発熱が生じていたために25Vが安定しなかったことにありました。

ハードの不具合が解消できたのでソフトの作成にかかりました。
最初はOS-9上のソフトを手直しすれば良いと考えていたのですが、他の方の制作したソフトを読むのは結構難しくて、結局、一から作ることになりました。

制作したドライブソフトは使い慣れているFlex9上で動作するもので、コマンドとして以下の13個を用意しました。
Type, Erase, Pwidth, Info:ROM指定、Blankチェック、書き込みパルス幅指定
Info:ROM種他の設定値の表示
Read, Write, Verify:読み出し、書き込み、ベリファイ
Dump, Fill, Memory:バッファのダンプ、フィル、データ変更
Load, Save:ファイルのロード、ファイルへのセーブ
Quit:終了

これらのうち、Info(設定値を表示)とPwidth(書き込みパルス幅を設定)以外は元のドライブソフトと同様な機能です。(Memoryはスクリーンエディタではありませんが...)

対応しているROMは2716, 2732, 2764, 27128, 27256, 27512の6種ですが、27128は手持ちがないので動作確認はできていません。
バッファサイズとして32KB用意してあるので27256までは一回で書き込めますが、27512は2回に分けて書き込むことになります。(27512の指定時に書き込みエリアの前半・後半を選択します。)

起動してROM種を選択している様子です。


ライター全景です。
左が68B21が載ったI/O拡張カードで、右がP-ROMライターカードです。



2732に書き込んでいる様子です。ジャンパー線でVPPを21Vに設定しています。




カード上でのROMの選択は20PのICソケット上でのジャンパーで行いますが、書き込み電圧VPPの指定だけはROM毎に確認してジャンパー線で設定する必要があります。特に2732や2764は要注意です。

【参考】
VPP値ですが、手持ちのADVATESTROMライタ付属のROM一覧表で調べてみると、
・2716   25V ----------------------------- 25V
・2732   25V, 21V ----------------------- 25V,21Vのどちらか要確認
・2764   25V, 21V, 12.5V, 12.75V -- ほぼ21Vだが一部25Vあり
・27128 21V, 12.5V, 12.75V, 13V -- 21V,12.5Vのどちらか要確認
・27256 21V, 12.5V, 12.75V --------- ほぼ12.5Vだが一部21Vあり
・27512 12.5V, 12.75V, 13V --------- 12.5V
と様々です。
271625V2751212.5Vと決め打ちしてて良いようですが、他はほぼ2種類あります。
 
また書き込みパルス幅ですが、27256以降は1msで書き込めますが、それ以前のものはパルス幅を大きくする必要がありますので、パルス幅も設定する必要があります。


コマンドの実行例を示します。

リードコマンドとライトコマンドです。
進行状態を表すために1ページ(256バイト)読み書きするごとにドット(.)を表示しています。




ダンプコマンドです。
以前作成したモニタコマンド中のルーチンを流用しているために、16バイトごとのチェックサム表示という余分な機能も付いています。



メモリーコマンドです。
これもモニタコマンド中のルーチンの流用です。書き込みデータを表示・編集できます。Pキーでアドレスを戻すことができます。また、テンキーの「*/+-=,」はA-Fとして扱われます。



これで一応、2716から27512までのEP-ROMのライターのハード、ソフトが完成したと言って良いかと思いますが、ソフトについてはオリジナルがOS-9上、今回制作したものはFlex9上で動作するものですので、一般的ではありません。
F-Basic上で動作するソフトが作れれば良いのですが、私の手には余ります。
今回のFlex9版の実行ファイルと共にソースファイルをOneDriveにアップしておきます。

2020年8月18日火曜日

Atmel StudioからArduinoを用いてATtiny85に書き込む

Atmel StudioからArduino UNOを書き込み器として用いてATtiny85に書き込む


私の場合はATtiny85に書き込むツールとしてTL866ⅡPLUSを使用しているのですが、Arduinoで書き込みができないかという声がありましたので、試してみました。
やりたいことはAtmel Studioでプログラムを作成し、それを書き込み器として設定したArduino(ArduinoISP)でATtiny85に書き込むということです。

(1)Arduino UNOを書き込み器として設定する。


「ファイル」→「スケッチ例」→「11.ArduinoISP」からArduinoISPを選択
「ツール」→「ボード」でArduino UNOを選択
「ツール」→「シリアルポート」でArduino UNOが接続されているポートを選択
「ツール」→「書込装置」でAVRISP mkIIを選択
スケッチをコンパイルして書き込む。
これでArduino UNOが書き込み装置になりました。

(2)ArduinoにATtiny85を認識させる。


「ファイル」→「環境設定」の設定タブ中の「追加のボードマネージャのURL:」に
「http://drazzy.com/package_drazzy.com_index.json」を書き込み、OKボタンを押す。(もう既に設定済みのものがあれば次の行に書き込みます。)
「ツール」→「ボード」→「ボードマネージャ」でフィルタにATtinyCoreと入力し、現れたATTinyCoreをインストールする。
「ツール」→「ボード」でATtiny25/45/85(No bootloader)を選択
「ツール」→「書込装置」でArduino as ISPを選択

(3)ArduinoにATtiny85を接続する。


        次のように接続します。(画像参照)
        Arduino UNO ATtiny85
        13 <----------> SCK 
        12 <----------> MISO
        ~11 <----------> MOSI
        ~10 <----------> RESET
        5V <----------> VCC
        GND <----------> GND







以上でArduino側の準備は終了です。
(もちろん、電源は入れたままにしておきます。)

(4)Atmel Studioの設定


「ツール」→「外部ツール」で次の3項目を設定

設定例
タイトル:ArduinoISP(ATtiny85)
コマンド:C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe
引数:-c avrisp -P COM6 -b 19200 -p t85 -U flash:w:$(ProjectDir)Release\$(TargetName).hex:i -U lfuse:w:0xe2:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m
(COM6はArduinoが接続されているポート、t85はATtiny85、3つのfuseの値は適宜設定)
さらに、「出力ウインドウを使用」にチェックを入れます。「起動時に引数を入力」にチェックを入れると書き込み時に引数を変更できますが、かえって面倒かもしれません。

これで、「ツール」メニュー中にArduinoISP(ATtiny85)が現れます。
[注意]これは書き込む条件、チップ毎に設定する必要があります。

しかし、私の場合、これだけではconfigファイルがないというエラーが出ましたので、C:\Program Files (x86)\Arduino\hardware\tools\avr\etc中にあるavrdude.confをavrdude.exeのあるフォルダにコピーします。

(5)書き込み


Releaseモードでビルドしてhexファイルが作られましたら、「ツール」メニュー中のArduinoISP(ATtiny85)を選択するとhexファイルが書き込まれます。
Atmel Studioの出力ウインドウにメッセージが出ますので、書き込まれていることを確認できます。

[参考にしたサイト]
ArduinoISPの設定方法についてはAnalogic Intelligence Z80-MBCの作成 其の参を、
Atmel StudioへのArduinoISPの設定方法についてはシナプスのハード製作記を参考にさせていただきました。ありがとうございます。

2020年8月9日日曜日

FM-7/77にGOTEKを接続する

FM-7やFM77にGOTEKを接続してみました

[12月6日追加]新基板のGOTEKの場合はこちらをご覧ください
[8月19日追加あり]

以前からHxCエミュレータには興味があったのですが、お遊びで試してみることができるような値段ではないので手を出さなかったのですが、低価格のGOTEKなら失敗してもあきらめがつくということで、2台入手してみました。
FlashFloppyというソフトの存在を知ったことも大きかったです。それまでは有料であるHxCのエミュレータをインストールしなければGOTEKは使えないものと思い込んでおりましたので。
さらにGOTEKは種類も多く、FM-7や77では2DDの720KBのものしか使えないのではないかと思っていたのですが、FlashFloppyをインストールするのであればどれでも良いのではないかと考えて、最安値に近いものを購入しました。

購入したのはSFR1M44-U100Kという型番のものです。オプションとしてOLEDディスプレイとロータリーエンコーダ(スイッチ付き)も入手しました。

FlashFloppyの入手・インストールやオプションの取り付け方等については先人の知恵をお借りしました。GOTEKやHxCというキーワードで検索すればたくさんヒットしますので、それらをご参照ください。
私は、特に「レトロなPCとか」の「FDDエミュレータのまとめ」を参考にさせていただきました。説明が具体的でかつ画像もありますので大変参考になりました。他には、「FlashFloppy Wiki」も参考にしました。ありがとうございました。


オプションのOLEDとロータリーエンコーダ(スイッチ付き)を増設しました。
画像にはありませんが、さらに圧電スピーカーも追加しました。


テスト風景です。自作のFDCカードからのフラットケーブルをそのままGOTEKに接続しています。カード上のStepDoubler機能はOFFにしています。
USBメモリ中に、F-BASIC30、Flex9、OS-9Level1、CP/M-80のシステムディスクのイメージファイル(D88形式をHFE形式に変換したもの)を入れて起動してみました。
どのシステムも正常に起動し、読み書きができました。




実際の使用風景です。このために最近入手したPC98用のFDDケースに収めています。GOTEKをドライブ0に、PC用のFDDをStepDoublerアダプタを通して接続してドライブ1に設定しています。
(OS-9を動作させるために、StepDoublerアダプタには7月19日のブログ「2DDドライブ用ステップ2倍化回路のその後」中の訂正を加えています。)



接続図です。


常用しているFM77AV40SXにも組み込んでみました。2DDファイルもOKでした。



訳が分からなくて苦労したことなど


ハードの設定やソフトのインストールなどは先人の知恵をお借りすることで、それ程苦労することはなかったのですが、イメージファイルをUSBメモリにインストールするところでは苦労しました。

HxCFloppyEmulator.exeでイメージファイルを作成する際の設定
[1]購入時の3桁7セグ表示の場合
 (1)使用するモードはIndexed Modeを選択
 (2)SDCard HxC Floppy Emyulator settingsとUSB HxC Floppy Emyulator settingsの設定では
 DoubleStepにチェックを入れない。
 Indexed Modeにチェックを入れる。
 2 drives emulationのチェックを外す。
以上の設定の上で(設定ファイルをUSBメモリにコピーする)、LoadでD88形式のディスクイメージファイルを指定してExportでHFE形式で書き出し、それをUSBメモリにコピーする。
その際のファイル名はDSKA0000.HFE,DSKA0001.HFE,...のように命名する。
7セグ上では000,001,...のように表示されるので、2つの押しボタンスイッチで選択する。

[2]OLEDに変更後の場合
 (1)使用するモードはNormal Modeを選択
 (2)settingsの設定では
 DoubleStepにチェックを入れない。
 Indexed ModeやAUTO BOOT Modeにチェックを入れない。
 2 drives emulationのチェックを外す。
以上の設定で(設定ファイルのコピーは不要)、LoadでD88形式のディスクイメージファイルを指定してExportでHFE形式で書き出し、それをUSBメモリにコピーする。
その際のファイル名は自由で良い。OLEDではそのままファイル名が表示される。

分かってしまえば簡単な手順なのですが、最初は何も分からない状態ですので、アップデートの必要がないのにしてみてエラーに悩んだり、あれこれ設定してみた間違った設定ファイルを書き込んでみたり、Modeと設定ファイルが合っていなかったりの試行錯誤の連続でした。
しかも、オプションのOLEDに交換するまでは3桁の7セグ表示ですので、表示の意味も良く分からない状態でインストールしようとしている者にとっては迷ってしまいがちです。

結果的には、何とか無事にインストールできて良かったです。

[8月19日追加]
上記はFM-7やFM77AVのような2Dの機種の場合です。
私が常用しているFM77AV40SXのような2DDの機種の場合は、次のようになります。
・元ファイルが2Dのイメージファイルの場合はDoubleStepにチェックを入れる。
・元ファイルが2DDのイメージファイルの場合はDoubleStepにチェックを入れない。


使用感など


まず、スピードはフロッピィとあまり変わらないようです。
また、音ですが、有り合わせの圧電スピーカーを付けたせいか、アクセス音はチリチリという小さな音が聞こえるだけですが、フロッピィのアクセス音は邪魔だったのでこれで良いかなと思います。
ただ一つ難点はOLEDの表示が老年者には小さすぎることですね...

何よりも良いのは、つまみを回すだけで起動するイメージファイルを選べることです。
私はメインでFlex9、時々OS-9やCP/M、ごくまれにFBasicを使っていますが、それらをUSBメモリに入れておけば、いちいちフロッピィを取り出す必要がありません。
ドライブ1にはフロッピィディスクをセットしてありますが、ドライブ2,3としてRAMディスクやWiindows上の仮想ドライブも使えますので、いよいよフロッピィと縁が切れるかもしれません。


2020年7月19日日曜日

2DDドライブ用ステップ2倍化回路のその後

Ready信号生成のためのPICを不要とすることができました

[2020年8月2日画像追加あり]
[2020年8月6日訂正あり]

6月8日の「2DDドライブ用ステップ2倍化回路のプリント基板化」で、FDCカードからFDDへのケーブルの間に挿入する形のステップ2倍化回路基板を紹介しましたが、それは、ステップ2倍化のためのATtiny85とReady信号生成のためのPIC12F675の両方を必要とするものでしたが、3つのICを必要とするのはいかにも大袈裟です。

このPIC12F675を使用せずにReady信号を生成する方法として次の2つを考えました。
(1)FDDを改造して34ピンにReady信号を取り出す。
(2)ATtiny85にReady信号生成のプログラムを追加する。

PIC12F675によるReady信号生成回路はK-ichi's memoさんによるMSXでPC用FDDを使うで紹介されているものをそのまま使用させていただいていましたが、プログラム作成では結構苦労されているようでしたので、まずは(1)による方法を試してみました。


(1)による方法


参考にしたのは、試運転さんによるPC-9821にPC/AT互換機用FDDを接続する(実施編)です。様々なFDDの改造手順が紹介されていますので、手持ちのFDDのうち該当するもの3台について改造してみました。


2種のTEAC FD-235HG


左がFD-235HG A122 (TB6048F)で右がFD-235HG 7304 (TB6022AF)です。
使用している制御ICの種類によってReady信号のピンが異なりますが、34ピンに接続されているDISK CHANGE信号をカットし、ICの該当ピンから34ピンにReady信号線を接続するだけです。


MITSUMI D353T5

D353T5の場合はDCH端子にハンダ付けされているチップ抵抗を、その下のRDY端子に付け替えるだけですので、元に戻すこともできます。(下図の左下の部分)



D353T5の改造部分



2DDドライブ用ステップ2倍化回路の修正は、FDC側のコネクタとFDD側のコネクタの34ピンを直結するだけです。
(下画像では修正線が何本もありますが、あれこれと改造した残骸でして必要なのは最下部の1本のみです。)

2倍化基板の修正(最下部の1本のみ追加)


改造した結果ですが、PIC12F675を外し、ATtiny85のプログラムは変更せずに動作しました。

しかし、FDDを改造するのはいかにも敷居が高いので、次に(2)のATtiny85のプログラムで対応することを試してみました。


(2)による方法


K-ichi's memoさんのブログによれば、MotorOnがアクティブの間、0.5ms毎に2000回(約1s間)Indexをチェックし、その間1度もIndexが出ていなかったらReadyではないと判断するとのことですので、そのアルゴリズムをそのまま使わせていただいてATtiny85のメイン部に追加しました。(K-ichi's memoさんに感謝いたします。)

プログラムリストを下に示します。

  1. int main(void)
  2. {
  3. int indexct = 0;
  4.  
  5. setup();
  6. while (1) {
  7. while ((PINB & 0x20) == 0) { //PB5:MotorOn?
  8. if ((PINB & 0x40) == 0) { //PB6:Index?
  9. PORTB &= ~_BV(3); //PB3=0:Ready On
  10. indexct = 0;
  11. for (int ct=0; ct<2000; ct++) { //check Index while 1s
  12. _delay_us(500); //delay 0.5ms
  13. if ((PINB & 0x60) == 0) { //MotorOn & Index?
  14. indexct++;
  15. }
  16. }
  17. if (indexct == 0) { //index off
  18. PORTB |= _BV(3); //PB3=1:Ready Off
  19. }
  20. }
  21. }
  22. PORTB |= _BV(3); //PB3=1:Ready Off
  23. }
  24. return 0;
  25. }

[2020年8月6日訂正]上記プログラム中の2000を5000に訂正します。(理由を最後尾に記述しました。)

2DDドライブ用ステップ2倍化回路の修正ですが、ATtiny85のピン配置をPB0:MotorON, PB1:Index, PB3:Readyとしましたので、ATtiny85 pin5,6,2をそれぞれPIC12F675のソケット端子のpin6,5,7に接続します。

[2020年8月2日追加」必要な追加配線を示す画像を追加しました。




改造した結果ですが、PIC12F675なしで無事に動作しましたので、FDDの改造が不要なこちらの方法の方が良いようです。

[2020年8月6日追加」上記のプログラムリストは2000回(約1秒間)チェックするというものですが、実は、このプログラムではOS-9Level1やLevel2のFDは正常に起動しません。起動時のメッセージを見ていると、どうも起動中の処理に時間がかかりすぎているようですので、2000回を5000回に変えてみたところ、OS-9も正常に起動するようになりました。
ということで、上記プログラムの2000を5000に訂正します。


2020年7月18日土曜日

ArduinoMega2560カードの紹介その後のその後

4月10日に紹介した「ArduinoMega2560カードの紹介その後(完結編)」で完結したつもりでしたが、その後行ったいくつかの試みを紹介します。
(1)部品配置を多少変更した新しい基板を製作しました。
(2)リフレッシュの方法を変更してみました。
(3)任意のファイルを指定してArduino2560からFM-7に送り込めるようにしました。

(1)ですが、USBケーブルを挿入しやすくするためにArduino2560カードの位置を少し左に移動し、カード上のリセットボタンが押しにくかったので基板上にリセットボタンを新設しました。
(2)ですが、リフレッシュ法を桜井さまが試された方法に変更してみました。
オリジナルのカードの考案者であるFS-Micro Corporationの桜井さまはDRAMのリフレッシュについて2つの方法を試みられました。
一つ目はMega2560の割り込みを用いる方法で、これはリフレッシュの仕様を完全には満たすことができない上にCPUがほとんどリフレッシュにかかりきりになってしまうので実用的ではないとのことです。二つ目はPICを増設しそれによってハード的にリフレッシュ信号を作るというもので、これは完全にリフレッシュの仕様を満たすことができ、CPUにも余裕があるので良い方法だそうです。

参考までに、桜井さまから頂いたPICを使用した基板を示します。


PIC使用の基板



しかし、FM-7上でArduino2560を動作させてメモリデータを読み出したり、データやプログラムを送り込んだりさせたいと考えていた思い付きハードでソフトに七転八倒のshujiakitaさんや私にとっては、殆どのCPU時間をリフレッシュに取られるにしても、残りのわずかな時間にデータ等の読み書きができて、その後6809に戻れれば良いので、ソフトのみでリフレッシュを行う手法もそれなりに有用だと考えました。

(3)ですが、任意のファイルをArduino2560が読み込んでFM-7のメモリに書き込めるようにスケッチを変更しました。

ということで、PICの追加なしでソフトのみでD-RAMのリフレッシュを行なうArduino2560カードを、WindowsとFM-7の間でプログラムやデータのやり取りを行うツールとして製作しました。


新基板
新基板


使い方ですが、Arduino2560へのスケッチの書き込みに使用したポートをそのまま使用しますので、TeraTermのポートをそのポートに指定し(もちろん、ArduinoIDEのポート指定はずらしておきます)、バイナリ指定をしてファイル送信を実行します。
送信するファイルの先頭には保存アドレス(2バイト)、ファイルサイズ(2バイト)を付けておきます。

動作中の様子


下のFM-7の画面で分かりますように、RUN直後にArduino2560に切り替わり、処理が終了した後、6809に戻り20行のLISTを実行しています。もちろん、複数回実行してもちゃんと6809に戻ってきます。


転送後に6809に戻っている


TeraTermの実行画面です。
データファイルの先頭4文字の保存アドレス、転送バイト数を読み取り、以降のデータを指定アドレスに書き込み、その後、そのデータを読み出しています。
続いてBOOT ROMの内容を読み出した後、6809に戻っています。


転送結果


以上、動作的には以前の割り込みを使用しないソフトでのリフレッシュ法の場合とそれほど違ってはいないように見えますが、不完全かもしれませんが正式のリフレッシュ法を用いているという安心感が得られました。

なお、割り込みによるリフレッシュ法の詳細とその適用結果については、FS-Micro Corporationの桜井さまがブログのArticle#256~265の10回に亘って詳細に解説されていますので、そちらをご参照ください。本稿に直接関係するのはArticle#261です。


2020年6月26日金曜日

FM-7/77用拡張PIAボードとP-ROMライタ

FM-7/77用拡張PIAボードとP-ROMライタの製作


P-ROMライタは持っているので、まれに必要になる2716のような古いデバイスも書き込みができるのですが、古い機種(ADVANTESTのR4945A)ですのでパソコンとの通信速度が9600baudと遅く、4MbitのROMを焼くときには読み込みに時間がかかりすぎて使う気になれません。
ということで、昨年TL866ⅡPLUSを購入しました。これは実に優秀で使い易くてしかも安いので言うことなしと言いたいのですが、残念なことに2764以前には対応していません(メーカーによりますが)。
大昔は自作の8ビット機用にROMライタボードを製作して使用していたこともあり、いつかは作ろうと思ってはいましたが実行する機会がありませんでした。
先日、プリント基板をまとめて発注することになり、ついでにということでROMライタ基板も作成しました。

元にしたのはマイコンピュータ「OS-9活用テクノロジー」(CQ出版社)中の「P-ROMライタ/エディタの製作(阿部英志著)」です。これは、2716から27512までに対応していますが使用するROMに応じてジャンパプラグを差し替えるというもので、その分簡素な回路になっています。

FM-7/77からはPIA(68B21)ひとつで制御するようになっているので、この部分を切り離して汎用の拡張PIAボードとし、フラットケーブルでROMライタボードと接続する形にしました。
(一体化して10x10cmのサイズに収めたもののプリント基板も一緒に作りましたが、製作の予定は今のところありません。)

回路図


拡張PIAボード


拡張PIAボードはFM-7/77の32Pコネクタに接続して使用するもので、FM-7では未使用のアドレス$FD9CにPIAのポートAを割り当てています。

P-ROMライタ

P-ROMライタはVPPの25V, 21V, 12.5VをTL497Aで作り出し、D-FFのLS273でアドレスとデータをコントロールしています。(TL497Aというのがいかにも古いという感じですが、幸い手持ちがありましたし、何と今でも入手可能なデバイスのようです。)


製作した基板


下左:拡張PIA基板 下右:P-ROMライタ基板
上:一体化した基板(製作予定なし)


いつもどこかでドジをする私ですが、今回は2SC1815のフットプリントが2.54mmピッチでなく1.27mmピッチであったことに気づかずにそのまま利用したり、ピッチが5.08mmの270uHや220uFのピッチを2.54mmにしたので、ハンダ付けがとてもしにくい部分がありましたが、配線パターンのミスはなかったようです。(部品を入手してから基板の設計をすべきなのですが、大体が逆のパターンになってしまいます...)


拡張PIA基板の動作テスト


まず拡張PIA基板を製作し、動作テストのつもりで、以前紹介した、PIAを用いてI2C通信によってRTCから時刻の読み出し/書き込みをするアセンブラプログラムを走らせてみました。


拡張PIA基板の動作テスト



Flex9上でRTCを読み書き


正常に読み書きできましたので、このPIAボードが正常に機能していることが確認できました。


P-ROMライタ基板の製作


続いてP-ROMライタ基板を仕上げ、ジャンパプラグも2716用、2732用、2764用、27256用の4種類を作成しました。20Pの丸穴ICソケットを利用しています。



完成した基板

ジャンパプラグ
(左から2716, 2732, 2764, 27256用)


動作風景


試しにP-ROM 27C256を書き込んでみましたが、正常に書き込むことができました。
ただ、今のところ2716にはうまく書き込めていません。(手持ちの2716が古すぎるせいなのかも...)


ドライバソフト


このROMライタのドライバソフトはOS-9上で動作するもので、コマンドも多く、データのスクリーンエディットもできるなど機能豊富なものですが、OS-9は一般的ではないので、他のOS(?)に移植しなければなりません。
とりあえずそのままOS-9上で動作させるということでしばらく触れていなかったOS-9を走らせてみましたが、使い方をかなり忘れてしまっていて、思い出すのに苦労しています。
(でも

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コネクタを外して使用しました。)