CE-159/161でのライトプロテクト機能の使用方法 (1)
SHARPのポケコン用RAMモジュールである、CE-159(8KB)/CE-161(16KB)にはライトプロテクト機能がついており、擬似的にROMモジュールとして使用することができるようになっています。書き込み禁止にする領域(以下、ROM領域と呼びます)に機械語のプログラム(内部にワークエリアを持たないものに限ります)を保存するだけなら何も特殊なことをする必要はないのですが、BASICのプログラムを保存する場合には工夫が必要です。この辺りの手順についてはマニュアル(CE-159の英文マニュアルならこちらからダウンロードできます)に記載がありますが、今回から2回にわたってこの手順および動作原理についてまとめておこうと思います。


CE-159はROM領域の容量を切り替える(4KB/6KB/8KB)ことができますが、CE-161は全体を書きこみ禁止とすることしかできません。まずはCE-159/161をPC-1500/1501に装着した場合のメモリマップを載せておきます。当然のことながら、BASICプログラムはROM領域に、変数はRAM領域に置く必要があります。

次に、プログラムモジュールを装着した状態で、BASICプログラムや変数ががどのように格納されるかを示します。(STATUS 2 はフリーエリアの先頭アドレス、STATUS 3 は変数領域の先頭アドレス)

先頭に「ROM状態情報」という8バイトの領域がありますが、これは下記のような意味があります。おそらくメモリスロットにカスタムのBASICプログラムを書き込んだROMをセットして使用することを想定したものと思われますが、プログラムモジュールのライトプロテクト機能においてもこれを使用することになります。(英語版の「機械語の手引き」を直訳しているので、用語がおかしいかもしれません。)
PC-1500/1501にはカシオのようなプログラムエリアの概念はありませんが、実は行番号が重なるようなプログラムを複数RAM上に置くことができます。最もわかりやすい例はMERGE命令でしょう。一般的な8bit時代のPCのBASICの場合は、RAM上に存在するプログラムと同じ行番号を持つプログラムをMERGE命令で読み込むと、後から読み込んだプログラムによって完全に上書きされてしまいます。もちろん行番号が重なっていなければ、2つのプログラムは完全に混ざり合って一つのプログラムになるわけですね。それに対してPC-1500/1501のMERGE命令は、RAM上に存在するプログラムの直後からそのまま新しいプログラムを読み込み、その2つは完全に独立してメモリ上に読み込まれた状態になります。もちろんその場合でもそれぞれのプログラムは問題なく実行できます(予めラベルをつけておかないと呼び出すのが困難になりますが…)。言葉で書いてもわかりにくいかもしれませんので、下に簡単なイメージを載せておきます。

ROM領域にBASICプログラムを保存する場合もこれとよく似た状態になります。実際にメモリ内での格納のされ方は、ROM領域のBASICプログラム→FFHで埋められた領域→"65279 END"→FFH→RAM領域のプログラム という感じになります。ROM領域のBASICプログラムの下位アドレスには機械語のプログラム(CE-153のドライバやCE-156も)を置くことももちろん可能です。次回の記事では、操作方法の実際と、実機でやってみた様子を書きたいと思います。また、CE-159ではROM領域とRAM領域の混在が可能なため、変数を一部CE-159内部に確保して(実際には本体メモリをあふれさせるようなダミーの配列を確保する)バッテリバックアップを行うことも可能ですので、これについても触れたいと思います。


CE-159はROM領域の容量を切り替える(4KB/6KB/8KB)ことができますが、CE-161は全体を書きこみ禁止とすることしかできません。まずはCE-159/161をPC-1500/1501に装着した場合のメモリマップを載せておきます。当然のことながら、BASICプログラムはROM領域に、変数はRAM領域に置く必要があります。

次に、プログラムモジュールを装着した状態で、BASICプログラムや変数ががどのように格納されるかを示します。(STATUS 2 はフリーエリアの先頭アドレス、STATUS 3 は変数領域の先頭アドレス)

先頭に「ROM状態情報」という8バイトの領域がありますが、これは下記のような意味があります。おそらくメモリスロットにカスタムのBASICプログラムを書き込んだROMをセットして使用することを想定したものと思われますが、プログラムモジュールのライトプロテクト機能においてもこれを使用することになります。(英語版の「機械語の手引き」を直訳しているので、用語がおかしいかもしれません。)
RAM先頭からの 相対アドレス | 内容 |
+0 | ヘッダ(常に55H) |
+1 | ROM先頭アドレスの上位バイト |
+2 | BASICプログラムの先頭アドレスの上位バイト (ROM先頭アドレスからの相対アドレス) |
+3 | BASICプログラムの先頭アドレスの下位バイト (ROM先頭アドレスからの相対アドレス) |
+4 | ROM領域の容量 (1KB:04H, 2KB:08H, 4KB:10H, 8KB:20H, 16KB:40H) |
+5 | 未使用 |
+6 | 未使用 |
+7 | プログラムを不可視にするとき00H, そうでないときFFH |
PC-1500/1501にはカシオのようなプログラムエリアの概念はありませんが、実は行番号が重なるようなプログラムを複数RAM上に置くことができます。最もわかりやすい例はMERGE命令でしょう。一般的な8bit時代のPCのBASICの場合は、RAM上に存在するプログラムと同じ行番号を持つプログラムをMERGE命令で読み込むと、後から読み込んだプログラムによって完全に上書きされてしまいます。もちろん行番号が重なっていなければ、2つのプログラムは完全に混ざり合って一つのプログラムになるわけですね。それに対してPC-1500/1501のMERGE命令は、RAM上に存在するプログラムの直後からそのまま新しいプログラムを読み込み、その2つは完全に独立してメモリ上に読み込まれた状態になります。もちろんその場合でもそれぞれのプログラムは問題なく実行できます(予めラベルをつけておかないと呼び出すのが困難になりますが…)。言葉で書いてもわかりにくいかもしれませんので、下に簡単なイメージを載せておきます。

ROM領域にBASICプログラムを保存する場合もこれとよく似た状態になります。実際にメモリ内での格納のされ方は、ROM領域のBASICプログラム→FFHで埋められた領域→"65279 END"→FFH→RAM領域のプログラム という感じになります。ROM領域のBASICプログラムの下位アドレスには機械語のプログラム(CE-153のドライバやCE-156も)を置くことももちろん可能です。次回の記事では、操作方法の実際と、実機でやってみた様子を書きたいと思います。また、CE-159ではROM領域とRAM領域の混在が可能なため、変数を一部CE-159内部に確保して(実際には本体メモリをあふれさせるようなダミーの配列を確保する)バッテリバックアップを行うことも可能ですので、これについても触れたいと思います。
- 関連記事
-
- CE-159/161でのライトプロテクト機能の使用方法 (2) (2013/10/25)
- CE-159/161でのライトプロテクト機能の使用方法 (1) (2013/10/23)
- PC-1501の中古品には要注意です!! (2013/09/30)
スポンサーサイト