Λ-1/Lambda-2022 の拡張(5)Chick-Bug 移植

オリジナル Chick-Bug は Λ-1 に接続されたパラレルインターフェイスのキーボードと VDG ディスプレイをコンソールとして使用しますが、今回作成する Lambda-2022 システムではコンソールとして ACIA シリアル回線を追加しています。またメモリマップも変更がありますので、これらに対応するため Chick-Bug を次のように変更します。

ワークエリア:オリジナル Chick-Bug ではスタックを含むワークエリアが $F700-$F7FF に設定されていました。他の用途と干渉しない RAM 領域 $A600-$A6FF に変更します。

PIA アドレス:オリジナル Chick-Bug の PIA アドレス $EE00..$EE03 を今回作成した I/O ボードの PIA0 アドレス $F008..$F00B に変更します。

VDG アドレス:オリジナル Chick-Bug の VRAM アドレス $F000-$F1FF を $C000-$C1FF に変更します。またシステム初期化時に VDG コントロールレジスタ($F048)に適切な値を設定します。

ACIA 初期化:SBC68 版 MikBug 同様に ACIA を初期化します。システムリセットルーチン restp 内で ACIA 初期化ルーチンを呼び出します。

PIA、ACIA の接続状況は次のようになります。

Desc.DEVI/O RegisterOrig Addr.New Addr.
K/b asciiPIA0PA0-6pdra1$ee00:b0-6$f008
6847 vsyncPIA0PA7pdra1$ee00:bit7$f008
k/b strobePIA0CA1pcra1$ee01:bit7$f009
k/b ATN NMIPIA0CA2pcra1$ee01:bit6$f009
tape mtrPIA0PB1pdrb1$ee02:bit1$f00A
tape outPIA0PB0pdrb1$ee02:bit0$f00A
tape inPIA0PB7pdrb1$ee02:bit7$f00A
tape inPIA0CB1pcrb1$ee03:bit7$f00B
SerialACIACSaciacs$f028
SerialACIADAaciada$f029

Chick-Bug はプロンプト呼び出しのためにハードウェア割り込みスイッチを使いますが、これは元設計通り PIA0 CA2 へ接続します。当面は、前回 PIA のテストに使用したブレッドボード回路をそのまま流用します。

シリアルコンソール対応

冒頭に述べたように、オリジナル Λ-1 のコンソールに加えて ACIA シリアルコンソールをサポートしようと思います。将来的には VDG/パラレルキーボードとシリアル入出力を切り替えるようにしますが、当面はシリアル入出力のみ対応するコードを書きます。次の要領で 機能を変更します。

入力:オリジナル Chick-Bug では PIA0 PA ポートと CA1 に接続されたパラレルインターフェイスキーボードから入力を読み取っていました。これをシリアル入力に置き替えます。

  1. kbread ルーチンの処理をシリアル入力処理に置き換える。
  2. シリアル入力処理は SBC シリーズ版 MicBug の ineee ルーチンを参考にして記述する。

出力:オリジナル Chick-Bug では文字出力は VDG のテキスト画面へ送られますが、シリアルコンソールに同等の内容を出力できるようにします。VDG への文字出力はおもに disp1c で行われますが、画面クリアやスクロールなどの処理で VDG 直接操作があり、これらすべてをシリアルコンソール対応処理に変更します。次のように改造します。

  1. Chick-bug の中で VDG VRAM 操作に関連するルーチン(cpoint、vramt1 を直接使用する処理)を特定する。
  2. 該当する下記のルーチンをシリアル出力(outeee)対応に書き換える。
clear1, chmark, clrhm1, lf, crlf, bs, disp1c, scrolu

初期化の部分を除くと Chick-Bug モニタの他の部分から表示のために呼び出されるのは disp1c だけのようです。将来的に VDG/シリアル出力を切り替える場合は、disp1c 内で切り替え判定をすれば十分です。

シリアルコンソールの処理では HOME、CLEAR などのエスケープコードを使用します。

改変後の Chick-Bug ソース内のアドレス配置は次のとおりです。

$a600-$a66b   :システムワークエリア
$a6ff                :スタックトップ
$f080-$fa74      : Chick-Bug コード

***

以上の要領で移植作業を進めます。Chick-Bug はもともと Λ-1 ハードウェア用に書かれたモニタプログラムなのでこれを改変することを「移植」と言うのも少し変ですが、ともかく上記の方針に沿って書き換えます。

Chick-Bug 動作確認

書き換えた Chick-Bug はシリアルコンソール上での対話ができるようになっています。各コマンドの動作画面は次のとおりです。

‘M’ コマンドはメモリ内容の表示と書き換えです。

’G’ はユーザプログラム実行、’B’ はブレークポイントの設定/確認/解除です。

カセットテープインターフェイスコマンドの確認

カセットテープのロード/セーブ機能の確認はカセットレコーダインターフェイス回路を作ってから行います。

VDG 上の動作画面

本来の出力である VDG 画面はまだ確認できません。今後 VDG 回路を追加したときに確認します。

なお今回使用する予定の K68-VDG では 6847 の反転文字と通常文字を区別しているので、Chick-Bug が印字する通常の ASCII 文字($20-$5F)は後半のみ反転します。VDG 出力時に表示コードを適宜変換する必要があります。

今後の計画

全部できるかどうかわからない予定を再度並べてみます。

  • K68-VDG の接続
  • カセットテープレコーダ回路の作成とテスト
  • パラレルインターフェイスキーボードの作成

Λ-1/Lambda-2022 の拡張(4)新 CPU カードと I/O カードの製作・テスト

