雑記帳 ― 電子工作

過去の雑記帳(電子工作)
2004/8〜2006/12

「真空管アンプ自作の醍醐味」ホームページへ 「パソコン自作の部屋」トップページへ


07/01/14
キャラクタ・ディスプレイ・ボードの完全自作

06/12/30
プラパズルの解答をすべて求めるプログラム

06/12/26
アセンブラ言語の導入

06/12/16
プリンタを購入して楽しさ倍増

06/12/09
デジタル時計の自作

2007/1/14 - キャラクタ・ディスプレイ・ボードの完全自作

まずは先回の記事(2006/12/30)の訂正です。この記事でご紹介したプログラムと解答のプリントアウトは、「プラパズル No.783」(テトロミノ)の解答ではなく、パソコン関連誌にクイズのような形で掲載された別のパズル(1つ駒が5つの正方形で構成されている「ペントミノ」というパズル)の解答でした。

「プラパズル No.783」の解答については、下のようなプリントアウトが残っていました。出力された組み合わせの数は820通りです。

プラパズル No.783のプリント・アウト

ただ、発売元のテンヨーのカタログを見ると、組み合わせの数は「783通り」と書かれていますので、探索プログラムのアルゴリズムに少しミスがあり、パズル枠を180度回転させると同一になる組み合わせパターンなど、重複した解答がいくつか出てしまったのだと思います。

CRT自作の参考書

それでは、本題に移ります。今回ご紹介するのは、右の本を参考にして自分で回路を設計し、自作した「キャラクタ・ディスプレイ・カード」です。おそらく、1981年(高校2年生)の夏休みを利用して製作したものだと思います。

この本の中に「任意に書き換え可能なキャラクタ128種をもつ RAM構成キャラクタ・ディスプレイの製作」という自作解説記事が載っていました。その当時のマイコンの表示装置として一般的だったのは、7 × 9 ドットや 5 × 7 ドットで構成された文字を120種類程度、テレビ画面上に 32桁 × 16 行程度ほど表示できるというタイプのもので、「キャラクタ・ディスプレイ」と呼ばれていました。私がこの雑記帳(2006/11/4)でご紹介したCRTディスプレイ・カードもそのタイプです。 参考書に載っていたディスプレイ装置

それに対して、この製作記事で紹介されたディスプレイ装置では、1文字を 8 × 8 ドットで表現し、それを 32桁 × 32 行として正方形で表示できるようにし、しかも表示する128種類の文字のドット・パターンもRAM内にマイコンから書き込めるというものです。このドット・パターン用のRAMに通常のASCIIコードの文字パターンを入れれば、一般的なキャラクタ・デイプレイ装置として利用できます。逆に 32桁 × 32 行の文字コード用RAMのほうに一定のコードを固定的に入れておき、ドット・パターン用のRAMの内容を逐次マイコンから書き換えてやると、いわゆる「グラフィック・ディスプレイ」としても利用できるわけです。あるいは、通常の文字と、今のパソコンで言う「外字」を同時に表示させることもできるはずです。

そこで私が自作しようと思いついたのは、完成品を購入したTVD-02に搭載されているキャラクタ・ジェネレータROM(5 x 7 ドットの文字パターンが記憶されている読取り専用メモリー)と、書き換え可能な128文字分のドット・パターン用RAM(読み書き可能メモリー)の両方を装備したキャラクタ・ディスプレイ装置です。このような構成にすると、TVD-02で表示できた128種類の英数字とカナ文字のほかに、任意の外字のドット・パターンを128文字分マイコンから自由に書き込んで、画面に表示できるようになり、各種のゲームなどを作成する際にグラフィック・ディスプレイ的な使い方が可能になります。

その頃、私がデジタル回路等を設計・製作する際には、グラフ用紙に原図を書き、製作時には原図をコピーした紙を見ながら配線を進め、配線が終わった部分は色鉛筆でなぞる、という手順で行なっていました。色は、配線に使ったリード線の色を使います。そのように使用したコピーが手元に残っていましたので、ご紹介します。B4版の紙にB5横の回路図が2枚コピーしてありました。

オリジナル・ディスプレイ装置の回路図(1) オリジナル・ディスプレイ装置の回路図(2)

1枚目はテレビの水平スキャンの周期に合わせて白か黒かを示す信号を生成する回路で、2枚目はキャラクタ・ジェネレータROMとドット・パターン用RAMに収容されたドット情報を文字コードを入れたRAMのコードに応じてテレビ信号出力部へ0か1のデジタル信号を送り込む回路です。今の私では、この回路図の詳細まで理解することができません。よくもこのようなものを設計し、自作したものだと、我ながら驚きました。

