まごころせいじつ堂

浜町庄金 研究開発  マイコンで遊んでばっかりで

SBC8080

SBC8080SUBボードのクロックをPICで

 なにやら昔のI/O誌の記事タイトルみたいになってしまったが。

 SBC8080SUBボードはROM/RAM/i8251とそのシリアル通信用のクロックである153.6kHzを生成する74HC4060と19.6608MHzの水晶振動子で構成されている。今回このボードをもう一枚作ろうと思って部品を探したらHC4060と水晶振動子の手持ちがなかったのでSBC6800やSBC6809でACIAのシリアル通信クロックとして使われているPIC12F1822を使ってみた。

 これでもうわかると思いますが整理しておきます。


それぞれの技術資料を参照。PIC12F1822はSBC6800データパック中のosc1536.hexを書き込んでおく。

 HC4060の4,5,6,7,10,11,12,13ピンの箇所に8pinのICソケットを実装。
2020-11-27 16.52.50

 ハンダ面で配線。BAUD RATE選択のパッド1部分はカット。
PIC12F1822(osc1356)のpin1=+5V、pin8=GND、pin5=CLK出力。写真のように配線。
2020-11-27 16.53.10


 SBC-Bus Rev02(レトロな雰囲気)を組み立ててクロックをi8251側のピンで確認。よさげ。
じつはこの写真には大きな間違いがあってコネクタがずれたまま実装されているのです。動かなくて悩んだ。
2020-11-27 23.39.55

 ついでに作ったSBC8085との組み合わせで動作OK。
2020-11-30 17.13.54

 以前はSBC8080/SBC8085といったCPU側のハンダ面に40Pメスコネクタを、SBC8080SUBボードの部品面に40Pオスコネクタを付けてましたがこれ以上拡張のしようがないので改めて作り直したのでした。今回のSBC8080SUBボードはL字の40Pオスコネクタで、以前のCPUボードに挿して動作確認もOK。
 SBC8080+SBC8080SUBボード、SBC6800のPICを使わなかったのは作りやすさの難易度を下げるためだったのかなと想像します。最近だと入手しやすいROMライターのTL866IIPlusでhexファイルをPICに書き込ませることができるのでだいぶ楽です。




SBC8080システムROMでBASICから機械語を呼び出す

 SBC8080ルーズキット用のSBC8080システムROMは電脳伝説(@vintagechips)さんの手によりPALO ALTO BASICに独自の機械語モニタを拡張してあり一行アセンブラが使えて大変便利。MONでモニタにはいりSYSTEMでBASICプロンプトに戻る。EXEC 番地で番地+8000Hに飛んでRET命令でプログラムに戻ってこれるのだけれどもPEEK/POKEがないのでパラメータのやりとりがそのままではできない。

 そこでSBC8080技術資料の記述からPALO ALTO BASICの資料をたどって調べてみた。
Astrocade Machine Language Source Code Palo Alto Tiny BASIC, Version 3 よりPDFを取得

 TINY BASICなので変数名はA〜Zのみ、@は配列。BASIC変数/バッファ領域はSBC8080システムROMの場合F000HからF087Hまで。適当に変数Aに代入してMONで覗いてみると値が変化しているところがある。調べた結果、
F002H 変数A
F004H 変数B
F006H 変数C
F008H 変数D
F00AH 変数E
F00CH 変数F
...
となっていた。数値は2バイトでリトルエンディアン。ということはここを機械語とのパラメータ受け渡しに使える。