注文の基板が到着しました。さっそく 2 枚のカードを製作します。

新 CPU カードの製作とテスト

旧 CPU カードと同じ要領で部品を組み付けます(今回も配線ミスがありジャンパが必要になりました)。最初に CPU カードのみテストします。まず SRAMSEL ピンをプルアップして CPU カード単体で SRAM を常時有効にします。その後、旧 CPU カードと入れ替える形でバススロットに装着します。この時点で Lambda-2022 システムには 64KB フル RAM を実装した新 CPU カードと DMA カードが接続されています。

$0000-$7FFF の 32KB SRAM をテストするために次のプログラムをフロントパネルから入力、実行します。

***
* memtest $0000-$7fff
***
*
* set val to write 


val     equ $55   ; test val
erradr  equ $8100  ; address where test failed
mstart  equ $0000  ; mem test start addr
mend    equ $8000  ; mem test end addr + 1
*
        org mend
start   ldx #mstart-1
        stx erradr  ; if (erradr)=mstart-1, test succeeded; otherwize test failed
        inx
        ldaa #val
loop    staa 0,X
        cmpa 0,X
        beq ok
        stx erradr
        bra endl  ; test failed, end prog
ok      inx
        cpx #mend
        bne loop
endl    bra endl
*
        end

val を $55, $aa, $00, $ff の 4 種に変えてテストします。

$8000-$FFFF の 32KB SRAM のテストプログラムもほぼ同様で、テスト対象領域とテストプログラム領域、およびワークエリアのアドレス値を変更します。

val を $5a, $a5, $0f, $f0f の 4 種に変えてテストします。

動作上ちょっと面白い点として、2 つ目のテストプログラム($8000-$FFFF の SRAM メモリテスト)はリセットベクタ $FFFE-$FFFF まで書き換えてしまいます。ROM のない初期構成の Λ-1 ではいったんプログラムが開始してしまえばリセットベクタは不要になるのでこれでも問題なく動作します。ちなみにここまで Λ-1 用に書いたどのプログラムもスタックポインタの初期化を行っていません。割り込み処理やサブルーチン呼び出しがない場合はスタックポインタの設定も不要です。

メモリテストはやりだすときりがありませんが、以上で 64KB 分の SRAM テスト完了ということにします。SRAMSEL のプルアップを取り除いて CPU カードを再装着します。

I/O カードの製作

I/O カードを製作するには GAL20V8B のプログラミングが必要になります。といっても必要なのは静的なデコーダロジックですから、回路図に書いた論理式をソースファイル(*.PLD)に書き写すだけです。

GAL のデザインツール WINCUPL を使用するには比較的古い OS が必要になります。このために温存してある Win7 VM を引っ張り出して WINCUPL を起動しました。はじめは JED ファイルが生成されずまごつきましたが、どうも PLD ファイルの Device フィールドを無視して WINCUPL のメニューからデバイスを選んでやると正しくコンパイルされるようです。しばらく使っていなかったので手順を忘れていました[1] [2]。JED ファイルを生成したら、TL866 ROM ライタを使って EPROM と同じ要領でプログラムします。

PIC のプログラムも必要です。SBC シリーズ用にクロック生成のための HEX ファイルが用意されているので、これを書き込みます。今回は 38400bps 設定にしました。

I/O + ROM カード(PIA は未装着)

I/O カードも基板設計時の回路に諸々不具合がありパターンカットとジャンパ線で修正しました。修正点は以下のとおりです。

  • 28C64 の WE# を NC から +5V プルアップに変更
  • PIC クロック出力をピン 2 からピン 5 に変更
  • PIA、ACIA の R/W# ピン接続先をバス WR# からバス R/W# に変更

最後の修正はもしかしたら不要だったかもしれません。

新システムハードウェアのテスト

以上で拡張 Λ-1 システムのハードウェア基本部分ができましたが、ROM にはまだなんのプログラムも書き込まれていません。数回前の投稿でソースを準備した Chick-Bug の移植を始めてもいいのですが、まずは MikBug を書き込んでみます。SBC6800 版の MikBug ソース内の ACIA、ワークエリア、コード開始位置のアドレス定義を書き換えて再アセンブルすると Λ-1 で動きます。冒頭付近数行のアドレス値を書き換えるだけです。

*	ADDRESS
ACIACS	EQU	$f028
ACIADA	EQU	$f029
VAR	EQU	  $a600
*
*	OPT	MEMORY
	ORG	$f100

これらのアドレス値は下記のメモリマップにもとづいています。G コマンドの設定アドレスは $a648/$a649 となります。

MikBug の L コマンドを使って S19 データを流し込み、Hello World プログラムを実行しました。シリアルコンソールと L コマンドがこんなに有り難く感じたことはありません。フロントパネルスイッチをパチパチと操作して 1 バイトずつ入力する作業に比べると数段楽です。まあ、そのパチパチ操作のために Λ-1 を作ったのですから本末転倒する感想ではありますが、シリアルコンソールとモニタ ROM が動いた時点でフロントパネル DMA の必要性が失われてしまうのは事実です。

MikBug のコンソールが動いたので ACIA はテスト済みとみなします。次に PIA について 2 つのテストを行います。

PA / PB ポート:L チカ

PIA0 に MC6821 PIA をセットします。PIA0 のレジスタにはアドレス $f008-$f00b でアクセスできますので、全ポートを出力に設定した上で適当なループタイマを挟んで PortA と PortB の両方に $00 と $ff を交互に書き込みます。20 回繰り返したらプログラムを終了します。

