S08をFlexisに統合するにあたっての変更点

さて、それではS08がFlexisに統合されるにあたってどのような変更が施されたのかという点について、もう少し述べていこう。図8がそのサマリである。大きな変更点は64Kバイトを越えるメモリのハンドリングと、Ultra-Low-Powerモードの追加というあたりになる。

図8 従来のS08の場合、最大動作周波数は40MHzだった。ここで50MHzに引き上げたのは、ColdFireとの互換性を維持するためであろう

まず最初がその64Kバイト越えの話だ。S08は8ビットMCUだから、デフォルトでのメモリ空間は64Kバイトとなる。この制約の下で64Kバイトを越えるメモリを扱う方法としてポピュラーなのはページングということになり、実際フラッシュメモリはページングウィンドウを使ってのアクセスも可能だが、これとは別にLAP(Linear Address Pointer)が追加された(図9)。このLAPを使った場合のレジスタ構成は図10のようになる。S08には更にMMUが追加されているが、MMUというよりはアドレス拡張レジスタ収集という趣である(図11)。

図9 ページングウィンドウ(バンク切り替えなどと言う場合もある)はごく一般的な手法であるが、この場合で言えば128Kバイトのフラッシュメモリの領域をリニアに扱えるわけではない。また良く見ると分かるが、RAMとフラッシュメモリの領域が一部重なってマップされており、これらを扱うためにもアドレスの切り替えが必要となる。S08だけで完結するならこうした手法は妥当だが、ColdFireとの互換性を確保するためには、リニアに扱うための手法がどうしても必要になる

図10 ポインタが24ビットにされているのが特徴的。PCが22ビットであり、フラッシュメモリは最大4Mバイトまで使える計算。もっともアキュムレータは8ビットのままなので、32ビット演算をサポートしたわけではない。あくまでも3バイトのLAPをサポートしたという程度の拡張

図11 一般的なMMUとはかなり様相を異にする構成。LAPへのポインタとなるLBといったポインタが用意されているのがちょっと面白い

面白いのは、LAPはあくまでプログラム内でポインタを扱う場合に利用する形になっており、PCに組み込まれた形のプログラムページレジスタ(PPAGE register:図12)は依然としてページングウィンドウを利用する形態になっている。具体的なプログラム例(図13)を見ると、nop_function()をページングウィンドウの先に置くような仕組みを自動で構築していることがわかる。一方のLAPは、図14のような形でプログラムから利用できる。

図12 アドレスの上位3ビットでバンクを選択する形になっている。このアドレスにアクセスすると、実際はx0800~0xBFFFをアクセスすることになるという仕組み

図13 この例ではPPAGE_0/2/4/5/6/7の6バンクを使っており、nop_functionをこのバンクのどこかに割り当てる形になっている。この方式自体は非常にTypicalで珍しくは無いが、高級言語を使うとどうしてもコードが肥大しがちであり、1バンク内に収まらないとか、8バンク使ってもまだ足りないとかいう事が発生しないかがちょっと心配

図14 32ビットのアクセスはS08から直接行えないので、上位8ビットと下位16ビットに分けて操作する形になる。このあたりはColdFire V1と共通のプログラムを書こうという場合には注意する必要がありそうだ