(57)【特許請求の範囲】
【請求項１】
コードシーケンスを実行可能なCPU（１）と、該CPU（１）によって実行可能な少なくとも一つのコードシーケンスを有するプログラムが格納されている第一のメモリ（２）と、第二のプログラマブルメモリ（３）とを備え、前記第一のメモリ（２）又は前記第二のプログラマブルメモリ（３）に新しいコードシーケンスを格納した媒体においてコードシーケンスを変更する装置であって、
第二のプログラマブルメモリ（３）に、各オリエンテーション命令（IORi）を識別するためのリファレンス番号（ｉ）、該オリエンテーション命令に対応する時間遅延値（ΔTi）、及びジャンプアドレス（Adr_i）の三つのフィールドを少なくとも含む分岐テーブルTAB_DERが格納されており、
前記第一のメモリ（２）のプログラム中のリファレンスポイントに挿入されたオリエンテーション命令（IORi）を実行することにより、前記分岐テーブルTAB_DERから、当該オリエンテーション命令（IORi）のリファレンス番号に対応する時間遅延値（ΔTi）、及びジャンプアドレス（Adr_i）を読み出し、該時間遅延値（ΔTi）を初期値としてタイマ（６）にカウントダウンを開始させる手段と、
前記オリエンテーション命令（IORi）の実行後、前記プログラムのコードシーケンスの実行を続行する手段と、
前記時間遅延値が経過したとき前記ジャンプアドレス（Adr_i）にジャンプして前記新しいコードシーケンスを実行する手段と、
前記新しいコードシーケンスを実行した後、前記プログラムのコードシーケンスへ復帰する手段とを含むことを特徴とする装置。
【請求項２】
プログラムのコードが格納されているメモリの前記リファレンスポイントには、活動化可能なオリエンテーション命令（IORi）が予め挿入されており、各オリエンテーション命令は、プログラマブルメモリ（３）に書き込まれた分岐テーブルTAB_DERのリファレンス番号（ｉ）に関連づけられていることを特徴とする請求の範囲第１項に記載のコードシーケンスを変更する装置。
【請求項３】
活動化された各オリエンテーション命令（IORi）が新しいコードシーケンスの実行を開始し、
−  オリエンテーション命令のリファレンス番号に対応している時間遅延値（ΔTi）であって、該時間遅延値が、該時間遅延値に関連してテーブル内にアドレス（Adr_i）が示されている新しいコードシーケンスへの分岐を行う割込みの開始を延期させることを可能にする時間遅延値をプログラマブルメモリ（３）のテーブルTAB_DERから読み取る手段と、
−  アドレス（Adr_i）を装置のメモリに記憶する手段と、
−  分岐の時間遅延値に必要な時間をカウントダウンするために装置のタイマ（６）をスタートさせる手段とを備えることを特徴とする請求の範囲第２項に記載のコードシーケンスを変更する装置。
【請求項４】
装置のメモリに記憶されており、新しいコードシーケンスの実行に先立って、時間遅延値（ΔTi）に関連する時間間隔［ΔTmini;ΔTmaxi］を各分岐ポイント（ｉ）に関連づけている第二のテーブルTAB_SECと、時間遅延値が該テーブルによって与えられる関連の時間間隔によって許可されていることを検査する手段とを備えることを特徴とする請求の範囲第３項に記載のコードシーケンスを変更する装置。
【請求項５】
時間遅延値（ΔTi）に（ΔTmaxi−ΔTmini）を加算した値をタイマ（６）にロードする手段を備えることを特徴とする請求の範囲第４項に記載のコードシーケンスを変更する装置。
【請求項６】
時間遅延値ΔTiが前記時間間隔内にあるとき、エラーメッセージを発生させる手段を備えることを特徴とする請求の範囲第４項に記載のコードシーケンスを変更する装置。
【請求項７】
タイマ（６）が零値に達したとき、時間遅延値（ΔTi）の終了の結果として、割込みを開始する手段と、PCプログラムカウンタレジスタのカレント値をスタックに記憶する手段と、割込みベクトルを含んでおりROM部分内に規定されているアドレスにプログラムを分岐させ、割込みのコードシーケンスの開始のアドレスを与える手段と、スタックに記憶されているPCプログラムカウンタレジスタの値Val_PCがテーブルTAB_SEC内に含まれているセンシブルシーケンスアドレス値でないことを検査する手段と、オペレーションの実行を変更する手段とを備えることを特徴とする請求の範囲第３項に記載のコードシーケンスを変更する装置。
【請求項８】
検査手段が、プログラムカウンタレジスタの値がTAB_SECによりセンシブルシーケンスの期間中のプログラムの中断に対応する間隔［Adrdeb_i、Adrfin_ｉ］内に含まれているかどうかテストし、カードのオペレーションの実行を変更する手段が、カードのセキュリティが破られ、禁止されることを示すメッセージを送り返すか、あるいは検査手段が、プログラムカウンタレジスタの値Val_PCが非センシブルシーケンスの期間中のプログラムの中断に対応する間隔［Adrfin_i、Adrdeb_i＋１］に含まれているかどうかテストし、オペレーションの実行を変更する手段が、オリエンテーション命令（IORi）の処理中に開始アドレスが記憶された新しいコードシーケンスを実行することをプログラムに許可することを特徴とする請求の範囲第７項に記載のコードシーケンスを変更する装置。
【請求項９】
CPU（１）によるプログラムの実行を可能にする周波数ソースとは異なるタイマ（６）のための周波数ソースを備えている場合、分岐テーブルTAB_DERにプログラムされている時間遅延値（ΔTi）は、決定されたアドレスにおいてプログラムを中断することを可能にするように計算され、テーブルTAB_DERが、各時間遅延値について、当該決定されたアドレスを含んでいる追加のフィールドを備えており、前記装置は、時間遅延値（ΔTi）によって中断された命令のアドレスを、前記追加のフィールドに示されているアドレスと比較する手段と、前記二つのアドレスが一致しない場合にアラームを発生させる手段とを有することを特徴とする請求の範囲第１項に記載のコードシーケンスを変更する装置。
【請求項１０】
媒体の動作を停止するために、またメモリへの書き込みを介する不正な試みを示すためにアラームを発生させる手段を備えることを特徴とする請求の範囲第９項に記載のコードシーケンスを変更する装置。
【請求項１１】
新しいコードシーケンスのそれぞれが、新しい時間遅延値（ΔTi）をタイマ（６）に再ロードするためにオリエンテーション命令で終わることを特徴とする請求の範囲第１項に記載のコードシーケンスを変更する装置。
【請求項１２】
コードシーケンスを実行可能なCPU（１）と、該CPU（１）によって実行可能な少なくとも一つのコードシーケンスを有するプログラムが格納されている第一のメモリ（２）と、第二のプログラマブルメモリ（３）とを備え、前記第一のメモリ（２）又は前記第二のプログラマブルメモリ（３）に新しいコードシーケンスを格納した媒体においてコードシーケンスを変更する方法であって、
各オリエンテーション命令（IORi）を識別するためのリファレンス番号（ｉ）、該オリエンテーション命令に対応する時間遅延値（ΔTi）、ジャンプアドレス（Adr_i）の三つのフィールドを少なくとも含む分岐テーブルTAB_DERを第二のプログラマブルメモリ（３）に格納するステップと、
前記第一のメモリ（２）のプログラム中のリファレンスポイントに挿入されたオリエンテーション命令（IORi）を実行することにより、前記分岐テーブルTAB_DERから、当該オリエンテーション命令（IORi）のリファレンス番号に対応する時間遅延値（ΔTi）、及びジャンプアドレス（Adr_i）を読み出し、該時間遅延値（ΔTi）を初期値としてタイマ（６）にカウントダウンを開始させるステップと、
前記オリエンテーション命令（IORi）の実行後、前記プログラムのコードシーケンスの実行を続行するステップと、
前記時間遅延値が経過したとき前記ジャンプアドレス（Adr_i）にジャンプして前記新しいコードシーケンスを実行するステップと、
前記新しいコードシーケンスを実行した後、前記プログラムのコードシーケンスへ復帰するステップとを含むことを特徴とする方法。
【請求項１３】
前記新しいコードシーケンスを実行するステップの前に、前記第１のメモリまたは第２のプログラマブルメモリに書き込まれているセキュリティテーブルと呼ばれる第二のテーブルTAB_SECによって規定された間隔内に前記時間遅延値が含まれていないことを検査する検査ステップが実行されることを特徴とする請求の範囲第12項に記載の方法。
【発明の詳細な説明】
本発明はコードシーケンスを変更する方法及び関連の装置に関する。
本発明はコンピュータプログラム、特に少なくとも容易には変更できない媒体に記録されるコンピュータプログラムに関する。これらの媒体は、特にCPU、作業メモリ、不揮発性メモリ及び入出力手段を備えた情報処理システムに組み込まれる。より具体的には、この情報処理システムはチップカードに組み込むことができる。この場合、カードは少なくともマイクロプロセッサと、プログラムや場合によってはデータが格納されているROMと、作業メモリと、不揮発性プログラマブルメモリとを備える回路を搭載する。有利には、回路はモノリシックな形で構成される。不揮発性メモリはデータ及び／又はコードを格納することができる。従って、マイクロプロセッサはこのコードをROMに記録されているコードと同じ方法で実行することができる。従って、カードには二種類のメモリが搭載される。即ち、第一のメモリの内容は回路の製造時に書き込まれ、変更不可能である。第二のメモリの内容は出荷時に空白であり、値はこのメモリの通常の使用の過程で書き込まれる。
今日、チップカードは技術的に多数のニーズを満たすことができる。「オペレーティングシステム」とも呼ばれている、カードに組み込まれているプログラムはカードの諸機能をその最終用途に適応させることを可能にする。実際のところ、オペレーティングシステムは集積回路の製造の際にROMに書き込まれて格納される。新しいニーズに応えることを目的としたプログラムの変更は時間のかかる作業であり、クライアントが急を要しているときは大きな問題を引き起こす。また、この作業は非常にコストが高くつく。それゆえに、数千枚のカードの購入を希望する多くの「小規模な」クライアントは二の足を踏み、彼らの期待を部分的にしか満たさないカードで我慢する場合が多い。解決法は既存のマスクを使用するとともに、クライアントが必要とする諸機能をプログラマブルメモリに追加すること、あるいはROMに存在している諸機能を変更することからなる。
追加コードをプログラマブルメモリに挿入し、実行できることは、古いプログラムに新しい機能を容易に付加することを可能にする、あるいは古い機能を特定のニーズに適応させるという利点を提供する。
本願出願人の特許願96/05454はいくつかの命令の実行の際にプログラムを分枝（rerouting）するための具体的なメカニズムについて記載している。この発明はROMのいくつかのロケーションに質問ポイント（interrogation point）とオリエンテーションポイント（orientation point）をそれぞれの命令によって確立することからなる。質問ポイントは番号によって参照され、この番号によって示されているアドレスに対応したコードシーケンスが存在している場合、プログラマブルメモリ内のルーチンへのアクセスを可能にする。肯定の場合には、フラグがセットされ、分枝アドレスがRAMに記憶される。オリエンテーションポイントは、質問ポイントが事前に実行された場合に、アクティブである。有利なケースでは、分枝は、通常のプログラムをプログラムされたアドレスへジャンプさせることによって開始される。実行されるべきコードシーケンスはプログラマブルメモリ内にあってもよいし、ROM内にあってもよい。
しかしながら、この実施形態は、プログラムの実行において多数の変更を考慮することが必要な場合、いくつかの問題を生じる。即ち、この場合、ROMに多数のオリエンテーションポイントを設ける必要がある。極端な例では、広範囲の適応性が望まれるならば、プログラムはメインプログラムを構成しているコードの数より多い、分枝を可能にするコードを含むことになる。ROMのサイズが制限されている場合、このポイントの多さが主な欠点である。更に、実行時間がポイント数に比例して増大する。分枝ポイント数が制限されるならば、この構成はフレキシビリティを失う。なぜならば、それはどんな命令の実行の際でもプログラムを分枝させることができなくなるからである。
本発明は、固定プログラムのいくつかの動作異常を是正することを可能にする、従って正しい実行を可能にする装置、あるいは書き込まれるべきコードシーケンスの最適化を図りながら、既存のプログラムに様々な機能性を容易に付加することを可能にする装置を目的とする。
この目的は、媒体のメモリに書き込まれたコードシーケンスを変更する装置が、該コードシーケンスを実行可能なCPUと、CPUによって実行可能なメインプログラムを格納する該メモリと、場合によっては実行可能な新しいコードシーケンスが格納する第二の不揮発性プログラマブルメモリと、第三の作業メモリとを備え、第二のプログラマブルメモリに格納される分枝テーブルTAB_DERが、新しいコードシーケンスのリファレンスデータを持つ少なくとも一つのフィールドと、実行されたコードシーケンスからの三つのメモリのうちの一つに書き込まれた新しいコードシーケンスに向かう遅延された分枝を可能にする分枝手段と、分枝前に実行されたコードシーケンスの一つのポイントへの復帰を可能にする新しいコードシーケンス内の手段とを含むことによって達成される。
本発明の別の目的は、オリエンテーションポイント数が制限されていても、どんな命令の実行であれその実行の前に、プログラムの通常の実行の中断を可能にすることである。
この目的は、分枝手段がメインプログラムのコードが格納されているメモリに予め挿入された、活動化可能なオリエンテーション命令（IORi）からなることによって達成される。各オリエンテーション命令はプログラマブルメモリに書き込まれた分枝テーブルTAB_DERのリファレンスｉに関連づけられる。
別の特徴によれば、活動化される各オリエンテーション命令（IORi）は下記手段を持つ新しいコードシーケンスの実行を開始する。
−  オリエンテーション命令のリファレンスに対応している時間遅延ΔTiをプログラマブルメモリのテーブルTAB_DERから読み取る手段。この時間遅延は、時間遅延に関連してアドレス（Adri）がテーブル内に示されている新しいコードシーケンスへの分岐を行う割込みの開始を遅延することを可能にする。
−  アドレス（Adri）を装置のメモリに記憶する手段。
−  分枝の時間遅延に必要な時間をカウントするために装置のタイマをスタートさせる手段。
本発明の別の目的は、CPUによって実行される、いわゆるセンシブルオペレーションのオペレーションをマスクすることを可能にすることである。
この目的は、コードシーケンスを変更する装置が、装置のメモリに記憶され、新しいコードシーケンスの実行に先立ち、時間遅延ΔTiに関連した時間間隔［ΔTmini;ΔTmaxi］を各分枝ポイント（ｉ）に関連づける第二のテーブルTAB_SECと、時間遅延がこのテーブルによって与えられる関連時間間隔によって許可されることを検査する手段とを備えていることによって達成される。
別の特徴によれば、コードシーケンス装置は時間遅延ΔTiを時間間隔［ΔTmini;ΔTmaxi］の値だけシフトさせることを可能にする手段を備えている。
別の特徴によれば、コードシーケンス装置は、時間遅延ΔTiが時間間隔内にあるとき、エラーメッセージを発生させる手段を備えている。
別の特徴によれば、コードシーケンス装置は、タイマが零値に達するとき、時間遅延（ΔTi）の終了の結果として、割込みを開始する手段と、PCプログラムカウンタレジスタのカレント値をスタックに記憶する手段と、割込みベクトルを含んでいるROM部分内に規定されているアドレスにプログラムをジャンプさせる、割込みのコードシーケンスの開始のアドレスを提供する手段と、スタックに記憶されているPCプログラムカウンタレジスタの値Val_PCがテーブルTAB_SEC内に含まれているセンシブルシーケンスアドレス値でないことを検査する手段と、オペレーションの実行を変更する手段とを備えている。
別の特徴によれば、検査手段はプログラムカウンタレジスタの値がセンシブルシーケンス中のプログラムの中断に対応している間隔［Adrdeb_i、Adrfin_1］内にTAB_SECに含まれているかどうかテストし、カードのオペレーションの実行を変更する手段は、カードのセキュリティが破られ、禁止されることを示すメッセージを送り返すか、あるいは検査手段はプログラムカウンタレジスタの値Val_PCが非センシブルシーケンス中のプログラムの中断に対応している間隔［Adrfin_i、Adrdeb_i＋１］に含まれているかどうかテストし、オペレーションの実行を変更する手段は、オリエンテーション命令（IORi）の処理中に開始アドレスが記憶された新しいコードシーケンスを実行することをプログラムに許可する。
別の特徴によれば、コードシーケンスを変更する装置はCPUによるプログラムの実行を可能にする周波数ソースとは異なるカウンタのための周波数ソースを備えており、分枝テーブルTAB_DERにプログラムされている時間遅延（ΔTi）の値は決定されたアドレスにおいてプログラムを中断することを可能にするために計算され、テーブルTAB_DERは時間遅延の各値について、この決定されたアドレスを含んでいる追加要素と、割込みによって中断された命令のアドレスをテーブル内に示されているアドレスと比較し、アラームを発生させる手段とを持つ。
別の特徴によれば、コードシーケンス装置は媒体をブロックするために、またメモリへの書き込みという不正な試みを示すためにアラームを発生させる手段を備えている。
別の特徴によれば、各新しいコードシーケンスは新しい時間遅延値（ΔTi）をタイマにロードするためにオリエンテーション命令で終わる。
最後の目的は、CPU及びメモリを含む媒体に書き込まれた固定コードシーケンスを変更する方法である。
この目的は、CPU及びメモリを含む媒体に書き込まれた固定コードシーケンスを変更する方法が、オリエンテーション命令に関連したリファレンスｉに応じて、オリエンテーション命令のリファレンスｉに対応しているテーブル行の内容によって決定された時間遅延内に、メモリに格納されているプログラムの実行を時間遅延された中断によって分枝テーブルTAB_DERによって決定されたアドレスに向けてジャンプすることを可能にする少なくとも一つのオリエンテーション命令（IORi）を、少なくとも一つの固定コードシーケンスに設けることによって達成される。なお、時間遅延の終了時に生じる割込みの際に実行可能な新しいコードシーケンスはテーブル（TAB_DER）内に含まれているアドレスに設けられる。
別の特徴によれば、割込みを開始させるステップの前に検査ステップがあり、時間遅延は、媒体の不揮発性メモリに書き込まれているセキュリティテーブルと呼ばれる第二のテーブルTAB_SECによって規定された間隔内に含まれない。
本発明のその他の特徴及び利点は、添付図を参照しながら行う以下の説明を読むことによってより明確になるであろう。
第１図は、本発明の実施に必要な電子回路の概略図である。
第2A図は、本発明の実施に必要なコードシーケンスのタイムチャートである。
第2B図は、分枝ポイントの活動化に対応するコードシーケンスの論理図である。
第2C図は、カウンタによって生じる割込みの処理に対応するコードシーケンスである。
第2D図は、分枝テーブルTAB_DERである。
第３図は、本発明の実施形態における、オリエンテーション命令処理及び割込み処理アプリケーションプログラムのコードシーケンスのネスティングのタイムチャートである。
第4A図は、セキュリティテーブルTAB_SECである。
第4B図は、本発明の分枝テーブルと一緒にセキュリティテーブルが使用される場合における分枝シーケンスの論理フローチャートの変更である。
第５図は、分枝テーブル内の書き込みプログラムの論理フローチャートである。
本発明を「チップカード」、より具体的にはマイクロプロセッサカードを例に挙げて説明する。これらのカードは一般に集積回路を有しており、その全体構成は第１図に示されているとおりである。この回路はアドレス及びデータバスにより例えばメインプログラムを格納しているROMタイプの不揮発性メモリ（２）に接続されているCPU（１）と、EEPROMタイプの不揮発性プログラマブルメモリ（３）と、作業メモリRAM（４）と、入出力インターフェイスI/O（５）と、タイマ（６）とを備えている。カウンタは割込みを発生させることができる。従って、タイマはCPUによって実行されるプログラムの通常の実行を中断することができる。割込みはベクトルに関連づけられており、ベクトルは割込みルーチンの開始アドレスである。割込みを発生させるものは、シーケンスの最初の命令のアドレスである。タイマの内部あるいは外部の手段により、割込み禁止手段は割込みを遅らせたり、キャンセルすることも可能である。この場合、割込みはあとで考慮されるか、まったく考慮されない。
プログラマブルメモリ（３）は複数の部分に分かれている。システムゾーンと呼ばれる第一の部分には外部から読取り不可能なシステム情報が格納されている。この部分は特にメモリの他の部分の各々を画定することを可能にするポインタの値を含んでいる。データゾーンと呼ぶ第二の部分（32）は外部からアクセス可能であり、主にユーザデータを含んでいる。第三の部分（33）にはオリエンテーションテーブルTAB_DERが格納されている。このテーブルは少なくとも三つのフィールド（RefNo、ΔTi及びAdri）で構成された同一フォーマットによる要素を含んでいる。シーケンスゾーンと呼ぶ第四の部分（34）はオリエンテーションポイントの参照番号（RefNo）から、またテーブルから読み取られたアドレス（Adri）からメインプログラムによって呼び出され得るコードシーケンスを含んでいる。本発明の変形形態では、オリエンテーションテーブルあるいは一つ又は複数のコードシーケンスは不揮発性プログラマブルメモリではなく作業メモリRAMにロードし得ることに留意されたい。
オリエンテーションテーブルTAB_DERの、AD_TABと呼ばれる開始アドレスはシステムゾーン（31）内に記憶される。正確なロケーションがこの値を収容するために設けられる。このロケーションを書き込むことにより、テーブルが適正に存在していること、及びオリエンテーションポイントが実際に使用できることが示される。
特にメインプログラムが格納されているROM（２）は三つの部分に分かれている。第一の部分（21）は電源投入時におけるプログラムの初期化を行う。第二の部分（22）にはアプリケーションプログラムが格納されている。第三の部分（23）は「休眠」コードを含んでいる。このコードの役割については、後述する。
プログラムが分枝ポイント又はオリエンテーションポイント（220）に到達すると、プログラムは第2B図に示されている分枝シーケンスを実行する。この分枝シーケンスは割込みがすでに実行中であるかどうかをプログラムが調べる第一のステップからなる。肯定の場合には、プログラムは中止される。否定の場合には、プログラムはステップ2202へ進み、ここで分枝ポイントｉに対応しているインディケータがアクティブであるかどうか調べる。
否定の場合には、プログラムは前に述べた出願に記載されているタイプのエラー処理を行う。肯定の場合には、プログラムはEEPROMの第三の部分（33）に書き込まれているテーブルTAB_DER内において、分枝ｉに対応しているタイマのプログラミング値（ΔTi）及び分枝アドレス（Adrsi）を探索するステップへ進む。
次のステップ2205はテーブルTAB_DERの行ｉによって与えられる遅延値（ΔTi）を遅延タイマ（６）にロードすることを可能にする。そしてプログラムの次のステップ2206は遅延タイマのスタートを可能にする。ある種のマイクロプロセッサでは、タイマへの新しい値の書き込みはその活動化をもたらす。この場合、二つのステップ2205と2206は統合される。このステップの後、分枝シーケンスは、ステップ2207で、分枝又はオリエンテーション命令（IOR）に遭遇したときに実行中であったプログラムの次の命令にジャンプする。
ステップ2206においてスタートしたタイマがテーブルTAB_DERの行ｉによって与えられた時間（ΔTi）を経過した場合、タイマ（６）はマイクロプロセッサ（１）に割込みをかける。これに伴い、割込みシーケンスが処理される（221;第2A図）。第2C図に詳細が示されているこの割込みシーケンスはジャンプコンテキスト（2210）をRAM（４）に一時記憶可能なステップから始まる。割込みの処理はステップ2204で先に記憶されたアドレスにおいて、EEPROM（３）の第四の部分内（34）、あるいはROMの第三の部分内（23）に格納されている新しいコードシーケンスを実行するステップ（2211）へ進む。割込みは、例えば割込みリターン命令RTIを用いて、即ち第2A図の参照記号2212Bで示されているように（例えばJUMP命令によって）ジャンプを行うことによってメインプログラムに戻るために、即ち割込み前に実行されていたプログラムの次の命令（2212A）に戻るために一時記憶されているコンテキストを使用可能なステップ（2212）で終わる。
以上から分かるように、EEPROMにテーブルを、ROMに割込みシーケンスを、また揮発性あるいは不揮発性メモリに分枝シーケンスを記録することにより、ROMに記憶されているアプリケーションプログラムのあらゆる点において介入することが可能であり、更に休眠コード部分を利用することによって、あるいは例えばEEPROMに新しいコード部分を書き込むことによって、機能を変更したり、新しい機能を付け加えたりすることが可能である。
オリエンテーションポイントは、今変更すべきプログラム部分より前に存在している。このオリエンテーションポイントはそれに固有の参照番号が付されており、この場合「１」である。
テーブルTAB_DERはプログラマブルメモリに挿入されている。参照記号「１」に対応した入力は例えば次表のとおりである。
0003563412.tif 000002
ΔT1は所望アドレスAdr_2においてメインプログラムの実行を中断するのに必要な時間に相当するように計算されている（第３図）。この計算を行うにあたっては、命令の数がアドレスAdr_2に「届く」ことが必要であり、タイマのカウントダウン周波数が考慮される。
最初に、オリエンテーションテーブルの存在がテストされる。先に述べたように、これはテーブルTAB_DERの開始アドレスを含んでいるロケーションの書込みの有無をテストすることになる。次に、タイマの実行中の割込みの存在がテストされる。もしタイマが動作中であるならば、分枝ポイントの実行を禁止しなければならず、先行のオリエンテーションポイントに対応しているコードシーケンスのみが実行される。もしタイマが動作中でないならば、プログラムは番号１のオリエンテーションポイントに対応している第二及び第三の要素内に書き込まれている値を探索する。値ΔT1及びAdr_1が要素の第一及び第二のフィールドからそれぞれ抽出される。そして、タイマのデータレジスタに値ΔT1がロードされ、タイマによって引き起こされた割込みに関連した割込みベクトルに値Adr_1がロードされる。最後に、オリエンテーションポイントのシーケンスから出る直前に、タイマはスタートされ、そのデータレジスタに格納された値は時間の関数として減少する。
値ΔT1はきわめて正確に決定されなければならない。この値は、タイマのスタート命令の実行時点と実行すべきでない第一の命令の実行時点とを分離するサイクルの数に直接依存している。もしタイマがCPUのクロックと同期しているならば、上述の二つの命令を分離している各命令のサイクルの数を加算すれば十分である。もしタイマがCPUと同じ周波数で同期化されていないならば、計算は概算であり微妙である。
もしタイマの周波数ソースがプログラムの実行を可能にする周波数ソースと異なっているならば、本発明の方法は例えば安全検査タスクを行うことを可能にする。即ち、テーブルTAB_DERにプログラムされた値は所与のアドレスにおいて中断を可能にする。このアドレスとは、テーブルTAB_DER内で追加要素として示されたアドレスである。いったん中断がアクティブになれば、中断された命令のアドレスをテーブル内に示されているアドレスと比較することができる。もしこれらのアドレスが等しくないならば、そのときは、おそらく不正な試みに起因する周波数ソースの擾乱があるものと結論づけることができ、プログラムは（例えばブロックされることによって）適切に動作することができる。
本発明の好ましい実施方法はプログラマブルメモリにテーブル（第2D図）を作成することからなる。このテーブルの第一の要素はオリエンテーションポイントの参照番号であり、第二の要素はタイマへのローディング値であり、第三の要素は実行されるべきコードシーケンスのアドレスである。
このテーブル（第2D図）は５バイトの六つの行に配分された30バイトの最大サイズを有する。テーブルの第一の要素は１バイトを持つ。これは、１から255まで番号付けされた255のオリエンテーションポイントをROMコード内に置くことを可能にする。値ゼロはもはや値がないことを示している。即ち、テーブルエンドに達している。第二の値は２バイトで表示される。これは65536の異なる値をタイマにロードすることを可能にする。最後に、ジャンプアドレスは２バイトで示され、これはチップカードタイプのマイクロプロセッサでは通常の値である。このアドレスはプログラマブルメモリEEPROMに書き込まれたコードシーケンスならびにROM内のコード（スリーピングコード）を実行させることを可能にしなければならない。
このテーブルTAB_DER（第2D図）の六番目の行は「00」であることが分る。従って、この場合は、実際に使用可能なオリエンテーションポイントは五つしかない。即ち、番号１と３と４（二つの入力）と６である。オリエンテーションポイント３と６は同じジャンプアドレスAdr_3を持っている。これはプログラムの変更がこれらの二つのポイントについて同じであることを意味している。従って、三つの分枝シーケンスが設けられている。これらの分枝シーケンスは、プログラマブルメモリ及びROMコードの一部に記憶可能であり、「休眠」コードは、オリエンテーションポイントを用いてこれを実行することができる。
プログラマがテーブルのサイズに対応する情報をメモリに格納することを不要にする、別のオリエンテーションテーブルの管理方法は、オリエンテーションテーブルの次の要素のアドレス値を含む追加フィールドを用意することからなる。より詳細については、前述の特許出願を参照されたい。
有利には、新しいコードシーケンスはオリエンテーションポイントで終わる。これはタイマの再ローディングを可能にし、従って上記表が参照番号「４」について示しているように新しい遅延を付け加えることができる。これは特にタイマの容量を超える非常に長い遅延を得る上で有用である。この場合、あるスタート値に初期化される割込みタイマの管理をコードシーケンス内に設ける。この値はTAB_DER内に書き込まれている値をタイマにプログラムする前に行われるべき最大遅延数を表している。この最後の遅延に続いて、メインプログラムの変更に関するコードシーケンス部分が実行される。
本発明の実施形態が第３図に表されている。第３図において、ROMに書き込まれているアプリケーションプログラムは、本願出願人によるフランス特許出願No.96/05454の原理に従って、ある数のポーリング命令（IIi）と、該命令に続いており、該命令と対応するオリエンテーション命令（IOi）とを分離するコードシーケンスとを含むことができる。
これらのポーリング命令（IIi）は対応するオリエンテーション命令（IORi）がアクティブであるか否か決定することを可能にするとともに、アクティブである場合には、プログラムがオリエンテーション命令に到達すると、オリエンテーション命令（IOi）のための参照番号がｉであるオリエンテーション又は分枝ポイント（ｉ）に向けてプログラムを分枝することを可能にする。
オリエンテーション命令（IORi）の実行は複数の動作を引き起こす。この実行は、まず最初に、EEPROMのゾーン33に書き込まれている分枝テーブルTAB_DERの読み取りを引き起こし、このテーブルのアドレスｉにおいて、タイマの値ΔT1及びジャンプアドレス（Adri）が記入されているかどうか決定する。これらの値が存在している場合には、対応する情報、即ちタイマの値ΔT1及びジャンプアドレスAdriが、例えば、RAM（４）に一時的に記憶される。そして、オリエンテーション命令はタイム６のスタートで終わる。
一旦、オリエンテーション命令が実行されると、アプリケーションプログラムはそのシーケンスの順次実行を続行し、補遺１に記載されている実行可能なコード例に対応するアドレスAdr_1で示される命令の実行に到達し、シーケンスの一連の命令を実行し、アドレスAdr_2によって示される命令に到達する。このアドレスは、通常ROMに記録されているプログラムのシーケンスの命令の後の動作で使用される、対応する値を別の値に変更することに決定したアドレスである。このため、プログラムがアドレス（Adr_2）の命令を実行する前に割込みが発生するように、また割込みがアドレスAdriにおけるコードシーケンスに向けてプログラムを分枝させるようにΔTiが決定される。従って、補遺１のプログラムの示されている例では、次にアドレスAdr_3において行われる乗算で値10を値20に置き換える必要がある。
これは補遺２に記載されているコードシーケンスによって得られる。従って、値10の代わりに値20がアキュムレータＢにロードされることが分かる。これにより、ROMに書き込まれているプログラムを変更しなくとも乗算の結果が変わることになる。
従って、第３図の四角341に示されているようにEEPROMのゾーン34に新しいコードシーケンスを書き込むことにより、またEEPROM（３）のゾーン33に分枝テーブルTAB_DERを書き込むことにより、さらにチップカードのROMに記憶されているオペレーティングプログラムにオリエンテーション命令を設けることにより、遅延ΔTi及びカードのメモリの一つに書き込まれた新しいコードシーケンスが位置する介入アドレスAdriとを選択することによって全ての命令に介入し修正することが可能となる。
補遺１のプログラム部分の先頭は「01」と番号付けされたオリエンテーションポイントの呼出を含む。次に命令が存在する。そして、特定のシーケンスが記述される。最初に、Ｘで示されるバイトの値に値10が掛けられ、２バイトの結果が二つのレジスタに格納され、プログラマブルメモリへの書き込みサブプログラムが実行される。プログラムはROMに固定されているので、変更不可能であるが、値「10」が「20」に変える必要があることは明らかである。どのようにして本発明がこの問題を解決できるか説明する。
CPUはそのときメインプログラム（PP;第３図）の実行を続けている。マイクロプロセッサがadr_2と記されているアドレスの命令の実行をスタートさせる時点で、分枝ポイントにおいて値ΔTiで初期化されたタイマ（６）のデータレジスタは零値に達する。これはアドレスAdriの分岐を可能にする割込み（IT;第３図）を引き起こす。命令「LDB  ＃010d」は従って実行されない。CPUは補遺２に記述されているコードシーケンスが位置するアドレスAdriに向かう。
補遺２に示されているこの小さなコードシーケンスは乗算に使用されるレジスタＢに値「20」をロードすることを可能にするとともに、メインプログラムに、即ち変更されるべき、あるいは実行されるべきでない命令の直後のアドレスadr_3に戻ることを可能にする。このアドレスにおける乗算命令は、ROMコード内の先行の命令に含まれている値「10」ではなく、新しいコードシーケンスに含まれている値「20」を用いる。
本発明の以下の変形形態はセキュリティニーズを考慮している。安全上の理由により、割込みによるプログラム部分の実行を停止し得ることは有利である。例えば、暗号計算や受け取った値と計算された値との比較を伴う認証のケースである。即ち、秘密のキーが作業メモリにある限り、従って分枝シーケンスによって見ることができる限り、割り込みを許可してはならない。これは、「センシブルな」プログラムの実行の間中、全ての割込みを、又は少なくともタイマの割込みを禁止することによって可能になる。
割込みの禁止及び割込みの再活動化は、ほとんど全てのマイクロプロセッサによって解読可能な命令によりそれぞれ行われる。これらの命令は一般にマイクロプロセッサのステータスレジスタのビットを変更する。即ち、このビットがアクティブである限り、割込みの開始は妨げられ、アクティブでない限り、割込みは許可される。センシブルシーケンスの前に、割込み禁止命令がROM内に存在し、再活動化命令がセンシブルシーケンスの後に置かれているならば、センシブルシーケンスは最終的に保護されることになる。
センシブルシーケンスの実行の際に割込みの開始を禁止するための別の方法は、テーブルTAB_DERの利用の際にタイマのプログラミング値を各オリエンテーションポイントについてテストすることである。従って、カウンタのあらゆるプログラミング値を禁止する間隔を規定している一組の値［ΔTmini、ΔTmaxi］を、メインプログラムの各オリエンテーションポイント毎に有する、ロックされたテーブルTAB_SECがROMに、あるいはEEPROMに設けられる。有利には、テーブルTAB_SECは、第4A図に表されているように、同じオリエンテーションポイントについて複数の組［ΔTmini、ΔTmaxi］を有することができる。
ROM内のテーブルTAB_SECの存在は、前述のようにセンシブルシーケンスを固定する。一方、EEPROM内に存在することは、キーによりロックされるまでセンシブルシーケンスゾーンを変更することを可能にする。
オリエンテーションポイント３と５については、二つの時間間隔がプログラムされる。
テーブルTAB_DER内の情報の利用の際に、オペレーティングシステムはオリエンテーションポイントｉに対応している書き込まれるべき値ΔTiが間隔［ΔTmini、ΔTmaxi］に属するかどうかテストする。もし属しているならば、センシブルシーケンスは中断され、オペレーティングシステムは書き込みを禁止し、エラーメッセージを送り返す。もし反対に、このオリエンテーションポイントに対応して、値ΔTiが許可されていない時間間隔内に含まれていないならば、書き込みは問題なく実行され、オリエンテーションポイントは使用可能になる。
セキュリティテーブルTAB_SECが用いられる変形形態では、分枝シーケンスは第4B図に対応している。このシーケンスは、第2B図の諸ステップのほかに、第2B図のステップ2204とステップ2205との間に追加される以下の諸ステップを含んでいる。
−  間隔［ΔTmini、ΔTmaxi］を決定するために、更に例えば遅延タイマの初期化値ΔTiが、この間隔［ΔTmaxi、ΔTmini］内に含まれていないかどうか検査するためにセキュリティテーブルTAB_SECの行ｉを読み取る第一のステップ22041。反対の論理も可能である。もし値ΔTiが含まれていないならば、ステップ2205へ進む。もし値（ΔTi）が含まれているならば、エラーメッセージの表示を可能にするステップ22043Aへ進むか、あるいは間隔をプラスした値（ΔTi）をタイマに再ロードすることを可能にする命令を実行するステップ22043Bへ進む。これは割込みの開始を間隔の長さだけ遅延する。
この変形形態は割込みの開始を可能にするが、保護すべきアプリケーションプログラムのシーケンスに介入することは可能にしない。なぜならば、それらは保護セグメントの一部であるからである。
その他の部分については、分枝シーケンスは第2B図の場合と同じ方法で続けられる。
最後に、アプリケーションプログラム、又は休眠コードの一部は、例えば固定初期アドレスにおけるオリエンテーションによって呼び出され得る書き込みプログラムを含むことができる。これは、該書き込みプログラムへのオリエンテーションを介し、第５図に示されているシーケンスに従った分枝テーブルTAB_DERの書き込みを可能にするためである。
このプログラムはテーブルTAB_DER内の一つ又は複数の要素の書き込み命令を受け取るステップから始まる。要素ΔTi及びAdriは、テーブル内の要素の行ｉに書き込まれなければならない。このステップの次に、テーブルの書き込みフラグECAがアクティブであるか非アクティブであるかを検査するためのテストステップが存在する。ECAがアクティブである場合には、プログラムはステップ61のエラーメッセージへ進む。ECAが非アクティブである場合には、プログラムはセキュリティテーブルTAB_SEC内の対応する値との対比により各要素ΔTiを分析するステップ53へ進む。このステップは値ΔTiが間隔［ΔTmaxi、ΔTmini］内にあるかどうか決定するためにテスト54を含んでいる。肯定の場合には、プログラムは、禁止されているシーケンスに進まないようにするため、割込みを遅延させるべく、間隔の値を表しているΔTiを変更してステップ22043Bへ進む。これと一緒に表されている変形形態はエラーメッセージ22043Aを送ることからなる。
これは、（ΔTi）を値（ΔTi＋ｘ）に置き換えることからなるオペレーションにより、ステップ59に表されている。ここで、ｘは間隔（ΔTmaxi−ΔTmini）である。ΔＴが間隔内に存在しない、あるいは変更された値ΔTiでない場合には、プログラムはステップ55へ進み、ここでテーブルの書き込みフラグECAがアクティブ状態にセットされる。
このステップの後、プログラムは分枝テーブルを更新するとともに書き込みを検査するステップ56へ進む。この検査はステップ57に表されているテストによって行われる。書き込みが適正であることがテストによって確認された場合には、プログラムは書き込まれるべき別の要素があるかどうか調べるステップへ進む。否定の場合には、プログラムはステップ62で終わる。肯定の場合には、プログラムはステップ53に戻る。
検査テストが否定の場合は、プログラムは書き込みフラグを非アクティブ状態にセットするステップ60へ進む。
テーブルTAB_DERによる本発明の変形形態では、いくつかのコード部分を、他の部分の変更を妨げることなしに保護することも可能である。
第三の変形形態は、ROM内のテーブルTAB_SECに、各センシブルシーケンスに関連した開始アドレスと終了アドレスを格納することからなる。アドレス値は容易に決定され、前述の時間を決定するための計算の結果とは異なる。
例えば、
TAB_SEC:ここで、各行はセンシブルシーケンスの開始アドレスと終了アドレスを表している。
0003563412.tif 000003
有利には、アドレスウインドウ［Adrdeb_i、Adrfin_1］は数字の小さいアドレス順に格納される。これはテーブルの読み取りを容易にする。従って、間隔］Adrfin_i、Adrdeb_i＋１［内に位置する値は非センシブルなプログラムのアドレス値である。
センシブルシーケンスの割込みの検査は時間遅延の終了時に行われる。カウンタが零値に達すると、割込みが開始され、PCのカレント値がスタックに格納され、プログラムは、一般的には「割込みベクトル」と呼ばれているROM部分内で規定されているアドレスへ分枝される。プログラムの設計者は、タイマの終了によって発生する割込みに対応しているベクトルの値を、割込みのコードシーケンスの開始のアドレスで初期化するようにしている。前記ルーチンはROM内にあり、従って変更不可能である。これはセキュリティ上の理由によるものである。従って、前記ルーチンは常に実行されることになる。
前記割込みコードシーケンスの開始時に、スタックに記憶されているPCの値Val_PC（即ち、割込みがなかったならばマイクロプロセッサが実行しなければならない命令のアドレス）がセンシブルシーケンスアドレス値でないことが検査される。もしテーブルTAB_SECが存在していないか空であるならば、テストは行われなく、プログラムは新しいコードシーケンスを直接実行する。もしそうでないならば、ルーチンプログラムはスタックから値Val_PCを抽出するとともに、この値がどのアドレス値の間に位置しているかテーブルTAB_SECにおいて探索する。
もし値が［Adrdeb_i、Adrfin_i］タイプのものであるならば、プログラムはセンシブルシーケンスの期間中中断されている。この場合、カードはそのセキュリティが破られており、禁止され得ることを示すメッセージを送り返すことができる。もし値が］Adrfin_i、Adrdeb_i＋１［タイプのものであるならば、プログラムは非センシブルシーケンスの期間中中断されている。この場合、プログラムはオリエンテーションポイントの処理の間に開始アドレスが格納された新しいコードシーケンスを実行する。
その他の変更も本発明の範囲の一部をなしている。
補遺１
下記コードはメインプログラムの一つの実行可能なコード部分である。このコードはMOTOROLA 6805アセンブラで書かれている。
0003563412.tif 000004
補遺２
0003563412.tif 000005
【図１】
0003563412.tif 000006
【図２Ａ】
0003563412.tif 000007
【図２Ｃ】
0003563412.tif 000008
【図２Ｄ】
0003563412.tif 000009
【図４Ａ】
0003563412.tif 000010
【図２Ｂ】
0003563412.tif 000011
【図３】
0003563412.tif 000012
【図４Ｂ】
0003563412.tif 000013
【図５】
0003563412.tif 000014