6809でオリジナルモニタ(1) [6809]
色々手を出して全てが中途半端になってしまっているが、今回は6809。
前回の6800と6809の話の続きでもある。
新しく6809ボード。
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
とまとめて指定できるのは非常に便利。
したがってスタックに関する命令は全て変更。
(2)コンディションコードレジスタ関連
コンディションコード関係は6800/1ではビット毎に個別のセット/リセット命令があったが、6809ではORとANDで一括でセット/リセット。ニーモニックはORCC、ANDCC。
つまり、OR,ANDの論理演算命令がアキュムレータに対してだけでなく、コンディションコードレジスタにまで拡張されているという解釈。ただしイミディエイトアドレッシングしか使えない。
割込マスクのセット/リセットはシステム関係をやらない限りあまり使う事はないが、キャリーのセット/リセットぐらいはよく使うので要変更。
(3)インデックスレジスタのインクリメント/デクリメント
6809ではなくなっている。
INX,DEXは特定レジスタ向けの特定命令だったという解釈なのだろうか?アキュムレータに対するINC,DECはなくなったわけではない。
INC,DECは簡潔で便利なんだが、
LEAX 1,X
に変更。
まぁ+3したいときは
LEAX 3,X
とできるのでこれも便利といえば便利。
(4)ニーモニック変更
6800/1 →6809変更に伴う命令の変更は以上だが、
大量にでたアセンブルエラーは
本来6800/1、6809どちらにもある命令なのだがニーモニック表記が変更されている。
LDAA等は確かにくどいとは思うが、同じ命令で大半はマシンコードも同じ、さらにCPU別になっているとはいえソースも共有されている同じモトローラのアセンブラなんだから通してくれても良いと思う。
以上、もろもろ修正しただけでとりあえず動くことは動く。
レジスタ増えてスタックが変わってしまっているので、ブレークポイントコマンドなんかはたぶんおかしくなるだろうが。
では次に6809固有の命令を使って修正していき、モニタを完成させたい。
前回の6800と6809の話の続きでもある。
新しく6809ボード。
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
とまとめて指定できるのは非常に便利。
したがってスタックに関する命令は全て変更。
変更前 | 変更後 |
---|---|
PSHA | PSHS A |
PSHB | PSHS B |
PULA | PULS A |
PULB | PULS B |
PSHX | PSHS X |
PULX | PULS X |
(2)コンディションコードレジスタ関連
コンディションコード関係は6800/1ではビット毎に個別のセット/リセット命令があったが、6809ではORとANDで一括でセット/リセット。ニーモニックはORCC、ANDCC。
つまり、OR,ANDの論理演算命令がアキュムレータに対してだけでなく、コンディションコードレジスタにまで拡張されているという解釈。ただしイミディエイトアドレッシングしか使えない。
割込マスクのセット/リセットはシステム関係をやらない限りあまり使う事はないが、キャリーのセット/リセットぐらいはよく使うので要変更。
変更前 | 変更後 |
---|---|
SEI | ORCC #$10 |
CLI | ANDCC #$EF |
SEC | ORCC #$01 |
CLC | ANDCC #$FE |
(3)インデックスレジスタのインクリメント/デクリメント
6809ではなくなっている。
INX,DEXは特定レジスタ向けの特定命令だったという解釈なのだろうか?アキュムレータに対するINC,DECはなくなったわけではない。
INC,DECは簡潔で便利なんだが、
LEAX 1,X
に変更。
まぁ+3したいときは
LEAX 3,X
とできるのでこれも便利といえば便利。
変更前 | 変更後 |
---|---|
INX | LEAX #1,X |
DEX | LEAX #-1,X |
(4)ニーモニック変更
6800/1 →6809変更に伴う命令の変更は以上だが、
大量にでたアセンブルエラーは
LDAA | LDAB | STAA | STAA |
本来6800/1、6809どちらにもある命令なのだがニーモニック表記が変更されている。
LDAA等は確かにくどいとは思うが、同じ命令で大半はマシンコードも同じ、さらにCPU別になっているとはいえソースも共有されている同じモトローラのアセンブラなんだから通してくれても良いと思う。
変更前 | 変更後 |
---|---|
LDAA | LDA |
LDAB | LDB |
STAA | STA |
STAB | STB |
以上、もろもろ修正しただけでとりあえず動くことは動く。
レジスタ増えてスタックが変わってしまっているので、ブレークポイントコマンドなんかはたぶんおかしくなるだろうが。
では次に6809固有の命令を使って修正していき、モニタを完成させたい。
コメント 0