実際に作ってみた例はこちら:TeraTermに送信するときは設定(S)→シリアルポート(E)... で送信遅延を10ミリ秒/字 100ミリ秒/行にするのを忘れずに。

 これは十進補正命令DAAの動作を確認するテスト。変数Aと変数Bの値を加算し結果を変数C、フラグを変数Dに格納。その後DAA命令を実行し、結果を変数E、フラグを変数Fに格納する。いずれも下位1バイトしか使わない。8080アセンブラで初めて書いたのでみてみて。
 8000 LXI       D,F002 変数AへのポインタDE
 8003 LXI       H,F004 変数BへのポインタHL
 8006 LXI       B,0000 BC←0 これはAFのクリア用
 8009 PUSH      B
 800A POP       PSW AFクリア
 800B LDAX      D Accに変数Aの内容をコピー
 800C ADD       M Acc ← Acc + 変数B
 800D PUSH      PSW いったん結果を保存
 800E DAA      十進補正
 800F PUSH      PSW
 8010 POP       B AFのペアをBCにコピー
 8011 MOV       A,B
 8012 STA       F00A 変数Eに十進補正後の結果を返す
 8015 MOV       A,C
 8016 STA       F00C 変数Fに十進補正後のフラグを返す
 8019 POP       B
 801A MOV       A,B 変数Cに補正前の結果を返す
 801B STA       F006
 801E MOV       A,C
 801F STA       F008 変数Dに補正前のフラグを返す
 8022 RET
  これをBASIC側から変数Aと変数Bを0〜255の範囲で変化させてEXEC 0で呼び出し、結果を含めて画面出力するだけ。文字出力はBASIC内のサブルーチンを呼び出せばできそうだったが手を抜いてBASIC側でやった。ループも同様。どのみち9600bpsの端末への出力なのでいくら高速化してもそこで律速となる。

 なんでこれを作ったかというとIntel純正8080に対してNEC 8080Aは独自改良でDAA命令を修正したが、非互換ということでNEC 8080AFでIntelとまったく同じ動作に戻したという話があったので調べてみようと思ったからだ。次回お楽しみに。




復活!TK‐80
Posted with Amakuri at 2019.1.13
榊 正憲
アスキー

ソ連のCPU KP580BM80Aの動作確認(2)

 前回の続き。

 さて、KP580BM80Aの動作が怪しいので確認用にebayでもう1個購入。2週間程度で届いた。

 マークが{S}みたいなのは製造元(工場?)が異なるため。
2019KP580-1

 で、問題なく動作。ということはKP580BM80Aは個別故障ということになる。
2019KP580-2

 PALO ALTO BASICで5.09V/0.51A、BASICでA=A+1しながら数字を表示するループ実行で0.53A。電圧高めなのはスマホ用のUSB電源アダプタを適当に使ったせい。

 これでおしまい、でも良かったのだけれどももうちょっとだけ調査。

 割り込みの観測のため8080のINTE(pin16)にLEDを追加。電流制限抵抗は大きめ(8.2kΩ)にしたので駆動力ヨワヨワの8080でも問題ないでしょう。
2019KP580-3


 INTEは故障と思われるKP580BM80Aでもリセット後は点灯。ただし端末側のキーを押してINTを発生させるとLEDで消え、画面に連続した文字は出なくなる。つまりPALO ALTO BASICのROMで割り込みを受けるまでは画面に連続して文字が出ているので、CPUはなにかしらの命令を実行しているのだが、どこかで暴走しループしているように見える。
2019KP580-4

 故障箇所は前回の調査でわかった「INT信号で割り込みが発生し割り込みがマスクされるが38Hには飛んでいない」以外にもあり特定の命令の実行またはジャンプ先が変わるような動作でおかしくなっているようだ。少なくとも00HのNOP連続による動作はできた。

 横井与次郎著 マイクロコンピュータ・ハードウェア基礎技術 のp.156にある3.1.3 8080Aの絶対最大定格によると-5V側の電流は1μA〜1mAとあるが、ここの電圧が0Vだと+5V/+12Vの電流が非常に大きくなるので長時間-5Vを与えない状態で使うのはしてはいけないと書いてある。ということは何らかの原因で-5Vが印加されなくなったら動くことは動くけれども発熱で8080が故障するのであろうか。

 まあ良品を壊してまで調べようとは思わないので故障調査はこれでおしまい。ということでソ連製の8080クローンでもSBC8080は動作します。