「L チカ」と称する以上は適当なドライブ回路を PIA ポートに接続して LED を点滅させるのが筋ですが、面倒なので PIA ポート出力をロジアナで直接測定します。下の画面では D0 が PA0、D4 が PB0 に接続されており残りのチャネルは未接続です。

想定通り PA/PB 出力が 20 回点滅しています。(L チカプログラムはこちら

CA1 ポート:NMI 割り込み

この I/O ボードの PIA0/PIA1 の IRQA ピン(38)は 6802 NMI 割り込み(プルアップ済み)に接続されています。CA レジスタの以下のビットを書き込み・読み出しすることで IRQA を通じて割り込みを発生できます。

bit0 = 1:CA1 による割り込みを有効にします。割り込み信号に反応して IRQA ピンが立ち下がります。
bit1 = 0:CA1 割り込み信号を立ち下がりタイプに設定します。
bit7:読み出し値が 1 の場合、CA1 入力による割り込みが発生しています。PA レジスタを読み出すと値はクリアされます。

CA1 ピンに次の割り込みボタンを付けます。

MikBug の NMI 割り込みハンドラは NIO が示すアドレスへジャンプします。NIO は Lambda-2022 版 MikBug の場合 $a606-$a607 です。

画面下端近くのメッセージ行 “INTERRUPT VIA PIA0 CA” が割り込みハンドラによるものです。(割り込みハンドラプログラムのソースはこちら

***

これらのテストで I/O ハードウェアは問題なしとみなすことにします。次回は Chick-Bug の移植に移ります。

注:

  1. スクリーンショットの PLD コードにあるように Device: gal20v8a; とすると動くようです。
  2. この GAL 書き込みを終えてから code-cupl という VSCode 拡張機能を見つけました。code-cupl の ReadMe によるとコマンドライン用 cupl.exe は Windows 10 上でも動作するようです。ただし ReadMe にかかれている比較的複雑なコマンドラインオプションやライブラリファイルが必須で、さらに exe ファイルの互換モードを設定する必要もあります。

Λ-1/Lambda-2022 の拡張(3)I/O カードの設計

この I/O カードは新規設計となります。次の I/O デバイスおよびメモリを接続します。

  • PIA x 2
  • ACIA x 1
  • 4KB ROM
  • VRAM (デコードのみ)
  • VRAM コントロールレジスタ(デコードのみ)

ACIA は PC とのシリアル通信に使用します。PIA は 1 つに付き PA/PB 2 バイトのポートがあるので 2 個の PIA で合計 4 バイト分 = 32 ポートが使えます。これ以外に割り込み可能ポート CA1/2、CB1/2 が 2 セットで合計 8 ポートあります。PIA には次のようなデバイスを接続できます(全部作成するとは限りません)。かっこ内は(Px ポート数 + Cx ポート数)です。

  • フルキーボード(7+2)
  • カセットインターフェイス(3 + 1)
  • VDG 垂直同期割り込み(0 + 1)
  • 16 進キー/LED コンソール(9 + 0)

I/O カードのもう一つの重要な機能はアドレスデコード回路で、カード上のデバイスに加えて SRAM、VRAM 関連のデコードも行います。詳細を検討するために、まずメモリマップを再掲します。

次のアドレスをデコードする必要があります。

デバイス開始アドレス終了アドレス使用バイト数
VRAM$C000$DFFF8192
PIA0$F008$F00B4 + 4 ghosts
PIA1$F010$F0134 + 4 ghosts
ACIA$F028$F0292 + 6 ghosts
VDGCTL$F048$F0481 + 7 ghosts
ROM$f080$FFFF3968

細かい変更として、前稿掲載のマップに比べて PIA、ACIA 等 I/O デバイスのアドレスが若干移動しています。これは PIA 等のチップで使用できる CS ピンの組み合わせが限定されるためです。変更はあるものの A3-A15 は重複がないようにデコードされるので、I/O 領域内に 8 バイトブロック単位で適切に割り当てられます。

上の表に示した I/O、ROM、VRAM 領域をアクセスしている間は、SRAM イネーブルを無効にします。このイネーブル信号が SRAMSEL で、バス 33 ピンへ出します。同様にして VRAM 領域アクセス時は VRAM#(バス 35 ピン)、VRAM コントロールレジスタアクセス時は VRAMCTL#(バス 37 ピン)をアサートするようにします。IO デバイス(PIA0、PIA1、ACIA)についても同様のイネーブル信号を生成します。これらのアドレスデコードは VMA 有効時のみイネーブルとなるようにします。

多数のアドレス線とイネーブル信号が交錯するので、GAL デバイスを使って一括デコードすることにしました。次の回路図になります。

このカードでは 600mil 幅の IC を多数使う上、I/O ピンヘッダも多いので 95mm x 75mm 基板にギリギリ収まるサイズでした。もしかしたら基板サイズを多少延長したほうが良かったかもしれません(95mm x 95mm など)。

ここまでで新 CPU カードと I/O カードを設計したので、PCB 製造を発注します。基板が到着したら作業を再開します。

Λ-1/Lambda-2022 の拡張(2)MB8870 CPU カード再設計

Chick-Bug モニタのソースコードを読んで仕様とハードウェア処理の概要を把握したので、これに応じて CPU カードを作り直そうと思います。次の方針で設計します。

  • RAM 60KB、ROM+I/O 4KB のメモリ構成
  • VDG VRAM 8KB の追加に対応

最初にメモリマップを考えます。

Lambda-2022 拡張メモリマップ

次の要領で割り当てています。

  1. CPU カードには 32KB SRAM チップを二個使って 64KB 全域に RAM を割り当てる
  2. ROM、VRAM、I/O のアクセス時には SRAM セレクトを無効化する

ROM、VRAM、I/O のアドレスデコードは I/O カード設計時に詳細を決めます。1、2 の方針を元に再設計した CPU カードの回路は次のようになります。

この回路は Lambda-2022 CPU Rev. 2 となります。Rev. 1 からの変更点は以下の通りです。

  • 2 個めの 71256 SRAM を追加($0000-$7FFF)
  • MPU 内蔵 RAM を無効化
  • SRAM は SRAMSEL 信号有効時のみアクセスされるようにする
  • SRAMSEL 信号は I/O カード上でデコードされたものを利用する(バス 33 ピンに接続)

SRAMSEL 信号をカードをまたいで使用するため、SBC Bus のデコード信号部分を改変して再割り当てすることにしました。上記回路図中の SBC Bus はこのあたりがオリジナル版とは異なってきています。

次回は I/O カードを設計します。

Λ-1/Lambda-2022 の拡張(1)Chick-Bug 解析と計画

以前の投稿で書籍「マイコン手づくり塾」の前半およそ三分の一の内容を実装するマシンを製作しました。フロントパネル DMA で 6802 コンピュータのメインメモリを直接読み書きするという目標を達成できたのでこの段階で終了しようかとも思いましたが、せっかくなのでもう少し Λ-1 の機能拡張を試みます。

***

「マイコン手づくり塾」の後半はカラーディスプレイインターフェイスとシステムモニタプログラムの製作が山場となります。フルキーボードやカセットインターフェイスも追加され、仕上げとして Tiny BASIC を移植すると当時のいわゆる「マイコン」市販品、今で言うパソコンと同レベルのシステムが構築されて自作派にとって大きな目標達成となります。

当時の状況ではこれは大事業でした。大半のユーザは既製品のマイコンシステムが手元になかったので、各種の機材や開発環境がない状態でシステムを作り上げる必要がありました。たとえばアセンブラ処理系がない初期段階ではプログラムをハンドアセンブルで仕上げる必要があります。また外部記憶装置を得るためにまずカセットインターフェイスのハードウェアを作ります。その後 ROM ライタ回路を作り、ROM 書き込み用コードを書くとようやくモニタ ROM が作成できるのでした[1]。

「マイコン手づくり塾」単行本の内容は雑誌掲載時と若干順序が入れ替わっているのですが、この単行本に準拠すると後半部は VDG 回路 > キーボード回路 > カセットインターフェイス > ROM ライタ > Chick-Bug モニタ ROM の順番で製作が進行します。当時の開発環境事情に照らし合わせるとこの制作順しかほぼ方法がなく、壮大なブートストラップ手順と言うほかありません[2]。

しかし現代の開発環境があれば上記のような制約は問題になりません。モダン OS 上で高速なクロスアセンブラやディスアセンブラが使え、豊富なプラグイン機能が揃ったエディタもあります。ROM ライタもかつてとは比較にならないほど安価に入手できます。

今回はこれらの利点を最大限に利用して、興味のある部分だけをピックアップした上で次の手順で Λ-1 の機能拡張を進めていきたいと思います。

  1. 「マイコン手づくり塾」掲載の Chick-Bug ソースコードを入力する
  2. CPU ボードを 64KB RAM 構成で再設計する
  3. I/O + ROM カードを設計する
  4. Chick-Bug の入出力を SBC シリーズ同様の 9600 kbps シリアルに対応する

その後、余力に応じて次の機能追加を検討します。

  • VDG 製作
  • フルキーボード製作
  • カセットインターフェイス製作
  • 16 進キー + 7 セグコンソール製作

ここまで機能拡張してしまうと当初の製作動機であったフロントパネル DMA はほぼ無用の長物となってしまうのですが、これはシステムの進歩段階の違いのようなもので仕方ありません。たとえば PDP-11 の後期モデルや Altair のターンキーモデルでも、フロントパネルの入出力デバイスは撤廃されています。

Chick-Bug ソースコードの入力と解析

どこまでやるのかもわからない製作計画を延々と練ってきましたが、まずは Chick-Bug モニタのソースコードを入力して内容を読んでみることにします。

Chick−Bug ソースリストは書籍「マイコン手づくり塾」巻末に二段組 9 ページにわたって掲載されています。オリジナルのモニタ ROM アドレスは $F800-$FFFF の 2KB です。その直前 $F700 台にワークエリアが定義されており、つまり $F700 台 は RAM が想定されています。

後で説明するように今回作成するシステムでは ROM/RAM および I/O のアドレスを変更するのでこのままでは動作しませんが、とりあえずオリジナルソースをそのまま入力します。入力したコードを眺めて気がついた Chick-Bug の特徴は以下の点です。

  • 富士通 MB8861/8870 の拡張命令 NIM、OIM、ADX が使われている
  • コンソール出力に VDG テキストモードを使用(VRAM 512B)
  • PIA A ポートに接続されたキーボードから入力を取得
  • PIA B ポートに接続されたカセットテープレコーダでロード、セーブを行う(出力:PB0、入力:CB1)
  • 割り込みスイッチをPIA CA2 経由で NMI に接続し、NMI 割り込みでモニタコマンドプロンプトへ移動

MB8870 の拡張命令が使用されている場所は限られるので MC6800 互換コードに書き換えるのもあまり大変ではなさそうですが、当面は手持ちの MB8870 を Λ-1 に装着して使用することにします。ただしこれらの MB8870(MB8861)拡張命令は私が普段使用している as0 アセンブラではサポートされていませんので、アセンブル済みバイナリ列を fcb 疑似命令を使ってソース内に埋め込んでおきます。

キーボードと VDG からなるコンソールのためのサービスルーチンは全体の 30% ぐらいの分量を占めます。当面はこのコンソールの代わりに、SBC シリーズを参考にしてシリアル入出力のサービスルーチンを追加します。キーボードや VDG ディスプレイアダプタといったハードウェアはいつ作成するか決めていないので、入出力デバイスはフックを使って切り替えられるように改変しようと思います。

カセットテープレコーダインターフェイス周りのコードは全体の 20% 程度です。インターフェイス回路自体は PIA の外側に接続されるものなので、ひとまず対応 PIA ポートのみ作成してインターフェイス回路は後回しにします。

ソースコード中、ワークエリアや I/O を参照する一部の行でアドレスをラベルでなく 16 進値で直接指定している部分があったので、それらはラベル表記に書き換えておきました。将来ワークエリアを移動する時に作業が簡単になります。

***

ところでこの「マイコン手づくり塾」掲載のソースリストは pass2 処理のアセンブルリストであることに気づきました。左側オブジェクトコード中の一部のブランチ先アドレスが解決されておらず “00.” 表記となっています。またラベルの参照元アドレスがラベル行の下に挿入されており、それら参照元アドレスがリストされている行はソースコード部分が空欄となっています。いわばアセンブル作業の中間データがそのまま挿入された状態になっており、このあたりは当時のアセンブラ処理系固有の作法なのかもしれませんが、バイナリレベルでの照合が若干難しくなります。

入力したソースを as0 コマンドでアセンブルし、エラーなくオブジェクト(S19)が生成されることを確認しました。アセンブルリストもおおむね書籍掲載の内容と一致することが確認できました。このソースを元に Lambda-2022(いま作っている Λ-1 変種)のための Chick-Bug として改造していきます。

  1. 実際にはカセットインターフェイスや ROM ライタのファームウェアをその都度入力するのは大変なので、連載期間中に誌上通販などの形でモニタ書き込み済み PROM の頒布が行われたであろうと推測されます。
  2. 「マイコン手づくり塾」単行本の目次と各章題ページの雑誌掲載号情報によると、次のような順になります。
    A:ウォーミングアップ(’78/2-6)

    B:Λ-1 本体基本部分製作(’78/8-12, ’79/1)
    C:6802 プログラミング(’79/2, 3, 4)
    D:VDG 製作(’79/5-8)
    E:キーボードインターフェイス製作(’79/10)
    カセットインターフェイス製作(’79/12, ’80/1)
    I/O 拡張基板(’80/5, 6)
    ROM ライタ製作(’80/8)
    F:Chick-Bug(’80/2, 3, 4)

    ‘N’ Tiny-Pilot 言語(’80/7)
    RAM68 アセンブラ(’80/9)
    電大版 Tiny Basic(単行本書き下ろし)

Λ-1/Lambda-2022 の製作(7)全体チェックとテストプログラムの実行

CPU カードの作成

滞っていた CPU カード製作ですが不足分の IC ソケットが到着したので再開します。

この基板でも誤配線が発覚しました。バスバッファとして使っている 74LS367 の 2 つの EN 入力は AND 合成されているのではなく、LS367 の中のバッファモジュール自体が 2 つに分割されています。つまり1 ピンと 15 ピンの両方を BA 信号に接続する必要があります。最初は 1 ピンのみ BA に接続し、15 ピンを GND に落としていました。

LS367 データシートより
CPU カード回路(修正後)

前回同様ここもパターンカットして再配線を、と思ったのですが、LS367 の 15 ピンは基板の表と裏両方でベタ GND につながっているのでソケットをはんだ付けした後ではパターンカットできません。最終手段として IC のピンを横に伸ばしてソケットに入らないようにし、ポリウレタン線でジャンパ配線します。下の画像のとおり不格好な空中配線になりました。

CPU カード

CPU カードの追加とテスト

これで MPU と SRAM が使えるようになったはずなので、すべてのカードをバスに接続して電源投入します。この段階でも配線ミスその他いくつかの問題の修正が必要になりましたが、最終的にメモリの読み書きができるようになりました。

(画像奥方向がフロントパネル)赤:LED ディスプレイ基板、紫:DMA 基板、緑:CPU+SRAM 基板、黄:SBC-Bus。この他 SBC-Bus と LED ディスプレイ基板の間にデータバスバッファ基板。

総合試験として、フロントパネルからある程度まとまった操作をして実際にプログラムを入力、実行する手順をテストします。

フロントパネル各キーのラベルと動きを下図に示します。キーにはトグル動作するものと、モーメンタリ(指を離すと上に戻る)動作するものがあります。

操作の例として、16 ビットアドレスをセットする手順を説明します。

  1. 0‘ 〜 ‘7‘ のラベルが付いたトグルスイッチがデータキーです。キーを上に倒すと 1、下に倒すと 0 を表し、8 ビットの値を指定できます。このキーを操作して値を変えても、ディスプレイにはすぐに反映されません。
  2. データキーでアドレスの上位バイトを指定します。
  3. ADDRESS SET キーを押し下げて放します。データキーが示す値が LED ディスプレイのアドレス下位バイトの欄に表示されます。
  4. データキーでアドレスの下位バイトを指定します。
  5. ADDRESS SET キーを押し下げて放します。アドレス下位バイトの欄に表示されていた値がアドレス上位バイトに移動します。同時に、データキーで指定した値がアドレス下位バイトの欄に表示されます。

すなわち、ADDRESS SET キーはアドレス欄の値を 8 ビット左シフトさせてから、データキーが示す値を下位バイトにセットする機能を持ちます。これによって 8 ビット分のデータキーで 16 ビットのアドレス値をセットできるようになっています。

他のキーは次のような機能を持ちます。

HALT/RUN HALT に倒すと CPU は停止し、システムバスの制御がフロントパネルに移ります。RUN に倒すと CPU がバスの制御権を握って動作を開始します。

RESET … 一般的なリセットキーです。1) RESET を押し下げたまま保持、2) HALT/RUNRUN 側に倒す、3) RESET を開放、という操作手順で CPU をリセット実行できます。