実はこの装置には1つ厄介な問題があり、結局解決には至らなかったのですが、キャラクタ・ジェネレータROM内の文字とドット・パターン用RAM内のグラフィックを並べて表示すると、その2文字の間に少し縦線が入ってしまうという状態でした。色々調べたところ、そのROMとRAMのアクセス速度の差が微妙に作用して、そのような状態になっていることが分かりました。アクセスの速いほうのデジタル信号を少し遅らせる回路などを参考書から引っ張り出して付け加えてみたりしましたが、完全な解消には至らなかったと記憶しています。今のパソコンで言えば、RAMボードを増設したときにメモリー・チップのタイミングの関係でパソコンがうまく動かなくなる状態に似た問題ですね。

最後にお見せするには、この“完全自作版キャラクタ・ディスプレイ・ボード”を利用しようとして、外字を方眼紙に書き込んだ様子です。これは、高校2年生の11月に行なわれる学校の文化祭で「化学部」の展示の1つとして「化学クイズ」を出展しようとして計画していたものです。クイズを出題するプログラムも作成してありました。ただ、結局は時間切れで、タクシーでデスクトップ・マイコン等一式を学校まで運んだのですが、クイズを皆さんにお見せすることはできませんでした。実はこのとき、マイコン雑誌に載った記事を参考に、音声を録音・再生するプログラムを使えるようにしてありましたので、もし完成していれば「正解です!」「間違いです!」という音声を内蔵スピーカーから出力できるはずでした(かなり不明瞭ですが…)。

外字の作成

また、外字をフルに活用して、野球のグラウンドをテレビ画面上に表示し、本格的な野球ゲームを作ろうともしたのですが、さて、どうやって野手の動きやボールの動きを決め、画面上の表示を動かしたらいいのだろう? と、アルゴリズムを考案するところで行き詰ってしまい、実現できませんでした。残念!

次回は、私のデスクトップ・マイコンで最後に作成したゲーム・プログラムについてお話しようと思います。

 このページの先頭へ 

2006/12/30 - プラパズルの解答をすべて求めるプログラム

プラパズル No.783

皆さん「プラパズル」をご存知でしょうか? 私が子供の頃に購入したのは「いちばん やさしい」というプラパズル(NO. 783)と、「いちばん むずかしい」というプラパズル(NO. 24)です。「いちばん やさしい」のほうは、自分でも色々な組み合わせでパズルを並べ替えることができました。しかし、「いちばん むずかしい」のほうは“あと一息”のところまではたどり着くのですが、結局、最初に入っていたときの状態以外の組み合わせを完成させることができませんでした。

下の写真が「いちばん むずかしい」という NO. 24 のプラパズルです。よく見るとセロハンテープの跡が付いていますよね。これは、落としたりして駒がケースから飛び出してしまうと、いちばん最初にピッタリ治まっていた状態に戻すのにたいへん苦労するので、その防止策です。

プラパズル No.24

たぶんマイコン系の雑誌にプラパズルの組み合わせすべて探し出すプログラムのアルゴリズムの記事を読んだことがきっかけで、自分のマイコンでもそのプログラムを作ってみようと思い立ちました。まずは、「いちばん やさしい」のほうに挑戦です。

アセンブラ言語を使えるようになりましたから、機械語でのプログラミングやデバッグの効率が格段にアップし、1982年2月(高校2年生)のときにプログラムを自作できました。次のようなプログラム・リストが手元に残っています。

プラパズルの組合わせを見つけるプログラム

プログラムのサイズは904バイトと小さめですが、典型的な後戻り法(Back-tracking; バック・トラッキング)アルゴリズムのプログラムで、パズルの駒をひたすら順番に様々な方向で置いてみて、もし枠からはみ出したり、他の駒と重なったりしたら、前へ戻って別の駒を試す、という作業の繰り返しです。したがって、実行時間が非常に長くなります。CPUの動作クロックが2MHzのマイコンで、どの程度の時間が掛かったのかは忘れてしまいました。もしかしたら一晩中動かしていたかもしれません。

いずれにしても全ての組合わせを見つけ出すことができて、解答の数は「2339通り」と分かりました。このプログラムでは、グラフィックス・プリンタのGP-80Mの機能をフルに活用して解答のパターン図も印刷するように作ってあり、次のような形でプリント・アウトしました。

