(57)【特許請求の範囲】
【請求項１】
実行されるべき複数の命令を含むコードを実行するための装置であって、命令を実行するための処理手段と、情報を記憶するための非プログラマブルメモリ手段と、情報を記憶するためのプログラマブルメモリ手段とを含み、
前記コードは、前記非プログラマブルメモリ手段に記憶されており、前記コードの前記命令の間の特定の場所で実行されるコード列に関連する少なくとも一つのコード列基準であって、当該コード列基準から任意の関連するコード列のアドレスを導出することができる、該コード列基準を前記プログラマブルメモリ内に有し、
前記コード列は、実行されるべき命令であって、前記場所において前記処理手段によって前記コードに加えて実行され得る少なくとも一つの命令を含むとともに、前記コード列は、前記非プログラマブルメモリ手段内に又は前記プログラマブルメモリ手段内に記憶されており、
コード列へのアクセスが必要な前記場所のみのコード列基準を隣接して記憶するための専用のゾーンを、前記プログラマブルメモリ手段に規定するための手段と、
前記処理手段が前記コードを実行し、各々の前記場所の前でオリエンテーション命令に出会った場合には、各々の前記場所で、前記ゾーン内の前記コード列基準の示す内容に従って、前記コード列の命令を実行するために、前記コードから前記コード列へのジャンプを実行し、つぎに前記コードの残りの命令を実行するための手段とを含む装置。
【請求項２】
前記コード列に関連付けられ、前記非プログラマブルメモリ手段および前記プログラマブルメモリ手段の内の一つにコード列の場所を規定するアドレスデータ要素が、コード列基準に基づいて計算される請求項１に記載の装置。
【請求項３】
前記ゾーンが、実行されるコード列に関連付けられ、前記非プログラマブルメモリ手段および前記プログラマブルメモリ手段の内の一つに前記実行されるコード列の場所を規定するアドレスデータ要素を含む請求項１に記載の装置。
【請求項４】
処理手段が前記ゾーンを開始アドレスからサーチ方向に読むために、プログラマブルメモリ（11）のうち保護される領域に、前記ゾーンの開始アドレスを規定するデータ要素（AD_TAB）と、前記ゾーンにおけるサーチ方向を規定するデータ要素（SENS）とをさらに含む請求項１に記載の装置。
【請求項５】
前記ゾーンが、次のコード列基準が位置するゾーンのアドレスを示す追加フィールド（AD_TT）を含む請求項１に記載の装置。
【請求項６】
前記ゾーンが、チェックサムの計算手段により提供された結果と比較することで、コード列および／またはそれと関連付けられた何らかの情報の完全性を検証できる追加フィールド（CHK）を含む請求項１に記載の装置。
【請求項７】
複数のジャンプが同一のコード列アドレスに向けられている場合、前記プログラマブルメモリ手段にジャンプの後の戻りアドレスを記憶する手段を更に含むことを特徴とする請求項１に記載の装置。
【請求項８】
実行されるべき複数の命令を含むコードを実行するための装置において、新しいコード列を書込む方法であって、
前記装置は、命令を実行するための処理手段と、情報を記憶するための非プログラマブルメモリ手段および情報を記憶するためのプログラマブルメモリ手段とを含むメモリ手段とを有し、
前記コードは、前記非プログラマブルメモリ手段に記憶されており、前記のコードの前記命令の間の特定の場所で実行されるコード列に関連する少なくとも一つのコード列基準であって、当該コード列基準から任意の関連するコード列のアドレスを導出することができる、該コード列基準を前記プログラマブルメモリ内に有し、
前記コード列は、実行されるべき命令であって、前記場所において前記処理手段によって前記コードに加えて実行され得る少なくとも一つの命令を含むとともに、前記コード列は、前記非プログラマブルメモリ手段および前記プログラマブルメモリ手段の内の一つに記憶されており、
前記装置において前記新しいコード列を書込むための書込み指令を受け取るステップと、
書込み指令において、コード基準を構成する第１のフィールドと前記メモリ手段におけるコード列のアドレスを表現する第２のフィールドの存在を検証するステップと、
所定のフラグが休止中であることを検証するステップと、
第一のフィールドによって供給されるコード列基準がオリエンテーションテーブルに存在しないことを確認するステップと、
前記フラグを使用中へ設定するステップと、
前記オリエンテーションテーブルの更新を含む、新しいコード列に関連した情報を、記憶手段に受け取り書込むステップと、
前記フラグを休止中へ設定するステップと、
書込み前に、前記フラグが使用中であるかまたはコード列基準がオリエンテーションテーブルに存在する場合に、書込み処理を中止するステップとを含む方法。
【請求項９】
前記ゾーンに前記コード列基準が存在する場合には、コード列基準に関連したアドレスデータ要素をワーキングメモリに記憶し、前記ジャンプが実行されるべきであることを示すトラップフラグを設定するための手段と、
トラップフラグが設定されているかどうかをテストし、もし設定されていれば、記憶されたアドレスデータ要素によって示されたアドレスへのジャンプを実行するための手段とをさらに含む請求項１に記載の装置。
【請求項１０】
命令を実行するための処理手段と、情報を記憶するための非プログラマブルメモリ手段と、情報を記憶するためのプログラマブルメモリ手段とを含む装置において、実行されるべき複数の命令を含むコードを記憶するための方法であって、
前記コードの前記命令の間の特定の場所で実行されるコード列に関連する少なくとも一つのコード列基準であって、当該コード列基準から任意の関連するコード列のアドレスを導出することができる該コード列基準を前記プログラマブルメモリ内に挿入するステップであって、
前記コード列は、実行されるべき命令であって、前記場所において前記処理手段によって前記コードに加えて実行され得る少なくとも一つの命令を含むとともに、前記コード列は、前記非プログラマブルメモリ手段および前記プログラマブルメモリ手段の内の一つに記憶されている、該ステップと、
前記非プログラマブルメモリ手段に前記少なくとも一つのコード列基準を含む前記コードを記憶するステップと、
前記コード列基準の少なくとも一つを隣接して記憶するための専用のゾーンを、前記プログラマブルメモリ手段に規定するステップと、
コード列へのアクセスが必要な前記場所のみのコード列基準を前記ゾーンに記憶するステップとを含み、
前記処理手段が、前記コードを実行し、各々の前記場所の前でオリエンテーション命令に出会った場合には、各々の前記場所で、前記ゾーン内の前記コード列基準の示す内容に従って、前記コード列の命令を実行するために、前記コードから前記コード列へのジャンプを実行し、つぎに前記コードの残りの命令を実行する方法。
【発明の詳細な説明】
本発明は、コンピュータプログラム、とりわけマイクロ回路基板に組み込まれたプログラム、さらに一般的に言えば、少なくとも一つの中央処理装置、プログラム読取り専用メモリ、プログラマブル非揮発性メモリ、およびワーキングメモリを含む集積回路を備えた携帯用電子装置に関するものである。前述の非揮発性メモリは、データとコードを格納することができ、また中央処理装置は、このコードを実行することができる。
この電子装置においては、非常に異なる二種類のプログラム、すなわち製造からすでに集積回路に書き込まれた変更不能なプログラムと、必要に応じて電子装置の通常利用中に外部から導入されるプログラムを併存させることが今日まで知られている。
今日、マイクロ回路基板は、技術的に、多くの要求を満たすことができる。しかしながら、「マスク」、言い換えればROMメモリに入っているプログラムを実現することは、まだ非常に高くつき、このような投資は、数千ものプリント板を購入したいと思っている多数の「小規模」クライアントの気力を失わせるものである。その解決法として、現行マスクを利用して、クライアントが求める機能をプログラマブルメモリに付加する方法がある。
追加コードをプログラマブルメモリに入れて実行できるようにすると、新規機能を現行プログラムに容易に付加することができるか、あるいは、このプログラムを特定の要求に合わせられるという利点が与えられる。
フランス特許第2655170号は、コード列を非揮発性メモリに記録できる携帯用電子装置を記載している。このプログラマブル非揮発性メモリは、コード列を入れるために形成された特別の部分を含み、この部分はそれ自体、フラグエリア、コード列データエリア、ブロック検査文字エリアに分けられる。読取り専用メモリのブログラムでテスト命令を実行して、フラグエリアを読み取ってテストし、また好ましい場合にはジャンプを行う。従って、各ジャンプには、一つのテスト命令と、プログラマブルメモリに割り当てられた一つの記憶域が対応する必要がある。
さらに、フランス特許出願第2667417号により、プログラマブルメモリに複数のプログラムを入れるように設計されたマイクロプロセッサボードも知られており、このボードでは、いわゆるフィルタ命令をプログラマブルメモリの予約記憶位置のそれぞれに関連付けて、当該ボードの読取り専用メモリに記憶させたフィルタ命令の実行により、アクセス可能な命令サブルーチンのコードのアドレスを記憶する手段を構成している。各フィルタ命令は、プログラマブルメモリにおいて、関連コードのアドレスが入っている記憶域のアドレスを知らなければならず、一回限り固定したアクセス階層がぜひ必要となる。
上で言及した二つの解決法は、以下のような不都合がある。
いくつかのジャンプ命令を実行したいと思う当業者は、読取り専用メモリのプログラムやプログラマブルメモリの指定領域へのジャンプ命令を増やさなければならない。この種の多数の命令を主プログラムに導入しなければならない場合には、これらの命令が読取り専用メモリで占有する総スペースが、プログラムの総スペースを犠牲にして大きくなる。その上、プログラマブル非揮発性メモリでは、たとえサブルーチンが記録されてなくても、そのスペースは、フラグのスペースと同様に確保され、従って、無視できないスペースが不必要に占有される。結局、いったん書き込まれると、当該サブルーチンは、もう変更することはできない。要するに、この解決法は、非常に限られた数のジャンプ命令や、いくつかのサブルーチンに適しており、いかなる場合にも、ジャンプとサブルーチンの数が多いという問題が解決されていない。
本発明は、とりわけサブルーチンへの呼出し回数をさらに多くさせることで、言及された特許の不都合もなく、チップカードの機能を向上させることができる方法および装置を対象としている。というのも、本発明による装置を用いれば、プログラムでの利用が容易となるか、ほとんどコードメモリを使用しないか、利用するメモリサイズが最小限に抑えられ、あるいは、ダイナミックであらゆる種類の変更ができ、あるいは、実行時間ガ最適化されるという利点が与えられるからである。
そうするために、回路基板内のコード列実行装置は、コード列を実行できる集積回路と、一方では、主プログラムと場合によっては当該集積回路で実行できるその他のコード列が入っている第一のメモリと、また他方では、場合によっては当該集積回路で実行されるコード列が入っている第二のプログラマブル非揮発性メモリと、第三のワーキングメモリとを備えており、第二のメモリに入っているオリエンテーションテーブルが、コード基準データのあるフィールドを少なくとも一つ含み、
第一の手段（INS_INT）により、
−  コード基準の有無を検証でき、
−  コード基準に関連付けられたアドレスデータをワーキングメモリに記憶させて、トラップフラグDIを位置決めすることができ、
第二の手段（INT_ORT）により、
−  トラップフラグDIをテストすることができ、
−  このワーキングメモリの内容でポイントされたアドレスにジャンプを行うことができることを特徴とする。
別の特徴によれば、コード基準に関連付けられた、三つのメモリの一つに入っているコード列のアドレスデータが、そのコード基準から計算される。
別の特徴によれば、第二のフィールドは、三つのメモリの一つに入っているコード列のアドレスデータを含む。
別の特徴によれば、この装置は、プログラマブルメモリのうち場合によっては保護される領域に、第一のアドレスと、場合によっては第一の検証手段用のサーチ方向とを規定する情報を含む。
別の特徴によれば、このオリエンテーションテーブルは、テーブル中の次のコード基準に対応する情報がある次のアドレスを示す追加フィールドを含む。
別の特徴によれば、このオリエンテーションテーブルは、チェックサムの計算手段により提供された結果と比較することで、前のフィールドおよび／または関連付けられたコード列の完全性を確認できる追加フィールドを含む。
別の特徴によれば、第二の手段は、同一の列アドレスに向けてジャンプを実行する目的で第二の手段がいくつか自由に使用できる時、ジャンプ後に、戻りアドレスをワーキングメモリに記憶する手段を含む。
別の特徴によれば、この装置は、追加コードを記録させないようにする手段CAIと、チップカードの再生を妨げる手段RCIを含む。
別の目的は、新規機能の記録方法を提案することにある。
この目的は、前記請求の範囲の一つに記載の装置で新規コードを記録する方法が、
−  記録コマンドを受け取るステップと、
−  コード基準Ａ、Ｂ、C...を構成する第一のフィールドと、当該コード基準に関連付けられたアドレスを示す第二のフィールドAD_Cod_A、AD_Cod_B、AD_Cod_C、...の有無を検証するステップと、
−  オリエンテーションテーブルのアドレスAD_TABを構成する第一のアドレスの値が一貫していることを確かめるステップと、
−  フラグECAが使用中でないことを確かめるステップと、
−  第一のフィールドで提供されるコード基準がテーブルにないことをチェックするステップと、
−  使用中の状態で、プログラマブルメモリのうちの保護される領域にフラグECAをセットするステップと、
−  新規コードに対応する情報を受け取って書き込むステップと、
−  この動作が正確に行われたことを確かめ、オリエンテーションテーブルを更新するステップと、
−  休止中の状態で、フラグECAをセットするステップとを含むことを特徴とすることによって達成される。
別の特徴によれば、オリエンテーションテーブルの更新操作は、書き込まれたコードの前にくるコードのオリエンテーションワードに対応するアドレスに、オリエンテーションテーブル内の次のアドレスのフィールドを書き込むことを含む。
本発明のその他の特徴と利点は、下記の図を用いて例示する装置および方法の実施例に関する下記の説明を読めば、さらに明確となろう。この添付図面において、
−  第１図は、オリエンテーションテーブルの管理法の変形例を利用したチップカードのプログラマブルメモリのパーティションを示す。
−  第２図は、チップカードの読取り専用メモリのパーティションの一例を示す。
−  第３図は、主プログラムの期間中に実行される問合せ命令シーケンスの例と、その後で、オリエンテーション命令シーケンスの例を、主プログラム中に示す。
−  第４図は、問合せ命令とオリエンテーション命令について考えられるシーケンス例を示す。
−  第５図は、問合せ命令を構成するコード列の展開アルゴリズム例を示す。
−  第６図は、オリエンテーションテーブルとコード列エリアを組み入れたプログラマブルメモリのパーティションの構成例を示す。
−  第７図は、オリエンテーションテーブルとコード列エリアを組み入れたメモリのパーティションの第二の実施例を示す。
−  第８図は、オリエンテーション命令を構成するコード列の展開フローチャート例を示す。
−  第９図は、ある系列の書込み命令の構成フィールドの一例を示す。
−  第10図は、書込み命令で開始する記録列の展開フローチャートを示す。
−  第11図は、本発明の装置および方法の実施に必要なマイクロ回路基板の構成要素を示す。
本発明は、第11図によるマイクロプロセッサボードで下記の適用例を説明すれば、さらに良く理解されよう。
マイクロプロセッサボードは、命令列を実行できるマイクロプロセッサ型または集積回路式の中央処理装置（10）、RAMワーキングメモリ（14）、主プログラムが入っているROM非揮発性メモリ（12）、データが入っていてCPUで実行でき、かつ、プログラム可能なEPROMか、EEPROMか、または、FRAMの非揮発性メモリ（11）、および、接触があるか、または接触のないリンク（15）で読取り装置と対話できる入出力装置（13）を有する。このプログラムは、構成部品の製造時にROMに焼き付けており、従って、その内容を後で変更できない。
プログラマブルメモリ（11）は、第１図に示される通り、いくつかの部分に分けられる。システムエリアと記された第一の部分（110）は、当該メモリのその他の部分に入っている情報またはデータグループの妥当性（真実性および／または完全性）と位置決定を検査できるシステム情報であって、外部からは読み取れないもの（ポインタなど）を含む。データエリアと記された第二の部分（111）は、外部からアクセスでき、ユーザデータの格納に使用される。オリエンテーションテーブルと記された第三の部分（112）は、オリエンテーションテーブルが入っており、このテーブルは同一の要素で形成され、各要素はいくつかのフィールドを含み、それらのフィールドのうち二つの主要フィールド、すなわち、第一のフィールドは「Ａ」、「Ｂ」などのコード基準データであり、また第二のフィールドは、「AD_Cod_A」、「AD_CoD_B」などのように当該メモリの第四の部分（113）に記憶させた対応するコード列の開始アドレスである。コード列エリアと記された第四のエリアは、主プログラムで呼び出されるコード列を含む。本発明の変形例では、オリエンテーションテーブルまたはコード列をEEPROMの代わりにワーキングメモリ（RAM）にロードできることに注目すべきである。
AD_TABと呼ばれるオリエンテーションテーブルの開始アドレスはシステムエリアに記憶され、またSENSと記された第二の情報は、上昇するアドレスの方向であれ、下降するアドレスの方向であれ、ポインタがこのテーブルを読み取る方向を決定する。従って、AD_TABとSENSの値のアドレスは、ROMのプログラムが知っている本発明に関するデータでしかない。さらに、バイトで表したサイズ、あるいは、オリエンテーションテーブルの最大の要素数（Ta、Ta）を記憶させると役立つ場合もある。
ここに、本発明に従ったトラップ法のメリットを例証した一例がある。主プログラムは、情報の暗号化／解読、または、いくつかの認証機能を実行できるD.E.S.（Data Encryption standard,データ暗号化規格）のようなアルゴリズムを含むことができる。このアルゴリズムを別のアルゴリズムと取り替えるか、あるいは、そのインプリメンテ−ションを完全に変更して、例えば、もっと高速なものに移行することは興味深いと言える。このアルゴリズムのコードは、オペレーティングシステムのROMメモリの中にブロックを構成しており、このコードは変更できず、さらに主プログラムの様々な場所から呼び出すことができる。
この例は、第２図を見れば、さらによくわかる。とりわけ主プログラムを含むROMメモリは、三つの部分に分けられる。第一の部分は、通電後のチップカードの初期設定、すなわちワーキングメモリのテスト、チップカードの状態の読取り、RESETに対する応答のバイトの送出を行う。第二の部分は、端末で要求される様々なコマンド実行するアプリケーションプログラムを含む（第一のコード部分は、つねに第二のコード部分の前に実行される）。第一部と第二部は主プログラムを含む。第三の部分は、後で説明する役割を果たす「アイドル」コードを含む。
動作を変更したいと思うALGO_1と呼ばれるアルゴリズムは、アプリケーション部分に入っている。この例では、当該アルゴリズムは、コードの五つの異なる場所から呼び出される。この新規アルゴリズムは、プログラマブルメモリ内のコード列エリアにあらかじめロードされており、オリエンテーションテーブルが更新されており、そのコード列の実行アドレスは、AD_Cod_Aである。
通電時に、主プログラムは初期設定部を実行し、この部分には「APPEL_0」と記されるALGO_1への第一のジャンプが認められ、また、いかなるトラップも予定されず、従って、このジャンプは、いかなるトラップ命令でも左右されない。そこには、問合せ命令列、すなわち、アプリケーション部のプログラムの実行前に少なくとも一度、必ず実行するようにプログラマが初期設定部に入念に実現したINS_INT_Aも認められる。この例では、この問合せ命令列に関連付けられたコード基準は「Ａ」であり、これは主プログラムに書き込まれている。初めのうちは、この問合せ命令は、システムエリア内でオリエンテーションテーブルのアドレスAD_TABを探す。次に、このアドレスから、「SENS」の値に従って上昇するアドレスの方向か、あるいは、下降するアドレスの方向に、当該テーブルの各要素を読み取る。コード基準に対応する第一のフィールドの値と、「Ａ」の値とを比較する。「Ａ」の値がオリエンテーションテーブルの第一のフィールドにある場合、対応する第二のフィールドの値（AD_Cod_A）を読み取ってワーキングメモリ（RAM）のレジスタAD_SAUTに格納し、ワーキングメモリのトラップフラグ（DI）を使用中（active）の位置に設定する。
DIが使用中でない時には、サブルーチンALGO_1が、主プログラム内のAPPEL_0、APPEL_1、...APPEL_4で五回、呼び出される。APPEL_1、APPEL_2、APPEL_3では、読取り専用メモリか、それとも、プログラマブルメモリにある別のプログラムALGO_2に向けてのトラップは、トラップフラグDIが使用中である時に実行される。なぜなら、ALGO_1への実効のある各ジャンプAPPEL_1、APPEL_2、APPEL_3の前に、プログラマが主プログラムのコードにおいてINS_ORT_1、INS_ORT_2、INS_ORT_3のオリエンテーション命令を実行するように心がけたからである。第３図に示されるように、このオリエンテーション命令は、まず最初にトラップフラグDIが使用中であるか否か、テストすることからなる。このフラグが休止中（inactive）であれば、主プログラムは、通常の経過をたどり、例えばALGO_1向けのジャンプAPPEL_1を実行することで、ROMのアルゴリズムを実行する。トラップフラグDIが使用中であれば、オリエンテーション命令は、レジスタAD_SAUTの内容で示されるアドレスに当該プログラムをトラップする。あらかじめレジスタAD_SAUTに格納されたAD_Cod_Aの値を、中央処理装置の記憶位置カウンタにロードし、ロードしたアドレスのコード列を実行する。それに反して、サブルーチンALGO_1は、プログラマの意向により、トラップの可能性もなくAPPEL_4で呼び出される。というのは、いかなるオリエンテーション命令も、そのサブルーチンには関連付けられてないからである。
問合せ命令とオリエンテーションの命令の表現は、事実上、中央処理装置で実行できる一連の基本命令で構成されたマクロ命令であることに注目すべきである。
同一のオリエンテーション命令は、当該フラグが使用中である限り無限の回数、実行することができ、そのジャンプは、AD_SAUTに記憶されたアドレスに向けて絶えず行う。同様に、第２図に示されるように、同一の基準コード「Ａ」とともに、いくつかのオリエンテーション命令「INS_ORT_1」、「INS_ORT_2」、「INS_ORT_3」は主プログラムにおいて実行することができ、それらの実行から同一の効果がもたらされる。このような場合、主プログラムへの戻りアドレスをきわめて細心の注意を払って検討することが必要であり、戻り命令の実施例は、本書の続きで説明する。
一般に、プログラマは、少なくとも一つの問合せ命令列をすべてのオリエンテーション命令の前に実行するように心がけなければならない。ただ一回だけコード列を展開しなければならない場合には、トラップフラグDIを休止中にすることを目的とするトラップフラグDIの消去命令を、当該コード列で実行する。従って、主プログラムに戻ってしまうと、次のオリエンテーション命令の際には、いかなるトラップも、もはや行われない。
この列に照らせば、問合せ命令列とオリエンテーション命令列を切り離す第一の利点が明らかになる。問合せ命令列は、オリエンテーション命令列よりもさらに入念に仕上げられ、それゆえ、コードの面でさらに費用がかかるために、一度しかプログラムには入れない。非常に短くて、メモリのスペースの面でほとんど費用のかからないオリエンテーション命令列は、必要であるたびにセットされ、それゆえ、プログラムメモリのスペースが節約される。
トラップフラグDIを使用することの代わりに、レジスタAD_SAUTに特定の値を記憶させることによって同様の効果が得られる。レジスタAD_SAUTに、所定構成要素用の非揮発性メモリの有効アドレス値ではない「NULL」値が入っている場合には、これは、主プログラムのいかなるトラップも考慮に入れるべきではないということである。同様に、メモリの内容AD_TABが、オリエンテーションテーブルの開始値と一貫しない値（例えば「NULL」）である場合には、いかなる系列も自由に使えず、従って、いかなるトラップも考慮に入れないと考えることができる。
第４図に示されるように、いくつかの問合せ命令（INS_INT_A、INS_INT_B）を主プログラムに入れることができる。これらの命令はそれぞれ、プログラマブルメモリに書き込んだそれ自体の基準コードを有し、またプログラマブルメモリに入っているオリエンテーションテーブルの最初の値の中に、このコードがあるかどうかサーチする。このコードの値が確かにテーブルにある場合には、関連するコード列のアドレスを、ワーキングレジスタAD_SAUTに入れる。従って、問合せ命令を実行することで、前回の問合せ命令で更新されたレジスタAD_SAUTの値が消去されて、取り替えられる。
前回の問合せ命令が、トラップアドレスを用いてレジスタAD_SAUTを更新した場合、また、オリエンテーションテーブルに、その基準コードが見つからないことにより、別の基準コードを用いて第二の問合せ命令を実行する場合には、AD_SAUTの前回の値を消去し、従って、次回の問合せ命令まで、すべてのトラップを無効にすることで十分であり、かつ、妥当である。しかしながら、このように当該トラップを持ち続けることで、前回の値を残しておいても、本発明の精神から逸脱することはない。
そこで、オリエンテーションテーブルに書き込まれた「Ａ」、「Ｂ」などのコード基準を利用する第二の利点が明らかになる。すなわち、このテーブルは、有効なデータしか入ってなく、主プログラムでは、所望の実効トラップしか参照しない。従って、絶えずそのサイズが最適化され、それゆえ、メモリの占有が節約される。
都合のよいことには、主プログラムでは呼び出されないコード列を、主プログラムに格納することが可能である。本発明に従ったメカニズムを用いれば、これらの系列のそれぞれに、当該系列の開始アドレスでオリエンテーションテーブルに記憶されたコード基準を関連付けることは可能である。従って、携帯用電子装置のプログラマブルメモリで「アイドル」コードを起動できる。
さらに都合のよいことには、オリエンテーション命令は、同一のコード列に入力点をいくつか定め、それらの入力点を異なる基準コードに関連付けることができる。同様に、いくつかの系列、例えば「Ａ」、「Ｂ」、「Ｃ」は、一つの系列にまとめることができ、まとめた系列は、基準コード「Ａ」と入力点AD_Cod_Aとともにプログラマブルメモリに一度に書き込まれ、また、他の二つの基準コードと入力点は後で書き込まれる。このような操作ができるオリエンテーションテーブルの一例は、後で（第７図）述べられる。
今度は第５図を用いて問合せ命令の展開を説明する。この命令の入力パラメータは、次回のオリエンテーション命令の際に実行されるコード列に対応する基準コードの「Ｘ」と記された値であり、この例では、その値は「Ｘ」である。段階１では、主プログラムは、問合せ命令列を実行することにより、システムエリアにおいて、ROMのプログラムで知らされるアドレス＠で、オリエンテーションテーブルの開始アドレスである内容AD_TABを読み取る。段階２では、問合せ命令列が、読み取ったワードをテストする。読み取ったワードが有効でなければ、オリエンテーションテーブルは存在せず、いかなるコード展開も見込めない。問合せ命令列は終了し、トラップフラグDIは休止中である（段階10）。読み取ったワードが有効であれば、段階３で問合せ命令列は、例えばワーキングメモリにあるAD_SAUTのようなポインタを、読み取った値AD_TABを用いて更新する。次に、段階４では、この問合せ命令列は、テーブルのうち、このポインタでポイントされた要素を読み取る。問合せ命令列の段階５では、このコード基準に対応するフィールドの値と、入力パラメータとして提供された基準コードの値「Ｘ」を比較する。この二つの値が同じであれば、段階８で問合せ命令列は、トラップフラグDIを使用中の状態に位置決めする。段階９で問合せ命令列は、ポインタを用いて、オリエンテーションテーブル内の基準コードのすぐ後にあるアドレス値「AD_Cod_X」を読み取る。この値は、RAMワーキングメモリのレジスタAD_SAUTに格納する。この二つのコード基準値が同じでなければ、段階６でポインタを更新して、オリエンテーションテーブル内で次の基準コードをポイントする。このような更新は、テーブルの各要素のサイズを考慮に入れて行われ、例えば、テーブルが32ビットのワードで構成されている場合には、バイト（８ビット）をアドレス指定するポインタの値を４だけ増やす。段階７で問合せ命令列は、プログラマブルメモリのうちポインタがアドレス指定したワードが、なおもオリエンテーションテーブルにあるかどうかテストする。このテストはテーブルの編成によって決まり、後で、その例がいくつか示される。ポイントされたワードが、もはやテーブルには属さない場合には、問合せ命令列は終了し、段階10で、トラップフラグDIを休止中の状態に位置決めする。ポイントされたワードが、まだオリエンテーションテーブルにある場合には、問合せ命令列は、段階４に戻る。
問合せ命令列の出口には、いつもトラップフラグDIを位置づけ、当該フラグが使用中である場合には、AD_SAUT内の値は有効である。都合のよいことには、問合せ命令列は、主プログラムを作成したプログラマが、一方では入力パラメータとしてテーブルで探す基準コード（例えばＸ）と場合によっては戻りアドレスを付けて、また他方では出力パラメータとして、実際にトラップを実行する必要があるかどうかを指定するトラップフラグDIを付けて、サブルーチンのように書き込むことができる。オリエンテーションテーブルの読取りを行って、現行基準コードに対応するすべてのアドレスをワーキングメモリに格納することは初期設定の時に可能であり、このことは、各問合わせ命令が、そのテーブルを徹底的に走査して存在しないコードを不必要に探すことのないようにしている。
第６図は、オリエンテーションテーブルの一例を示す。このテーブルは例えば32ビットのオリエンテーションワードで構成され、例えば一バイトの第一のフィールドには基準コードが入っており、また例えば次の二バイトの第二のフィールドには非揮発性メモリのコード列の開始アドレスが入っており、また例えば一バイトの最後のフィールドはオプションであって、当該フィールドには、最初の二つのフィールドおよび／または関連付けられたコード列の値の完全性を検査できるチェックサムコード（CheckSum）：（SHK_A）が入れられる。このオリエンテーションテーブルでは、それらの要素は、隣接するように並んでいる。次のワードが未使用である時に、このテーブルは終わる。システムエリアで読み取られるSENSの値は、テーブルポインタが進む方向を、上昇するアドレスか、あるいは、下降するアドレスで示す。第６図では、上昇するアドレスの方向が選ばれている。
このテーブルが多くの要素を含む時、このテーブルの配置は興味深い。というのも、これらの要素の基準コードが、ある順序に従って分類され、従って、テーブル内でのこれらの要素の編成は、上昇する基準、すなわち「Ａ」、「Ｂ」、「Ｃ」、「Ｄ」、「Ｅ」...、あるいは、下降する基準、すなわち「Ｚ」、「Ｙ」、「Ｘ」、「Ｗ」...に従って行えるからである。バイトで表したテーブルサイズを決める。このサイズは、システムエリアのある領域（第１図のTaTa）に記憶されるか、あるいは、初期設定の時にテーブルの事前読取りで得られる。ある基準コードをサーチする時には、ソートアルゴリズムを用いることが可能であり、例えば、ポインタは、AD_TABに入っている値に、あらかじめ決められたテーブルのバイト数の半分を加えることにより、テーブルの半ばにある要素のアドレスを用いて初期設定し、次に、ポインタで読み取られた基準コードと、サーチすべき基準コードとを比較し、その結果に応じて、ポインタが前方か、または後方に移動し、こうして、まだ走査する必要のある領域の真ん中をポイントする。このようなメカニズムから、テーブルでコード基準をサーチする時間を節約することができる。従って、テーブルが、分類されたｎ個の要素を有する場合には、ある要素から次の要素に移る標準的なサーチ方法の結果、正しいものを見つけるために読取りが、平均してn/2の要素となり、その利点が見いだせる。前に示されたようなサーチでは、（log  ｎ）要素を読み取りながらサーチでき、これは、ｎの値が大きい時に有利である。
テーブル全体を走査した後で、テーブルで読み取られた値がどれも、サーチされた基準「Ａ」を有さない場合には、コード列「Ａ」に向けての主プログラムのトラップはまったく行われず、このような場合、ワーキングメモリのトラップフラグDIは、休止中の位置に設定される。
このような配置のために、プログラマは、コード列の最初の書込みからすぐにオリエンテーションテーブルのサイズをあらかじめ定めて、このテーブルを完成し、かつ、場合によってはその他のコード列を書き込むだけの記憶空間をAD_TABの値の後に十分に残すようにしなければならない。
オリエンテーションテーブルの変形実施例は、単にコード基準を含むことができ、このような場合、問合せ命令プログラムは、入力パラメータとしてコード基準を有するアルゴリズムを用いることで、ジャンプアドレスを計算する。
第７図は、オリエンテーションテーブルの別の例を示し、この例を用いると、プログラマは、サイズに対応する情報をTaTaにあらかじめ記憶させておくか、あるいは、テーブルの事前読取りを行ってサイズを決めるようなことがなくなる。このテーブルには、前の三つのフィールド、すなわちコードの基準値、コード列の開始アドレス、チェックサム（Check−Sum）よりも一フィールド多いオリエンテーションワードが入っている。この追加フィールドは、例えば四番目と五番目のバイトを占有するもので、オリエンテーションテーブル内に、次の要素のアドレス値を含む。このテーブルは、以下のように読み取れる。すなわち、最初のコード列に対応するオリエンテーションワードはAD_TABのアドレスにあって、基準コードは「Ａ」であり、かつ、その系列はAD_Cod_Aのアドレスから始まり、そして、次のオリエンテーションワードはAD_TT2のアドレスにある。このAD_TT2のアドレスには、第二のコード列に対応するワードがあり、このコード列は、基準コードとして「Ｂ」を有し、しかも、AD_Cod_Bのアドレスから始まる。次のワードはAD_TT3のアドレスにあり、以下同様である。次のオリエンテーションワードのアドレス値が例えば「NULL」である時に、このテーブルは終わる。この例では、「Ｃ」と「Ｄ」の基準コード列は同一のブロックに属することに注目すべきである。このブロックは、事実上、AD_Cod_CとAD_Cod_Dの二つの入力点を有する。
一つ、または複数のコード列、あるいは、コード列の一部が、プログラマブルのメモリのデータエリアに書き込むことができることは言うまでもない。このような場合、主プログラムのアプリケーション部分により、また場合によっては外部での読取りを禁止する安全配慮により、それ自体知られており、かつ、適切に範囲を定めた領域に入ることが推奨される。
今度は、第８図を用いてオリエンテーション命令列の展開を説明する。段階11では、オリエンテーション命令列は、トラップフラグDIをテストする。そのフラグが休止中であれば、主プログラムは逐次に続行する。トラップフラグDIが使用中であれば、この命令列は、段階12に進んで、主プログラムへの戻りアドレスを記憶させる。この記憶動作はオプションである。なぜなら、主プログラムか、あるいは、他の場所への戻りアドレスを決めるものは、ともかく当該命令列であるからである。いくつかのオリエンテーション命令列が同一のコード列を呼び出すことができる場合には、各オリエンテーション命令列に固有の戻りアドレスを記憶させて、トラップを発生させた命令の近くに戻すことができるようにしているのは興味深い。この記憶動作は、AD_RETのワーキングレジスタか、または、スタックで行われ、後者の場合には、プログラマブルメモリに記憶されたコード列は、例えば「サブルーチンの戻り」（「RTS」）固有のコードで終わるサブルーチンと見なされる。次に、段階13では、オリエンテーション命令列は、当該コード列へのジャンプで終わり、このコード列は、前回の問合せ命令列によりAD_SAUTのワーキングメモリのレジスタに記憶されたアドレスから始まる。
今度は、新規コード列の書込みとオリエンテーションテーブルの更新を説明する。
コード列記録コマンドECR_SEQ_Eは、入出力装置（13）により外部からチップカードに送られる。このコマンドのデータは、第９図に示されるように、いくつかのフィールドに分解される。コマンドECR_SEQ_Eには、以下のものが含まれる。
−  第一のフィールドに、「Ａ」、「Ｂ」、...の基準コード。
−  第二のフィールドに、当該コード列の開始アドレス。
−  第三の任意フィールドに、当該コード列のサイズ、言い換えれば書き込むバイト数。
−  第四の任意フィールドに、当該コード列、言い換えれば書き込まれるバイト。
第三と第四のフィールドは、当該コード列をすでに非揮発性メモリ（FRAMか、EPROMか、EEPROMか、または、ROM）に書き込んでいる時には、無用である。
第10図は、新規系列Ｅの記録命令ECR_SEQ_Eの実行プログラムPENRの展開を説明したフローチャートを示している。段階21では、このコマンドはチップカードに送られ、当該コマンドの最初の二つのフィールドを解析する。チップカードに送られたこの種の命令がそのチップカードで認められると、記録管理プログラムは、AD_TAB内の値が一貫しているかどうか検証できる。もし一貫してなければ、オリエンテーションテーブルは使用できず、従って、新規コード列を書き込むことができず、そのコマンドは中断される。
段階211では、フラグECAが休止中であれば、当該プログラムは、次の段階に進み、そうでなければプログラムの実行は中断される。
段階22では、当該記録プログラムは、同一のコード基準がすでに書き込まれているかどうかチェックする。もし、受け取ったものと同一のコード基準がすでに、テーブルに入っている場合には、このコマンドを中断する。本発明に特有のこのチェックは、前に説明された従来技術と比較して、著しい利点がある。なぜなら、二つのコード列を誤って、同一の基準を用いて書き込めないようにしているからである。段階23では、記録管理プログラムにより、非揮発性メモリのフラグが使用中となる。すなわち、ECA_en_cours（追加コードの書込み進行中）は、新規系列の記録が進行中であることを示す。次に、段階24では、書き込むコードのバイト数をPENRのプログラムがテストする。このバイト数がゼロである場合には、新規のコード列はまったく書き込むべきではないが、テーブルには、新規のコード基準をただ一つ付け加えなければならない。これは、ROMの「アイドル」コードの起動の場合か、あるいは、プログラマブルメモリにすでに書き込まれたコード列に対する入力点の付加である。
書き込むコードのバイト数がゼロでなければ、段階25でチップカードを受取りモードにする。これらのバイトは受け取られて、場合によっては解読および／またはサインされ（もしそれが選択されたモードである場合）、次に、コマンドECR_SEQ_Eの第二のフィールドに定めた当該系列の開始アドレスの「直後に」書き込まれる。あらゆる場合に、書込みアドレスは、未使用でなければならない。もしそうでなければ、フラグECA_en_coursを使用中にしておいたままで、そのコマンドは中断され、その結果、後で説明される再生メカニズムを除き、チップカードが最終的に停止する。コードのすべてのバイトが受け取られ、かつ、該当する系列が書き込まれると、段階（26）で、プログラム（PENR）は、その書込みが正確に展開されたかどうか検証する。そのための手段は、書き込まれたバイトと、そのアドレスの値から、チェックサム（CheckSum）の計算またはサインを入念に準備することにある。段階27では、プログラム（PENR）は、記録されたコードの妥当性をテストする。この書込みが適切に展開されなかった場合には、フラグECA_en_coursを使用中にしておいたままで、そのコマンドは中断される。
この書込みが適切に展開された場合、あるいは、書き込むコード列がない場合には、プログラムPENRは、段階28で、新規オリエンテーションワードを書き込んでオリエンテーションテーブルを更新する。第６図で説明されたテーブルの概要では、新規のオリエンテーションワードは、最終ワードの直後に書き込まれる。プログラムPENRは、SENSに示される方向に従って進むことにより、AD_TABのアドレスからテーブルをスキャンして、最終要素を決定する。オリエンテーションワードの第三のフィールドに書き込まれたチェックサム（CheckSum）は、外部から、区別せずに送られるか、あるいは、チップカードで計算される。このチェックサム（CheckSum）は、バイトの単純合計または排他的論理和（XOR）の型式であるか、あるいは、暗号型式であって、テーブルの当該ワードを対象とするか、あるいは、このワードに関連付けられたコード列を含む。第７図で説明されるテーブルの概要では、新規ワードは、テーブルのオリエンテーションワードと系列のエリアの未使用位置に書き込まれる。プログラムPENRはまた、テーブルの最後のワードの前の第三のフィールドを変更して、当該フィールドに、この新規コード列「Ｅ」のAD_Cod_Eのアドレスを入れるようにしなければならない。
以上の操作がすべて適切に展開された時には、プログラムPENRの段階29でフラグECA_en_coursを休止中にし、その主な結果として、オリエンテーションテーブルとそれらの系列の妥当性が確認される。このコマンドが正しく展開されなかった場合には、プログラムPENRによりエラーメッセージが外部に送られることで、エラーの種類の情報をユーザに与える。
AD_TABの内容と、場合によってはSENSの内容を書き込むための特別なケースを伝える必要がある。というのも、前の説明は、すでに始まったオリエンテーションテーブルに対してのみ通用するからである。AD_TABにはオリエンテーションテーブルの開始アドレスが入っていることと、オリエンテーションテーブルが第６図で説明される通りに編成される場合には、SENSのフィールドが、このテーブルのスキャン方向を示すことを思い起こす。
第９図で説明されるデータのフォーマットを利用すれば、AD_TABの内容と、場合によってはSENSの内容を書き込むための特別なコード基準を提供できる。いつも第９図を参照しても、このような特別な基準では、当該系列のコードを含むフィールドAD_Cod_Aが、AD_TABと場合によってはSENSに入れる内容を含むのに、そのフィールドは有効とはならない。
どのようなデータ（コード列、オリエンテーションテーブルの要素など）の書込みにも通用する別のやり方は、以下のフォーマットを利用することにある。
「書込み開始アドレス  バイト数  データ」
この方法は、追加コードの設計者の責任のもとに、どんなデータでも書き込めるというきわめて重要な利点がある。
オペレーティングシステム、あるいは、追加コード利用のようなオペレーティングシステムの特徴のいくつかを識別するためには、チップカードを通電させた時に、チップカードに識別バイトを送らせることで十分である。通電は、チップカードと対話できるまでの必要不可欠な操作である。内部では、オペレーティングシステムは、オリエンテーションテーブルのポインタAD_SAUTとテーブル自体を解析することにより、リセットに対する対応を構築することができる。
チップカードの外部から送られるコード列の無効化命令INS_INA_Cは、その処理プログラム（PINA）により、ある基準コード、例えばＣに対応するトラップを休止させることを目的としている。第一のやり方は、このコードに関するあらゆるデータ、すなわちオリエンテーションテーブル内の要素や、該当するすべての系列を消去することにある。次に、オリエンテーションテーブルを更新する。第二のやり方は、さらに高速なものであって、別の値、例えば「NULL」で無効にするコード列に対応する基準コードを、オリエンテーションテーブル内で変更することにあり、このコードはもはや存在しないから、いかなる問合せ命令も、このコード列を実行する目的で、ワーキングメモリAD_SAUTを更新できなくなる。要するに、後者のやり方は、オリエンテーションテーブルのアドレス値を、不可能なアドレス値、例えば「NULL」に替えるか、あるいはまた、「制御を戻す」単純なコード列に呼出しを向けることにある。この後者のやり方は、ROMに書き込まれたコード列にぴったり合い、従って、この「アイドル」コードは、非常に容易に、起動と休止を行うことができる。
チップカードの外部から発生する再生書込みINS_REGは、その処理プログラムPREGにより、一つ、または複数のコード列、および／または、テーブルの要素すなわち一般には一連のデータを消去することを目的としている。以下のいくつかの方法が可能である。すなわち、メモリ空間の開始アドレスと終了アドレスをチップカードに送り、このメモリ空間のすべてのバイトを消去する。この方法は、やや「手荒」であるため、消去してはならない系列が十分に活かせるように、慎重に利用しなければならない。別の方法は、消去する基準コードと、もしあれば対応するプログラマブルメモリのコード列をチップカードに明示することにあり、このようなコマンドの後で、当該プログラムは、該当するテーブルの要素のアドレス決定し、次に、これらの要素を消去し、さらにコード列の開始アドレスと終了アドレスを決定して、最後にその内容を消去する。これらのアドレスをサーチしてからテーブルを更新する方法は、オリエンテーションテーブルの構造によるところが大きい（第６図と第７図を参照のこと）。この方法は、当業者には問題はなく、従って、説明するには及ばない。
テーブルとコード列を容易に更新できる最後のコマンドREC_ESP_VRGは、「未使用空間のサーチ」である。このコマンドを、特定のデータ無しにチップカードに送れば、このコマンドの処理プログラムPREVは、プログラマブルメモリ（11）の未使用位置を、その位置のそれぞれの開始アドレスと終了アドレスを付けて外部に送ることができる。
コード列を付け加えたいと思うユーザは、このコマンドの後で、空きスペースが十分であるかどうか確認し、その記憶アドレスに応じてコード列を定めることができる。
追加コード列の完全性検査ができる実施変形例では、オリエンテーション命令列へのジャンプを行う直前に、オリエンテーションテーブルの各要素の中に、二つの追加フィールドを準備することが必要である。
第一の追加フィールドは、当該要素に関連付けられた追加コード列のサイズを示し、また第二の追加フィールドは、正しい初期チェックサム（CheckSum）を含む。
計算されたチェックサム（CheckSum）が初期チェックサムと異なる場合には、このオペレーティングシステムは、適切な状態ワードで知らせて、その実行を中断する。この方法は、新規コード列の毎回の実行前に検査が行われるという利点があっても、関連コマンドの実行時間に不利となるか、それとも、最初の実行の時のみ、この検査を行うことに限定されるか、いずれかである。
第二の方法は、専用コマンドを使って、プログラマブルメモリのある領域のチェックサム（CheckSum）の計算を行い、その計算された値と、提供されたか、あるいは、あらかじめフィールドCHK_Xに書き込まれた値とを比較することにある。従って、システム管理者は、このコマンドを定期的に起動させて、すべてOKであるか確認することができる。
もちろん、本発明は、前述の実施例にはまったく限定されず、それどころか、本発明の精神で実行され、かつ、以下のクレームの範囲内で実施される場合には、明確に説明された手段の技術的均等物を構成するあらゆる手段、および、それらの組合せも含む。
【図９】
0003592335.tif 000002
【図１】
0003592335.tif 000003
【図２】
0003592335.tif 000004
【図３】
0003592335.tif 000005
【図８】
0003592335.tif 000006
【図４】
0003592335.tif 000007
【図６】
0003592335.tif 000008
【図５】
0003592335.tif 000009
【図７】
0003592335.tif 000010
【図１０】
0003592335.tif 000011
【図１１】
0003592335.tif 000012