READ … 押すと、現在 LED ディスプレイアドレス欄に表示されているアドレスのメモリ値が LED ディスプレイデータ欄に表示されます。放すと、アドレス欄のアドレス値が +1 されます。

WRITE … 押すと、現在 LED ディスプレイアドレス欄に表示されているアドレスのメモリにデータキーで示した値が書き込まれます。放すと、アドレス欄のアドレス値が +1 されます。

ところでフロントパネルの HALT キーは CPU 全体をバスから切り離すので、6802 内蔵 RAM はフロントパネルから読み書きできません。考えてみれば当たり前ですがテストで $0000-$007F の読み書きができず一瞬首を捻りました。

テストプログラム実行

「マイコン手づくり塾」掲載の次のテストプログラムを実行します。

上画像の左のアセンブル済みバイナリデータを入力します。具体的な操作は次のようになります。

プログラム入力

  1. アドレス $FC00 をセット
  2. データキーで「$86」を打ち込み WRITE キーを押し下げ。アドレスは自動インクリメントする
  3. 以下 $FF、$B7 … とプログラムコードを入力

入力チェック

  1. アドレス $FC00 をセット
  2. READ キーを押し下げ。押し下げるとデータが読み出されるが、キーから指を離すとアドレスが自動インクリメントされる。つまり現在表示されているアドレス-1 のメモリの値がデータ欄に表示される
  3. READ キーを繰り返し押して、プログラムコード $86、$FF、$B7… が正しく入力されていることを確認