プラパズルの組合わせのプリント・アウト

残念ながら、プリンタ出力プログラムにバグがあり、最後の3つのパターンは正しくプリント・アウトされませんでした。

プリント・アウトのバグ

この頃のマイコンの世界ではまだ「ファイル」という概念が確立されていませんでしたので、組合わせの解答が見つかるたびにメモリー内にそのデータを記憶し、プリンタ用紙の幅に収まる8通りずつ順番にプリントアウトするようにプログラムを作ってありました。プリントアウトの後、メモリー内の解答データはクリアしました。というわけで、最後の3個のデータをメモリーから読み出してテープに保管し、それを読み込んでパターン図をプリント・アウトするプログラムを作ればよかったのですが、そこまでは挑戦しませんでした。そして、デバッグして再挑戦した形跡もありませんから、やはり非常に実行時間の長いプログラムだったのだろうと思います。

「いちばん やさしい」プラパズルを制覇した後、「いちばん むずかしい」プラパズルにも挑戦しようとプログラムのアルゴリズムを考え始めたのですが、1つ1つの駒が7個の正三角形の組合わせで構成されているため、メモリー上で駒の配置をどのように表現するかを考案するのに苦労し、結局プログラミングするところまで行きませんでした。今のパソコンの速度なら、組合わせが10万通り以上あると言われているこのパズルの解答をすべて見つけ出すことも可能だと思います。もし時間があれば挑戦してみたいですね(今の私では頭の柔軟性が落ちていて無理かな?)。

次回は、私のマイコンの最終形態となったハードウェア関連の拡張についてご紹介しようと思います

 このページの先頭へ 

2006/12/26 - アセンブラ言語の導入

私のマイコンにプリンタを接続できるようにした頃には、徐々にメモリーも買い足していき、最大の16KBまで増設してあったのではないかと思います。そして、色々なソフトを導入できる状態になりました。

真っ先に導入したのは「アセンブラ言語」です。アセンブラ言語のプログラムそのものは雑誌に載ったものを使用したと思いますが、手元に資料が残っていませんでした。残っていたのは、次のようなハンド・アセンブルしたプログラムです。

アセンブラ=エディタ用外部ルーチン

「アセンブラ=エディタ用外部ルーチン」と書かれているとおり、この自作プログラムは、導入しようとしていたアセンブラ言語プログラムを利用するのに必要な外部ルーチンを自作したものです。なんと9ページもあり、プログラムの長さは1964バイトでした。これだけの規模のプログラムをハンド・アセンブルするのは、相当たいへんだったのではないかと思います。

そして、プリンタを導入した際に自作した「メモリー・ダンプ」プログラムで、さっそくこの外部ルーチンのダンプ・データを印刷しておきました。これは、万一このプログラムをテープに保存したものをマイコンに読み込めなくなった場合に、プログラム・データを再入力するとき便利に利用できます。

外部ルーチンのメモリー・ダンプ

アセンブラ言語を利用できるようになると、マシン語プログラムの自作が非常に楽になり、色々なプログラムを自作するときに活躍してくれました。

手元に残っていたプログラム・リストに、次のようなものがあります。「BASIC改造版 I/O (Ver.1)」となっていますね。このプログラム・リストをざっと眺めて見ましたが、以前に使用していた“ハンド・アセンブル版”のI/Oプログラムのリストが残っていないため、どこを改造したのか思い出せませんでした。

BASIC用外部ルーチン

ただ、このプログラム・リストを見ていくと、アセンブラ言語のありがた味がよく分かる箇所が見つかりました。次のような部分です。

プログラムのデバッグ箇所

プログラムのデバッグ中に、機械語命令を3つ追加している箇所がありますよね。ハンド・アセンブルの場合、このような修正を加えると、たいへん面倒なことになります。命令を追加した箇所より後に、他の箇所からジャンプする飛び先や、コールするサブルーチンなどがある場合、命令を追加した箇所より前を含むプログラム全体に目を通して、修正の必要な箇所を漏れなく見つけて直さなければならないのです。

しかし、アセンブラ言語で機械語にアセンブルできるようになると、エディタで命令を追加したのち、再度アセンブルすれば簡単にプログラムを修正できます。これを手にしたとき、何か“文明の利器”を入手したような気分になったことを覚えています。

