(57)【特許請求の範囲】
【請求項１】
プログラム記憶装置と中央処理装置とを備えたプログラム判別システムであって、
前記プログラム記憶装置は、
プログラムデータを固定的に記憶するプログラムデータ記憶手段、
第１プログラムデータを変換するためのビット変換演算コードを発生するコード発生手段、および
前記中央処理装置から出力されるアドレスデータに従って前記プログラムデータ記憶手段から読み出された前記第１プログラムデータを受ける出力データ処理手段を備え、
前記出力データ処理手段は、前記中央処理装置から制御信号が与えられたときに前記コード発生手段から発生される前記ビット変換演算コードに基づいて前記第１プログラムデータの少なくとも一部にビット変換演算を施した新たな第２プログラムデータを出力してその第２プログラムデータを前記中央処理装置に与え、前記中央処理装置から制御信号が与えられないときに前記第１プログラムデータを出力してその第１プログラムデータを前記中央処理装置に与え、
前記中央処理装置は、前記第２プログラムデータと予め設定されているチェックデータとの比較によって両者が所定の関係にあるか否かを判断して前記プログラム記憶装置が真正品かどうかを判別する判断手段を備え、
前記出力データ処理手段は、それぞれ異なる種類の演算を実行できるかつそれぞれが前記第１プログラムデータの少なくとも一部と前記ビット変換演算コードとを演算してそれぞれ異なる前記第２プログラムデータを出力するための複数の演算器、および前記制御信号が与えられたときに前記第２プログラムデータを出力しかつ前記制御信号が与えられないときに前記第１プログラムデータを出力する選択器を備え、
前記コード発生手段はさらに前記複数の演算器のいずれかを選択する演算器選択コードを発生し、
前記選択器は前記演算器選択コードによって選択された演算器に関連する前記第２プログラムデータ、または前記第１プログラムデータを選択する、プログラム判別システム。
【請求項２】
前記プログラム記憶装置は、前記プログラム記憶手段に予め設定している前記プログラム記憶装置が真正品かどうかを判別するためのチェック用プログラムを含み、前記中央処理装置は、前記チェック用プログラムが読み出されたタイミングで前記制御信号を付与し、前記判断手段は、前記チェック用プログラムを用いて、前記第２プログラムデータと前記チェックデータとの比較によって両者が所定の関係にあるか否かを判断して前記プログラム記憶装置が真正品であるかどうかを判別する、請求項１記載のプログラム判別システム。
【請求項３】
前記中央処理装置は、前記判断手段の判別の結果が偽物のプログラム記憶装置であることを示すとき、プログラムを強制的に終了させるプログラム強制終了手段をさらに備える、請求項１または２記載のプログラム判別システム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は半導体記憶装置およびそれを用いるプログラム判別システムに関し、特にたとえばゲーム機用カートリッジのような、プログラムを記憶しているＲＯＭ等の半導体記憶装置とそのプログラム判別システムに関する。
【０００２】
【従来の技術】
たとえばゲーム機用カートリッジは、ゲームプログラムをＲＯＭのような半導体記憶装置に書き込んでおき、使用に際して、ゲーム機本体に装着される。特にこのようなゲーム機用カートリッジの場合、記憶内容であるゲームプログラムを不正にコピーした偽物が横行する。
【０００３】
そこで、本件出願人は、先に、たとえば特開平２−３１２５６号公報［Ｇ０６Ｆ  １２／１４］に開示したように、真偽を判別して、真正なカートリッジではない場合、プログラムメモリへのアクセスを禁止するようにすることによって、ゲームプログラムや他のプログラムの不正な複製やデータの改変を防止できるシステムを提案した。
【０００４】
この先行技術は、「アドレスデコード方式」を用いて、プログラムメモリから実際に読み出したデータを用いて真偽を判別するようにしているので、一定以上の高い信頼性で、偽物を排除できる。
【０００５】
【発明が解決しようとする課題】
しかしながら、上で挙げた先行技術では、多数のアドレスをデコードする必要があるので、ゲート数が多くなり、チップサイズが大きくなってしまうばかりでなく、デコードすべきアドレスが解析されてしまえば、不正利用のプロテクト効果を失うというさらに解決すべき問題があった。
【０００６】
それゆえに、この発明の主たる目的は、解析を困難にしてプロテクト効果を長続きさせることができる、半導体記憶装置およびそれを用いるプログラム判別システムを提供することである。
【００１２】
この発明に従ったプログラム判別システムは、プログラム記憶装置と中央処理装置とを備えたプログラム判別システムであって、プログラム記憶装置は、プログラムデータを固定的に記憶するプログラムデータ記憶手段、第１プログラムデータを変換するためのビット変換演算コードを発生するコード発生手段、および中央処理装置から出力されるアドレスデータに従ってプログラムデータ記憶手段から読み出された第１プログラムデータを受ける出力データ処理手段を備え、出力データ処理手段は、中央処理装置から制御信号が与えられたときにコード発生手段から発生されるビット変換演算コードに基づいて第１プログラムデータの少なくとも一部にビット変換演算を施した新たな第２プログラムデータを出力してその第２プログラムデータを中央処理装置に与え、中央処理装置から制御信号が与えられないときに第１プログラムデータを出力してその第１プログラムデータを中央処理装置に与え、中央処理装置は、第２プログラムデータと予め設定されているチェックデータとの比較によって両者が所定の関係にあるか否かを判断してプログラム記憶装置が真正品かどうかを判別する判断手段を備え、出力データ処理手段は、それぞれ異なる種類の演算を実行できるかつそれぞれが第１プログラムデータの少なくとも一部とビット変換演算コードとを演算してそれぞれ異なる第２プログラムデータを出力するための複数の演算器、および制御信号が与えられたときに第２プログラムデータを出力しかつ制御信号が与えられないときに第１プログラムデータを出力する選択器を備え、コード発生手段はさらに複数の演算器のいずれかを選択する演算器選択コードを発生し、選択器は演算器選択コードによって選択された演算器に関連する第２プログラムデータ、または第１プログラムデータを選択する、プログラム判別システムである。
【００１３】
中央処理装置は、判断手段の判別の結果が偽物のプログラム記憶装置であることを示すとき、プログラムを強制的に終了させるプログラム強制終了手段をさらに備える。
【００１４】
【作用】
半導体記憶装置においては、プログラムデータ記憶手段から読み出された特別プログラムデータに応答して中央処理装置から出力される制御信号が出力データ処理手段に与えられたとき、出力データ処理手段は、コード発生手段からのデータ演算コードに基づいて第１プログラムデータの全ビットまたは一部のビットに演算を施した第２プログラムデータを出力して、その第２プログラムデータをたとえば中央処理装置に与える。具体的には、出力データ処理手段の演算手段が第１プログラムデータとデータ演算コードとを演算して第２プログラムデータを出力し、選択器が制御信号に応答して第２プログラムデータを出力する。したがって、出力データ処理手段からは、制御信号に応答して、中央処理装置から出力されたアドレスデータに従って読み出された第１プログラムデータではなく、その第１プログラムデータを修飾処理した第２プログラムデータが出力される。
【００１５】
中央処理装置では、第２プログラムデータが予め設定してあるチェックデータと一致するかどうか判断手段で判断する。両データが一致すると、判断手段は、そのときの半導体記憶装置（プログラムＲＯＭ）が真正なものであると判断する。両データが不一致のときには、半導体記憶装置は偽物であるので、プログラムを強制的に終了する。
【００１６】
したがって、プログラムデータ記憶手段に格納されているすべてのプログラムデータをコピーしたとしても、この発明の出力データ処理手段がない場合には、プログラムチェックの結果偽物と判断されるので、プログラムの実行は不可能である。
【００１９】
【発明の効果】
この発明によれば、プログラムデータ記憶手段のすべてのプログラムデータをコピーしただけでは、出力データ処理手段における複数の演算器やビット変換演算コードなどのすべての要素が解析できなければ、そのプログラムデータを真正品と同様には実行できないので、プログラムの不正利用を有効に防止できる。
【００２０】
したがって、ビット変換演算コードなどの要素を機種毎にあるいはバージョン毎に変更するようにすれば、ある１つのプログラム記憶装置の全要素が解析できたとしても、その解析結果を別のプログラム記憶装置にそのまま適用できないので、不正に利用しようとする者は、変更の都度新たに解析する必要がある。解析に膨大な時間と設備が必要なことを考えれば、プロテクト効果を長続きさせることができる。
【００２１】
この発明の上述の目的，その他の目的，特徴，および利点は、図面を参照して行う以下の実施例の詳細な説明から一層明らかとなろう。
【００２２】
【実施例】
図１に示すこの発明の一実施例の情報処理装置１０は、中央処理装置であるＣＰＵ１２を含み、このＣＰＵ１２に、出力装置である表示装置１４および入力装置である操作入力装置１６が接続される。情報処理装置１０はプログラム判別システムを構成し、その情報処理装置１０がゲーム装置である場合、操作入力装置１６はゲームコントローラであり、ジョイスティックや十字キーあるいは各種操作ボタンを含み、ゲーム装置に搭載されたＣＰＵ１２は、そのような操作入力装置１６の操作に応答して、プログラムＲＯＭ１８に記憶されているゲームプログラムを処理することによって、たとえばテレビジョンモニタや液晶ディスプレイである表示装置１４にゲーム画像を表示する。なお、ＣＰＵ１２に接続されたワークメモリ２０は、たとえばＣＰＵ１２の内部ＲＡＭや外付けＲＡＭ等で構成され、上述のプログラム処理の過程において必要に応じて利用されるとともに、後述のプログラム真偽判別のためのチェック用プログラムおよびチェックデータを一時的に格納するために利用される。ワークメモリ２０とＣＰＵ１２の内部ＲＡＭとを利用することで、プログラムの解析をより困難にすることができる。
【００２３】
半導体記憶装置あるいはプログラム記憶装置として機能するプログラムＲＯＭ１８は、たとえばＰＲＯＭ，フラッシュＲＯＭ，ＥＰＲＯＭ，ＥＥＰＲＯＭ等のプログラムデータを固定的に記憶しておく読出し専用半導体メモリである。このプログラムＲＯＭ１８は、従来のプログラムＲＯＭと呼ばれるものに相当するメモリコアであるプログラムデータ記憶部２２に加えて、さらに出力データ処理部２４およびコード記憶部２６を含む。そして、この実施例では、プログラムデータ記憶部２２，出力データ処理部２４およびコード記憶部２６は、同じ半導体チップ上に設けられる。そして、アドレスバスを通じてＣＰＵ１２から出力されたアドレスデータはプログラムデータ記憶部２２に与えられる。プログラムデータ記憶部２２は、そのアドレスデータに従ってプログラムデータを読み出し、出力データ処理部２４に与える。出力データ処理部２４は、プログラムデータ記憶部２２から読み出されたプログラムデータを処理して、それをデータバスを通してＣＰＵ１２に出力する。
【００２４】
なお、出力データ処理部２４は、後に説明するように、制御バスを通じてＣＰＵ１２から与えられる制御信号とコード記憶部２６から与えられるコード（データ）とに基づいて、出力プログラムデータを処理する。
【００２５】
図２に出力データ処理部２４の具体的な一例が示される。図２に示すように、出力データ処理部２４は、演算手段として機能する演算器２８と、選択器３０とを含む。演算器２８は、プログラムＲＯＭ１８のチップ内に形成されたもので、たとえば乗算器，除算器，減算器，加算器，シフトレジスタあるいはその他の簡単な論理演算器（たとえばＡＮＤ，ＮＡＮＤ，ＯＲ，ＮＯＲ，ＥＸ-ＯＲ等）である。
【００２６】
プログラムデータ記憶部２２から読み出されたたとえば８ビットの第１プログラムデータＤ０〜Ｄ７内の上位４ビットＤ４〜Ｄ７はそのまま選択器３０の出力データと合成され、下位４ビットＤ０〜Ｄ３は演算器２８の一方入力および選択器３０の一方入力（Ｙ）として与えられる。演算器２８の他方入力には、コード発生手段として機能するコード記憶部２６に設定されている４ビットのデータ演算コードｄ０〜ｄ３が与えられる。演算器２８は、２つの入力について上述の種類のいずれかの演算を実行し、その出力が選択器３０の他方入力（Ｘ）として与えられる。たとえば演算器２８がＡＮＤであった場合、演算器２８は、データ演算コードｄ０〜ｄ３と下位４ビットＤ０〜Ｄ３との論理積の結果Ｄ０´〜Ｄ３´を出力して選択器３０の上述の他方入力に与える。
【００２７】
選択器３０には、先に述べた制御信号、たとえば書き込み信号がＣＰＵ１２から与えられる。したがって、選択器３０は、その制御信号すなわち書き込み信号に応答して他方入力（Ｘ）を選択し、第１プログラムデータＤ０〜Ｄ７内の下位４ビットＤ０〜Ｄ３を演算結果Ｄ０´〜Ｄ３´に置き換えて出力する。プログラムデータ記憶部２２から読み出された第１プログラムデータＤ０〜Ｄ７の上位４ビットＤ４〜Ｄ７は上述のようにそのまま選択器３０の出力に結合されているので、結果的に、選択器３０すなわち出力データ処理部２４からは、Ｄ０´〜Ｄ３´＋Ｄ４〜Ｄ７の合計８ビットの第２プログラムデータが出力される。
【００２８】
なお、ＣＰＵ１２から書き込み信号が選択器３０に与えられていないときには、選択器３０では、一方入力（Ｙ）が選択されているので、プログラムデータの下位４ビットＤ０〜Ｄ３がそのまま選択器３０から出力され、結果的に、出力データ処理部２４からは、Ｄ０〜Ｄ３＋Ｄ４〜Ｄ７の合計８ビットのプログラムデータすなわち第１プログラムデータがそのまま出力される。
【００２９】
このようにして、後述の図５のステップＳ１２では、ＣＰＵ１２へは、第１プログラムデータＤ０〜Ｄ７ではなく、第２プログラムデータＤ０´〜Ｄ３´＋Ｄ４〜Ｄ７が出力される。一方、出力データ処理部２４がない偽プログラムＲＯＭの場合には、プログラムデータ記憶部２２から読み出されたままの第１プログラムデータＤ０〜Ｄ７がＣＰＵ１２へ出力される。したがって、前者の場合にＣＰＵ１２へ入力される第２プログラムデータは予め設定しているチェックデータと一致するが、後者の場合の第１プログラムデータはチェックデータと一致しない。
【００３０】
なお、図２の実施例では、プログラムデータの下位４ビットだけを演算器２８において演算コードと演算し、上位４ビットはそのまま出力するようにした。しかしながら、第１プログラムデータの全８ビットを演算器２８で演算するようにしてもよい。この場合、図２において括弧書きで示されているように、プログラムデータ記憶部２２から読み出したままの第１プログラムデータＤ０〜Ｄ７の全８ビットがそのまま演算器２８の一方入力に与えられ、他方入力にはコード記憶部２６からの８ビットのデータ演算コードｄ０〜ｄ７が与えられる。したがって、演算器２８からは、すべてのビットが修飾処理された第２プログラムデータＤ０'〜Ｄ７'が出力され、この第２プログラムデータＤ０'〜Ｄ７'が選択器３０の入力（Ｘ）として与えられ、選択器３０の入力（Ｙ）としては第１プログラムデータＤ０〜Ｄ７が与えられる。したがって、選択器３０からは、制御信号があるとき第２プログラムデータＤ０'〜Ｄ７'が出力され、制御信号がないとき第１プログラムデータＤ０〜Ｄ７が出力される。したがって、図５のステップＳ１３では、第２プログラムデータＤ０'〜Ｄ７'の適否が判断される。
【００３１】
図１のＣＰＵ１２は、図３に示すメモリマップを有し、たとえば「００００ｈ〜ＤＦＦＦｈ」のメモリ空間がプログラムＲＯＭ１８に割り当てられたプログラム領域であり、「Ｅ０００ｈ〜ＦＦＦＦｈ」がワークメモリ２０に割り当てられたワーク領域である。
【００３２】
プログラムＲＯＭ１８のプログラムデータ記憶部２２は上述のプログラム領域の一部であり、プログラム領域には、さらにプログラム常駐エリア，チェック用プログラムエリアおよびチェック開始命令エリアが設定されている。チェック用プログラムエリアに格納されているチェック用プログラムは、後述の図４および図５のフロー図で実現できるものである。
【００３３】
また、チェック用プログラムには、１つまたは複数のチェックデータが設定されている。このチェックデータは、チェック用プログラムを実行したときの結果が示すデータと比較してプログラムの真偽を判別するためのデータである。たとえば、この実施例では、プログラムの真偽を１回だけチェックする場合について説明するので、図３に図示するようにチェック用プログラム内に１つのチェックデータを設定しているが、単一のチェックデータを利用するチェック用プログラムを起動させるチェック開始命令を本体プログラム（たとえばゲームプログラム）内の複数箇所に設定したり、複数のチェックデータを利用する複数のチェック用プログラムをそれぞれ起動させるチェック開始命令を複数箇所に設定することによって、プログラムの真偽を複数回チェックさせて、プログラムの解析の困難性を高めることができる。
【００３４】
さらに、チェック用プログラムが比較的小さい（たとえば数から数十バイト）場合には、チェック開始命令の代わりに、本体プログラム内の複数箇所にチェック用プログラムを設定することが、チェック用プログラムの解析の困難性を高める上でより好ましい。
【００３５】
図４を参照して、情報処理装置１０（図１）の電源（図示せず）をオンすると、ＣＰＵ１２によって、ステップＳ１がまず実行される。このステップＳ１では、ＣＰＵ１２は、プログラムＲＯＭ１８（図１）の出力データ処理部２４から出力されるプログラムデータを読み込む。このとき、このとき、ＣＰＵ１２は制御信号を出力していないので、出力データ処理部２４からは、プログラムデータ記憶部２２から出力された第１プログラムデータ前記がそのまま出力される。ＣＰＵ１２は、その第１プログラムデータを読み込む。そして、その第１プログラムデータがプログラムの真偽チェックの実行を指示する特別プログラムデータであるかどうかが、ステップＳ２で判断される。
【００３６】
ステップＳ２で“ＮＯ”、つまりそのときのプログラムデータが真偽チェックを命令するものでなかったときは、ステップＳ３でそのときのプログラムデータ（すなわち、他のプログラムのデータ）に従った処理を実行する。ステップＳ３の後ステップＳ４において、ＣＰＵ１２は、プログラムの終了かどうかを判断し、もし“ＹＥＳ”であればそのまま終了し、“ＮＯ”であれば、先のステップＳ１に戻る。このようにして、ステップＳ１〜Ｓ４を繰り返すことにより、プログラムデータ記憶部２２に記憶されているプログラムを順次実行する。この状態においては、アドレス処理部２２の選択器３０には制御信号（たとえば書き込み信号）が付与されていないので、選択器３０では入力（Ｙ）が選択された状態で保持されている。したがって、ＣＰＵ１２から出力された第１プログラムデータがそのままプログラム記憶部２２に与えられる。
【００３７】
ステップＳ１〜Ｓ４を繰り返すことによってプログラムに含まれる各命令を順次実行している途中に、チェック用プログラムを実行するための命令がＣＰＵ１２に入力されると、そのことがステップＳ２で判断されて、ステップＳ５に進む。その命令すなわち特別プログラムデータが図３に示すようにたとえばアドレス「０３０Ｅｈ」に設定されている場合には、ＣＰＵ１２は、アドレスがこの「０３０Ｅｈ」まできたときに、ステップＳ５に進むことになる。
【００３８】
ステップＳ５では、ＣＰＵ１２は、図２に示すプログラム領域に設定されているチェック用プログラムおよびチェックデータを読み込んで、ワークメモリ２０に書き込む（複製する）。したがって、ステップＳ６は、ワークメモリ２０に複製されたチェック用プログラムおよびチェックデータに従って、実行される。ただし、このワークメモリ２０に複製されたチェック用プログラムは、チェック終了後、ワークメモリ２０から消去される。
【００３９】
ステップＳ６のサブルーチンの詳細を図５に示す。図５のステップＳ１１では、ＣＰＵ１２は、まず、制御バスを介して制御信号を発生して、図１に示すプログラムＲＯＭ１８に含まれる出力データ処理部２４を能動化する。具体的には、ＣＰＵ１２は、制御バスを通してプログラムＲＯＭ１８の選択器３０に書き込み信号（制御信号）を与える。ＲＯＭ内のプログラムを実行中に書き込み信号がＲＯＭ（読出し専用メモリ）に与えられることは通常ないので、その信号をプログラムＲＯＭ１８に出力することによって、出力データ処理部２４の選択器３０における入力（Ｘ）を選択させることにしている。このステップＳ１１が制御信号付与手段を構成する。
【００４０】
続くステップＳ１２では、ＣＰＵ１２は、プログラムＲＯＭ１８のプログラムデータ記憶部２２を読み出すためのアドレスデータを出力する。つまり、ステップＳ１１で制御信号を出力した直後に、アドレス入力手段として機能するステップＳ１２で任意のアドレスデータがＣＰＵ１２からアドレスバスを通してプログラムデータ記憶部２２に入力される。プログラムデータ記憶部２２は、そのアドレスデータに従ってプログラムデータを読出し、それを出力データ処理部２４に与える。出力データ処理部２４には先に制御信号が与えられているので、出力データ処理部２４は、第１プログラムを先に図２実施例で説明したようにして処理し、その処理結果である第２プログラムデータをＣＰＵ１２に与えることになる。
【００４１】
そして、ステップＳ１３では、ＣＰＵ１２は、出力データ処理部２４で処理された第２プログラムデータが正しい値であるかどうか判断する。すなわち、ステップＳ１３は判断手段を構成し、ワークメモリ２０に読み出されているチェックデータと、そのときの第２プログラムデータとが比較され、両者が一致するかどうか判断する。出力データ処理部２４で所定の法則に従って処理された第２プログラムデータは、予め設定しているチェックデータと一致する筈である。したがって、この場合、“ＹＥＳ”となる。しかしながら、出力データ処理部２４が設けられていない偽物のプログラムＲＯＭである場合、または出力データ処理部２４に相当するものが存在していても出力プログラムデータ処理が所定の法則に則っていない偽物プログラムＲＯＭの場合には、このステップＳ１３では“ＮＯ”と判断される。
【００４２】
そして、ステップＳ１３で“ＹＥＳ”と判断された真正プログラムＲＯＭの場合には、通常のプログラム処理にリターンする。他方、“ＮＯ”と判断された偽プログラムＲＯＭの場合、次のステップＳ１４において、ＣＰＵ１２は、表示装置１４（図１）にたとえば「このプログラムＲＯＭ（カートリッジ）は偽物であり、本機では使用できません。」のような警告メッセージを表示するとともに、ステップＳ１５でプログラムを強制的に終了する。したがって、偽物の場合、それ以上のプログラムの続行処理が不可能となる。つまり、ステップＳ１４およびＳ１５がプログラム強制終了手段に該当する。
【００４３】
なお、上の説明では、判断手段であるステップＳ１３で、第２プログラムデータと予め設定しているチェックデータとが一致するかどうか比較しているが、両者が必ずしも一致する必要はなく、両者が予め設定している所定の関係にあればよい。たとえば、一方が他方に比べて一定数だけ大きいかまたは小さいかの関係、あるいは一方（および／または他方）に一定の演算を施したとき両者が一致する関係、あるいは両者の絶対値が等しい関係等、任意の所定関係を設定することができる。
【００４４】
図２実施例においても、プログラムデータは適宜の設備を用いればプログラムデータ記憶部２２から完全な形でプログラムデータを読出し、それをコピーできる。しかしながら、図２実施例では、プログラムデータ記憶部２２からプログラムデータを吸い上げてプログラムデータを復元するだけでは、そのプログラムデータを真正品と同様には、実行できない。
【００４５】
つまり、プログラムデータだけを復元しても、このプログラムＲＯＭ１８のプログラムデータを不正に利用する者のメモリに出力データ処理部２４やコード記憶部２６がない場合、プログラムチェックを指示するプログラムデータが読み出されても、上述のプログラムデータの修飾処理が実行できないので、未修飾の第１プログラムデータＤ０〜Ｄ７がそのままＣＰＵ１２に入力される。したがって、そのチェック命令があっても、第１プログラムデータＤ０〜Ｄ７がそのままＣＰＵ１２に入力されることになる。この場合の第１プログラムデータは、図２実施例で得られた第２プログラムデータＤ０´〜Ｄ３＋Ｄ４〜Ｄ７とは異なる。したがって、ステップＳ１３で予め設定されているチェックデータとの比較において、不一致となってしまう。この不一致の判別結果が得られると、ステップＳ１３で“ＮＯ”が判断されるので、プログラムが強制的に終了されてしまう。
【００４６】
そのようなプログラムの強制終了を回避するようにするためには、図４のステップＳ２でチェック開始を指令する特別プログラムデータおよびそれのプログラムステップ（アドレス）を解析し、さらに演算器２８における演算の種類やデータ演算コードおよびチェックプログラムに設定するチェックデータ（図２）等のすべての要素を解析しなければならない。たとえばマスクＲＯＭ等でプログラムＲＯＭ１８を作った場合、そのような解析は困難で、解析にはかなり大掛かりな設備と長時間を要する。他方、演算器における演算の種類やデータ演算コード等の要素をたとえばプログラムＲＯＭの機種、ゲームカートリッジでいえばゲームタイトル毎、さらには同じ機種（ゲームタイトル）でもバージョン毎に変更するようにすれば、ある１つのプログラムＲＯＭの全てのセキュリティ要素が解析されたとしても、その解析結果を別のプログラムＲＯＭにそのまま適用できないので、不正に利用しようとする者は、その都度新たに全要素を解析する必要がある。したがって、この実施例によれば、解析に膨大な時間や費用がかかることを考慮すれば、プログラムＲＯＭの不正利用を実質的にできなくすることができる。
【００４７】
図６は図２実施例の変形例であり、図６実施例では、出力データ処理部２４の演算手段は、複数（ｎ個）の演算器２８１〜２８ｎを含む。各演算器２８１〜２８ｎのそれぞれの一方入力にプログラムデータ記憶部２２から読み出された第１プログラムデータの下位４ビットＤ０〜Ｄ３が与えられ、それぞれの他方入力には、コード記憶部２６から出力される４ビットのデータ演算コードｄ０〜ｄ３が共通に与えられる。さらに、コード記憶部２６に設定されている演算器選択コードｃ０〜ｃＸが制御信号とともに、選択器３０に与えられる。演算器選択コードｃ０〜ｃＸのビット数は、演算器の個数ｎに応じて設定され、４つの演算器２８がある場合には、２ビットであり、８つの場合は３ビットでよい。そして、演算器選択コードｃ０〜ｃＸは、複数の演算器２８１〜２８ｎのいずれか１つを選択するように設定されている。
【００４８】
図６実施例においても各演算器２８１〜２８ｎは図２実施例の演算器２８と同様にプログラムデータを演算ないし修飾するので、このプログラムデータ演算の具体的な説明は省略するが、図６実施例では、演算器２８１〜２８ｎのそれぞれが異なる種類の演算を実行するように設定される。したがって、たとえばプログラムＲＯＭの機種（ゲームタイトル）毎に、あるいはバージョン毎に、演算器選択コードｃ０〜ｃＸによって異なる演算器を選択するようにすると、図２で説明したプログラムの解析の困難性が一層増す。したがって、不正利用をさらに困難にする。
【００４９】
この図６の実施例では、さらに別の利点がある。すなわち、図２実施例のように１つのチップに１つの演算器だけを形成しておき、機種やバージョンによってその演算器を変更する場合、プログラムＲＯＭがたとえばマスクＲＯＭであるときには、演算器の変更の都度、焼き付けマスクを変更しなければならない。これに対して、図６実施例のように、複数の演算器２８１〜２８ｎを組み込んでおけば、演算器選択コードを変えるだけで、演算器すなわち演算の種類を選択できる。他方、演算器選択コードは、データ演算コードと同じ焼き付け工程で設定できるので、図６実施例では、演算器を変更する場合に、プログラムＲＯＭを安価に作れる。
【００５０】
図６実施例においても、選択器３０は、制御信号が与えられているときには入力（Ｘ）を選択し、与えられていないときには入力（Ｙ）を選択するので、制御信号の有無に応じて、第１プログラムデータまたは第２プログラムデータが出力される。また、図６においても第１プログラムデータＤ０〜Ｄ７のすべてのビットを修飾処理する場合を括弧書きで示す。ただし、その動作は、先の図２実施例の説明から容易に理解されるであろうから、ここでは省略する。
【００５１】
なお、上述の実施例では、出力データ処理部２４からは制御信号があるとき演算器２８（２８１〜２８ｎ）で一部または全部を演算したプログラムデータ（第２プログラムデータ）を出力し、制御信号がないときプログラムデータ記憶部２２から読み出されたプログラムデータ（第１プログラムデータ）そのままを選択して出力するようにしている。しかしながら、制御信号がないとき、第１プログラムデータに対して第２プログラムデータとは異なる第２の演算を施した第３プログラムデータを出力するようにしてもよい。
【００５２】
このような実施例が図７に示される。図７実施例では、図２実施例と同様の演算器２８や選択器３０の他に、第２演算器２８'が出力データ処理部２４に設けられる。そして、演算器２８および２８'のそれぞれの一方入力には、プログラムデータ記憶部２２から読み出したプログラムデータＤ０〜Ｄ７（第１プログラムデータ）の下位４ビットＤ０〜Ｄ３がそのまま与えられる。演算器２８および２８'の他方入力には、コード記憶部２６に設定されている４ビットのデータ演算コードｄ０〜ｄ３が共通的に与えられる。演算器２８および２８'は、互いに異なる第１の種類の演算および第２の種類の演算を実行できるようにされている。
【００５３】
演算器２８は、データ演算コードｄ０〜ｄ３と下位４ビットＤ０〜Ｄ３との第１の演算結果Ｄ０'〜Ｄ３'を出力して選択器３０の入力（Ｘ）に与える。演算器２８'は、データ演算コードｄ０〜ｄ３と下位４ビットＤ０〜Ｄ３との第２の演算結果Ｄ０''〜Ｄ３''を出力して選択器３０の入力（Ｙ）に与える。このような演算器２８および２８'からの入力Ｄ０'〜Ｄ３'またはＤ０''〜Ｄ３''が選択器３０によって選択される。
【００５４】
選択器３０には、制御信号、たとえば書き込み信号がＣＰＵ１２から与えられるとともに、コード記憶部２６に記憶されている演算器選択コードｃ０〜ｃＸが与えられる。したがって、選択器３０は、その制御信号があるときには、演算器２８の出力すなわち入力（Ｘ）を選択し、その演算器２８によって処理された下位４ビットのプログラムデータＤ０'〜Ｄ３'を出力する。選択器３０は、また、制御信号がないときには、演算器２８'の出力すなわち入力（Ｙ）を選択し、その演算器２８'によって処理された下位４ビットのプログラムデータＤ０''〜Ｄ３''を出力する。
【００５５】
他方、第１プログラムデータＤ０〜Ｄ７の上位４ビットＤ４〜Ｄ７がそのまま選択器３０の出力に結合されているので、結果的に、制御信号があるときには、選択器３０すなわち出力データ処理部２４からは、Ｄ０'〜Ｄ３'＋Ｄ４〜Ｄ７の合計８ビットのプログラムデータ（第２プログラムデータ）が出力され、制御信号がないときには、選択器３０すなわち出力データ処理部２４からは、Ｄ０''〜Ｄ３''＋Ｄ４〜Ｄ７の合計８ビットのプログラムデータ（第３プログラムデータ）が出力される。
【００５６】
ただし、この図７の実施例においても、図７に括弧書きしたように、プログラムデータＤ０〜Ｄ７のすべてのビットを演算器２８および演算器２８'によって演算するようにしてもよい。
【００５７】
図７実施例では、プログラムデータ記憶部２２から読み出された第１プログラムデータＤ０〜Ｄ７は、ＣＰＵ１２が正規に実行しようとするプログラムデータではない。つまり、第１プログラムデータは、偽のプログラムデータに過ぎない。そして、第１演算器２８および第２演算器２８'のいずれか一方が、ＣＰＵ１２によって正規に実行されるべき第２プログラムデータまたは第３プログラムデータになるように、第１プログラムデータＤ０〜Ｄ７を変更ないし変換することになる。つまり、第２プログラムデータまたは第３プログラムデータのいずれか一方が正しいプログラムデータである。
【００５８】
図７実施例では、プログラムを不正利用しようとする場合、第１演算器２８だけでなく第２演算器２８'についても解析する必要があり、解析の困難性をさらに増大させる。
【００５９】
上述の実施例は、プログラムＲＯＭ１８に出力データ処理部２４を設け、プログラムデータ記憶部２２から読み出されたプログラムデータを加工ないし修飾するものであった。しかしながら、同様の考え方をプログラムデータ記憶部２２に与えられるアドレスデータに適用し、プログラムデータとともにアドレスデータも加工ないし修飾処理することも可能である。
【００６０】
そのようにするための実施例では、プログラムＲＯＭ１８には、プログラムデータ記憶部２２の他に、図１実施例に示す出力データ処理部２４およびコード記憶部２６を含み、さらに、ＣＰＵ１２からアドレスバスを介して出力されるアドレスデータを受け、そのアドレスデータに所定の処理を施すアドレス処理部（図示せず）を設ける。このアドレス処理部は、具体的には、上で説明した出力データ処理部２４と同様の動作を実行して、ＣＰＵ１２から出力されてプログラムデータ記憶部２２に与えるべきアドレスデータを処理ないし修飾する。この場合、ＣＰＵ１２からの制御信号は、出力データ処理部２４およびアドレス処理部の両方に与えられ、図５のステップＳ１１で出力データ処理部２４およびアドレス処理部がともに能動化される。そして、アドレス処理部では、ＣＰＵ１２から出力されるアドレスデータを加工または修飾して、プログラムデータ記憶部２２に与える。したがって、図５のステップＳ１３でＣＰＵ１２に入力されるのは、アドレス処理部で処理されたアドレスデータに従ってプログラムデータ記憶部２２から読み出されかつ出力データ処理部２４で処理されたプログラムデータである。
【００６１】
なお、いずれの実施例においても、コード発生手段としてプログラムＲＯＭ１８と同じチップに形成されたコード記憶部２６を用いている。しかしながら、このコード発生手段は、任意のコード（データ）を演算手段に与えられるものであればよく、たとえばディップスイッチ等によって任意のデータを与える構成や任意のデータを外部から書き換え可能に記憶する外付けのフラッシュＲＯＭなどに置き換えてもよい。
【００６２】
さらに、上述の実施例では、偽プログラムであった場合にはプログラムの実行を直ちに強制終了させたが、たとえば、一定時間後に強制終了させたり、ゲームの場合には、キャラクタのパラメータを書き換えたり、ゲームのバックアップデータを消去したり、ゲームを初期の状態に戻したりするような処理にすることもできる。
【図面の簡単な説明】
【図１】この発明の一実施例を示すブロック図である。
【図２】図１実施例の出力データ処理部の一例を示すブロック図である。
【図３】図１におけるＣＰＵのメモリマップを示す図解図である。
【図４】図１実施例の動作を示すフロー図である。
【図５】図４フロー図のチェック用プログラムを示すフロー図である。
【図６】出力データ処理部の変形例を示すブロック図である。
【図７】出力データ処理部の他の変形例を示すブロック図である。
【符号の説明】
１０  …情報処理装置
１２  …ＣＰＵ
１８  …プログラムＲＯＭ
２０  …ワークメモリ
２２  …プログラムデータ記憶部
２４  …出力データ処理部
２６  …コード記憶部
２８，２８１〜２８ｎ，２８´  …演算器
３０  …選択器
【図１】
0004594475.tif 000002
【図２】
0004594475.tif 000003
【図３】
0004594475.tif 000004
【図４】
0004594475.tif 000005
【図５】
0004594475.tif 000006
【図６】
0004594475.tif 000007
【図７】
0004594475.tif 000008