プログラム実行と結果確認

  1. アドレス $FFFE をセット
  2. データ $FC、$00 を入力。これがリセットベクタになる
  3. リセットキーを押し下げたまま HALT/RUN キーを RUN 位置に倒す
  4. リセットキーを放す。これでプログラムが実行される。プログラムは $FC0D(ラベル ‘endl’)のブランチ命令で無限ループして止まる
  5. HALT/RUN キーを HALT 位置に上げて CPU を HALT 状態にする
  6. アドレス $FF00 の値を確認。プログラム内で $00 になるまでデクリメントされているので、現在値は $00

デクリメントが 255 回行われている最中の様子は確認できないのですが、所定の結果($FF00:$00)が得られます。

次に、ループ途中の結果を見られるようなプログラムを考えました。

実行するとアドレス $FE00 – $FEFF の範囲に $00、$01、…、$FF が書き込まれます。結果は次の要領で確認できます。

  1. アドレス $FE00 をセット
  2. READ キーを押し下げたままにする。「$FE00:$00」と表示される
  3. READ キーを放すと「$FE01:$00」と表示される。つまり表示中アドレスの一つ前のアドレスのデータが表示されたままになっている
  4. 続けて READ キーを押していくとデータ欄は $01、$02、$03、… と変化していき、プログラムのループで書き込まれた内容が確認できる

