内蔵高速RAMの使い方

平成21年4月9日

    高速なプログラムを作りたい場合、内部高速RAMにデータを格納すると動作速度の向上を図ることができます。

内蔵高速RAMは速いのか?

    例えば、Aレジスタに値を代入する場合のクロック数を比較してみます。

    命令 必要なサイクル数 備考
    MOV A,X 2 レジスタ→レジスタ コピー
    MOV A,#1 4 イミディエイト
    MOV A,0FE20H 4

    内蔵高速RAM領域(ショートアドレッシング領域)

    MOV A,0FF00H 5

    内蔵高速RAM領域

    MOV A,[HL] 4

    内蔵高速RAM領域

    MOV A,[HL] 5

    内蔵高速RAM領域ではない

    MOV A,!0F000H 8

    直接アドレス指定 内蔵高速RAM領域

    MOV A,!0F000H 9

    直接アドレス指定 内蔵高速RAM領域ではない

    最も速いのはレジスタ間のコピーです。イミディエイトの代入は2クロックかかります。おそらく、これは命令帳が2バイトになるためでしょう。

    それ以後の命令はすべてメモリをアクセスするための命令です。メモリアクセスのために2クロックくらい余分にかかっています。メモリ空間の内容を読み出す場合、内蔵高速RAMから読み出すのと任意のアドレスの内容を読み出すのでは、2倍の差があります。

    また、レジスタ間接([HL]や[DE])アクセスでも内蔵高速RAMのほうが1クロック速いです。
    ショートアドレッシング可能な領域はさらに1クロック短い時間でアクセスできます。

    とにかく、内蔵高速RAMは速く、ショートアドレッシング可能領域はさらに速いということです。

    この1クロックの際は、積み重なると大きいですよ。

内蔵高速RAMのメモリマップ

    内部高速RAMは0xFB00〜0xFEFFの1024バイトに存在しています。ただしトラ技BIOSやUSBファームウェア、ブートローダ、スタック領域も内部高速RAMを使用しているので、それらの領域を壊さないように、ユーザプログラムは空いている領域を使うようにしてください。

    ファームウェアとトラ技BIOSは、高速RAM領域のうち0xfb00〜0xfcb5の438バイトを使用しています。これはファームウェアとトラ技BIOSがグローバル変数として使用している領域です。

    その直後の、0xfcb6〜0xfe1fの362バイトはスタック領域として使われます。リセット後にスタックポインタは0xfe20にセットされますが、ユーザプログラムが開始するときには0xfe10あたりにいます。自動変数もスタック領域に確保されるので、関数の中で大きな配列を確保するとスタック領域がBIOSのグローバル変数を破壊するので注意してください。

    0xfe20〜0xfedfの192バイトは、高速RAM領域の中でもさらに高速(ショートアドレッシング可能)な領域です。この領域はトラ技BIOSとファームウェアでは使っていませんので自由に使えます。アセンブラでプログラムを書くときに意識すると、とても高速なプログラムが書けます。

    ただし、0xfeb8〜0xfedfの40バイトは、78Kのライブラリなどのワークエリアとして、コンパイラが自動的に使用することがあるので避けましょう。

    したがって、ユーザプログラムから完全に自由に使うことができるショートアドレッシング可能は、0xfe20〜0xfeb7の152バイトです。アセンブラでプログラムを書く場合にはこの領域を使うと高速なプログラムが書けます。

    まとめると、

    ・内部高速RAMは、いくつかの命令ではレジスタと同じように使えるため速い。

    ・スタックは、ユーザプログラム通常開始時は、0xFE10あたりにいる。

    ・0xFCB6〜0xFE1Fの362バイトは自由に使うことができるが、スタックポインタとぶつからないように注意。

    ・完全に自由に使うことができるショートアドレッシング可能は、FE20〜FEB7の152バイト。

 

chickens_back.gif 戻る

 Copyright(C) 2008 NAITOU Ryuji. All rights reserved. 無断転載を禁ず