////////////////////////////////////////////////////////// // NEN5_ENZ.INC // // // // 演算関係関数 // // // ////////////////////////////////////////////////////////// //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// #define stor_trans(data3,data2,data1,data0) stor[3] = data3;\ stor[2] = data2;\ stor[1] = data1;\ stor[0] = data0; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// #define syori_trans(data3,data2,data1,data0) syori[3] = data3;\ syori[2] = data2;\ syori[1] = data1;\ syori[0] = data0; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// #define stor_trans16(data1,data0) stor[1] = data1;\ stor[0] = data0; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// #define syori_trans16(data1,data0) syori[1] = data1;\ syori[0] = data0; //========== 32*32=64bit乗算 =================================// void mul64(){ int loop; int kotae[8]; kotae[0] = syori[0]; kotae[1] = syori[1]; kotae[2] = syori[2]; kotae[3] = syori[3]; kotae[4] = 0; kotae[5] = 0; kotae[6] = 0; kotae[7] = 0; loop = 32; #asm mul641: bcf 3,0 btfss kotae[0],0 goto mul642 movf stor[0],w addwf kotae[4],f bcf 3,2 btfsc 3,0 incf kotae[5],f btfsc 3,2 incf kotae[6],f btfsc 3,2 incf kotae[7],f movf stor[1],w addwf kotae[5],f bcf 3,2 btfsc 3,0 incf kotae[6],f btfsc 3,2 incf kotae[7],f movf stor[2],w addwf kotae[6],f btfsc 3,0 incf kotae[7],f movf stor[3],w addwf kotae[7],f mul642: rrf kotae[7],f rrf kotae[6],f rrf kotae[5],f rrf kotae[4],f rrf kotae[3],f rrf kotae[2],f rrf kotae[1],f rrf kotae[0],f decfsz loop,f goto mul641 #endasm stor_trans(kotae[3],kotae[2],kotae[1],kotae[0]); syori_trans(kotae[7],kotae[6],kotae[5],kotae[4]); } //========== 32bit引き算 ===========================================// void sub32(){ #asm movf syori[0],w subwf stor[0],f movlw 1 btfss 3,0 subwf stor[1],f btfss 3,0 subwf stor[2],f btfss 3,0 subwf stor[3],f movf syori[1],w subwf stor[1],f movlw 1 btfss 3,0 subwf stor[2],f btfss 3,0 subwf stor[3],f movf syori[2],w subwf stor[2],f movlw 1 btfss 3,0 subwf stor[3],f movf syori[3],w subwf stor[3],f #endasm } //========== 32bit足し算 ===========================================// void add32(){ #asm movf syori[0],w addwf stor[0],f movlw 1 btfsc 3,0 addwf stor[1],f btfsc 3,0 addwf stor[2],f btfsc 3,0 addwf stor[3],f movf syori[1],w addwf stor[1],f movlw 1 btfsc 3,0 addwf stor[2],f btfsc 3,0 addwf stor[3],f movf syori[2],w addwf stor[2],f btfsc 3,0 incf stor[3],f movf syori[3],w addwf stor[3],f #endasm } //<<<<<<<<<< 32bitわり算 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>> BCD変換SUB >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>// void bcd_10(int keta){ signed int i; int loop_c,amari; //===================================== for( i=0 ; i<=9 ; i++ ){ #asm movlw 32 //dfahjkg movwf loop_c //32回(bit)を格納 clrf amari //余りのクリア dev1: bcf 3,0 //キャリフラグのクリア rlf stor[0],f rlf stor[1],f rlf stor[2],f rlf stor[3],f rlf amari,f movlw 246 addwf amari,w btfsc 3,0 //キャリチェック movwf amari btfsc 3,0 incf stor[0],f decfsz loop_c,f goto dev1 #endasm bcd[i] = amari | 0x30; //ASCI変換 } //================================================ for( i=9 ; i>keta ; i-- ){ if(bcd[i] != 0x30) break; bcd[i] = 0x20; } }