SSブログ

6809でオリジナルモニタ(1) [6809]

色々手を出して全てが中途半端になってしまっているが、今回は6809。
前回の6800と6809の話の続きでもある。

新しく6809ボード。

syc8-6809_1.jpg

ACIA(MC6850)とUSB-COM変換のPICといういつもの構成。6802ボードのCPUを6809に変えただけでもある。
ここでは初見ながら既にリビジョンがC(苦笑)。新しくと言いながらも製作したのは約1年前だし色々ポカやって、実はこれもジャンパ飛ばしていてリビジョンDに進むのが決定している。

まずはオリジナルモニタを移植。
MC6802ボード用につくったモニタをベースにMC6801(HD6303)向けに修正したので、今度はMC6801のモニタをMC6809用に修正。

6303用モニタがベースなので、まずは内蔵ペリフェラル関係のものをごっそり削る。
かわりにACIA関係をMC6802モニタからコピー。
追加された割込(FIRQ,SWI2,SW#)を念のため実装。ただしRTIするだけ。
メモリマップはほぼ変更なし。

この状態でとりあえずアセンブルしてみる。
そしてエラーを修正していく。

(1)スタック関連
まず、6809になって大きく変わったのがスタック関係。
ユーザスタックポインタが追加されただけでなく、命令も大きく変わっている。
6800はpsha,pshb,pula,pulbと、個々のレジスタ(アキュムレータ)に対して個々の命令を割り当てている。インデックスレジスタに対するモノがないのが、個人的に感じる6800の一番の問題点。これは6801になって追加されている。
6809はシステムスタックポインタ、ユーザスタックポインタに対してそれぞれpshs,puls,pshu,puluとなっている。
どのレジスタを退避/復帰するかはオペランドで指定する。これは
pshs a,b,x,y
とまとめて指定できるのは非常に便利。
したがってスタックに関する命令は全て変更。

変更前変更後
PSHAPSHS A
PSHBPSHS B
PULAPULS A
PULBPULS B
PSHXPSHS X
PULXPULS X



(2)コンディションコードレジスタ関連
コンディションコード関係は6800/1ではビット毎に個別のセット/リセット命令があったが、6809ではORとANDで一括でセット/リセット。ニーモニックはORCC、ANDCC。
つまり、OR,ANDの論理演算命令がアキュムレータに対してだけでなく、コンディションコードレジスタにまで拡張されているという解釈。ただしイミディエイトアドレッシングしか使えない。
割込マスクのセット/リセットはシステム関係をやらない限りあまり使う事はないが、キャリーのセット/リセットぐらいはよく使うので要変更。

変更前変更後
SEIORCC #$10
CLIANDCC #$EF
SECORCC #$01
CLCANDCC #$FE


(3)インデックスレジスタのインクリメント/デクリメント
6809ではなくなっている。
INX,DEXは特定レジスタ向けの特定命令だったという解釈なのだろうか?アキュムレータに対するINC,DECはなくなったわけではない。
INC,DECは簡潔で便利なんだが、
LEAX 1,X
に変更。
まぁ+3したいときは
LEAX 3,X
とできるのでこれも便利といえば便利。

変更前変更後
INXLEAX #1,X
DEXLEAX #-1,X


(4)ニーモニック変更
6800/1 →6809変更に伴う命令の変更は以上だが、
大量にでたアセンブルエラーは

LDAALDABSTAASTAA

本来6800/1、6809どちらにもある命令なのだがニーモニック表記が変更されている。
LDAA等は確かにくどいとは思うが、同じ命令で大半はマシンコードも同じ、さらにCPU別になっているとはいえソースも共有されている同じモトローラのアセンブラなんだから通してくれても良いと思う。

変更前変更後
LDAALDA
LDABLDB
STAASTA
STABSTB


以上、もろもろ修正しただけでとりあえず動くことは動く。
レジスタ増えてスタックが変わってしまっているので、ブレークポイントコマンドなんかはたぶんおかしくなるだろうが。

では次に6809固有の命令を使って修正していき、モニタを完成させたい。

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

6800と6809の互換性 [6809]

今回は製作記事ではなくて、インストラクションセットの話

あらためて言うまでもないが、6809は6800とオブジェクトレベルでは互換性はない。が、全くの別物というわけではない。あくまで6800、正確には6801を拡張/変更したものであり、両方に存在する命令の多くはマシンコードも同じである。
残念ながら、全てが同一でないし、6800から削られた命令の中にはなくては困るものもあり、またその代替となる新規命令も当然のように元とはマシンコードがことなるため、同一オブジェクトで6800、6809両方で動作させる事は不可能に近い。

6800にたいしての6809の変更点であるが、
CPUはメモリ上にあるデータを処理していくという事を基本として、その部分の強化に重点が置かれていると思う。
そのためにインデックスレジスタYとユーザスタックポインタを追加し、アドレッシングモードの大幅な拡張が行われている。
それに対して特定のレジスタに特化した命令(コンディションコードのセット/リセット等)、レジスタ間の命令(TAB,TBA等)は削除されている。
CPU(レジスタ)-メモリ間の転送と処理(演算等)を柔軟に行えるように強化変更されている。

では、6800に対してどういう変更が行われているのであろうか?
実際には6801に対して変更されているので、6801に対してみてみる。

どのCPUでもそうだがマシンコードは適当に割り振られているわけではなく、特定のビットに命令の種類等が割り振られている。
8080ならb7b6の上位2bitが転送、演算、分岐等の命令の種類を示し、続くb5b4b3の3bitがディスティネーション、b2b1b0の3bitがソースのような感じにだいたいなっている。
もちろん、分岐命令ではソース/ディスティネーションのところは別の意味となる。

6800はどうか?大雑把に言うと

最上位ビットが1、マシンコードで$8x以降に関しては

b7b6対象レジスタ
10AccA
11AccB


b5b4アドレッシングモード
00Immidiate
01Direct
10Indexed
11Extended


b3b2b1b0命令種別
0000SUB
0001CMP
0010SBC
0011SUBD(6801),ADDD(6801)
0100AND
0101BIT
0110LDA
0111STA
1000EOR
1001ADC
1010ORA
1011ADD
1100CMP,LDD(6801)
1101JSR(BBSR),STD(6801)
1110LDS,LDX
1111STS,STX


上記の表より、例えばマシンコードが
10100110(=$A6)はLDAAのインデックスアドレッシングであり、インデックスアドレッシングは2バイト目がオフセットなので、オフセットが5の場合はアセンブルリスト風に書けば

A605LDAA#5,X

となる。

上位4bitが0000~0111に関しては
主にオペランドをとらないInherentとRelativeアドレッシングをとる分岐命令が存在するが、
b5b4が10,11となる$6x,$7xは、IndexedおよびExtendedアドレッシングのシフト、ローテート命令が並んでいる。
それ以外では$2xの行が条件ブランチ命令、$0x,1x,3x,4x,5xはInherentアドレッシングの命令が、下位4bitを命令種別としてわりときれいに並んでいる。

6800から削られた命令は$0x,$1xの行にあるので、この2行からごっそり削り取られ、新規命令が追加された形になる。
追加された命令にはDirectアドレッシングをとるものがあり、Directアドレッシングのマシンコードは上の表よりb5b4が01なので$1xに割り振られた、
のかと思いきや、なぜか$0xの行に並んでいる。
その影響で元から存在するNOP命令のマシンコードが$01から$22に変更されている。
それ以外では継承されている命令のマシンコードに変更はないようである。$00~$7Fに関しては。

後半($80~)で変更があるのは$xEと$xFの2列。
$8E,$9E,$AE,$BEがLDS,$9F,$AF,$BFがSTSとスタックポインタに関する命令だったのが
LDXとSTXに変更。LDX,STXは$Bx~$Fxの$xE,$xFの列にあったのでずらした感じになる。
かわりに$Bx~$FxのE,F列にスタックポインタ命令が入っているので入れ替わったようになっているが、実際に入ったのはユーザスタックポインタに関する命令LDU,STUであり、システムスタックポインタのPage2の$Bx~$Fxの$xE,$xF列に移動している。
Page2命令はプリフィクスコード$10がつくので、システムスタックポインタへのロードストアは
命令長、実行時間ともに長くなる。
あらたに追加されたインデックスレジスタYに関する命令群もPage2に存在する。
マシンコードもインデックスレジスタXに関するLDX,STX,CMPXと同じ配置なのでプリフィクスコード$10がつけばY、つかなければXに対する命令となる。

Page3も存在し(プリフィクスコード$11)、SWI命令はPage2がSWI2、Page3がSWI3となる。
Page3にはそれ以外にスタックポインタの比較命令が存在する。

コードマップを見る限り、アドレッシングモードは6800からあいかわらずの
Inherent,Immidiate,Direct,Indexed,Extenedの5つしかない。
マニュアルを見てもまとめられた命令表にはその5つしかなく、命令表を見比べただけでは6800との差はあまりない。
では6809ではアドレッシングモードが大幅に拡張されているが、どうなっているのであろうか?

追加されたアドレッシングモードは

  • ゼロ・オフセット・インデックス(6800のインデックスアドレッシングとほぼ同等)
  • コンスタント・オフセット・インデックス
  • アキュムレータ・オフセット・インデックス
  • オート・インクリメント/デクリメント・インデックス
  • インデックス・インダイレクト


全てインデックスレジスタを介したアドレッシングモードである。
したがってインデックスアドレッシングを拡張する形で追加されている。

6800のインデックスアドレッシングは第2バイトがオフセット値となるが、6809では第2バイトがポストバイトコードとなり、このポストバイトコードによって数あるインデックスアドレッシングモードから具体的なアドレッシングモードが決まる。
このうち上位4bitが0の場合がゼロ・オフセット・インデックスで6800の
インデックスアドレッシングとほぼ同じものであるが、符号付なのでオフセットは-8~+7となる。
6800、6809ともに存在する命令でインデックスアドレッシングを使い、オフセットを0~7の範囲に留めておくとマシンコードは同一となるので、上記で示した
  LDA #5,X
という命令は6809でも同一のマシンコードとなる。

命令表を見比べた限りでは6800/1と6809の違いはあまりなく、6800 -> 6801 -> 6809と順当に進化していっているような印象で、同一命令の大部分はマシンコードも同じなため、共通の命令だけを使っていれば共有オブジェクトコードができるのでは?という錯覚に私などは陥ってしまう。
実際にはマシンコードマップが一部変更されているので完全上位互換とはいかないが
アセンブリ言語レベルでは小変更でアセンブルし直せばすむレベルにはなっている。
6809の真骨頂は拡張された部分にあるのだが。

ほぼ文字だけの長文にお付き合いいただき、ありがとうございました。

タグ:6809 6800 8bit
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

7SEG表示 & 16進キーボード(ワンボードマイコン風) [6303]

I/O関連の続き。
その先に接続するものとして、7SEG LEDと16進キーボードを用意。
初期のワンボードマイコンの雰囲気を楽しむ。

制作したボードがこれ

7seg-hkey-borad.jpg

7SEGが8桁と5×5のキーボード。TK-80風。
私が持っているのはTK-85なので、0~9,A~F以外のコマンドキー(?)はTK-85を参考に割り付け。
他にもキー(ボタン)がついているのは、このボードは一応8279に接続するのを前提としているため。SHIFTとかCTRLとかは8279の機能。
8255Aと共通で使えるようにするため、PPIボードで使っている34Pのコネクタにしてpinも割り振ったが、全く同じようには使えない。8255Aがビット単位で入出力を指定できればほぼいけたのだが。
今回は8255Aに接続。使ったボードがこれ

ppi-s-borad.jpg

前々回で紹介したPPI2個のボードとは別で1個のもの。設計自体は2個のものよりずっと前に終わっていたのだが、ポカをやらかして作り直して後になってしまった。
ちなみにPPI2個ボードでも同じソフトが動くことは確認済み。

8279ならスキャン操作は勝手にやってくれるのだが、8255Aではそういうわけにはいかないのでタイマの使えるボードとしてHD6303のものを用意。
タイマの使えるボード用のモニタは、システムタイマとして10ms間隔のタイマを入れている。実際にはカウンタ変数をカウントアップしているだけなのでが、ちょっと前にユーザ割り込みルーチンが用意されていれば、それを呼び出すように変更している。
USB-COM変換に使っているPICには10ms間隔でタイマ出力させているが、実際に使っているのは独立した割り込み入力がある8085ボードだけ。
Z80ボードはモード2割り込みを使っているので、/INT端子に入れても使えない。
MC6802はACIAをチェックして、ACIAが割り込みだしていなかったらタイマ割り込みで良いんだろうけど、そこまでやっていない。

HD6303ボードで10msのシステムタイマ割り込みを使ってダイナミック点灯をやってみたが、見事にちらつく(苦笑)。
10ms点灯して70ms消灯しているから、まぁそうなるか。
HD603X/Yはタイマをもう1本持っているので、それで2msタイマを生成。2msだとちらつきなし。
ただ2msだとどうしてもキーはチャタリング拾うので2回読みにする。10msだと拾わないけど。

接続はこんな感じ。

7seg-key-test.jpg

本当は右端2桁も表示されているのだが、静止画だとダイナミック点灯は全部写らない。
今までは基本ソフト製作がメインだったのでROM書き換えては差し替えとやっていた都合上、メモリボードを前面にだしていたが、今は作成したソフトをロードするだけなのでCPUボードを前に。

とりあえずだが、
左4桁にアドレス表示、右2桁にそのアドレス内データ表示。
INC/DECキーで表示アドレス変更。
16進キーで数値入力してEnterキーでメモリ内容変更。
ADDRESS SETキーでアドレス変更。
ここまではやってみた。
いずれは昔のワンボードのように動作するようにしてみたいと思う。
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

6801/6301でオリジナルモニタ [6801]

オリジナルモニタシリーズ、今度はMC6801系です。
MC6800版はMC6802ボードで確認してだいたい動作しているのでベースにします。
とりあえずCPU依存な部分を除いてそのまま流用。
ただし今後各種I/Oを動作させるために、ユーザ設定の割り込みルーチンを使えるように変更。
今まではROM内固定ルーチンのみだったが、RAM上にユーザ割り込みベクタエリアを確保し、各割り込み毎にユーザベクタをチェックし、設定されていればそのルーチンを呼び出すように変更。

通信部分はACIAから内蔵SCIへ。
モトローラと日立セカンドソースの6801(3)と、その日立のCMOS版であるHD6301(3)R/Sと、さらに強化版のHD6301(3)X/Yとでソースを共有することにする。
HD6301X/Yは内蔵I/Oが増えて、その分ZEROページの占有領域が増えているがHD6301R/Sに単純に追加されているので、共通部分は機能もメモリマップも同じ。追加されたのはタイマがもう1本とポート。モニタがその追加部分を使うことはないので、占有ZRAMが増えても問題なし。
一部変更があるが、設定用のレジスタでアドレスは同じ。ブート直後にそれぞれにあわせて設定するだけなので、これも問題なし。さすがにバイナリ共通とまではいかないが、ちょっと編集してアセンブルし直しでいける。
まずはMC6801で確認。このボードで。

SYC6801_B01.jpg

多少リビジョンが上がっているが初期から使っているボードで、以前にも書いたと思うがNMOS版の6801(3)では動かないので、日立のHD6303で確認。
動作OKなのでソースをMC6801向けにカスタマイズ。
基本的には16bi処理をDレジスタ用命令に書き換えるだけ。
インデックスレジスタ退避/復帰もスタックで、と思ったが今回はパス。
これも動作OKなので、次はHD6303X/Y。このボードで。

SYC8-6303X_B01.jpg

以前のボードから変更していて、外部I/Oを使用できるようにしている。68系のCPUボードはI/Oの上位8bitを設定できるようにして、80系と同じ256バイトメモリ空間を占有する。

これも初期化部分を少し変更するだけで問題なく動く。
これでタイマが使えるボードで基本となるモニタが動作するようになったので、I/Oボードを色々試すことができそう。
ただし、MC6801ボードはシングルボード化してしまってバスを出すようにしていないので、作成したI/OボードのテストはHD6303ボードメインかな?


nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

PPI(8255A)ボード [8bitマイコン]

昨日に続いてパラレルポート。
80系の8255Aというパラレルインテーフェース。
非常にシンプルな石で昔の定番で68系のマイコンシステムであってもよく使われていたが、3組の8bitポートがあり、A、BポートがIN,OUTどちらかにしか設定できず、Cポートのみ上位、下位4bit単位でIN,OUTを切り替えられる、まさしくパラレルポートが難点ではあったか?
今、この手のものはGPIO(General Purpos I/O)という言い方をしてbit単位で使う、つまりbit毎にIN/OUTを指定できるのが普通なのでその辺が使いにくいところではある。

syc8-ppi2_1.jpg

PIAボードと同様にPPIを2個搭載。I/Oコネクタは、PPIが8bitポート3組なので34Pのモノを使用。
このコネクタ、昔Oh!PCという雑誌で連載されていたPC工作入門(だったかな?)の8255インターフェースボードにピン配置を合わせている。
違いは「PC工作入門」の方は±12Vを出しているが、こっちのボードはないのでN.C.

では、昨日に続いてMC6802ボードでテスト。

syc8-ppi2_2.jpg

これまた露出を落としてもわかりにくいが一応動作はOK。ボードが4枚立っているが、昨日のPIAボードが刺さったまま。アドレスが違うので影響なし。

続いて80系CPUで確認。
と思ったら8085ボードが動かない(苦笑)。シリアルでエコーバックするだけの簡単なテストプログラムは動くので、どうやらモニタのようだが、去年8085の記事をあげてからそういえば少し手を入れたような…?
もう1年近く前の事なので何をどういじったのか覚えてない。
やはりGit等でバージョン管理するべきかな?
気を取り直してZ80ボードで確認。

syc8-ppi2_3.jpg

これも光っているのかいないのか、全然わからない写真になってしまっているが一応動作OK。

今後I/Oを試して遊ぶにはタイマは必要になってくるので、タイマ使える8085ボードの方が都合いいのだが…
MC6802ボードもタイマ使えないので、I/Oで遊ぶには別のボードかな?


nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

PIA(MC6821)ボード [8bitマイコン]

今まではほぼCPUのみを動かしてきたので周辺の話。
CPUをスタンドアローンのマイコンとして動かすために、コンソールとしてシリアルは必然的に使ってきたので、今回はパラレルポート。

まずは68系のMC6821。

syc8-pia_1.jpg

10×7cmの基板にMC6821を2個。日立製のHD46821のBバージョン。
パターン配線の都合で向きをそろえていないので実装は要注意。
それぞれ26Pでポート出し。
MC6821は8bitポートが2組。それぞれに2bit補助の補助ポート。
各ポート毎に割り込みをだせるようになっているのでジャンパで設定できるようにした。
下4個のLEDとスイッチはMC6821のCA1(2)、CB1(2)確認用。

とりあえずテスト用のボードも作成。

syc-iotest.jpg

この程度のものはどうせ1枚しか必要としないし、ユニバーサル基板で手配線で組んでもいいのだけど、最近はこの程度のものでも億劫になってきたので(苦笑)
コネクタは26PがPIA(MC6821)用、34PがPPI(8255A)用。
PIAからPAが出力でLED8個、PBが入力でスイッチ。
PPIの場合はさらにPCも出力でLED8個。

テストはMC6802の基板で。
バスは80系と68系で共有できるようにしてはいるが、E信号は80系のCPUボードからは
出すようにしていないので、80系CPUボードからは使えない。
簡単なテストプログラムを組んで、前回の68系モニタからロードして実行。

syc8-pia_2.jpg

電源用LEDみたいにスモークモールドのLEDでないので、指向性が強くわかりにくいので露出を落としてみたがそれでもわかりにくいか…

さて、具体的にどう使うかは別の話だが、だいぶ先の話でもあるかな?
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。