さて次回は、アセンブラ言語とプリンタが大活躍したプログラムをご紹介しようと思います。

 このページの先頭へ 

2006/12/16 - プリンタを購入して楽しさ倍増

中学2年生の夏休みに完成させた“フルキーボード搭載デスクトップ・マイコン”(雑記帳 2006/11/11)は、高校生になってからもいろいろと遊んでいました。そんな中で、たいへん心惹かれる製品が精工舎(現在のセイコーエプソン社の前身)から手頃な価格で発売になり、購入することができました。

精工舎のプリンタ仕様書

それは「プリンタ」です。仕様書の表紙に「Graphic Printer」と書かれているとおり、このプリンタでは 横7ドット × 縦5ドット で表現された160種類の文字(英文字、数字、カタカナ、記号)を印字できるだけでなく、縦7ドットで表現した任意のグラフィックスも印字することができるという多機能プリンタです。使用する用紙は幅8インチで両脇にピン・フィード用の穴があるプリンタ専用紙で、横80桁まで印字できます。インク・リボンを使用して「インパクト・ドット」方式で印字されます。

このプリンタで印字したプログラム・リストなどの日付を見ると、このプリンタを手に入れたのは1981年の夏頃のようで、それは私が高2年生のときです。

このプリンタを使えるようにするには、ハードウェアとソフトウェアの2つの分野で私の“デスクトップ・マイコン”を拡張する必要がありました。

まずハード面では、マイコン側に「セントロニクス方式のパラレル出力」の端子とちょっとしたインターフェイス回路を追加する必要がありました。おそらく、仕様書に載っていた参考用のデジタル回路を見ながら自作したのだと思います。

次にソフト面では、プリンタの仕様書に準じて出力データを生成してI/Oポート経由でプリンタに送り出すプログラムが必要です。これは、機械語をハンド・アセンブルして自作しました。

…と、簡単に書きましたが、実際にはかなり苦労し、試行錯誤しながら使えるようにしたのだと思います。しかし、データをプリントできるというのがいかに便利なことか、使ってみて痛感しましたから、その苦労は確かに報われました。

たとえば、作成したBASICプログラムの内容をプリントアウトすると、データとして保存できることはもちろん、紙にプリントアウトしたプログラム・リストを見ながらデバッグすると、効率が格段にアップします。また、指定した範囲のメモリー内のデータを出力する「メモリー・ダンプ」プログラムも機械語で作成し、いろいろな用途に活用しました。

お遊びで作成した、下のようなカレンダーが手元に残っていました。このカレンダーを見てお気付きのとおり、このプリンタでは「横2倍角文字」も印字できます。

プリンタで印字したカレンダー

このプリンタはその後も活躍し、特にアセンブラ言語を利用できるようになった時、このプリンタは大いに役立ちました。次回は、アセンブラ言語の導入についてご紹介しようと思います。

 このページの先頭へ 

2006/12/09 - デジタル時計の自作

今回から高校生以降での電子工作の思い出をご紹介していくつもりでしたが、記憶をたどってみると、下の写真にある「デジタル時計」を自作したのが中学3年生の頃だったと思いますので、そのときの苦労話など書いてみようと思います。

写真から分かるとおり、トグル・スイッチやプッシュ・スイッチ、それにセレクタつまみなどが所狭しと並んでいますよね。これは、このデジタル時計に使用した「MK50362N」というモステック社製の多機能デジタル・クロックLSIの機能をすべて操作できるように組み立てたからです。24時間アラームを2種類セットしたり、スリープ・タイマー(1〜59分間)をセットしたり、日付を表示したり、BCL(短波放送の受信)などに便利な「別時間帯(この時計では“GMT”)の時刻表示」に切り換えたり、実に様々な機能をこのデジタル時計は備えています。写真では分かりませんが、時計の動作中はコロン(:)が1秒ごとに点滅します。

記憶があいまいなのですが、確かこのLSIは、専用基板と4桁表示の7セグメントLEDがセットになって販売されていたと思います。それで、自分で用意したのは、ケース、電源回路のパーツ、パネル面のスイッチ類などです。

