gplink-1.0.0 #925 (Mar 14 2013) Copyright (c) 1998-2012 gputils project Listing File Generated: 3-28-2013 11:33:50 Address Value Disassembly Source ------- ----- ----------- ------ ; ------------------------- ; MultibyteArithmetic32.asm ; ------------------------- list p=16F628A radix dec include "p16f628a.inc" LIST ; P16F628A.INC Standard Header File, Version 1.10 Microchip Technology, Inc. NOLIST ; Routines arithmetiques 32 bits (generee par 'http://avtanski.net/projects/math/') ; et remaniees pour une production avec l'assembleur 'gpsam' des GNU PIC Utilities ; - M_CMP : Comparaison ; - M_ADD : Addition ; - M_SUB : Soustraction ; - M_MUL : Multiplication ; - M_DIV : Division #define PRECISION 4 ; byte size for registers ;-------------------------------------------------------- ; Memory registers BANK0 ;-------------------------------------------------------- var_bank0 udata 0x0020 #define REG_X REG_X_LSB #define REG_Y REG_Y_LSB #define REG_Z REG_Z_LSB REG_X_LSB res 1 ; 0x20 ...0x23 REG_X_MID1 res 1 REG_X_MID2 res 1 REG_X_MSB res 1 REG_Y_LSB res 1 ; 0x24 ...0x27 REG_Y_MID1 res 1 REG_Y_MID2 res 1 REG_Y_MSB res 1 REG_Z_LSB res 1 ; 0x28 ...0x2B REG_Z_MID1 res 1 REG_Z_MID2 res 1 REG_Z_MSB res 1 REG_COUNTER res 1 ; 0x2C REG_STATUS res 1 ; 0x2D REG_T1 res 1 ; 0x2E REG_T2 res 1 ; 0x2F REG_ROT_COUNTER res 1 ; 0x30 org 0x100 M_STOR_STATUS macro WHERE 00010a 0803 movf 0x3, w movf STATUS,w 00010b 00ad movwf 0x2d movwf WHERE endm M_RETR_STATUS macro WHERE 00010d 082d movf 0x2d, w movf WHERE,w 00010e 0083 movwf 0x3 movwf STATUS endm M_CLR ; clear a register 000100 0084 movwf 0x4 movwf FSR 000101 3004 movlw 0x4 movlw PRECISION 000102 00ac movwf 0x2c movwf REG_COUNTER M_CLR_loop 000103 0180 clrf 0 clrf INDF 000104 0a84 incf 0x4, f incf FSR,f 000105 03ac decf 0x2c, f decf REG_COUNTER,f 000106 1d03 btfss 0x3, 0x2 btfss STATUS,Z 000107 2903 goto 0x103 goto M_CLR_loop 000108 0008 return return M_ROL ; rotate a register to the left 000109 0084 movwf 0x4 movwf FSR M_STOR_STATUS REG_STATUS 00010c 01ac clrf 0x2c clrf REG_COUNTER M_ROL_loop M_RETR_STATUS REG_STATUS 00010f 0d80 rlf 0, f rlf INDF,f M_STOR_STATUS REG_STATUS 000112 0a84 incf 0x4, f incf FSR,f 000113 0aac incf 0x2c, f incf REG_COUNTER,f 000114 3004 movlw 0x4 movlw PRECISION 000115 022c subwf 0x2c, w subwf REG_COUNTER,w 000116 1d03 btfss 0x3, 0x2 btfss STATUS,Z 000117 290d goto 0x10d goto M_ROL_loop 000118 0008 return return M_ROR ; rotates a register to the right 000119 0084 movwf 0x4 movwf FSR 00011a 3003 movlw 0x3 movlw PRECISION-1 00011b 0784 addwf 0x4, f addwf FSR,f M_STOR_STATUS REG_STATUS 00011e 01ac clrf 0x2c clrf REG_COUNTER M_ROR_loop M_RETR_STATUS REG_STATUS 000121 0c80 rrf 0, f rrf INDF,f M_STOR_STATUS REG_STATUS 000124 0384 decf 0x4, f decf FSR,f 000125 0aac incf 0x2c, f incf REG_COUNTER,f 000126 3004 movlw 0x4 movlw PRECISION 000127 022c subwf 0x2c, w subwf REG_COUNTER,w 000128 1d03 btfss 0x3, 0x2 btfss STATUS,Z 000129 291f goto 0x11f goto M_ROR_loop 00012a 0008 return return M_CMP ; Z <=> X -> STATUS(C,Z) ; STATUS,C set if Z => X; ; STATUS,Z set if Z == X 00012b 01ac clrf 0x2c clrf REG_COUNTER M_CMP_loop 00012c 082c movf 0x2c, w movf REG_COUNTER,w 00012d 3c2b sublw 0x2b sublw REG_Z+PRECISION-1 00012e 0084 movwf 0x4 movwf FSR 00012f 0800 movf 0, w movf INDF,w 000130 00ae movwf 0x2e movwf REG_T1 000131 082c movf 0x2c, w movf REG_COUNTER,w 000132 3c23 sublw 0x23 sublw REG_X+PRECISION-1 000133 0084 movwf 0x4 movwf FSR 000134 0800 movf 0, w movf INDF,w 000135 02ae subwf 0x2e, f subwf REG_T1,f 000136 1d03 btfss 0x3, 0x2 btfss STATUS,Z 000137 0008 return return 000138 0aac incf 0x2c, f incf REG_COUNTER,f 000139 3004 movlw 0x4 movlw PRECISION 00013a 022c subwf 0x2c, w subwf REG_COUNTER,w 00013b 1d03 btfss 0x3, 0x2 btfss STATUS,Z 00013c 292c goto 0x12c goto M_CMP_loop 00013d 0008 return return M_ADD ; Z + X -> Z 00013e 1003 bcf 0x3, 0 bcf STATUS,C 00013f 01ad clrf 0x2d clrf REG_STATUS 000140 01ac clrf 0x2c clrf REG_COUNTER M_ADD_loop 000141 01ae clrf 0x2e clrf REG_T1 000142 182d btfsc 0x2d, 0 btfsc REG_STATUS,C 000143 0aae incf 0x2e, f incf REG_T1,f 000144 01ad clrf 0x2d clrf REG_STATUS 000145 3020 movlw 0x20 movlw REG_X 000146 072c addwf 0x2c, w addwf REG_COUNTER,w 000147 0084 movwf 0x4 movwf FSR 000148 0800 movf 0, w movf INDF,w 000149 07ae addwf 0x2e, f addwf REG_T1,f 00014a 1803 btfsc 0x3, 0 btfsc STATUS,C 00014b 142d bsf 0x2d, 0 bsf REG_STATUS,C 00014c 3028 movlw 0x28 movlw REG_Z 00014d 072c addwf 0x2c, w addwf REG_COUNTER,w 00014e 0084 movwf 0x4 movwf FSR 00014f 0800 movf 0, w movf INDF,w 000150 07ae addwf 0x2e, f addwf REG_T1,f 000151 1803 btfsc 0x3, 0 btfsc STATUS,C 000152 142d bsf 0x2d, 0 bsf REG_STATUS,C 000153 082e movf 0x2e, w movf REG_T1,w 000154 0080 movwf 0 movwf INDF 000155 0aac incf 0x2c, f incf REG_COUNTER,f 000156 3004 movlw 0x4 movlw PRECISION 000157 022c subwf 0x2c, w subwf REG_COUNTER,w 000158 1d03 btfss 0x3, 0x2 btfss STATUS,Z 000159 2941 goto 0x141 goto M_ADD_loop 00015a 0008 return return M_SUB ; Z - X -> Z 00015b 01ac clrf 0x2c clrf REG_COUNTER 00015c 142d bsf 0x2d, 0 bsf REG_STATUS,C M_SUB_loop 00015d 142f bsf 0x2f, 0 bsf REG_T2,C 00015e 3028 movlw 0x28 movlw REG_Z 00015f 072c addwf 0x2c, w addwf REG_COUNTER,w 000160 0084 movwf 0x4 movwf FSR 000161 0800 movf 0, w movf INDF,w 000162 00ae movwf 0x2e movwf REG_T1 000163 3020 movlw 0x20 movlw REG_X 000164 072c addwf 0x2c, w addwf REG_COUNTER,w 000165 0084 movwf 0x4 movwf FSR 000166 0800 movf 0, w movf INDF,w 000167 02ae subwf 0x2e, f subwf REG_T1,f 000168 1c03 btfss 0x3, 0 btfss STATUS,C 000169 102f bcf 0x2f, 0 bcf REG_T2,C 00016a 182d btfsc 0x2d, 0 btfsc REG_STATUS,C 00016b 2970 goto 0x170 goto M_SUB_no_carry 00016c 3001 movlw 0x1 movlw 0x01 00016d 02ae subwf 0x2e, f subwf REG_T1,f 00016e 1c03 btfss 0x3, 0 btfss STATUS,C 00016f 102f bcf 0x2f, 0 bcf REG_T2,C M_SUB_no_carry 000170 3028 movlw 0x28 movlw REG_Z 000171 072c addwf 0x2c, w addwf REG_COUNTER,w 000172 0084 movwf 0x4 movwf FSR 000173 082e movf 0x2e, w movf REG_T1,w 000174 0080 movwf 0 movwf INDF 000175 142d bsf 0x2d, 0 bsf REG_STATUS,C 000176 1c2f btfss 0x2f, 0 btfss REG_T2,C 000177 102d bcf 0x2d, 0 bcf REG_STATUS,C 000178 0aac incf 0x2c, f incf REG_COUNTER,f 000179 3004 movlw 0x4 movlw PRECISION 00017a 022c subwf 0x2c, w subwf REG_COUNTER,w 00017b 1d03 btfss 0x3, 0x2 btfss STATUS,Z 00017c 295d goto 0x15d goto M_SUB_loop 00017d 1c2d btfss 0x2d, 0 btfss REG_STATUS,C 00017e 1003 bcf 0x3, 0 bcf STATUS,C 00017f 0008 return return M_MUL ; X * Y -> Z 000180 3028 movlw 0x28 movlw REG_Z 000181 2100 call 0x100 call M_CLR 000182 3021 movlw 0x21 movlw PRECISION*8+1 000183 00b0 movwf 0x30 movwf REG_ROT_COUNTER M_MUL_loop 000184 03b0 decf 0x30, f decf REG_ROT_COUNTER,f 000185 1903 btfsc 0x3, 0x2 btfsc STATUS,Z 000186 0008 return return 000187 1824 btfsc 0x24, 0 btfsc REG_Y,0 000188 213e call 0x13e call M_ADD 000189 1003 bcf 0x3, 0 bcf STATUS,C 00018a 3024 movlw 0x24 movlw REG_Y 00018b 2119 call 0x119 call M_ROR 00018c 1003 bcf 0x3, 0 bcf STATUS,C 00018d 3020 movlw 0x20 movlw REG_X 00018e 2109 call 0x109 call M_ROL 00018f 2984 goto 0x184 goto M_MUL_loop M_DIV ; Z / X -> Y; remainder -> Z 000190 3024 movlw 0x24 movlw REG_Y 000191 2100 call 0x100 call M_CLR 000192 3020 movlw 0x20 movlw PRECISION*8 000193 00b0 movwf 0x30 movwf REG_ROT_COUNTER M_DIV_rot_loop 000194 1ba3 btfsc 0x23, 0x7 btfsc REG_X+PRECISION-1,7 000195 299e goto 0x19e goto M_DIV_loop 000196 3020 movlw 0x20 movlw REG_X 000197 1003 bcf 0x3, 0 bcf STATUS,C 000198 2109 call 0x109 call M_ROL 000199 03b0 decf 0x30, f decf REG_ROT_COUNTER,f 00019a 1d03 btfss 0x3, 0x2 btfss STATUS,Z 00019b 2994 goto 0x194 goto M_DIV_rot_loop 00019c 1503 bsf 0x3, 0x2 bsf STATUS,Z 00019d 0008 return return M_DIV_loop 00019e 212b call 0x12b call M_CMP M_STOR_STATUS REG_T2 0001a1 3024 movlw 0x24 movlw REG_Y 0001a2 2109 call 0x109 call M_ROL M_RETR_STATUS REG_T2 0001a5 1803 btfsc 0x3, 0 btfsc STATUS,C 0001a6 215b call 0x15b call M_SUB 0001a7 1103 bcf 0x3, 0x2 bcf STATUS,Z 0001a8 1003 bcf 0x3, 0 bcf STATUS,C 0001a9 3020 movlw 0x20 movlw REG_X 0001aa 2119 call 0x119 call M_ROR 0001ab 0ab0 incf 0x30, f incf REG_ROT_COUNTER,f 0001ac 3021 movlw 0x21 movlw PRECISION*8+1 0001ad 0230 subwf 0x30, w subwf REG_ROT_COUNTER,w 0001ae 1d03 btfss 0x3, 0x2 btfss STATUS,Z 0001af 299e goto 0x19e goto M_DIV_loop 0001b0 0008 return return end ; Fin de 'MultibyteArithmetic32.asm'