まごころせいじつ堂

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

マイコン

SBCV20 16MHz動作への道

 V20/V30には16MHzで動作する高速バージョンのV20HL/V30HLというのがある。これをSBCV20で動かせないかやってみた。

 クロックジェネレータuPD71011Cは接続した水晶振動子の周波数をOSC(pin12)、1/2の周波数をCLK(pin8)、1/4の周波数をPRCLK(pin2)に出力する。uPD71011C-8は16MHz、uPD71011C-10は20MHzまでOKなので、16MHzの水晶振動子を使いOSC出力をCPUのクロックとして使い、1/2のCLK出力を周辺用のクロックにする。USARTは8MHz以上で動作するuPD71051C-10にし、ボーレートのクロックは以前SBCV20とクロックジェネレータでやったPIC12F1822により独立して供給し、システムのクロックに依存しないようにする。

 改造はパターンカットと配線2本。
(1) IC5: uPD71011Cのpin8(CLK)近傍とIC4: uPD70108のpin19(CLK)をカット。
(2) IC5: uPD71011Cのpin12(OSC)とIC4: uPD70108のpin19(CLK)を接続。
(3) IC5: uPD71011Cのpin8(CLK)とIC8: uPD71051Cのpin20(CLK)を接続。

※IC9: HC4040は外してPCI12F1822基板に差し替えているので(3)はショートしない。
※クロックの配線を両端でカットするのはアンテナになるのを防ぐため。

2021-02-17 02.15.17

 16MHz動作のメモリリードは2サイクル分で125nsなのでこれより速いROM/RAMを使用する。ROMはSTMicro M27C512-10F1、RAMはFUJITSU MB84256C-70Lに交換した。

 あと、あまり関係ないがSBCV20においてIC6はHC257の代わりにHC157が使える。

 さて、16MHzの水晶振動子を挿して実験。8080モードでのBASICは起動するがオーバーフローエラーが出てASCIIART.BASが止まる。起動時のメモリ表示も"031171 Bytes free"と先頭に0がついていておかしい。
スクリーンショット 2021-02-17 020808

 手持ちの14.31818MHzに落として実行。今度はうまくいった。ASCIIART.BASの実行に1分44秒。
だがこれはたまたま動いたことが後に判明する。
スクリーンショット 2021-02-17 021422

 さて、V20HLは16MHzまでOKなのに動かないのはおかしい。何が間に合ってないのか。このV20HL uPD70108HCZ-16は5個1000円くらいで購入したもの。外し品らしくピンには半田の跡。どうもあやしい。
 skyriver(@wcinp)さんの記事、レトロマイコン86ボードの構想(その22) 16MHz動作実験2 [8086] によるとリマーク品の疑いが。そこで残りの4個で動作確認してみると16MHzではBASICも起動しないもの、14MHzでオーバーフローエラーが出るものとおかしいものばかり。最初に引いたのがたまたま良品だったらしいのだが、これも再度14MHzで動作させると表示途中でオーバーフローエラーとなった。
 挙動を比較するため手持ちのuPD70108C-10、これはFM-11の改造用に新品を秋葉原で購入したものだが14MHzで動作させると他のものと同様のオーバーフローエラーが出た。ここから推測すると手持ち5個のV20HLはuPD70108C-10のリマーク品である可能性が高い。
 確認のためにV20HLを10MHzでASCIIART.BASを二時間連続で走らせると5個ともPASSした。
追記:12MHzでもPASSした。V20HLの12MHz品の可能性がある(はせりんさんより)

 LSIの動作周波数の上限を決めるものとしてクリティカルパスというのがある。内部の論理でいちばんタイミング的に厳しい部分が足を引っ張ってしまう。SBCV20のBASICは8080エミュレーションモードで動作していることを考えると、ノーマルV20の8080エミュレーションモードのどこかにクリティカルパスがありそうな気がする。
 また、V20は8088と差し替えクロックジェネレータも交換して12MHz動作でPCXT互換機を売っていた頃があるので実力でそのくらいで動きそうではあるが、残念ながら12MHzの発振子を持っていない。

 ということでこれ以上はV20HLの良品がないと確認できないのでどなたか挑戦してみてください。いちおう別のところからオーダーしてみましたが本物が来るかどうか……


skyriverさんのコメントを受けて写真追記:

uPD70108C-10 本物
IMGP3701
IMGP3702

uPD70108HCZ-16 ? (白字は私が書き込んだもの) ebay経由adeleparts2010より5個セット
IMGP3703
IMGP3704

uPD70108HCZ-16 16MHzでは動作せず12MHz OKebay経由CHIPS GATEより
IMGP3705
IMGP3706







SBCV20とクロックジェネレータ

 電脳伝説さんのSBCV20キットが発売になりました。

SBCV20専用プリント基板(オレンジピコショップ)

 技術資料とデータパックはそれぞれの商品説明のページにリンクされている。これによるとV20の代わりに8080を動かすためにはクロックジェネレータをuPD71011Cから8284Aに交換し、クロックを分周してUSARTの通信用クロックを作っている74HC4040のタップを切り替える。これは8088がデューティ比1:2のクロックを必要とするのでi8284Aが大元のクロックを÷3するため。V20は1:1のクロック入力でuPD71011Cは÷2。昔8086搭載パソコンにV30を差し替えるのが流行ったけどクロックジェネレータまでは交換してなかったのでタイミング的には実力で動いていた模様。

 さて8088は昨年秋葉原でなぜか新品と思われるものが店に並び、とある方から地方在住の私宛に送っていただいたので動かそうと思ったのだけど上記の変更に加え水晶振動子を14.7456MHzに交換しなければならない。これは準備していなかったのだがUSARTの通信クロックを独立させればと以前やった『SBC8080SUBボードのクロックをPICで』と同じ手を使った。

2021-01-24 17.57.02

 74HC4040の代わりに小基板をつけて、osc1536.hexをPIC12F1822に書き込み搭載。osc1536.hexについては『モトローラ6800伝説』とSBC6800ルーズキットを参照のこと。

 配線はこちら。
2021-01-24 19.38.25

 PIC12F1822をICソケット経由で実装するとすぐ下になる抵抗とダイオードに干渉するけどちょっと浮くだけだしまあいいか。
2021-01-24 17.58.04


 さて、これでよかろうと動作確認してみたら文字化け。
2020-12-30 12.19.48


 クロックは周波数カウンタで確認してちゃんと出てるけどなんでだろうか?


 これはクロックジェネレータがバイポーラかCMOSかの違いで水晶振動子の両端を抵抗でGNDに落とすか10pFのコンデンサで落とすか処理が異なっていたのが原因。これは知らなかった。

 データシートを見るとバイポーラの8284Aだと510Ωの抵抗で水晶振動子の両端をGNDに落としている。
スクリーンショット 2021-01-24 18.55.54

 このあたり気になったのでFM-11の8088カードで確認したら同様だった。ただしVccにつなぐ30pFのコンデンサはなかった。

 SBCV20基板の10pFコンデンサの足をカットし、裏面に抵抗(680Ω)を付けて動作OK。
2021-01-24 17.57.17

2020-12-30 22.07.36



UPD71011データシート(renesas)を見るとコンデンサで処理してある。8284Aと動作が同じuPD71084を使う場合はCMOSなのでuPD71011Cと同様にしなければならない。

参考:V20/V30の周辺デバイス(Electrelic)