***

以上で最小構成(CPU、SRAM、フロントパネル DMA)の Λ-1 の全機能を確認しました。「マイコン手づくり塾」の記述でいうと 120 ページ前後まで、全体のおよそ 1/3 まで進めたことになります。3D プリントで作ったキースイッチによるフロントパネルを使ってデータの読み書きができるようになったので、今回の製作過程としては一区切り付けようと思います。

この後「マイコン手づくり塾」の内容は PIA プログラミング、キーボードや VDG などインターフェイスの製作、オリジナルモニタ Chickbug の開発と続き、Λ-1 は当時の市販パソコンと同等の機能を持ったシステムへ発展していきます。PIA プログラミング編では同書冒頭の「ウォーミングアップ編」で作った電子オルガンをつなげて演奏するという例題があり、「よく考えられた本だなあ」と感心したものです。

デザイン案 2 によるフロントパネル

追記:

3D プリンタで作ったバイナリデータ入力キーの STL ファイルを Thingiverse で公開しました。

Λ-1/Lambda-2022 の製作(6)フロントパネルとケースの作成

フロントパネル用のビニール印刷シートが到着しました。144dpi 相当とは聞いていましたが、今どきの基準で見るとあまりきれいな印刷とは言えません。さりとてラベルの文字が読めないほどではないので、まあ良しとしてこのまま使うことにしました。

パネル印刷原稿(4 枚分までなら値段は同じ)

ビニールシート表面はマット仕上げで希望通りの質感ですが、残念ながら半透明の効果が強すぎて LED 表示はぼやけてよく読めません。このため LED 部分はシートをカッターで切り取ることにしました。

シート貼付け時に気づいたのですが白の印刷部分は実質透明です。そのためフロントパネル用のアクリル板前面にまず白地のステッカーを貼り、それからこの印刷シートを貼ることにします。ここで位置決めに失敗して貼り直しをやったため、ステッカーの一部がシートに張り付いたまま剥離してしまいました。その部分は印刷シートの接着剤の効果がなくなり、少し浮いた状態になっています。下の写真をよく見ると分かると思います。