ケースは、デジタル時計として見栄えが良いと自分で思えたものを店頭で見て選んだのですが、パネル面にLED用の四角い大きな穴を開けるのに大変苦労したことを覚えています。パネル面はアルミですが厚さが2mmだったため、当時ハンドドリルでケース加工をしていた私にとっては“難敵”でした。必要な四角い枠をマジックで書き込み、その枠に沿って3mmの穴を次々に開けていくだけでも、大変な労力でした。その後、穴と穴の間をまずは細い金属やすり(丸型)で削ってつないでいこうとしたのですが、厚さ2mmのアルミ板なので削るのに非常に時間が掛かります。そこで「タガネ」という工具を購入して穴と穴の間に切れ目を入れることに挑戦しました。タガネをハンマーで叩いて切れ目を入れるとき、耳が痛くなるほどの大きな音が出て、さぞ近所迷惑だっただろうと思います。さんざん苦労してやっとLED用の枠穴が開きましたが、まだ枠穴の各辺がギザギザのままですから、幅広の平ヤスリで懸命にギザギザを平らにしていき、ようやく枠穴の加工が完了しました。確か完了まで何日も掛かったと思います。でも、完成してデジタル時計が動き始めたとき、その苦労が報われたと感激しましたね。

時刻の設定は「時の桁」と「分の桁」を別々に前進/後退させることができます。ただ、例えばアラームが鳴ったときにときに音を止めようと思って「アラーム」スイッチ(ON-OFF-ONの3点切替タイプのトグル・スイッチ)を中点にしようとしたとき、間違って「時の桁」と「分の桁」の前進/後退のプッシュ・スイッチを押して時刻がずれてしまう“事故”が多かったため、後から背面にスイッチを増設して、そのスイッチをオンにしたときにのみ「時」と「分」を設定できるように改造しました。

また、アラーム時刻として設定した時刻になったとき、アラーム音を鳴らすモードと、リレーを駆動して何かの電気装置(このLSIの解説書では「ラジオ」と説明されていました)をオンにするモードがありましたので、それも活用できるようにしました。アラーム時刻に「オン」にするか「オフ」にするかも設定できるように背面に切替スイッチを取り付けました。最初はリレー接点の許容電流が小さめのものを使ってしまい、確か加湿器か何かの消費電量が大きいものをオン/オフさせているうちに、リレーの接点が焼けてしまったことを覚えています。その後、接点容量の大きいリレーに取り替えました。

その当時よく理解できなかった機能として「スヌーズ(snooze)」というプッシュ・スイッチをこのLSIに取り付けられるようになっていました。上の写真では「SNZ」とインスタント・レタリングで文字を入れてあります。"snooze" という英語の意味を辞書で調べると「うたた寝」と書いてあり、ますますチンプンカンプンです。日本語訳の解説書には「10分間動作しているラジオを止めることができます」とも書いてありました。技術翻訳を長年手がけてきた人間の目から見ると、この訳文は少々マズイと思います。「10分間」という修飾語が「動作している」と「止める」のどちらに掛かるのか、意味が曖昧だからです。もし私が訳すとしたら、絶対に「動作しているラジオを10分間止めることができます」としたはずです(修飾語は、その修飾先の語句になるべく近い位置に置くというのが大原則だからです)。それはさておき、この「スヌーズ」という機能が、アラームやラジオが鳴っているときにそのボタンを押すと、10分間だけ音が鳴り止み、10分後にまた鳴りだすという機能であることを知ったのは随分あとになってからのことでした。今のデジタル時計にはたいてい付いている機能ですよね。

中学3年生でよくもここまで作りこんだなぁ、と今さらながら感心しましたが、もっと驚いたのは製作後30年近く経過した今でも時計として機能するということです。写真を撮るときに電源を入れてみたところ、LEDがきちんと光ります。時刻を設定するプッシュ・スイッチが接触不良気味でしたが、押しているうちに導通するようになり、時計が動き始めました。

実際このデジタル時計は1979年〜2001年の間、実に22年間に渡って使い続けていたんです。1995年頃だったと思いますが、朝起きるとき、アラーム音を鳴らす前に電灯などで部屋を明るくするとスッキリ目覚めることができるという記事を新聞か雑誌で読んでからは、60Wの電気スタンドを「オン」にするためにこの時計を利用していました。

今回、この時計を「思い出の品を詰め込んだ段ボール箱」から引っ張り出して動かしてみて、スイッチなどの機構部品は接点の接触不良などで耐用年数が短いのに対して、LSIやLEDといった電子部品の寿命は意外に長いものだと感心しました。

次回からは、また“フルキーボード搭載デスクトップ・マイコン”をさらに拡張していった様子をご紹介しようと思います。

 このページの先頭へ 


「真空管アンプ自作の醍醐味」ホームページへ 「パソコン自作の部屋」トップページへ