SBCF8の組み立て

 aitendoにスポット入荷したFairchild F8。私は二巡目で入手した。このままではただのコレクションになってたところを電脳伝説さんのSBCF8を組み立てる機会に恵まれたのでやってみた。

 SBCF8はSBC8080と同様にSBC8080SUBボード上のメモリとUARTを使用する。また、今回からはバス上で使用したかったためSBC-BUS Rev.02とそれにコネクタをあわせたSBC8080SUBボードを先に作った。
 SBCF8はSBC8080と同等の5V→12V昇圧回路があるが部品を探し出すのが面倒だったため秋月電子から購入したDCDCコンバータを使用した。これは±12V出力のものだが手持ちでこれしかなかったため。ちょっと割高。
ほぼ部品は手持ちでOKだったが2MHzの水晶振動子は別に入手。4MHz以下くらいの水晶振動子は入手しずらくなっている感じ。
2020-11-28 04.08.17

 さて動作確認をしたのだが動かず。2つの問題点があって、ひとつはSBC-BUSに1つずれて挿入していたこと。これでも電源ははいってしまうので気付くのが遅れた。もうひとつはDCDCコンバータの配線が切れてしまっていたことでVGG(+12V)が供給されていなかった。ここではついでにDCDCコンバータ前後のコンデンサを余裕がなかったかな?程度の考えで3.3uF→33uFに交換している。
2020-12-07 00.58.47

TINY BASICが動きました。
2020-12-07 00.59.48

USB電源アダプタを使用して、消費電力は5.14V/0.25Aで約1.3W。
IMGP3683

 ついでにVGG/VCC確認用のLEDを追加。
IMGP3689

 これで12Vを確認。
IMGP3686

 電脳伝説さんありがとうございました。



F8関連で探した資料は以下:

http://aitendo3.sakura.ne.jp/aitendo_data/product_img/ic/MOSTEK/MOSTEK_Microcomputer_Data_Book.pdf

http://datasheets.chipdb.org/Fairchild/F8/fairchild-3850.pdf

www.bitsavers.org/components/fairchild/f8/F8_prelimUM_Jan75.pdf

https://www.chessprogramming.org/Fairchild_F8

https://orphanedgames.com/videobrain/f8_programming/f8_programming.htm

Fenestra6502の石数削減の検討

 @hatsugaiさんのFenestra6502。既存の6502にレジスタウィンドウ的なメカニズムを外付けして、関数呼び出しでの引数/結果の受け渡しに関わるコストを劇的に改善している。
 引数の受け渡しおよびローカルな作業エリアはダイレクトページ上に確保し、関数呼び出しとリターンに対応するJSR/RTS命令でこれらの領域がずれて割当てられる。256バイトのダイレクトページは以下の割当て。

%i $00-$3F  呼び出し元からの引数。RTSでもどる前に結果をここに置く。
%l $40-$7F ローカル作業エリア。
%o $80-$BF JSRで呼び出す先の引数を与える。JSR先では%iで参照。
%g $C0-$FF グローバルエリア JSR/RTSで割当ては変化せず。

%i,%l,%o,%gはSPARCアーキテクチャのレジスタウィンドウに合わせた分類で、役割も同様。
JSR前の$80-$BFが飛び先では$00-$3Fに対応する。

他にレジスタウィンドウを持つアーキテクチャはAMD Am29000、Intel i960、Intel Itanium、クヌースのMMIX。HITACHI H16も似たようなメカニズムを持つ。

 Fenestra6502の仕組みについて。128Kバイトのメモリについて、$100C0~$1FFFFを65C02のアドレス空間に割り当てている。65C02の$0000~$00BF(192バイト)については外付けの回路でアドレス変換を行い、$00000~をダイレクトページ領域として割り当てている。
 アドレス変換はJSR命令で+1、RTS命令で-1するアップダウンカウンタを持ち、ダイレクトページをアクセスするアドレス$0000-$00BFとこのカウンタの値(7bitオフセット:x128)を加算し128Kバイトのメモリ$00000~に変換する。
 カウンタは65C02のスタックが256バイトしかないので、0~127の7bitで充分。(JSR命令で2バイトのアドレスをスタックに積むため)


 Fenestra6502のハードウェアはW65C02Sと制御用のATMEGA164P、128Kx8 SRAM 628128。GAL 22V10 x2、LS74、LS191 x2、LS283 x2、LS257 x2。10cm x 10cmの基板に収めるのはちょっときびしい気がする。GALを活用すればさらに石の数を減らせるんじゃないかと検討してみた。

 Fenestra6502の回路図。(2020/10/14 Rev, 1.2)
Fenestra6502


検討1:U6 LS74の削減

 INSTDEC(GAL 22V10)はJSR/RTS命令をデコードして次段のLS191に対しカウントアップ/ダウンの指示をしている。このカウンターへの指示はLS74で1サイクル分保持されている。この程度ならINSTDECに吸収できそうだ。


 FFの初期化のためのRESETを追加。これでU6 LS74をなくすことができる。


検討2:デコーダとカウンタの統合

 カウンターは7bitあればよい。これと命令デコード部分を1つのGALでできないか?
 SYNC信号は命令フェッチのタイミングを示す。この立ち下がりのタイミングでデータバスに乗る命令をデコードし、そのままカウンタのアップ/ダウンを指示すればいけそうな気がする。SYNC信号を反転してその立ち上がりで動かせばよさそう。こういうのは昔の汎用ロジックの使い方っぽい。SYNC信号は!SYNCOUTとして反転出力し、それをGAL 22V10のCLK入力に与える。
 命令デコードは8bitのデータバスを扱うためこれをそのままカウンタ回路につなごうとすると項数オーバーでパンクしてしまう。そこでデコード結果はいったんDU,CTEN出力として割り当て、フィードバックループでぐるっと回して入力信号に与える。
 これで命令デコーダとカウンタはGAL 1個に入った。検討1での代わりに使うとLS74、LS191 x2の計3個を削減できる。そのかわりWR/RDなどの信号が扱えなくなるがこれは後で別のGALに追い出す。



検討3:加算器をインクリメンタに変更

 カウンタの出力7bitはアドレスA[13:7]に対応する。これにゼロページの変換対象となるアドレス$0000~$00BFが加算されるが、この下7bit A[6:0]はそのままスルーでA[7]のみカウンタの値と加算される。これは全加算器ではなく+1インクリメンタで充分。
A[14]はカウンタの値が繰り上がった時に'1'だけど実質常に'0'。A[15]は常に'0'。
SRAMに与えるアドレスYA7はGALのU4 ADDRDECで生成しているRA7と同等のもの。端子が空いていたので配線の都合がよいように定義しただけ。
インクリメンタが出力するアドレスY15~Y8(ついでにY7)はOEでアウトプットイネーブルの制御を行う。これに65C02からのA15~A8を接続したLS245(新規追加)の出力をSEL信号で選択することによりアドレス変換/無変換後のアドレスをSRAMに与えることができ、LS257 x2を削減できる。
 これで従来の加算器とアドレスセレクタはLS283 x2とLS257 x2の4個を削減、GAL +1、LS245+1。



検討4:その他の論理

 検討2ではみ出てしまった RAM OEとRAM WEをGAL ADDRDEC(22V10)に押し込む。


これで最終的にGAL 22V10 x3、LS245 x1になった。あとはレイアウトの都合で端子の配置を手直しすればよさそう。



※これは机上での検討のみで実際には作っていませんのでご注意ください。



 えっamazonにあるの?

Z80に68系の周辺LSIをつなぐ(調査)

 調べ物をしていてたまたま見つけたのだが、Z80に68系の周辺LSIを接続している例を見つけた。

