自己診断テスト用サンプルソフトウェア説明書 SP-870-102 自己診断テスト サンプルソフトウェア Rev 1.0 2008 年 8 月 z 当社は品質、信頼性の向上に努めておりますが、一般に半導体製品は誤作動したり故障することがあります。当社半導 体製品をご使用いただく場合は、半導体製品の誤作動や故障により、生命・身体・財産が侵害されることのないように、購 入者側の責任において、機器の安全設計を行うことをお願いします。 なお、設計に際しては、最新の製品仕様をご確認の上、製品保証範囲内でご使用いただくと共に、考慮されるべき注意事 項や条件について「東芝半導体製品の取り扱い上のご注意とお願い」、「半導体信頼性ハンドブック」などでご確認くださ い。 z 本資料に掲載されている製品は、一般的電子機器 (コンピュータ、パーソナル機器、事務機器、計測機器、産業用ロボ ット、家電機器など) に使用されることを意図しています。特別に高い品質・信頼性が要求され、その故障や誤作動が直 接人命を脅かしたり人体に危害を及ぼす恐れのある機器(原子力制御機器、航空宇宙機器、輸送機器、交通信号機器、燃 焼制御、医療機器、各種安全装置など) にこれらの製品を使用すること (以下 特定用途 という) は意図もされてい ませんし、また保証もされていません。本資料に掲載されている製品を当該特定用途に使用することは、お客様の責任で なされることとなります。 z 本製品の使用または,使用不能により生ずる付随的な損害(事業利益の損失,事業の中断、事業情報の損失,またはそ の他の金銭的損失を含むがこれらに限定されない)に関して当社は一切の責任を負いかねます。 z 本資料に掲載されている製品は、外国為替および外国貿易法により、輸出または海外への提供が規制されているもので す。 z 本資料に掲載されている技術情報は、製品の代表的動作・応用を説明するためのもので、その使用に際して当社および 第三者の知的財産権その他の権利に対する保証または実施権の許諾を行うものではありません。 z 本資料に掲載されている製品を、国内外の法令、規則および命令により製造、販売を禁止されている応用製品に使用す ることはできません。 z 本資料の掲載内容は、技術の進歩などにより予告なしに変更されることがあります。 1 自己診断テスト用サンプルソフトウェア説明書 目次 1.概要 ...................................................................................... 3 2.サンプルプログラムの概要................................................................... 3 2.1 RAM メモリテスト(0x55,0xAA の R/W テスト) ............................................ 3 2.2 RAM メモリテスト(March-C テスト) ................................................... 3 2.3 チェックサム計算..................................................................... 3 2.4 CRC 計算(CRC-CCITT) ................................................................ 3 3.プログラム内容............................................................................. 4 3.1 RAMメモリテスト(0x55,0xAA の R/W テスト) ......................................... 4 3.2 RAMメモリテスト(March-C テスト) ................................................. 8 3.3 チェックサム計算.................................................................... 16 3.4 CRC計算(1).................................................................... 18 3.5 CRC計算(2).................................................................... 21 4.概略フローチャート........................................................................ 25 5.補足 ..................................................................................... 28 5.1 数値表現............................................................................ 28 5.2 用語.............................................................................. 28 2 自己診断テスト用サンプルソフトウェア説明書 1.概要 このサンプルプログラムは TLCS-870/C1 シリーズ用です。 このサンプルプログラムは各種の自己診断テスト用です。このサンプルプログラムの一部を取り 出して再利用することで、希望するテストを実施することができます。 2.サンプルプログラムの概要 サンプルプログラムは、それぞれのモジュールに対してC言語、及びアセンブリ言語で記述した ものがあります。 ・C言語: tml.c 及び tml.h の2つのソースファイルからなります。使用する関数、定義宣言を取 り出して使用してください。 メモリテスト関連(0x55/0xAA RW test、March-c test)に関しては、ご使用になるコ ンパイラによっては、意図したテストが行なわれない可能性がありますので、コンパ イルされたアセンブラリストを確認するようにして下さい。 ・アセンブリ言語: tml.asm 及び tml.h の2つのソースファイルからなります。使用するモジュール、定義 宣言を取り出して使用してください。 アセンブリ言語で記述されたモジュールはC言語とのインターフェイスが考慮されて います。C言語のソースから、サンプルプログラムのモジュールを呼び出す場合は、 関数タイプを __adcel とすることで利用することが出来ます。 2.1 RAM メモリテスト(0x55,0xAA の R/W テスト) 指定された RAM エリア(スタックエリアを除く)に対しての 0x55、0xAA の Read/Write テ ストを行います。 2.2 RAM メモリテスト(March-C テスト) 指定された RAM エリア(スタックエリアを除く)に対して、March-C でのテストを行います。 March-C テストパターンは以下のように定義されます。 ・指定されたエリアすべてに0を書き込む。 ・アドレス全体にわたって増分しながら、0を読み取り1を書き込む。 ・アドレス全体にわたって増分しながら、1を読み取り0を書き込む。 ・アドレス全体にわたって減分しながら、0を読み取り1を書き込む。 ・アドレス全体にわたって減分しながら、1を読み取り0を書き込む。 ・指定されたエリアから0を読み取る。 2.3 チェックサム計算 指定されたメモリエリアに対して、1byte 毎に加算したチェックサムを計算を行います。 チェックサムは 16bit で表されます。 RAM/ROM データの整合性確認や、データ送受信における誤り検出などに用いることが出来ま す。但しデータの順序が入れ替わるなどした場合は、計算結果が同じになり、誤り検出が できませんので、より検出精度を求める場合は CRC 等他の方法を検討してください。 2.4 CRC 計算(CRC-CCITT) 指定された RAM/ROM エリアの巡回冗長検査(CRC)を計算します。 サンプルプログラムの初期値は 0xFFFF 、生成多項式は x16+x12+x5+x0 3 です 自己診断テスト用サンプルソフトウェア説明書 3.プログラム内容 3.1 RAMメモリテスト(0x55,0xAA の R/W テスト) 指定された RAM エリア(スタックエリアを除く)に対しての 0x55、0xAA の Read/Write テス トを行います。 RAM エリアは開始アドレス、及びバイト数を指定します。バイト数は偶数でなければいけませ ん。テストする RAM エリアの内容は保持されますが、割込みなど他の処理系で変更される可 能性のあるものについては、この限りではありません。 = C 言語 = tml_ram_test_cb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 function call BOOL tml_ram_test_cb(volatile unsigned char *adr, unsigned int byte) parameter 1 volatile unsigned char *adr テスト開始アドレス parameter 2 unsigned int byte テストバイト数 (1∼65535) return value BOOL TML_NO_ERROR:(1)no erro TML_ERROR :(0)error /******************************************************************** * NAME : tml_ram_test_cb *-------------------------------------------------------------------* PARAMETER : PARAMETER 1 address pointer on first data * PARAMETER 2 length of the byte * * RETURN VALUE : error infomation (TML_ERROR:error / TML_NO_ERROR:no error) * DESCRIPTION : The R/W check of 0x55/0xAA in the specified range * *********************************************************************/ #pragma optimize_off tml_ram_test_cb /* optimization restraint */ /* note ) specification bytes be an even number! */ BOOL tml_ram_test_cb(volatile unsigned char *adr,unsigned int byte) { BOOL err = TML_NO_ERROR; /* set no error */ unsigned char data_backup[2]; for ( ; byte>0; byte-=2){ data_backup[0] = *adr; data_backup[1] = *(adr+1); /* save of the date */ *adr = 0x55; /* The writing in check of 0x55, 0xaa */ *(adr+1) = 0xaa; if ((*adr == 0x55) && (*(adr+1) == 0xaa)){ }else{ err = TML_ERROR; /* set error */ } *adr = 0xaa; /* The writing in check of 0xaa, 0x55 */ *(adr+1) = 0x55; if ((*adr == 0xaa) && (*(adr+1) == 0x55)){ }else{ err = TML_ERROR; /* set error */ } *adr = data_backup[0]; *(adr+1) = data_backup[1]; /* restore of the data */ adr+=2; } return (err); 4 自己診断テスト用サンプルソフトウェア説明書 42 } 1 2 3 4 5 /******************************************************************** * Example : tml_ram_test_cb ********************************************************************/ /* 0x100∼0x110 check! */ error = tml_ram_test_cb((unsigned char *)0x0100, 0x0010); 使用例 5 自己診断テスト用サンプルソフトウェア説明書 = アセンブリ言語 = .tml_ram_test_cb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 47 parameter 1 WA register テスト開始アドレス parameter 2 BC register テストバイト数(1∼65535) return value A register TML_NO_ERROR:(1)no erro TML_ERROR :(0)error used register WA,BC,IX,IY register Code Size 67 byte Use Stack Size 2 byte ;******************************************************************** ;* NAME : .tml_ram_test_cb ;*-------------------------------------------------------------------;* PARAMETER : WAreg. address pointer on first data ;* BCreg. length of the byte ;* ;* RETURN VALUE : Areg. error infomation (TML_ERROR:error / TML_NO_ERROR:no error) ;* USE REGISTER : WA,BC,IX,IY ;* DESCRIPTION : The R/W check of 0x55/0xAA in the specified range ;* ;********************************************************************* PUBLIC .tml_ram_test_cb .tml_ram_test_cb: PUSH DE LD IX,WA LD A,TML_NO_ERROR CMP BC,0 J T,ram_cb_end ram_cb_s1: LD DE,(IX) LD (IX),0x55 LD (IX+1),0xAA CMP (IX),0x55 J F,ram_cb_err1 CMP (IX+1),0xAA J T,ram_cb_s2 ram_cb_err1: LD A,TML_ERROR ram_cb_s2: LD (IX),0xAA LD (IX+0x1),0x55 CMP (IX),0xAA J F,ram_cb_err2 CMP (IX+0x1),0x55 J T,ram_cb_s3 ram_cb_err2: LD A,TML_ERROR ram_cb_s3: LD (IX),DE ADD IX,2 SUB BC,2 CMP BC,0 J F,ram_cb_s1 ram_cb_end: POP DE RET ; ; ; ; DE on Stack IX:Address Error Inf. Clear length check ; ; ; ; ; ; ; Backup Data 0x55 Write 0xAA Write Read check Read check ; Set Error ; ; ; ; ; ; 0xAA Write 0x55 Write Read Check Read Check ; Set Error ; ; ; ; ; Reatore Data Next Address Counter decrement finish ? else JP ; Restore DE 6 自己診断テスト用サンプルソフトウェア説明書 使用例 1 2 3 4 5 6 7 ;******************************************************************** ;* Example : .tml_ram_test_cb ;******************************************************************** ; 0x100∼0x110 check!! LD WA,0x0100 LD BC,0x0010 CALL .tml_ram_test_cb 7 自己診断テスト用サンプルソフトウェア説明書 3.2 RAMメモリテスト(March-C テスト) 指定された RAM エリア(スタックエリアを除く)に対しての March-C でのテストを行います。 RAM エリアは開始アドレス、及びバイト数を指定します。 テストする RAM エリアの内容は保持されませんので、保持する必要がある場合は、テスト RA M エリアのデータの退避、及びテスト終了後のデータ復帰処理を行う必要があります。 = C 言語 = tml_ram_test_marchc function call BOOL tml_ram_test_marchc(volatile unsigned char *adr,unsigned int byte) parameter 1 volatile unsigned char *adr テスト開始アドレス parameter 2 unsigned int byte テストバイト数(1∼65535) return value BOOL TML_NO_ERROR:(1)no erro TML_ERROR :(0)error 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 /********************************************************************* * NAME : tml_ram_test_marchc *-------------------------------------------------------------------* PARAMETER : PARAMETER 1 address pointer on first data * PARAMETER 2 length of the byte * * RETURN VALUE : error infomation (TML_ERROR:error / TML_NO_ERROR:no error) * DESCRIPTION : March-C in the specified range The test * *********************************************************************/ #pragma optimize_off tml_ram_test_marchc /* optimization restraint */ BOOL tml_ram_test_marchc(volatile unsigned char *adr,unsigned int byte) { BOOL err = TML_NO_ERROR; /* set no error */ volatile unsigned char *stop_adr; unsigned int i; stop_adr = (volatile unsigned char*)(adr + byte -1); /* set end address */ /* The RAM clearance by the check range */ for (i=0;i<byte;i++){ *(adr+i) = 0x00; } /* The W/R check of "1" from the address head / the lower rank bit */ for (i=0;i<byte;i++){ if (TML_ERROR == bitchk_r0_w1(adr+i)){ err = TML_ERROR; /* set error */ } } /* The W/R check of "0" from the address head / the lower rank bit */ for (i=0;i<byte;i++){ if (TML_ERROR == bitchk_r1_w0(adr+i)){ err = TML_ERROR; /* set error */ } } /* The W/R check of "1" from the address lower rank / the lower rank bit */ for (i=0;i<byte;i++){ if (TML_ERROR == bitchk_r0_w1(stop_adr-i)){ err = TML_ERROR; /* set error */ } } 8 自己診断テスト用サンプルソフトウェア説明書 45 /* The W/R check of "0" from the address lower rank / the lower rank bit */ 46 for (i=0;i<byte;i++){ 47 if(TML_ERROR ==bitchk_r1_w0(stop_adr-i)){ 48 err = TML_ERROR; /* set error */ 49 } 50 } 51 52 /* The check area is the confirmation of ALL"0" */ 53 for (i=0;i<byte;i++){ 54 if (*adr != 0x00){ 55 err = TML_ERROR; /* set error */ 56 } 57 adr++; 58 } 59 60 return(err); 61 62 } -内部関数/*--------- static function (uses at tml_ram_test_marchc()) -----------*/ 1 /* 2 ********************************************************************* 3 * NAME : bitchk_r0_w1 4 *-------------------------------------------------------------------5 * PARAMETER : PARAMETER 1 address pointer 6 * 7 * RETURN VALUE : error (TML_ERROR:error / TML_NO_ERROR:no error) 8 * DESCRIPTION : W/R check of "1" 6 * 7 ********************************************************************* 8 */ 9 /* optimization restraint */ 10 #pragma optimize_off bitchk_r0_w1 11 static BOOL bitchk_r0_w1(volatile unsigned char *adr) 12 { BOOL err = TML_NO_ERROR; /* set no error */ 13 14 if (*adr != 0x00){ /* all "0" check */ 15 err = TML_ERROR; /* set error */ 16 } 17 18 *adr ¦= 0x01; /* set of the 0th bit */ 19 if (*adr != 0x01){ 20 err = TML_ERROR; /* set error */ 21 } 22 *adr ¦= 0x02; /* set of the 1st bit */ 23 if (*adr != 0x03){ 24 err = TML_ERROR; /* set error */ 25 } 26 *adr ¦= 0x04; /* set of the 2nd bit */ 27 if (*adr != 0x07){ 28 err = TML_ERROR; /* set error */ 29 } 30 *adr ¦= 0x08; /* set of the 3rd bit */ 31 if (*adr != 0x0F){ 32 err = TML_ERROR; /* set error */ 33 } 34 *adr ¦= 0x10; /* set of the 4th bit */ 35 if (*adr != 0x1F){ 36 err = TML_ERROR; /* set error */ 37 } 38 *adr ¦= 0x20; /* set of the 5th bit */ 39 if (*adr != 0x3F){ 40 err = TML_ERROR; /* set error */ 41 } 42 *adr ¦= 0x40; /* set of the 6th bit */ 43 if (*adr != 0x7F){ 44 err = TML_ERROR; /* set error */ 45 } 46 9 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 *adr ¦= 0x80; if (*adr != 0xFF){ err = TML_ERROR; } 自己診断テスト用サンプルソフトウェア説明書 /* set of the 7th bit */ /* set error */ return(err); } /* ********************************************************************* * NAME : bitchk_r1_w0 *-------------------------------------------------------------------* PARAMETER : PARAMETER 1 address pointer * * RETURN VALUE : error (TML_ERROR:error / TML_NO_ERROR:no error) * DESCRIPTION : W/R check of "0" * ********************************************************************* */ #pragma optimize_off bitchk_r1_w0 /* optimization restraint */ static BOOL bitchk_r1_w0(volatile unsigned char *adr) { BOOL err = TML_NO_ERROR; /* set no error */ if (*adr != 0xFF){ err = TML_ERROR; } /* all "1" check */ /* set error */ *adr &= 0xFE; if (*adr != 0xFE){ err = TML_ERROR; } *adr &= 0xFD; if (*adr != 0xFC){ err = TML_ERROR; } *adr &= 0xFB; if (*adr != 0xF8){ err = TML_ERROR; } *adr &= 0xF7; if (*adr != 0xF0){ err = TML_ERROR; } *adr &= 0xEF; if (*adr != 0xE0){ err = TML_ERROR; } *adr &= 0xDF; if (*adr != 0xC0){ err = TML_ERROR; } *adr &= 0xBF; if (*adr != 0x80){ err = TML_ERROR; } *adr &= 0x7F; if (*adr != 0x00){ err = TML_ERROR; } /* clear of the 0th bit */ /* set error */ /* clear of the 1st bit */ /* set error */ /* clear of the 2nd bit */ /* set error */ /* clear of the 3rd bit */ /* set error */ /* clear of the 4th bit */ /* set error */ /* clear of the 5th bit */ /* set error */ /* clear of the 6th bit */ /* set error */ /* clear of the 7th bit */ /* set error */ return(err); } 10 自己診断テスト用サンプルソフトウェア説明書 使用例 1 2 3 4 5 /******************************************************************** * Example : tml_ram_test_marchc ********************************************************************/ /* 0x100∼0x110 check!! */ error = tml_ram_test_marchc ((unsigned char *)0x0100, 0x0010); 11 自己診断テスト用サンプルソフトウェア説明書 = アセンブリ言語 = .vde_ram_test_marchc 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 parameter 1 WA register テスト開始アドレス parameter 2 BC register テストバイト数(1∼65535) return value A register TML_NO_ERROR:(1)no erro TML_ERROR :(0)error used register WA,BC,IX,IY register code size 241 byte stack size 7 byte ;********************************************************************* ;* NAME : .tml_ram_test_marchc ;*-------------------------------------------------------------------;* PARAMETER : WAreg. address pointer on first data ;* BCreg. length of the byte ;* ;* RETURN VALUE : Areg. error infomation (TML_ERROR:error / TML_NO_ERROR:no error) ;* USE REGISTER : WA,BC,IX,IY ;* DESCRIPTION : March-C in the specified range The test ;********************************************************************* PUBLIC .tml_ram_test_marchc .tml_ram_test_marchc: PUSH HL PUSH DE ; Stack on HL ; Stack on DE LD LD ADD DEC HL,WA DE,HL HL,BC HL ; WA:Start Address ; DE:Start Address ; ; HL:End Address CMP J LD J BC,0 F,ram_mc_start B,TML_NO_ERROR ram_mc_step_12 ; length check ; ram_mc_start: LD B,TML_NO_ERROR ;***** zero clear ******* ram_mc_step_0: LD (DE),0 CMP HL,DE J T,ram_mc_step_1 INC DE J ram_mc_step_0 ; error inf. ; ; ; ; ; All ZERO set ZERO Store Clear End then JP Addess increment ;***** 1-write from lower address ****** ram_mc_step_1: ; LD DE,WA ; DE:Start Address ram_mc_step_2: CAL CMP J INC J .bitchk_r0_w1 HL,WA T,ram_mc_step_3 WA ram_mc_step_2 ; ; 0-Read / 1-Write : error output is B ; End ; then jp ; Addess increment ;***** 0-write from lower address ****** ram_mc_step_3: ; LD WA,DE ; WA:Start Address 12 自己診断テスト用サンプルソフトウェア説明書 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 102 102 103 104 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ram_mc_step_4: CAL CMP J INC J .bitchk_r1_w0 HL,WA T,ram_mc_step_5 WA ram_mc_step_4 ; ; 1-Read / 0-Write : error output is B ; End ; then jp ; Addess increment ;***** 1-write from upper address ****** ram_mc_step_5: PUSH DE LD DE,HL ; DE:End Adddress POP HL ; HL:Start Address LD WA,DE ; WA:End Address ram_mc_step_6: CAL .bitchk_r0_w1 ; 0-Read / 1-Write : error output is B CMP J DEC J WA,HL T,ram_mc_step_7 WA ram_mc_step_6 ;***** 0-write from lower upper ****** ram_mc_step_7: LD WA,DE ram_mc_step_8: CAL CMP J DEC J .bitchk_r1_w0 WA,HL T,ram_mc_step_9 WA ram_mc_step_8 ; End ; then JP ; Addess decrement ; ; ; WA:End Address ; ; 1-Read / 0-Write : error output is B ; End ; then JP ; Addess decrement ;***** All 0 check ****** ram_mc_step_9: LD ram_mc_step_10: CMP J LD ram_mc_step_11: CMP J INC J WA,DE ; WA:End Address (HL),0 ; data == 0 T,ram_mc_step_11 ; then JP B,TML_ERROR ; Error WA,HL ; finish ? T,ram_mc_step_12 ; then JP HL ; Addess increment ram_mc_step_10 ram_mc_step_12: LD A,B ; Areg:return POP DE ; Restore DE POP HL ; Restore HL RET -内部関数;/*--------- static function (uses at tml_ram_test_marchc()) -----------*/\ ;*************************************************** ;* NAME : bitchk_r0_w1 ;*-------------------------------------------------;* PARAMETER : WAreg. address pointer ;* RETURN VALUE : Breg. error infomation(TML_ERROR:error / TML_NO_ERROR:no error) ;*************************************************** .bitchk_r0_w1: LD IY,WA CMP (IY),0y00000000 ;all "0" check J T,W1_1 LD B,TML_ERROR ;set error W1_1: SET (IY).0 ;set of the 0th bit 13 自己診断テスト用サンプルソフトウェア説明書 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 CMP J LD (IY),0y00000001 T,W1_2 B,TML_ERROR SET CMP J LD (IY).1 (IY),0y00000011 T,W1_3 B,TML_ERROR ;set of the 1st bit SET CMP J LD (IY).2 (IY),0y00000111 T,W1_4 B,TML_ERROR ;set of the 2nd bit SET CMP J LD (IY).3 (IY),0y00001111 T,W1_5 B,TML_ERROR ;set of the 3rd bit SET CMP J LD (IY).4 (IY),0y00011111 T,W1_6 B,TML_ERROR ;set of the 4th bit SET CMP J LD (IY).5 (IY),0y00111111 T,W1_7 B,TML_ERROR ;set of the 5th bit SET CMP J LD (IY).6 (IY),0y01111111 T,W1_8 B,TML_ERROR ;set of the 6th bit SET CMP J LD (IY).7 (IY),0y11111111 T,W1_END B,TML_ERROR ;set of the 7th bit ;set error W1_2: ;set error W1_3: ;set error W1_4: ;set error W1_5: ;set error W1_6: ;set error W1_7: ;set error W1_8: ;set error W1_END: RET ;*************************************************** ;* NAME : bitchk_r1_w0 ;*-------------------------------------------------;* PARAMETER : WAreg. address pointer ;* RETURN VALUE : Breg. error (TML_ERROR:error / TML_NO_ERROR:no error) ;*************************************************** .bitchk_r1_w0: LD IY,WA CMP (IY),0y11111111 ;all "1" check J T,W0_1 LD B,TML_ERROR ;set error W0_1: CLR (IY).0 ;clear of the 0th bit CMP (IY),0y11111110 J T,W0_2 LD B,TML_ERROR ;set error W0_2: CLR (IY).1 ;clear of the 1st bit CMP (IY),0y11111100 J T,W0_3 LD B,TML_ERROR ;set error W0_3: CLR (IY).2 ;clear of the 2nd bit CMP (IY),0y11111000 14 自己診断テスト用サンプルソフトウェア説明書 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 1 2 3 4 5 J LD T,W0_4 B,TML_ERROR CLR CMP J LD (IY).3 (IY),0y11110000 T,W0_5 B,TML_ERROR ;clear of the 3rd bit CLR CMP J LD (IY).4 (IY),0y11100000 T,W0_6 B,TML_ERROR ;clear of the 4th bit CLR CMP J LD (IY).5 (IY),0y11000000 T,W0_7 B,TML_ERROR ;clear of the 5th bit CLR CMP J LD (IY).6 (IY),0y10000000 T,W0_8 B,TML_ERROR ;clear of the 6th bit CLR CMP J LD (IY).7 (IY),0y00000000 T,W0_END B,TML_ERROR ;clear of the 7th bit ;set error W0_4: ;set error W0_5: ;set error W0_6: ;set error W0_7: ;set error W0_8: ;set error W0_END: RET 使用例 ;******************************************************************** ;* Example : .tml_ram_test_marchc ;******************************************************************** ; 0x100∼0x110 check!! LD WA,0x0100 LD BC,0x0010 CALL .tml_ram_test_marchc ; Areg=0 then OK: 15 自己診断テスト用サンプルソフトウェア説明書 3.3 チェックサム計算 指定されたメモリエリアのチェックサム計算(1 バイト毎の加算)を行ないます。 メモリエリアの指定は開始アドレス、及びバイト数を指定します。計算中はメモリエリアの データが割込みなど他の処理系で変更されないようにして下さい。 = C 言語 = tml_chksum 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 1 2 3 4 5 function call BOOL tml_chksum(const unsigned char *adr, unsigned int byte) parameter 1 const unsigned char *adr テスト開始アドレス parameter 2 unsigned int byte テストバイト数(1∼65535) return value unsigned int 計算結果 /********************************************************************* * NAME : tml_chksum *-------------------------------------------------------------------* PARAMETER : PARAMETER 1 address pointer on first data * PARAMETER 2 length of the byte * * RETURN VALUE : checksum data * DESCRIPTION : The computation of the checksum in the specified range * *********************************************************************/ unsigned int tml_chksum(const unsigned char *adr,unsigned int size) { unsigned int cnt; unsigned int data=0; for(cnt=0; cnt<size; cnt++){ data = data + *adr; adr++; } return (data); /* adds a specified range */ } 使用例 /******************************************************************** * Example : tml_chksum ********************************************************************/ /* 0x100∼0x110 calc.!! */ error = tml_chksum((unsigned char *)0x0100, 0x0010); 16 自己診断テスト用サンプルソフトウェア説明書 = アセンブリ言語 = .tml_chksum 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 1 2 3 4 5 6 7 parameter 1 WA register テスト開始アドレス parameter 2 BC register テストバイト数(1∼65535) return value WA register 計算結果 used register WA,IX,IY register code size 29 byte stack size 2 byte ;********************************************************************* ;* NAME : .tml_chksum ;*-------------------------------------------------------------------;* PARAMETER : WAreg. address pointer on first data ;* BCreg. length of the byte ;* ;* RETURN VALUE : WAreg. checksum data ;* USE REGISTER : WA,IX,IY ;* DESCRIPTION : The computation of the checksum in the specified range ;* ;********************************************************************* PUBLIC .tml_chksum: PUSH LD LD LD CMP J chksum_n: LD LD ADD INC INC CMP J chksum_end: POP RET .tml_chksum DE IX,WA WA,0x0000 IY,0x0000 BC,0x0 LE,chksum_end ; ; ; ; ; DE on Stack IX:Address clear chksum data clear counter length check E,(IX) D,0x0 WA,DE IX IY IY,BC LT,chksum_n ; ; ; ; ; ; ; read memory DE ; Restore DE store chksum address increment counter increment finish ? else JP 使用例 ;******************************************************************** ;* Example : .tml_chksum ;******************************************************************** ; 0x100∼0x110 calc.!! LD WA,0x0100 LD BC,0x0010 CALL .tml_chksum 17 自己診断テスト用サンプルソフトウェア説明書 3.4 CRC計算(1) 指定されたメモリエリアの CRC 計算を行ないます。 メモリエリアの指定は開始アドレス、及びバイト数を指定します。計算中はメモリエリアの データが割込みなど他の処理系で変更されないようにして下さい。 サンプルプログラムの生成多項式は x16+x12+x5+x0(CRC-CCITT) 、初期値は 0xffff となって います。 = C 言語 = tml_crc function call unsigned int tml_crc(const unsigned char *adr ,unsigned int byte) parameter 1 const unsigned char *adr 開始アドレス parameter 2 unsigned int byte バイト数(1∼65535) return value unsigned int 計算結果 ********************************************************************* 1 * NAME : tml_crc 2 *-------------------------------------------------------------------3 * PARAMETER : PARAMETER 1 address pointer on first data 4 * PARAMETER 2 length of the byte 5 * 6 * RETURN VALUE : CRC data 7 * DESCRIPTION : The CRC-CCITT computation(general version) 8 * 9 10 *********************************************************************/ 11 unsigned int tml_crc(const unsigned char *adr ,unsigned int byte) 12 { /* first value */ 13 unsigned int crc=0xffff; 14 unsigned int i; 15 unsigned char j; 16 for (i=0; i<byte; i+=1) { 17 crc ^= adr[i] << 8; 18 for(j=0;j<8;j+=1) { 19 if(crc & 0x8000){ 20 crc = (crc << 1) ^ 0x1021; 21 }else{ 22 crc = crc << 1; 23 } 24 } 25 } 26 return crc; 27 28 } *)初期値、生成多項式を変更したい場合は、13 行目、21 行目の値を変更してください。 1 2 3 4 5 使用例 /******************************************************************** * Example : .tml_crc ********************************************************************/ /* 0x100∼0x110 */ crc = tml_crc((unsigned char *)0x0100, 0x0010); 18 自己診断テスト用サンプルソフトウェア説明書 = アセンブリ言語 = .tml_crc 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 parameter 1 WA register テスト開始アドレス parameter 2 BC register テストバイト数(1∼65535) return value WA register 計算結果 used register WA,BC,IX,IY register code size 66 byte stack size 4 byte ;********************************************************************* ;* NAME : tml_crc ;*-------------------------------------------------------------------;* PARAMETER : WAreg. address pointer on first data ;* BCreg. length of the byte ;* RETURN VALUE : Areg. CRC data ;* ;* USE REGISTER : WA,BC,IX,IY ;* DESCRIPTION : The CRC-CCITT computation(general version) ;* ;********************************************************************* PUBLIC .tml_crc: PUSH PUSH LD LD LD CMP J tml_crc_1: LD ADD LD LD LD LD tml_crc_2: SHLCA DEC J XOR LD tml_crc_3: TEST J SHLCA XOR J tml_crc_4: SHLCA tml_crc_5: INC CMP J INC CMP J tml_crc_end: LD .tml_crc HL DE IX,BC DE,0xffff IY,0x0 IX,0x0 LE,tml_crc_end ; ; ; ; ; ; ; HL,IY HL,WA C,(HL) B,0x0 HL,BC B,0x8 ; ; ;load memory data ; ; ; HL B NE,tml_crc_2 DE,HL C,0x0 ; 8bit shift ; ; ; ; D.7 T,tml_crc_4 DE DE,0x1021 tml_crc_5 ; ; ; ;Polynomial:0x1021 (x^16 + x^12 + x^5 + 1) ; DE ; C C,0x8 LT,tml_crc_3 IY IY,IX LT,tml_crc_1 ; ; ; ; decrement length ; finish? ; else JP WA,DE ; WA:return data 19 Stack on HL Stack on DE IX:length 1st data check length 自己診断テスト用サンプルソフトウェア説明書 53 POP DE ; Restore DE 54 POP HL ; Restore HL 55 RET *)初期値、生成多項式を変更したい場合は、19 目、40 行目の値を変更してください。 1 2 3 4 5 6 7 使用例 ;******************************************************************** ;* Example : .tml_crc ;******************************************************************** ; 0x100∼0x110 LD WA,0x0100 LD BC,0x0010 CALL .tml_crc 20 自己診断テスト用サンプルソフトウェア説明書 3.5 CRC計算(2) 3.4で紹介したサンプルプログラムを参照テーブルを用いることで、処理の高速化を図っ たプログラムです。 = C 言語 = tml_crc_fast 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 function call unsigned int tml_crc_fast(const unsigned char *adr ,unsigned int byte) parameter 1 const unsigned char *adr 開始アドレス parameter 2 unsigned int byte バイト数(1∼65535) return value unsigned int 計算結果 /*****************************************************************/ /* CRC-CCITT TABLE */ /*****************************************************************/ const unsigned int crc_table[256] = { 0x0000,0x1021,0x2042,0x3063,0x4084,0x50A5,0x60C6,0x70E7, 0x8108,0x9129,0xA14A,0xB16B,0xC18C,0xD1AD,0xE1CE,0xF1EF, 0X1231,0x0210,0x3273,0x2252,0x52B5,0x4294,0x72F7,0x62D6, 0x9339,0x8318,0xB37B,0xA35A,0xD3BD,0xC39C,0xF3FF,0xE3DE, 0x2462,0x3443,0x0420,0x1401,0x64E6,0x74C7,0x44A4,0x5485, 0xA56A,0xB54B,0x8528,0x9509,0xE5EE,0xF5CF,0xC5AC,0xD58D, 0x3653,0x2672,0x1611,0x0630,0x76D7,0x66F6,0x5695,0x46B4, 0xB75B,0xA77A,0x9719,0x8738,0xF7DF,0xE7FE,0xD79D,0xC7BC, 0x48C4,0x58E5,0x6886,0x78A7,0x0840,0x1861,0x2802,0x3823, 0xC9CC,0xD9ED,0xE98E,0xF9AF,0x8948,0x9969,0xA90A,0xB92B, 0x5AF5,0x4AD4,0x7AB7,0x6A96,0x1A71,0x0A50,0x3A33,0x2A12, 0xDBFD,0xCBDC,0xFBBF,0xEB9E,0x9B79,0x8B58,0xBB3B,0xAB1A, 0x6CA6,0x7C87,0x4CE4,0x5CC5,0x2C22,0x3C03,0x0C60,0x1C41, 0xEDAE,0xFD8F,0xCDEC,0xDDCD,0xAD2A,0xBD0B,0x8D68,0x9D49, 0x7E97,0x6EB6,0x5ED5,0x4EF4,0x3E13,0x2E32,0x1E51,0x0E70, 0xFF9F,0xEFBE,0xDFDD,0xCFFC,0xBF1B,0xAF3A,0x9F59,0x8F78, 0x9188,0x81A9,0xB1CA,0xA1EB,0xD10C,0xC12D,0xF14E,0xE16F, 0x1080,0x00A1,0x30C2,0x20E3,0x5004,0x4025,0x7046,0x6067, 0x83B9,0x9398,0xA3FB,0xB3DA,0xC33D,0xD31C,0xE37F,0xF35E, 0x02B1,0x1290,0x22F3,0x32D2,0x4235,0x5214,0x6277,0x7256, 0xB5EA,0xA5CB,0x95A8,0x8589,0xF56E,0xE54F,0xD52C,0xC50D, 0x34E2,0x24C3,0x14A0,0x0481,0x7466,0x6447,0x5424,0x4405, 0xA7DB,0xB7FA,0x8799,0x97B8,0xE75F,0xF77E,0xC71D,0xD73C, 0x26D3,0x36F2,0x0691,0x16B0,0x6657,0x7676,0x4615,0x5634, 0xD94C,0xC96D,0xF90E,0xE92F,0x99C8,0x89E9,0xB98A,0xA9AB, 0x5844,0x4865,0x7806,0x6827,0x18C0,0x08E1,0x3882,0x28A3, 0xCB7D,0xDB5C,0xEB3F,0xFB1E,0x8BF9,0x9BD8,0xABBB,0xBB9A, 0x4A75,0x5A54,0x6A37,0x7A16,0x0AF1,0x1AD0,0x2AB3,0x3A92, 0xFD2E,0xED0F,0xDD6C,0xCD4D,0xBDAA,0xAD8B,0x9DE8,0x8DC9, 0x7C26,0x6C07,0x5C64,0x4C45,0x3CA2,0x2C83,0x1CE0,0x0CC1, 0xEF1F,0xFF3E,0xCF5D,0xDF7C,0xAF9B,0xBFBA,0x8FD9,0x9FF8, 0x6E17,0x7E36,0x4E55,0x5E74,0x2E93,0x3EB2,0x0ED1,0x1EF0 }; /* ********************************************************************* * NAME : tml_crc_fast *-------------------------------------------------------------------* PARAMETER : PARAMETER 1 address pointer on first data * PARAMETER 2 length of the byte * * RETURN VALUE : CRC data * DESCRIPTION : The CRC-CCITT computation(high-speed version) 21 自己診断テスト用サンプルソフトウェア説明書 49 * 50 ********************************************************************* 51 */ 52 unsigned int tml_crc_fast(const unsigned char *s,unsigned int byte) 53 { 54 unsigned int crc=0xffff; /* first value */ 55 while(byte-- > 0){ 56 crc = crc_table[((crc>>8) ^ *s++) & 0xff] ^ (crc<<8); 57 } 58 return crc; 59 } *)初期値を変更したい場合は、54 行目の値を変更してください。 1 2 3 4 5 使用例 /******************************************************************** * Example : tml_crc_fast ********************************************************************/ /* 0x100∼0x110 */ crc = tml_crc_fast((unsigned char *)0x0100, 0x0010); 22 自己診断テスト用サンプルソフトウェア説明書 = アセンブリ言語 = .tml_crc_fast 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 parameter 1 WA register テスト開始アドレス parameter 2 BC register テストバイト数(1∼65535) return value WA register 計算結果 used register WA,BC,IX,IY register code size 576 byte stack size 4 byte ;*****************************************************************/ ;* CRC-CCITT TABLE */ ;*****************************************************************/ crc_table: DW 0x0000,0x1021,0x2042,0x3063,0x4084,0x50A5,0x60C6,0x70E7 DW 0x8108,0x9129,0xA14A,0xB16B,0xC18C,0xD1AD,0xE1CE,0xF1EF DW 0x1231,0x0210,0x3273,0x2252,0x52B5,0x4294,0x72F7,0x62D6 DW 0x9339,0x8318,0xB37B,0xA35A,0xD3BD,0xC39C,0xF3FF,0xE3DE DW 0x2462,0x3443,0x0420,0x1401,0x64E6,0x74C7,0x44A4,0x5485 DW 0xA56A,0xB54B,0x8528,0x9509,0xE5EE,0xF5CF,0xC5AC,0xD58D DW 0x3653,0x2672,0x1611,0x0630,0x76D7,0x66F6,0x5695,0x46B4 DW 0xB75B,0xA77A,0x9719,0x8738,0xF7DF,0xE7FE,0xD79D,0xC7BC DW 0x48C4,0x58E5,0x6886,0x78A7,0x0840,0x1861,0x2802,0x3823 DW 0xC9CC,0xD9ED,0xE98E,0xF9AF,0x8948,0x9969,0xA90A,0xB92B DW 0x5AF5,0x4AD4,0x7AB7,0x6A96,0x1A71,0x0A50,0x3A33,0x2A12 DW 0xDBFD,0xCBDC,0xFBBF,0xEB9E,0x9B79,0x8B58,0xBB3B,0xAB1A DW 0x6CA6,0x7C87,0x4CE4,0x5CC5,0x2C22,0x3C03,0x0C60,0x1C41 DW 0xEDAE,0xFD8F,0xCDEC,0xDDCD,0xAD2A,0xBD0B,0x8D68,0x9D49 DW 0x7E97,0x6EB6,0x5ED5,0x4EF4,0x3E13,0x2E32,0x1E51,0x0E70 DW 0xFF9F,0xEFBE,0xDFDD,0xCFFC,0xBF1B,0xAF3A,0x9F59,0x8F78 DW 0x9188,0x81A9,0xB1CA,0xA1EB,0xD10C,0xC12D,0xF14E,0xE16F DW 0x1080,0x00A1,0x30C2,0x20E3,0x5004,0x4025,0x7046,0x6067 DW 0x83B9,0x9398,0xA3FB,0xB3DA,0xC33D,0xD31C,0xE37F,0xF35E DW 0x02B1,0x1290,0x22F3,0x32D2,0x4235,0x5214,0x6277,0x7256 DW 0xB5EA,0xA5CB,0x95A8,0x8589,0xF56E,0xE54F,0xD52C,0xC50D DW 0x34E2,0x24C3,0x14A0,0x0481,0x7466,0x6447,0x5424,0x4405 DW 0xA7DB,0xB7FA,0x8799,0x97B8,0xE75F,0xF77E,0xC71D,0xD73C DW 0x26D3,0x36F2,0x0691,0x16B0,0x6657,0x7676,0x4615,0x5634 DW 0xD94C,0xC96D,0xF90E,0xE92F,0x99C8,0x89E9,0xB98A,0xA9AB DW 0x5844,0x4865,0x7806,0x6827,0x18C0,0x08E1,0x3882,0x28A3 DW 0xCB7D,0xDB5C,0xEB3F,0xFB1E,0x8BF9,0x9BD8,0xABBB,0xBB9A DW 0x4A75,0x5A54,0x6A37,0x7A16,0x0AF1,0x1AD0,0x2AB3,0x3A92 DW 0xFD2E,0xED0F,0xDD6C,0xCD4D,0xBDAA,0xAD8B,0x9DE8,0x8DC9 DW 0x7C26,0x6C07,0x5C64,0x4C45,0x3CA2,0x2C83,0x1CE0,0x0CC1 DW 0xEF1F,0xFF3E,0xCF5D,0xDF7C,0xAF9B,0xBFBA,0x8FD9,0x9FF8 DW 0x6E17,0x7E36,0x4E55,0x5E74,0x2E93,0x3EB2,0x0ED1,0x1EF0 ;********************************************************************* ;* NAME : tml_crc_fast ;*-------------------------------------------------------------------;* PARAMETER : WAreg. address pointer on first data ;* BCreg. length of the byte ;* RETURN VALUE : Areg. CRC data ;* ;* USE REGISTER : WA,BC,IX,IY ;* DESCRIPTION : The CRC-CCITT computation((high-speed version)) ;* ;********************************************************************* PUBLIC .tml_crc_fast .tml_crc_fast: 23 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 1 2 3 4 5 6 7 自己診断テスト用サンプルソフトウェア説明書 Stack on HL Stack on DE IXreg. = Address first data if length=0 then JP length decrement PUSH PUSH LD LD CMP J DEC LD tml_crc_f1: LD LD INC LD LD tml_crc_f2: SHRC RORC DEC J XOR AND SHLCA ADD HL DE IX,WA WA,0xffff BC,0x0 T,tml_crc_f4 BC IY,BC ; ; ; ; ; ; ; ; E,(IX) D,0 IX HL,WA B,8 ; Address increment. ; HLreg = CRC ; shift 8 times. H L B ne,tml_crc_f2 HL,DE HL,0x00FF HL HL,crc_table ; right shift ; ; shift end ? ; else JP LD tml_crc_f3: SHLCA DEC J B,0x8 ; shift 8 times. WA B ne,tml_crc_f3 ; reft shift ; shift end ? ; else JP WA,(HL) ; WAreg = CRC IY,0 T,tml_crc_f4 IY tml_crc_f1 ; finish ? ; then JP ; length decrement ; DE HL ; Restore DE ; Restore HL XOR CMP J DEC J tml_crc_f4: POP POP RET ; Table data size adj. 使用例 ;******************************************************************** ;* Example : .tml_crc_fast ;******************************************************************** ; 0x100∼0x110 LD WA,0x0100 LD BC,0x0010 CALL .tml_crc_fast 24 自己診断テスト用サンプルソフトウェア説明書 4.概略フローチャート tml_ram_test_cb tml_ram_test_cb data back-up 0x55/0xAA write error set error info. verify 0x55/0xAA OK 0xAA/0x55 write error set error info. verify 0xAA/0x55 OK restore data yes all ram test end no address + 2 return RAM 0x55/0xAA RW test 25 自己診断テスト用サンプルソフトウェア説明書 tml_ram_test_marchc tml_ram_test_marchc clear check ram area check write “1” into bit, from lower address check write “0” into bit, from lower address check write “1” into bit, from upper address check write “0” into bit, from upper address check area is the confirmation of ALL"0" test result set return RAM March-C test 26 自己診断テスト用サンプルソフトウェア説明書 tml_chksum tml_chksum chksum data clear add chksum yes all bytes add. no next address set return Checksum Calc. 27 自己診断テスト用サンプルソフトウェア説明書 5.補足 5.1 数値表現 本文中の数値表現は以下のように、Unix表記で記してあります。 ・2進数の場合、数値の前に0yまたは0Yで始まる0または1の数字列で表します。 ・16進数の場合、数値の前に0xまたは0Xで始まる0∼9,A∼F,a∼fの英数字列で表します。 ・10進数の場合、0,0x,0X,0y,0Y以外で始まる0∼9の数字列で表します。 5.2 CRC 用語 :「巡回冗長検査」(Cyclic Redundancy Check)の略。連続して出現する誤り(バースト誤り) の検出が可能な誤り検出方式。CRC(8)、CRC(16)、CRC(32)などの方式 がある。本文中のサンプルプログラムはCRC−CCITTに沿ったものである。 チェックサム :データを送受信する際の誤り検出方法の一つ。送信前にデータを分割し、それぞれのブロッ ク内のデータを数値とみなして合計を取ったもの。メモリのデータ整合性確認にも用いられ る。 28