"外部装置と通信を行なうための通信手段と、この通信手段により受信した外部装置からのコマンドに応じた処理を行なう処理手段と、この処理手段で処理を行なうために実行されるプログラムコードを記憶する第1の記憶手段と、前記処理手段の実行結果を一時記憶するための第2の記憶手段と、前記プログラムコードが破壊されていないことを確認するためのチェックコード期待値をあらかじめ記憶している第3の記憶手段と、前記通信手段により外部装置から1つ目のコマンドを受信した際、前記第1の記憶手段に記憶されたプログラムコードに対するチェックコードの算出を当該プログラムコードが記憶された先頭アドレスから開始するチェックコード算出手段と、このチェックコード算出手段によるチェックコードの算出があらかじめ設定されたサイズまで終了したことを判断すると、その時点で全プログラムコードのチェックコード算出が終了していない場合、算出した中間までの中間チェックコードおよびチェックコードの算出が終了した最終チェック済アドレス情報を前記第2の記憶手段に一時記憶した後、前記通信手段により当該コマンドに対する処理結果を前記外部装置へ応答する手段と、前記1つ目のコマンドに続く後続のコマンドを受信した場合、前記第2の記憶手段に一時記憶した最終チェック済アドレスおよび中間チェックコードを用いて、前記第1の記憶手段に記憶されたチェックコードの算出が終了していないプログラムコードの先頭アドレスからチェックコードの算出を継続して行なうよう前記チェックコード算出手段を制御する手段と、前記チェックコード算出手段により前記第1の記憶手段に記憶されたプログラムコードに対する全てのチェックコードの算出処理が終了した場合、前記第3の記憶手段に記憶されたチェックコード期待値と前記チェックコード算出手段により算出されたチェックコードとを比較する比較手段と、この比較手段による比較の結果、両者が一致した場合は自己診断終了と判断して、当該コマンドに対する処理結果を前記外部装置へ応答し、両者が不一致の場合は当該コマンドに対する処理結果を破棄して、自己診断異常を意味するエラーコードを前記外部装置へ応答する手段と、を具備したことを特徴とする携帯可能電子装置。前記チェックコード算出手段により前記第1の記憶手段に記憶されたプログラムコードに対する全てのチェックコードの算出処理が終了した後、さらに後続するコマンドを受信した場合、再度、前記第1の記憶手段に記憶されたプログラムコードの先頭アドレスからチェックコードの算出処理を開始するよう前記チェックコード算出手段を制御する手段をさらに具備したことを特徴とする請求項1記載の携帯可能電子装置。外部装置と通信を行なうための通信手段と、この通信手段により受信した外部装置からのコマンドに応じた処理を行なう処理手段と、この処理手段で処理を行なうために実行されるプログラムコードを記憶する第1の記憶手段と、前記処理手段の実行結果を一時記憶するための第2の記憶手段と、前記プログラムコードが破壊されていないことを確認するためのチェックコード期待値をあらかじめ記憶している第3の記憶手段と、前記通信手段により外部装置から1つ目のコマンドを受信した際、前記第1の記憶手段に記憶されたプログラムコードに対するチェックコードの算出を当該プログラムコードが記憶された先頭アドレスから開始するチェックコード算出手段と、このチェックコード算出手段によるチェックコードの算出があらかじめ設定されたサイズまで終了したことを判断すると、その時点で全プログラムコードのチェックコード算出が終了していない場合、算出した中間までの中間チェックコードおよびチェックコードの算出が終了した最終チェック済アドレス情報を前記第2の記憶手段に一時記憶した後、前記通信手段により当該コマンドに対する処理結果を前記外部装置へ応答する手段と、前記1つ目のコマンドに続く後続のコマンドを受信した場合、前記第2の記憶手段に一時記憶した最終チェック済アドレスおよび中間チェックコードを用いて、前記第1の記憶手段に記憶されたチェックコードの算出が終了していないプログラムコードの先頭アドレスからチェックコードの算出を継続して行なうよう前記チェックコード算出手段を制御する手段と、前記チェックコード算出手段により前記第1の記憶手段に記憶されたプログラムコードに対する全てのチェックコードの算出処理が終了した場合、前記第3の記憶手段に記憶されたチェックコード期待値と前記チェックコード算出手段により算出されたチェックコードとを比較する比較手段と、この比較手段による比較の結果、両者が一致した場合は自己診断終了と判断して、当該コマンドに対する処理結果を前記外部装置へ応答し、両者が不一致の場合は当該コマンドに対する処理結果を破棄して、自己診断異常を意味するエラーコードを前記外部装置へ応答する手段とを有したICモジュールと、このICモジュールを収納したICカード本体と、を具備したことを特徴とするICカード。前記ICモジュールは、前記チェックコード算出手段により前記第1の記憶手段に記憶されたプログラムコードに対する全てのチェックコードの算出処理が終了した後、さらに後続するコマンドを受信した場合、再度、前記第1の記憶手段に記憶されたプログラムコードの先頭アドレスからチェックコードの算出処理を開始するよう前記チェックコード算出手段を制御する手段をさらに具備したことを特徴とする請求項3記載のICカード。上記したように、プログラムコードの自己診断を一括して実行する場合、いつ実行するのかが重要となる。ICカードは、外部装置からのコマンド命令に応じて受動的に動作し、また、ISO/IEC7816等で規定されるように、コマンドに対するレスポンスデータを応答した後は、低消費電流モードに移行することが要求される場合がある。このため、一般的にICカードの自己診断は、コマンド受信終了後から、レスポンスデータ応答前までの間、つまりコマンド処理の一環として実行される。また、プログラムコードの自己診断は、ICカードを活性化した後に1度、たとえば1番目に受信したコマンドなど、1つのコマンド処理中に実行される、あるいは、特定の処理を実行する前に、その対象となる領域の自己診断が実行されるという方法が提案されている。ここで、1つのコマンド処理中に実行される、という方式を使用した場合、たとえば、1番目に受信したコマンドに対するICカードの処理時間が、自己診断対象となるプログラムコードのサイズに応じて増加するため、将来的にプログラムコードのサイズが飛躍的に拡張すると、たとえば、外部装置側に何らかのICカードの処理が不正に長くなっているという判定を行なうための処理タイムアウト時間が設定されていた場合、このタイムアウト時間を超えてしまい、ICカードと外部装置との間の処理が正しく行なえなくなる、というような問題が発生する恐れがある。また、ICカードの活性化後に1回実行される、という方式については、たとえば、携帯電話機に挿入されて使用されるUIMカードなどの場合、携帯電話機の電源をオンした以降、ICカードは常に活性化された状態を保持するため、次の自己診断処理は、所有者が一旦、携帯電話機の電源をオフし、再度、携帯電話機の電源をオンした場合にのみ実行される、というように自己診断がほとんど行なわれなくなる、という問題がある。そこで、実施形態は、プログラムコードの自己診断が特定のコマンド処理時間に影響を与えることを避けるための分散処理、および、本装置がほとんど非活性化~再活性化されない利用シーンにおける、プログラムコード自己診断の定期実施を可能とする携帯可能電子装置およびICカードを提供することを目的とする。実施形態に係る携帯可能電子装置は、外部装置と通信を行なうための通信手段と、この通信手段により受信した外部装置からのコマンドに応じた処理を行なう処理手段と、この処理手段で処理を行なうために実行されるプログラムコードを記憶する第1の記憶手段と、前記処理手段の実行結果を一時記憶するための第2の記憶手段と、前記プログラムコードが破壊されていないことを確認するためのチェックコード期待値をあらかじめ記憶している第3の記憶手段と、前記通信手段により外部装置から1つ目のコマンドを受信した際、前記第1の記憶手段に記憶されたプログラムコードに対するチェックコードの算出を当該プログラムコードが記憶された先頭アドレスから開始するチェックコード算出手段と、このチェックコード算出手段によるチェックコードの算出があらかじめ設定されたサイズまで終了したことを判断すると、その時点で全プログラムコードのチェックコード算出が終了していない場合、算出した中間までの中間チェックコードおよびチェックコードの算出が終了した最終チェック済アドレス情報を前記第2の記憶手段に一時記憶した後、前記通信手段により当該コマンドに対する処理結果を前記外部装置へ応答する手段と、前記1つ目のコマンドに続く後続のコマンドを受信した場合、前記第2の記憶手段に一時記憶した最終チェック済アドレスおよび中間チェックコードを用いて、前記第1の記憶手段に記憶されたチェックコードの算出が終了していないプログラムコードの先頭アドレスからチェックコードの算出を継続して行なうよう前記チェックコード算出手段を制御する手段と、前記チェックコード算出手段により前記第1の記憶手段に記憶されたプログラムコードに対する全てのチェックコードの算出処理が終了した場合、前記第3の記憶手段に記憶されたチェックコード期待値と前記チェックコード算出手段により算出されたチェックコードとを比較する比較手段と、この比較手段による比較の結果、両者が一致した場合は自己診断終了と判断して、当該コマンドに対する処理結果を前記外部装置へ応答し、両者が不一致の場合は当該コマンドに対する処理結果を破棄して、自己診断異常を意味するエラーコードを前記外部装置へ応答する手段とを具備している。以下、実施形態について図面を参照して説明する。図1は、本実施形態に係る携帯可能電子装置としてのICカードの構成を概略的に示すものである。このICカード1は、たとえば、ISO/IEC7816シリーズで規定される接触式通信機能をサポートしていて、ICカード本体1a内にICモジュール11が埋設されている。ICモジュール11は、ICチップ12および接触式通信手段としての接触端子13を有して構成されていて、これらは一体的にモジュール化されている。ICカード1は、接触端子13を介して接触通信方式により接触式カードリーダライタ外部装置2と通信を行なう。ICチップ12は、制御部として機能するCPUセントラルプロセッシングユニット101、各種データを保持記憶するための記憶手段としてのデータメモリ102、ワーキングメモリとして機能する記憶手段としてのRAMランダムアクセスメモリ103、CPU101が実行するプログラムなどを格納した記憶手段としてのROMリードオンリメモリ104、および、接触端子11を介して接触式カードリーダライタ2と行なわれる通信を制御する接触通信インタフェイスI/F105を有して構成される。データメモリ102は、たとえば、EEPROMやフラッシュメモリなどの不揮発性メモリにより構成されていて、本実施形態では、256Kバイトの容量を有している。図2は、データメモリ102、RAM103およびROM104の構成を模式的に示したものである。まず、ROM104には、プログラムコードおよびプログラムコードが破壊されていないことを確認するためのチェックコード期待値が格納されている。なお、プログラムコードは、ROM104内の全ての領域に渡り格納されているものとする。また、上記チェックコード期待値は、プログラムコードの一部としてプログラムコード内にあらかじめ格納されている。ROM104は、本実施形態では、たとえば、開始アドレスが[0x000000]、終了アドレスが[0x03FFFF]で、256Kバイトの容量を有している。次に、RAM103には、プログラムコード自己診断の結果情報である自己診断結果フラグを一時記憶するための領域103a、自己診断が終了したアドレスを一時記憶するための領域103b、中間結果あるいはチェックコード期待値と比較する最終結果となるチェックコード算出値を一時記憶するための領域103cが確保されている。なお、RAM103は、本実施形態では、たとえば、40Kバイトの容量を有している。図3は、RAM103の領域103a,103b,領域103cに一時記憶される各種データの具体例を示したものである。領域103aに一時記憶される自己診断結果フラグは、たとえば、1バイトのデータで、プログラムコード自己診断状況未実施、実施中、終了、および終了している場合はその結果を示す情報である。領域103bに一時記憶される自己診断終了アドレスは、たとえば、3バイトのデータで、前回コマンド処理終了時点で、プログラムコードのどの部分までの自己診断が終了したか未実施、実施中、終了、を一時記憶するための情報である。具体的には、その時点で自己診断が終了した最終のメモリアドレスを情報として記憶する。領域103cに一時記憶されるチェックコード算出値は、たとえば、2バイトのデータで、自己診断終了アドレスが、終了つまり、プログラムコードの最終アドレスを示していない場合は、中間結果を、終了を示している場合は、自己診断の合否判定を行なうためにプログラムコード内にあらかじめ格納されたチェックコード期待値と比較するためのデータとして一時記憶される情報である。次に、このような構成において、第1の実施形態に係る動作について図4および図5に示すフローチャートを参照して説明する。なお、本フローチャートでは、ICカード1の全ての処理を詳細には記載せず、本実施形態の説明を行なう上で必要となる部分についてのみを記載している。CPU101は、ISO/IEC7816シリーズに規定された手順にしたがって活性化されることで、処理を開始するステップS1。処理が開始されると、RAM103の初期化が行なわれるステップS2。これにより、図3に示したような各一時記憶データも初期値に戻される。次に、CPU101は、ISO/IEC7816シリーズの規定にしたがい、ATRアンサーツーリセットを外部装置である接触式カードリーダライタ2へ送信するステップS3。ATR送信後、CPU101は、接触式カードリーダライタ2からのコマンドを待つための受信待ちモードへ進むステップS4。接触式カードリーダライタ2からコマンドが送信されない場合、本ステップS4に留まり続ける。接触式カードリーダライタ2からコマンドを受信すると、CPU101は、まず、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、終了異常か、または終了正常かを判定するステップS5。この判定の結果、自己診断結果フラグが終了異常を示していた場合、CPU101は、それまでに既にプログラムコードの自己診断がエラーとなっているため、コマンドの処理を実行することなく、ステップS6へ進み、自己診断エラーを意味するステータスワードSWを接触式カードリーダライタ2へ応答しステップS6、再びステップS4のコマンド受信待ち状態へ戻る。ステップS5の判定の結果、自己診断結果フラグが終了異常でも終了正常でもない場合、CPU101は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断するステップS7。すなわち、自己診断結果フラグが実施中を示しているか、未実施を示しているかを判定する。ステップS7の判定の結果、自己診断結果フラグが、実施中を示していた場合、CPU101は、今回の処理で自己診断を再開するために、前回コマンドで行なった自己診断の中間情報をRAM103から復帰する。すなわち、RAM103の領域103cに記憶されているチェックコード算出値を初期値0x0000にセットしステップS8、RAM103の領域103bに記憶されている自己診断終了アドレスに1した値を自己診断開始アドレスにセットするステップS9。次に、CPU101は、ROM104内のプログラムコードに対する自己診断を行なうステップS10。なお、ステップS7の判定の結果、自己診断結果フラグが、未実施を示していた場合、ステップS8,S9をジャンプしてステップS10に進む。ステップS10におけるプログラムコード自己診断の方法として、本実施の形態では、たとえば、CRC16演算を利用することとする。この場合、CRC16の計算を開始するアドレスに前回までに終了したアドレスに1した値を、CRC初期値として前回までに算出されたCRC算出値を使用する。ステップS10では、指定されたアドレスから指定されたCRC初期値を用いて、プログラムコードの自己診断を開始する。具体的な計算ロジックとしては、前述のとおりCRC16演算とする。また、開始アドレスおよび初期値が指定されていない場合は、あらかじめプログラムコードの内部に設定されたプログラムコード自己診断用の初期値を利用する。具体的には、開始アドレスはプログラムコード領域の先頭を示し、CRC初期値は例えば0x0000とする。ステップS10は、あらかじめプログラムコード内で指定されたサイズ分のプログラムコード自己診断処理を実行後、終了するものとする。たとえば、1回に行なうプログラムコード自己診断対象のデータサイズを64Kバイトとした場合、全プログラムコード領域に対する自己診断は、4回、つまり診断開始後、4コマンド目の処理時点で終了することとなる。次に、CPU101は、ROM104の最終アドレスまで自己診断が終了したかをチェックするステップS11。このチェックの結果、ROM104の最終アドレスまで自己診断が終了している場合、CPU101は、算出されたチェックコードと、あらかじめROM104のプログラムコードに格納されたチェックコード期待値との比較を行なうステップS12。ステップS12の比較の結果、両者の値が一致自己診断成功した場合ステップS13、CPU101は、全てのプログラムコードが正しい値を保持している、つまりプログラムコードが壊れたり、改竄されたりしていない、と判断し、RAM103の領域103aに記憶されている自己診断結果フラグを終了正常に設定しステップS14、ステップS15へ進む。ステップS12の比較の結果、両者の値が不一致の場合ステップS13、CPU101は、プログラムコード自体に何らかの問題があると判断し、RAM103の領域103aに記憶されている自己診断結果フラグを終了異常に設定しステップS16、ステップS6へ進む。ステップS11のチェックの結果、ROM104の最終アドレスまで自己診断が終了していない場合、CPU101は、中間状態を保存するために、自己診断が終了した時点のアドレス自己診断終了アドレス、および、自己診断が終了した時点のチェックコード算出値をRAM103の領域103b,103cに保存するステップS17。次に、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグを実施中に設定しステップS18、ステップS15へ進む。ステップS5の判定の結果、自己診断結果フラグが終了正常を示していた場合、CPU101は、ステップS7~S14,S16~S18をジャンプしてステップS15へ進む。ステップS15では、接触式カードリーダライタ2から受信したコマンドの処理を開始する。次に、CPU101は、コマンド処理実行後、その処理結果に応じたステータスワードSWを接触式カードリーダライタ2へ応答しステップS19、再びステップS4のコマンド受信待ち状態へ戻る。以上説明したように上記第1の実施形態に係る動作によれば、ICカード1の活性化後、接触式カードリーダライタ2から1つ目のコマンドを受信した場合に、プログラムコードのチェックコード算出を、ROM104に格納されたプログラムコードの先頭アドレスから開始し、あらかじめプログラムコードに設定されたサイズまでのチェックコード算出終了後に、その時点で全プログラムコードのチェックコード算出が終了していない場合は、算出した中間のチェックコード、および、チェックコードの算出が終了した領域の最終チェック済アドレス情報をRAM103に一時保存した後に、コマンドの処理結果を接触式カードリーダライタ2へ応答する。さらに後続のコマンドを受信した場合に、前回一時保存した最終チェック済アドレスおよび中間チェックコードを用いて、チェックコード算出が終了していないプログラムコードの先頭アドレスから同様にチェックコード算出を継続する。最終的にプログラムコードの全てのチェックコード算出処理が終了した後で、あらかじめプログラムコード内に書込まれたチェックコード期待値と算出したチェックコードとを比較し、両者の値が一致した場合は、自己診断終了と判断して通常のコマンド処理結果を接触式カードリーダライタ2へ応答し、不一致の場合は、コマンド処理結果を破棄して、自己診断異常を意味するエラーコードを接触式カードリーダライタ2へ応答する。このように、プログラムコードの自己診断を1つのコマンド処理内で全て実行するのではなく、複数のコマンド処理に分けて分散実行することを特徴とする。次に、第2の実施形態に係る動作について図6および図7に示すフローチャートを参照して説明する。なお、上述した第1の実施形態と同一ステップには同一符号を付して説明する。CPU101は、ISO/IEC7816シリーズに規定された手順にしたがって活性化されることで、処理を開始するステップS1。処理が開始されると、RAM103の初期化が行なわれるステップS2。これにより、図3に示したような各一時記憶データも初期値に戻される。次に、CPU101は、ISO/IEC7816シリーズの規定にしたがい、ATRアンサーツーリセットを外部装置である接触式カードリーダライタ2へ送信するステップS3。ATR送信後、CPU101は、接触式カードリーダライタ2からのコマンドを待つための受信待ちモードへ進むステップS4。接触式カードリーダライタ2からコマンドが送信されない場合、本ステップS4に留まり続ける。接触式カードリーダライタ2からコマンドを受信すると、CPU101は、まず、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、終了異常かを判定するステップS20。この判定の結果、自己診断結果フラグが終了異常を示していた場合、CPU101は、それまでに既にプログラムコードの自己診断がエラーとなっているため、コマンドの処理を実行することなく、ステップS6へ進み、自己診断エラーを意味するステータスワードSWを接触式カードリーダライタ2へ応答しステップS6、再びステップS4のコマンド受信待ち状態へ戻る。ステップS20の判定の結果、自己診断結果フラグが終了異常でない場合、CPU101は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断するステップS7。すなわち、自己診断結果フラグが実施中を示しているか、未実施を示しているかを判定する。ステップS7の判定の結果、自己診断結果フラグが、実施中を示していた場合、CPU101は、今回の処理で自己診断を再開するために、前回コマンドで行なった自己診断の中間情報をRAM103から復帰する。すなわち、RAM103の領域103cに記憶されているチェックコード算出値を初期値0x0000にセットしステップS8、RAM103の領域103bに記憶されている自己診断終了アドレスに1した値を自己診断開始アドレスにセットするステップS9。次に、CPU101は、ROM104内のプログラムコードに対する自己診断を行なうステップS10。なお、ステップS7の判定の結果、自己診断結果フラグが、未実施を示していた場合、ステップS8,S9をジャンプしてステップS10に進む。ステップS10におけるプログラムコード自己診断の方法として、本実施の形態では、たとえば、CRC16演算を利用することとする。この場合、CRC16の計算を開始するアドレスに前回までに終了したアドレスに1した値を、CRC初期値として前回までに算出されたCRC算出値を使用する。ステップS10では、指定されたアドレスから指定されたCRC初期値を用いて、プログラムコードの自己診断を開始する。具体的な計算ロジックとしては、前述のとおりCRC16演算とする。また、開始アドレスおよび初期値が指定されていない場合は、あらかじめプログラムコードの内部に設定されたプログラムコード自己診断用の初期値を利用する。具体的には、開始アドレスはプログラムコード領域の先頭を示し、CRC初期値は例えば0x0000とする。ステップS10は、あらかじめプログラムコード内で指定されたサイズ分のプログラムコード自己診断処理を実行後、終了するものとする。たとえば、1回に行なうプログラムコード自己診断対象のデータサイズを64Kバイトとした場合、全プログラムコード領域に対する自己診断は、4回、つまり診断開始後、4コマンド目の処理時点で終了することとなる。次に、CPU101は、ROM104の最終アドレスまで自己診断が終了したかをチェックするステップS11。このチェックの結果、ROM104の最終アドレスまで自己診断が終了している場合、CPU101は、算出されたチェックコードと、あらかじめROM104のプログラムコードに格納されたチェックコード期待値との比較を行なうステップS12。ステップS12の比較の結果、両者の値が一致自己診断成功した場合ステップS13、CPU101は、全てのプログラムコードが正しい値を保持している、つまりプログラムコードが壊れたり、改竄されたりしていない、と判断し、RAM103の領域103aに記憶されている自己診断結果フラグを終了正常に設定しステップS14、ステップS15へ進む。ステップS12の比較の結果、両者の値が不一致の場合ステップS13、CPU101は、プログラムコード自体に何らかの問題があると判断し、RAM103の領域103aに記憶されている自己診断結果フラグを終了異常に設定しステップS16、ステップS6へ進む。ステップS11のチェックの結果、ROM104の最終アドレスまで自己診断が終了していない場合、CPU101は、中間状態を保存するために、自己診断が終了した時点のアドレス自己診断終了アドレス、および、自己診断が終了した時点のチェックコード算出値をRAM103の領域103b,103cに保存するステップS17。次に、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグを実施中に設定しステップS18、ステップS15へ進む。ステップS15では、接触式カードリーダライタ2から受信したコマンドの処理を開始する。次に、CPU101は、コマンド処理実行後、その処理結果に応じたステータスワードSWを接触式カードリーダライタ2へ応答しステップS19、再びステップS4のコマンド受信待ち状態へ戻る。以上説明したように上記第2の実施形態に係る動作によれば、1回目のプログラムコード自己診断終了後に、次のコマンドを受信した場合、第1の実施形態と同様な方法で行なわれるプログラムコードの自己診断処理を、再度最初から実行する点を特徴とする。この場合、プログラムコードの自己診断は、ICカード1が活性化された以降、ICカード1が非活性化されるまでの間、永続的に実行され続けることを意味する。なお、前記実施形態は一例であり、前記実施形態以外の形に変更することも可能である。たとえば、外部装置との通信方式は接触通信方式に限定するものではなく、ISO/IEC14443に規定されているような非接触通信方式をサポートしたICカードに対しても同様に適用可能である。本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行なうことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれると同様に、特許請求の範囲に記載された発明とその均等の範囲に含まれるものである。"