またスイッチ部分はアクリル板に穴を開けただけではちょっと見ばえが悪かったので、後付でデザインした 3D プリント製のフレームをネジ止めしてあります。これで穴加工の粗も隠せて一石二鳥です。

ケース本体側は 3D プリント部品を組み合わせてシャーシ前面の四辺を囲むようにスペーサ兼ベゼルを形成しています。ベゼルの四隅にインサートナットを埋め込み、これを使ってビニール印刷シートを貼ったフロントパネルを固定します。

しかし改めて完成写真を見るとフロントパネルの処理にはやはり再考の余地があります。機会を見てアクリル板切り出しからやり直し、予備の印刷シートを貼ることにします。

Λ-1/Lambda-2022 の製作(5)基板組立:DMA カードと CPU カード

残り 2 枚の基板は DMA カードと CPU + RAM カードです。

DMA 基板の製作

DMA といっても、この場合はフロントパネルから手動でメモリを読み書きするための回路です。フロントパネルからのスイッチ配線はこの基版に集中するため、10 ピンコネクタを 2 個使用してスイッチケーブルを接続できるようにしてあります。このコネクタではすべてのスイッチを接続するには足りないので、リセットスイッチなど一部の配線は LED ディスプレイ基板へ回しています。

この基板に取り付ける IC は 12 個あり、前述のスイッチ配線コネクタも含めかなり窮屈なレイアウトになります。

すべての部品の装着後、導通チェックで例によって盛大にやらかしたことが判明しました。スイッチ入力側のアドレスピン接続が IC 単位で逆順になっています。アドレス配線 16 本をすべてパターンカットして、ジャンパ線で配線をやり直しました。

配線間違い:SD0-AD3/SA0-SA3 と SD4-SD7/SA4-SA7 がそれぞれ逆順
プリント基板作ってから回路図を修正しても今さら遅い。次回プリントがあれば反映します…

DMA 基板は SBC-BUS に接続します。

CPU + RAM 基板の製作

MPU とメモリという重要な構成要素を含む基板ですが今回は最後に作ることにしました。6802(または MB8870)、32KB SRAM、クロックなどの要素のほか、DMA パネル操作時(HALT 時)に CPU のアドレス線と R/W 線をバスから切り離すための 3 ステートバッファが追加されています。MC6802/MB8870のデータバスは HALT 時に HiZ になるためデータバスの外部バッファは不要です。基準クロックは水晶発振モジュールを使って外部入力することにしました。この場合でもクリスタルを使った場合と同様システムクロックの 4 倍(4xf0)4MHz 入力が必要です。

メモリは SRAM 32KB を使うのでアドレスデコーダへの入力は A15 と VMA だけです。NAND 一本ですみます。

タイミング信号は Λ-1 オリジナル設計から少し変更し、R/W と E を組み合わせて ~RD および ~WR を作ります。この 2 つの信号には SBC-BUS ピンがアサインされていますので他の基板でメモリや I/O を増設する際にも利用できます。

Lambda-2022 MPU/RAM 回路(後に誤配線が発覚)

さていざ CPU + RAM カードを作ろうとすると手持ちの 16 ピンソケットが不足していることに気づきました。CPU 基板を作っているとバッファ周りの 16 ピン IC を使用する機会が多く、消費が速まります。注文したソケットが届くまで CPU+RAM カードの製作は延期とします。

配線チェックと通電テスト

CPU + RAM カードを除く、完成した分の基板について基本的な配線チェックを済ませました。全ての基板が揃ってから SBC BUS 経由でつないで電源投入してもいいのですが、ここは「マイコン手づくり塾」の手順にならって段階的にテストします。

DMA カードと LED ディスプレイカードを接続してテスト

まず CPU カード以外の基板とフロントパネルを接続して通電テストしてみます。この状態ではメモリが存在しないのでデータの読み書きはできず、以下の機能のみが正常に動作します。

  1. DMA アドレスのセットと表示は正常に動作(8 ビットずつセットする)
  2. Read/Write でアドレスがインクリメントする

この後 CPU カードが完成してから最終テストとなります。

Λ-1/Lambda-2022 の製作(4)基板組立:LED ディスプレイ部

プリント基板が JLCPCB から到着しました。

Λ-1/Lambda-2022 の製作では 4 枚の基板を作ります。前の投稿で説明したようにフロントパネルを作成中なので、フロントパネルに組み込まれる LED ディスプレイ部から始めることにします。

LED ディスプレイ基板の製作

この基板には 7 セグメント LED が 6 個載っています。基板上面をアクリル板フロントパネルに向けて設置するので 7 セグ LED が一番高い位置(手前)に来る部品になるよう工夫する必要があります。

LED の次に背の高い部品は LED ドライバ等の IC 類(ソケットに載せるため)ですが、それでも高さによる干渉の心配はないようです。ただし、LED が結構明るいので半透明のアクリル板をとおして IC その他の部品類が外から見えないかどうかも気になります。今回はアクリル板の上に全面ステッカーを貼る予定なので、これである程度遮蔽されることを期待します。ステッカーがまだ完成していないので具体的な遮蔽効果は確認できませんが、あまり効果がなければ基板のディスプレイ領域以外を遮光板で覆うことも考えます。遮光板はボール紙か 3D プリントで作れます。

