まごころせいじつ堂

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

6502

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にあるの?

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


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





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



記事検索
プロフィール

hardyboy

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