ソ連のCPU KP580BM80Aの動作確認(1)

 SBC8080ボードができたので手持ちのコレクションについて動作確認。

 まずはソ連製の8080クローン、580GF24(8224)/580BK38(8238)/580BM80(8080)。
SBC8080+SUBボードで 5.03V 0.31A。PALO ALTO BASIC動作した。
2019SBC8080-1

 では、CPUを8080AクローンのKP580BM80Aに交換してみる。
2019SBC8080-2

 すると、このような表示に。最初はカタカナが連続して表示される(途中で繰り返すように見えるのはリセットを1回かけたため)。
2019SBC8080-3

 これはどういうことだろう。SBC8080ボードではCPUの周りのアドレスバスはHC541×2、データバスと制御信号は8238(8228)でガードされている。ということでまずはアドレスバスを疑いHC541→LS541に交換してみたが現象変わらず。次にデータバスと制御信号について、NEC uPB8228C / NEC uPB8224Cに交換してみたがこれも現象変わらず。
 SBC8080ボード用フリーランテストボードで確認してみたが00H(NOP)によるフリーランはできている。
2018SBCLED-3

 さて、どうしようか。の前にソ連製の8080クローンについて。

USSR 8080 microprocessor family(CPU-World) によると、3種類の8080/8080Aクローンが存在する。
・580VM80 8080のクローン
・KR580IK80A 8080Aのクローン
・KR580VM80A 8080Aのクローン、2.5MHz動作
独自に作られたものもあるようだ。ソ連はずっと8080互換でやってたんだろうか。
・KR580BM1 5V単一電源、5MHz動作、ピン非互換

なおKR580VM80Aはアルファベット表記で、本来は КР580ВМ80А とキリル文字で表記するらしい。キリル文字の方で検索するとロシア語のドキュメントに当たりやすい。

 580BM80Aについてはビデオゲームの修理にそのまま交換部品として使われていたりリバースエンジニアリングでVerilogソースまで調べられているので、論理的には同一のはず。

 PALO ALTO BASICでは調査も難しいのでもっと簡単なテストプログラムで確認してみる。SBC8080 CPUルーズキットで提供されているSBC8080データパックにある、TEST80というプログラムを使用する。これは8251を使ったエコーバックテスト。で、TEST80.HEXをROMに焼いて電源をいれると580BM80Aではプロンプト">"は出るがエコーバックせず。キーを押しても応答なし。いきなり当たりか?念のためSBC8080SUBボードの82C51を8251に変えてみたが現象変わらず。まあ文字の送信ができているということは8251の初期化はできているっぽい。

 端末からデータを受信すると8251はRXRDY信号を上げる。これは8080のINT入力に接続され、RST7割り込みが発生する。TEST80プログラムは割り込み発生後、38H番地からのコードで8251から1文字読んでメモリ上のバッファに書き込み、割り込みを再度許可する。TEST80プログラムはメインルーチンではバッファに何か文字があるとそれを送信し、バッファを空にする。

 ということで割り込みの状態を監視してみる。8080のINTE(pin16)を観測。以前作ったロジックチェッカーを使用した。で、NEC 8080Aでの結果はINTEは一瞬LになるがすぐHにもどる。つまり割り込みを受け付けられる状態になる。580BM80Aはリセット直後はINTEはHだが、キー入力があるとLになりそのまま。これ以降は割り込みを受け付けない。
2019SBC8080-4


 ここからはTEST80にパッチを当てながら確認していく。最初は38HにEI命令を入れてすぐに割り込みを許可するようにした。NEC 8080Aでは連続して割り込みが発生。これは8251の割り込み要因を落としていないので期待通りの動作。580BM80AではINTE信号がH→Lとなりそのまま。

 8080は割り込みが発生するといったんINTEをLにする。割り込み処理のプログラムで割り込み要因を落とした後、最後で割り込みを許可する。なので割り込み自体は受け付けている。あとは本当に38H番地に飛んでいるかどうかだ。
 さてそれをどう確認するかだが、SBC8080SUBボードにちょっとLEDを追加した。8251のTXRDY端子にLEDカソード側を接続、アノード側をVccへ。これで送信バッファがフル(=1文字送信中)の時に光るはず。