LED ディスプレイ基板はケースシャーシに取り付けます。スイッチのように力がかかる部分ではないので DIN レールは省略し、3D プリント製のブラケットを使って直接固定します。LED の高さをスイッチのベースプレートと揃えるために基礎構造を薄くする目的もあります。

余談というか失敗談になりますが、電源を入れた状態で LED ディスプレイ基板各ピンの電圧を測っていたらプローブで電源ピンと LED をショートさせてしまい、左端の 7 セグ LED の f 灯を焼き切りました。7 セグ LED は 10 ピンを基板に直付けしているので交換が大変で、いつもの不器用な手付きではんだを除去していたら基板ランドを破壊してしまい、ジャンパ線での補修が必要になりました。こんな苦労をするくらいなら Λ-1 の元設計通り電流制限抵抗を入れておけば良かったと思う羽目になりました。

LED バッファ基板の製作

SBC-BUS と LED ディスプレイ基板の間に入って、データバスにバッファを挿入するための基板です。アドレスバスと R/W 信号には CPU カードに 3 ステートバッファが入っているので改めて追加する必要はありません。このバッファ基板は SBC BUS 後端(Lambda-2022 ケースの中では前端)のコネクタに接続します。双方の基板に直角の IDC コネクタを付け、平面上に並ぶ形で接続します。バッファ基板のもう一方のコネクタにはフラットケーブルを付けて LED ディスプレイ基板と接続します。

フラットケーブルの取り回しを考えてコネクタの裏表や方向をあれこれ変更しましたが、これは考えすぎだったような気もします。SBC-BUS にすべてのカードを立てて並べるだけでも良かったようです。

左は SBC-BUS、右の小さいほうが LED バッファ基板

***

ここまでで LED ディスプレイ基板、LED バッファ基板の 2 枚を製作しました。残りの 2 枚は次の投稿で製作しようと思います。

Λ-1/Lambda-2022 の製作(3)ケースとフロントパネル

LED ドライバ IC のテストなどのんびり進めてきましたが、発注した基板は JLCPCB を数日前に出発したあと一向に到着しません。連休を挟んだせいか Fedex ハブで滞留したままのようです。この状態で行える作業はケースへのスイッチ取り付けとフロントパネルの採寸・デザインです。当初は LED 基板を完成させてから行う予定でしたが、こちらを先に進めることにします。

まずケースの選定ですが、試作で使った中型の電子工作ケースは SBC BUS に差した基板がギリギリ収まるかどうか(ケース内高さが 105mm)という狭さだったのでミニ ITX サイズのキューブタイプ PC ケースに変更しました。Amazon で最安価の Thermaltake Core V1 を使用しました。このケースはオリジナル Λ-1 のケースとだいたい同寸法(260mm x 260mm x 290mm)です。中にある仕切り板を取り外せば Λ-1 元設計の 100 ピンエッジコネクタ付きユニバーサル基板が収まるスペースが確保できますが、今回作成するプリント基板はずっと小さいのでこのまま仕切り板に取り付けます。小型のスイッチング電源も仕切り板の下の空間に余裕を持って収まりました。Thermaltake Core 付属のフロントパネルは上下に微妙なアールが付いているためこれは使用せず、アクリル板と 3D プリントパーツでフロントパネルを作り直します。

次はスイッチと各基板の取付です。部品を確実に固定するため、DIN レールを使ってスイッチや SBC-BUS 基板を取り付けることにしました。DIN レールやアダプタも Amazon で比較的安価に購入できます。事前確認不足で苦労したのがスイッチ端子と DIN レールの間のクリアランスです。ケーブルをはんだ付けする前は 3〜4 mm の余裕があったのですが、ケーブルを真後ろに延ばす方向ではんだ付けしたためケーブルと DIN レールの一番奥の部分が干渉して、曲がったケーブルに少し力が加わります。はんだ付けの上から熱収縮チューブを取り付けてあるので短絡の心配はあまりないのですが、念のため DIN レールの干渉部分に絶縁テープを貼っておきます。

残りはフロントパネルの採寸とデザインです。ケースのシャーシ前面四隅の取り付け穴で 260mm x 260mm のアクリル板を固定してフロントパネルとします。こうするとオリジナル Λ-1 に近い外観になります。ただしシャーシ前面部より更に手前にスイッチが取り付けられているため、シャーシ前面とアクリル板パネルとの間に 30mm のスペーサが必要になります。Thermaltake Core V1 付属のフロントパネルも同程度 の厚みがあるのですが、これくらいの距離になると長ねじと円柱スペーサで固定するよりもまず 30mm 厚のブラケットをシャーシに固定し、そのブラケットへ別のねじを使ってアクリル板パネルを取り付けたほうが安定し、またパネルの着脱も容易になりそうです。ブラケット自体は 3D プリントで作るので、そこへインサートナットを埋め込むことでねじの取り回しを簡単にします。

上図の寸法が半端な数字なのはすべて現物合わせで作ったためです。一部の寸法はシャーシの取り付け穴位置で決まり変更不可なので、まあこれで良しとします。1980 年当時の原著の本文では穴を開けた後は塗装とインレタで仕上げてください、とのみ説明されていますが、現在ではコンピュータで自由にデザインできます。技術が進化した分私のレイアウトセンスのなさがバレてしまいますがそれはさておき、このパネルデザインをビニールステッカー(ガラス窓や電飾看板に貼るデザインシート)のカラー印刷サービスへオンライン注文します。このサイズだと 4 枚までは同じ値段なので、上図の 2 案に加えてあと 2 つほどバリエーションを作って連続シートとして発注する予定です。