スクリーンショット 2020-10-08 1.24.53

 これはAKAIのサンプラーS612の回路図。~IORQの反転がACIA HD6850PのEクロックとして与えられている。~IOREQはZ80のI/O空間へのアクセス時にenableになる信号で定期的に出ているわけではない。
 似たような回路でSHARP X1ではCRTC HD46505のレジスタの読み書き時のみE入力に一発パルスが与えられるようになっている。

 これ規格を満たしていないんじゃ?と思ったけどHD6850PはEクロックのHの幅とLの幅は最小値だけ定義していて最大値はないのでこれでいいらしい。MC6850も同様だった。ACIAは送受信用のクロック、CRTCはビデオタイミング用のクロックを外部から与えるのでCPU側から読み書きするEクロックはこれでもよいみたい。

 Z80のCLKに対して~MREQは2サイクル分、~IORQは3サイクル分enableになるのでZ80-4MHzに対して68系の周辺LSIは1MHz品で良さそう。(I/O空間の場合はZ80-6MHzまで)



PLDR6502:SBC6800で6502を動かすボード

 電脳伝説さんのSBC6800をベースにCPU部分を差し替えるだけで6502にするドータボード、PLDR6502を作りました。


※PLDR6502基板配布中です。twitter経由でご連絡ください。




上記改造については各所で追試していただきました。

SBC6800で6502を(Electrelic 電子的遺物の世界へようこそ)

 PLDR6502はSBC6800上の6800を外して代わりに取り付けるだけで6502ボードにすることができます。以前行ったLS138の改造は不要です。



- PLDR6502回路図 -

PLDR6502V01L01-sch
・W65C02S-RDYはR1でプルアップ/NMOS 6502、R65C02では~HALT。J4ショートで接続可(通常オープン)
・W65C02S-VPBはJ3オープン/NMOS 6502、R6502はJ3ショートで電源接続(実際にはオープンのままでも問題ない)
・プルアップ抵抗R3はSBC6800側LS138に与えられるVMA信号の代わりで常にenableにする
・R5~R12はW65C02Sのデータバスプルアップ用。省略可
・パスコンC1は省略可


- 組み立て -

 PLDR6502は秋月電子C基板サイズ(72x47mm)です。
2020-09-28 16.08.37

必要な部品:
丸ピン40P ICソケット x1
40P ICソケット x1
40P 連結ピン x1
抵抗 3.3K〜10KΩ x4 または4素子集合抵抗


 裏面のSBC6800との接続部分に丸ピンICソケットをハンダ付け後、ソケットの桟を切断。ICソケットは脆いものもあるので注意。
IMGP3640

  基板の表側に先程ハンダ付けしたICソケットのピンがこれからハンダ付けする6502用のICソケットと干渉するので切り詰める。
IMGP3641

 40P ICソケットとプルアップ抵抗R1~R4をハンダ付け。ここでは集合抵抗を使用。
IMGP3642

 これを動作するSBC6800上の6800と交換して連結ソケットを使い取り付け。ROMも6502用のものに交換。
IMGP3644

 これは集合抵抗を使わずバラの抵抗を使った例。
IMGP3646

 連結ソケットを直接ハンダ付けして取り付けることもできますが、SBC6800のDIP部品をソケット経由で取り付けている場合少し干渉します。ハンダ面から突き出たピンをカット。
IMGP3647

 丸ピンICソケットをPLDR6502の裏面に取り付け、SBC6800との間を連結ピンで接続すれば干渉しません。
IMGP3649

連結ピンは以下のもので確認しました。(いずれも秋月電子)
【P-00269】 丸ピンIC用連結ソケット(両端オスピン・1列20P) 1×20
【P-00268】 連結ソケット(両端オスピン)40P



 設計データ一式はinventhubで公開しています(KiCad 5.1.6)。PLDR6502V01L01.zipはガーバー一式でこれをそのままpcbgogoに発注できます。

※inventhubはプリント基板の配置配線を表示できますが.jpgや.pngを今のところ直接表示できません。


 さて最後に。この基板の名前はパイルダー6502と呼ぶんじゃ。これが言いたかった……


ポピニカ魂 PX-04 ホバーパイルダー
BANDAI SPIRITS(バンダイ スピリッツ)
2009-06-27


FM77AV用Z80Hカード韋駄天の回路図訂正と補足と蛇足

 I/O 1987年10月号、1987年11月号および6809活用研究(工学社)に掲載された韋駄天CP/M Z80Hカード。回路図に誤りがあってその後訂正も掲載されず、紙の資料も紛失してしまったので実物から正しい回路図を起こした。

 部品面
IMGP3592

 はんだ面
IMGP3593

 レイアウト
IDATEN-Z80H-LAYOUT

 回路図
IDATEN-Z80H-SCH

 回路図は実物からトレースしてそのまま起こした。
・SRAM(U2,U3)に対する*WEの論理が訂正箇所です。
・U12のLS02は実質不要で、U10のLS04の空きで代替可能。

 FM77AVの拡張RAMスロット図(FM-7シリーズ テクニカルノウハウ 第15章ハードウェア回路図)
IMGP3594