2019SBC8080-5

 パッチは38H番地にOUT C0Hを書き込む。これはAccにあるダミーデータを1文字送信する。580BM80Aでは一瞬も出なかった。念のためロジックチェッカーで監視しても同じ。つまり38H番地には飛んでいないということになる。

 以上から手持ちのKP580BM80Aは
・INT割り込みで割り込みをdisableするが38H番地へは分岐していない。
・別の番地へ飛んでいるのかHALTしているのかはバスの観測が必要。
・CPUの差し替え事例から個別故障の可能性がある。


ということで別に手配したKP580BM80Aを使って確認する予定。


インテル8080伝説
Posted with Amakuri at 2019.1.2
鈴木哲哉
ラトルズ

SBC8080ボード用フリーランテストボード

 手持ちのコレクションCPUが生きているかどうか気になる。Z80についてずっとデータ00Hをフェッチさせてアドレスバスを観測する手法があるが、SBC8080ボードでもいけるはずなので40ピンのバスに接続するアダプタを作った。

8ビット CPU Z80LED点滅(Yamamoto's Laboratory)

データバスを10kΩ×8の集合抵抗でプルダウン、A15〜A0をLEDのアノード、*MEMWR、*MEMRDをLEDのカソードに接続、電流制限抵抗は大きめ(〜10kΩ程度)、これでも充分明るい。LEDはバータイプ10個のものを2つ使うとA15-A0、*MEMRD、*MEMWR、*IORD、*IOWRでちょうどよい。

2018SBCLED-1

2018SBCLED-2

 左端のA15,A14あたりが点滅して見える。〜A0まで点灯して見えるが実際は高速に点滅している。
2018SBCLED-3

 フリーラン用のデータバスプルダウンを外せばバス観測に使えるはずなので作り直すかな。その時はピカピカ光るのでSBCゲーミングボードとしよう。



SBC8080ボード

 記事を書いてたつもりが抜けていたのでメモとして。


 8080Aは周辺チップが必要なことと+12V/-5Vの回路のせいでSBCシリーズとしては部品密度高めです。確実な組み立て方としては

(1) NJM2360A周辺を実装し、5V供給で+12Vが生成されることを確認
2018SBC8080-1

(2) 8224周辺と-5V生成回路を実装し、-5Vが生成されることを確認
2018SBC8080-2


(3)残りの部品を実装
2018SBC8080-3


の順でやればよいでしょう。

 ROM/RAM/UARTについては秋月B基板サイズに収まらないためSBC8080SUBボードに実装されます。作例では40Pフラットケーブルで接続されていますが、私はピンヘッダとピンソケットで重ねられるようにしました。このうちピンヘッダはSBC8080SUBボード側の部品面に、ROMなどソケット部品が干渉しないよう背の高い連結ピンヘッダを半分にカットして使用、SBC8080ボード側ははんだ面にピンソケットを実装。

ボードの間隔は17mmになります。この高さのスペーサがなかなか見つからないのですが、使用すると接続後しっかり固定できます。
2018SBC8080-4

 動作確認はSBC8080システムROMで行った。以下は手持ちの石の組み合わせ。

NEC uPB8224C / NEC uPB8228C / NEC D8080A


次回予告:寒い国から来たCPU


インテル8080伝説
Posted with Amakuri at 2018.12.31
鈴木哲哉
ラトルズ



記事検索
プロフィール

hardyboy

カテゴリ別アーカイブ
月別アーカイブ
QRコード
QRコード
  • ライブドアブログ