記事の個別表示
タイトル  久々にZ80にはまった(2023年6月)
本文  

(pp0コマンドで、ROMベースからRAMベースに切り替えた画面)


(ネットに触発されて、これを作ってみた)


ネットをググってZ80の記事に出くわした。(https://vintagechips.wordpress.com/2018/09/10/aki-80%e3%81%a7basic%e3%82%92%e5%8b%95%e3%81%8b%e3%81%99/)それは、AKI-80でBASICを動かすと言う物だ。Grant’s BASICを割込みモード2を使って動かすと言う所に、興味がひかれた。実は、私自身、もう何年も前に、このBASICをAKI-80に移植する事は出来ていた。Yahooの検索ページで、「Z80 BASIC Ver 4.7b」で検索してみると良い。そこに出て来る「~.asm」 を選んで、比べてみると良い。アセンブラーの表現は違うが、コードが同じものが存在する。ここに出て来るコードと、秋月のサンプルに有った入出力のコードを合わせると、ちゃんと動いた。ただ、今の時代に、遊べるのかと言う疑問が湧く。

【ハードの入手】
秋月のZ80と言えば、PC-9800が活躍していた時代だ。そこで、一つ一つ、確認してみる事にした。まず、AKI-80の入手だが、スパーAKI-80は、保守部品として基板のみの販売になっている。AKI-80ゴールドボードは、今時点で、@1400で今でも販売されている。だが、そこに使われるROMは、リストにない。ネットをググった記事には、AMAZONで入手可能と言うのが有った。そこで確認だ、検索を掛けると、M27C256B-10F1が10個で1714円と言うのが有った。ネットに有ったのだから、良品として使えたのだろうと思う。自分は、10個くらいなら既に持っているので、今は、買わない。これから始める人にとっては、 ハードは、どうやら揃えられそうだ。
ROMを扱うには、RomWriterが必要だが、これもAMAZONなら数千円で入手できるし、始めるなら、それを買った方が良い。書き込まれたROMの消去には、私の場合は、自分で作った紫外線蛍光灯が有るが、買っても大した金額にはならない。取り扱い上の安全性を考えたら、入手できるのだから、買った方が良いと思う。

【ソフトの入手】
ネットで見た上記の記事に有るHEXファイルをROMに焼いても、問題なく動作した。丁寧な説明と、解説に、感謝したい。自分で何かやるには、ソフトはどうかと言えば、まず、アセンブラーだ。お世話になったXA-80.EXEは、検索すれば、今でも入手できる。だが、いくら何でも64ビット版のWindows11では動かない。64ビット上で32ビットのMSDOSを動作させるには、まず、32ビットのMSDOSを起動する。方法は、ググると、(https://pasomaki.com/windows-32bit-cmd/)が分かり易い。32ビットから16ビットは、「MS-DOS Player for Win32-x64 console」で検索すると、(http://takeda-toshiya.my.coocan.jp/msdos/)で見つかる。起動するホルダーを決めて、そこにmsdos.exeとXA80.exeを入れて、「cmd msdos.exe -b」などと言うバッチファイルでMSDOSを起動する。プロンプトが出たら、「>msdos xa80」とすれば、16ビットが難なく使える。これで、前の記事に掲載されているソースもインテル仕様のHEXファイルにすることが出来る。

【参考書】
Z80のCPUが時代を超えて何故40年も君臨するのかと言えば、使いやすいからだと言うのが私の思う所だ。アセンブラーでゴシゴシとやりたい事を書いて、HEXファイルにする。そのアセンブラーが分かり易い。それに尽きると思う。今更と言うか、今からと言うか、Z80をいじるなら、ぜひ欲しい一冊は、「Z80ファミリ・ハンドブック(額田忠之著)」が良い。ネットをググるだけでは入手できない情報が体系的に載せてある。バイブルと呼びたいくらいに重宝する。

【改良その1(時計の追加)】
これもネットだが、AKI-80でBASICを走らせ、「マンデンブロー」のプログラムを走らせるのが有った、そのマンデンブローのプログラムを早速走らせてみる。時間の計測が有ったので、10MHz版と、12MHz版で計測する。だが待てよ、ネットでは、Z80で時間を計測している。前の記事では、時計機能は付加されていない。M2割込みを使うなら、そのつぃでに時間機能を付けたら良い。そこで改良だ。BASICに時間計測のコマンドを追加したいが、Grant’s BASICは、複雑で良く分からない。仕方ないので、割込みで時間を刻み、PokeとPeekでそれを知る方法にした。時間計測の結果をWRKSPCの列に追加すると、あれ!動かない。どうやら、中身はいじらない方が良いとして、WRKSPCの前に、大胆にも256バイトを割り当てて、そこにミリセコンドから日にちまでを割り振った。これで、何とかなった。

(時計機能を追加した。10MHzのRAM上のBASICで計測)

【改良その2(入出力の追加)】
AKI-80には、入出力としてPIOが使える。これも使いたいよねと言う事で、入力か出力か、取り敢えず簡単に使える様にプログラムを追加した。ここまでくるとさすがにPokeとPeekだけで事をすますには、面倒くさい。ソースをよく見ると、Key Wordに空きがある。その一つを使ってコマンドとして追加するのが良い。だが、数値処理などどうなっているのか、解析する気は無い。そこでPIOのAポートをPP1として、BポートをPP2として、出力、または、入力する方向とデータをPokeとPeekで、実行はPPをコマンドとして分ける事にした。数字の1か2かの区別は、PeekコマンドやPokeコマンドを追うと、「CALL GETINT」と言うコマンドで知る事が出来ると分かる。コマンドの帰りが、1なら、Aポートの処理を、2ならば、Bポートの処理をするとすれば、機能が追加できる。序に言えば、3とか数字を使えば、いくらでもコマンドの追加が出来そうだ。

【改良その3(Loadコマンドの追加)】
ここまで来ると、いろいろ問題も見えて来た。まず、環境は、Windows側は、TeraTermだ。設定、シリアルポートの設定で送信遅延を設定せずに、「マンデンブロー」を送信する。ネットでググって、今回の切っ掛けを作ってくれたM2の割込みだが、取りこぼしが発生する。取りこぼしが発生すると、その後の動作が可笑しくなる。具体的に言えば、例えば、listと打ったとしよう。キーで入力はしたものの、表示が欠ける。lisまでが表示されtが出てこない。エンターキーを押すとなんと、tが追加される。取りこぼしが発生しない様に送信遅延を30ミリ秒位に設定すれば良いのだが、プログラムが大きくなれば、それも保証できない。これは直したい。ちなみに、冒頭に紹介した秋月のサンプルに有った入出力のコードを合わせた同じBASICでは、取りこぼしが生じても、この様な現象は発生しない。そこで、作者のM2プログラムに手を加えるのだが、そう簡単には、直らない。これは参ったなと言う事で、やるなら、その準備からと言う事で、「Load」コマンドを追加した。これは、コマンドの空きの2つの内、一つをちゃんと割り当てる事にした。つまり、loadと入力すれば、Readyと表示され、インテル形式のHEXファイルを送信してやればよい。止める時は、Ctrl+Cで取消が出来る。

(Loadコマンドの追加)

【改良その4(64KのRAM化)】
考えてみればと言う事なのだが、loadコマンドを追加してプログラムを試すのは良いのだが、大方は、失敗する。それがこの手のプログラム開発だ。その度に、電源リセットをする。リセットボタンを追加しても良いのだが、それ専用の、つまり、プログラム開発用のAKI-80を作って見ようと考えが固まった。もともとBASICが動くAKI-80を作っても、それを何に使うのかと言う事が課題だった。そこに手段が目的化して、目標が出来た格好だ。プログラムを作る。それ全体をloadコマンドで読み込み、Aki-80で動かす。ROMには、完成した時点で焼く。そんな段取りだ。それには、64KのRAM化が必要だが、これもネットをググると色々出て来る。どれも、はっきり言ってめんどくさそうだ。そこでネットをググった知識とほんのちょっとだけ、自分の頭で考える事にした。言うなれば、ここがこの記事の本番かも知れない。

{改良その4の1(仕様の考察)}
AKI-80は、0000~7FFFがROMに割り当てられている。そこをバンク構造でRAM化すればよい。ここまでは、すんなり出て来る発想だ。バンク切替をキーワードのググると、ICの139を使えば良いと分かる。ネットの例では、CSつまり、チップセレクトを使う方法だ。だがこれでは、loadコマンドで書き込みが出来ない。CSを使って切り分けるのではなく、OE(アウトプットイネーブル)を使ってRAMはいつでも生きているのだが、出力しない、或いは、ROMに変わって出力すると、これを切り替えるのが良いとなる。そこで問題となるのが、バンク切替のタイミングと言おうか、方法だ。何か、コマンドを送って切り替えるのは、ネットでは、フリップフロップを使う方法など追加の回路が必要だ。それは面倒だ。いっそ、Super Akiにして、RAMをバッテリーバックアップして、電源を切っている間にROM/RAMを手動スイッチで切り替えてはどうかと思った。多分、旨く行くのだと思うが、調べると、リセットICの入手が難しそうだ。前にメンテナンス用のボードを買って、それに気が付き、リセットICを別のメーカのICに置き換えた事がある。苦労した経験が有るので、お勧めできない。あくまでも、現在の話として考えたい。そこでふと思い出したのが、参考書に有るSIOのDTRは、好きな用途に使用できるの文言だ。良し決まった、SIOのDTRを信号にして、139を操る。バンク切替を行う事にした。

{改良その4の2(AKI-80の準備)}
RAMに書き込むには、WR信号を外に出さなくてはならない。コネクターのCN4には、使われていないピンが、1と2とある。そこで、AKI-80の裏面のIC32から、具体的に言えば、6番ピンからCN4の2番ピンに配線を追加する。序に言えば、CTC3からSIOの配線も裏面で追加する。AKI-80の準備はこれでおしまいだ。これだけならば、AKI-80を別の用途にも転用できる筈だ。

(AKI-80の裏面の様子。CTCからSIOへの配線と、WR信号の配線が見える)
(抵抗は、リセットICを代用したために必要になった物で、通常は必要ない)

{改良その4の3(RAMの半田付け)}
改良と言おうか、制作と言おうか、細かい作業なので、ここがはんだ付けの腕が必要になる。秋月のP-11414基板を準備する。32ピンだ。ROMが28ピンなのに32ピンだ。余った4つは、リード線の取出し用とするためだ。無くても良いと考えると、ROMを抜き差ししている内に半田個所がポロリと取れたりして失敗する。RAMのはんだ付けは、まず基板の電極にはんだを塗る。温度は高めで良いと思う。次にRAMの足を曲げておく。曲げるのは、1番のA14、22番のOE、27番ピンのWRの3本。それぞれのRAMの足にはんだ用のワックスを塗り、はんだを塗った基板に位置合わせをする。半田ごての先をRAMのそれぞれの足の上から押しあてて、下の基板のはんだを溶かしてRAMの足とくっ付ける。YouTubeなどで、ICのはんだ付け作業をうまくやる方法が紹介されているが、うますぎでマネが出来ない。RAMの1番ピン(A14)にリード線をはんだ付けして、基板の27番電極にはんだ付けする。そこはちょうど、RAMの足を曲げた下の電極になる。ここまでの作業が終わったら、拡大レンズで、ちゃんと半田されたか、一本一本確認しておこう。ここは、隠れてしまうので、トラブっても確認が出来ないからだ。

(綺麗に足のはんだ付けが出来ている様子)


(A14にはんだの様子)


(上から見るとこんな格好になる)

{改良その4の4(足のはんだ)}
RAMの曲げたピンにはんだ付けをするのだが、その前に、基板の頭の4つの穴にリード線が通るようにしておく。リード線が細ければそのままで良く、太ければ、ドリルなどで穴をさらって大きくしておく。穴の準備が良ければ、RAMのWR、つまり、27番ピンにリード線をはんだ付けしてリード線を穴に通す。同様に、RAMのOE,22番ピンにリード線を半田付けして穴に通しておく。次は、秋月の細ピンを準備する。これを寸法精度を高めるため、ICソケットの丸ピンが良いと思う。そこに細ピンの樹脂側、つまり短い方を入れて、長い方を基板の穴に通す。通したら丸ピンソケットが外れないようにしてはんだ付けをして固定する。基板のOE、つまりROM足の22番に当たるピンを、外側に曲げる。(外に曲げるとカッコ悪いが、要らぬトラブルを避けるため、明確に外側にした方が良い)。曲げたピンにリード線をはんだ付けして、同様に穴に通しておく。ここまで準備できたら、次は、基板の上にROM用ソケットをはんだ付けする。まず、28ピンのICソケットの22番ピンは、外側に向けて折り曲げ、そこにリード線をはんだ付けしておく。基板のピンやROM用のICソケットは、あらかじめはんだを塗るなどしておいた方が良いかも知れない。慎重に基板から出たピンとROM用のソケットにピンを位置合わせしてはんだで固定する。固定できたら、ROMソケットからのリード線も基板の穴に通しておく。どの線がどれだか分からなくなるので、私は、基板の1番には、ROMソケットからのOEを、基板の2番には、RAMからのOEを、そして、31番には、基板からのOEを穴に通し、RAMのWRは、32番にしている。はんだが済んだら、細ピンの樹脂をドライバーなどを使ってピンを曲げない様に注意深く取り除く。最後に、はんだが確実に出来ているのか、テスターで導通確認をしておく。

(丸ピンソケットに上に細ピンを立てる。足の長い方を上にする。)


(32ピンの基板と、28ピンのソケットの位置関係)


(横から見た写真)


(完成したROM/RAM 基板)


(横からの外観)

{改良その4の5(パソコンとの接続回路とバンク切替回路)}
パソコンとの接続は、USBシリアル変換モジュールを使う。具体的には、秋月のK-14745だ。AKI-80のCN2コネクターの④RXDAにシリアル変換基板のTXDと、CN2コネクターの⑤TXDAとRXDを接続する。クロス配線になる。AKI-80の電源も、シリアル変換基板からもらう。シリアル変換基板とIC139を同じ基盤に付ければ、まとめられるので、都合が良かった。IC139は、まず電源配線を済ませる。8番ピンがグランドで、16番ピンがVCCつまり、5Vだ。1番ピンには、ROM/RAM基板からの基板側のOE信号をつなぐ。2番ピンは、DTRB信号を入れる。AKI-80のCN2の13番からの信号をつなぐ。もう一つ、この信号を適当な抵抗で、わたしのばあいは、39Kでプルアップしておいた。これ大事です。139の3番ピンは、グランドです。4番ピンが、RAMのOE、5番ピンがROMのOEにつなぐ。ROM基板のWR信号線は、AKI-80で改良その4の2で述べたCN4の2番ピンにつなぐ。これで配線は終わりかな。

(部品配置の様子)


(裏面の配線など)


{改良その4の6(バンク切替のプログラムの追加)}
まず、ここまで間違いがないか、BASICが書き込まれたROMを付けて、起動してみる。無事起動できたら、キーボードからpp 0とコマンドを入れてみる。RAMバージョンの56702 Bytes freeが出れば、うまく行ったという事でめでたしめでたし。RAMバージョンのBasicからROMバージョンのBasicに戻るのは、やはり同様にPP0と入れてやる。途中でどっちが起動しているのか分からなくなったら、resetコマンドが役に立つ。

(完成して、いろいろテストをする)

【反省、その他】
①AKI-80の64KRAM化をしたら、それがいつの間にか、目的となってしまい、M2のオバーフロー問題は、どうでも良くなってしまった。と言うか、M2を使っても他の方法でも、送信遅延を適当に入れれば、良いではないかとなってしまった。と言うか、M2問題は、結構難しそうだし、もしかしたら、エラーの処理をすればよいのかも知れない。となれば、簡単かもしれない。試すために作った積りだが、後になって、重大な問題に気づいた。特にM2でSIOの割込みを使う場合だ。バンク切替をSIOのBポートを利用している。つまり、簡単にBポートをリセットできないと言う問題だ。リセットすれば、ROMに戻ってしまう。やはりちゃんとした物に仕上げるには、SIOのDTRを使わずにPIOを犠牲にするか、Super AkiでRAMの電源を確保して、電源を切って、RAMに切り替えて起動と言う構想に従うか、それが良いとなる。だが、今の時点で誰にでも入手できる部品でと考えると、そう簡単には、確保できないと思う。
②次は、プルアップ抵抗の挿入だ。はじめは、なくても良いと考えていた。真理値表では、HかLだから、何か、初期値が有って、それに従うと。で、どっちなんだとテスターで確認すると、どうも L らしいが、値が安定しない。ならばプログラムで安定させるまでプルダウンだと抵抗を入れたが、旨く行かない。プルアップにすると、IC139のY0をRAMにY1をROMにしなければ、真理値のつじつまが合わなくなる。だがうまく動作する。ここがすっきりしない点だ。SIOのBポートではなく、他の方法を用いるときは、ROM/RAMが逆になるので、そこを注意した方が良いです。
③基板を使ってのRAM/ROMの2階建ては、結構気に行ってます。

最後に、ソースと、HEX、それにLSTファイルを添付します。質問などは、あてにならない返事としてお待ちいただけるなら、office@ohayou.jpへお願い致します。また、ソースに付いては、参考先のソースがそのまま入っています。まずければその部分を削除するか、書き変えます。

ソース:M2Watch2.asm

12345678910...