補足:
・6809とZ80Hのやり取りはFM77AV側の$FD64番地と$20000-$2FFFFの拡張RAM領域で行う。
・FM77AVのリセット後、Z80HはU4A(LS74)によりZ80RESET信号が有効になりリセットがかかったままの状態になる。この解除と再リセットは6809側で制御する。Z80にリセットがかかっている間はZ80のバスがハイインピーダンス状態のままであることを利用している。
・Z80Hから6809への要求はZ80側のI/O空間ライト動作でSETATTN信号がU4B(LS74)をセットする。6809は$FD64番地のbit0をポーリングしてZ80Hの要求を確認する。Z80Hがバス開放状態(Z80RESETまたはBUSACK)になればZ80BUSY信号が有効になりU4B(LS74)をクリアし要求を取り下げる。
・6809からZ80Hへのバス開放要求は$FD64のbit7書き込みで制御する。
・6809から$FD64のbit6,bit5に"1"書き込みでZ80HへNMI/INTを発生させる。
・バス開放要求/割り込み要求はU5(LS175)に保持される。Z80HからのI/O空間アクセス、またはZ80RESETで解除される。
・6809からZ80Hのバス開放状態を確認するには$FD64のbit7を読みZ80BUSYの信号をみる。
・MEMSEL信号は6809から$20000-$2FFFFのRAMをアクセスするときに有効になる。U14(LS138)でデコードして生成。Z80BUSY信号もデコードに入っているのでZ80H動作中は6809から読み書きできない。
・U2,U3(HM62256)に対するRAMOEはMEMSELまたは!Z80BUSYによるZ80動作中に有効。
・RAMWEは6809側の書き込み(MEMSEL&RWB)またはZ80Hのメモリライト(WR&MREQ)で有効。
・Y1(X'tal) 10MHzは実力で動作した。本来は8MHz。

蛇足:
・MEMSELを生成しているU14(LS138)にRWBも突っ込んでRAMWE用の信号を作ってもよかったかな?いや無理か。
・SRAM、OEがenableのままでWEがenableになってもいいんだ…(OE Low Fixed) HM62256 Datasheet
・当時Z80Hと32KバイトのSRAMは若松通商で買った最先端テクノロジーだ。今なら20MHz動作を狙えるか。
・master/slaveで言えばリセットが掛けられるZ80は6809に生殺与奪権を握られているけどCP/M動作中はZ80の要求を6809側ですべてこなしてるのよね。
・記事は3回連載の予定だったが強化版CP/Mが完成せず6809活用研究へと繰り越した。
・移植元となったX1用ランゲージマスター(CP/M)。ベスト電器に注文して届いたら店員さんが「私もX1使ってるんですよ」と嬉しそうに話しかけてくれたが「すみませんFMユーザーです…」申し訳なかった。
・初期の動作テストには@minemaz氏に協力してもらった。私Z80書けなかったので。
・Oh!FM誌に似たようなシステムが掲載されたのでたいへん焦った。同じ時期に同じようなアイデアはあるんだね。
・記事の反響というか感想すらまったくなかったのでちょっとさみしかった。

追記:
・128Kx8のSRAMに交換することを考える。TC551001AS6C1008もライト時*WEがアサートされる時は*OEはどちらの状態でもよい。



ザイログZ80伝説
鈴木哲哉
ラトルズ
2020-11-25



SBC6800+W65C02Sで2MHz動作

 SBC6800を改造せずにW65C02Sを動かす&unimon_6502の移植で動作確認できたので動作周波数を上げてみる。手持ちのACIAは68B50、2MHz品なので目標2MHz動作。
 SBC6800ではPIC12F1822をクロックジェネレータとして使っている。MC6800用なので相補のφ1(P1A)、φ2を(P1B)ハーフブリッジモードで1MHzを出力しているが、6502用に使っているφ2はハーフブリッジモードでしか出力できない端子(P1B)に割り当てられている。φ1(P1A)側だったらCLKOUTをそのまま使えたみたいだけど。
 ディレイ設定を使わなければデューティ50で2MHzをφ1側に出力でき、φ2はその反転出力となる。これで無改造で使えそうだ。

 SBC6800ルーズキットのデータパックより6800crgenのプロジェクトを持ってきてmain.c内の以下を書き換え、MPLABX4.02でビルドした。
PR2 = 3;
CCPR1L = 2;
PWM1CON = 0;
 以下にmain.cの差し替えとPIC12F1822書き込み用のHEXファイルを置いた。

 波形観測。OK。
IMGP3506

 これを使って動作確認。せっかくなので電脳伝説さんが"SBC6800のプチ改造で6502を動かす"で移植したOSI MS-BASICで確認する。実行速度の確認にASCIIART.BASを使用。
ASCIIART.BASのソースは以下にある。

ASCIIART

 1MHzの実行速度が6分50秒に対して1MHzでは3分25秒とちょうど半分だった。

※はせりんさんのまとめで他にもいろいろな機種でのASCIIART.BASの実行速度の一覧が確認できます。

 さて、さらに上を目指すには。W65C02Sは14MHzまでOKだがACIAが足を引っ張るためW65C51あたりが必要。ただしMC6850との互換性はない。PICを使えば2/4/8MHzが生成できそうだがその間が難しい。最大動作周波数が40MHzのPICを使えば5/10MHzができるかもしれない。この場合はPICのCLKOUTがダイレクトに出せる端子に修正したほうがよさそう。


モトローラ6800伝説
鈴木哲哉
ラトルズ
2017-12-16





YAMAHA RX21Lリズムマシンの分解写真

 ハードオフで千円で買ってきたヤマハのリズムマシンRX21L。一応動く。中は8bitマイコンでもはいってるんだろうか。

YAMAHA RX21L(YAMAHA)

 1985年で42000円。当時のパソコンはFM77AVなどでそのくらいの時期。RX21Lは音源の出力とMIDIに加えカセットテープインターフェースも持っている。リズムパターンをセーブ/ロードできるのでほぼパソコン。
IMGP3496

底面のネジを外すだけ。片面基板。
IMGP3497

 音源部。アナログ回路部分はシールドされている。
IMGP3498

 YM2154。
IMGP3503

 コントローラはHD6303。
IMGP3500

 おそらくこれは音源ROM(27128)で差し替えると姉妹機のRX21相当になるのだろう。右は2KバイトのRAM。
IMGP3504

 キャラクタLCD部分はHD44780。これは現在一般的なキャラクタLCDのコントローラ。
IMGP3501

 さて、これですよ。
http://www.dtech.lv/techarticles_yamaha_chips.html によるとドラム波形のROMらしいのだがにわかには信じられん。片側全部NCで基板レイアウト時に寄せすぎてしまったんだろうか。

IMGP3502


おしまい

追記:別の人も発見。スレッドにROMの仕様が。


W65C02S(本物)の動作確認

 本物のW65C02Sが届いたので確認してみた。(オレンジピコショップ W65C02)


 動作確認にはunimonを使用。

 WDC W65C02S6TPG-14 A1S000.2 1148G016 / 裏面なし
IMGP3495

 pin1(VPB)とpin5(MLB)にICソケット経由でLEDをはんだ付け。
IMGP3492


(1)IRQ許可でWAI命令 抜けるとBRKでモニタに戻る

1000: 58 CB EA EA EA 00 // CLI ; WAI ; NOP ; NOP ; NOP ; BRK

→ 1000番地より実行で応答なし、IRQ-GNDショートでモニタに戻る

(2)IRQ禁止でWAI命令 抜けるとBRKでモニタに戻る

1000: 78 CB EA EA EA 00 // SEI ; WAI ; NOP ; NOP ; NOP ; BRK

→ 1000番地より実行で応答なし、IRQ-GNDショートでも変化なし。


(3)STP命令

1000: CB EA EA EA 00 // STP ; NOP ; NOP ; NOP ; BRK

→ 1000番地より実行で応答なし、IRQ-GNDショートでも変化なし。

(4)MLB信号観測

1000: 0C 10 10 4C 00 10 // TSB $1010 ; JMP $1000

→ MLBに接続したLEDが薄暗く点灯(高速で点滅)

・VPB(pin1)-Vss(pin21)間抵抗測定

NMOS品 6502 0.0Ω
R65C02 4.3Ω
フェイク品W65C02S 4.3Ω
W65C02S ∞Ω

 本物のW65C02Sの見分け方はpin1-pin21間の導通を確認するとよい。

 R65C02とW65C02Sはソフト的にはWAI/STP命令を使わないと区別できないことと、VPB-Vss間の抵抗値から手持ちのフェイク品W65C02SはR65C02を元にしたものの可能性がある。

W65C02Sの謎

 手持ちのW65C02Sについてだが、VPB(pin1)とMLB(pin5)を観測してみようと思いLEDを付けてみた。VPBは割り込みベクタ参照時にアサートされる。これは周辺デバイスから割り込みがあった時にデバイスごとに飛び先のアドレスをすり替えることができる。MLBはマルチプロセッサのためのメモリロック信号でASL,DEC,INC,LSR,ROL,ROR,TRB,TSB命令のメモリアクセスでアサートされる。

IMGP3488

 実際に動かしてみるとVPB側は点灯したまま。TSB命令を適当なRAMのアドレスを参照させて無限ループさせてもそちら側のLEDはなにも点灯しない。

 R65C02に追加されたW65C02Sの命令にWAI,STPがある。WAI命令は実行すると割り込みが発生するまで一時停止する。次のコードで停止すればW65C02Sのはずなのだが、通り過ぎてモニタに戻ってしまう。

SEI
WAI
NOP NOP NOP NOP NOP
RTS

追記:
※unimonではRTSではなくBRK命令でモニタに戻ると教えてもらいました。これはRTSで偶然戻っているようです。
WAI

 これらのW65C02Sは2014年にebay経由でgc_marketsというところから5個セットで購入。1つはPET2001で使用中。一番左は動かなかったもの。
IMGP3489

IMGP3490

 刻印は以下のとおり。

W65C02S8P-10 SA1034A // II450HI 0212 MEXICO
W65C02S8P-10 SA1034A // II450 77072-4 MEXICO
W65C02S8P-10 SA1034A // 11450 A48380-2 MEXICO
W65C02S8P-10 SA1034A // なし

 ということで別のところからW65C02Sを手配中。確認する予定。

 さてW65C02Sの作例だがL-Star-Liteのボードを確認してみた。VPBはオープンでバスはプルアップなどしていない。ただし電源は3.3V。

LStar-Lite-MPU


 他にもAN-002: Replecement Notes for Obsolete Versions of 6502 8-bit Microprocessors には各種6502/65C02の違いについてまとめてある。


SBC6800を改造せずに6502を動かす&unimon_6502の移植

 今回はすでに動いているSBC6800ボード側に手を入れずに6502を動かす方法です。

 回路図の修正は以下。φ2inを基準に動作するよう変更。

SBC68006502R2

 実際の改造はCPU用の40P ICソケットとアドレスデコーダの74138を差し替え。

 40P ICソケットは丸ピンのものを使用。pin2,3,5,36,38,39をカット。
※W65C02Sはpin1がVssではなくVPBという出力信号なのでpin1もカット。他の6502/65C02はpin21だけをGND接続しても動きます
IMGP3481

プルアップ抵抗2つをはんだ付け。
pin2(RDY) -^v^v^- pin8(Vdd)
pin36(BE),pin38(SO) -^v^v^- pin8(Vdd)
IMGP3482

 もうひとつの40P ICソケットはpin2,3,5,36,38,39をカプトンテープで絶縁。これをSBC6800のCPUソケットに挿し、その上に先程加工したICソケットを挿す。
IMGP3484

 74138(LS138,HC138)はpin6-pin16をメッキ線でショートしSBC6800上の74138と差し替え。
IMGP3483

 このような感じに重ねる。
IMGP3485

 これでもともと動作しているSBC6800をベースに前回のような苦労をせずに簡単に6502を載せることができた。ループバックテストもOK。


 さて、色々遊ぶにはモニタが必要。そこでElectrelicさんのUniversal Monitorを動かすことにした。

 svnで最新のunimonを取得。6502用のソースが入っている~/unimon/6502 を作業ディレクトリとする。The Macro Assembler ASが必要なのでcurrentをインストールしておく。
SBC6800はMC6850で通信を行うのでこの定義を追加する。~/unimon/6502/dev/ 以下にdev_6850.asmという名前で動作するコードを記述し、~/unimon/6502/unimon_6502.asm内にデバイスを選択する部分を追加。
~/unimon/6502/config/ 以下のconfig.incにMC6850用の定義を追加する。config.incはmakeするときには~/unimon/6502/ 以下にコピーして書き換える。今回は開始アドレスROM_Bを$E000に書き換えた。

 必要なコードとアセンブル後のHEXファイルを以下に置いた。

 手持ちのW65C02/R65C02で動作確認。
unimon_pre

 MOS6502で確認。ちゃんとCPU判別をしている。
unimon_MOS6502

 これでもっと遊べますね。あらためてSBC6800作者の電脳伝説さんとunimonのElectrelicさんに感謝します。


モトローラ6800伝説
鈴木哲哉
ラトルズ
2017-12-16


SBC6800を改造して6502を動かす

  6502は6800にバスがよく似ててアドレス/データバスはまったく同じ。ユニバーサル基板で動かそうと思うとバス周りの配線が面倒くさいが電脳伝説さんのSBC6800ルーズキットをベースにすればいけるんではないかと改造を考えた。パターンカットはなし、MPUの差し替え以外は部品はまったく同じ、プルアップ抵抗を3つ追加。

 前回、6502のクロック調査でクロック周りはこれで観測した。
SBC6800mod-6502


 パターンカットは行わない。×印は無視。オレンジ色はソケットでピンを上げてカプトンテープなどで絶縁。
SBC6800mod-6502-board0

 ハンダ面はSO(pin38)と74138(pin6)のプルアップ2箇所。
SBC6800mod-6502-board1

 工作はこんな感じ。
IMGP3466

 クロックジェネレータであるPIC 12F1822とMPUの位置が近すぎるので基板に取り付ける前に配線。
IMGP3467

 が、それでも抜けがあった。7400のpin1に追加ではんだ付け。
IMGP3473

 RDY(pin2)のプルアップ
IMGP3471

 SO(pin38)と74138(pin6)のプルアップ
IMGP3472

 アクロバティックな改造になってしまった。素直にパターンカットをする方向で考えたほうがよかったかもしれない。次回、φ2inベースで改造する予定なのでそのときは考慮する。

IMGP3478


 エコーバックテスト。これはモトローラ6800伝説のコードをそのまま6502向けに移植したもの。The Macroassembler ASを使用した。書いてて思ったのがBRAないのね、とかASRはなくてLSR使うのね、とかビッグエンディアンなのね、など。


※一箇所、改行$0D,$0Aを$0F,$0Aと間違えた箇所があります。

echoback6502


今後の方針:
・現在R65C02を使って動いているがW65C02Sを使ったら動かなかった。クロックは正常だがA7,A8,データバスが変化しR/Wが'L'でこれはおかしい。Electrelicさんのところでも動かないらしい(W65C02続報)のだが、こちらでは別個体のW65C02がPET2001用ボードで動いている。要調査。
・φ2outをベースに動作させているが、φ2inベースの改造もやってみる。



モトローラ6800伝説
鈴木哲哉
ラトルズ
2017-12-16


6502のクロック調査

 6502とApple IIシステムROMの秘密を読んでSBC6800をちょっと改造すれば6502で遊べるのでは、と思いついた。クロックジェネレータ役のPICの1MHz出力を6502のφ2inに接続し、φ2outを6800のE信号代わりにすればできそうと思ったがW65C02のデータシートに気になる記述が。
PHI1O and PHI2O clock delay from PHI2 is no longer specified or tested and WDC recommends using an oscillator for system time base and PHI2 processor input clock.
φ2inとそれから生成するφ1out、φ2outのタイミングは規定せず外部からのφ2を基準にしろと書いてある。ということで手持ちの6502と65C02でφ2inとφ2outの観測を行った。

 CH1はPICの出力する1MHzで6502の37ピン、φ2in(φ0)に接続。CH2は39ピンのφ2outで受け端のLS00で観測。データシートでは下がりきった所のディレイだが、画像は立ち下がり始めの所の比較。
20206502-1

・W65C02 φ2inとφ2out間の規定なし 約50ns/25ns
20206502-2-W65C02


・R65C02 φ2in↓からφ2out↓までmax 50ns 実測値約50ns/25ns

R65C02-Tdly50ns


20206502-R65C02


・SY6502 φ2in↓からφ2out↓までmax 65ns 実測値約50ns/50ns
SY6502CLK-65ns

20206502-SY6502


・MOS6502 φ2inとφ2out間の規定なし、バスタイミングはφ2outベースで記述 約50ns/50ns
20206502-MOS6502

 1MHz動作でφ2in-φ2out間のディレイはNMOS品で約50ns/50ns、CMOS品で約50ns/25ns。NMOS品は立ち上がりがCMOS品よりもなだらか。
 この程度のディレイだと1MHz動作(有効時500ns)ではI/Oやメモリアクセスで300nsかかったとしても充分余裕がある。

 では実際のパソコンなどではどうか?回路図を探して確認してみる。

APPLE 1:φ2outを使用していない
APPLE II:φ2outを使用していない
PET2001(初代);φ2outはPIA/VIAのみ。バッファ経由で外部引き出し
PET2001N(DRAM版);φ2outはPIA/VIA/VRAMアクセスのみ

 ということで積極的には使っていない模様。MOS6502でφ2inとφ2outの規定がないにも関わらずφ2inベースで設計されているのはなぜなのか。考えられるのは:
・φ2out出力が弱く全体を駆動するのにバッファが必要だがそれをするくらいなら原発振から作ったほうがマシ
・システムクロックがMPUを経由してしまうのでビデオ出力のタイミングなどMPUを外す/故障してしまうと動かなくなる
あたりだろうか。

 さてSBC6800を改造して6502を搭載する方法だが実験で使ったPICの1MHz出力をφ2inへ、E信号の代わりをφ2outでも動きそうだが改造が非常に面倒だったのでφ2outを使わない方向で再検討する。


6502データシート一覧:




6502とApple II システムROMの秘密
柴田文彦
ラトルズ
2020-02-25



Z8000のエンディアン調査 →ビッグエンディアン

 Z8000のエンディアンはどうなっているのか気になったので調べてみた。電脳伝説さんのSBCZ8002があるので簡易モニタを利用して確認した。

 Z8000のレジスタは以下のとおり。

スクリーンショット 2020-02-28 23.59.52

 基本は16bit幅の汎用レジスタR0〜R15で、R0〜R7は8bit幅のRH0〜7、RL0〜7で上位/下位バイトをアクセスできる。RR0,2,4,6,8,10,12,14は32bit幅のレジスタで16bit幅のレジスタをペアで使う。RQ0,4,8,12は64bit幅の4レジスタペアでこれは直接メモリアクセスはできず、乗算や除算で使用する。

 レジスタの指定は4bitで、どの幅のレジスタ(RH/RL,R,RR,RQ)を使うかは命令によって決まる。
Z8000regassign

 こんな感じで自分の直感とは違っていたのでハンドアセンブルで間違えたのよね。
 RH0~RH7 → 0~7 / RL0~RL7 → 8~15 でした。

 ではエンディアンの確認方法。メモリ上の8100H番地より4バイトのデータを置き、これを元データとする。
(1) 4バイトのRR0にロードし、8108H番地からRH1,RL1,RH0,RL0の順に1バイトずつストア。
(2) 4バイトのRR0にロードし、810CH番地からR1,R0の順に2バイトずつストア。
(3) 2バイトのR0にロードし、8104H番地からRH0,RL0の順に1バイトずつストア。
91F0 PUSHL @R15,RR0
91F2 PUSHL @R15,RR2
2102 8100 LD R2,#8100
2103 8108 LD R3,#8108
1420          LDL RR0,@R2
3231 0000 LDB R3(0),RH1
3239 0001 LDB R3(1),RL1
3230 0002 LDB R3(2),RH0
3238 0003 LDB R3(3),RL0
3331 0004  LD R3(4),R1
3330 0006 LD R3(6),R0
2103 8104 LD R3,#8104
2F20 LD R0,@R2
3230 0000 LDB R3(0),RH0
3238 0001 LDB R3(1),RL0
95F2 POPL RR2,@15
95F0 POPL RR0,@15
9E08 RTS
 前後でレジスタをスタックに保存してます。実行結果はこのとおり。

Z8000-IXUN

 'UNIX'の文字列をロードしてRR0の上位から1バイトずつストアしたら'IXUN'となった。R0は上位バイトがRH0で下位バイトがRL0なので、16bit幅に関してはビッグエンディアンとなる。

 ここで残る疑問が。RR0はR1:R0なのだろうかそれともR0:R1なのだろうか?R1:R0ならばPDP-11とも異なるmiddle endianとなり、R0:R1ならば正真正銘のビッグエンディアンとなる。RQ0についても同様。
仕様書を読んでみてもRR0のペアの順番について明確に書いてあるところが見つかりませんでした!!いかがでしたか!!
 これについてはレジスタペアを使った演算をやってみて確認する予定。次回につづく。

追記:レジスタペアについて調査。以下のとおり上位から小さい番号のレジスタ順に並びます。
32bitレジスタRRのペアは RR0 = R0:R1
64bitレジスタRQのペアは RQ0 = RR0:RR2 = R0:R1:R2:R3

以下は確認コード:
93FA PUSH @15,R10
91F4 PUSHL @R10,RR4
91F6 PUSHL @R10,RR6
210A 8100 LD R10,#8100
8D48 CLR R4
8D58 CLR R5
8D68 CLR R6
8D78 CLR R7
2105 0123 LD R5,#0123
1904 4567 MULT RR4,#4567
33A4 0000 LD R10(0),R4
33A5 0002 LD R10(2),R5
33A6 0004 LD R10(4),R6
33A7 0006 LD R10(6),R7
1406 0123 4567 LDL RR6,#01234567
1804 1122 3344 MULTL RQ4,#11223344
33A4 0008 LD R10(8),R4
33A5 000A LD R10(A),R5
33A6 000C LD R10(C),R6
33A7 000E LD R10(E),R7
95F6 POPL RR6,@R15
95F4 POPL RR4,@R15
97FA POP R10,@R15
9E08 RTS
 32bitレジスタペアのRR4について、R4:R5と仮定しR4=0,R5=0x0123を設定、MULT命令で即値0x4567を掛けてRR4に保存。その後8100Hから2バイトずつR4,R5,R6,R7を書き込む。乗算の結果0x004ee415がそのまま見えるので32bitペアの順序は仮定どおり。
 64bitレジスタペアのRQ4について、RR4:RR6と仮定しRR4=0,RR6=0x01234567を設定、MULTL命令で即値0x11223344を掛けてRQ4に保存。その後8108Hから2バイトずつR4,R5,R6,R7を書き込む。乗算の結果0x00137e8562dff45cがそのまま見えるので64bitペアの順序は仮定どおり。
検算はgawk --bignum 'BEGIN{printf "%lx ",0x12345678*0x11223344}' などなど。

Z8000-MULT


 ということでZ8000のレジスタペアは上位側が小さい番号であり、メモリアクセスはビッグエンディアン。

 さて、以上のことはソフトウェア側から見た話であり、ハードウェアでメモリのセレクトを見るとアドレスラインのA0=0のときに奇数アドレスとなるのでバイト単位で入れ替わるという話になります。ややこしいですね。


6805の開発環境とHD68P05V07

 私もHD68P05V07を持ってるのでまねして作ってみました。

ボードは電脳伝説さんの秋月C基板サイズのものとほぼ同じで、セラロックが載せられるようちょっと変えている程度です。

202002a

202002b

 さて開発環境だけれども、ROMライタなどはWindowsしかサポートしていないものが多い。一方アセンブラなどは自分で修正してビルドできるようなものが都合が良いのでunix環境が望ましい。ということでWindows10+wsl(Ubuntu18.04LTS)の組み合わせで一台のPC内で完結できるよう探してみた。

8ビット68系のアセンブラ

これをwsl上でmakeする。
$ git clone https://github.com/JimInCA/motorola-6800-assembler
$ cd motorola-6800-assembler
$ make
これで./bin以下に各種アセンブラが用意された。6805用のアセンブラはas5。

HD68P05V07でHELLO,WORLD(電脳伝説)内にあるhello05.asmのソースを持ってきてアセンブルしてみる。
$ ./bin/as5 hello05.asm
エラーがでるが、これは TST X を TSTX と書き直せばよい。この程度の修正はわかると思います。
アセンブル後はSレコードフォーマットのhello05.s19というファイルが生成される。これをobjcopyを使って手持ちのROMライターで扱えるIntel HEX形式に変換する。
$ objcopy --input-target=srec --output-target=ihex hello05.s19 hello05.hex
変換したhello05.hexをWindows10上に持ってくる。Windows10の1909アップデートを適用している場合は、エクスプローラから\\wsl$でアクセスできる。
 こうしてWindows上に持ってきたhello05.hexをROMに焼く。4Kバイトの2732Aではそのまま、32KバイトのAT28C256では0x7000のオフセットを付けて末尾の4Kバイトの位置に書き込む。

202002c

 さて動作だけれども"HELLO,WORLD"と表示すべきところが"H"のみ表示。その後キー入力のエコーバックはできるため残りの文字列表示がすっぽ抜けている。
 4MHzの水晶振動子と4MHzのセラロックは動作OK。2732A搭載時の電流は約100mA、AT28C256搭載時は約80mA。

 まだHD68P05V07の謎は残るけど8bit68系のアセンブル環境はこれでできた。

 Amsterdam Compiler Kitというのがあってこれは各種高級言語がコンパイルできてターゲットもZ8000や6502とあるのだが肝心のクロスアセンブラの使い方がよくわからない。引き続き挑戦中だけどどなたかわかりましたら教えて下さい。

SBCZ8002組み立てと/MO端子によるLチカ

 電脳伝説さんのSBCZ8002を組み立てましたよ&Lチカ報告。

SBCZ8002_reference(電脳伝説)

 GAL16V8AはTL866CSライターで書き込み。ライターのゼロプレッシャーソケットで接触不良があって書き込めなかったことがあったがそれ以外はトラブルなし。24Pのスリムな300milのソケットは持ってなかったので16P+8Pのソケットを組み合わせて使用。丸ピンソケットの場合は28ピンのものをカットしてもよいそうです。
2019SBCZ8002-a

  さて、ある思いつきがあってこのボードだけでLチカできんかなあ、SCC Z8530のシリアル周りの空き出力でできんだろうか(2chのうち1ch未使用)とつぶやいたらZ8002には/MO端子があるよと教えてもらった。Z8000の/MI入力と/MO出力は8085のSID/SODに似ていて1bitの入出力ができる。ただシリアル入出力の用途ではなく複数プロセッサでのリソースの共有などで使われるらしい。しかも特権命令のMSET/MRESで簡単にオンオフできる。SCCの制御は面倒そうだったのでこれはすぐできそう。

 で、/MO端子に4.7kΩでLEDをはんだ付け。アクティブローなのでカソードを接続。
2019SBCZ8002-b

SBCZ8002の簡易モニタを使ってテスト。

8000: 7B08 MSET
8002: 9E08 RET

/MO端子はリセット直後はdisable。
8000H番地をCALLするとLEDが点灯。

8010: 7B09 MRES
8012: 9E08 RET

8010H番地をCALLするとLEDが消灯。リセットをかけても消灯。






東芝 47V型 液晶 テレビ 47Z8000 フルハイビジョン 2009年モデル
B0026ZOJX6 2009-05-09
5つ星のうち2.8
¥ 64,400 (中古品)

8080Aの割り込み応答の謎

 きっかけはNEC μPD8080Aのカタログにあったこの記述。

The μPD8080A has the capability to accept a multiple byte instruction upon an interrupt. This means that a CALL instruction can be inserted so that any address in the memory can be the starting Iocation for an interrupt program. This can be accom- plished without auxilliary circuit because INTA is active for all three bytes of the CALL instruction.

 わざわざ3バイト命令のCALLを受け付けるよ書いてあるのはなんでだろうか。8080Aはもともとできたのでは?ということで調べてみた。その前に8080Aの割り込み動作について。

 8080Aは割り込み許可の状態でINT入力がHになると割り込み動作にはいる。割り込み復帰のための現プログラムカウンタの保存はしない代わりに1命令分をデータバスから読み込んで(fetch)実行する。ここで特定の命令、RST7(FFH)を読み込むと現在のPCを保存して38Hにジャンプする。この1命令実行時はPCを更新しないので、38Hからの割り込み処理からリターンする時に元通りの番地に戻ることができる。RSTn命令はRST0〜RST7まで存在し、n × 8番地がエントリポイントとなる。
 スタックにPCを保存してジャンプする命令ならCALL命令でもよく、これは3バイト長である。任意のアドレスをエントリポイントにできるが、割り込み時の回路が複雑になる。

 さて割り込み時は8080Aのデータバスに出力されるステータスをデコードすることにより得られる*INTA信号がアクティブになる。ここを観測することにより割り込み時にどんな長さのコードを取り込んでいるのかがわかるはず。命令実行時にはSYNC信号が立つので、*INTAの立ち下がりをトリガにして同時にSYNC信号をオシロで観測することにした。

 実験に使用するのはSBC8080ボードとPALO ALTO BASICを元に機能を追加してあるSBC8080システムROMを使用した。これは割り込みを許可し8251UARTを初期化し端末の文字入力でINTを上げてくれるのでそのまま割り込みの観測に使える。

 *INTA信号は8228システムコントローラが8080Aのデータバスからデコードし出力する。ただし+12Vにプルアップした状態では何も変化しなかった。+12Vプルアップしていると割り込み発生時に内部で自動的にRST7(FFH)を生成し、*INTA信号は外に出さないようだ。

 8228の*INTAの+12Vプルアップを外し、観測する。端末から1文字入力すると*INTAが発生した。ただし*INTAの数はまちまちである。これは割り込みサイクルで命令取り込み時にバスがフローティング状態のため、バラバラなデータを読み込んでいるせいだと思われる。以下はたまたま1バイト命令のRST7がはいった様子(キー入力が続けてできたので38H番地に飛んでいると思われる)。
2019INTA1


 データバスを弱くプルアップ/プルダウンして任意の命令フォーマットを与えることにする。10KΩプルアップ/プルダウンでCALL命令に相当するCDHに設定した。CALL CDCDHとなるはず。
2019INTA

 観測結果は以下の通り*INTAが3発。
2019INTA3

 さて割り込みで使うRST7とCALL xxxxは観測できたが、ひょっとしてこの*INTA信号は任意の命令のデコード後にわかる命令のバイト数分出るのではなかろうか。ということで配線を変えてADC imm(CEH CEH)にしてみた。結果は予想どおり*INTA 2発。

2019INTA2

 8080Aは割り込み時に1命令を読み込んで実行し、RSTnやCALL xxxxでスタックにPCを保存することを期待している。が、これは任意の命令でよく、命令をフェッチ/デコードして得られた命令のバイト数分*INTAを発生して1命令を実行する。
 Intel 8080Aとそのクローン、NEC μPD8080Aも同じ結果であり、NECのカタログに書いてあった割り込み時に3バイト命令も受け付けるよという記述はわざわざ書くまでのことでもなかったということになる。

 あとクローン8080Aについては解析済で以下からverilogソースが見られます。




NEC 8bit 2MHz MPU i8080互換 UPD8080AFC
B0773MVDKN
5つ星のうち5.0
¥ 1,200

NEC μPD8080Aの非互換部分まとめ

 NEC μPD8080Aのデータシートが見つからないで悩んでいたら@electrelicさんからbitsaversにあるよ、と教えていただきました。その 1977_NEC_Microcomputer_Catalog.pdf を参照しつつこれまでの実験結果からINTEL 8080との非互換部分を整理。(電気的特性は省略)


・命令実行のサイクル数
 これはIC Collection MCS80に詳しい表があります。

・割り込み応答時間が3バイト命令(例:CALL)後でアクティブ
 通常、割り込み発生時にはデータバスにRSTx(1バイト命令)のコードを流し込んで決まったエントリに飛ぶが、3バイトのCALL命令で任意の番地を割り込みエントリにできるということか?

※追記:システムコントローラ8228は割り込み時にCALL命令が入ると続く2サイクルの間も*INTAをアクティブにして、CALL命令で指定した任意のアドレスを割り込みの飛び先にする機能がある。NEC μPD8080Aは8228のサポートなしでこれができるということだろうか。

8080Aの割り込み応答の謎を参照。Intel 8080Aと変わらず

・未定義フラグbit3が常に1。INTEL 8080Aは常に0

・フラグbit5はSUBフラグ。DAA命令で参照。INTEL 8080Aは常に0

NEC μPD8080Aのフラグ
スクリーンショット 2019-02-13 21.00.44

NEC μPD8080AF(INTEL 8080A完全互換)のフラグ
スクリーンショット 2019-02-13 21.01.28


・DAA十進補正命令はSUBフラグ=1で減算後十進補正。SUBフラグは減算命令(SUB/DCR)で1になる。加算命令(ADD/INR)で0クリア。

・DCR命令でACYフラグが立たない場合があり、被減数が00,10,20,30,40,50,60,70,80,90でDCR後DAAで誤動作する。

・XRA/ANA/ORA命令後ACフラグがクリアされずそのまま。
 カタログには"Also,arithmetic flags not affected by logical instructions. "とある


また、さる方面からBCD演算の実装について教えていただきました。https://en.wikipedia.org/wiki/Double_dabble


 減算命令後のDAA補正対応や論理演算命令での算術フラグを操作しないなど命令を追加しないで改善しようとした感じがしますね。




マイクロコンピュータ・ハードウエア基礎技術―M6800系,8080系,Z-80系 (1981年)
B000J7VKF8 1981-03

¥ 2,400 (中古品)

NEC uPD8080AのDAA命令調査 SUB編とINR/DCRの挙動

 前回のADD編の続き。

 μPD8080Aは減算後の十進補正も正しく動作する、ということなので確認。

chkbcdsub.awk
$1 ~ /[0-9][0-9][0-9][0-9]/ {
  a=substr($1,1,2)
  b=substr($1,3,2)
  if (b>a) a=a+100
  c=a-b
  if (c!=($4-0)) print $0
}

 入力データの1カラム目は4桁の16進数で、前2桁から後ろ2桁で減算を行う。その結果を十進補正したものが4カラム目。このスクリプトはこの減算を行い、十進補正値と比較して異なれば出力する。

Intelの8080だと00〜99 - 00〜99の全組み合わせ10000通りですべてエラー。例えば:

0000 00 *Z*H*P** 06 *****P**
0001 FF S****P*C 65 ***H*P*C
...
とこのような感じで1行目は減算時のハーフフラグの立ち方がおかしく、よけいな補正をしている。2行目は"F"から補正値6を引かないといけないところを加算している。ということで減算時の補正についてはまったく考慮していない。
 NECのμPD8080AではSUB命令の後の補正後の値はすべて正しかった。ところで十進補正の補正値である"6"をDAA命令で足すのか引くのかはどうやっているのだろうか。おそらくDAA命令の直前に実行した演算命令がADDなら加算、SUBなら減算にしているはずで、もしかしたら未定義のフラグを使っているのか。ここは気になる点。
※8086だとDAA命令とDAS命令でそれぞれ加算後十進補正、減算後十進補正と命令が別れている。

 さてここまでやって1加算するINR命令と1減算するDCR命令ではどうだろうか。これも確認してみた。


ADD 1とINR、SUB 1とDCRの比較結果はこちら:

Intel 8080の結果は以下の部分が異なる。2〜5カラム目がADD 1の結果、6〜9カラム目がINRの結果。

INR:
FF01 00 *Z*H*P*C 66 *****P*C 00 *Z*H*P** 06 *****P**
これは値が範囲外、かつキャリーフラグがINRでは立たないので補正されていない。問題なし。

DCR:
0001 FF S****P*C 65 ***H*P*C FF S****P** 65 ***H*P*C
そもそもSUB後のDAAは保証外、値が範囲外、INRでキャリーが立たない。問題なし。


NEC μPD8080Aの結果。
INR:
0F01 10 ***H**** 16 ***H**** 10 ******** 10 ********
1F01 20 ***H**** 26 ***H**** 20 ******** 20 ********
2F01 30 ***H*P** 36 ***H*P** 30 *****P** 30 *****P**
3F01 40 ***H**** 46 ***H**** 40 ******** 40 ********
4F01 50 ***H*P** 56 ***H*P** 50 *****P** 50 *****P**
5F01 60 ***H*P** 66 ***H*P** 60 *****P** 60 *****P**
6F01 70 ***H**** 76 ***H**** 70 ******** 70 ********
7F01 80 S**H**** 86 S**H**** 80 S******* 80 S*******
8F01 90 S**H*P** 96 S**H*P** 90 S****P** 90 S****P**
9F01 A0 S**H*P** 06 ***H*P*C A0 S****P** 00 *Z***P*C
AF01 B0 S**H**** 16 ***H***C B0 S******* 10 *******C
BF01 C0 S**H*P** 26 ***H***C C0 S****P** 20 *******C
CF01 D0 S**H**** 36 ***H*P*C D0 S******* 30 *****P*C
DF01 E0 S**H**** 46 ***H***C E0 S******* 40 *******C
EF01 F0 S**H*P** 56 ***H*P*C F0 S****P** 50 *****P*C
0F01 10 ***H**** 16 ***H**** 10 ******** 10 ********

値が範囲外なので問題なし。

DCR:
0001 FF S**H*P*C 99 S**H*P*C FF S****P** FF S****P**
1001 0F ***H*P** 09 ***H*P** 0F *****P** 0F *****P**
2001 1F ***H**** 19 ***H**** 1F ******** 1F ********
3001 2F ***H**** 29 ***H**** 2F ******** 2F ********
4001 3F ***H*P** 39 ***H*P** 3F *****P** 3F *****P**
5001 4F ***H**** 49 ***H**** 4F ******** 4F ********
6001 5F ***H*P** 59 ***H*P** 5F *****P** 5F *****P**
7001 6F ***H*P** 69 ***H*P** 6F *****P** 6F *****P**
8001 7F ***H**** 79 ***H**** 7F ******** 7F ********
9001 8F S**H**** 89 S**H**** 8F S******* 8F S*******
A001 9F S**H*P** 99 S**H*P** 9F S****P** 9F S****P**
B001 AF S**H*P** A9 S**H*P** AF S****P** AF S****P**
C001 BF S**H**** B9 S**H**** BF S******* BF S*******
D001 CF S**H*P** C9 S**H*P** CF S****P** CF S****P**
E001 DF S**H**** D9 S**H**** DF S******* DF S*******
F001 EF S**H**** E9 S**H**** EF S******* EF S*******

00-01から90-01はBCD演算の対象。DCRでハーフキャリーが立っていないのでDAA補正が正しくない。ということはBCDの範囲内ならINR後DAAはIntel、NECとも正常動作する。DCR後DAAはIntelは保証外、NECは被減数が00,10,20,30,40,50,60,70,80,90でDCR後DAAで誤動作する。

 惜しい。NEC μPD8080Aの減算後DAAではINRで正常動作するつもりでDCRを使うとハマるんじゃなかろうか。
 INR/DCRではキャリーフラグは立たない。フラグのうちS/Z/Pは結果だけから求められるが、CY/ACは演算の種類と値によって決まる。INR/DCRはALUの加減算器のパスを通ってない感じがする。

 残りは8085やZ80との比較かな。


おまけ:チェコスロバキアから届いたTESLA MHB8080A動きました。
MHB8080ACデータシート

2019MHB8080A



インテル8080伝説
4899774532
記事検索
プロフィール

hardyboy

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